diff --git a/package-lock.json b/package-lock.json index ce71b1a..c24f578 100644 --- a/package-lock.json +++ b/package-lock.json @@ -23,6 +23,7 @@ "react": "^18.2.0", "react-cookie": "^6.1.1", "react-dom": "^18.2.0", + "react-ga4": "^2.1.0", "react-hook-form": "^7.51.0", "react-infinite-scroller": "^1.2.6", "react-query": "^3.39.3", @@ -13492,6 +13493,11 @@ } } }, + "node_modules/react-ga4": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/react-ga4/-/react-ga4-2.1.0.tgz", + "integrity": "sha512-ZKS7PGNFqqMd3PJ6+C2Jtz/o1iU9ggiy8Y8nUeksgVuvNISbmrQtJiZNvC/TjDsqD0QlU5Wkgs7i+w9+OjHhhQ==" + }, "node_modules/react-hook-form": { "version": "7.51.0", "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.51.0.tgz", diff --git a/package.json b/package.json index 40acb7a..db52b56 100644 --- a/package.json +++ b/package.json @@ -19,6 +19,7 @@ "react": "^18.2.0", "react-cookie": "^6.1.1", "react-dom": "^18.2.0", + "react-ga4": "^2.1.0", "react-hook-form": "^7.51.0", "react-infinite-scroller": "^1.2.6", "react-query": "^3.39.3", diff --git a/src/App.jsx b/src/App.jsx index 951e6dd..4dabcaf 100644 --- a/src/App.jsx +++ b/src/App.jsx @@ -5,6 +5,7 @@ import { CookiesProvider } from 'react-cookie'; import { ChakraProvider } from '@chakra-ui/react'; import spinner from './assets/spinner.gif'; import Router from './shared/components/common/Router'; +import { BrowserRouter } from 'react-router-dom'; const queryClient = new QueryClient({ defaultOptions: { @@ -30,7 +31,9 @@ function App() { }> - + + + diff --git a/src/index.jsx b/src/index.jsx index dac4ede..d50e690 100644 --- a/src/index.jsx +++ b/src/index.jsx @@ -2,6 +2,11 @@ import React from 'react'; import ReactDOM from 'react-dom/client'; import './index.css'; import App from './App'; +import ReactGA from "react-ga4"; + +if (import.meta.env.VITE_GOOGLE_ANALYTICS) { + ReactGA.initialize(import.meta.env.VITE_GOOGLE_ANALYTICS); +} const root = ReactDOM.createRoot(document.getElementById('root')); root.render( diff --git a/src/pages/MakeStudy/components/steps/AddStudyMember.jsx b/src/pages/MakeStudy/components/steps/AddStudyMember.jsx index 339ea13..db16337 100644 --- a/src/pages/MakeStudy/components/steps/AddStudyMember.jsx +++ b/src/pages/MakeStudy/components/steps/AddStudyMember.jsx @@ -1,16 +1,18 @@ -import { useState } from 'react'; +import { useEffect, useState } from 'react'; import { BaekjoonIdTag } from '../../../../shared/components/Tag'; import ModalLayout from '../../../../shared/layout/ModalLayout'; import InputContainer from '../../../../shared/components/InputContainer'; import Input from '../../../../shared/components/Input'; import useCheckId from '../../../../shared/hooks/api/useCheckId'; -import { useStudyStore, useStudyActions } from '../../../../store/studyStore'; +import { useStudyStore } from '../../../../store/studyStore'; import usePostStudy from '../../hooks/api/usePostStudy'; import { makeStudyStepTitle } from '../../../../shared/constants/steps'; import { useQueryClient } from 'react-query'; +import useSearchUserId from '../../../../shared/hooks/api/useSearchUserId'; const AddStudyMember = ({ onPrev, clickHandler }) => { const [term, setTerm] = useState(''); + const [bjId, setBjId] = useState('') const { studyName, description, @@ -26,12 +28,19 @@ const AddStudyMember = ({ onPrev, clickHandler }) => { members, } = useStudyStore(); - const { addMember } = useStudyActions(); + const { refetch: refetchSearchUserId } = useSearchUserId(bjId) const onCheckIdSuccessCallback = data => { if (data.valid) { - addMember(data.bjname); + setBjId(data.bjname) } }; + + useEffect(() => { + if (bjId) { + refetchSearchUserId(); + } + }, [bjId]) + const { refetch } = useCheckId(term, onCheckIdSuccessCallback); const handleKeyDown = e => { @@ -62,7 +71,7 @@ const AddStudyMember = ({ onPrev, clickHandler }) => { openchat: kakaoUrl, main_language: language, level, - members, + members: members.map(item => item.userId), area: studyArea.area === '전국' ? 'ALL' : studyArea.area, city: studyArea.city === '전체' ? 'ALL' : studyArea.city, how_many: solvedProblemNumber, @@ -92,7 +101,7 @@ const AddStudyMember = ({ onPrev, clickHandler }) => {
{members && members.map((member, idx) => ( - {member} + {member.bjId} ))}
diff --git a/src/shared/components/common/Router.jsx b/src/shared/components/common/Router.jsx index 885a8af..3f1ca54 100644 --- a/src/shared/components/common/Router.jsx +++ b/src/shared/components/common/Router.jsx @@ -1,7 +1,7 @@ import { lazy, useEffect } from 'react'; import useGetUserInfo from '../../hooks/api/useGetUserInfo'; import { useUserActions } from '../../../store/userStore'; -import { BrowserRouter, Routes, Route } from 'react-router-dom'; +import { Routes, Route } from 'react-router-dom'; import { getAccessToken } from '../../utils/auth'; const Landing = lazy(() => import('../../../pages/Landing')); @@ -36,7 +36,7 @@ const Router = () => { }, [userInfo]); return ( - + } /> } /> @@ -53,7 +53,7 @@ const Router = () => { } /> } /> - + ); }; diff --git a/src/shared/hooks/api/useSearchUserId.js b/src/shared/hooks/api/useSearchUserId.js new file mode 100644 index 0000000..352dff6 --- /dev/null +++ b/src/shared/hooks/api/useSearchUserId.js @@ -0,0 +1,25 @@ +import { useQuery } from 'react-query'; +import { api } from '.'; +import { useStudyActions } from '../../../store/studyStore'; + +const useSearchUserId = bjId => { + const { addMember } = useStudyActions(); + return useQuery( + 'searchUserId', + async () => { + const response = await api.get(`/api/user/search/userId?bjId=${bjId}`); + return response.data; + }, + { + enabled: false, + onSuccess: data => { + addMember({ + userId: data.userId, + bjId: bjId, + }); + }, + }, + ); +}; + +export default useSearchUserId;