"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 { Item } from "@/db/schema/items" import { removeShipbuildingItems, removeOffshoreTopItems, removeOffshoreHullItems } from "../service" export type ItemType = 'shipbuilding' | 'offshoreTop' | 'offshoreHull'; interface DeleteItemsDialogProps extends React.ComponentPropsWithoutRef { items: Row["original"][] showTrigger?: boolean onSuccess?: () => void itemType: ItemType } export function DeleteItemsDialog({ items, showTrigger = true, onSuccess, itemType, ...props }: DeleteItemsDialogProps) { const [isDeletePending, startDeleteTransition] = React.useTransition() const isDesktop = useMediaQuery("(min-width: 640px)") const getItemTypeLabel = () => { switch (itemType) { case 'shipbuilding': return '조선 아이템'; case 'offshoreTop': return '해양 TOP 아이템'; case 'offshoreHull': return '해양 HULL 아이템'; default: return '아이템'; } } async function onDelete() { try { startDeleteTransition(async () => { let result; switch (itemType) { case 'shipbuilding': result = await removeShipbuildingItems({ ids: items.map((item) => item.id), }); break; case 'offshoreTop': result = await removeOffshoreTopItems({ ids: items.map((item) => item.id), }); break; case 'offshoreHull': result = await removeOffshoreHullItems({ ids: items.map((item) => item.id), }); break; default: toast.error("지원하지 않는 아이템 타입입니다"); return; } if (result.error) { toast.error(result.error) return } props.onOpenChange?.(false) toast.success("아이템 삭제 완료") onSuccess?.() }) } catch (error) { toast.error("오류가 발생했습니다.") console.error(error) } } if (isDesktop) { return ( {showTrigger ? ( ) : null} 정말로 삭제하시겠습니까? 이 작업은 되돌릴 수 없습니다. 선택한{" "} {items.length} 개의 {getItemTypeLabel()}이(가) 영구적으로 삭제됩니다. ) } return ( {showTrigger ? ( ) : null} 정말로 삭제하시겠습니까? 이 작업은 되돌릴 수 없습니다. 선택한{" "} {items.length} 개의 {getItemTypeLabel()}이(가) 영구적으로 삭제됩니다. ) }