'use client' import * as React from 'react' import type { AdminMedia } from '@admin/types' import { deleteMedia } from '@admin/actions/media' import { Button } from '@admin/components/ui/button' import { Drawer, DrawerContent, DrawerDescription, DrawerTitle, DrawerTrigger } from '@admin/components/ui/drawer' import { Spinner } from '@admin/components/ui/spinner' import { Trash2, TriangleAlert } from 'lucide-react' import { toast } from 'sonner' interface MediaDeleteDrawerProps { media: AdminMedia container?: HTMLElement | null disabled?: boolean deletePending?: boolean startDeleteTransition?: React.TransitionStartFunction onDeleted: () => void } export function MediaDeleteDrawer({ media, container, disabled = false, deletePending, startDeleteTransition, onDeleted }: MediaDeleteDrawerProps) { const [open, setOpen] = React.useState(false) const [internalPending, startInternalDeleteTransition] = React.useTransition() const [contentHeight, setContentHeight] = React.useState(null) const contentRef = React.useRef(null) const isPending = deletePending ?? internalPending const runDeleteTransition = startDeleteTransition ?? startInternalDeleteTransition React.useEffect(() => { if (!open) { return } const measuredNode = contentRef.current if (!measuredNode) { return } const observedNode: HTMLDivElement = measuredNode function updateHeight() { setContentHeight(observedNode.getBoundingClientRect().height) } updateHeight() const observer = new ResizeObserver(updateHeight) observer.observe(observedNode) return () => observer.disconnect() }, [open]) function handleDelete() { if (isPending) { return } runDeleteTransition(async () => { try { const result = await deleteMedia(media.id) if (result.success) { toast.success('Media deleted') setOpen(false) onDeleted() return } toast.error(result.error ?? 'Failed to delete this media') } catch (error) { console.error(error) toast.error('Failed to delete this media. Try again.') } }) } function handleOpenChange(nextOpen: boolean) { if (isPending && !nextOpen) { return } setOpen(nextOpen) } return ( } > Delete media
) }