From 451253025094260bee7e7e0c8c8f04704dffdca9 Mon Sep 17 00:00:00 2001 From: Julien Calixte Date: Sun, 12 Jan 2025 10:58:03 +0100 Subject: [PATCH] retrieve all from indexed db in one call --- src/data/data.ts | 28 ++++++++++++++++++------- src/hooks/useOfflineNotes.hook.ts | 35 ++++++++++++++++++++----------- 2 files changed, 43 insertions(+), 20 deletions(-) diff --git a/src/data/data.ts b/src/data/data.ts index 444e076..03c12e9 100644 --- a/src/data/data.ts +++ b/src/data/data.ts @@ -121,15 +121,27 @@ class Data { keys: keys.map((key) => this.generateId(prefix, key)) }) - return response.rows - .map((row) => { - if ('error' in row) { - return null - } + if (includeDocs) { + return response.rows + .map((row) => { + if ('error' in row) { + return null + } - return row.doc - }) - .filter((doc) => !!doc) as T[] + return row.doc + }) + .filter(Boolean) as T[] + } else { + return response.rows + .map((row) => { + if ('error' in row) { + return null + } + + return { _id: row.id } + }) + .filter(Boolean) as T[] + } } const response = await this.locale.allDocs({ diff --git a/src/hooks/useOfflineNotes.hook.ts b/src/hooks/useOfflineNotes.hook.ts index db6b7c7..bfcacde 100644 --- a/src/hooks/useOfflineNotes.hook.ts +++ b/src/hooks/useOfflineNotes.hook.ts @@ -1,7 +1,10 @@ -import { useAsyncState } from '@vueuse/core' +import { asyncComputed, useAsyncState } from '@vueuse/core' import { computed, ref } from 'vue' +import { data } from '@/data/data' +import { DataType } from '@/data/DataType.enum' import { prepareNoteCache } from '@/modules/note/cache/prepareNoteCache' +import { Note } from '@/modules/note/models/Note' import { queryFileContent } from '@/modules/repo/services/repo' import { useUserRepoStore } from '@/modules/repo/store/userRepo.store' @@ -11,6 +14,20 @@ export const useOfflineNotes = () => { const noteCompleted = ref(0) + const cachedNotesFromSha = asyncComputed( + async () => + data.getAll({ + prefix: DataType.Note, + keys: store.files.map((file) => file.sha).filter(Boolean) as string[], + includeDocs: false + }), + [] + ) + + const cachedNotesSet = computed( + () => new Set(cachedNotesFromSha.value.map((note) => note._id)) + ) + const cacheAllNotes = async () => { const isInitialized = store.user && store.repo && totalOfNotes.value > 0 @@ -23,20 +40,14 @@ export const useOfflineNotes = () => { for (const file of store.files) { noteCompleted.value++ - if (!file.sha) { + if ( + !file.sha || + cachedNotesSet.value.has(data.generateId(DataType.Note, file.sha)) + ) { continue } - const { getCachedNote, saveCacheNote } = prepareNoteCache( - file.sha, - file.path - ) - - const { from } = await getCachedNote() - - if (from === 'sha') { - continue - } + const { saveCacheNote } = prepareNoteCache(file.sha, file.path) const contentFile = await queryFileContent( store.user,