import { Toast as Kobalte, toaster } from "@kobalte/core/toast" import type { ToastRootProps, ToastCloseButtonProps, ToastTitleProps, ToastDescriptionProps } from "@kobalte/core/toast" import type { ComponentProps, JSX } from "solid-js" import { Show } from "solid-js" import { Portal } from "solid-js/web" import { Icon, type IconProps } from "./icon" import { IconButton } from "./icon-button" export interface ToastRegionProps extends ComponentProps {} function ToastRegion(props: ToastRegionProps) { return ( ) } export interface ToastRootComponentProps extends ToastRootProps { class?: string classList?: ComponentProps<"li">["classList"] children?: JSX.Element } function ToastRoot(props: ToastRootComponentProps) { return ( ) } function ToastIcon(props: { name: IconProps["name"] }) { return (
) } function ToastContent(props: ComponentProps<"div">) { return
} function ToastTitle(props: ToastTitleProps & ComponentProps<"div">) { return } function ToastDescription(props: ToastDescriptionProps & ComponentProps<"div">) { return } function ToastCloseButton(props: ToastCloseButtonProps & ComponentProps<"button">) { return } function ToastProgressTrack(props: ComponentProps) { return } function ToastProgressFill(props: ComponentProps) { return } export const Toast = Object.assign(ToastRoot, { Region: ToastRegion, Icon: ToastIcon, Content: ToastContent, Title: ToastTitle, Description: ToastDescription, CloseButton: ToastCloseButton, ProgressTrack: ToastProgressTrack, ProgressFill: ToastProgressFill, }) export { toaster } export type ToastVariant = "default" | "success" | "error" | "loading" export interface ToastOptions { title?: string description?: string icon?: IconProps["name"] variant?: ToastVariant duration?: number } export function showToast(options: ToastOptions | string) { const opts = typeof options === "string" ? { description: options } : options return toaster.show((props) => (
{opts.title} {opts.description}
)) } export interface ToastPromiseOptions { loading?: JSX.Element success?: (data: T) => JSX.Element error?: (error: U) => JSX.Element } export function showPromiseToast( promise: Promise | (() => Promise), options: ToastPromiseOptions, ) { return toaster.promise(promise, (props) => ( {props.state === "pending" && options.loading} {props.state === "fulfilled" && options.success?.(props.data!)} {props.state === "rejected" && options.error?.(props.error)} )) }