@omit/react-confirm-dialog
Version:
A simple confirm dialog for React
1 lines • 25 kB
Source Map (JSON)
{"version":3,"sources":["../src/confirm-dialog.tsx","../src/components/ui/alert-dialog.tsx","../src/lib/utils.ts","../src/components/ui/button.tsx"],"sourcesContent":["import React, {\n useState,\n useCallback,\n useMemo,\n useContext,\n createContext,\n memo\n} from 'react'\nimport { type ReactNode, type ComponentPropsWithRef } from 'react'\nimport {\n AlertDialog,\n AlertDialogAction,\n AlertDialogCancel,\n AlertDialogContent,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogOverlay,\n AlertDialogPortal,\n AlertDialogTitle,\n AlertDialogMedia\n} from '@/components/ui/alert-dialog'\n\nexport interface CustomActionsProps {\n confirm: () => void\n cancel: () => void\n config: ConfirmOptions\n setConfig: ConfigUpdater\n}\n\nexport type ConfigUpdater = (\n config: ConfirmOptions | ((prev: ConfirmOptions) => ConfirmOptions)\n) => void\n\nexport type LegacyCustomActions = (\n onConfirm: () => void,\n onCancel: () => void\n) => ReactNode\n\nexport type EnhancedCustomActions = (props: CustomActionsProps) => ReactNode\n\nexport interface ConfirmOptions {\n title?: ReactNode\n description?: ReactNode\n contentSlot?: ReactNode\n confirmText?: string\n cancelText?: string\n icon?: ReactNode\n media?: ReactNode\n customActions?: LegacyCustomActions | EnhancedCustomActions\n confirmButton?: ComponentPropsWithRef<typeof AlertDialogAction>\n cancelButton?: ComponentPropsWithRef<typeof AlertDialogCancel> | null\n alertDialogOverlay?: ComponentPropsWithRef<typeof AlertDialogOverlay>\n alertDialogContent?: ComponentPropsWithRef<typeof AlertDialogContent>\n alertDialogHeader?: ComponentPropsWithRef<typeof AlertDialogHeader>\n alertDialogTitle?: ComponentPropsWithRef<typeof AlertDialogTitle>\n alertDialogMedia?: ComponentPropsWithRef<typeof AlertDialogMedia>\n alertDialogDescription?: ComponentPropsWithRef<typeof AlertDialogDescription>\n alertDialogFooter?: ComponentPropsWithRef<typeof AlertDialogFooter>\n}\n\nexport interface ConfirmDialogState {\n isOpen: boolean\n config: ConfirmOptions\n resolver: ((value: boolean) => void) | null\n}\n\nexport interface ConfirmContextValue {\n confirm: ConfirmFunction\n updateConfig: ConfigUpdater\n}\n\nexport interface ConfirmFunction {\n (options: ConfirmOptions): Promise<boolean>\n updateConfig?: ConfigUpdater\n}\n\nexport const ConfirmContext = createContext<ConfirmContextValue | undefined>(\n undefined\n)\n\nconst baseDefaultOptions: ConfirmOptions = {\n title: '',\n description: '',\n confirmText: 'Confirm',\n cancelText: 'Cancel',\n confirmButton: {},\n cancelButton: {},\n alertDialogContent: {},\n alertDialogHeader: {},\n alertDialogTitle: {},\n alertDialogMedia: {},\n alertDialogDescription: {},\n alertDialogFooter: {}\n}\n\nfunction isLegacyCustomActions(\n fn: LegacyCustomActions | EnhancedCustomActions\n): fn is LegacyCustomActions {\n return fn.length === 2\n}\n\nconst ConfirmDialogContent: React.FC<{\n config: ConfirmOptions\n onConfirm: () => void\n onCancel: () => void\n setConfig: (\n config: ConfirmOptions | ((prev: ConfirmOptions) => ConfirmOptions)\n ) => void\n}> = memo(({ config, onConfirm, onCancel, setConfig }) => {\n const {\n title,\n description,\n cancelButton,\n confirmButton,\n confirmText,\n cancelText,\n icon,\n media,\n contentSlot,\n customActions,\n alertDialogOverlay,\n alertDialogContent,\n alertDialogHeader,\n alertDialogTitle,\n alertDialogMedia,\n alertDialogDescription,\n alertDialogFooter\n } = config\n\n const renderActions = () => {\n if (!customActions) {\n return (\n <>\n {cancelButton !== null && (\n <AlertDialogCancel onClick={onCancel} {...cancelButton}>\n {cancelText}\n </AlertDialogCancel>\n )}\n <AlertDialogAction onClick={onConfirm} {...confirmButton}>\n {confirmText}\n </AlertDialogAction>\n </>\n )\n }\n\n if (isLegacyCustomActions(customActions)) {\n return customActions(onConfirm, onCancel)\n }\n\n return customActions({\n confirm: onConfirm,\n cancel: onCancel,\n config,\n setConfig\n })\n }\n\n const renderTitle = () => {\n if (!title && !icon) {\n return null\n }\n\n return (\n <AlertDialogTitle {...alertDialogTitle}>\n {icon}\n {title}\n </AlertDialogTitle>\n )\n }\n\n return (\n <AlertDialogPortal>\n <AlertDialogOverlay {...alertDialogOverlay} />\n <AlertDialogContent {...alertDialogContent}>\n <AlertDialogHeader {...alertDialogHeader}>\n {media && (\n <AlertDialogMedia {...alertDialogMedia}>{media}</AlertDialogMedia>\n )}\n {renderTitle()}\n {description && (\n <AlertDialogDescription {...alertDialogDescription}>\n {description}\n </AlertDialogDescription>\n )}\n {contentSlot}\n </AlertDialogHeader>\n <AlertDialogFooter {...alertDialogFooter}>\n {renderActions()}\n </AlertDialogFooter>\n </AlertDialogContent>\n </AlertDialogPortal>\n )\n})\n\nConfirmDialogContent.displayName = 'ConfirmDialogContent'\n\nconst ConfirmDialog: React.FC<{\n isOpen: boolean\n onOpenChange: (isOpen: boolean) => void\n config: ConfirmOptions\n onConfirm: () => void\n onCancel: () => void\n setConfig: (\n config: ConfirmOptions | ((prev: ConfirmOptions) => ConfirmOptions)\n ) => void\n}> = memo(\n ({ isOpen, onOpenChange, config, onConfirm, onCancel, setConfig }) => (\n <AlertDialog open={isOpen} onOpenChange={onOpenChange}>\n <ConfirmDialogContent\n config={config}\n onConfirm={onConfirm}\n onCancel={onCancel}\n setConfig={setConfig}\n />\n </AlertDialog>\n )\n)\n\nConfirmDialog.displayName = 'ConfirmDialog'\n\nexport const ConfirmDialogProvider: React.FC<{\n defaultOptions?: ConfirmOptions\n children: React.ReactNode\n}> = ({ defaultOptions = {}, children }) => {\n const [dialogState, setDialogState] = useState<ConfirmDialogState>({\n isOpen: false,\n config: baseDefaultOptions,\n resolver: null\n })\n\n const mergedDefaultOptions = useMemo(\n () => ({\n ...baseDefaultOptions,\n ...defaultOptions\n }),\n [defaultOptions]\n )\n\n const updateConfig = useCallback(\n (\n newConfig: ConfirmOptions | ((prev: ConfirmOptions) => ConfirmOptions)\n ) => {\n setDialogState((prev) => ({\n ...prev,\n config:\n typeof newConfig === 'function'\n ? newConfig(prev.config)\n : { ...prev.config, ...newConfig }\n }))\n },\n []\n )\n\n const confirm = useCallback(\n (options: ConfirmOptions) => {\n setDialogState((prev) => ({\n isOpen: true,\n config: { ...mergedDefaultOptions, ...options },\n resolver: prev.resolver\n }))\n return new Promise<boolean>((resolve) => {\n setDialogState((prev) => ({\n ...prev,\n resolver: resolve\n }))\n })\n },\n [mergedDefaultOptions]\n )\n\n const handleConfirm = useCallback(() => {\n setDialogState((prev) => {\n if (prev.resolver) {\n prev.resolver(true)\n }\n return {\n ...prev,\n isOpen: false,\n resolver: null\n }\n })\n }, [])\n\n const handleCancel = useCallback(() => {\n setDialogState((prev) => {\n if (prev.resolver) {\n prev.resolver(false)\n }\n return {\n ...prev,\n isOpen: false,\n resolver: null\n }\n })\n }, [])\n\n const handleOpenChange = useCallback(\n (open: boolean) => {\n if (!open) {\n handleCancel()\n }\n },\n [handleCancel]\n )\n\n const contextValue = useMemo(\n () => ({\n confirm,\n updateConfig\n }),\n [confirm, updateConfig]\n )\n\n return (\n <ConfirmContext.Provider value={contextValue}>\n {children}\n <ConfirmDialog\n isOpen={dialogState.isOpen}\n onOpenChange={handleOpenChange}\n config={dialogState.config}\n onConfirm={handleConfirm}\n onCancel={handleCancel}\n setConfig={updateConfig}\n />\n </ConfirmContext.Provider>\n )\n}\n\nexport const useConfirm = () => {\n const context = useContext(ConfirmContext)\n if (!context) {\n throw new Error('useConfirm must be used within a ConfirmDialogProvider')\n }\n\n const { confirm, updateConfig } = context\n\n const enhancedConfirm = confirm\n enhancedConfirm.updateConfig = updateConfig\n\n return enhancedConfirm as ConfirmFunction & {\n updateConfig: ConfirmContextValue['updateConfig']\n }\n}\n","'use client'\n\nimport * as React from 'react'\nimport * as AlertDialogPrimitive from '@radix-ui/react-alert-dialog'\nimport { cn } from '@/lib/utils'\nimport { Button } from '@/components/ui/button'\n\nfunction AlertDialog({\n ...props\n}: React.ComponentProps<typeof AlertDialogPrimitive.Root>) {\n return <AlertDialogPrimitive.Root data-slot=\"alert-dialog\" {...props} />\n}\n\nfunction AlertDialogTrigger({\n ...props\n}: React.ComponentProps<typeof AlertDialogPrimitive.Trigger>) {\n return (\n <AlertDialogPrimitive.Trigger data-slot=\"alert-dialog-trigger\" {...props} />\n )\n}\n\nfunction AlertDialogPortal({\n ...props\n}: React.ComponentProps<typeof AlertDialogPrimitive.Portal>) {\n return (\n <AlertDialogPrimitive.Portal data-slot=\"alert-dialog-portal\" {...props} />\n )\n}\n\nfunction AlertDialogOverlay({\n className,\n ...props\n}: React.ComponentProps<typeof AlertDialogPrimitive.Overlay>) {\n return (\n <AlertDialogPrimitive.Overlay\n data-slot=\"alert-dialog-overlay\"\n className={cn(\n 'data-[state=open]:animate-fade-in data-[state=closed]:animate-fade-out bg-black/10 supports-backdrop-filter:backdrop-blur-xs fixed inset-0 z-50',\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AlertDialogContent({\n className,\n size = 'default',\n ...props\n}: React.ComponentProps<typeof AlertDialogPrimitive.Content> & {\n size?: 'default' | 'sm'\n}) {\n return (\n <AlertDialogPrimitive.Content\n data-slot=\"alert-dialog-content\"\n data-size={size}\n className={cn(\n 'data-[state=open]:animate-scale-in data-[state=closed]:animate-scale-out bg-background ring-foreground/10 gap-4 rounded-xl p-4 ring-1 data-[size=default]:max-w-xs data-[size=sm]:max-w-xs data-[size=default]:sm:max-w-sm group/alert-dialog-content fixed top-1/2 left-1/2 z-50 grid w-full -translate-x-1/2 -translate-y-1/2 outline-none',\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AlertDialogHeader({\n className,\n ...props\n}: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"alert-dialog-header\"\n className={cn(\n 'grid grid-rows-[auto_1fr] place-items-center gap-1.5 text-center has-data-[slot=alert-dialog-media]:grid-rows-[auto_auto_1fr] has-data-[slot=alert-dialog-media]:gap-x-4 sm:group-data-[size=default]/alert-dialog-content:place-items-start sm:group-data-[size=default]/alert-dialog-content:text-left sm:group-data-[size=default]/alert-dialog-content:has-data-[slot=alert-dialog-media]:grid-rows-[auto_1fr]',\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AlertDialogFooter({\n className,\n ...props\n}: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"alert-dialog-footer\"\n className={cn(\n 'bg-muted/50 -mx-4 -mb-4 rounded-b-xl border-t p-4 flex flex-col-reverse gap-2 group-data-[size=sm]/alert-dialog-content:grid group-data-[size=sm]/alert-dialog-content:grid-cols-2 sm:flex-row sm:justify-end',\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AlertDialogMedia({\n className,\n ...props\n}: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"alert-dialog-media\"\n className={cn(\n \"bg-muted mb-2 inline-flex size-10 items-center justify-center rounded-md sm:group-data-[size=default]/alert-dialog-content:row-span-2 *:[svg:not([class*='size-'])]:size-6\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AlertDialogTitle({\n className,\n ...props\n}: React.ComponentProps<typeof AlertDialogPrimitive.Title>) {\n return (\n <AlertDialogPrimitive.Title\n data-slot=\"alert-dialog-title\"\n className={cn(\n 'text-base font-medium sm:group-data-[size=default]/alert-dialog-content:group-has-data-[slot=alert-dialog-media]/alert-dialog-content:col-start-2',\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AlertDialogDescription({\n className,\n ...props\n}: React.ComponentProps<typeof AlertDialogPrimitive.Description>) {\n return (\n <AlertDialogPrimitive.Description\n data-slot=\"alert-dialog-description\"\n className={cn(\n 'text-muted-foreground *:[a]:hover:text-foreground text-sm text-balance md:text-pretty *:[a]:underline *:[a]:underline-offset-3',\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AlertDialogAction({\n className,\n variant = 'default',\n size = 'default',\n ...props\n}: React.ComponentProps<typeof AlertDialogPrimitive.Action> &\n Pick<React.ComponentProps<typeof Button>, 'variant' | 'size'>) {\n return (\n <Button variant={variant} size={size} asChild>\n <AlertDialogPrimitive.Action\n data-slot=\"alert-dialog-action\"\n className={cn(className)}\n {...props}\n />\n </Button>\n )\n}\n\nfunction AlertDialogCancel({\n className,\n variant = 'outline',\n size = 'default',\n ...props\n}: React.ComponentProps<typeof AlertDialogPrimitive.Cancel> &\n Pick<React.ComponentProps<typeof Button>, 'variant' | 'size'>) {\n return (\n <Button variant={variant} size={size} asChild>\n <AlertDialogPrimitive.Cancel\n data-slot=\"alert-dialog-cancel\"\n className={cn(className)}\n {...props}\n />\n </Button>\n )\n}\n\nexport {\n AlertDialog,\n AlertDialogAction,\n AlertDialogCancel,\n AlertDialogContent,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogMedia,\n AlertDialogOverlay,\n AlertDialogPortal,\n AlertDialogTitle,\n AlertDialogTrigger\n}\n","import { type ClassValue, clsx } from 'clsx'\nimport { twMerge } from 'tailwind-merge'\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n","import * as React from 'react'\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { Slot } from '@radix-ui/react-slot'\n\nimport { cn } from '@/lib/utils'\n\nconst buttonVariants = cva(\n \"focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:aria-invalid:border-destructive/50 rounded-lg border border-transparent bg-clip-padding text-sm font-medium focus-visible:ring-3 aria-invalid:ring-3 [&_svg:not([class*='size-'])]:size-4 inline-flex items-center justify-center whitespace-nowrap transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none shrink-0 [&_svg]:shrink-0 outline-none group/button select-none\",\n {\n variants: {\n variant: {\n default: 'bg-primary text-primary-foreground [a]:hover:bg-primary/80',\n outline:\n 'border-border bg-background hover:bg-muted hover:text-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50 aria-expanded:bg-muted aria-expanded:text-foreground',\n secondary:\n 'bg-secondary text-secondary-foreground hover:bg-secondary/80 aria-expanded:bg-secondary aria-expanded:text-secondary-foreground',\n ghost:\n 'hover:bg-muted hover:text-foreground dark:hover:bg-muted/50 aria-expanded:bg-muted aria-expanded:text-foreground',\n destructive:\n 'bg-destructive/10 hover:bg-destructive/20 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/20 text-destructive focus-visible:border-destructive/40 dark:hover:bg-destructive/30',\n link: 'text-primary underline-offset-4 hover:underline'\n },\n size: {\n default:\n 'h-8 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2',\n xs: \"h-6 gap-1 rounded-[min(var(--radius-md),10px)] px-2 text-xs in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3\",\n sm: \"h-7 gap-1 rounded-[min(var(--radius-md),12px)] px-2.5 text-[0.8rem] in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3.5\",\n lg: 'h-9 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-3 has-data-[icon=inline-start]:pl-3',\n icon: 'size-8',\n 'icon-xs':\n \"size-6 rounded-[min(var(--radius-md),10px)] in-data-[slot=button-group]:rounded-lg [&_svg:not([class*='size-'])]:size-3\",\n 'icon-sm':\n 'size-7 rounded-[min(var(--radius-md),12px)] in-data-[slot=button-group]:rounded-lg',\n 'icon-lg': 'size-9'\n }\n },\n defaultVariants: {\n variant: 'default',\n size: 'default'\n }\n }\n)\n\nfunction Button({\n className,\n variant = 'default',\n size = 'default',\n asChild = false,\n ...props\n}: React.ComponentProps<'button'> &\n VariantProps<typeof buttonVariants> & {\n asChild?: boolean\n }) {\n const Comp = asChild ? Slot : 'button'\n\n return (\n <Comp\n data-slot=\"button\"\n data-variant={variant}\n data-size={size}\n className={cn(buttonVariants({ variant, size, className }))}\n {...props}\n />\n )\n}\n\nexport { Button, buttonVariants }\n"],"mappings":"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","names":["useState","useCallback","useMemo","useContext","createContext","memo","AlertDialogPrimitive","clsx","twMerge","cn","inputs","cva","Slot","jsx","buttonVariants","cva","Button","className","variant","size","asChild","props","Slot","cn","jsx","AlertDialog","props","AlertDialogPortal","props","jsx","AlertDialogOverlay","className","cn","AlertDialogContent","size","AlertDialogHeader","AlertDialogFooter","AlertDialogMedia","AlertDialogTitle","AlertDialogDescription","AlertDialogAction","variant","Button","AlertDialogCancel","Fragment","jsx","jsxs","ConfirmContext","createContext","baseDefaultOptions","isLegacyCustomActions","fn","ConfirmDialogContent","memo","config","onConfirm","onCancel","setConfig","title","description","cancelButton","confirmButton","confirmText","cancelText","icon","media","contentSlot","customActions","alertDialogOverlay","alertDialogContent","alertDialogHeader","alertDialogTitle","alertDialogMedia","alertDialogDescription","alertDialogFooter","renderActions","AlertDialogCancel","AlertDialogAction","renderTitle","AlertDialogTitle","AlertDialogPortal","AlertDialogOverlay","AlertDialogContent","AlertDialogHeader","AlertDialogMedia","AlertDialogDescription","AlertDialogFooter","ConfirmDialog","isOpen","onOpenChange","AlertDialog","ConfirmDialogProvider","defaultOptions","children","dialogState","setDialogState","useState","mergedDefaultOptions","useMemo","updateConfig","useCallback","newConfig","prev","confirm","options","resolve","handleConfirm","handleCancel","handleOpenChange","open","contextValue","useConfirm","context","useContext","enhancedConfirm"]}