import React, { useMemo } from 'react'; import { Box, Icon, IconButton, Icons, Text, as } from 'folds'; import { Room } from 'matrix-js-sdk'; import classNames from 'classnames'; import { useAtomValue, useSetAtom } 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 setTypingMembers = useSetAtom(roomIdToTypingMembersAtom); 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; } const handleDropAll = () => { // some homeserver does not timeout typing status // we have given option so user can drop their typing status typingMembers.forEach((member) => setTypingMembers({ type: 'DELETE', roomId: room.roomId, member, }) ); }; 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...'} )} ); } );