Hey is a decentralized and permissionless social media app built with Lens Protocol 馃尶
at main 67 lines 1.9 kB view raw
1import { EditorRegex } from "@hey/data/regex"; 2import type { Emoji } from "@hey/types/misc"; 3import { useEditor } from "prosekit/react"; 4import { 5 AutocompleteItem, 6 AutocompleteList, 7 AutocompletePopover 8} from "prosekit/react/autocomplete"; 9import { useState } from "react"; 10import cn from "@/helpers/cn"; 11import type { EditorExtension } from "@/helpers/prosekit/extension"; 12import useEmojis from "@/hooks/prosekit/useEmojis"; 13 14interface EmojiItemProps { 15 emoji: Emoji; 16 onSelect: VoidFunction; 17} 18 19const EmojiItem = ({ emoji, onSelect }: EmojiItemProps) => { 20 return ( 21 <AutocompleteItem 22 className="focusable-dropdown-item m-1 block cursor-pointer rounded-lg p-2 outline-hidden" 23 onSelect={onSelect} 24 > 25 <div className="flex items-center space-x-2"> 26 <span className="text-base">{emoji.emoji}</span> 27 <span className="text-sm capitalize"> 28 {emoji.aliases[0].split("_").join(" ")} 29 </span> 30 </div> 31 </AutocompleteItem> 32 ); 33}; 34 35const EmojiPicker = () => { 36 const editor = useEditor<EditorExtension>(); 37 const [query, setQuery] = useState(""); 38 const { emojis } = useEmojis({ query }); 39 40 const handleInsert = (emoji: Emoji) => { 41 editor.commands.insertText({ text: emoji.emoji }); 42 }; 43 44 return ( 45 <AutocompletePopover 46 className={cn( 47 "z-10 w-52 select-none rounded-xl border border-gray-200 bg-white shadow-xs dark:border-gray-700 dark:bg-gray-900", 48 !emojis.length && "hidden" 49 )} 50 offset={10} 51 onQueryChange={setQuery} 52 regex={EditorRegex.emoji} 53 > 54 <AutocompleteList filter={null}> 55 {emojis.map((emoji) => ( 56 <EmojiItem 57 emoji={emoji} 58 key={emoji.emoji} 59 onSelect={() => handleInsert(emoji)} 60 /> 61 ))} 62 </AutocompleteList> 63 </AutocompletePopover> 64 ); 65}; 66 67export default EmojiPicker;