53 lines
1.2 KiB
JavaScript
53 lines
1.2 KiB
JavaScript
import { writable, derived } from "svelte/store"
|
|
import { generate } from "shortid"
|
|
|
|
const NOTIFICATION_TIMEOUT = 3000
|
|
|
|
const createNotificationStore = () => {
|
|
const _notifications = writable([])
|
|
let block = false
|
|
|
|
const send = (message, type = "default") => {
|
|
if (block) {
|
|
return
|
|
}
|
|
_notifications.update(state => {
|
|
return [...state, { id: generate(), type, message }]
|
|
})
|
|
}
|
|
|
|
const blockNotifications = (timeout = 1000) => {
|
|
block = true
|
|
setTimeout(() => (block = false), timeout)
|
|
}
|
|
|
|
const notifications = derived(_notifications, ($_notifications, set) => {
|
|
set($_notifications)
|
|
if ($_notifications.length > 0) {
|
|
const timeout = setTimeout(() => {
|
|
_notifications.update(state => {
|
|
state.shift()
|
|
return state
|
|
})
|
|
set($_notifications)
|
|
}, NOTIFICATION_TIMEOUT)
|
|
return () => {
|
|
clearTimeout(timeout)
|
|
}
|
|
}
|
|
})
|
|
const { subscribe } = notifications
|
|
|
|
return {
|
|
subscribe,
|
|
send,
|
|
danger: msg => send(msg, "danger"),
|
|
warning: msg => send(msg, "warning"),
|
|
info: msg => send(msg, "info"),
|
|
success: msg => send(msg, "success"),
|
|
blockNotifications,
|
|
}
|
|
}
|
|
|
|
export const notificationStore = createNotificationStore()
|