'use client'; import './style.scss'; import Link from 'next/link'; import { useState, useEffect, useCallback, useRef } from 'react'; import { useConfigContext } from '@/contexts/configProvider'; import { useMemberContext } from '@/contexts/memberProvider'; import useErrorAlert from '@/hooks/useErrorAlert'; import { ChangePasswordRequest } from '@/types/request/account'; import { fetchApi, getPasswordPolicyMessage, throwError } from '@/lib/utils/client'; import Loading from '@/app/component/Loading'; import NavTabs from '../navTabs'; export default function ChangePassword() { const config = useConfigContext(); const { member } = useMemberContext(); const { setError } = useErrorAlert(); const [loading, setLoading] = useState(false); const [isComplete, setComplete] = useState(false); const [formData, setFormData] = useState({ currentPassword: '', newPassword: '', confirmPassword: '' }); const currentPasswordRef = useRef(null); const newPasswordRef = useRef(null); const confirmPasswordRef = useRef(null); const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); if (!member) { return; } if (!formData.currentPassword) { setError("현재 비밀번호를 입력하세요."); currentPasswordRef.current?.focus(); return; } if (!formData.newPassword) { setError("새 비밀번호를 입력하세요."); newPasswordRef.current?.focus(); return; } if (!formData.confirmPassword) { setError("새 비밀번호 확인을 입력하세요."); confirmPasswordRef.current?.focus(); return; } if (formData.newPassword !== formData.confirmPassword) { setError("새 비밀번호가 일치하지 않습니다."); return; } if (formData.currentPassword === formData.newPassword) { setError("새 비밀번호는 현재 비밀번호와 달라야 합니다."); return; } setLoading(true); fetchApi('/api/mypage/password', { method: 'POST', body: { CurrentPassword: formData.currentPassword, NewPassword: formData.newPassword, ConfirmPassword: formData.confirmPassword } as ChangePasswordRequest }).then((res) => { throwError(res); setComplete(true); }).catch(err => { setError(err.message); }).finally(() => { setLoading(false); }); } const handleChange = useCallback((e: React.ChangeEvent) => { const { id, value } = e.target; setFormData(prev => ({ ...prev, [id]: value})); }, []); useEffect(() => { if (isComplete) { // 입력 초기화 setFormData({ currentPassword: '', newPassword: '', confirmPassword: '' }); setComplete(false); alert("비밀번호가 변경되었습니다."); } }, [isComplete]); const txtPasswordGuide = getPasswordPolicyMessage({ passwordUppercaseLength: config.account.passwordUppercaseLength, passwordNumbersLength: config.account.passwordNumbersLength, passwordSpecialcharsLength: config.account.passwordSpecialcharsLength }); return ( <>
{ loading && }

비밀번호 변경

비밀번호는 { config.account.passwordMinLength }자 이상 20자 이하로 설정 가능합니다.
{ txtPasswordGuide }
 
 
 
취소
); }