budibase/packages/bbui/src/Stores/notifications.js

85 lines
1.8 KiB
JavaScript
Raw Normal View History

import { writable } from "svelte/store"
2021-03-31 11:59:07 +02:00
const NOTIFICATION_TIMEOUT = 3000
export const createNotificationStore = () => {
const timeoutIds = new Set()
const _notifications = writable([], () => {
return () => {
// clear all the timers
2021-05-04 12:32:22 +02:00
timeoutIds.forEach(timeoutId => {
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
const send = (
message,
{
type = "default",
icon = "",
autoDismiss = true,
action = null,
wide = false,
}
) => {
if (block) {
return
}
let _id = id()
2021-05-04 12:32:22 +02:00
_notifications.update(state => {
2022-02-07 16:24:46 +01:00
return [
...state,
{
id: _id,
type,
message,
icon,
dismissable: !autoDismiss,
action,
wide,
},
2022-02-07 16:24:46 +01:00
]
})
2022-02-07 16:24:46 +01:00
if (autoDismiss) {
const timeoutId = setTimeout(() => {
dismissNotification(_id)
}, NOTIFICATION_TIMEOUT)
timeoutIds.add(timeoutId)
}
}
const dismissNotification = id => {
_notifications.update(state => {
return state.filter(n => n.id !== id)
2021-03-31 11:59:07 +02:00
})
}
const { subscribe } = _notifications
2021-03-31 11:59:07 +02:00
return {
subscribe,
send,
info: msg => send(msg, { type: "info", icon: "Info" }),
error: msg =>
send(msg, { type: "error", icon: "Alert", autoDismiss: false }),
warning: msg => send(msg, { type: "warning", icon: "Alert" }),
success: msg => send(msg, { type: "success", icon: "CheckmarkCircle" }),
blockNotifications,
dismiss: dismissNotification,
2021-03-31 11:59:07 +02:00
}
}
function id() {
return "_" + Math.random().toString(36).slice(2, 9)
2021-03-31 11:59:07 +02:00
}
export const notifications = createNotificationStore()