| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119 |
- 'use client';
- import './style.scss';
- import Link from 'next/link';
- import { useRouter } from 'next/navigation';
- import { useState, useEffect, useRef } from 'react';
- import { ResetPasswordRequest } from '@/types/request/auth';
- import { fetchApi } from '@/lib/utils/client';
- import Loading from '@/app/component/Loading';
- export default function ResetPassword()
- {
- const router = useRouter();
- const [loading, setLoading] = useState<boolean>(false);
- const [error, setError] = useState<string>('');
- const [password, setPassword] = useState<string>('');
- const [rePassword, setRePassword] = useState<string>('');
- const [email, setEmail] = useState<string|null>(null);
- const passwordRef = useRef<HTMLInputElement>(null);
- const rePasswordRef = useRef<HTMLInputElement>(null);
- useEffect(() => {
- if (error) {
- alert(error);
- setError('');
- }
- }, [error]);
- useEffect(() => {
- const storedEmail = sessionStorage.getItem('email');
- if (!storedEmail) {
- setError('잘못된 접근입니다.');
- router.push('/login');
- return;
- }
- setEmail(storedEmail);
- }, [router]);
- const handleSubmit = async (e: React.FormEvent<HTMLFormElement>) => {
- e.preventDefault();
- try {
- setLoading(true);
- setError('');
- if (!email) {
- throw new Error("이메일을 입력하세요.");
- }
- if (!password) {
- passwordRef.current?.focus();
- throw new Error("비밀번호를 입력하세요.");
- }
- if (!rePassword) {
- rePasswordRef.current?.focus();
- throw new Error("비밀번호를 입력하세요.");
- }
- if (password !== rePassword) {
- throw new Error("비밀번호가 일치하지 않습니다.");
- }
- await new Promise(resolve => setTimeout(resolve, 500));
- const res = await fetchApi('/api/auth/reset-password', {
- method: 'POST',
- body: { Email: email, Password: password, RePassword: rePassword } as ResetPasswordRequest
- });
- sessionStorage.clear();
- alert(res.message);
- router.push('/login');
- } catch (err) {
- if (err instanceof Error) {
- setError(err.message);
- }
- } finally {
- setLoading(false);
- }
- }
- return (
- <>
- {loading && <Loading />}
- <div id="resetPasswordForm" className="row-start-2">
- <fieldset>
- <legend>비밀번호 변경</legend>
- <form id="fResetPassword" method="post" acceptCharset="utf-8" autoComplete="off" onSubmit={handleSubmit}>
- <section className="grow sm:pt-4">
- <article className="grid">
- <label htmlFor="email">이메일</label>
- <input type="email" name="email" id="email" value={email || ''} disabled />
- <label htmlFor="password">비밀번호</label>
- <input type="password" name="password" id="password" ref={passwordRef} maxLength={20} value={password} onChange={e => setPassword(e.target.value)} />
- <label htmlFor="rePassword">비밀번호 확인</label>
- <input type="password" name="re_password" id="rePassword" ref={rePasswordRef} maxLength={20} value={rePassword} onChange={e => setRePassword(e.target.value)} />
- </article>
- </section>
- <hr />
- <div className="grid grid-cols-2 gap-2">
- <button type="submit" className="btn btn-submit" disabled={loading}>
- {loading ? "변경 중..." : "변경하기"}
- </button>
- <Link href="/login" className="btn btn-default">취소</Link>
- </div>
- </form>
- </fieldset>
- </div>
- </>
- );
- }
|