page.tsx 4.0 KB

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