Add: New Toasts system
This commit is contained in:
@@ -0,0 +1,82 @@
|
||||
import { hashOf } from "$lib/client/hash";
|
||||
import { writable } from "svelte/store";
|
||||
|
||||
/**
|
||||
* @typedef {'error'} ToastType
|
||||
* @typedef {number} ToastID
|
||||
* @typedef {{
|
||||
* type: ToastType,
|
||||
* title: string,
|
||||
* message: string,
|
||||
* dismissCallback?: function(): void,
|
||||
* timeout?: number | null
|
||||
* }} Toast
|
||||
*/
|
||||
|
||||
/**
|
||||
* @type {import("svelte/store").Writable<(Toast & {id: ToastID})[]>}
|
||||
*/
|
||||
const toasts = writable([]);
|
||||
|
||||
export default toasts;
|
||||
|
||||
/**
|
||||
* @param {Toast} toast
|
||||
* @returns {ToastID}
|
||||
*/
|
||||
export function addToastObject(toast) {
|
||||
/** @type {Toast & {id: ToastID}} */
|
||||
const entry = {
|
||||
id: hashOf(Date.now()),
|
||||
...toast,
|
||||
}
|
||||
|
||||
toasts.update((list) => {return [...list, entry];});
|
||||
|
||||
if (entry.timeout) {
|
||||
setTimeout(() => {removeToast(entry.id);}, entry.timeout);
|
||||
}
|
||||
|
||||
return entry.id;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {ToastType} type
|
||||
* @param {string} title
|
||||
* @param {string} message
|
||||
* @param {function(): void} dismissCallback
|
||||
* @param {number | undefined} [timeout=10000]
|
||||
* @returns {ToastID}
|
||||
*/
|
||||
export function addToastCallback(type, title, message, dismissCallback, timeout = 10000) {
|
||||
return addToastObject({
|
||||
type: type,
|
||||
title: title,
|
||||
message: message,
|
||||
dismissCallback: dismissCallback,
|
||||
timeout: timeout,
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {ToastType} type
|
||||
* @param {string} title
|
||||
* @param {string} message
|
||||
* @param {number | undefined | null} [timeout=10000]
|
||||
* @returns {ToastID}
|
||||
*/
|
||||
export function addToast(type, title, message, timeout = 10000) {
|
||||
return addToastObject({
|
||||
type: type,
|
||||
title: title,
|
||||
message: message,
|
||||
timeout: timeout,
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {number} id
|
||||
*/
|
||||
export function removeToast(id) {
|
||||
toasts.update((list) => {return list.filter(x => x.id != id);});
|
||||
}
|
||||
Reference in New Issue
Block a user