import {useMemo, useState} from "react"; import type {BoardDeleteListItem, BoardListItem, BoardSearchParams} from "../../type/board.types.ts"; import {useBoardList} from "../query/useBoardList.ts"; import {ADMIN_BBS_ARTICLE_FORM_ROUTE, ADMIN_BBS_ARTICLE_LIST_ROUTE} from "../../../../route/adminRouteMap.ts"; import {useNavigate} from "react-router-dom"; import {useCheckedList} from "../../../../hook/useCheckedList.ts"; import {toast} from "react-toastify"; import {useDeleteBatchBoard} from "../mutation/useDeleteBatchBoard.ts"; import type { CheckableTableModel, HeaderModel, ListActionsModel, PaginationModel, RowActionsModel, SearchModel, StatusModel, } from "../../../../../type/viewModel.ts"; type BoardListRowActions = { onDetail: (bbsId: string) => void; onArticleList: (bbsId: string) => void; onPreview: (bbsId: string) => void; }; type BoardListPageModel = { header: HeaderModel; status: StatusModel; search: SearchModel; table: CheckableTableModel & RowActionsModel; actions: ListActionsModel; pagination: PaginationModel; }; const initSearchParam: BoardSearchParams = { pageIndex: 1, pageUnit: 10, searchCnd: "0", searchKeyword: "", searchSortCnd: "BBS_NM", searchSortOrd: "ASC" } const searchOptions = [ {value: '0', label: '게시판명/연결메뉴'}, {value: '1', label: '게시판유형'}, ] const pageSizeOptions = [ {value: '10', label: '10건씩'}, {value: '20', label: '20건씩'}, {value: '30', label: '30건씩'}, ] export const useBoardListPage = (): BoardListPageModel => { const [searchParams, setSearchParams] = useState(initSearchParam); const { list, totalItems, totalPages, currentPage, size, isLoading, error } = useBoardList(searchParams); const boardIds = useMemo( () => list.map((item) => item.bbsId), [list] ); const { checkedIds, isAllChecked, isPartiallyChecked, isChecked, handleCheck, handleCheckAll, } = useCheckedList(boardIds); const {mutateAsync: deleteBoardBatch} = useDeleteBatchBoard(); const title = '게시판 관리'; const breadcrumb = [{label: '게시판 관리'}]; const homeUrl = '#'; const successMessage = "게시판을 조회하였습니다."; const navigate = useNavigate(); const handleDetail = (bbsId: string) => { navigate(ADMIN_BBS_ARTICLE_FORM_ROUTE + bbsId); } const handleArticleList = (bbsId: string) => { navigate(ADMIN_BBS_ARTICLE_LIST_ROUTE + bbsId); } const handlePreview = (bbsId: string) => { navigate(`/preview/${bbsId}`); } const handlePageChange = (pageIndex: number) => { setSearchParams((prev) => ({ ...prev, pageIndex, })); } const handleDeleteBatch = async () => { if (checkedIds.length === 0) { toast.warning('미사용 처리할 게시판을 선택해주세요.'); return; } const boardList: BoardDeleteListItem[] = checkedIds.map((bbsId) => ({ bbsId })); await toast.promise( deleteBoardBatch(boardList), { pending: '미사용 처리 중...', success: '미사용 완료', error: '미사용 실패' } ); } const handleCreate = () => { navigate(ADMIN_BBS_ARTICLE_FORM_ROUTE); } return { header: { title, breadcrumb, homeUrl, }, status: { isLoading, error, successMessage, }, search: { totalItems, searchParams, onChange: setSearchParams, searchOptions, pageSizeOptions, }, table: { items: list, params: searchParams, onChange: setSearchParams, pagination: { totalItems, currentPage, totalPages, }, check: { isAllChecked, isPartiallyChecked, isChecked, onCheck: handleCheck, onCheckAll: handleCheckAll, }, rowActions: { onDetail: handleDetail, onArticleList: handleArticleList, onPreview: handlePreview, }, }, actions: { onDelete: handleDeleteBatch, onCreate: handleCreate, }, pagination: { totalItems, totalPages, currentPage, size, onPageChange: handlePageChange, }, } }