"use client"; import type { ReactNode, RefObject } from "react"; import { useEffect, useId, useRef, useState } from "react"; import { useFormStatus } from "react-dom"; export function AdminModalForm({ action, children, description, intent = "default", submitLabel, title, triggerClassName, triggerLabel, triggerPressed, }: { action: (formData: FormData) => Promise; children?: ReactNode; description: string; intent?: "default" | "danger"; submitLabel: string; title: string; triggerClassName?: string; triggerLabel: string; triggerPressed?: boolean; }) { const dialogRef = useRef(null); const titleId = useId(); const descriptionId = useId(); const [submitting, setSubmitting] = useState(false); const [dialogGeneration, setDialogGeneration] = useState(0); return ( <> { if (submitting) event.preventDefault(); }} ref={dialogRef} >
setSubmitting(true)}>

Confirm operation

{title}

{description}

{children &&
{children}
}
); } function ModalActions({ dialogRef, intent, onPendingChange, submitLabel, }: { dialogRef: RefObject; intent: "default" | "danger"; onPendingChange: (pending: boolean) => void; submitLabel: string; }) { const { pending } = useFormStatus(); const observedPending = useRef(false); useEffect(() => { if (pending) { observedPending.current = true; onPendingChange(true); } else if (observedPending.current) { observedPending.current = false; onPendingChange(false); } }, [onPendingChange, pending]); return (
{pending ? "Operation in progress." : ""}
); }