"use client"; import React, { useMemo, useState } from "react"; import IdFindDone from "./IdFindDone"; import IdFindFailed from "./IdFindFailed"; import FindIdOption from "./FindIdOption"; import LoginInputSvg from "@/app/svgs/inputformx"; export default function FindIdPage() { const [isDoneOpen, setIsDoneOpen] = useState(false); const [isFailedOpen, setIsFailedOpen] = useState(false); const [foundUserId, setFoundUserId] = useState(undefined); const [joinedAt, setJoinedAt] = useState(undefined); const [name, setName] = useState(""); const [phone, setPhone] = useState(""); const [focused, setFocused] = useState>({}); const [errors, setErrors] = useState>({}); const isNameValid = useMemo(() => name.trim().length > 0, [name]); const isPhoneValid = useMemo(() => /^\d{9,11}$/.test(phone), [phone]); const canSubmit = useMemo(() => isNameValid && isPhoneValid, [isNameValid, isPhoneValid]); function formatPhoneNumber(value: string): string { const numbers = value.replace(/[^0-9]/g, ""); if (numbers.length <= 3) return numbers; if (numbers.length <= 7) return `${numbers.slice(0, 3)}-${numbers.slice(3)}`; if (numbers.length <= 11) return `${numbers.slice(0, 3)}-${numbers.slice(3, 7)}-${numbers.slice(7)}`; return `${numbers.slice(0, 3)}-${numbers.slice(3, 7)}-${numbers.slice(7, 11)}`; } // function formatJoinedAt(dateString: string | Date): string { // const date = typeof dateString === 'string' ? new Date(dateString) : dateString; // const year = date.getFullYear(); // const month = date.getMonth() + 1; // const day = date.getDate(); // return `${year}년 ${month}월 ${day}일`; // } function validateAll() { const next: Record = {}; if (!isNameValid) next.name = "이름을 입력해 주세요."; if (!isPhoneValid) next.phone = "휴대폰 번호를 숫자만 9~11자리로 입력해 주세요."; setErrors(next); return Object.keys(next).length === 0; } async function handleSubmit(e: React.FormEvent) { e.preventDefault(); if (!validateAll()) return; try { const response = await fetch('https://hrdi.coconutmeet.net/auth/find-id', { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ name: name, phone: phone, }), }); if (!response.ok) { let errorMessage = `아이디 찾기 실패 (${response.status})`; try { const errorData = await response.json(); if (errorData.error) { errorMessage = errorData.error; } else if (errorData.message) { errorMessage = errorData.message; } else if (response.statusText) { errorMessage = `${response.statusText} (${response.status})`; } } catch (parseError) { if (response.statusText) { errorMessage = `${response.statusText} (${response.status})`; } } console.error('아이디 찾기 실패:', errorMessage); setIsFailedOpen(true); return; } const data = await response.json(); // body의 emails 배열에서 첫 번째 이메일 가져오기 if (data.emails && Array.isArray(data.emails) && data.emails.length > 0) { setFoundUserId(data.emails[0]); } else if (data.email) { setFoundUserId(data.email); } // 가입일 정보는 API 응답에 없음 // // header의 date 값 가져오기 // const headerDate = response.headers.get('date'); // if (headerDate) { // setJoinedAt(formatJoinedAt(headerDate)); // } setIsDoneOpen(true); } catch (error) { const errorMessage = error instanceof Error ? error.message : '네트워크 오류가 발생했습니다.'; console.error('아이디 찾기 오류:', errorMessage); setIsFailedOpen(true); } } return (
setIsDoneOpen(false)} /> setIsFailedOpen(false)} />
아이디 찾기

가입 시 등록한 회원정보를 입력해 주세요.

{ setName(e.target.value); if (errors.name) { setErrors((prev) => { const next = { ...prev }; delete next.name; return next; }); } }} onFocus={() => setFocused((p) => ({ ...p, name: true }))} onBlur={() => setFocused((p) => ({ ...p, name: false }))} placeholder="이름을 입력해 주세요." className={`h-[40px] px-[12px] py-[7px] w-full rounded-[8px] mt-3 border focus:outline-none text-[18px] text-neutral-700 placeholder:text-input-placeholder-text pr-[40px] ${ errors.name ? "border-error focus:border-error" : "border-neutral-40 focus:border-neutral-700" }`} /> {name.trim().length > 0 && focused.name && ( )}
{errors.name &&

{errors.name}

}
{ const numbersOnly = e.target.value.replace(/[^0-9]/g, ""); setPhone(numbersOnly); if (errors.phone) { setErrors((prev) => { const next = { ...prev }; delete next.phone; return next; }); } }} onFocus={() => setFocused((p) => ({ ...p, phone: true }))} onBlur={() => setFocused((p) => ({ ...p, phone: false }))} placeholder="-없이 입력해 주세요." className={`h-[40px] px-[12px] py-[7px] w-full rounded-[8px] border mt-3 focus:outline-none text-[18px] text-neutral-700 placeholder:text-input-placeholder-text pr-[40px] ${ errors.phone ? "border-error focus:border-error" : "border-neutral-40 focus:border-neutral-700" }`} /> {phone.length > 0 && focused.phone && ( )}
{errors.phone &&

{errors.phone}

}

Copyright ⓒ 2025 XL LMS. All rights reserved

); }