File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
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<BoardSearchParams>;
table: CheckableTableModel<BoardListItem, BoardSearchParams> & RowActionsModel<BoardListRowActions>;
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<string>(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,
},
}
}