import { memo } from "react"; import { useForm } from "react-hook-form"; import { zodResolver } from "@hookform/resolvers/zod"; import { useQuery, useQueryClient } from "@tanstack/react-query"; import { useConfirm } from "@frontend-opensource/use-react-hooks"; import { Button, Dialog, DialogClose, DialogContent, DialogFooter, DialogHeader, DialogTitle, Table, TableBody, TableCell, TableHead, TableRow, Input, RadioGroup, RadioGroupItem, Label, DialogTrigger, } from "@common/components"; import { UpCodeApi, LwpoCodeApi, LwpoCodeFormSchema, type LwpoCodeFormData, } from "@/entities/code"; import { ENDPOINT } from "@/shared/config"; import { useAlertStore, useMutationWrapper } from "@/shared/lib"; import { Form, FormField, FormItem, FormControl } from "@/shared/ui/form"; type ManagementLwpoCodeDialogProps = { lwpoCd?: string; upCd?: string; children?: React.ReactNode; open?: boolean; onOpenChange?: (open: boolean) => void; onAfterSave?: () => void; // 콜백 추가 }; const LwpoCodeManagementDialog = memo( ({ lwpoCd, upCd, children, open, onOpenChange, onAfterSave, // 콜백 사용 ...props }: ManagementLwpoCodeDialogProps) => { const isRegistration = !lwpoCd; const { confirm } = useConfirm(); const queryClient = useQueryClient(); const alert = useAlertStore((state) => state.setMessage); const { data: detailData } = useQuery({ queryKey: [ENDPOINT.CMS_SERVICE.LWPO_CODE, upCd, lwpoCd], queryFn: () => LwpoCodeApi.lwpoCodeDetail(upCd!, lwpoCd!), enabled: !!upCd && !isRegistration && open, }); const { data: upCodeData } = useQuery({ queryKey: [ENDPOINT.CMS_SERVICE.UP_CODE, upCd], queryFn: () => UpCodeApi.upCodeDetail(upCd!), enabled: !!upCd, }); const { mutateAsync: createLwpoCode } = useMutationWrapper({ mutationFn: (data: LwpoCodeFormData) => LwpoCodeApi.createLwpoCode(data), onSuccess: () => { alert("등록되었습니다.", () => { onOpenChange?.(false); onAfterSave?.(); }); queryClient.invalidateQueries({ queryKey: [ENDPOINT.CMS_SERVICE.LWPO_CODE, upCd], }); }, }); const { mutateAsync: updateLwpoCode } = useMutationWrapper({ mutationFn: (data: LwpoCodeFormData) => LwpoCodeApi.updateLwpoCode(upCd!, lwpoCd!, data), onSuccess: () => { alert("수정되었습니다.", () => { onOpenChange?.(false); onAfterSave?.(); }); }, }); const form = useForm({ resolver: zodResolver(LwpoCodeFormSchema), values: { lwpoCd: detailData?.lwpoCd ?? "", upCd: upCd ?? "", lwpoCdNm: detailData?.lwpoCdNm ?? "", lwpoCdExpln: detailData?.lwpoCdExpln ?? "", unit: detailData?.unit ?? "", prntLwpoCd: detailData?.prntLwpoCd ?? "", useYn: detailData?.useYn ?? "Y", sortSeq: detailData?.sortSeq ?? 0, delYn: "N", }, }); const handleRegister = async () => { if (!upCd) { alert("상위코드가 없습니다."); return; } const confirmMessage = "등록하시겠습니까?"; if (await confirm(confirmMessage)) { const rawValues = form.getValues(); const values = { ...rawValues, upCd: upCd, sortSeq: Number(rawValues.sortSeq) || 0, }; await createLwpoCode(values); } }; const handleSave = async () => { if (!upCd) { alert("상위코드가 없습니다."); return; } const confirmMessage = "수정하시겠습니까?"; if (await confirm(confirmMessage)) { const rawValues = form.getValues(); const values = { ...rawValues, upCd: upCd, sortSeq: Number(rawValues.sortSeq) || 0, }; await updateLwpoCode(values); } }; return ( {children} {isRegistration ? "하위코드 등록" : "하위코드 관리"}
{ e.preventDefault(); if (isRegistration) { handleRegister(); } else { handleSave(); } }} className="space-y-4" > 하위코드 ( )} /> 하위코드명 ( )} /> 하위코드설명 ( )} /> {upCodeData?.cdSe === "CODECLUNIT" && ( 단위 ( )} /> )} {upCodeData?.cdSe === "CODECLTREE" && ( 상위하위코드 ( )} /> )} 정렬순서 ( { field.onChange(parseInt(e.target.value)); }} className="!text-[1.3rem]" placeholder="정렬순서를 입력해주세요" /> )} /> 사용여부 (
)} />
); }, (prevProps, nextProps) => { return ( prevProps.lwpoCd === nextProps.lwpoCd && prevProps.upCd === nextProps.upCd && prevProps.open === nextProps.open ); }, ); LwpoCodeManagementDialog.displayName = "LwpoCodeManagementDialog"; export { LwpoCodeManagementDialog };