import type { Torrent } from '../shared'; import { useEffect, useState } from 'react'; import { TriangleAlert } from 'lucide-react'; import { Button } from '@/components/ui/button'; import { Checkbox } from '@/components/ui/checkbox'; import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, } from '@/components/ui/dialog'; import { formatSize } from '../format'; import { useTorrentMutations } from '../useTransmissionData'; // Removing a torrent and deleting its data are one RPC apart and a very long way apart in consequence, so // they are one dialog with an explicit opt-in rather than two menu items you can mis-click between. type RemoveTorrentDialogProps = { open: boolean; onOpenChange: (open: boolean) => void; targets: Torrent[]; onRemoved?: () => void; }; export const RemoveTorrentDialog = ({ open, onOpenChange, targets, onRemoved }: RemoveTorrentDialogProps) => { const { remove } = useTorrentMutations(); const [deleteData, setDeleteData] = useState(false); // Re-arm on every open: "also delete the files" must never be inherited from the last time. useEffect(() => { if (open) setDeleteData(false); }, [open]); const bytes = targets.reduce((sum, t) => sum + (t.totalSize ?? 0), 0); const one = targets.length === 1 ? targets[0] : null; const confirm = async () => { await remove.mutateAsync({ ids: targets.map((t) => t.id), deleteLocalData: deleteData }); onOpenChange(false); onRemoved?.(); }; return ( Remove {one ? 'torrent' : `${targets.length} torrents`}? {one ? one.name : `${targets.length} torrents totalling ${formatSize(bytes)}.`} {deleteData && (
Transmission deletes the data immediately — there is no trash.
)}
); };