"use client"; import { Tooltip, TooltipTrigger, TooltipContent } from "@multica/ui/components/ui/tooltip"; import { QuickEmojiPicker } from "./quick-emoji-picker"; interface ReactionItem { id: string; actor_type: string; actor_id: string; emoji: string; } interface GroupedReaction { emoji: string; count: number; reacted: boolean; actors: { type: string; id: string }[]; } function groupReactions(reactions: ReactionItem[], currentUserId?: string): GroupedReaction[] { const map = new Map(); for (const r of reactions) { let group = map.get(r.emoji); if (!group) { group = { emoji: r.emoji, count: 0, reacted: false, actors: [] }; map.set(r.emoji, group); } group.count++; group.actors.push({ type: r.actor_type, id: r.actor_id }); if (r.actor_type === "member" && r.actor_id === currentUserId) { group.reacted = true; } } return Array.from(map.values()); } interface ReactionBarProps { reactions: ReactionItem[]; currentUserId?: string; onToggle: (emoji: string) => void; getActorName: (type: string, id: string) => string; className?: string; hideAddButton?: boolean; } function ReactionBar({ reactions, currentUserId, onToggle, getActorName, className, hideAddButton, }: ReactionBarProps) { const grouped = groupReactions(reactions, currentUserId); return (
{grouped.map((g) => ( onToggle(g.emoji)} className={`inline-flex items-center gap-1 rounded-full border px-2 py-0.5 text-xs transition-colors hover:bg-brand/15 ${ g.reacted ? "border-brand/30 bg-brand/8 text-brand" : "border-brand/10 bg-brand/4 text-muted-foreground" }`} > {g.emoji} {g.count} } /> {g.actors.map((a) => getActorName(a.type, a.id)).join(", ")} ))} {!hideAddButton && }
); } export { ReactionBar, type ReactionBarProps, type ReactionItem };