diff --git a/package.json b/package.json index c6cb7757..d1e6e458 100644 --- a/package.json +++ b/package.json @@ -138,5 +138,6 @@ "vitest": "^0.34.0", "workbox-window": "^7.0.0", "zx": "^7.2.1" - } + }, + "packageManager": "pnpm@8.15.3" } 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,