From 43ea31d1d6ea6c1f9ee9de37af72315fd1c9e82a Mon Sep 17 00:00:00 2001 From: suhyeon0111 Date: Sun, 21 Dec 2025 01:25:26 +0900 Subject: [PATCH 1/8] =?UTF-8?q?fix(login):=20=EB=B2=84=ED=8A=BC=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app/(route)/login/page.tsx | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/src/app/(route)/login/page.tsx b/src/app/(route)/login/page.tsx index c606d841..2444f9af 100644 --- a/src/app/(route)/login/page.tsx +++ b/src/app/(route)/login/page.tsx @@ -16,25 +16,28 @@ const Page = () => {
- 이메일로 로그인 - +
{/* divider 구분선 */} @@ -49,13 +52,7 @@ const Page = () => { 아직 회원이 아니신가요? - + 회원가입 From 795bde0c417c34b7d8730d8a66c87811191065c3 Mon Sep 17 00:00:00 2001 From: suhyeon0111 Date: Sat, 27 Dec 2025 01:10:45 +0900 Subject: [PATCH 2/8] =?UTF-8?q?chore(login):=20=EB=A1=9C=EA=B7=B8=EC=9D=B8?= =?UTF-8?q?=20=EC=A4=91=EA=B0=84=20=EC=A0=80=EC=9E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app/(route)/login/page.tsx | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/app/(route)/login/page.tsx b/src/app/(route)/login/page.tsx index 41d843e1..b464a9b7 100644 --- a/src/app/(route)/login/page.tsx +++ b/src/app/(route)/login/page.tsx @@ -5,6 +5,8 @@ import { cn } from "@/utils"; import { Icon, Button, AuthLogoLink } from "@/components"; const ButtonStyle = "w-full h-[44px] flex-center gap-1 rounded-[10px] text-body1-semibold "; +const REST_API_KEY = process.env.KAKA0_REST_API_KEY; +const REDIRECT_URI = process.env.KAKAO_REDIRECT_URI; const Page = () => { return ( @@ -17,6 +19,9 @@ const Page = () => { type="submit" ignoreBase ariaLabel="카카오 로그인 버튼" + as={Link} + href={"/"} + // href={kakaoURL} className={cn( ButtonStyle, "text-flatGray-900 bg-fill-accent-kakao hover:bg-fill-accent-kakao" From 81f70ec20b719e5c9f81014bc3ba0264c2a4dcd8 Mon Sep 17 00:00:00 2001 From: suhyeon0111 Date: Fri, 2 Jan 2026 18:27:29 +0900 Subject: [PATCH 3/8] =?UTF-8?q?feat(login):=20=EC=B9=B4=EC=B9=B4=EC=98=A4?= =?UTF-8?q?=20=EB=A1=9C=EA=B7=B8=EC=9D=B8=20url=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app/(route)/login/page.tsx | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/app/(route)/login/page.tsx b/src/app/(route)/login/page.tsx index b464a9b7..04468328 100644 --- a/src/app/(route)/login/page.tsx +++ b/src/app/(route)/login/page.tsx @@ -7,8 +7,13 @@ import { Icon, Button, AuthLogoLink } from "@/components"; const ButtonStyle = "w-full h-[44px] flex-center gap-1 rounded-[10px] text-body1-semibold "; const REST_API_KEY = process.env.KAKA0_REST_API_KEY; const REDIRECT_URI = process.env.KAKAO_REDIRECT_URI; +const kakaoURL = `https://kauth.kakao.com/oauth/authorize?client_id=${REST_API_KEY}&redirect_uri=${REDIRECT_URI}&response_type=code`; const Page = () => { + const kakaoButtonClick = () => { + window.location.href = kakaoURL; + }; + return (
@@ -19,9 +24,9 @@ const Page = () => { type="submit" ignoreBase ariaLabel="카카오 로그인 버튼" - as={Link} - href={"/"} + // as={Link} // href={kakaoURL} + onClick={kakaoButtonClick} className={cn( ButtonStyle, "text-flatGray-900 bg-fill-accent-kakao hover:bg-fill-accent-kakao" From d44e0ad92a14c4395a93ca3b5d7f1c03354a5548 Mon Sep 17 00:00:00 2001 From: suhyeon0111 Date: Fri, 2 Jan 2026 21:46:37 +0900 Subject: [PATCH 4/8] =?UTF-8?q?chore(login):=20=EC=A3=BC=EC=84=9D=20?= =?UTF-8?q?=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app/(route)/login/page.tsx | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/src/app/(route)/login/page.tsx b/src/app/(route)/login/page.tsx index 04468328..beb1d830 100644 --- a/src/app/(route)/login/page.tsx +++ b/src/app/(route)/login/page.tsx @@ -5,14 +5,12 @@ import { cn } from "@/utils"; import { Icon, Button, AuthLogoLink } from "@/components"; const ButtonStyle = "w-full h-[44px] flex-center gap-1 rounded-[10px] text-body1-semibold "; + const REST_API_KEY = process.env.KAKA0_REST_API_KEY; const REDIRECT_URI = process.env.KAKAO_REDIRECT_URI; -const kakaoURL = `https://kauth.kakao.com/oauth/authorize?client_id=${REST_API_KEY}&redirect_uri=${REDIRECT_URI}&response_type=code`; const Page = () => { - const kakaoButtonClick = () => { - window.location.href = kakaoURL; - }; + const kakaoURL = `https://kauth.kakao.com/oauth/authorize?client_id=${REST_API_KEY}&redirect_uri=${REDIRECT_URI}&response_type=code`; return (
@@ -24,9 +22,7 @@ const Page = () => { type="submit" ignoreBase ariaLabel="카카오 로그인 버튼" - // as={Link} - // href={kakaoURL} - onClick={kakaoButtonClick} + onClick={() => (window.location.href = kakaoURL)} className={cn( ButtonStyle, "text-flatGray-900 bg-fill-accent-kakao hover:bg-fill-accent-kakao" From ae2c48f2e5370e44d41616bc94441cc08dde361a Mon Sep 17 00:00:00 2001 From: suhyeon0111 Date: Sat, 3 Jan 2026 02:38:04 +0900 Subject: [PATCH 5/8] =?UTF-8?q?feat(kakao-login):=20=EC=B9=B4=EC=B9=B4?= =?UTF-8?q?=EC=98=A4=20=EB=A1=9C=EA=B7=B8=EC=9D=B8=20=ED=99=94=EB=A9=B4=20?= =?UTF-8?q?=EC=97=B0=EA=B2=B0(=ED=99=98=EA=B2=BD=EB=B3=80=EC=88=98=20?= =?UTF-8?q?=EC=88=98=EC=A0=95)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app/(route)/login/page.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/app/(route)/login/page.tsx b/src/app/(route)/login/page.tsx index beb1d830..c28ef3cb 100644 --- a/src/app/(route)/login/page.tsx +++ b/src/app/(route)/login/page.tsx @@ -4,10 +4,10 @@ import Link from "next/link"; import { cn } from "@/utils"; import { Icon, Button, AuthLogoLink } from "@/components"; -const ButtonStyle = "w-full h-[44px] flex-center gap-1 rounded-[10px] text-body1-semibold "; +const ButtonStyle = "w-full h-[44px] flex-center gap-1 rounded-[10px] text-body1-semibold"; -const REST_API_KEY = process.env.KAKA0_REST_API_KEY; -const REDIRECT_URI = process.env.KAKAO_REDIRECT_URI; +const REST_API_KEY = process.env.NEXT_PUBLIC_KAKAO_REST_API_KEY; +const REDIRECT_URI = process.env.NEXT_PUBLIC_KAKAO_REDIRECT_URI; const Page = () => { const kakaoURL = `https://kauth.kakao.com/oauth/authorize?client_id=${REST_API_KEY}&redirect_uri=${REDIRECT_URI}&response_type=code`; From 27fcf4c3a54ad3fd1571ce7f08b29c36ce6fe4be Mon Sep 17 00:00:00 2001 From: suhyeon0111 Date: Sat, 3 Jan 2026 17:19:32 +0900 Subject: [PATCH 6/8] =?UTF-8?q?fix(sign-up):=20=EB=8B=A4=EC=9D=8C=20?= =?UTF-8?q?=EB=B2=84=ED=8A=BC=20disabled=20=EC=98=A4=EC=9E=91=EB=8F=99=20?= =?UTF-8?q?=EC=9D=B4=EC=8A=88=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../_components/SignUpField/SignUpField.tsx | 18 ++++++----- .../_components/SignUpItem/SignUpItem.tsx | 18 +++++------ .../_constants/SIGNUP_ERROR_MESSAGE.ts | 4 +++ .../sign-up/_constants/SIGNUP_INPUT_CONFIG.ts | 1 + .../sign-up/_hooks/useNicknameCheck.ts | 30 ++++++++++--------- .../sign-up/_hooks/useSignUpBtnClick.ts | 10 +++++-- 6 files changed, 46 insertions(+), 35 deletions(-) diff --git a/src/app/(route)/sign-up/_components/SignUpField/SignUpField.tsx b/src/app/(route)/sign-up/_components/SignUpField/SignUpField.tsx index 8e00cb73..a01c5068 100644 --- a/src/app/(route)/sign-up/_components/SignUpField/SignUpField.tsx +++ b/src/app/(route)/sign-up/_components/SignUpField/SignUpField.tsx @@ -6,7 +6,6 @@ import { useFormContext, useWatch } from "react-hook-form"; import { useSignUpBtnClick } from "../../_hooks/useSignUpBtnClick"; import { useEffect } from "react"; import SignUpItem from "../SignUpItem/SignUpItem"; -import { useNicknameCheck } from "../../_hooks/useNicknameCheck"; const SignUpField = ({ onNext }: { onNext: () => void }) => { const { @@ -21,24 +20,27 @@ const SignUpField = ({ onNext }: { onNext: () => void }) => { void trigger("passwordConfirm"); }, [password, trigger]); - const { isEmailDisabled, isEmailAuthDisabled, isEmailAuthVerified, handlerToClick } = - useSignUpBtnClick(); - - const { isNicknameVerified } = useNicknameCheck(); + const { + isEmailDisabled, + isEmailAuthDisabled, + isEmailAuthVerified, + handlerToClick, + isNicknameVerified, + } = useSignUpBtnClick(); const handleDisabled = (name: string) => { if (name === "emailAuth") return isEmailAuthDisabled; else if (name === "email") return isEmailDisabled; }; - const handleSuccess = (name: string) => { + const handleVerified = (name: string) => { if (name === "emailAuth") return isEmailAuthVerified; else if (name === "nickname") return isNicknameVerified; else return false; }; const isNextEnabled = isValid && isEmailAuthVerified && isNicknameVerified; - + console.log("nickname>>> ", isNicknameVerified); return ( <> @@ -48,7 +50,7 @@ const SignUpField = ({ onNext }: { onNext: () => void }) => { key={item.name} disabled={handleDisabled(item.name)} btnOnClick={() => handlerToClick(item.name)} - isVerified={handleSuccess(item.name)} + isVerified={handleVerified(item.name)} {...item} /> ))} diff --git a/src/app/(route)/sign-up/_components/SignUpItem/SignUpItem.tsx b/src/app/(route)/sign-up/_components/SignUpItem/SignUpItem.tsx index 6cc1a1fd..3bdafef1 100644 --- a/src/app/(route)/sign-up/_components/SignUpItem/SignUpItem.tsx +++ b/src/app/(route)/sign-up/_components/SignUpItem/SignUpItem.tsx @@ -27,6 +27,10 @@ const inputValidationRules = { }, nickname: { required: true, + minLength: { + value: 2, + message: "2~10자 사이의 닉네임을 입력해 주세요.", + }, maxLength: { value: 10, message: "2~10자 사이의 닉네임을 입력해 주세요.", @@ -50,23 +54,17 @@ const SignUpItem = ({ children, isVerified, ...props }: SignUpItemProps) => { rules: props.validation, }); - const isSuccess = isDirty && !error && field.value; + const isFieldSuccess = isDirty && !error && !!field.value; - const handleSuccess = (name: string) => { - if (name === "emailAuth") return isVerified; - else return isSuccess; - }; + const isSuccessState = + props.name === "emailAuth" || props.name === "nickname" ? isVerified : isFieldSuccess; const inputValidation = (name: string) => inputValidationRules[name as keyof typeof inputValidationRules]; return (
- + {children}
diff --git a/src/app/(route)/sign-up/_constants/SIGNUP_ERROR_MESSAGE.ts b/src/app/(route)/sign-up/_constants/SIGNUP_ERROR_MESSAGE.ts index 61de0b28..b6a3d9a6 100644 --- a/src/app/(route)/sign-up/_constants/SIGNUP_ERROR_MESSAGE.ts +++ b/src/app/(route)/sign-up/_constants/SIGNUP_ERROR_MESSAGE.ts @@ -22,4 +22,8 @@ export const NICKNAME_ERROR_MESSAGE = { export const EMAIL_CHECK_CODE_MESSAGE = { _INVALID_CREDENTIALS: { message: "인증번호가 일치하지 않아요.", status: "warning" }, + "AUTH400-EMAIL_VERIFY_FAILED": { + message: "인증번호가 만료되었거나 일치하지 않아요.", + status: "warning", + }, } as const; diff --git a/src/app/(route)/sign-up/_constants/SIGNUP_INPUT_CONFIG.ts b/src/app/(route)/sign-up/_constants/SIGNUP_INPUT_CONFIG.ts index 5c7ee8b4..e03394e7 100644 --- a/src/app/(route)/sign-up/_constants/SIGNUP_INPUT_CONFIG.ts +++ b/src/app/(route)/sign-up/_constants/SIGNUP_INPUT_CONFIG.ts @@ -43,5 +43,6 @@ export const SIGNUP_INPUT_CONFIG = [ rule: "2~10자, 특수문자/금칙어 제한", children: "중복 확인", maxLength: 10, + successMessage: "사용할 수 있는 닉네임입니다.", }, ] as const; diff --git a/src/app/(route)/sign-up/_hooks/useNicknameCheck.ts b/src/app/(route)/sign-up/_hooks/useNicknameCheck.ts index 85c544c0..b67c0011 100644 --- a/src/app/(route)/sign-up/_hooks/useNicknameCheck.ts +++ b/src/app/(route)/sign-up/_hooks/useNicknameCheck.ts @@ -1,8 +1,8 @@ import { useEffect, useState } from "react"; -import { useApiCheckNickname } from "@/api/fetch/auth"; import { useFormContext } from "react-hook-form"; import { useToast } from "@/context/ToastContext"; import { NICKNAME_ERROR_MESSAGE } from "../_constants/SIGNUP_ERROR_MESSAGE"; +import { useApiCheckNickname } from "@/api/fetch/auth"; export const useNicknameCheck = () => { const { addToast } = useToast(); @@ -10,27 +10,29 @@ export const useNicknameCheck = () => { const [nicknameValue, setNicknameValue] = useState(""); const [isNicknameVerified, setIsNicknameVerified] = useState(false); - const { data, error, isSuccess, isError } = useApiCheckNickname(nicknameValue); - const handlerNickname = () => { + const { data, isSuccess, isError } = useApiCheckNickname(nicknameValue); + + const handlerToClickNickname = (name: string) => { + const nickname = getValues(name); + + setIsNicknameVerified(false); + setNicknameValue(nickname); + }; + + useEffect(() => { if (!data) return; + if (isSuccess) { - addToast("사용할 수 있는 닉네임입니다.", "success"); setIsNicknameVerified(true); + addToast("사용할 수 있는 닉네임이에요.", "success"); } else { + setIsNicknameVerified(false); + const target = NICKNAME_ERROR_MESSAGE[data.code as keyof typeof NICKNAME_ERROR_MESSAGE]; addToast(target.message, target.status); } - }; - - useEffect(() => { - handlerNickname(); - }, [nicknameValue, data, error, isSuccess, isError]); - - const handlerToClickNickname = (name: string) => { - const nickname = getValues(name); - setNicknameValue(nickname); - }; + }, [data, isSuccess, isError, addToast]); return { handlerToClickNickname, diff --git a/src/app/(route)/sign-up/_hooks/useSignUpBtnClick.ts b/src/app/(route)/sign-up/_hooks/useSignUpBtnClick.ts index ba373c07..eac33976 100644 --- a/src/app/(route)/sign-up/_hooks/useSignUpBtnClick.ts +++ b/src/app/(route)/sign-up/_hooks/useSignUpBtnClick.ts @@ -1,11 +1,11 @@ import { useFormContext } from "react-hook-form"; import { useToast } from "@/context/ToastContext"; import { useMemo, useState } from "react"; -import { useApiCheckCode, useApiSendEmail } from "@/api/fetch/auth"; import { useErrorToast } from "@/hooks"; import { useNicknameCheck } from "./useNicknameCheck"; import { EMAIL_ERROR_MESSAGE, EMAIL_CHECK_CODE_MESSAGE } from "../_constants/SIGNUP_ERROR_MESSAGE"; import { throttle } from "lodash"; +import { useApiCheckCode, useApiSendEmail } from "@/api/fetch/auth"; export const useSignUpBtnClick = () => { const { getValues, trigger } = useFormContext(); @@ -22,7 +22,7 @@ export const useSignUpBtnClick = () => { const { mutate: EmailMutate } = useApiSendEmail(); const { mutate: CodeMutate } = useApiCheckCode(); - const { handlerToClickNickname } = useNicknameCheck(); + const { handlerToClickNickname, isNicknameVerified } = useNicknameCheck(); const handlerToClick = useMemo( () => @@ -59,7 +59,10 @@ export const useSignUpBtnClick = () => { setIsEmailDisabled(true); setIsEmailAuthVerified(true); }, - onError: (error) => handlerApiError(EMAIL_CHECK_CODE_MESSAGE, error.code), + onError: (error) => { + handlerApiError(EMAIL_CHECK_CODE_MESSAGE, error.code); + console.log("error>> ", error); + }, } ); } else if (name === "nickname") { @@ -87,5 +90,6 @@ export const useSignUpBtnClick = () => { isEmailAuthDisabled, isEmailDisabled, isEmailAuthVerified, + isNicknameVerified, }; }; From df7b50dadf0b798471241f817b2b8250c3a56b82 Mon Sep 17 00:00:00 2001 From: suhyeon0111 Date: Sat, 3 Jan 2026 17:25:59 +0900 Subject: [PATCH 7/8] =?UTF-8?q?refactor(mypage-profile):=20=EB=94=94?= =?UTF-8?q?=EC=9E=90=EC=9D=B8=20=ED=86=A0=ED=81=B0=20=EA=B0=92=EC=9C=BC?= =?UTF-8?q?=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../_components/MypageProfileForm/MypageProfileForm.tsx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/app/(route)/mypage/profile/_components/MypageProfileForm/MypageProfileForm.tsx b/src/app/(route)/mypage/profile/_components/MypageProfileForm/MypageProfileForm.tsx index 3677bf57..6c0ba3c1 100644 --- a/src/app/(route)/mypage/profile/_components/MypageProfileForm/MypageProfileForm.tsx +++ b/src/app/(route)/mypage/profile/_components/MypageProfileForm/MypageProfileForm.tsx @@ -20,9 +20,8 @@ const MypageProfileForm = () => { ) : ( )} - {/* TODO(수현): 디자인 토큰 변경 요청 해놓은 상태로 등록 시 추후 변경 */}