From ab762c3e97c3087fa7de649f37643fbdea8f1b8c Mon Sep 17 00:00:00 2001 From: sharevb Date: Tue, 25 Jun 2024 08:52:18 +0200 Subject: [PATCH] fix(Emoji picker): fix lags Fix #1176 using debounced ref --- src/composable/debouncedref.ts | 21 +++++++++++++++++++++ src/tools/emoji-picker/emoji-picker.vue | 3 ++- 2 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 src/composable/debouncedref.ts diff --git a/src/composable/debouncedref.ts b/src/composable/debouncedref.ts new file mode 100644 index 00000000..09dd10e9 --- /dev/null +++ b/src/composable/debouncedref.ts @@ -0,0 +1,21 @@ +import _ from 'lodash'; + +function useDebouncedRef(initialValue: T, delay: number, immediate: boolean = false) { + const state = ref(initialValue); + const debouncedRef = customRef((track, trigger) => ({ + get() { + track(); + return state.value; + }, + set: _.debounce( + (value) => { + state.value = value; + trigger(); + }, + delay, + { leading: immediate }, + ), + })); + return debouncedRef; +} +export default useDebouncedRef; diff --git a/src/tools/emoji-picker/emoji-picker.vue b/src/tools/emoji-picker/emoji-picker.vue index 750695f5..a12b10c2 100644 --- a/src/tools/emoji-picker/emoji-picker.vue +++ b/src/tools/emoji-picker/emoji-picker.vue @@ -4,6 +4,7 @@ import emojiKeywords from 'emojilib'; import _ from 'lodash'; import type { EmojiInfo } from './emoji.types'; import { useFuzzySearch } from '@/composable/fuzzySearch'; +import useDebouncedRef from '@/composable/debouncedref'; const escapeUnicode = ({ emoji }: { emoji: string }) => emoji.split('').map(unit => `\\u${unit.charCodeAt(0).toString(16).padStart(4, '0')}`).join(''); const getEmojiCodePoints = ({ emoji }: { emoji: string }) => emoji.codePointAt(0) ? `0x${emoji.codePointAt(0)?.toString(16)}` : undefined; @@ -23,7 +24,7 @@ const emojisGroups: { emojiInfos: EmojiInfo[]; group: string }[] = _ .map((emojiInfos, group) => ({ group, emojiInfos })) .value(); -const searchQuery = ref(''); +const searchQuery = useDebouncedRef('', 500); const { searchResult } = useFuzzySearch({ search: searchQuery,