PostWriteButton.tsx 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. 'use client';
  2. import '../[code]/style.scss';
  3. import { useRouter } from 'next/navigation';
  4. import { useCallback } from 'react';
  5. import useAuth from '@/hooks/useAuth';
  6. import { checkPermission } from '@/lib/utils/permission';
  7. import BoardMeta from '@/types/forum/boardMeta';
  8. import BoardManager from '@/types/forum/boardManager';
  9. type Props = {
  10. alwaysShowButton: boolean;
  11. boardCode: string;
  12. boardMeta: BoardMeta;
  13. boardManagers: BoardManager[];
  14. }
  15. export default function PostWriteButton({ alwaysShowButton, boardCode, boardMeta, boardManagers }: Props)
  16. {
  17. const router = useRouter();
  18. const { isAuthenticated, member, loginCheck } = useAuth();
  19. const handleClick = useCallback((e: React.MouseEvent<HTMLButtonElement>) => {
  20. try {
  21. if (!isAuthenticated) {
  22. throw new Error('로그인 후 이용해주세요.');
  23. }
  24. // 게시글 작성 권한 확인
  25. if (!checkPermission(boardMeta, boardManagers, member).canWritePost) {
  26. throw new Error('글을 작성할 수 있는 권한이 없습니다.');
  27. }
  28. router.push(e.currentTarget.value);
  29. } catch(err) {
  30. if (err instanceof Error) {
  31. return alert(err.message);
  32. }
  33. }
  34. }, [loginCheck, boardMeta, boardManagers, member, router]);
  35. if (!alwaysShowButton && !isAuthenticated) {
  36. return null;
  37. }
  38. return (
  39. <>
  40. <section aria-label='글쓰기 버튼'>
  41. <button type="button" value={`/post/write?board=${boardCode}`} className='btn btn-submit' onClick={handleClick}>글쓰기</button>
  42. </section>
  43. </>
  44. );
  45. }