import { useMemo, memo } from 'react'; import type { RoomMemberResponse } from '@/client'; import { Avatar, AvatarFallback, AvatarImage } from '@/components/ui/avatar'; import { ScrollArea } from '@/components/ui/scroll-area'; import { cn } from '@/lib/utils'; import { Loader2, Shield, UserRound } from 'lucide-react'; import type { ReactNode } from 'react'; interface RoomParticipantsPanelProps { members: RoomMemberResponse[]; membersLoading: boolean; onMention?: (id: string, label: string, type: 'user' | 'ai') => void; } export const RoomParticipantsPanel = memo(function RoomParticipantsPanel({ members, membersLoading, onMention, }: RoomParticipantsPanelProps) { // Separate owners/admins from regular members const admins = useMemo( () => members.filter((m) => m.role === 'owner' || m.role === 'admin'), [members], ); const regular = useMemo( () => members.filter((m) => m.role === 'member' || m.role === 'guest'), [members], ); return ( ); }); function ParticipantSection({ title, icon, children, }: { title: string; icon: ReactNode; children: ReactNode; }) { return ( {icon} {title} {children} ); } function ParticipantRow({ member, onMention, }: { member: RoomMemberResponse; onMention?: (id: string, label: string, type: 'user' | 'ai') => void; }) { const username = member.user_info?.username ?? member.user; const avatarUrl = member.user_info?.avatar_url; const displayName = username; const initial = (displayName?.[0] ?? '?').toUpperCase(); return ( onMention?.(member.user, username, 'user')} disabled={!onMention} > {avatarUrl ? ( ) : null} {initial} {displayName} @{displayName} ); }
{displayName}
@{displayName}