Skip to content

Commit 4ebc0c0

Browse files
authored
๐Ÿ”€ services ๋ฐ types ํด๋” ๋ฆฌํŒฉํ† ๋ง, ๋กœ๊ทธ์ธ/ํšŒ์›๊ฐ€์ž… hook ๋ฆฌํŒฉํ† ๋ง (#74)
2 parents 156259a + 7edd122 commit 4ebc0c0

28 files changed

Lines changed: 196 additions & 216 deletions

File tree

โ€Žsrc/app/router.tsxโ€Ž

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,12 @@ import LogIn from '@/pages/logIn';
1212
import Game from '@/pages/play/game';
1313
import LobbyPage, { getLobbyInfo } from '@/pages/play/lobby';
1414
import Mode from '@/pages/play/mode';
15-
import Ranking from '@/pages/ranking';
15+
import Ranking, { getRank } from '@/pages/ranking';
1616
import Result, { getGameResult } from '@/pages/result';
1717
import Settings from '@/pages/settings';
1818
import Tutorial from '@/pages/tutorial';
1919

20-
import { checkToken } from '@/services/auth';
21-
import { getRank } from '@/services/rank';
22-
20+
import { checkToken } from '@/features/auth';
2321
import { ROUTE } from '@/shared/constants';
2422

2523
const router = createBrowserRouter([
@@ -111,6 +109,8 @@ const router = createBrowserRouter([
111109
{
112110
path: ROUTE.game,
113111
element: <Game />,
112+
loader: checkToken,
113+
errorElement: <Navigate to={ROUTE.main} replace />,
114114
},
115115
]);
116116

โ€Žsrc/components/frame/with-buttons/index.tsxโ€Ž

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,15 +38,17 @@ const BackButton = ({ pathname }: { pathname: string }) => {
3838

3939
const DISABLED = {
4040
rightButtons: new Set([ROUTE.error, ROUTE.result]),
41-
menuButton: new Set([ROUTE.tutorial]),
41+
menuButton: [ROUTE.tutorial, ROUTE.error],
4242
};
4343

4444
const BasicContentFrame = ({ children }: { children: ReactNode }) => {
4545
const { pathname } = useLocation();
4646

4747
const rightButtonsDisabled = DISABLED.rightButtons.has(pathname);
4848

49-
const menuButtonDisabled = DISABLED.menuButton.has(pathname);
49+
const menuButtonDisabled = DISABLED.menuButton.some((route) =>
50+
pathname.startsWith(route),
51+
);
5052

5153
return (
5254
<div className={styles.frame}>

โ€Žsrc/features/auth/api.tsโ€Ž

Lines changed: 25 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,22 +8,37 @@ const setToken = (token: string, status: number) => {
88
return false;
99
};
1010

11+
const axiosConfig = {
12+
headers: {
13+
'X-Bypass-Authorization': true,
14+
},
15+
};
16+
1117
export const loginAsMember = async (account: Account) => {
12-
const { data, status } = await client.post<string>(`/user/login`, account, {
13-
headers: {
14-
'X-Bypass-Authorization': true,
15-
},
16-
});
18+
const { data, status } = await client.post<string>(
19+
`/user/login`,
20+
account,
21+
axiosConfig,
22+
);
1723
return setToken(data, status);
1824
};
1925

2026
export const loginAsGuest = async () => {
2127
return client
22-
.get<string>('/user/guest', {
23-
headers: {
24-
'X-Bypass-Authorization': true,
25-
},
26-
})
28+
.get<string>('/user/guest', axiosConfig)
2729
.then(({ data, status }) => setToken(data, status))
2830
.catch(() => false);
2931
};
32+
33+
export const checkToken = async () => {
34+
const isTokenValid = await client
35+
.get<boolean>('/user/token')
36+
.then(({ data }) => data);
37+
38+
if (!isTokenValid) {
39+
localStorage.removeItem('token');
40+
throw new Error();
41+
}
42+
43+
return isTokenValid;
44+
};

โ€Žsrc/features/auth/hooks.tsโ€Ž

Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,20 @@
1+
import { useQueryClient } from '@tanstack/react-query';
12
import { type AxiosError } from 'axios';
23
import { useNavigate } from 'react-router-dom';
34

45
import { loginAsGuest, loginAsMember } from './api';
56

6-
import { removeUserQuery } from '@/models/user';
7+
import { userQueryKey } from '@/models/user';
78
import { ROUTE } from '@/shared/constants';
89
import { setFullScreen } from '@/shared/utils';
910

1011
export const useLogout = () => {
1112
const navigate = useNavigate();
13+
const queryClient = useQueryClient();
1214

1315
const logout = () => {
1416
window.localStorage.removeItem('token');
15-
removeUserQuery();
17+
queryClient.removeQueries({ queryKey: userQueryKey });
1618
navigate('/');
1719
};
1820

@@ -21,9 +23,10 @@ export const useLogout = () => {
2123

2224
export const useLogin = () => {
2325
const navigate = useNavigate();
26+
const queryClient = useQueryClient();
2427

25-
const login = async (account: Account) => {
26-
removeUserQuery();
28+
const memberLogin = async (account: Account) => {
29+
queryClient.removeQueries({ queryKey: userQueryKey });
2730

2831
return loginAsMember(account)
2932
.then((isSuccess) => {
@@ -42,14 +45,8 @@ export const useLogin = () => {
4245
});
4346
};
4447

45-
return { login };
46-
};
47-
48-
export const useGuestLogin = () => {
49-
const navigate = useNavigate();
50-
51-
const login = async () => {
52-
removeUserQuery();
48+
const guestLogin = async () => {
49+
queryClient.removeQueries({ queryKey: userQueryKey });
5350

5451
const isSuccess = await loginAsGuest();
5552
if (!isSuccess) {
@@ -59,5 +56,5 @@ export const useGuestLogin = () => {
5956
return navigate(ROUTE.tutorial, { replace: true });
6057
};
6158

62-
return { guestLogin: login };
59+
return { memberLogin, guestLogin };
6360
};

โ€Žsrc/features/auth/index.tsโ€Ž

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
11
export * from './hooks';
2+
export { checkToken } from './api';

โ€Žsrc/features/sign-up/api.tsโ€Ž

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import type { AxiosError } from 'axios';
22

3-
import { invalidateUserQuery } from '@/models/user';
43
import { client } from '@/shared/api';
54

65
const axiosConfig = {
@@ -22,7 +21,6 @@ export const upgradeToMember = async (formData: SignUpForm) => {
2221
.post<string>('/user/guest', formData)
2322
.then(({ data }) => {
2423
console.debug(data);
25-
invalidateUserQuery();
2624
return true;
2725
})
2826
.catch(({ response }: AxiosError) => {
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import { useQueryClient } from '@tanstack/react-query';
2+
3+
import { registerMember, upgradeToMember } from './api';
4+
5+
import { userQueryKey } from '@/models/user';
6+
7+
export const useSignUp = (isGuest: boolean) => {
8+
const queryClient = useQueryClient();
9+
10+
if (!isGuest) {
11+
return registerMember;
12+
}
13+
14+
return async (formData: SignUpForm) => {
15+
const isSuccess = await upgradeToMember(formData);
16+
if (isSuccess) {
17+
await queryClient.invalidateQueries({ queryKey: userQueryKey });
18+
}
19+
return isSuccess;
20+
};
21+
};

โ€Žsrc/features/sign-up/ui.tsxโ€Ž

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
import React, { useState } from 'react';
22
import { useNavigate } from 'react-router-dom';
33

4-
import { checkIdDuplicate, registerMember, upgradeToMember } from './api';
4+
import { checkIdDuplicate } from './api';
5+
import { useSignUp } from './hooks';
56
import { validateSignUpForm } from './utils';
67

78
import ColoredButton from '@/components/button/ColoredButton';
@@ -17,8 +18,9 @@ interface Props {
1718
isGuest?: boolean;
1819
}
1920

20-
const SignUp = ({ closeModal, isGuest }: Props) => {
21+
const SignUp = ({ closeModal, isGuest = false }: Props) => {
2122
const navigate = useNavigate();
23+
const signUp = useSignUp(isGuest);
2224
const [errorMessage, setErrorMessage] = useState(ERROR_MESSAGE.welcome);
2325
const [form, setForm] = useState<SignUpForm>({
2426
id: '',
@@ -48,7 +50,6 @@ const SignUp = ({ closeModal, isGuest }: Props) => {
4850
return;
4951
}
5052

51-
const signUp = isGuest ? upgradeToMember : registerMember;
5253
const isSuccess = await signUp(form);
5354
if (!isSuccess) {
5455
return;

โ€Žsrc/models/user/hooks.tsโ€Ž

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
1-
import { useQuery } from '@tanstack/react-query';
1+
import { useQuery, useQueryClient } from '@tanstack/react-query';
22
import { getDefaultStore, useAtomValue, useSetAtom } from 'jotai';
33

44
import { getUser } from './api';
55
import { queryKey } from './constants';
66
import { updateUserCodeAtom, userCodeAtom, userStaleAtom } from './store';
7-
import { invalidateUserQuery } from './utils';
87

98
export const useUserInfo = () => {
9+
const queryClient = useQueryClient();
1010
const setUserCode = useSetAtom(updateUserCodeAtom);
1111
const store = getDefaultStore();
1212
const isStale = store.get(userStaleAtom);
@@ -18,14 +18,15 @@ export const useUserInfo = () => {
1818
setUserCode(user.userCode);
1919
return user;
2020
},
21-
throwOnError: true,
2221
refetchOnWindowFocus: false,
2322
refetchOnMount: isStale,
2423
});
2524

25+
const refetchUser = () => queryClient.invalidateQueries({ queryKey });
26+
2627
return {
2728
user: data,
28-
refetchUser: invalidateUserQuery,
29+
refetchUser,
2930
};
3031
};
3132

โ€Žsrc/models/user/index.tsโ€Ž

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
export * from './hooks';
2-
export * from './utils';
2+
export { queryKey as userQueryKey } from './constants';

0 commit comments

Comments
ย (0)