import React, { useMemo } from 'react'; import { Box, Text, as } from 'folds'; import { Room } from 'matrix-js-sdk'; import classNames from 'classnames'; import { useAtomValue } from 'jotai'; import { roomIdToTypingMembersAtom, selectRoomTypingMembersAtom } from '../../state/typingMembers'; import { TypingIndicator } from '../../components/typing-indicator'; import { getMemberDisplayName } from '../../utils/room'; import { getMxIdLocalPart } from '../../utils/matrix'; import * as css from './RoomViewTyping.css'; import { useMatrixClient } from '../../hooks/useMatrixClient'; export type RoomViewTypingProps = { room: Room; }; export const RoomViewTyping = as<'div', RoomViewTypingProps>( ({ className, room, ...props }, ref) => { const mx = useMatrixClient(); const typingMembers = useAtomValue( useMemo(() => selectRoomTypingMembersAtom(room.roomId, roomIdToTypingMembersAtom), [room]) ); const typingNames = typingMembers .filter((member) => member.userId !== mx.getUserId()) .map((member) => getMemberDisplayName(room, member.userId) ?? getMxIdLocalPart(member.userId)) .reverse(); if (typingNames.length === 0) { return null; } return ( {typingNames.length === 1 && ( <> {typingNames[0]} {' is typing...'} )} {typingNames.length === 2 && ( <> {typingNames[0]} {' and '} {typingNames[1]} {' are typing...'} )} {typingNames.length === 3 && ( <> {typingNames[0]} {', '} {typingNames[1]} {' and '} {typingNames[2]} {' are typing...'} )} {typingNames.length > 3 && ( <> {typingNames[0]} {', '} {typingNames[1]} {', '} {typingNames[2]} {' and '} {typingNames.length - 3} others {' are typing...'} )} ); } );