import { createContext, useContext } from 'react' import type { ReactNode } from 'react' type DialogueVariant = 'default' | 'danger' type ConfirmOptions = { title: string description?: ReactNode confirmText?: string cancelText?: string variant?: DialogueVariant } type AlertOptions = { title: string description?: ReactNode okText?: string } type Choice = { value: T label: string variant?: DialogueVariant } type ChoiceOptions = { title: string description?: ReactNode choices: Choice[] cancelText?: string } type DialogueFormAction = { label: string variant?: DialogueVariant disabled?: boolean onSelect: () => Promise | boolean | void } type DialogueFormControls = { close: () => void setActions: (actions: DialogueFormAction[]) => void confirm: (options: ConfirmOptions) => Promise } type DialogueFormOptions = { title: string description?: ReactNode body: (controls: DialogueFormControls) => ReactNode cancelText?: string size?: 'default' | 'large' } type DialogueAPI = { confirm: (options: ConfirmOptions) => Promise alert: (options: AlertOptions) => Promise choice: (options: ChoiceOptions) => Promise form: (options: DialogueFormOptions) => Promise } const DialogueContext = createContext (null) const useDialogue = () => { const dialogue = useContext (DialogueContext) if (dialogue == null) throw new Error ('useDialogue must be used inside DialogueProvider') return dialogue } export { DialogueContext, useDialogue } export default useDialogue export type { AlertOptions, Choice, ChoiceOptions, ConfirmOptions, DialogueAPI, DialogueFormAction, DialogueFormControls, DialogueFormOptions, DialogueVariant }