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, FormMode, HeaderModel, StatusModel} from "../../../../../../type/viewModel.ts"; type BoardFormPageModel = { header: HeaderModel; status: StatusModel; form: { form: BoardFormItem; onChange: (event: ChangeEvent) => void; }; actions: FormActionsModel; }; 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: FormMode = bbsId ? 'update' : 'create'; const [formDraft, setFormDraft] = useState>({}); 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) => { 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: '등록 실패' } ); handleList(); }; const handleUpdate = async () => { if (!validateForm()) { return; } await toast.promise( updateBoard(form), { pending: '수정 중...', success: '수정 완료', error: '수정 실패' } ); handleList(); }; const handleDelete = async () => { if (!bbsId || !window.confirm('게시판을 삭제하시겠습니까?')) { return; } await toast.promise( deleteBoard(bbsId), { pending: '삭제 중...', success: '삭제 완료', error: '삭제 실패' } ); handleList(); }; 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, }, }; };