From 1a31ef2a74c5e692accae6f7d64631425cb2ff28 Mon Sep 17 00:00:00 2001 From: I Made Setia Baruna Date: Sun, 10 Jan 2021 05:02:42 +0800 Subject: [PATCH] Add toast --- src/components/DataSync.svelte | 18 +++++++++++------- src/components/Toast.svelte | 21 +++++++++++++++++++++ src/routes/_layout.svelte | 2 ++ src/stores/saveManager.js | 5 +++++ src/stores/toast.js | 29 +++++++++++++++++++++++++++++ 5 files changed, 68 insertions(+), 7 deletions(-) create mode 100644 src/components/Toast.svelte create mode 100644 src/stores/toast.js diff --git a/src/components/DataSync.svelte b/src/components/DataSync.svelte index d5ce6ed7..782753ec 100644 --- a/src/components/DataSync.svelte +++ b/src/components/DataSync.svelte @@ -7,6 +7,7 @@ import { getLocalSaveJson, updateSave, updateTime, UPDATE_TIME_KEY } from '../stores/saveManager'; import SyncConflictModal from '../components/SyncConflictModal.svelte'; + import { pushToast } from '../stores/toast'; const { open: openModal, close: closeModal } = getContext('simple-modal'); @@ -25,6 +26,10 @@ onMount(() => { startSync(); + + window.onerror = function () { + handleError(); + }; }); function startSync() { @@ -42,6 +47,7 @@ driveLoading.set(false); driveError.set(true); synced.set(true); + pushToast('Drive sync not available right now 😔', 'error'); } function handleClientLoad() { @@ -114,6 +120,7 @@ ); } else { synced.set(true); + pushToast('Data has been synced!'); } } catch (err) { console.error(err); @@ -178,7 +185,7 @@ } async function getData() { - console.log('reading remote file'); + console.log('reading remote file now'); try { const { result } = await gapi.client.drive.files.get({ @@ -186,10 +193,10 @@ alt: 'media', }); - console.log(result); + console.log('get file res', result); return result; } catch (err) { - console.error(err); + console.error('get file res error', err); handleError(); } } @@ -227,10 +234,7 @@ }, function (error) { console.error(error); - driveSignedIn.set(false); - driveLoading.set(false); - driveError.set(true); - synced.set(true); + handleError(); }, ); } diff --git a/src/components/Toast.svelte b/src/components/Toast.svelte new file mode 100644 index 00000000..8b092af7 --- /dev/null +++ b/src/components/Toast.svelte @@ -0,0 +1,21 @@ + + +
+ {#each $toasts as toast (toast._id)} +
+ {toast.msg} +
+ {/each} +
diff --git a/src/routes/_layout.svelte b/src/routes/_layout.svelte index 51893977..b5bb052b 100644 --- a/src/routes/_layout.svelte +++ b/src/routes/_layout.svelte @@ -15,6 +15,7 @@ import { checkLocalSave } from '../stores/saveManager'; import TodoData from '../components/TodoData.svelte'; import SettingData from '../components/SettingData.svelte'; + import Toast from '../components/Toast.svelte'; export let segment; @@ -78,6 +79,7 @@ +
diff --git a/src/stores/saveManager.js b/src/stores/saveManager.js index 9df9aa6d..bd6c30a1 100644 --- a/src/stores/saveManager.js +++ b/src/stores/saveManager.js @@ -3,6 +3,7 @@ import { writable } from 'svelte/store'; import debounce from 'lodash/debounce'; import { synced, saveId, localModified, lastSyncTime } from './dataSync'; +import { pushToast } from './toast'; export const updateTime = writable(null); export const fromRemote = writable(false); @@ -36,8 +37,12 @@ async function saveData(data) { }); synced.set(true); localModified.set(false); + + pushToast('Data has been synced!') } catch (err) { console.error(err); + pushToast('Error when uploading your data!', 'error') + synced.set(true); } } diff --git a/src/stores/toast.js b/src/stores/toast.js new file mode 100644 index 00000000..7fc5e5cc --- /dev/null +++ b/src/stores/toast.js @@ -0,0 +1,29 @@ +import { writable } from 'svelte/store'; + +export const toasts = writable([]); + +let toastId = 0; + +const unshiftToast = () => { + toasts.update((val) => { + return val.slice(1); + }); +}; + +export const pushToast = (msg = '', type = 'default') => { + toasts.update((val) => { + const updatedToasts = [ + ...val, + { + _id: ++toastId, + msg, + type, + }, + ]; + setTimeout(() => { + unshiftToast(); + }, 3500); + + return updatedToasts; + }); +};