page.tsx 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. 'use client';
  2. import './style.scss';
  3. import Link from 'next/link';
  4. import { useState, useEffect } from 'react';
  5. import { useMemberContext } from '@/contexts/memberProvider';
  6. import { ChangeApproveRequest } from '@/dtos/request/account';
  7. import { fetchApi, throwError } from '@/lib/utils/client';
  8. import Loading from '@/app/component/Loading';
  9. export default function ChangeApprove()
  10. {
  11. const { member, setMember } = useMemberContext();
  12. const [error, setError] = useState<string>('');
  13. const [loading, setLoading] = useState<boolean>(false);
  14. const [notifications, setNotifications] = useState({
  15. isReceiveSMS: member?.memberApprove.isReceiveSMS || false,
  16. isReceiveEmail: member?.memberApprove.isReceiveEmail || false,
  17. isReceiveNote: member?.memberApprove.isReceiveNote || false
  18. });
  19. useEffect(() => {
  20. if (error) {
  21. alert(error);
  22. setError('');
  23. }
  24. }, [error]);
  25. useEffect(() => {
  26. if (member) {
  27. const approve = member.memberApprove;
  28. setNotifications({
  29. isReceiveSMS: approve?.isReceiveSMS ?? false,
  30. isReceiveEmail: approve?.isReceiveEmail ?? false,
  31. isReceiveNote: approve?.isReceiveNote ?? false
  32. });
  33. }
  34. }, [member]);
  35. const handleSubmit = async (e: React.FormEvent<HTMLFormElement>) => {
  36. e.preventDefault();
  37. if (!member) {
  38. return;
  39. }
  40. setLoading(true);
  41. fetchApi('/api/mypage/receive-settings', {
  42. method: 'POST',
  43. body: {
  44. IsReceiveSMS: notifications.isReceiveSMS,
  45. IsReceiveEmail: notifications.isReceiveEmail,
  46. IsReceiveNote: notifications.isReceiveNote
  47. } as ChangeApproveRequest
  48. }).then(res => {
  49. throwError(res);
  50. member.memberApprove.isReceiveSMS = notifications.isReceiveSMS;
  51. member.memberApprove.isReceiveEmail = notifications.isReceiveEmail;
  52. member.memberApprove.isReceiveNote = notifications.isReceiveNote;
  53. setMember(member);
  54. localStorage.setItem('member', JSON.stringify(member));
  55. alert("수신 설정이 변경되었습니다.");
  56. }).catch(err => {
  57. setError(err.message);
  58. }).finally(() => {
  59. setLoading(false);
  60. });
  61. }
  62. const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {
  63. const { name, checked } = e.target;
  64. setNotifications((prev) => ({
  65. ...prev,
  66. [name]: checked
  67. }));
  68. };
  69. return (
  70. <div id="changeApprove">
  71. { loading && <Loading /> }
  72. <h1>알림 수신 설정</h1>
  73. <form method="post" acceptCharset="utf-8" autoComplete="off" onSubmit={handleSubmit}>
  74. <table className="table-auto max-xl:w-full lg:w-[600px]">
  75. <caption>
  76. 보다 편리한 서비스 이용을 위해 원하는 알림 수신 여부를 설정할 수 있습니다.
  77. </caption>
  78. <colgroup>
  79. <col width="30%"/>
  80. <col width="60%"/>
  81. </colgroup>
  82. <tbody>
  83. <tr>
  84. <th>SMS 수신</th>
  85. <td>
  86. <label>
  87. <input
  88. type="checkbox"
  89. name="isReceiveSMS"
  90. checked={notifications.isReceiveSMS}
  91. onChange={handleChange}
  92. />
  93. 수신합니다.
  94. </label>
  95. </td>
  96. </tr>
  97. <tr>
  98. <th>이메일 수신</th>
  99. <td>
  100. <label>
  101. <input
  102. type="checkbox"
  103. name="isReceiveEmail"
  104. checked={notifications.isReceiveEmail}
  105. onChange={handleChange}
  106. />
  107. 수신합니다.
  108. </label>
  109. </td>
  110. </tr>
  111. <tr>
  112. <th>쪽지 수신</th>
  113. <td>
  114. <label>
  115. <input
  116. type="checkbox"
  117. name="isReceiveNote"
  118. checked={notifications.isReceiveNote}
  119. onChange={handleChange}
  120. />
  121. 수신합니다.
  122. </label>
  123. </td>
  124. </tr>
  125. </tbody>
  126. <tfoot>
  127. <tr>
  128. <td colSpan={2}>
  129. <div className="flex justify-center gap-2">
  130. <button type="submit" className="btn btn-submit">확인</button>
  131. <Link href="/profile" className="btn btn-default">취소</Link>
  132. </div>
  133. </td>
  134. </tr>
  135. </tfoot>
  136. </table>
  137. </form>
  138. <br />
  139. <dl className="max-xl:w-full lg:w-[600px]">
  140. <dt hidden>&nbsp;</dt>
  141. <dd>
  142. <ol>
  143. <li>수신을 거부하더라도 계정 보안 및 필수 서비스 공지는 계속 받을 수 있습니다.</li>
  144. <li>프로모션 및 이벤트 소식을 받고 싶다면 수신을 활성화하세요.</li>
  145. </ol>
  146. </dd>
  147. </dl>
  148. </div>
  149. );
  150. }