Back to components
Overlay

Confirm Dialog

A destructive-action confirmation dialog composed from Dialog, Button, and Badge.

Page preview
Source
This is the component source that shadcn installs into a consuming project.
registry/default/confirm-dialog/confirm-dialog.tsx
import { AlertTriangleIcon } from "lucide-react"

import { Badge } from "@/components/ui/badge"
import { Button } from "@/components/ui/button"
import {
  Dialog,
  DialogClose,
  DialogContent,
  DialogDescription,
  DialogFooter,
  DialogHeader,
  DialogTitle,
  DialogTrigger,
} from "@/components/ui/dialog"

type ConfirmDialogCopy = {
  badge: string
  trigger: string
  title: string
  description: string
  cancel: string
  confirm: string
}

type ConfirmDialogProps = {
  copy?: ConfirmDialogCopy
}

const defaultCopy: ConfirmDialogCopy = {
  badge: "Destructive action",
  trigger: "Delete project",
  title: "Delete this project?",
  description:
    "This action cannot be undone. The project, previews, and generated registry files will be removed from this workspace.",
  cancel: "Cancel",
  confirm: "Delete project",
}

export function ConfirmDialog({ copy = defaultCopy }: ConfirmDialogProps) {
  return (
    <Dialog>
      <DialogTrigger render={<Button variant="destructive" />}>
        <AlertTriangleIcon data-icon="inline-start" />
        {copy.trigger}
      </DialogTrigger>
      <DialogContent>
        <DialogHeader>
          <Badge className="w-fit" variant="outline">
            {copy.badge}
          </Badge>
          <DialogTitle>{copy.title}</DialogTitle>
          <DialogDescription>{copy.description}</DialogDescription>
        </DialogHeader>
        <DialogFooter>
          <DialogClose render={<Button variant="outline" />}>
            {copy.cancel}
          </DialogClose>
          <DialogClose render={<Button variant="destructive" />}>
            {copy.confirm}
          </DialogClose>
        </DialogFooter>
      </DialogContent>
    </Dialog>
  )
}