page.tsx 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  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 '@/types/request/account';
  7. import { fetchApi } 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(() => {
  49. member.memberApprove.isReceiveSMS = notifications.isReceiveSMS;
  50. member.memberApprove.isReceiveEmail = notifications.isReceiveEmail;
  51. member.memberApprove.isReceiveNote = notifications.isReceiveNote;
  52. setMember(member);
  53. localStorage.setItem('member', JSON.stringify(member));
  54. alert("수신 설정이 변경되었습니다.");
  55. }).catch(err => {
  56. setError(err.message);
  57. }).finally(() => {
  58. setLoading(false);
  59. });
  60. }
  61. const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {
  62. const { name, checked } = e.target;
  63. setNotifications((prev) => ({
  64. ...prev,
  65. [name]: checked
  66. }));
  67. };
  68. return (
  69. <div id="changeApprove">
  70. { loading && <Loading /> }
  71. <h1>알림 수신 설정</h1>
  72. <form method="post" acceptCharset="utf-8" autoComplete="off" onSubmit={handleSubmit}>
  73. <table className="table-auto max-xl:w-full lg:w-[600px]">
  74. <caption>
  75. 보다 편리한 서비스 이용을 위해 원하는 알림 수신 여부를 설정할 수 있습니다.
  76. </caption>
  77. <colgroup>
  78. <col width="30%"/>
  79. <col width="60%"/>
  80. </colgroup>
  81. <tbody>
  82. <tr>
  83. <th>SMS 수신</th>
  84. <td>
  85. <label>
  86. <input
  87. type="checkbox"
  88. name="isReceiveSMS"
  89. checked={notifications.isReceiveSMS}
  90. onChange={handleChange}
  91. />
  92. 수신합니다.
  93. </label>
  94. </td>
  95. </tr>
  96. <tr>
  97. <th>이메일 수신</th>
  98. <td>
  99. <label>
  100. <input
  101. type="checkbox"
  102. name="isReceiveEmail"
  103. checked={notifications.isReceiveEmail}
  104. onChange={handleChange}
  105. />
  106. 수신합니다.
  107. </label>
  108. </td>
  109. </tr>
  110. <tr>
  111. <th>쪽지 수신</th>
  112. <td>
  113. <label>
  114. <input
  115. type="checkbox"
  116. name="isReceiveNote"
  117. checked={notifications.isReceiveNote}
  118. onChange={handleChange}
  119. />
  120. 수신합니다.
  121. </label>
  122. </td>
  123. </tr>
  124. </tbody>
  125. <tfoot>
  126. <tr>
  127. <td colSpan={2}>
  128. <div className="flex justify-center gap-2">
  129. <button type="submit" className="btn btn-submit">확인</button>
  130. <Link href="/profile" className="btn btn-default">취소</Link>
  131. </div>
  132. </td>
  133. </tr>
  134. </tfoot>
  135. </table>
  136. </form>
  137. <br />
  138. <dl className="max-xl:w-full lg:w-[600px]">
  139. <dt hidden>&nbsp;</dt>
  140. <dd>
  141. <ol>
  142. <li>수신을 거부하더라도 계정 보안 및 필수 서비스 공지는 계속 받을 수 있습니다.</li>
  143. <li>프로모션 및 이벤트 소식을 받고 싶다면 수신을 활성화하세요.</li>
  144. </ol>
  145. </dd>
  146. </dl>
  147. </div>
  148. );
  149. }