"use client" import { useState } from "react" import { cn } from "@/lib/utils" import { Button } from "@/components/ui/button" import { Field, FieldDescription, FieldGroup, FieldLabel, FieldSeparator, } from "@/components/ui/field" import { Input } from "@/components/ui/input" import { authApi } from "@/lib/api/auth.api" import { toast } from "sonner" import { useRouter } from "next/navigation" import { Eye, EyeOff } from "lucide-react" export function FindPwForm({ className, ...props }: React.ComponentProps<"form">) { const router = useRouter() const [step, setStep] = useState<"info" | "verify" | "reset" | "complete">("info") const [userId, setUserId] = useState("") const [userEmail, setUserEmail] = useState("") const [code, setCode] = useState("") const [resetToken, setResetToken] = useState("") const [newPassword, setNewPassword] = useState("") const [confirmPassword, setConfirmPassword] = useState("") const [showPassword, setShowPassword] = useState(false) const [showConfirmPassword, setShowConfirmPassword] = useState(false) const [isLoading, setIsLoading] = useState(false) const [timer, setTimer] = useState(0) // 인증번호 발송 const handleSendCode = async (e: React.FormEvent) => { e.preventDefault() if (!userId || !userEmail) { toast.error("아이디와 이메일을 모두 입력해주세요") return } setIsLoading(true) try { const result = await authApi.sendResetPasswordCode(userId, userEmail) toast.success(result.message) setStep("verify") setTimer(result.expiresIn) const interval = setInterval(() => { setTimer((prev) => { if (prev <= 1) { clearInterval(interval) return 0 } return prev - 1 }) }, 1000) } catch (error: any) { toast.error(error.message || "인증번호 발송에 실패했습니다") } finally { setIsLoading(false) } } // 인증번호 확인 const handleVerifyCode = async (e: React.FormEvent) => { e.preventDefault() if (!code) { toast.error("인증번호를 입력해주세요") return } setIsLoading(true) try { const result = await authApi.verifyResetPasswordCode(userId, userEmail, code) toast.success(result.message) setResetToken(result.resetToken) setStep("reset") } catch (error: any) { toast.error(error.message || "인증번호 확인에 실패했습니다") } finally { setIsLoading(false) } } // 비밀번호 재설정 const handleResetPassword = async (e: React.FormEvent) => { e.preventDefault() if (!newPassword || !confirmPassword) { toast.error("비밀번호를 입력해주세요") return } if (newPassword !== confirmPassword) { toast.error("비밀번호가 일치하지 않습니다") return } if (newPassword.length < 8) { toast.error("비밀번호는 8자 이상이어야 합니다") return } setIsLoading(true) try { const result = await authApi.resetPassword(resetToken, newPassword) toast.success(result.message) setStep("complete") } catch (error: any) { toast.error(error.message || "비밀번호 재설정에 실패했습니다") } finally { setIsLoading(false) } } // 타이머 포맷 const formatTime = (seconds: number) => { const m = Math.floor(seconds / 60) const s = seconds % 60 return `${m}:${s.toString().padStart(2, "0")}` } return (

비밀번호 찾기

{step === "info" && "등록된 정보를 입력해주세요"} {step === "verify" && "이메일로 전송된 인증번호를 입력해주세요"} {step === "reset" && "새로운 비밀번호를 설정해주세요"} {step === "complete" && "비밀번호 재설정이 완료되었습니다"}

{step === "info" && ( <> 아이디 setUserId(e.target.value)} required disabled={isLoading} className="h-10 lg:h-11" />
이메일 아이디 찾기
setUserEmail(e.target.value)} required disabled={isLoading} className="h-10 lg:h-11" />
)} {step === "verify" && ( <> 아이디 이메일 인증번호 setCode(e.target.value)} maxLength={6} required disabled={isLoading} className="h-10 lg:h-11" /> {timer > 0 ? `남은 시간: ${formatTime(timer)}` : "인증번호가 만료되었습니다"} )} {step === "reset" && ( <> 새 비밀번호
setNewPassword(e.target.value)} required disabled={isLoading} className="h-10 lg:h-11 pr-10" />
비밀번호 확인
setConfirmPassword(e.target.value)} required disabled={isLoading} className="h-10 lg:h-11 pr-10" />
{newPassword && confirmPassword && newPassword !== confirmPassword && ( 비밀번호가 일치하지 않습니다 )}
)} {step === "complete" && ( <>

비밀번호 재설정 완료

새로운 비밀번호로 로그인해주세요

)} {step === "info" && ( <> 또는
계정이 없으신가요? 회원가입
)}
) }