diff --git a/src/components/ui/emoji-selector.tsx b/src/components/ui/emoji-selector.tsx index 32303800f..ba06887bb 100644 --- a/src/components/ui/emoji-selector.tsx +++ b/src/components/ui/emoji-selector.tsx @@ -7,8 +7,10 @@ import { closeModal, openModal } from 'soapbox/actions/modals.ts'; import EmojiComponent from 'soapbox/components/ui/emoji.tsx'; import HStack from 'soapbox/components/ui/hstack.tsx'; import IconButton from 'soapbox/components/ui/icon-button.tsx'; -import EmojiPickerDropdown from 'soapbox/features/emoji/components/emoji-picker-dropdown.tsx'; +import EmojiPickerDropdown, { getFrequentlyUsedEmojis } from 'soapbox/features/emoji/components/emoji-picker-dropdown.tsx'; +import emojiData from 'soapbox/features/emoji/data.ts'; import { useAppDispatch } from 'soapbox/hooks/useAppDispatch.ts'; +import { useAppSelector } from 'soapbox/hooks/useAppSelector.ts'; import { useClickOutside } from 'soapbox/hooks/useClickOutside.ts'; import { useFeatures } from 'soapbox/hooks/useFeatures.ts'; import { useSoapboxConfig } from 'soapbox/hooks/useSoapboxConfig.ts'; @@ -67,8 +69,9 @@ const EmojiSelector: React.FC = ({ offsetOptions, all = true, }): JSX.Element => { - const soapboxConfig = useSoapboxConfig(); + const { allowedEmoji } = useSoapboxConfig(); const { customEmojiReacts } = useFeatures(); + const shortcodes = useAppSelector((state) => getFrequentlyUsedEmojis(state)); const dispatch = useAppDispatch(); const [expanded, setExpanded] = useState(false); @@ -113,6 +116,16 @@ const EmojiSelector: React.FC = ({ onClose?.(); }); + const recentEmojis = shortcodes.reduce((results, shortcode) => { + const emoji = emojiData.emojis[shortcode]?.skins[0]?.native; + if (emoji) { + results.push(emoji); + } + return results; + }, []); + + const emojis = new Set([...recentEmojis, ...allowedEmoji]); + return (
= ({ - {Array.from(soapboxConfig.allowedEmoji).map((emoji, i) => ( + {[...emojis].slice(0, 6).map((emoji, i) => (