import clsx from 'clsx'; import React from 'react'; import { TransitionMotion, spring } from 'react-motion'; import { Icon } from 'soapbox/components/ui'; import EmojiPickerDropdown from 'soapbox/features/compose/components/emoji-picker/emoji-picker-dropdown'; import { useSettings } from 'soapbox/hooks'; import Reaction from './reaction'; import type { List as ImmutableList, Map as ImmutableMap } from 'immutable'; import type { Emoji } from 'soapbox/components/autosuggest-emoji'; import type { AnnouncementReaction } from 'soapbox/types/entities'; interface IReactionsBar { announcementId: string reactions: ImmutableList emojiMap: ImmutableMap> addReaction: (id: string, name: string) => void removeReaction: (id: string, name: string) => void } const ReactionsBar: React.FC = ({ announcementId, reactions, addReaction, removeReaction, emojiMap }) => { const reduceMotion = useSettings().get('reduceMotion'); const handleEmojiPick = (data: Emoji) => { addReaction(announcementId, data.native.replace(/:/g, '')); }; const willEnter = () => ({ scale: reduceMotion ? 1 : 0 }); const willLeave = () => ({ scale: reduceMotion ? 0 : spring(0, { stiffness: 170, damping: 26 }) }); const visibleReactions = reactions.filter(x => x.count > 0); const styles = visibleReactions.map(reaction => ({ key: reaction.name, data: reaction, style: { scale: reduceMotion ? 1 : spring(1, { stiffness: 150, damping: 13 }) }, })).toArray(); return ( {items => (
{items.map(({ key, data, style }) => ( ))} {visibleReactions.size < 8 && } />}
)}
); }; export default ReactionsBar;