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
File name
Commit message
Commit date
import {type ChangeEvent, useMemo, useState} from "react";
import {useNavigate} from "react-router-dom";
import {toast} from "react-toastify";
import {ADMIN_BBS_MASTER_ROUTE} from "../../../../../route/adminRouteMap.ts";
import type {CommonCodeItem} from "../../../../../../type/code.ts";
import type {BoardFormItem} from "../../type/boardMaster.types.ts";
import {useBoardDetail} from "../query/useBoardDetail.ts";
import {useCreateBoard} from "../mutation/useCreateBoard.ts";
import {useDeleteBoard} from "../mutation/useDeleteBoard.ts";
import {useUpdateBoard} from "../mutation/useUpdateBoard.ts";
import type {FormActionsModel, HeaderModel, StatusModel} from "../../../../../../type/viewModel.ts";
export type BoardFormMode = 'create' | 'update';
type BoardFormPageModel = {
header: HeaderModel;
status: StatusModel;
form: {
form: BoardFormItem;
onChange: (event: ChangeEvent<HTMLInputElement | HTMLSelectElement>) => void;
};
actions: FormActionsModel<BoardFormMode>;
};
const initBoardFormData: BoardFormItem = {
bbsId: '',
bbsNm: '',
bbsTyCode: '',
noticeYn: 'Y',
addYn: 'Y',
fileAtchPosblAt: 'Y',
posblAtchFileNumber: '0',
posblAtchFileSize: '0',
viewsYn: 'Y',
useAt: 'Y',
};
const createInitialForm = (
item?: BoardFormItem,
typeList: CommonCodeItem[] = []
) => ({
...initBoardFormData,
bbsTyCode: typeList[0]?.code ?? '',
...item,
});
export const useBoardFormPage = (bbsId: string): BoardFormPageModel => {
const navigate = useNavigate();
const mode: BoardFormMode = bbsId ? 'update' : 'create';
const [formDraft, setFormDraft] = useState<Partial<BoardFormItem>>({});
const {data, isLoading, error} = useBoardDetail(bbsId, {enabled: !!bbsId});
const {mutateAsync: createBoard, isPending: isCreating} = useCreateBoard();
const {mutateAsync: updateBoard, isPending: isUpdating} = useUpdateBoard();
const {mutateAsync: deleteBoard, isPending: isDeleting} = useDeleteBoard();
const isPending = isCreating || isUpdating || isDeleting;
const title = `게시판 ${mode === 'create' ? '생성' : '수정'}`;
const breadcrumb = [
{label: '게시판 관리', url: ADMIN_BBS_MASTER_ROUTE},
{label: title}
];
const baseForm = useMemo(
() => createInitialForm(data?.result, data?.typeList),
[data?.result, data?.typeList]
);
const form = {
...baseForm,
...formDraft,
};
const handleChange = (event: ChangeEvent<HTMLInputElement | HTMLSelectElement>) => {
const {name, value} = event.target;
setFormDraft((prev) => ({
...prev,
[name]: value,
}));
};
const validateForm = () => {
if (!form.bbsNm.trim()) {
toast.warning('게시판명을 입력해주세요.');
return false;
}
if (!form.bbsTyCode) {
toast.warning('게시판유형을 선택해주세요.');
return false;
}
return true;
};
const handleCreate = async () => {
if (!validateForm()) {
return;
}
await toast.promise(
createBoard(form),
{
pending: '등록 중...',
success: '등록 완료',
error: '등록 실패'
}
);
navigate(ADMIN_BBS_MASTER_ROUTE);
};
const handleUpdate = async () => {
if (!validateForm()) {
return;
}
await toast.promise(
updateBoard(form),
{
pending: '수정 중...',
success: '수정 완료',
error: '수정 실패'
}
);
navigate(ADMIN_BBS_MASTER_ROUTE);
};
const handleDelete = async () => {
if (!bbsId || !window.confirm('게시판을 삭제하시겠습니까?')) {
return;
}
await toast.promise(
deleteBoard(bbsId),
{
pending: '삭제 중...',
success: '삭제 완료',
error: '삭제 실패'
}
);
navigate(ADMIN_BBS_MASTER_ROUTE);
};
const handleList = () => {
navigate(ADMIN_BBS_MASTER_ROUTE);
};
return {
header: {
title,
breadcrumb,
homeUrl: "#",
},
status: {
isLoading,
error,
successMessage: '데이터 조회가 완료되었습니다.',
},
form: {
form,
onChange: handleChange,
},
actions: {
mode,
disabled: isPending,
onCreate: handleCreate,
onUpdate: handleUpdate,
onDelete: handleDelete,
onList: handleList,
},
};
};