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/board.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"; export type BoardFormMode = 'create' | 'update'; 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 useBoardForm = (bbsId: string) => { const navigate = useNavigate(); const mode: BoardFormMode = 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: '등록 실패' } ); 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 { mode, title, breadcrumb, form, typeList: data?.typeList, isLoading, error, isPending, handleChange, handleCreate, handleUpdate, handleDelete, handleList, }; };