import { useLongPress } from '@uidotdev/usehooks'; import clsx from 'clsx'; import { EmojiReaction } from 'pl-api'; import React from 'react'; import { defineMessages, useIntl } from 'react-intl'; import { emojiReact, unEmojiReact } from 'pl-fe/actions/emoji-reacts'; import { openModal } from 'pl-fe/actions/modals'; import EmojiPickerDropdown from 'pl-fe/features/emoji/containers/emoji-picker-dropdown-container'; import unicodeMapping from 'pl-fe/features/emoji/mapping'; import { useAppDispatch, useLoggedIn, useSettings } from 'pl-fe/hooks'; import AnimatedNumber from './animated-number'; import { Emoji, HStack, Icon, Text } from './ui'; import type { Emoji as EmojiType } from 'pl-fe/features/emoji'; import type { SelectedStatus } from 'pl-fe/selectors'; const messages = defineMessages({ emojiCount: { id: 'status.reactions.label', defaultMessage: '{count} {count, plural, one {person} other {people}} reacted with {emoji}' }, addEmoji: { id: 'emoji_button.label', defaultMessage: 'Insert emoji' }, }); interface IStatusReactionsBar { status: Pick; collapsed?: boolean; } interface IStatusReaction { status: Pick; reaction: EmojiReaction; obfuscate?: boolean; unauthenticated?: boolean; } const StatusReaction: React.FC = ({ reaction, status, obfuscate, unauthenticated }) => { const dispatch = useAppDispatch(); const intl = useIntl(); const bind = useLongPress((e) => { if (e.type !== 'touchstart') return; e.stopPropagation(); dispatch(openModal('REACTIONS', { statusId: status.id, reaction: reaction.name })); }); if (!reaction.count) return null; const handleClick: React.MouseEventHandler = (e) => { e.stopPropagation(); if (unauthenticated) { dispatch(openModal('REACTIONS', { statusId: status.id, reaction: reaction.name })); } else if (reaction.me) { dispatch(unEmojiReact(status, reaction.name)); } else { dispatch(emojiReact(status, reaction.name, reaction.url)); } }; let shortCode = reaction.name; // @ts-ignore if (unicodeMapping[shortCode]?.shortcode) { // @ts-ignore shortCode = unicodeMapping[shortCode].shortcode; } return ( ); }; const StatusReactionsBar: React.FC = ({ status, collapsed }) => { const dispatch = useAppDispatch(); const intl = useIntl(); const { me } = useLoggedIn(); const { demetricator } = useSettings(); const handlePickEmoji = (emoji: EmojiType) => { dispatch(emojiReact(status, emoji.custom ? emoji.id : emoji.native, emoji.custom ? emoji.imageUrl : undefined)); }; if ((demetricator || status.emoji_reactions.length === 0) && collapsed) return null; const sortedReactions = status.emoji_reactions.toSorted((a, b) => (b.count || 0) - (a.count || 0)); return ( {sortedReactions.map((reaction) => reaction.count ? ( ) : null)} {me && ( )} ); }; export { StatusReactionsBar as default };