import { useCallback, useEffect, useState } from "react"; import { createPortal } from "react-dom"; import { toast } from "sonner"; import { Button } from "@/components/ui/button"; import { softDeleteParticle } from "@/lib/firestore-particles"; import { particlePath, toFirestoreDocPath } from "@/lib/particle-path"; import type { Particle } from "@/api/types"; interface DeleteParticleOverlayProps { networkId: string; streamId: string; particle: Particle; userId: string; onClose: () => void; } export function DeleteParticleOverlay({ networkId, streamId, particle, userId, onClose, }: DeleteParticleOverlayProps) { const [deleting, setDeleting] = useState(false); const handleDelete = useCallback(async () => { if (deleting) return; setDeleting(true); try { const docPath = toFirestoreDocPath( particlePath(networkId, [streamId, particle.id]), ); await softDeleteParticle(docPath, userId); toast.success("Particle deleted"); onClose(); } catch (e) { const message = e instanceof Error ? e.message : "Failed to delete particle"; toast.error(message); setDeleting(false); } }, [deleting, networkId, onClose, particle.id, streamId, userId]); useEffect(() => { const handler = (e: KeyboardEvent) => { if (e.key === "Escape") { e.preventDefault(); e.stopPropagation(); onClose(); } }; window.addEventListener("keydown", handler, { capture: true }); return () => window.removeEventListener("keydown", handler, { capture: true }); }, [onClose]); return createPortal(

Delete this particle?

Esc {" "} to close

This cannot be undone. Other viewers will see a "This particle was deleted" message in its place.

, document.body, ); }