From 325b085b5453331cbb8a4c2f2f8616ec8222a850 Mon Sep 17 00:00:00 2001 From: Tim Date: Tue, 30 Jul 2024 21:30:10 +0200 Subject: [PATCH] #41 add toasts and use for success and error --- view/src/lib/toast.ts | 27 +++++++++++++++++++++++ view/src/routes/+layout.svelte | 34 +++++++++++++++++++++++++---- view/src/routes/app/+page.svelte | 18 +++++---------- view/src/routes/signin/+page.svelte | 12 ++++------ view/src/routes/signup/+page.svelte | 12 ++++------ 5 files changed, 70 insertions(+), 33 deletions(-) create mode 100644 view/src/lib/toast.ts diff --git a/view/src/lib/toast.ts b/view/src/lib/toast.ts new file mode 100644 index 0000000..e834c04 --- /dev/null +++ b/view/src/lib/toast.ts @@ -0,0 +1,27 @@ +import { writable } from "svelte/store"; + + +type Type = 'success' | 'info' | 'warning' | 'error'; +type Toast = { + message: string; + type: Type; +} + +const toastStore = writable([]); + + +const addToast = (message: string, type: Type) => { + const newToast = { message, type }; + + toastStore.update((toasts) => { + return [...toasts, newToast]; + }); + + setTimeout(() => { + toastStore.update((toasts) => toasts.filter((t) => t !== newToast)); + }, 5000); +} + + +export { toastStore, addToast, }; +export type { Toast } diff --git a/view/src/routes/+layout.svelte b/view/src/routes/+layout.svelte index 8e231d1..a86be26 100644 --- a/view/src/routes/+layout.svelte +++ b/view/src/routes/+layout.svelte @@ -2,29 +2,38 @@ import '../app.css'; import { onDestroy, onMount } from 'svelte'; import type { Auth, User } from 'firebase/auth'; + import { addToast, toastStore } from '$lib/toast'; + import type { Toast } from '$lib/toast'; var auth: Auth | null = null; var user: User | null = null; - var unsub: (() => void) | null = null; + var unsubAuth: (() => void) | null = null; + + let toasts: Toast[] = []; + let unsubToast = toastStore.subscribe((value) => { + toasts = value; + }); onMount(async () => { const { auth: _auth } = await import('../lib/firebase'); auth = _auth; user = auth.currentUser; - unsub = auth.onAuthStateChanged((newUser) => { + unsubAuth = auth.onAuthStateChanged((newUser) => { user = newUser; }); }); onDestroy(() => { - if (unsub) { - unsub(); + unsubToast(); + if (unsubAuth) { + unsubAuth(); } }); const signOut = async () => { try { await (auth as Auth).signOut(); + addToast('Signed out successfully', 'success'); } catch (error) { console.error(error); } @@ -46,4 +55,21 @@
+ + + + + +
+ {#each toasts as toast} +
+ {toast.message} +
+ {/each} +
diff --git a/view/src/routes/app/+page.svelte b/view/src/routes/app/+page.svelte index d76da53..865fca6 100644 --- a/view/src/routes/app/+page.svelte +++ b/view/src/routes/app/+page.svelte @@ -3,8 +3,7 @@ import { onMount } from 'svelte'; import type { Auth } from 'firebase/auth'; import { goto } from '$app/navigation'; - - $: errorStr = ''; + import { addToast } from '$lib/toast'; var auth: Auth | null = null; @@ -12,8 +11,6 @@ $: workouts = []; async function handleSubmit(_submit: SubmitEvent) { - errorStr = ''; - const form = _submit.target as HTMLFormElement; const formData = new FormData(form); @@ -30,12 +27,10 @@ fetchWorkouts(); resetForm(); } else { - const data = await response.text(); - errorStr = data; + addToast('Failed to save workout: ' + (await response.text()), 'error'); } } catch (error: any) { - errorStr = error.message; - console.error(error); + addToast('Failed to save workout: ' + error.message, 'error'); } } @@ -62,10 +57,10 @@ console.log(data); workouts = data; } else { - errorStr = await response.text(); + addToast('Failed to fetch workouts: ' + (await response.text()), 'error'); } } catch (error: any) { - console.log(error); + addToast('Failed to fetch workouts: ' + error.message, 'error'); } } @@ -101,9 +96,6 @@ - {#if errorStr} -

{errorStr}

- {/if}
diff --git a/view/src/routes/signin/+page.svelte b/view/src/routes/signin/+page.svelte index 11ed02a..c106c1a 100644 --- a/view/src/routes/signin/+page.svelte +++ b/view/src/routes/signin/+page.svelte @@ -1,11 +1,9 @@ @@ -65,8 +65,4 @@ Sign Up
- - {#if errorStr} -

{errorStr}

- {/if} diff --git a/view/src/routes/signup/+page.svelte b/view/src/routes/signup/+page.svelte index ce3f2d6..82df04d 100644 --- a/view/src/routes/signup/+page.svelte +++ b/view/src/routes/signup/+page.svelte @@ -1,11 +1,9 @@ @@ -65,8 +65,4 @@ Sign In - - {#if errorStr} -

{errorStr}

- {/if}