"use client"; import { useRef, useState } from "react"; import { usePathname, useRouter } from "next/navigation"; import { useConfirm } from "@frontend-opensource/use-react-hooks"; import { useQuery } from "@tanstack/react-query"; import { getCoreRowModel, useReactTable, type PaginationState, type RowSelectionState, } from "@tanstack/react-table"; import { Button, DataTable, Input, Label, Select, SelectContent, SelectItem, SelectTrigger, SelectValue, Skeleton, } from "@common/components"; import { PostApi, PostPageGuard, type Post, type PostParams, } from "@/entities/post"; import { ENDPOINT } from "@/shared/config"; import { useMenuStore, useUserStore } from "@/shared/lib"; import { GridViewDataTable } from "@/shared/ui/grid-view-data-table"; import { columns as tableColumns } from "../model/post-table-columns"; import { createColumns as createGridViewColumns } from "../model/grid-view-table-columns"; import { SortSelect } from "./sort-select"; function PostPage({ bbsId, tableCaption, }: { bbsId: string; tableCaption?: string; }) { const router = useRouter(); const pathname = usePathname(); const { confirm } = useConfirm(); const userInfo = useUserStore((state) => state.userInfo); const { bbsInfo, pageMenuAuthority } = useMenuStore((state) => state); const thumbRefs = useRef>(new Map()); const [tableSort, setTableSort] = useState(""); const [keywordType, setKeywordType] = useState("title"); const [keyword, setKeyword] = useState(""); const [searchParams, setSearchParams] = useState({ keywordType: "title", keyword: "", }); const [pagination, setPagination] = useState({ pageIndex: 0, pageSize: 10, }); const [rowSelection, setRowSelection] = useState({}); const { data: upndFixPostList } = useQuery({ queryKey: [ENDPOINT.BOARD_SERVICE.POSTS_USER, bbsId, bbsInfo], queryFn: () => PostApi.getPostList(parseInt(bbsId), { ...searchParams, upndFixYn: bbsInfo?.upndFixUseYn, }), select: (data) => { const newContent = data.content.map((post) => ({ ...post, isUpndFixPost: post.upndFixYn === "Y", })); return { ...data, content: newContent, }; }, enabled: bbsInfo?.upndFixUseYn === "Y", }); const { data: postList, isLoading, refetch, } = useQuery({ queryKey: [ ENDPOINT.BOARD_SERVICE.POSTS_USER, bbsId, searchParams, pagination, tableSort, ], queryFn: () => PostApi.getPostList(parseInt(bbsId), { ...searchParams, ansUseYn: bbsInfo?.ansUseYn, page: pagination.pageIndex, size: pagination.pageSize, sort: tableSort, }), }); const isGridViewPage = bbsInfo?.bbsTypeCd === "BBSIMAGE" || bbsInfo?.bbsTypeCd === "BBSMOVIE"; const table = useReactTable({ data: isGridViewPage ? (postList?.content ?? []) : [...(upndFixPostList?.content ?? []), ...(postList?.content ?? [])], columns: isGridViewPage ? createGridViewColumns(thumbRefs) : tableColumns, state: { pagination, rowSelection }, rowCount: postList?.totalElements ?? 0, manualPagination: true, enableMultiRowSelection: true, getCoreRowModel: getCoreRowModel(), onPaginationChange: setPagination, onRowSelectionChange: setRowSelection, meta: { bbsTypeCd: bbsInfo?.bbsTypeCd }, }); const onPostDelete = async () => { const selectedPosts = table .getFilteredSelectedRowModel() .rows.map((row) => row.original.pstNo); if (await confirm("삭제하시겠습니까?")) { setRowSelection({}); await Promise.all( selectedPosts.map((pstNo) => PostApi.deletePost(parseInt(bbsId), pstNo, userInfo?.userUnqId), ), ); refetch(); } }; const handleSubmit = (e: React.SubmitEvent) => { e.preventDefault(); setPagination({ ...pagination, pageIndex: 0, }); setSearchParams({ ...searchParams, keywordType, keyword, }); }; const handleReset = () => { setKeywordType("title"); setKeyword(""); setPagination({ ...pagination, pageIndex: 0, }); setSearchParams({ ...searchParams, keywordType: "title", keyword: "", }); }; const handleRowClick = (row: Post) => { router.push(`${pathname}/${row.pstNo}`); }; return (
setKeyword(e.target.value)} className="h-[3.2rem] w-[24rem] rounded-sm !text-[1.3rem]" />

콘텐츠 목록

{pageMenuAuthority?.regAuthrtYn === "Y" && ( )} {bbsInfo?.ansUseYn === "N" && ( )}
{isLoading ? ( ) : ( isGridViewPage ? ( 선택삭제 ) : undefined } /> ) : ( 선택삭제 ) : undefined } /> ) )}
); } export { PostPage };