Skip to content

Commit f64d34d

Browse files
committed
feat: 로그인 성공 시 유저 스토어에 저장되게 로직 변경
1 parent 700428e commit f64d34d

File tree

8 files changed

+83
-42
lines changed

8 files changed

+83
-42
lines changed

frontend/src/components/MyPage/UserFeature.tsx

+24-10
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,23 @@
11
import styled from '@emotion/styled';
22
import { useQueryClient } from '@tanstack/react-query';
3+
import { useNavigate } from 'react-router-dom';
34

45
import { ArrowRightCircle } from '@/assets/assets';
56
import DeleteAccountModal from '@/components/MyPage/DeleteAccountModal';
67
import LogoutModal from '@/components/MyPage/LogoutModal';
78
import { QUERY_KEYS } from '@/constants/queryKeys';
9+
import { ROUTE_PATH } from '@/constants/routePath';
810
import { VOC_URL } from '@/constants/VoC';
9-
import useUserQuery from '@/hooks/query/useUserQuery';
1011
import useModal from '@/hooks/useModal';
12+
import useUserStore from '@/store/useUserStore';
1113
import { boxShadowSpread, flexColumn, flexRow, flexSpaceBetween, title4 } from '@/styles/common';
1214

1315
const UserFeature = () => {
14-
useUserQuery();
16+
const { user } = useUserStore();
1517

16-
const queryClient = useQueryClient();
18+
const navigate = useNavigate();
1719

20+
const queryClient = useQueryClient();
1821
const checklist = queryClient.getQueryData([QUERY_KEYS.CHECKLIST_LIST]);
1922

2023
const { isModalOpen: isLogoutModalOpen, openModal: openLogoutModal, closeModal: closeLogoutModal } = useModal();
@@ -39,13 +42,24 @@ const UserFeature = () => {
3942
</>
4043
</S.LabelContainer>
4144

42-
<S.Section>
43-
<S.LabelContainer>방끗이 도움되었나요? 한마디 남겨주세요!</S.LabelContainer>
44-
<S.Button tabIndex={1} onClick={handleMoveVoc}>
45-
방끗이 기다려요, 의견 남기기!
46-
<ArrowRightCircle aria-hidden="true" />
47-
</S.Button>
48-
</S.Section>
45+
{user.userType !== 'ADMIN' && (
46+
<S.Section>
47+
<S.LabelContainer>방끗이 도움되었나요? 한마디 남겨주세요!</S.LabelContainer>
48+
<S.Button tabIndex={1} onClick={handleMoveVoc}>
49+
방끗이 기다려요, 의견 남기기!
50+
<ArrowRightCircle aria-hidden="true" />
51+
</S.Button>
52+
</S.Section>
53+
)}
54+
55+
{user.userType === 'ADMIN' && (
56+
<S.Section>
57+
<S.Button tabIndex={1} onClick={() => navigate(ROUTE_PATH.admin)}>
58+
어드민 페이지 바로가기
59+
<ArrowRightCircle aria-hidden="true" />
60+
</S.Button>
61+
</S.Section>
62+
)}
4963

5064
<S.Section>
5165
<S.LabelContainer>방끗 잠시 안녕!</S.LabelContainer>

frontend/src/hooks/query/useAddOAuthUserQuery.ts

+18-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
import { useMutation, useQueryClient } from '@tanstack/react-query';
22

3-
import { postOAuthLogin } from '@/apis/user';
3+
import { getUserInfo, postOAuthLogin } from '@/apis/user';
44
import { QUERY_KEYS } from '@/constants/queryKeys';
5+
import useToast from '@/hooks/useToast';
6+
import amplitudeInitializer from '@/service/amplitude/amplitudeInitializer';
7+
import useUserStore from '@/store/useUserStore';
58

69
interface MutationVariables {
710
code: string;
@@ -10,10 +13,24 @@ interface MutationVariables {
1013

1114
const useAddOAuthUserQuery = () => {
1215
const queryClient = useQueryClient();
16+
const { user, setUser } = useUserStore();
17+
const { init } = amplitudeInitializer();
18+
const { showToast } = useToast();
19+
1320
return useMutation({
1421
mutationFn: ({ code, redirectUri }: MutationVariables) => postOAuthLogin(code, redirectUri),
1522
onSuccess: () => {
1623
queryClient.invalidateQueries({ queryKey: [QUERY_KEYS.AUTH] });
24+
25+
const initAmplitudeUser = async () => {
26+
const result = await getUserInfo();
27+
setUser(result);
28+
29+
init(user.userEmail);
30+
showToast({ message: `${user?.userName}님, 환영합니다.`, type: 'confirm' });
31+
};
32+
33+
initAmplitudeUser();
1734
},
1835
});
1936
};

frontend/src/hooks/query/usePostSignInQuery.ts

+19-1
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,35 @@
11
import { useMutation, useQueryClient } from '@tanstack/react-query';
22
import { useNavigate } from 'react-router-dom';
33

4-
import { postSignIn } from '@/apis/user';
4+
import { getUserInfo, postSignIn } from '@/apis/user';
55
import { QUERY_KEYS } from '@/constants/queryKeys';
66
import { ROUTE_PATH } from '@/constants/routePath';
7+
import useToast from '@/hooks/useToast';
8+
import amplitudeInitializer from '@/service/amplitude/amplitudeInitializer';
9+
import useUserStore from '@/store/useUserStore';
710

811
const usePostSignInQuery = () => {
912
const navigate = useNavigate();
1013
const queryClient = useQueryClient();
14+
const { user, setUser } = useUserStore();
15+
const { init } = amplitudeInitializer();
16+
const { showToast } = useToast();
17+
1118
return useMutation({
1219
mutationFn: postSignIn,
1320
onSuccess: () => {
1421
queryClient.invalidateQueries({ queryKey: [QUERY_KEYS.AUTH] });
22+
23+
const initAmplitudeUser = async () => {
24+
const result = await getUserInfo();
25+
setUser(result);
26+
27+
init(user.userEmail);
28+
showToast({ message: `${user?.userName}님, 환영합니다.`, type: 'confirm' });
29+
};
30+
31+
initAmplitudeUser();
32+
1533
navigate(ROUTE_PATH.home);
1634
},
1735
});
+13-1
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,27 @@
11
import { useQuery } from '@tanstack/react-query';
2+
import { useEffect } from 'react';
23

34
import { getUserInfo } from '@/apis/user';
45
import { QUERY_KEYS } from '@/constants/queryKeys';
6+
import useUserStore from '@/store/useUserStore';
57
import { User } from '@/types/user';
68

79
const useUserQuery = () => {
8-
return useQuery<User>({
10+
const { setUser } = useUserStore();
11+
12+
const userQuery = useQuery<User>({
913
queryKey: [QUERY_KEYS.AUTH, QUERY_KEYS.USER],
1014
queryFn: getUserInfo,
1115
retry: false,
1216
});
17+
18+
useEffect(() => {
19+
if (userQuery.isSuccess && userQuery.data) {
20+
setUser(userQuery.data);
21+
}
22+
}, [userQuery.isSuccess, userQuery.data, setUser]);
23+
24+
return userQuery;
1325
};
1426

1527
export default useUserQuery;

frontend/src/hooks/useAutoLogin.ts

+6-2
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,13 @@ import { deleteToken, getIsUserValid, getUserInfo, postReissueAccessToken } from
55
import { ROUTE_PATH } from '@/constants/routePath';
66
import useToast from '@/hooks/useToast';
77
import amplitudeInitializer from '@/service/amplitude/amplitudeInitializer';
8+
import useUserStore from '@/store/useUserStore';
89

910
const useAutoLogin = () => {
1011
const navigate = useNavigate();
1112
const { showToast } = useToast();
1213
const { init } = amplitudeInitializer();
14+
const { user, setUser } = useUserStore();
1315

1416
const fetchIsUserValid = async () => {
1517
const { isAccessTokenExist, isRefreshTokenExist } = await getIsUserValid();
@@ -27,8 +29,10 @@ const useAutoLogin = () => {
2729

2830
const autoLogin = async () => {
2931
const result = await getUserInfo();
30-
init(result.userEmail);
31-
showToast({ message: `${result?.userName}님, 환영합니다.`, type: 'confirm' });
32+
setUser(result);
33+
34+
init(user.userEmail);
35+
showToast({ message: `${user?.userName}님, 환영합니다.`, type: 'confirm' });
3236
return navigate(ROUTE_PATH.home);
3337
};
3438

frontend/src/hooks/useOAuthLogin.ts

-12
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,15 @@
11
import { useEffect } from 'react';
22
import { useNavigate } from 'react-router-dom';
33

4-
import { getUserInfo } from '@/apis/user';
54
import { KAKAO_AUTH_URL } from '@/constants/oAuth';
65
import { ROUTE_PATH } from '@/constants/routePath';
76
import useAddOAuthUserQuery from '@/hooks/query/useAddOAuthUserQuery';
87
import useMutateChecklist from '@/hooks/useMutateChecklist';
9-
import useToast from '@/hooks/useToast';
10-
import amplitudeInitializer from '@/service/amplitude/amplitudeInitializer';
118

129
const useOAuthLogin = () => {
1310
const navigate = useNavigate();
1411
const { mutate: addOAuthUser, isSuccess } = useAddOAuthUserQuery();
1512
const { handleSubmitChecklist } = useMutateChecklist('add');
16-
const { init } = amplitudeInitializer();
17-
const { showToast } = useToast();
1813

1914
const currentUrl = new URL(window.location.href);
2015
currentUrl.searchParams.delete('code');
@@ -28,14 +23,7 @@ const useOAuthLogin = () => {
2823
}, [addOAuthUser]);
2924

3025
useEffect(() => {
31-
const initAmplitudeUser = async () => {
32-
const result = await getUserInfo();
33-
init(result.userEmail);
34-
showToast({ message: `${result?.userName}님, 환영합니다.`, type: 'confirm' });
35-
};
36-
3726
if (isSuccess) {
38-
initAmplitudeUser();
3927
if (redirectUri.includes(ROUTE_PATH.checklistNew)) return handleSubmitChecklist();
4028
else return navigate(ROUTE_PATH.home);
4129
}

frontend/src/mocks/fixtures/user.ts

+1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ export const user: User = {
55
userName: '방끗이',
66
userEmail: '[email protected]',
77
createdAt: '2024-08-11T10:00:00Z',
8+
userType: 'ADMIN',
89
};
910

1011
export const mockUserTokenValid: UserTokenValid = {

frontend/src/pages/SignInPage.tsx

+2-15
Original file line numberDiff line numberDiff line change
@@ -2,21 +2,17 @@ import styled from '@emotion/styled';
22
import { useState } from 'react';
33
import { useNavigate } from 'react-router-dom';
44

5-
import { getUserInfo } from '@/apis/user';
65
import { BangBangIcon, BangGgoodTextIcon } from '@/assets/assets';
76
import Button from '@/components/_common/Button/Button';
87
import FormField from '@/components/_common/FormField/FormField';
98
import Header from '@/components/_common/Header/Header';
109
import { ROUTE_PATH } from '@/constants/routePath';
1110
import usePostSignInQuery from '@/hooks/query/usePostSignInQuery';
12-
import useToast from '@/hooks/useToast';
1311
import useValidateInput from '@/hooks/useValidateInput';
14-
import amplitudeInitializer from '@/service/amplitude/amplitudeInitializer';
1512
import { flexCenter, title3, title4 } from '@/styles/common';
1613
import { validateEmail } from '@/utils/authValidation';
1714

1815
const SignInPage = () => {
19-
const { showToast } = useToast();
2016
const [postErrorMessage, setPostErrorMessage] = useState('');
2117
const navigate = useNavigate();
2218

@@ -42,19 +38,11 @@ const SignInPage = () => {
4238
const disabled = !isEmailValidated || !isPasswordValidated;
4339

4440
const { mutate: signIn } = usePostSignInQuery();
45-
const { init } = amplitudeInitializer();
4641

47-
const handleSubmit = async () =>
48-
await signIn(
42+
const handleSubmit = () =>
43+
signIn(
4944
{ email, password },
5045
{
51-
onSuccess: async () => {
52-
const result = await getUserInfo();
53-
init(result.userEmail);
54-
55-
showToast({ message: `${result?.userName}님, 환영합니다.`, type: 'confirm' });
56-
return navigate(ROUTE_PATH.home);
57-
},
5846
onError: error => setPostErrorMessage(error.message),
5947
},
6048
);
@@ -67,7 +55,6 @@ const SignInPage = () => {
6755

6856
const handleMoveToSignUp = () => navigate(ROUTE_PATH.signUp);
6957
const handleMoveToResetPassword = () => navigate(ROUTE_PATH.resetPassword);
70-
7158
const handleClickBackward = () => navigate(ROUTE_PATH.root);
7259

7360
return (

0 commit comments

Comments
 (0)