/* Copyright 2026 Marimo. All rights reserved. */ import React, { type PropsWithChildren } from "react"; import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle, } from "../ui/alert-dialog"; import { Button } from "../ui/button"; import { Dialog } from "../ui/dialog"; import { Input } from "../ui/input"; interface ModalContextType { modal: React.ReactNode | null; setModal: (modal: React.ReactNode | null) => void; } const ModalContext = React.createContext({ modal: null, setModal: () => { return; }, }); export const ModalProvider: React.FC> = (props) => { const [modal, setModal] = React.useState(null); return ( {modal} {props.children} ); }; /** * This hook allows you to open and close the modal imperatively. * * @example * ```tsx * const { openModal, closeModal } = useImperativeModal(); * * const handleOpenModal = () => { * openModal(... , ); }, openConfirm: (opts: { title: React.ReactNode; description?: React.ReactNode; confirmAction: React.ReactNode; variant?: "destructive"; }) => { context.setModal( { if (!open) { closeModal(); } }} > {opts.title} {opts.description} Cancel {opts.confirmAction} , ); }, closeModal: closeModal, }; }