diff --git a/src/lib/Portal.svelte b/src/lib/Portal.svelte new file mode 100644 index 0000000..639699d --- /dev/null +++ b/src/lib/Portal.svelte @@ -0,0 +1,29 @@ + + + diff --git a/src/lib/toast/Toast.svelte b/src/lib/toast/Toast.svelte new file mode 100644 index 0000000..36f72cd --- /dev/null +++ b/src/lib/toast/Toast.svelte @@ -0,0 +1,47 @@ + + + +
+ {#each $toast as message (message.id)} +
toast.remove(message.id)} + in:fly={{ opacity: 0, x: 100 }} + out:fade + animate:flip + class={`toast ${message.type.toLowerCase()}`} + > + +
+ {/each} +
+
+ + diff --git a/src/lib/toast/ToastMessage.svelte b/src/lib/toast/ToastMessage.svelte new file mode 100644 index 0000000..d23f8f1 --- /dev/null +++ b/src/lib/toast/ToastMessage.svelte @@ -0,0 +1,35 @@ + + +
+

{toastData.message}

+ + diff --git a/src/lib/toast/toast.ts b/src/lib/toast/toast.ts new file mode 100644 index 0000000..b08fd24 --- /dev/null +++ b/src/lib/toast/toast.ts @@ -0,0 +1,29 @@ +import type { ToastData } from '$lib/types'; +import { writable } from 'svelte/store'; + +// Custom store +const newToast = () => { + const { subscribe, update } = writable([]); + + function send(message: string, { duration = 2000, type = 'INFO' } = {}) { + const id = Math.floor(Math.random() * 1000); + const newMessage = { + id, + duration, + type, + message + }; + update((store) => [...store, newMessage]); + } + + function remove(id: number) { + update((store) => { + const newStore = store.filter((item: ToastData) => item.id !== id); + return [...newStore]; + }); + } + + return { subscribe, send, remove }; +}; + +export const toast = newToast(); diff --git a/src/lib/types.ts b/src/lib/types.ts index e1c9e02..1fd2d95 100644 --- a/src/lib/types.ts +++ b/src/lib/types.ts @@ -1,3 +1,16 @@ +export enum ToastType { + INFO, + ERROR, + WARNING +} + +export type ToastData = { + id: number; + duration: number; + type: ToastType; + message: string; +} + export type GameType = { id: string; handle: string;