aboutsummaryrefslogtreecommitdiff
path: root/src/background/completion/impl/BookmarkRepositoryImpl.ts
diff options
context:
space:
mode:
Diffstat (limited to 'src/background/completion/impl/BookmarkRepositoryImpl.ts')
-rw-r--r--src/background/completion/impl/BookmarkRepositoryImpl.ts26
1 files changed, 22 insertions, 4 deletions
diff --git a/src/background/completion/impl/BookmarkRepositoryImpl.ts b/src/background/completion/impl/BookmarkRepositoryImpl.ts
index 58df129..f34c7d1 100644
--- a/src/background/completion/impl/BookmarkRepositoryImpl.ts
+++ b/src/background/completion/impl/BookmarkRepositoryImpl.ts
@@ -1,11 +1,21 @@
-import { injectable } from "tsyringe";
import BookmarkRepository, {BookmarkItem} from "../BookmarkRepository";
+import {HistoryItem} from "../HistoryRepository";
+import PrefetchAndCache from "./PrefetchAndCache";
const COMPLETION_ITEM_LIMIT = 10;
-@injectable()
-export default class BookmarkRepositoryImpl implements BookmarkRepository {
- async queryBookmarks(query: string): Promise<BookmarkItem[]> {
+export default class CachedBookmarkRepository implements BookmarkRepository {
+ private bookmarkCache: PrefetchAndCache<BookmarkItem>;
+
+ constructor() {
+ this.bookmarkCache = new PrefetchAndCache(this.getter, this.filter, 10,);
+ }
+
+ queryBookmarks(query: string): Promise<BookmarkItem[]> {
+ return this.bookmarkCache.get(query);
+ }
+
+ private async getter(query: string): Promise<BookmarkItem[]> {
const items = await browser.bookmarks.search({query});
return items
.filter(item => item.title && item.title.length > 0)
@@ -25,4 +35,12 @@ export default class BookmarkRepositoryImpl implements BookmarkRepository {
url: item.url!!,
}));
}
+
+ private filter(items: HistoryItem[], query: string) {
+ return items.filter(item => {
+ return query.split(' ').some(keyword => {
+ return item.title.toLowerCase().includes(keyword.toLowerCase()) || item.url.includes(keyword)
+ });
+ })
+ };
}