"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 { deleteDocumentClassCodeGroup, getDocumentClassOptionsCount } from "@/lib/docu-list-rule/document-class/service" import { documentClasses } from "@/db/schema/docu-list-rule" interface DeleteDocumentClassDialogProps extends React.ComponentPropsWithoutRef { documentClasses: Row["original"][] showTrigger?: boolean onSuccess?: () => void } export function DeleteDocumentClassDialog({ documentClasses, showTrigger = true, onSuccess, ...props }: DeleteDocumentClassDialogProps) { const [isDeletePending, startDeleteTransition] = React.useTransition() const [optionsCounts, setOptionsCounts] = React.useState>({}) const [isLoadingOptions, setIsLoadingOptions] = React.useState(false) const isDesktop = useMediaQuery("(min-width: 640px)") // Document Class들의 옵션 개수 조회 React.useEffect(() => { const fetchOptionsCounts = async () => { setIsLoadingOptions(true) const counts: Record = {} for (const docClass of documentClasses) { const result = await getDocumentClassOptionsCount(docClass.id) if (result.success) { counts[docClass.id] = result.count } } setOptionsCounts(counts) setIsLoadingOptions(false) } if (documentClasses.length > 0) { fetchOptionsCounts() } }, [documentClasses]) function onDelete() { startDeleteTransition(async () => { try { // 각 Document Class를 순차적으로 삭제 for (const documentClass of documentClasses) { const result = await deleteDocumentClassCodeGroup(documentClass.id) if (!result.success) { toast.error(`Document Class ${documentClass.value} 삭제 실패: ${result.error}`) return } } props.onOpenChange?.(false) toast.success("Document Class가 성공적으로 삭제되었습니다.") onSuccess?.() } catch (error) { console.error("Delete error:", error) toast.error("Document Class 삭제 중 오류가 발생했습니다.") } }) } if (isDesktop) { return ( {showTrigger ? ( ) : null} 정말로 삭제하시겠습니까? 이 작업은 되돌릴 수 없습니다. 선택된{" "} {documentClasses.length} 개의 Document Class를 서버에서 영구적으로 삭제합니다. {isLoadingOptions ? (
옵션 정보를 확인하는 중...
) : ( documentClasses.some(docClass => optionsCounts[docClass.id] > 0) && (
⚠️ 다음 Document Class들은 옵션을 가지고 있어 함께 삭제됩니다:
    {documentClasses .filter(docClass => optionsCounts[docClass.id] > 0) .map(docClass => (
  • {docClass.value} ({optionsCounts[docClass.id]}개 옵션)
  • ))}
) )}
) } return ( {showTrigger ? ( ) : null} 정말로 삭제하시겠습니까? 이 작업은 되돌릴 수 없습니다. 선택된{" "} {documentClasses.length} 개의 Document Class를 서버에서 영구적으로 삭제합니다. {isLoadingOptions ? (
옵션 정보를 확인하는 중...
) : ( documentClasses.some(docClass => optionsCounts[docClass.id] > 0) && (
⚠️ 다음 Document Class들은 옵션을 가지고 있어 함께 삭제됩니다:
    {documentClasses .filter(docClass => optionsCounts[docClass.id] > 0) .map(docClass => (
  • {docClass.value} ({optionsCounts[docClass.id]}개 옵션)
  • ))}
) )}
) }