AlertDialog

PreviousNext
Docs
react-ariaui

Preview

Loading preview…
components/ui/AlertDialog.tsx
'use client';
import { AlertCircleIcon, InfoIcon } from "lucide-react";
import React, { ReactNode } from "react";
import { chain } from "react-aria";
import { DialogProps, Heading } from "react-aria-components";
import { Button } from '@/registry/react-aria/ui/Button';
import { Dialog } from '@/registry/react-aria/ui/Dialog';

interface AlertDialogProps extends Omit<DialogProps, 'children'> {
  title: string,
  children: ReactNode,
  variant?: 'info' | 'destructive',
  actionLabel: string,
  cancelLabel?: string,
  onAction?: () => void
}

export function AlertDialog({
  title,
  variant,
  cancelLabel,
  actionLabel,
  onAction,
  children,
  ...props
}: AlertDialogProps) {
  return (
    <Dialog role="alertdialog" {...props}>
      {({ close }) => (
        <>
          <Heading
            slot="title"
            className="text-xl font-semibold leading-6 my-0">
            {title}
          </Heading>
          <div className={`w-6 h-6 absolute right-6 top-6 stroke-2 ${variant === 'destructive' ? 'text-red-500' : 'text-blue-500'}`}>
            {variant === 'destructive' ? <AlertCircleIcon aria-hidden /> : <InfoIcon aria-hidden />}
          </div>
          <p className="mt-3 text-neutral-500 dark:text-neutral-400">
            {children}
          </p>
          <div className="mt-6 flex justify-end gap-2">
            <Button
              variant="secondary"
              onPress={close}>
              {cancelLabel || 'Cancel'}
            </Button>
            <Button
              variant={variant === 'destructive' ? 'destructive' : 'primary'}
              autoFocus
              onPress={chain(onAction, close)}>
              {actionLabel}
            </Button>
          </div>
        </>
      )}
    </Dialog>
  );
}

Installation

npx shadcn@latest add @react-aria/tailwind-alertdialog

Usage

import { TailwindAlertdialog } from "@/components/ui/tailwind-alertdialog"
<TailwindAlertdialog />