import { useState, useEffect } from 'react'; import { AlertTriangle, Loader2, Trash2 } from 'lucide-react'; import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription, DialogFooter, } from '@/components/ui/dialog'; import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; import { Label } from '@/components/ui/label'; import { toast } from '@/components/ui/toast-store'; import { deleteStackPath } from '@/lib/stackFilesApi'; import type { FileEntry } from '@/lib/stackFilesApi'; interface DeleteFileConfirmProps { open: boolean; onOpenChange: (open: boolean) => void; stackName: string; relPath: string; entry: FileEntry | null; onDeleted: () => void; } export function DeleteFileConfirm({ open, onOpenChange, stackName, relPath, entry, onDeleted, }: DeleteFileConfirmProps) { const [deleting, setDeleting] = useState(false); const [confirmInput, setConfirmInput] = useState(''); const [notEmpty, setNotEmpty] = useState(false); const isProtected = entry?.isProtected ?? false; const entryName = entry?.name ?? ''; useEffect(() => { if (!open) { setConfirmInput(''); setNotEmpty(false); } }, [open]); const handleClose = (next: boolean) => { if (deleting) return; onOpenChange(next); }; const executeDelete = async (recursive: boolean) => { setDeleting(true); try { await deleteStackPath(stackName, relPath, recursive || undefined); onDeleted(); onOpenChange(false); } catch (e: unknown) { const msg = e instanceof Error ? e.message : 'Delete failed.'; if (!recursive && msg.toUpperCase().includes('NOT_EMPTY')) { setNotEmpty(true); } else { toast.error(msg); } } finally { setDeleting(false); } }; const handleDelete = () => void executeDelete(notEmpty); const protectedOk = !isProtected || confirmInput === entryName; const deleteLabel = notEmpty ? 'Delete all' : 'Delete'; return ( Delete {entryName ? `"${entryName}"` : 'item'}? {notEmpty ? ( This folder is not empty. Delete everything inside? ) : ( 'This action cannot be undone.' )} {isProtected && (

This is a critical stack file. Type the filename to confirm.

setConfirmInput(e.target.value)} placeholder={entryName} disabled={deleting} autoFocus />
)}
); }