/* eslint-disable i18next/no-literal-string */ "use client"; import { Accordion, AccordionContent, AccordionItem, AccordionTrigger, } from "@turbostarter/ui-web/accordion"; import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle, } from "@turbostarter/ui-web/alert-dialog"; import { Icons } from "@turbostarter/ui-web/icons"; interface ImpactItem { id: string; displayName: string; } interface CascadeImpact { label: string; count: number; items: ImpactItem[]; hasMore: boolean; } interface DestructiveActionDialogProps { open: boolean; onOpenChange: (open: boolean) => void; title: string; description: string; impacts: CascadeImpact[]; isLoading?: boolean; isExecuting?: boolean; onConfirm: () => void; onCancel: () => void; confirmLabel?: string; } export function DestructiveActionDialog({ open, onOpenChange, title, description, impacts, isLoading = false, isExecuting = false, onConfirm, onCancel, confirmLabel = "Delete", }: DestructiveActionDialogProps) { const hasImpacts = impacts.length > 0; return ( {title} {description} {isLoading ? (
Checking impact...
) : hasImpacts ? (

This will also delete:

{impacts.map((impact) => ( {impact.count} {impact.label}
    {impact.items.map((item) => (
  • • {item.displayName}
  • ))} {impact.hasMore && (
  • +{impact.count - impact.items.length} more...
  • )}
))}
) : null} Cancel {isExecuting ? ( <> Deleting... ) : ( confirmLabel )}
); }