import { CallMembership, SessionMembershipData } from 'matrix-js-sdk/lib/matrixrtc/CallMembership'; import React, { useState } from 'react'; import { Avatar, Box, Icon, Icons, Text } from 'folds'; import { useMatrixClient } from '../../hooks/useMatrixClient'; import { useMediaAuthentication } from '../../hooks/useMediaAuthentication'; import { useOpenUserRoomProfile } from '../../state/hooks/userRoomProfile'; import { SequenceCard } from '../../components/sequence-card'; import { getMemberAvatarMxc, getMemberDisplayName } from '../../utils/room'; import { useRoom } from '../../hooks/useRoom'; import { getMxIdLocalPart, mxcUrlToHttp } from '../../utils/matrix'; import { UserAvatar } from '../../components/user-avatar'; import { getMouseEventCords } from '../../utils/dom'; import * as css from './styles.css'; interface MemberWithMembershipData { membershipData?: SessionMembershipData & { 'm.call.intent': 'video' | 'audio'; }; } type CallMemberCardProps = { member: CallMembership; }; export function CallMemberCard({ member }: CallMemberCardProps) { const mx = useMatrixClient(); const useAuthentication = useMediaAuthentication(); const room = useRoom(); const openUserProfile = useOpenUserRoomProfile(); const userId = member.sender; if (!userId) return null; const name = getMemberDisplayName(room, userId) ?? getMxIdLocalPart(userId) ?? userId; const avatarMxc = getMemberAvatarMxc(room, userId); const avatarUrl = avatarMxc ? mxcUrlToHttp(mx, avatarMxc, useAuthentication, 96, 96) ?? undefined : undefined; const audioOnly = (member as unknown as MemberWithMembershipData).membershipData?.['m.call.intent'] === 'audio'; return ( openUserProfile( room.roomId, undefined, userId, getMouseEventCords(evt.nativeEvent), 'Right' ) } > } /> {name} {audioOnly && } ); } export function CallMemberRenderer({ members, max = 4, }: { members: CallMembership[]; max?: number; }) { const [viewMore, setViewMore] = useState(false); const truncatedMembers = viewMore ? members : members.slice(0, 4); const remaining = members.length - truncatedMembers.length; return ( <> {truncatedMembers.map((member) => ( ))} {members.length > max && ( setViewMore(!viewMore)} > {viewMore ? ( Collapse ) : ( {remaining === 0 ? `+${remaining} Other` : `+${remaining} Others`} )} )} ); }