From 03fc5c3399d53ab241c4b029d465c31548deb711 Mon Sep 17 00:00:00 2001 From: Made Baruna Date: Thu, 14 Oct 2021 05:40:46 +0700 Subject: [PATCH] Add export and import data --- src/components/Button.svelte | 12 +-- src/components/DataSync.svelte | 12 ++- src/components/SyncConflictModal.svelte | 19 ++++- src/locales/en.json | 14 +++- src/routes/changelog.svelte | 2 + src/routes/settings/_importExportModal.svelte | 73 +++++++++++++++++++ src/routes/settings/index.svelte | 37 +++++++++- src/stores/dataSync.js | 1 + 8 files changed, 156 insertions(+), 14 deletions(-) create mode 100644 src/routes/settings/_importExportModal.svelte diff --git a/src/components/Button.svelte b/src/components/Button.svelte index 9e5722e1..017094b0 100644 --- a/src/components/Button.svelte +++ b/src/components/Button.svelte @@ -39,9 +39,11 @@ + + diff --git a/src/components/DataSync.svelte b/src/components/DataSync.svelte index 77b089a3..c695699d 100644 --- a/src/components/DataSync.svelte +++ b/src/components/DataSync.svelte @@ -3,7 +3,7 @@ import dayjs from 'dayjs'; import { onMount, getContext, setContext } from 'svelte'; - import { driveSignedIn, driveError, driveLoading, saveId, synced } from '../stores/dataSync'; + import { driveSignedIn, driveError, driveLoading, saveId, synced, driveEmail } from '../stores/dataSync'; import { getLocalSaveJson, updateSave, updateTime, UPDATE_TIME_KEY } from '../stores/saveManager'; import SyncConflictModal from '../components/SyncConflictModal.svelte'; @@ -81,6 +81,8 @@ driveLoading.set(false); if (finalStatus) { + const email = gapi.auth2.getAuthInstance().currentUser.get().getBasicProfile().getEmail(); + driveEmail.set(email); getFiles(); } else { synced.set(true); @@ -194,6 +196,12 @@ const data = await getData(); remoteSave = data; + console.log(JSON.stringify(remoteSave)); + const remoteSize = new Blob([JSON.stringify(remoteSave)]).size / 1000; + + const localSave = await getLocalSaveJson(); + const localSize = new Blob([localSave]).size / 1000; + const remoteTime = dayjs(data[UPDATE_TIME_KEY]); if ($updateTime !== null && remoteTime.diff($updateTime) !== 0) { console.log('DRIVE SYNC CONFLICT!'); @@ -202,6 +210,8 @@ { remoteTime: remoteTime, localTime: $updateTime, + remoteSize, + localSize, downloadBackup: exportData, useRemote: useRemoteData, useLocal: useLocalData, diff --git a/src/components/SyncConflictModal.svelte b/src/components/SyncConflictModal.svelte index ea1a8ffc..fd17a4e1 100644 --- a/src/components/SyncConflictModal.svelte +++ b/src/components/SyncConflictModal.svelte @@ -1,16 +1,23 @@ + +
+

{$t('settings.export')}

+

{$t('settings.exportInfo')}

+ +
+
+

{$t('settings.import')}

+

{$t('settings.importWarning')}

+ {#if !loading} +
+ + {#if files !== null && files[0]} + + {/if} +
+ {/if} + {#if loading}{/if} + +
diff --git a/src/routes/settings/index.svelte b/src/routes/settings/index.svelte index 35eeaab8..b574e102 100644 --- a/src/routes/settings/index.svelte +++ b/src/routes/settings/index.svelte @@ -2,9 +2,8 @@ import { t } from 'svelte-i18n'; import localforage from 'localforage'; - import { mdiCheckCircleOutline, mdiChevronDown, mdiDiscord, mdiGithub, mdiGoogleDrive, mdiLoading } from '@mdi/js'; + import { mdiCheckCircleOutline, mdiDiscord, mdiGithub, mdiGoogleDrive, mdiLoading, mdiSwapVertical } from '@mdi/js'; import { getContext, onMount } from 'svelte'; - import { slide } from 'svelte/transition'; import Button from '../../components/Button.svelte'; import Icon from '../../components/Icon.svelte'; @@ -13,8 +12,17 @@ import DeleteAccountModal from './_deleteAccount.svelte'; import ResetAccountModal from './_resetAccount.svelte'; import DonateModal from '../../components/DonateModal.svelte'; + import ExportImportModal from './_importExportModal.svelte'; - import { driveSignedIn, driveError, driveLoading, synced, localModified, lastSyncTime } from '../../stores/dataSync'; + import { + driveSignedIn, + driveError, + driveLoading, + synced, + localModified, + lastSyncTime, + driveEmail, + } from '../../stores/dataSync'; import { server, ar, wl } from '../../stores/server'; import { accounts, getAccountPrefix, selectedAccount } from '../../stores/account'; import { pushToast } from '../../stores/toast'; @@ -240,6 +248,17 @@ ); } + function openImportExportModal() { + openModal( + ExportImportModal, + {}, + { + closeButton: false, + styleWindow: { background: '#25294A', width: '500px' }, + }, + ); + } + onMount(() => { mounted = true; }); @@ -319,8 +338,9 @@ {$t('settings.driveSignOut')} +

{$driveEmail}

- Sync Status: + {$t('settings.syncStatus')} {isSynced ? $t('settings.synced') @@ -339,6 +359,15 @@ {/if} {/if} +

+

{$t('settings.exportDescription')}

+
+ +
+
{$t('settings.feedback')}