forked from mirrors/pronouns.cc
feat: add toasts
This commit is contained in:
parent
1a7186061a
commit
87e6e2809e
3 changed files with 55 additions and 0 deletions
13
frontend/src/lib/components/Toast.svelte
Normal file
13
frontend/src/lib/components/Toast.svelte
Normal file
|
@ -0,0 +1,13 @@
|
|||
<script lang="ts">
|
||||
import { Toast } from "sveltestrap";
|
||||
|
||||
export let header: string | undefined = undefined;
|
||||
export let body: string;
|
||||
|
||||
let isOpen = true;
|
||||
const toggle = () => (isOpen = !isOpen);
|
||||
</script>
|
||||
|
||||
<Toast {isOpen} {header} body class="m-3" {toggle}>
|
||||
{body}
|
||||
</Toast>
|
35
frontend/src/lib/toast.ts
Normal file
35
frontend/src/lib/toast.ts
Normal file
|
@ -0,0 +1,35 @@
|
|||
import { writable } from "svelte/store";
|
||||
|
||||
export interface ToastData {
|
||||
header?: string;
|
||||
body: string;
|
||||
duration?: number;
|
||||
}
|
||||
|
||||
interface IdToastData extends ToastData {
|
||||
id: number;
|
||||
}
|
||||
|
||||
export const toastStore = writable<IdToastData[]>([]);
|
||||
|
||||
let maxId = 0;
|
||||
|
||||
export const addToast = (data: ToastData) => {
|
||||
const id = maxId++;
|
||||
|
||||
console.log(id);
|
||||
|
||||
toastStore.update((toasts) => (toasts = [...toasts, { ...data, id }]));
|
||||
|
||||
if (data.duration !== -1) {
|
||||
setTimeout(() => {
|
||||
toastStore.update((toasts) => (toasts = toasts.filter((toast) => toast.id !== id)));
|
||||
}, data.duration ?? 5000);
|
||||
}
|
||||
|
||||
return id;
|
||||
};
|
||||
|
||||
export const delToast = (id: number) => {
|
||||
toastStore.update((toasts) => (toasts = toasts.filter((toast) => toast.id !== id)));
|
||||
};
|
|
@ -5,6 +5,8 @@
|
|||
import Navigation from "./nav/Navigation.svelte";
|
||||
import type { LayoutData } from "./$types";
|
||||
import { version } from "$app/environment";
|
||||
import { toastStore } from "$lib/toast";
|
||||
import Toast from "$lib/components/Toast.svelte";
|
||||
|
||||
export let data: LayoutData;
|
||||
|
||||
|
@ -24,6 +26,11 @@
|
|||
<Navigation />
|
||||
<div class="container">
|
||||
<slot />
|
||||
<div class="position-absolute top-0 end-0">
|
||||
{#each $toastStore as toast}
|
||||
<Toast header={toast.header} body={toast.body} />
|
||||
{/each}
|
||||
</div>
|
||||
<footer>
|
||||
<hr />
|
||||
<p>
|
||||
|
|
Loading…
Reference in a new issue