"use client" import * as React from "react" import { type Row } from "@tanstack/react-table" import { Loader, Trash } from "lucide-react" import { toast } from "sonner" import { useMediaQuery } from "@/hooks/use-media-query" import { Button } from "@/components/ui/button" import { Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, DialogTrigger, } from "@/components/ui/dialog" import { Drawer, DrawerClose, DrawerContent, DrawerDescription, DrawerFooter, DrawerHeader, DrawerTitle, DrawerTrigger, } from "@/components/ui/drawer" import { deleteComplianceSurveyTemplate, getTemplatesRelatedDataCount } from "../services" import { complianceSurveyTemplates } from "@/db/schema/compliance" interface DeleteComplianceTemplatesDialogProps extends React.ComponentPropsWithoutRef { templates: Row["original"][] showTrigger?: boolean open?: boolean onOpenChange?: (open: boolean) => void } export function DeleteComplianceTemplatesDialog({ templates, showTrigger = true, open: controlledOpen, onOpenChange: controlledOnOpenChange, }: DeleteComplianceTemplatesDialogProps) { const [isDeletePending, startDeleteTransition] = React.useTransition() const [internalOpen, setInternalOpen] = React.useState(false) const [relatedDataCount, setRelatedDataCount] = React.useState<{ totalQuestions: number; totalResponses: number; }>({ totalQuestions: 0, totalResponses: 0 }) const isDesktop = useMediaQuery("(min-width: 640px)") // controlled/uncontrolled 상태 관리 const isControlled = controlledOpen !== undefined const open = isControlled ? controlledOpen : internalOpen const setOpen = isControlled ? controlledOnOpenChange : setInternalOpen // 다이얼로그가 열릴 때 연결된 데이터 개수 조회 React.useEffect(() => { if (open) { const fetchRelatedDataCount = async () => { try { const templateIds = templates.map(template => template.id) const data = await getTemplatesRelatedDataCount(templateIds) setRelatedDataCount({ totalQuestions: data.totalQuestions, totalResponses: data.totalResponses, }) } catch (error) { console.error("Error fetching related data count:", error) } } fetchRelatedDataCount() } }, [open, templates]) function onDelete() { startDeleteTransition(async () => { try { // 각 템플릿을 순차적으로 삭제 for (const template of templates) { try { await deleteComplianceSurveyTemplate(template.id); } catch (error) { toast.error(`템플릿 ${template.name} 삭제 실패: ${error instanceof Error ? error.message : '알 수 없는 오류'}`); return; } } if (setOpen) { setOpen(false); } toast.success("템플릿이 성공적으로 삭제되었습니다."); // 페이지 새로고침으로 데이터 업데이트 window.location.reload(); } catch (error) { console.error("Error during deletion:", error); toast.error("템플릿 삭제 중 오류가 발생했습니다."); } }); } if (isDesktop) { return ( {showTrigger ? ( ) : null} Are you sure you want to delete?
This action cannot be undone.
This will permanently delete{" "} {templates.length} template(s) from the server.

⚠️ Data that will be deleted together ⚠️
• Questions: {relatedDataCount.totalQuestions}
• Responses: {relatedDataCount.totalResponses}
) } return ( {showTrigger ? ( ) : null} Are you sure you want to delete? This action cannot be undone.
This will permanently delete{" "} {templates.length} template(s) from the server.
⚠️ Data that will be deleted together ⚠️
• Questions: {relatedDataCount.totalQuestions}
• Responses: {relatedDataCount.totalResponses}
) }