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, diff --git a/src/tools/lorem-ipsum-generator/lorem-ipsum-generator.vue b/src/tools/lorem-ipsum-generator/lorem-ipsum-generator.vue index 9085725f..ccd8b519 100644 --- a/src/tools/lorem-ipsum-generator/lorem-ipsum-generator.vue +++ b/src/tools/lorem-ipsum-generator/lorem-ipsum-generator.vue @@ -2,6 +2,7 @@ import { generateLoremIpsum } from './lorem-ipsum-generator.service'; import { useCopy } from '@/composable/copy'; import { randIntFromInterval } from '@/utils/random'; +import { computedRefreshable } from '@/composable/computedRefreshable'; const paragraphs = ref(1); const sentences = ref([3, 8]); @@ -9,7 +10,7 @@ const words = ref([8, 15]); const startWithLoremIpsum = ref(true); const asHTML = ref(false); -const loremIpsumText = computed(() => +const [loremIpsumText, refreshLoremIpsum] = computedRefreshable(() => generateLoremIpsum({ paragraphCount: paragraphs.value, asHTML: asHTML.value, @@ -18,6 +19,7 @@ const loremIpsumText = computed(() => startWithLoremIpsum: startWithLoremIpsum.value, }), ); + const { copy } = useCopy({ source: loremIpsumText, text: 'Lorem ipsum copied to the clipboard' }); @@ -41,10 +43,13 @@ const { copy } = useCopy({ source: loremIpsumText, text: 'Lorem ipsum copied to -
+
Copy + + Refresh +