this repo has no description
1export type ToastType = 'success' | 'error' | 'warning' | 'info'
2
3export interface Toast {
4 id: number
5 type: ToastType
6 message: string
7 duration: number
8 dismissing?: boolean
9}
10
11let nextId = 0
12let toasts = $state<Toast[]>([])
13
14export function getToasts(): readonly Toast[] {
15 return toasts
16}
17
18export function showToast(
19 type: ToastType,
20 message: string,
21 duration = 5000
22): number {
23 const id = nextId++
24 toasts = [...toasts, { id, type, message, duration }]
25
26 if (duration > 0) {
27 setTimeout(() => {
28 dismissToast(id)
29 }, duration)
30 }
31
32 return id
33}
34
35export function dismissToast(id: number): void {
36 const toast = toasts.find(t => t.id === id)
37 if (!toast || toast.dismissing) return
38
39 toasts = toasts.map(t => t.id === id ? { ...t, dismissing: true } : t)
40
41 setTimeout(() => {
42 toasts = toasts.filter(t => t.id !== id)
43 }, 150)
44}
45
46export function clearAllToasts(): void {
47 toasts = []
48}
49
50export function success(message: string, duration?: number): number {
51 return showToast('success', message, duration)
52}
53
54export function error(message: string, duration?: number): number {
55 return showToast('error', message, duration)
56}
57
58export function warning(message: string, duration?: number): number {
59 return showToast('warning', message, duration)
60}
61
62export function info(message: string, duration?: number): number {
63 return showToast('info', message, duration)
64}
65
66export const toast = {
67 show: showToast,
68 success,
69 error,
70 warning,
71 info,
72 dismiss: dismissToast,
73 clear: clearAllToasts,
74}