From acd85f6373dbf0edbc2cce5c9256464e5986abf0 Mon Sep 17 00:00:00 2001 From: Mel Date: Mon, 21 Feb 2022 01:56:43 +0100 Subject: Add toasts --- assets/src/components/RequestPage.svelte | 3 +- assets/src/components/SharePage.svelte | 3 +- assets/src/components/Toasts.svelte | 77 ++++++++++++++++++++++++ assets/src/components/icons/FlashIcon.svelte | 13 ++++ assets/src/components/icons/LightbulbIcon.svelte | 16 +++++ assets/src/state/toast.ts | 42 +++++++++++++ assets/src/utils/generateId.ts | 10 +++ 7 files changed, 162 insertions(+), 2 deletions(-) create mode 100644 assets/src/components/Toasts.svelte create mode 100644 assets/src/components/icons/FlashIcon.svelte create mode 100644 assets/src/components/icons/LightbulbIcon.svelte create mode 100644 assets/src/state/toast.ts create mode 100644 assets/src/utils/generateId.ts (limited to 'assets') diff --git a/assets/src/components/RequestPage.svelte b/assets/src/components/RequestPage.svelte index 1297891..69981b4 100644 --- a/assets/src/components/RequestPage.svelte +++ b/assets/src/components/RequestPage.svelte @@ -1,10 +1,11 @@
- +
diff --git a/assets/src/components/SharePage.svelte b/assets/src/components/SharePage.svelte index 826f70e..9c40c67 100644 --- a/assets/src/components/SharePage.svelte +++ b/assets/src/components/SharePage.svelte @@ -3,12 +3,13 @@ import ShareStatus from "./share/ShareStatus.svelte"; import RequestList from "./share/RequestList.svelte"; import { getShareState, ShareStateType } from "../state/share"; + import Toasts from "./Toasts.svelte"; const state = getShareState().type;
- +
diff --git a/assets/src/components/Toasts.svelte b/assets/src/components/Toasts.svelte new file mode 100644 index 0000000..f909831 --- /dev/null +++ b/assets/src/components/Toasts.svelte @@ -0,0 +1,77 @@ + + +
+ {#each $toasts as toast (toast.id)} +
    +
    dismissToast(toast)}> + +
    + +
  • + {#if toast.type === ToastType.INFO} + + {:else} + + {/if} +
  • + + {#if toast.title} +
  • {toast.title}
  • + {/if} + +
  • {trim(toast.message)}
  • +
+ {/each} +
+ + diff --git a/assets/src/components/icons/FlashIcon.svelte b/assets/src/components/icons/FlashIcon.svelte new file mode 100644 index 0000000..57525f2 --- /dev/null +++ b/assets/src/components/icons/FlashIcon.svelte @@ -0,0 +1,13 @@ + + + + + + diff --git a/assets/src/components/icons/LightbulbIcon.svelte b/assets/src/components/icons/LightbulbIcon.svelte new file mode 100644 index 0000000..fbaef1d --- /dev/null +++ b/assets/src/components/icons/LightbulbIcon.svelte @@ -0,0 +1,16 @@ + + + + + + diff --git a/assets/src/state/toast.ts b/assets/src/state/toast.ts new file mode 100644 index 0000000..8eba306 --- /dev/null +++ b/assets/src/state/toast.ts @@ -0,0 +1,42 @@ +import { writable } from "svelte/store"; +import generateId from "../utils/generateId"; + +export enum ToastType { + INFO, + ERROR, +} + +export type ToastData = { + type: ToastType; + message: string; + title?: string; +}; + +export type Toast = { + id: string; +} & ToastData; + +export const toasts = writable([]); + +export function toast(toast: ToastData): Toast { + const toastWithId: Toast = { + ...toast, + id: generateId(8), + }; + + toasts.update(toasts => [...toasts, toastWithId]); + + // Dissmiss toast after 5 seconds. + setTimeout(() => { + dismissToast(toastWithId); + }, 5000); + + return toastWithId; +} + +// @ts-ignore +window.toast = toast; + +export function dismissToast(toast: Toast) { + toasts.update(toasts => toasts.filter(t => t.id !== toast.id)); +} diff --git a/assets/src/utils/generateId.ts b/assets/src/utils/generateId.ts new file mode 100644 index 0000000..51119a8 --- /dev/null +++ b/assets/src/utils/generateId.ts @@ -0,0 +1,10 @@ +// Returns a fairly random id string, which can +// then be used for keys in each blocks. +export default function (length: number): string { + const chars = "0123456789abcdef"; + + return Array(length) + .fill(0) + .map(() => chars[Math.floor(Math.random() * chars.length)]) + .join(""); +} -- cgit 1.4.1