From 24cb77b88ffe8536e970d8423f31c11551b81cf7 Mon Sep 17 00:00:00 2001 From: Maksim Sukharev Date: Mon, 6 May 2024 17:54:30 +0200 Subject: [PATCH] fix(emoji): index emoji data once for search functions Signed-off-by: Maksim Sukharev --- src/functions/emoji/emoji.ts | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/src/functions/emoji/emoji.ts b/src/functions/emoji/emoji.ts index 7e69f4b26e..519633edc9 100644 --- a/src/functions/emoji/emoji.ts +++ b/src/functions/emoji/emoji.ts @@ -27,6 +27,10 @@ import data from 'emoji-mart-vue-fast/data/all.json' const storage = getBuilder('nextcloud-vue').persist(true).build() +// Shared emoji index and skinTone for all emojiSearch function calls +// Will be initialized on the first call +let emojiIndex + /** * Skin tones supported by Unicode Emojis (Fitzpatrick scale) * The numeric values align with `emoji-mart-vue` @@ -46,17 +50,20 @@ export enum EmojiSkinTone { * @return {Array} list of found emojis */ export const emojiSearch = (query: string, maxResults: number = 10) => { - const index = new EmojiIndex(data) + // If this is the first call of function - initialize EmojiIndex + if (!emojiIndex) { + emojiIndex = new EmojiIndex(data) + } const currentSkinTone = getCurrentSkinTone() let results if (query) { - results = index.search(`:${query}`, maxResults) + results = emojiIndex.search(`:${query}`, maxResults) if (results.length < maxResults) { - results = results.concat(index.search(query, maxResults - results.length)) + results = results.concat(emojiIndex.search(query, maxResults - results.length)) } } else { - results = frequently.get(maxResults).map((id: number) => index.emoji(id)) || [] + results = frequently.get(maxResults).map((id: number) => emojiIndex.emoji(id)) || [] } return results.map((emoji) => emoji.getSkin(currentSkinTone))