"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 [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 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(); setFoundUserId(data.email); 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)} onFocus={() => setFocused((p) => ({ ...p, name: true }))} onBlur={() => setFocused((p) => ({ ...p, name: false }))} placeholder="이름을 입력해 주세요." className="h-[40px] px-[12px] py-[7px] w-full rounded-[8px] border border-neutral-40 focus:outline-none focus:border-neutral-700 text-[18px] text-neutral-700 placeholder:text-input-placeholder-text pr-[40px]" /> {name.trim().length > 0 && focused.name && ( )}
{errors.name &&

{errors.name}

}
setPhone(e.target.value.replace(/[^0-9]/g, ""))} 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 border-neutral-40 focus:outline-none focus:border-neutral-700 text-[18px] text-neutral-700 placeholder:text-input-placeholder-text pr-[40px]" /> {phone.trim().length > 0 && focused.phone && ( )}
{errors.phone &&

{errors.phone}

}

Copyright ⓒ 2025 XL LMS. All rights reserved

); }