page.tsx 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. 'use client';
  2. import './style.scss';
  3. import Link from 'next/link';
  4. import Image from 'next/image';
  5. import useAuth from '@/hooks/useAuth';
  6. import { getDateTime, stripHtmlTags } from '@/lib/utils/client';
  7. import NavTabs from '../navTabs';
  8. export default function Profile()
  9. {
  10. const { member } = useAuth();
  11. if (!member) {
  12. return null;
  13. }
  14. return (
  15. <>
  16. <NavTabs />
  17. <div id="profile">
  18. <h1>내 정보</h1>
  19. <div className="grid grid-cols-1 xl:grid-cols-2 gap-3">
  20. <table className="table-auto">
  21. <caption>등록 정보</caption>
  22. <colgroup>
  23. <col style={{width: "clamp(80px, 30%, 200px)"}}/>
  24. <col/>
  25. </colgroup>
  26. <tbody>
  27. <tr>
  28. <th>사용자 ID</th>
  29. <td colSpan={2}>{member?.sid}</td>
  30. </tr>
  31. <tr>
  32. <th>이메일</th>
  33. <td>{member?.email}</td>
  34. <td>
  35. <Link href="/change-email" className="btn btn-default">이메일 변경</Link>
  36. </td>
  37. </tr>
  38. <tr>
  39. <th>별명</th>
  40. <td>{member?.name || '-'}</td>
  41. <td>
  42. <Link href="/change-name" className="btn btn-default">별명 변경</Link>
  43. </td>
  44. </tr>
  45. <tr>
  46. <th>본인인증</th>
  47. <td>{member?.isAuthCertified ? '인증 완료' : '-'}</td>
  48. <td></td>
  49. </tr>
  50. <tr>
  51. <th>회원가입 일시</th>
  52. <td colSpan={2}>{getDateTime(member.createdAt)}</td>
  53. </tr>
  54. <tr>
  55. <th>마지막 로그인 일시</th>
  56. <td colSpan={2}>{getDateTime(member.lastLoginAt)}</td>
  57. </tr>
  58. <tr>
  59. <th>알림 수신</th>
  60. <td>
  61. <div className="flex items-center gap-4 flex-wrap">
  62. <label className="flex items-center gap-2 text-gray-700">
  63. <input type="checkbox" checked={member.memberApprove.isReceiveSMS} readOnly disabled className="accent-gray-500 cursor-not-allowed" />
  64. SMS
  65. </label>
  66. <label className="flex items-center gap-2 text-gray-700">
  67. <input type="checkbox" checked={member.memberApprove.isReceiveEmail} readOnly disabled className="accent-gray-500 cursor-not-allowed" />
  68. 메일
  69. </label>
  70. <label className="flex items-center gap-2 text-gray-700">
  71. <input type="checkbox" checked={member.memberApprove.isReceiveNote} readOnly disabled className="accent-gray-500 cursor-not-allowed" />
  72. 쪽지
  73. </label>
  74. </div>
  75. </td>
  76. <td>
  77. <Link href="/change-approve" className="btn btn-default">수신 설정</Link>
  78. </td>
  79. </tr>
  80. </tbody>
  81. </table>
  82. <table className="mt-3 xl:mt-0 table-auto">
  83. <caption>활동 정보</caption>
  84. <colgroup>
  85. <col style={{width: "100%", minWidth: "80px", maxWidth: "30%"}}/>
  86. <col width="*"/>
  87. <col width="*"/>
  88. </colgroup>
  89. <tbody>
  90. <tr>
  91. <th>회원 사진</th>
  92. <td>
  93. {member?.thumb ?
  94. (<Image src={member?.thumb} alt="회원 사진" width={64} height={64} style={{objectFit: "cover"}} unoptimized={true} />) : '-'}
  95. </td>
  96. <td>
  97. <Link href="/change-thumb" className="btn btn-default">사진 변경</Link>
  98. </td>
  99. </tr>
  100. <tr>
  101. <th>회원 등급</th>
  102. <td></td>
  103. <td></td>
  104. </tr>
  105. <tr>
  106. <th>한마디</th>
  107. <td colSpan={2}>
  108. <div className="grid grid-cols-[1fr_auto] gap-2 items-center">
  109. <span className="truncate">{member?.summary || '-'}</span>
  110. <Link href="/change-summary" className="btn btn-default">한마디 변경</Link>
  111. </div>
  112. </td>
  113. </tr>
  114. <tr>
  115. <th>자기소개</th>
  116. <td colSpan={2}>
  117. <div className="grid grid-cols-[1fr_auto] gap-2 items-center">
  118. <span className="truncate">{stripHtmlTags(member.intro) || '-'}</span>
  119. <Link href="/change-intro" className="btn btn-default">자기소개 변경</Link>
  120. </div>
  121. </td>
  122. </tr>
  123. <tr>
  124. <th>경험치</th>
  125. <td colSpan={2}>{member?.memberStats.exp}</td>
  126. </tr>
  127. <tr>
  128. <th>작성 게시글</th>
  129. <td colSpan={2}>{member?.memberStats.postCount}</td>
  130. </tr>
  131. <tr>
  132. <th>작성 댓글</th>
  133. <td colSpan={2}>{member?.memberStats.commentCount}</td>
  134. </tr>
  135. <tr>
  136. <th>구독자</th>
  137. <td colSpan={2}>{member?.memberStats.followingCount}</td>
  138. </tr>
  139. </tbody>
  140. </table>
  141. <Link href='/studio' className='text-sky-600 hover:text-red-600 hover:underline'>채널 관리</Link>
  142. </div>
  143. <br />
  144. <dl>
  145. <dt>회원님의 개인정보는 안전하게 보호됩니다.</dt>
  146. <dd>※ 의심스러운 활동이 감지되면 즉시 비밀번호를 변경하세요.</dd>
  147. <dd>※ 보안을 위해 비밀번호를 주기적으로 변경하는 것이 좋습니다.</dd>
  148. <dd>※ 자동 로그인 기능을 사용하면, 로그인 상태가 유지됩니다.</dd>
  149. <dd>※ 공용 컴퓨터에서는 자동 로그인을 사용하지 않는 것이 좋습니다. </dd>
  150. </dl>
  151. </div>
  152. </>
  153. );
  154. }