'use client'; import { useEffect, useState } from "react"; import { useRouter } from "next/navigation"; import ChangePasswordModal from "../ChangePasswordModal"; import PasswordChangeDoneModal from "../PasswordChangeDoneModal"; import AccountDeleteModal from "../AccountDeleteModal"; import MenuAccountOption from "@/app/menu/account/MenuAccountOption"; type VerificationState = 'initial' | 'sent' | 'verified' | 'failed' | 'changed'; type UserInfo = { email?: string; name?: string; phone?: string; }; export default function AccountPage() { const router = useRouter(); const [open, setOpen] = useState(false); const [verificationState, setVerificationState] = useState('initial'); const [doneOpen, setDoneOpen] = useState(false); const [deleteOpen, setDeleteOpen] = useState(false); const [userInfo, setUserInfo] = useState({}); const [isLoading, setIsLoading] = useState(true); // 페이지 로드 시 사용자 정보 가져오기 useEffect(() => { let isMounted = true; async function fetchUserInfo() { try { // localStorage와 쿠키 모두에서 토큰 확인 const localStorageToken = localStorage.getItem('token'); const cookieToken = document.cookie .split('; ') .find(row => row.startsWith('token=')) ?.split('=')[1]; const token = localStorageToken || cookieToken; if (!token) { if (isMounted) { router.push('/login'); } return; } // localStorage에 토큰이 없고 쿠키에만 있으면 localStorage에도 저장 (동기화) if (!localStorageToken && cookieToken) { localStorage.setItem('token', cookieToken); } const apiUrl = process.env.NEXT_PUBLIC_API_BASE_URL ? `${process.env.NEXT_PUBLIC_API_BASE_URL}/auth/me` : 'https://hrdi.coconutmeet.net/auth/me'; const response = await fetch(apiUrl, { method: 'GET', headers: { 'Content-Type': 'application/json', ...(token && { Authorization: `Bearer ${token}` }), }, }); if (!response.ok) { if (response.status === 401) { // 토큰이 만료되었거나 유효하지 않은 경우 localStorage.removeItem('token'); if (isMounted) { router.push('/login'); } return; } let errorMessage = `사용자 정보 조회 실패 (${response.status})`; try { const errorData = await response.json(); if (errorData.error) { errorMessage = errorData.error; } else if (errorData.message) { errorMessage = errorData.message; } } catch (parseError) { // ignore } console.error('사용자 정보 조회 실패:', errorMessage); if (isMounted) { setIsLoading(false); } return; } const data = await response.json(); if (isMounted) { setUserInfo(data); setIsLoading(false); } } catch (error) { const errorMessage = error instanceof Error ? error.message : '네트워크 오류가 발생했습니다.'; console.error('사용자 정보 조회 오류:', errorMessage); if (isMounted) { setIsLoading(false); } } } fetchUserInfo(); return () => { isMounted = false; }; }, []); // 개발 옵션에서 'changed'로 전환하면 완료 모달 표시 useEffect(() => { setDoneOpen(verificationState === 'changed'); }, [verificationState]); return (

내 정보 수정

{isLoading ? '로딩 중...' : (userInfo.email || '이메일 정보 없음')}
●●●●●●●●●●
setOpen(false)} onSubmit={() => { // TODO: integrate API }} devVerificationState={ verificationState === 'changed' ? 'verified' : verificationState } initialEmail={userInfo.email} /> setDoneOpen(false)} /> setDeleteOpen(false)} onConfirm={async () => { try { const token = localStorage.getItem('token'); const response = await fetch('https://hrdi.coconutmeet.net/auth/delete/me', { method: 'DELETE', headers: { 'Content-Type': 'application/json', ...(token && { Authorization: `Bearer ${token}` }), }, }); 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); alert(errorMessage); return; } // 성공 시 토큰 제거 및 로그인 페이지로 이동 localStorage.removeItem('token'); setDeleteOpen(false); router.push('/login'); } catch (error) { const errorMessage = error instanceof Error ? error.message : '네트워크 오류가 발생했습니다.'; console.error('회원 탈퇴 오류:', errorMessage); alert(errorMessage); } }} />
); }