diff --git a/README.md b/README.md index f3cc4d1..d399d4f 100644 --- a/README.md +++ b/README.md @@ -74,9 +74,13 @@ object `omnisearch` (`window.omnisearch`) ```ts // API: -{ +type OmnisearchApi = { // Returns a promise that will contain the same results as the Vault modal - search: (query: string) => Promise + search: (query: string) => Promise, + // Register a callback that will be called when the indexing is done + registerOnIndexed: (callback: () => void) => void, + // Unregister a callback that was previously registered + unregisterOnIndexed: (callback: () => void) => void, } type ResultNoteApi = { diff --git a/src/main.ts b/src/main.ts index 524bb73..039ea86 100644 --- a/src/main.ts +++ b/src/main.ts @@ -17,7 +17,7 @@ import { IndexingStepType, isCacheEnabled, } from './globals' -import api from './tools/api' +import api, { notifyOnIndexed } from './tools/api' import { isFileIndexable } from './tools/utils' import { database, OmnisearchCache } from './database' import * as NotesIndex from './notes-index' @@ -210,6 +210,7 @@ export default class OmnisearchPlugin extends Plugin { new Notice(`Omnisearch - Your files have been indexed.`) } indexingStep.set(IndexingStepType.Done) + notifyOnIndexed() } } diff --git a/src/tools/api.ts b/src/tools/api.ts index 577e90e..db5cc2c 100644 --- a/src/tools/api.ts +++ b/src/tools/api.ts @@ -17,6 +17,13 @@ export type SearchMatchApi = { offset: number } +let notified = false + +/** + * Callbacks to be called when the search index is ready + */ +let onIndexedCallbacks: Array<() => void> = [] + function mapResults(results: ResultNote[]): ResultNoteApi[] { return results.map(result => { const { score, path, basename, foundWords, matches, content } = result @@ -39,13 +46,27 @@ function mapResults(results: ResultNote[]): ResultNoteApi[] { }) } -async function search( - q: string, - options: Partial<{ excerpt: boolean }> = {} -): Promise { +async function search(q: string): Promise { const query = new Query(q) const raw = await searchEngine.getSuggestions(query) return mapResults(raw) } -export default { search } +function registerOnIndexed(cb: () => void): void { + onIndexedCallbacks.push(cb) + // Immediately call the callback if the indexing is already ready done + if (notified) { + cb() + } +} + +function unregisterOnIndexed(cb: () => void): void { + onIndexedCallbacks = onIndexedCallbacks.filter(o => o !== cb) +} + +export function notifyOnIndexed(): void { + notified = true + onIndexedCallbacks.forEach(cb => cb()) +} + +export default { search, registerOnIndexed, unregisterOnIndexed }