From 955b27476378f91de68c952e34129397b3b08ca2 Mon Sep 17 00:00:00 2001 From: Simon Leigh Date: Wed, 11 Dec 2019 13:03:13 +0900 Subject: [PATCH 1/5] updated sync functions to correctly refresh storage --- src/lib/db/store.ts | 73 ++++++++++++++++++++++++++------------------- src/lib/db/types.ts | 1 + 2 files changed, 44 insertions(+), 30 deletions(-) diff --git a/src/lib/db/store.ts b/src/lib/db/store.ts index cc79762bf0..4eb8b3ee28 100644 --- a/src/lib/db/store.ts +++ b/src/lib/db/store.ts @@ -36,11 +36,12 @@ export interface DbStore { createStorage: (name: string) => Promise removeStorage: (id: string) => Promise renameStorage: (id: string, name: string) => Promise + syncStorage: (id: string, user: User) => Promise setCloudLink: ( id: string, cloudStorage: CloudStorage, user: User - ) => Promise + ) => Promise removeCloudLink: (id: string) => Promise createFolder: (storageName: string, pathname: string) => Promise removeFolder: (storageName: string, pathname: string) => Promise @@ -157,46 +158,29 @@ export function createDbStoreCreator( }, []) const setCloudLink = useCallback( - async ( - id: string, - cloudStorage: CloudStorage, - user: User - ): Promise => { + async (id: string, cloudStorage: CloudStorage, user: User) => { let storage = storageMap[id] if (storage == null) { - return false + return } - storage = { ...storage, cloudStorage } + storage = { + ...storage, + cloudStorage: { ...cloudStorage, updatedAt: Date.now() } + } setStorageMap( produce((draft: ObjectMap) => { if (draft[id] != null) { - draft[id]!.cloudStorage = cloudStorage + draft[id]!.cloudStorage = { + ...cloudStorage, + updatedAt: Date.now() + } } }) ) - - try { - await storage.db.sync(user, cloudStorage) - storage = await prepareStorage(storage, 'idb') - - setStorageMap(prevStorageMap => { - const newStorageMap = produce(prevStorageMap, draft => { - if (prevStorageMap[id] == null) { - return - } - draft[id] = storage - }) - saveStorageDataList(liteStorage, newStorageMap!) - return newStorageMap - }) - - return true - } catch { - return false - } + return syncStorage(storage.id, user) }, [storageMap] ) @@ -912,6 +896,30 @@ export function createDbStoreCreator( ) } + const syncStorage = async (storageId: string, user: User) => { + let storage = storageMap[storageId] + if (storage == null || storage.cloudStorage == null) { + return + } + await storage.db.sync(user, storage.cloudStorage) + storage.cloudStorage.updatedAt = Date.now() + + storage = await prepareStorage(storage, adapter) + setStorageMap(prevStorageMap => { + const newStorageMap = produce( + prevStorageMap, + (draft: ObjectMap) => { + if (draft[storageId] == null) { + return + } + draft[storageId] = storage + } + ) + saveStorageDataList(liteStorage, newStorageMap) + return newStorageMap + }) + } + return { initialized, storageMap, @@ -919,6 +927,7 @@ export function createDbStoreCreator( createStorage, removeStorage, renameStorage, + syncStorage, setCloudLink, removeCloudLink, createFolder, @@ -939,7 +948,11 @@ export function createDbStoreCreator( const storageDataPredicate = schema({ id: ow.string, name: ow.string, - cloudStorage: optional({ id: ow.number, name: ow.string }) + cloudStorage: optional({ + id: ow.number, + name: ow.string, + updatedAt: ow.number + }) }) export const { diff --git a/src/lib/db/types.ts b/src/lib/db/types.ts index 5affbc5004..9b5b35f054 100644 --- a/src/lib/db/types.ts +++ b/src/lib/db/types.ts @@ -17,6 +17,7 @@ export interface NoteStorageData { cloudStorage?: { id: number name: string + updatedAt: number } } From b81c0bcba477ed1b97c049ab0baed363477f3ff8 Mon Sep 17 00:00:00 2001 From: Simon Leigh Date: Wed, 11 Dec 2019 13:03:56 +0900 Subject: [PATCH 2/5] Updated sync use in StorageEdit component --- src/components/Storage/StorageEdit.tsx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/components/Storage/StorageEdit.tsx b/src/components/Storage/StorageEdit.tsx index 817a4e5028..8499c0ca2d 100644 --- a/src/components/Storage/StorageEdit.tsx +++ b/src/components/Storage/StorageEdit.tsx @@ -26,11 +26,11 @@ export default ({ storage }: StorageEditProps) => { const user = preferences['general.accounts'][0] const linkCallback = useCallback( - async (cloudStorage: CloudStorage) => { - const success = await db.setCloudLink(storage.id, cloudStorage, user) - if (!success) { + (cloudStorage: CloudStorage) => { + db.setCloudLink(storage.id, cloudStorage, user).catch(() => { //TODO: toast syncing failed - } + console.log('sync error') + }) }, [storage.id, db, user] ) From 69a606b085aff40c218f2f3e92d7adeac19f29fc Mon Sep 17 00:00:00 2001 From: Simon Leigh Date: Wed, 11 Dec 2019 13:04:25 +0900 Subject: [PATCH 3/5] added sync button to SideNavigation --- .../SideNavigator/SideNavigator.tsx | 46 +++++++++++++++---- .../SideNavigator/SideNavigatorItem.tsx | 4 +- 2 files changed, 40 insertions(+), 10 deletions(-) diff --git a/src/components/SideNavigator/SideNavigator.tsx b/src/components/SideNavigator/SideNavigator.tsx index 52c6d9884f..291011ea15 100644 --- a/src/components/SideNavigator/SideNavigator.tsx +++ b/src/components/SideNavigator/SideNavigator.tsx @@ -9,7 +9,8 @@ import { mdiDeleteOutline, mdiDelete, mdiImage, - mdiImageOutline + mdiImageOutline, + mdiSync } from '@mdi/js' import Icon from '../atoms/Icon' import { useDialog, DialogIconTypes } from '../../lib/dialog' @@ -22,6 +23,7 @@ import ControlButton from './ControlButton' import FolderListFragment from './FolderListFragment' import TagListFragment from './TagListFragment' import TutorialsNavigator from '../Tutorials/TutorialsNavigator' +import { useUsers } from '../../lib/accounts' const StyledSideNavContainer = styled.nav` display: flex; @@ -94,11 +96,13 @@ export default () => { createFolder, renameStorage, removeStorage, - storageMap + storageMap, + syncStorage } = useDb() const { popup } = useContextMenu() const { prompt, messageBox } = useDialog() const { push } = useRouter() + const [[user]] = useUsers() const storageEntries = useMemo(() => { return entries(storageMap) @@ -181,6 +185,36 @@ export default () => { const attachmentsPageIsActive = currentPathname === attachmentsPagePathname + let controlComponents = [ + showPromptToCreateFolder('/')} + iconPath={mdiPlusCircleOutline} + /> + ] + + if (storage.cloudStorage != null && user != null) { + const cloudSync = () => { + if (user == null) { + // TODO: toast login needed + console.error('login required') + } + syncStorage(storage.id, user).catch(e => { + // TODO: toast sync failed error + console.error(e) + }) + } + + controlComponents = [ + , + ...controlComponents + ] + } + return ( { } ]) }} - controlComponents={[ - showPromptToCreateFolder('/')} - iconPath={mdiPlusCircleOutline} - /> - ]} + controlComponents={controlComponents} /> {!storageIsFolded && ( <> diff --git a/src/components/SideNavigator/SideNavigatorItem.tsx b/src/components/SideNavigator/SideNavigatorItem.tsx index 3d1d351fa7..c4146b01e7 100644 --- a/src/components/SideNavigator/SideNavigatorItem.tsx +++ b/src/components/SideNavigator/SideNavigatorItem.tsx @@ -68,7 +68,9 @@ const ClickableContainer = styled.button` const Label = styled.div`` -const ControlContainer = styled.div`` +const ControlContainer = styled.div` + display: flex; +` interface SideNaviagtorItemProps { label: string From 81c435ee213b55cae3130036fbd7643253c6464f Mon Sep 17 00:00:00 2001 From: Simon Leigh Date: Wed, 11 Dec 2019 13:11:03 +0900 Subject: [PATCH 4/5] Added last sync time to StorageEdit page --- src/components/Storage/StorageEdit.tsx | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/src/components/Storage/StorageEdit.tsx b/src/components/Storage/StorageEdit.tsx index 8499c0ca2d..ced01a2ec7 100644 --- a/src/components/Storage/StorageEdit.tsx +++ b/src/components/Storage/StorageEdit.tsx @@ -70,11 +70,17 @@ export default ({ storage }: StorageEditProps) => {

Cloud Storage

{storage.cloudStorage != null ? ( -

- Linked Storage: {storage.cloudStorage.name} (ID: - {storage.cloudStorage.id}){' '} - Unlink -

+
+

+ Linked Storage: {storage.cloudStorage.name} (ID: + {storage.cloudStorage.id}){' '} + Unlink +

+

+ Last synced at{' '} + {new Date(storage.cloudStorage.updatedAt).toLocaleString()} +

+
) : (
{user == null && ( From 17bf301c52e828d77827a6d1f1695afc53f74a42 Mon Sep 17 00:00:00 2001 From: Simon Leigh Date: Wed, 11 Dec 2019 15:09:26 +0900 Subject: [PATCH 5/5] use unshift --- src/components/SideNavigator/SideNavigator.tsx | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/components/SideNavigator/SideNavigator.tsx b/src/components/SideNavigator/SideNavigator.tsx index 291011ea15..a509e5f2d4 100644 --- a/src/components/SideNavigator/SideNavigator.tsx +++ b/src/components/SideNavigator/SideNavigator.tsx @@ -185,7 +185,7 @@ export default () => { const attachmentsPageIsActive = currentPathname === attachmentsPagePathname - let controlComponents = [ + const controlComponents = [ showPromptToCreateFolder('/')} @@ -205,14 +205,13 @@ export default () => { }) } - controlComponents = [ + controlComponents.unshift( , - ...controlComponents - ] + /> + ) } return (