Bluesky app fork with some witchin' additions 馃挮
witchsky.app
bluesky
fork
client
1import {useCallback} from 'react'
2import {type Emoji} from '@emoji-mart/data'
3import Fuse from 'fuse.js'
4
5import {useGetEmojis} from '#/lib/useGetEmojis'
6import {type AutocompleteEmoji} from '#/components/Autocomplete/types'
7
8/*
9 * Lazily loaded Fuse instance for emoji search. Built once on first search,
10 * then reused for all subsequent searches.
11 */
12let emojiFuseInstance: Fuse<Emoji> | null = null
13
14export function useEmojiSearch(): (
15 query: string,
16 limit?: number,
17) => Promise<AutocompleteEmoji[]> {
18 const getEmojis = useGetEmojis()
19
20 return useCallback(
21 async (query: string, limit: number = 8) => {
22 if (!emojiFuseInstance) {
23 const data = await getEmojis()
24 emojiFuseInstance = new Fuse(Object.values(data.emojis), {
25 keys: ['search'],
26 threshold: 0.3,
27 })
28 }
29
30 const results = emojiFuseInstance.search(query, {limit})
31 return results.map(result => ({
32 key: result.item.id,
33 type: 'emoji' as const,
34 value: result.item.skins[0].native,
35 emoji: result.item,
36 }))
37 },
38 [getEmojis],
39 )
40}