diff --git a/frontend/src/components/EmojiPicker.tsx b/frontend/src/components/EmojiPicker.tsx index 828b43d..6ec692b 100644 --- a/frontend/src/components/EmojiPicker.tsx +++ b/frontend/src/components/EmojiPicker.tsx @@ -2,6 +2,7 @@ import { useMemo, useState } from 'react' import { useEscapeKey } from '../hooks/useEscapeKey' import { ALL_EMOJI, EMOJI_CATEGORIES } from '../lib/emoji' import { EMOJI_NAMES } from '../lib/emojiNames' +import { getRecentEmoji, recordEmojiUsed } from '../lib/recentEmoji' import './EmojiPicker.css' interface EmojiPickerProps { @@ -39,6 +40,16 @@ export function EmojiPicker({ onPick, onClose, placement = 'below', align = 'lef const [query, setQuery] = useState('') const searchResults = useMemo(() => searchEmoji(query), [query]) const searching = query.trim().length > 0 + // A snapshot taken once when the picker opens, not live-updating as picks + // happen within this same session -- picking an emoji always closes the + // picker (see Composer.tsx/MessageList.tsx), so there's never a second + // pick in the same open session to show an updated list to. + const [recent] = useState(getRecentEmoji) + + function pick(emoji: string) { + recordEmojiUsed(emoji) + onPick(emoji) + } return ( <> @@ -65,7 +76,7 @@ export function EmojiPicker({ onPick, onClose, placement = 'below', align = 'lef role="menuitem" className="emoji-picker-item" title={EMOJI_NAMES[emoji]?.name} - onClick={() => onPick(emoji)} + onClick={() => pick(emoji)} > {emoji} @@ -75,25 +86,46 @@ export function EmojiPicker({ onPick, onClose, placement = 'below', align = 'lef