import { useFetcher } from "@remix-run/react"; import React from "react"; import invariant from "tiny-invariant"; import { useTranslation } from "~/hooks/useTranslation"; import { Button } from "./Button"; import { Dialog } from "./Dialog"; import { SubmitButton } from "./SubmitButton"; export function FormWithConfirm({ fields, children, dialogHeading, deleteButtonText, action, submitButtonTestId = "submit-button", }: { fields?: [name: string, value: string | number][]; children: React.ReactNode; dialogHeading: string; deleteButtonText?: string; action?: string; submitButtonTestId?: string; }) { const fetcher = useFetcher(); const { t } = useTranslation(["common"]); const [dialogOpen, setDialogOpen] = React.useState(false); const formRef = React.useRef(null); const id = React.useId(); const openDialog = () => setDialogOpen(true); const closeDialog = () => setDialogOpen(false); invariant(React.isValidElement(children)); return ( <> {fields?.map(([name, value]) => ( ))}

{dialogHeading}

{deleteButtonText ?? t("common:actions.delete")}
{React.cloneElement(children, { // @ts-expect-error broke with @types/react upgrade. TODO: figure out narrower type than React.ReactNode onClick: openDialog, })} ); }