NoticeListLayout.tsx 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. 'use client';
  2. import './style.scss';
  3. import Link from 'next/link';
  4. import { useSearchParams } from 'next/navigation';
  5. import { useMemo } from 'react'
  6. import Post from '@/types/forum/post';
  7. import { formatDate, isNewPost } from '@/lib/utils/client';
  8. import { BoardLayout } from '@/constants/forum';
  9. import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
  10. import { faComment, faThumbsUp, faEye } from '@fortawesome/free-regular-svg-icons';
  11. type Props = {
  12. isEnabled: boolean;
  13. list: Post[];
  14. layout?: BoardLayout;
  15. }
  16. // 공지사항 목록
  17. export default function NoticeListLayout({isEnabled, list, layout}: Props)
  18. {
  19. const searchParams = useSearchParams();
  20. const query = useMemo(() => Object.fromEntries(searchParams.entries()), [searchParams]);
  21. if (!isEnabled) {
  22. return null;
  23. }
  24. if (!list || list.length <= 0) {
  25. return;
  26. }
  27. return (
  28. <>
  29. {list.map(row => {
  30. const isNew = isNewPost(true, row);
  31. const createdAt = formatDate(row.createdAt);
  32. const postViewUrl = {pathname: '/post/' + row.id, query};
  33. return (
  34. <section key={row.id}>
  35. {/* PC */}
  36. <ol>
  37. <li>
  38. <img src='/resources/notice.gif' alt='공지사항' className='mx-auto'/>
  39. </li>
  40. <li>
  41. <Link href={postViewUrl}>
  42. <em>{row.subject} {row.comments > 0 && (<span>[{row.comments}]</span>)}</em>
  43. {isNew && <span><img src='/resources/new.gif' alt='NEW'/></span>}
  44. </Link>
  45. </li>
  46. {layout === BoardLayout.Default && (
  47. <>
  48. <li>{row.name || row.sid}</li>
  49. <li>{createdAt}</li>
  50. <li>{row.views}</li>
  51. <li>{row.likes}</li>
  52. </>
  53. )}
  54. {layout === BoardLayout.Media && (
  55. <>
  56. <li>{row.name || row.sid}</li>
  57. <li>{createdAt}</li>
  58. <li>{row.views}</li>
  59. </>
  60. )}
  61. {layout === BoardLayout.QnA && (
  62. <>
  63. <li>{row.name || row.sid}</li>
  64. <li>-</li>
  65. <li>{createdAt}</li>
  66. </>
  67. )}
  68. </ol>
  69. {/* Mobile */}
  70. <dl hidden>
  71. <dt>
  72. <Link href={postViewUrl}>
  73. <em>{row.subject} {row.comments > 0 && (<span>[{row.comments}]</span>)}</em>
  74. {isNew && <span><img src='/resources/new.gif' alt='NEW'/></span>}
  75. </Link>
  76. </dt>
  77. <dd>
  78. <ul>
  79. <li>{row.name || row.sid}</li>
  80. <li><FontAwesomeIcon icon={faComment} /> {row.comments}</li>
  81. <li><FontAwesomeIcon icon={faEye} /> {row.views}</li>
  82. <li><FontAwesomeIcon icon={faThumbsUp} /> {row.likes}</li>
  83. <li>{createdAt}</li>
  84. </ul>
  85. </dd>
  86. </dl>
  87. </section>
  88. );
  89. })}
  90. </>
  91. );
  92. }