diff --git a/src/app/(auth)/login/_components/LoginForm/ForgotPasswordButton.tsx b/src/app/(auth)/login/_components/LoginForm/ForgotPasswordButton.tsx deleted file mode 100644 index 24120cf2..00000000 --- a/src/app/(auth)/login/_components/LoginForm/ForgotPasswordButton.tsx +++ /dev/null @@ -1,13 +0,0 @@ -export default function ForgotPasswordButton({ ...props }) { - return ( -
- -
- ); -} diff --git a/src/app/(auth)/login/_components/LoginForm/OpenPasswordResetModal.tsx b/src/app/(auth)/login/_components/LoginForm/OpenPasswordResetModal.tsx new file mode 100644 index 00000000..1669e7a5 --- /dev/null +++ b/src/app/(auth)/login/_components/LoginForm/OpenPasswordResetModal.tsx @@ -0,0 +1,91 @@ +'use client'; + +import ResetPasswordModal from '@/components/common/Modal/content/ResetPasswordModal'; +import { postResetPasswordToEmail } from '@/lib/apis/user'; +import { ResetPasswordToEmailBody } from '@/lib/apis/user/type'; +import { useModalStore } from '@/store/useModalStore'; +import { useRouter } from 'next/navigation'; +import { useEffect } from 'react'; +import { toast } from 'react-toastify'; + +export default function OpenPasswordResetModal({ ...props }) { + const { openModal } = useModalStore(); + const router = useRouter(); + + useEffect(() => { + const unsubscribe = useModalStore.subscribe( + (state) => state.requestBody, // selector + // listener + (newRequestBody) => { + if (!newRequestBody) return; + const { email } = newRequestBody as { email: string }; + + if (!email) return; + + const requestBody = { + email, + redirectUrl: `${window.location.origin}/`, + }; + handleSendResetPasswordLink(requestBody); + } + ); + return () => { + unsubscribe(); // 언마운트, 구독 해제 + }; + }, []); + + // send reset password link + const handleSendResetPasswordLink = async ( + requestBody: ResetPasswordToEmailBody + ) => { + try { + const response = await postResetPasswordToEmail({ body: requestBody }); + + if (!response) { + throw new Error('204 : No Content'); + } + toast.success('비밀번호 재설정 링크가 전송되었습니다.'); + } catch (error) { + if (error instanceof Error) { + const errorMessage = error.message; + + // 존재하지 않는 유저 : User not found + if (errorMessage.includes('User not found')) { + toast.error('존재하지 않는 이메일입니다. 회원가입을 먼저 해주세요.'); + router.push('/signup'); + } else { + toast.error(`Error : ${error}`); + } + } + } + }; + + return ( +
+ +
+ ); +} diff --git a/src/app/(auth)/login/_components/LoginForm/index.tsx b/src/app/(auth)/login/_components/LoginForm/index.tsx index ce53e626..3e400966 100644 --- a/src/app/(auth)/login/_components/LoginForm/index.tsx +++ b/src/app/(auth)/login/_components/LoginForm/index.tsx @@ -1,6 +1,5 @@ 'use client'; -import ForgotPasswordButton from '@/app/(auth)/login/_components/LoginForm/ForgotPasswordButton'; import InputWithLabel from '@/components/auth/InputWithLabel'; import Button from '@/components/common/Button'; import { signIn } from '@/lib/apis/auth'; @@ -17,6 +16,7 @@ import Cookies from 'js-cookie'; import { z } from 'zod'; import { useRouter } from 'next/navigation'; import { InputType } from '@/components/auth/type'; +import OpenPasswordResetModal from '@/app/(auth)/login/_components/LoginForm/OpenPasswordResetModal'; // schema const inputEmptySchema = z.object({ @@ -205,7 +205,7 @@ export default function LoginForm() { /> - + )}