import { Dialog, Transition } from '@headlessui/react' import { XMarkIcon } from '@heroicons/react/24/outline' import clsx from 'clsx' import { Fragment, type ReactNode, type SetStateAction, useState } from 'react' import Button from './Button' type HookParameters = { title: string; description?: string; buttonText?: string; variant?: 'danger' | 'confirm'; children?: ReactNode; // Optional because the button submits onConfirm?: () => void | Promise; onOpen?: () => void | Promise; onClose?: () => void | Promise; } type Overrides = Omit type Properties = { readonly isOpen: boolean; readonly setIsOpen: (value: SetStateAction) => void; readonly parameters?: HookParameters; } export type OpenFunction = (overrides?: Overrides) => void export default function useModal(properties?: HookParameters) { const [isOpen, setIsOpen] = useState(false) const [liveProperties, setLiveProperties] = useState(properties) return { Modal: ( ), open: (overrides?: Overrides) => { if (!overrides && !properties) { throw new Error('No properties provided') } setIsOpen(true) if (properties?.onOpen) { void properties.onOpen() } if (overrides) { setLiveProperties(overrides) } }, close: () => { setIsOpen(false) if (properties?.onClose) { void properties.onClose() } } } } function Modal({ parameters, isOpen, setIsOpen }: Properties) { if (!parameters) { return } return ( { setIsOpen(false) }} > ) }