import { writable } from "svelte/store" const NOTIFICATION_TIMEOUT = 3000 export const createNotificationStore = () => { const timeoutIds = new Set() const _notifications = writable([], () => { return () => { // clear all the timers timeoutIds.forEach((timeoutId) => { clearTimeout(timeoutId) }) _notifications.set([]) } }) let block = false const blockNotifications = (timeout = 1000) => { block = true setTimeout(() => (block = false), timeout) } const send = (message, type = "default", icon = "") => { if (block) { return } let _id = id() _notifications.update((state) => { return [...state, { id: _id, type, message, icon }] }) const timeoutId = setTimeout(() => { _notifications.update((state) => { return state.filter(({ id }) => id !== _id) }) }, NOTIFICATION_TIMEOUT) timeoutIds.add(timeoutId) } const { subscribe } = _notifications return { subscribe, send, info: (msg) => send(msg, "info", "Info"), error: (msg) => send(msg, "error", "Alert"), warning: (msg) => send(msg, "warning", "Alert"), success: (msg) => send(msg, "success", "CheckmarkCircle"), blockNotifications, } } function id() { return "_" + Math.random().toString(36).substr(2, 9) } export const notifications = createNotificationStore()