Add notification store timeouts

This commit is contained in:
Mel O'Hagan 2022-07-20 13:54:45 +01:00
parent 6e9ece3cd7
commit cc5920da12
1 changed files with 23 additions and 17 deletions

View File

@ -1,16 +1,17 @@
import { writable, get } from "svelte/store" import { writable, get } from "svelte/store"
import { generate } from "shortid"
import { routeStore } from "./routes" import { routeStore } from "./routes"
const NOTIFICATION_TIMEOUT = 3000 const NOTIFICATION_TIMEOUT = 3000
const createNotificationStore = () => { const createNotificationStore = () => {
let timeout const timeoutIds = new Set()
let block = false let block = false
const store = writable([], () => { const store = writable([], () => {
return () => { return () => {
clearTimeout(timeout) timeoutIds.forEach(timeoutId => {
clearTimeout(timeoutId)
})
store.set([]) store.set([])
} }
}) })
@ -38,27 +39,28 @@ const createNotificationStore = () => {
}) })
return return
} }
const _id = id()
store.update(state => { store.update(state => {
return [...state, return [
{ ...state,
id: generate(), {
type, id: _id,
message, type,
icon, message,
dismissable: !autoDismiss, icon,
delay: get(store) != null, dismissable: !autoDismiss,
} delay: get(store) != null,
]}) }
clearTimeout(timeout) ]})
if (autoDismiss) { if (autoDismiss) {
timeout = setTimeout(() => { const timeoutId = setTimeout(() => {
store.set(null) dismiss(_id)
}, NOTIFICATION_TIMEOUT) }, NOTIFICATION_TIMEOUT)
timeoutIds.add(timeoutId)
} }
} }
const dismiss = id => { const dismiss = id => {
clearTimeout(timeout)
store.update(state => { store.update(state => {
return state.filter(n => n.id !== id) return state.filter(n => n.id !== id)
}) })
@ -76,6 +78,10 @@ const createNotificationStore = () => {
dismiss, dismiss,
}, },
} }
function id() {
return "_" + Math.random().toString(36).slice(2, 9)
}
} }
export const notificationStore = createNotificationStore() export const notificationStore = createNotificationStore()