import { memo, useEffect } from "react"; import { useForm } from "react-hook-form"; import { zodResolver } from "@hookform/resolvers/zod"; import { useQuery } 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 { CodeSelect, UpCodeApi, upCodeFormSchema, type UpCodeFormData, } from "@/entities/code"; import { SiteSelect } from "@/entities/site"; import { ENDPOINT } from "@/shared/config"; import { useAlertStore, useMutationWrapper } from "@/shared/lib"; import { Form, FormField, FormItem, FormControl } from "@/shared/ui/form"; type UpCodeManagementDialogProps = { upCd?: string; children?: React.ReactNode; open?: boolean; onOpenChange?: (open: boolean) => void; }; const UpCodeManagementDialog = memo( ({ upCd, children, open, onOpenChange, ...props }: UpCodeManagementDialogProps) => { const isRegistration = !upCd; const { confirm } = useConfirm(); const alert = useAlertStore((state) => state.setMessage); const { data: detailData } = useQuery({ queryKey: [ENDPOINT.CMS_SERVICE.UP_CODE, upCd], queryFn: () => UpCodeApi.upCodeDetail(upCd!), enabled: open && !!upCd, }); const { mutateAsync: createUpCode } = useMutationWrapper({ mutationFn: (data: UpCodeFormData) => UpCodeApi.createUpCode(data), onSuccess: () => { alert("등록되었습니다.", () => onOpenChange?.(false)); }, }); const { mutateAsync: updateUpCode } = useMutationWrapper({ mutationFn: (data: UpCodeFormData) => UpCodeApi.updateUpCode(upCd!, data), onSuccess: () => { alert("수정되었습니다.", () => onOpenChange?.(false)); }, }); const form = useForm({ resolver: zodResolver(upCodeFormSchema), values: { upCd: detailData?.upCd ?? "", upCdNm: detailData?.upCdNm ?? "", cdSe: detailData?.cdSe ?? "", siteId: detailData?.siteId ?? "", upCdExpln: detailData?.upCdExpln ?? "", useYn: detailData?.useYn ?? "Y", delYn: "N", }, }); const onSubmit = (callback: (data: UpCodeFormData) => void) => async (data: UpCodeFormData) => { const confirmMessage = isRegistration ? "등록하시겠습니까?" : "수정하시겠습니까?"; if (await confirm(confirmMessage)) callback(data); }; useEffect(() => { if (!open) form.reset(); }, [open]); return ( {children} {isRegistration ? "상위코드 등록" : "상위코드 관리"}
상위코드 ( )} /> 상위코드명 ( )} /> 상위코드설명 ( )} /> 코드구분 ( )} /> 사이트 ( )} /> 사용여부 (
)} />
); }, (prevProps, nextProps) => { return ( prevProps.upCd === nextProps.upCd && prevProps.open === nextProps.open ); }, ); UpCodeManagementDialog.displayName = "UpCodeManagementDialog"; export { UpCodeManagementDialog };