import {useMemo, useState} from "react"; import {ADMIN_BBS_MASTER_ROUTE} from "../../../../route/adminRouteMap.ts"; import {useCheckedList} from "../../../../hook/useCheckedList.ts"; import type {BoardArticleListItem, BoardArticleSearchParams} from "../../type/board.types.ts"; import {useBoardArticleList} from "../query/useBoardArticleList.ts"; import type { CheckableTableModel, HeaderModel, PaginationModel, SearchModel, StatusModel, } from "../../../../../type/viewModel.ts"; type BoardArticleListPageModel = { header: HeaderModel; status: StatusModel; search: SearchModel; table: CheckableTableModel & { typeCode: string; }; pagination: PaginationModel; }; const initSearchParam: BoardArticleSearchParams = { pageIndex: 1, pageUnit: 10, searchCnd: "0", searchKeyword: "", searchSortCnd: "FRST_REGIST_PNTTM", searchSortOrd: "ASC", bbsId: "" }; const searchOptions = [ {value: '0', label: '제목'}, {value: '1', label: '내용'}, {value: '2', label: '작성자'}, ]; export const useBoardArticleListPage = (bbsId: string): BoardArticleListPageModel => { const [searchDraft, setSearchDraft] = useState(initSearchParam); const searchParams = useMemo( () => ({ ...searchDraft, bbsId, }), [bbsId, searchDraft] ); const { list, extraData, totalItems, currentPage, totalPages, size, isLoading, error } = useBoardArticleList(searchParams); const articleIds = useMemo( () => list.map((item) => item.nttId), [list] ); const { isAllChecked, isPartiallyChecked, isChecked, handleCheck, handleCheckAll, } = useCheckedList(articleIds); const bbsNm = extraData?.boardMaster?.bbsNm ?? ''; const bbsTyCode = extraData?.boardMaster?.bbsTyCode ?? ''; const title = `${bbsNm || '게시글'} 목록`; const breadcrumb = [ {label: '게시판 관리', url: ADMIN_BBS_MASTER_ROUTE}, {label: title} ]; const successMessage = bbsNm ? `${bbsNm} 목록을 불러왔습니다.` : '게시글 목록을 불러왔습니다.'; const handleSearchChange = (params: BoardArticleSearchParams) => { setSearchDraft({ ...params, bbsId: "", }); }; const handlePageChange = (pageIndex: number) => { setSearchDraft((prev) => ({ ...prev, pageIndex, })); }; return { header: { title, breadcrumb, homeUrl: "#", }, status: { isLoading, error, successMessage, }, search: { totalItems, searchParams, onChange: handleSearchChange, searchOptions, }, table: { typeCode: bbsTyCode, items: list, params: searchParams, onChange: handleSearchChange, check: { isAllChecked, isPartiallyChecked, isChecked, onCheck: handleCheck, onCheckAll: handleCheckAll, }, pagination: { totalItems, currentPage, totalPages, }, }, pagination: { totalItems, totalPages, currentPage, size, onPageChange: handlePageChange, }, }; };