diff --git a/apps/web/src/app/(auth)/components/StartButton.tsx b/apps/web/src/app/(auth)/components/StartButton.tsx new file mode 100644 index 00000000..828f9fee --- /dev/null +++ b/apps/web/src/app/(auth)/components/StartButton.tsx @@ -0,0 +1,31 @@ +'use client'; + +import { useRouter } from 'next/navigation'; +import { Button } from '@/components/buttons/Button'; +import { useAuth } from '@/hooks/useAuth'; + +interface StartButtonProps { + className?: string; + children: React.ReactNode; +} +export default function StartButton({ + className, + children, +}: StartButtonProps) { + const router = useRouter(); + const { isAuth, isLoading } = useAuth(); + + const handleStart = () => { + router.replace(isAuth ? '/main' : '/login'); + }; + return ( + + ); +} diff --git a/apps/web/src/app/(auth)/signup/[type]/complete/page.tsx b/apps/web/src/app/(auth)/signup/[type]/complete/page.tsx index 5820e784..ec48b5f0 100644 --- a/apps/web/src/app/(auth)/signup/[type]/complete/page.tsx +++ b/apps/web/src/app/(auth)/signup/[type]/complete/page.tsx @@ -3,7 +3,7 @@ import { useEffect, useState } from 'react'; import { Button } from '@/components/buttons/Button'; import CompleteImg from './components/CompleteImg'; -import { useAuthStore } from '@/stores/authStore'; +import { useAuth } from '@/hooks/useAuth'; import { useRouter } from 'next/navigation'; import { useSaveNickname, @@ -12,10 +12,11 @@ import { import { useSignupFlow } from '@/hooks/useSignupFlow'; import { MotionSlotMachineText } from '@/components/MotionSlotMachineText'; import { SignupCompleteResponse } from '@/generated/api/models'; +import { User } from '@/types/user.types'; export default function SignUpCompletePage() { - const login = useAuthStore((state) => state.login); const router = useRouter(); + const { login } = useAuth(); const { userType } = useSignupFlow(); const userTypeLabel = userType === 'FOUNDER' ? '예비 창업자' : '주민'; @@ -30,14 +31,8 @@ export default function SignUpCompletePage() { ]; // 회원가입 완료 후 로그인 및 리다이렉트 처리 - const handleSuccess = ({ - user, - accessToken, - }: SignupCompleteResponse) => { - login({ - user, - accessToken, - }); + const handleSuccess = (user: User) => { + login(user); console.log('회원가입 및 로그인 완료:', { nickname }); router.replace('/main'); }; @@ -48,10 +43,7 @@ export default function SignUpCompletePage() { mutation: { onSuccess: (data: SignupCompleteResponse) => { if (data) { - handleSuccess({ - user: data.user, - accessToken: data.accessToken, - }); + handleSuccess(data.user); } else { console.error('닉네임 또는 토큰 정보가 없습니다.'); } diff --git a/apps/web/src/app/(auth)/signup/components/RedirectIfAuthed.tsx b/apps/web/src/app/(auth)/signup/components/RedirectIfAuthed.tsx deleted file mode 100644 index 2f03b9ce..00000000 --- a/apps/web/src/app/(auth)/signup/components/RedirectIfAuthed.tsx +++ /dev/null @@ -1,43 +0,0 @@ -// apps/web/src/components/guards/RedirectIfAuthenticated.tsx -'use client'; - -import { useEffect, useState } from 'react'; -import { useRouter } from 'next/navigation'; -import { useAuthStore } from '@/stores/authStore'; - -interface RedirectIfAuthedProps { - to?: string; // 인증 시 이동할 경로 (기본: /main) - children?: React.ReactNode; - className?: string; // 추가적인 클래스 -} - -export default function RedirectIfAuthed({ - to = '/main', - children, - className = '', -}: RedirectIfAuthedProps) { - // Zustand에서 인증 여부 가져오기 - const isAuth = useAuthStore((s) => s.getIsAuth()); - const router = useRouter(); - - // CSR 마운트 완료 전 렌더 차단(깜빡임 방지) - const [mounted, setMounted] = useState(false); - useEffect(() => setMounted(true), []); - - useEffect(() => { - if (!mounted) return; - if (isAuth) { - // 이미 로그인되어 있으면 메인으로 보냄 - console.warn( - '이미 로그인되어 있습니다. 메인 페이지로 이동합니다.', - ); - router.replace(to); - } - }, [mounted, isAuth, router, to]); - - //아직 마운트 전이거나, 리다이렉트 진행 중에는 children 렌더 X - if (!mounted || isAuth) return null; - - // 비로그인 상태면 하위 콘텐츠 보여줌 - return
{children}
; -} diff --git a/apps/web/src/app/(auth)/signup/layout.tsx b/apps/web/src/app/(auth)/signup/layout.tsx index 05914b84..56283420 100644 --- a/apps/web/src/app/(auth)/signup/layout.tsx +++ b/apps/web/src/app/(auth)/signup/layout.tsx @@ -1,4 +1,3 @@ -import RedirectIfAuthed from './components/RedirectIfAuthed'; /** * 회원가입 레이아웃 */ @@ -14,9 +13,7 @@ export default function SignUpLayout({ }: SignUpLayoutProps) { return (
- - {children} - + {children}
); } diff --git a/apps/web/src/app/main/profile/page.tsx b/apps/web/src/app/main/profile/page.tsx index 406d8c31..ab348237 100644 --- a/apps/web/src/app/main/profile/page.tsx +++ b/apps/web/src/app/main/profile/page.tsx @@ -1,13 +1,12 @@ 'use client'; + import { useRouter } from 'next/navigation'; import { Button } from '@/components/buttons/Button'; -import { useAuthStore } from '@/stores/authStore'; +import { useAuth } from '@/hooks/useAuth'; export default function ProfilePage() { const router = useRouter(); - const logout = useAuthStore((state) => state.logout); + const { logout } = useAuth(); const handleLogout = () => { - // 로그아웃 로직을 여기에 추가하세요. - console.log('로그아웃 버튼 클릭'); logout(); router.push('/'); }; diff --git a/apps/web/src/app/page.tsx b/apps/web/src/app/page.tsx index cf324dc5..4240dad0 100644 --- a/apps/web/src/app/page.tsx +++ b/apps/web/src/app/page.tsx @@ -1,41 +1,22 @@ -'use client'; - -import { useRouter } from 'next/navigation'; -import { useAuth } from '@/hooks/useAuth'; import LogoImage from '@/assets/images/LogoImage'; -import Button from '@/components/buttons/Button'; +import StartButton from '@/app/(auth)/components/StartButton'; export default function HomePage() { - const router = useRouter(); - const { isAuth, isLoading } = useAuth(); - - const handleStart = () => { - router.replace(isAuth ? '/main' : '/login'); - }; - return (

소소에 오신 것을 환영합니다

-
+
-
+

일상의 소소한 순간들을 기록해보세요

- - + 소소 시작하기
diff --git a/apps/web/src/components/buttons/Button.tsx b/apps/web/src/components/buttons/Button.tsx index 6e60137d..b709db31 100644 --- a/apps/web/src/components/buttons/Button.tsx +++ b/apps/web/src/components/buttons/Button.tsx @@ -95,7 +95,7 @@ export const Button = React.forwardRef< const isDisabled = disabled; const classes = cn( - 'relative inline-flex items-center justify-center rounded-lg font-medium select-none overflow-hidden', + 'relative flex items-center justify-center rounded-lg font-medium select-none overflow-hidden', 'transition-transform duration-150 ease-out', // 기본 variant 스타일 variantMap[variant], @@ -111,7 +111,7 @@ export const Button = React.forwardRef< ); return ( - +