import React from 'react'; import { Box, Icon, IconButton, Icons, Text, as } from 'folds'; import { Room } from 'matrix-js-sdk'; import classNames from 'classnames'; import { useTranslation } from 'react-i18next'; import { useSetAtom } from 'jotai'; import { roomIdToTypingMembersAtom } 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'; import { useRoomTypingMember } from '../../hooks/useRoomTypingMembers'; export type RoomViewTypingProps = { room: Room; }; export const RoomViewTyping = as<'div', RoomViewTypingProps>( ({ className, room, ...props }, ref) => { const { t } = useTranslation(); const setTypingMembers = useSetAtom(roomIdToTypingMembersAtom); const mx = useMatrixClient(); const typingMembers = useRoomTypingMember(room.roomId); const typingNames = typingMembers .filter((receipt) => receipt.userId !== mx.getUserId()) .map( (receipt) => getMemberDisplayName(room, receipt.userId) ?? getMxIdLocalPart(receipt.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((receipt) => setTypingMembers({ type: 'DELETE', roomId: room.roomId, userId: receipt.userId, }) ); }; return (
{typingNames.length === 1 && ( <> {typingNames[0]} {t('Room.is_typing')} )} {typingNames.length === 2 && ( <> {typingNames[0]} {t('Room.and')} {typingNames[1]} {t('Room.are_typing')} )} {typingNames.length === 3 && ( <> {typingNames[0]} {', '} {typingNames[1]} {t('Room.and')} {typingNames[2]} {t('Room.are_typing')} )} {typingNames.length > 3 && ( <> {typingNames[0]} {', '} {typingNames[1]} {', '} {typingNames[2]} {t('Room.and')} {t('Room.others_count', { count: typingNames.length - 3 })} {t('Room.are_typing')} )}
); } );