import { Colors } from "constants/Colors"; import React from "react"; import styled from "styled-components"; import EmojiPicker from "./EmojiPicker"; import { IconSize } from "./Icon"; import TooltipComponent from "./Tooltip"; const Container = styled.div` display: flex; flex-wrap: wrap; `; const Bubble = styled.div<{ active?: boolean }>` font-size: 12px; // emoji cursor: pointer; display: flex; align-items: center; padding: ${(props) => `2px ${props.theme.spaces[1]}px`}; background-color: ${(props) => props.active ? props.theme.colors.reactionsComponent.reactionBackgroundActive : props.theme.colors.reactionsComponent.reactionBackground}; ${(props) => !props.active && ` &:hover { background-color: ${Colors.GREY_3}; } `} border: 1px solid ${(props) => props.active ? props.theme.colors.reactionsComponent.borderActive : "transparent"}; border-radius: ${(props) => `${props.theme.radii[4]}px`}; margin-right: ${(props) => `${props.theme.radii[1]}px`}; & span.emoji { /* * center align emoji for non-retina displays * https://bugs.chromium.org/p/chromium/issues/detail?id=551420#c15 * ref: https://stackoverflow.com/a/31578187/1543567 (mq for non-retina displays) */ @media not screen and (-webkit-min-device-pixel-ratio: 2), not screen and (min--moz-device-pixel-ratio: 2), not screen and (-o-min-device-pixel-ratio: 2/1), not screen and (min-device-pixel-ratio: 2), not screen and (min-resolution: 192dpi), not screen and (min-resolution: 2dppx) { /* margin-right: 3px;*/ } } `; const Count = styled.div<{ active?: boolean }>` display: inline; color: ${(props) => props.active ? props.theme.colors.reactionsComponent.textActive : props.theme.colors.reactionsComponent.text}; max-width: 30px; text-overflow: ellipsis; overflow: hidden; white-space: nowrap; margin-left: 2px; ${(props) => !props.active && ` ${Bubble}: hover & { color: ${Colors.GREY_9}; } `} `; const ReactionsByContainer = styled.span` max-width: 200px; display: inline-block; `; function ReactionsBy(props: { reaction: Reaction }) { const { reaction } = props; if (!reaction?.users) return null; const isSliced = reaction?.users.length > 5; const users = reaction?.users.slice(0, 5); if (isSliced) users.push("..."); if (reaction.active) users.unshift("You"); return {users.join(", ")}; } export type Reaction = { count: number; reactionEmoji: string; active?: boolean; users?: Array; }; export type Reactions = Record; const transformReactions = (reactions: Reactions): Array => { return Object.keys(reactions).map((emojiReaction: string) => ({ ...reactions[emojiReaction], emojiReaction, })); }; export enum ReactionOperation { ADD = "ADD", REMOVE = "REMOVE", } function EmojiReactions({ onSelectReaction, reactions = {}, hideReactions = false, iconSize = IconSize.XXL, }: { onSelectReaction: ( event: React.MouseEvent, emojiData: string, updatedReactions: Reactions, addOrRemove: ReactionOperation, ) => void; reactions?: Reactions; hideReactions?: boolean; iconSize?: IconSize; }) { const handleSelectReaction = ( _event: React.MouseEvent, emojiData: string, ) => { const reactionsObject = reactions[emojiData]; let addOrRemove; if (reactionsObject) { if (reactionsObject.active) { addOrRemove = ReactionOperation.REMOVE; reactions[emojiData] = { active: false, reactionEmoji: emojiData, count: reactionsObject.count - 1, }; if (reactions[emojiData].count === 0) delete reactions[emojiData]; } else { addOrRemove = ReactionOperation.ADD; reactions[emojiData] = { active: true, reactionEmoji: emojiData, count: reactionsObject.count + 1, }; } } else { addOrRemove = ReactionOperation.ADD; reactions[emojiData] = { active: true, reactionEmoji: emojiData, count: 1, }; } onSelectReaction( _event, emojiData, { ...reactions }, addOrRemove as ReactionOperation, ); }; return ( {!hideReactions && transformReactions(reactions).map((reaction: Reaction) => ( } disabled={!reaction.users || reaction.users.length === 0} key={reaction.reactionEmoji} modifiers={{ preventOverflow: { enabled: true } }} > handleSelectReaction(e, reaction.reactionEmoji)} > {reaction.reactionEmoji} {reaction.count > 1 && ( {reaction.count} )} ))} {!hideReactions ? ( handleSelectReaction(e, emoji.native)} /> ) : ( handleSelectReaction(e, emoji.native)} /> )} ); } export default EmojiReactions;