Bluesky app fork with some witchin' additions 馃挮
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

at main 40 lines 1.1 kB view raw
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}