Add: New Toasts system

This commit is contained in:
2024-05-20 12:19:42 +03:00
parent 9a3295adc4
commit 6a1788292a
6 changed files with 332 additions and 7 deletions
+82
View File
@@ -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);});
}