page.tsx 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. 'use client';
  2. import './style.scss';
  3. import Link from 'next/link';
  4. import { useSearchParams } from 'next/navigation';
  5. import { useState, useEffect } from 'react';
  6. import { useMemberContext } from '@/contexts/memberProvider';
  7. import { fetchValidEmail } from '@/lib/api/account';
  8. import Loading from '@/app/component/Loading';
  9. export default function VerifyEmail()
  10. {
  11. const searchParams = useSearchParams();
  12. const { member, setMember } = useMemberContext();
  13. const [error, setError] = useState<string>('');
  14. const [loading, setLoading] = useState<boolean>(false);
  15. const [isComplete, setComplete] = useState<boolean>(false);
  16. const [newEmail, setNewEmail] = useState<string>('');
  17. const [token] = useState(searchParams.get('token'));
  18. useEffect(() => {
  19. if (error) {
  20. alert(error);
  21. setError('');
  22. }
  23. }, [error]);
  24. useEffect(() => {
  25. if (!member) {
  26. return;
  27. }
  28. setLoading(true);
  29. if (!token) {
  30. setError('잘못된 접근입니다.');
  31. setLoading(false);
  32. setComplete(false);
  33. return;
  34. }
  35. fetchValidEmail(token).then((res) => {
  36. if (!res.ok) {
  37. throw new Error(res.message!);
  38. }
  39. member.email = res.data;
  40. setComplete(true);
  41. setMember(member);
  42. setNewEmail(member.email);
  43. localStorage.setItem('member', JSON.stringify(member));
  44. }).catch(err => {
  45. setError(err.message);
  46. }).finally(() => {
  47. setLoading(false);
  48. });
  49. }, [token, member, setMember]);
  50. if (loading) {
  51. return <Loading />;
  52. }
  53. return (
  54. <>
  55. <div id="verifyEmail">
  56. {isComplete ?
  57. <>
  58. <h1>이메일 변경이 완료되었습니다.</h1>
  59. <blockquote>
  60. <strong>{newEmail} 주소의 인증이 확인되었습니다. </strong><br />
  61. 다시 로그인 후 변경된 이메일로 서비스 이용이 가능합니다.<br />
  62. </blockquote>
  63. <br />
  64. <Link href="/profile" className="btn btn-default">확인</Link>
  65. </>
  66. :
  67. <>
  68. <h1>이메일 변경이 거부되었습니다.</h1>
  69. <blockquote>
  70. 인증 시간이 만료되었거나, 이미 인증되었을 수 있습니다.<br />
  71. 처음부터 다시 시도해 주십시오.
  72. </blockquote>
  73. <br />
  74. <Link href="/change-email" className="btn btn-default">다시 시도하기</Link>
  75. </>
  76. }
  77. </div>
  78. </>
  79. );
  80. }