import * as React from "react"; import { AnimatedCounter } from "../animated-counter"; import { stringToEmoji } from "../emoji-icon-picker"; import { AddReactionIcon } from "../icons"; import { Tooltip } from "../tooltip"; import { cn } from "../utils"; import { IconButton } from "../icon-button"; export interface EmojiReactionType { emoji: string; count: number; reacted?: boolean; users?: string[]; } export interface EmojiReactionProps extends React.ButtonHTMLAttributes { emoji: string; count: number; reacted?: boolean; users?: string[]; onReactionClick?: (emoji: string) => void; className?: string; showCount?: boolean; } export interface EmojiReactionGroupProps extends React.HTMLAttributes { reactions: EmojiReactionType[]; onReactionClick?: (emoji: string) => void; onAddReaction?: () => void; className?: string; showAddButton?: boolean; maxDisplayUsers?: number; } export interface EmojiReactionButtonProps extends React.ButtonHTMLAttributes { onAddReaction?: () => void; className?: string; } const EmojiReaction = React.forwardRef(function EmojiReaction( { emoji, count, reacted = false, users = [], onReactionClick, className, showCount = true, ...props }: EmojiReactionProps, ref: React.ForwardedRef ) { const handleClick = () => { onReactionClick?.(emoji); }; const tooltipContent = React.useMemo(() => { if (!users.length) return null; const displayUsers = users.slice(0, 5); const remainingCount = users.length - displayUsers.length; return (
{stringToEmoji(emoji)}
{displayUsers.join(", ")} {remainingCount > 0 && ` and ${remainingCount} more`}
); }, [emoji, users]); const button = ( ); if (tooltipContent && users.length > 0) { return {button}; } return button; }); const EmojiReactionButton = React.forwardRef(function EmojiReactionButton( { onAddReaction, className, ...props }: EmojiReactionButtonProps, ref: React.ForwardedRef ) { return ( ); }); const EmojiReactionGroup = React.forwardRef(function EmojiReactionGroup( { reactions, onReactionClick, onAddReaction, className, showAddButton = true, maxDisplayUsers = 5, ...props }: EmojiReactionGroupProps, ref: React.ForwardedRef ) { return (
{reactions.map((reaction, index) => ( ))} {showAddButton && }
); }); EmojiReaction.displayName = "EmojiReaction"; EmojiReactionButton.displayName = "EmojiReactionButton"; EmojiReactionGroup.displayName = "EmojiReactionGroup"; export { EmojiReaction, EmojiReactionButton, EmojiReactionGroup };