import { Dialog } from "@kobalte/core/dialog" import { Component, Show, createEffect, createSignal } from "solid-js" import { alertDialogState, dismissAlertDialog } from "../stores/alerts" import type { AlertVariant, AlertDialogState } from "../stores/alerts" const variantAccent: Record = { info: { badgeBg: "var(--badge-neutral-bg)", badgeBorder: "var(--border-base)", badgeText: "var(--accent-primary)", symbol: "i", fallbackTitle: "Heads up", }, warning: { badgeBg: "rgba(255, 152, 0, 0.14)", badgeBorder: "var(--status-warning)", badgeText: "var(--status-warning)", symbol: "!", fallbackTitle: "Please review", }, error: { badgeBg: "var(--danger-soft-bg)", badgeBorder: "var(--status-error)", badgeText: "var(--status-error)", symbol: "!", fallbackTitle: "Something went wrong", }, } function dismiss(confirmed: boolean, payload?: AlertDialogState | null, promptValue?: string) { const current = payload ?? alertDialogState() if (current?.type === "confirm") { if (confirmed) { current.onConfirm?.() } else { current.onCancel?.() } current.resolve?.(confirmed) dismissAlertDialog() return } if (current?.type === "prompt") { if (confirmed) { current.onConfirm?.() current.resolvePrompt?.(promptValue ?? "") } else { current.onCancel?.() current.resolvePrompt?.(null) } dismissAlertDialog() return } if (confirmed) { current?.onConfirm?.() } dismissAlertDialog() } const AlertDialog: Component = () => { let primaryButtonRef: HTMLButtonElement | undefined createEffect(() => { if (alertDialogState()) { queueMicrotask(() => { primaryButtonRef?.focus() }) } }) return ( {(payload) => { const variant = payload.variant ?? "info" const accent = variantAccent[variant] const title = payload.title || accent.fallbackTitle const isConfirm = payload.type === "confirm" const isPrompt = payload.type === "prompt" const confirmLabel = payload.confirmLabel || (isConfirm ? "Confirm" : isPrompt ? "Run" : "OK") const cancelLabel = payload.cancelLabel || "Cancel" const [inputValue, setInputValue] = createSignal(payload.inputDefaultValue ?? "") return ( { if (!open) { dismiss(false, payload) } }} >
{accent.symbol}
{title} {payload.message} {payload.detail &&

{payload.detail}

}
setInputValue(e.currentTarget.value)} onKeyDown={(e) => { if (e.key === "Enter") { e.preventDefault() dismiss(true, payload, inputValue()) } }} />
{(isConfirm || isPrompt) && ( )}
) }}
) } export default AlertDialog