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