page.tsx 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. 'use client';
  2. import './style.scss';
  3. import Link from 'next/link';
  4. import { useState, useEffect } from 'react';
  5. import { fetchWithdraw } from '@/lib/api/account';
  6. import useAuth from '@/hooks/useAuth';
  7. import Loading from '@/app/component/Loading';
  8. import NavTabs from '../navTabs';
  9. export default function Withdraw()
  10. {
  11. const { member } = useAuth();
  12. const [error, setError] = useState<string>('');
  13. const [loading, setLoading] = useState<boolean>(true);
  14. const [isComplete, setComplete] = useState<boolean>(false);
  15. const [agree, setAgree] = useState<boolean>(false);
  16. useEffect(() => {
  17. if (error) {
  18. alert(error);
  19. setError('');
  20. }
  21. }, [error]);
  22. useEffect(() => {
  23. if (member) {
  24. setLoading(false);
  25. }
  26. }, [member]);
  27. const handleSubmit = async (e: React.FormEvent<HTMLFormElement>) => {
  28. e.preventDefault();
  29. if (!member) {
  30. return;
  31. }
  32. if (agree === false) {
  33. alert('탈퇴에 동의해주세요.');
  34. return;
  35. }
  36. if (confirm('정말 탈퇴하시겠습니까?')) {
  37. setLoading(true);
  38. fetchWithdraw().then((res) => {
  39. if (!res.ok) {
  40. throw new Error(res.message!);
  41. }
  42. setComplete(true);
  43. localStorage.removeItem('member');
  44. }).catch(err => {
  45. setError(err.message);
  46. }).finally(() => {
  47. setLoading(false);
  48. });
  49. }
  50. }
  51. const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {
  52. setAgree(e.target.checked);
  53. };
  54. useEffect(() => {
  55. if (isComplete) {
  56. alert('탈퇴가 완료되었습니다.');
  57. setComplete(false);
  58. location.replace('/');
  59. }
  60. }, [isComplete]);
  61. if (!member) {
  62. return <Loading />;
  63. }
  64. return (
  65. <>
  66. <NavTabs />
  67. <div id="withdraw">
  68. { loading && <Loading /> }
  69. <h1>회원탈퇴</h1>
  70. <form id="fWithdraw" method="post" acceptCharset="utf-8" autoComplete="off" onSubmit={handleSubmit}>
  71. <table className="table-auto max-xl:w-full lg:w-[600px]">
  72. <tbody>
  73. <tr>
  74. <th>
  75. <blockquote>
  76. 사용하고 계신 계정({member.email})은 탈퇴할 경우 재사용 및 복구가 불가능합니다.
  77. <ins>탈퇴한 계정은 본인과 타인 모두 재사용 및 복구가 불가하오니 신중하게 선택하시기 바랍니다.</ins>
  78. <br/>
  79. <br/>
  80. 추가 회원가입은 탈퇴일로부터 90일 후에 가능합니다.
  81. 탈퇴 후 회원정보와 주요 서비스 이용기록은 모두 삭제되며, 삭제된 데이터는 복구되지 않습니다.
  82. <br/>
  83. <br/>
  84. 삭제되는 내용을 확인하시고 필요한 데이터는 미리 백업을 해주세요.
  85. 탈퇴 후 게시판, 댓글은은 등록한 게시물은 삭제되지 않고 유지됩니다.
  86. <br/>
  87. <br/>
  88. 탈퇴하기 전에 이메일 인증이 필요합니다.
  89. </blockquote>
  90. </th>
  91. </tr>
  92. <tr>
  93. <td>
  94. <label>
  95. <input type="checkbox" name="agree" onChange={handleChange} required />
  96. 위 내용으로 탈퇴에 동의합니다.
  97. </label>
  98. </td>
  99. </tr>
  100. </tbody>
  101. <tfoot>
  102. <tr>
  103. <td>
  104. <div className="flex justify-center gap-2">
  105. <button type="submit" className="btn btn-submit">확인</button>
  106. <Link href="/profile" className="btn btn-default">취소</Link>
  107. </div>
  108. </td>
  109. </tr>
  110. </tfoot>
  111. </table>
  112. </form>
  113. </div>
  114. </>
  115. );
  116. }