page.tsx 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. 'use client';
  2. import './style.scss';
  3. import { useState, useEffect } from 'react';
  4. import { LoginLogType } from '@/constants/common';
  5. import { fetchApi, throwError, getDateTime } from '@/lib/utils/client';
  6. import type { ExpLogsResponse } from '@/types/response/account/expLogs';
  7. import Loading from '@/app/component/Loading';
  8. import Pagination from '@/app/component/Pagination';
  9. import NavTabs from '../navTabs';
  10. export default function ExpLogs()
  11. {
  12. const [error, setError] = useState<string>('');
  13. const [loading, setLoading] = useState<boolean>(true);
  14. const [page, setPage] = useState<number>(1);
  15. const [type, setType] = useState<LoginLogType>(LoginLogType.Today);
  16. const [data, setData] = useState<ExpLogsResponse>({
  17. total: 0,
  18. list: []
  19. });
  20. useEffect(() => {
  21. if (error) {
  22. alert(error);
  23. setError('');
  24. }
  25. }, [error]);
  26. useEffect(() => {
  27. setLoading(true);
  28. fetchApi<ExpLogsResponse>(`/api/mypage/exp-logs?type=${type}&page=${page}&perPage=20`).then((res) => {
  29. throwError(res);
  30. setData(res.data!);
  31. }).catch(err => {
  32. setError(err.message);
  33. }).finally(() => {
  34. setLoading(false);
  35. });
  36. }, [type, page]);
  37. useEffect(() => {
  38. setPage(1);
  39. }, [type]);
  40. const tabItems = [
  41. { label: "오늘", value: LoginLogType.Today },
  42. { label: "1주일", value: LoginLogType.Week },
  43. { label: "1개월", value: LoginLogType.Month },
  44. { label: "3개월", value: LoginLogType.QuarterYear },
  45. { label: "6개월", value: LoginLogType.HalfYear }
  46. ];
  47. return (
  48. <>
  49. <NavTabs />
  50. <div id="expLogs">
  51. { loading && <Loading /> }
  52. <h1>경험치 내역</h1>
  53. <div className="list-header">
  54. <div className="summary">합계: {data.total}</div>
  55. <div id="expTypeTab">
  56. {tabItems.map((item, i) => (
  57. <button type="button" key={i} className={type === item.value ? 'active' : ''}
  58. onClick={() => setType(item.value)}>{item.label}
  59. </button>
  60. ))}
  61. </div>
  62. </div>
  63. <section className="mypage-list">
  64. <article>
  65. <ul>
  66. <li>일시</li>
  67. <li>사유</li>
  68. <li>변동</li>
  69. <li>잔액</li>
  70. </ul>
  71. </article>
  72. <article>
  73. {data.list.length > 0 ? (
  74. data.list.map((row) => (
  75. <section key={row.id}>
  76. {/* PC */}
  77. <ol>
  78. <li>{getDateTime(row.createdAt)}</li>
  79. <li className="reason">{row.reason}</li>
  80. <li>
  81. <span className={row.amount > 0 ? 'amount-plus' : 'amount-minus'}>
  82. {row.amount > 0 ? `+${row.amount}` : row.amount}
  83. </span>
  84. </li>
  85. <li>{row.balance.toLocaleString()}</li>
  86. </ol>
  87. {/* Mobile */}
  88. <dl hidden>
  89. <dt>{row.reason}</dt>
  90. <dd>
  91. <ul>
  92. <li>
  93. <span className={row.amount > 0 ? 'amount-plus' : 'amount-minus'}>
  94. {row.amount > 0 ? `+${row.amount}` : row.amount}
  95. </span>
  96. </li>
  97. <li>잔액 {row.balance.toLocaleString()}</li>
  98. <li>{getDateTime(row.createdAt)}</li>
  99. </ul>
  100. </dd>
  101. </dl>
  102. </section>
  103. ))
  104. ) : (
  105. <p className="empty">기록이 없습니다.</p>
  106. )}
  107. </article>
  108. </section>
  109. {data.list.length > 0 && (
  110. <Pagination total={data.total} page={page} perPage={20} onChange={setPage} />
  111. )}
  112. </div>
  113. </>
  114. );
  115. }