import {useState} from 'react' import {Pressable, View} from 'react-native' import {type ChatBskyConvoDefs} from '@atproto/api' import {useLingui} from '@lingui/react/macro' import {DropdownMenu} from 'radix-ui' import {useEnableSquareButtons} from '#/state/preferences/enable-square-buttons' import {useSession} from '#/state/session' import {atoms as a, flatten, useTheme} from '#/alf' import * as EmojiPicker from '#/components/EmojiPicker' import {DotGrid3x1_Stroke2_Corner0_Rounded as DotGridIcon} from '#/components/icons/DotGrid' import * as Menu from '#/components/Menu' import {Text} from '#/components/Typography' import {hasAlreadyReacted, hasReachedReactionLimit} from './util' export function EmojiReactionPicker({ message, children, onEmojiSelect, }: { message: ChatBskyConvoDefs.MessageView children?: EmojiPicker.TriggerProps['children'] onEmojiSelect: (emoji: string) => void }) { if (!children) throw new Error('EmojiReactionPicker requires the children prop on web') const {t: l} = useLingui() return ( onEmojiSelect(emoji.native)}> {children} ) } function MenuInner({ message, onEmojiSelect, }: { message: ChatBskyConvoDefs.MessageView onEmojiSelect: (emoji: string) => void }) { const t = useTheme() const {control} = Menu.useMenuContext() const {currentAccount} = useSession() const [expanded, setExpanded] = useState(false) const [prevOpen, setPrevOpen] = useState(control.isOpen) const enableSquareButtons = useEnableSquareButtons() if (control.isOpen !== prevOpen) { setPrevOpen(control.isOpen) if (!control.isOpen) { setExpanded(false) } } const handleEmojiSelect = (emoji: string) => { control.close() onEmojiSelect(emoji) } const limitReacted = hasReachedReactionLimit(message, currentAccount?.did) return expanded ? ( ) : ( {['👍', '😆', '❤️', '👀', '😢'].map(emoji => { const alreadyReacted = hasAlreadyReacted( message, currentAccount?.did, emoji, ) return ( handleEmojiSelect(emoji)} style={flatten([ a.flex, a.flex_col, enableSquareButtons ? a.rounded_sm : a.rounded_full, a.justify_center, a.align_center, a.transition_transform, { width: 34, height: 34, }, alreadyReacted && { backgroundColor: t.atoms.bg_contrast_100.backgroundColor, }, ])}> {emoji} ) })} setExpanded(true)} style={flatten([ enableSquareButtons ? a.rounded_sm : a.rounded_full, {height: 34, width: 34}, a.justify_center, a.align_center, ])}> ) }