diff --git a/.storybook/preview.tsx b/.storybook/preview.tsx index 9abf1953..d0db8d49 100644 --- a/.storybook/preview.tsx +++ b/.storybook/preview.tsx @@ -24,3 +24,9 @@ export const decorators = [ (renderStory: any) => {renderStory()}, (renderStory: any) => {renderStory()}, ]; + +export const parameters = { + nextjs: { + appDirectory: true, + }, +}; diff --git a/src/_queries/auth/reissue-queries.ts b/src/_queries/auth/reissue-queries.ts deleted file mode 100644 index ac41cdf6..00000000 --- a/src/_queries/auth/reissue-queries.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { useMutation } from '@tanstack/react-query'; -import { reissue } from '@/src/_apis/auth/reissue-apis'; -import { useHandleAuthSuccess } from '@/src/hooks/use-handle-auth-success'; -import { ApiError } from '@/src/utils/api'; - -export function usePostReissueQuery() { - const handleAuthSuccess = useHandleAuthSuccess(); - - return useMutation<{ token: string | null }, ApiError>({ - mutationFn: reissue, - onSuccess: async (response) => { - await handleAuthSuccess(response.token); - }, - }); -} diff --git a/src/_queries/auth/user-queries.ts b/src/_queries/auth/user-queries.ts index 687c1b06..af7b5446 100644 --- a/src/_queries/auth/user-queries.ts +++ b/src/_queries/auth/user-queries.ts @@ -1,9 +1,9 @@ import { useQuery } from '@tanstack/react-query'; import { getUser } from '@/src/_apis/auth/user-apis'; -import { authStore } from '@/src/store/use-auth-store'; +import { useAuthStore } from '@/src/store/use-auth-store'; export function useUser() { - const { token } = authStore.getState(); + const token = useAuthStore((state) => state.token); return useQuery({ queryKey: ['user'], queryFn: getUser, diff --git a/src/components/client-provider.tsx b/src/components/client-provider.tsx index 80d3d59c..049aa3c3 100644 --- a/src/components/client-provider.tsx +++ b/src/components/client-provider.tsx @@ -1,14 +1,18 @@ 'use client'; import { ReactNode, useState } from 'react'; +import { usePathname, useRouter } from 'next/navigation'; import { QueryCache, QueryClient, QueryClientProvider } from '@tanstack/react-query'; import { ReactQueryDevtools } from '@tanstack/react-query-devtools'; import { ReactQueryStreamedHydration } from '@tanstack/react-query-next-experimental'; import { reissue } from '../_apis/auth/reissue-apis'; import { useAuthStore } from '../store/use-auth-store'; +import { ApiError } from '../utils/api'; export default function ClientProvider({ children }: { children: ReactNode }) { const setToken = useAuthStore((state) => state.setToken); + const redirect = usePathname(); + const router = useRouter(); const [queryClient] = useState( () => @@ -25,16 +29,22 @@ export default function ClientProvider({ children }: { children: ReactNode }) { }, }, }, - // accessToken 에러 -> reissue() -> refetch() queryCache: new QueryCache({ onError: async (error, query) => { - if (error.message === '토큰이 올바르지 않습니다.') { - const { token } = await reissue(); - if (token) setToken(token.replace(/^Bearer\s/, '')); - await Promise.all([ - queryClient.refetchQueries({ queryKey: query.queryKey }), - queryClient.refetchQueries({ queryKey: ['user'] }), - ]); + const apiError = error as ApiError; + if (apiError.status === 401) { + try { + const { token } = await reissue(); + if (token) { + setToken(token.replace(/^Bearer\s/, '')); + await Promise.all([ + queryClient.refetchQueries({ queryKey: query.queryKey }), + queryClient.refetchQueries({ queryKey: ['user'] }), + ]); + } + } catch { + router.push(`/login?redirect=${redirect}`); + } } }, }),