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; } export const RoomParticipantsPanel = memo(function RoomParticipantsPanel({ members, membersLoading, }: 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, }: { member: RoomMemberResponse; }) { const username = member.user_info?.username ?? member.user; const avatarUrl = member.user_info?.avatar_url; const displayName = username; const initial = (displayName?.[0] ?? '?').toUpperCase(); return (
{avatarUrl ? ( ) : null} {initial}

{displayName}

@{displayName}

); }