import React, { useState } from 'react'; import { Box, Icon, Icons, Modal, Overlay, OverlayBackdrop, OverlayCenter, Text, as, config, } from 'folds'; import { Room } from 'matrix-js-sdk'; import classNames from 'classnames'; import FocusTrap from 'focus-trap-react'; import { getMemberDisplayName } from '../../utils/room'; import { getMxIdLocalPart } from '../../utils/matrix'; import * as css from './RoomViewFollowing.css'; import { useMatrixClient } from '../../hooks/useMatrixClient'; import { useRoomLatestRenderedEvent } from '../../hooks/useRoomLatestRenderedEvent'; import { useRoomEventReaders } from '../../hooks/useRoomEventReaders'; import { EventReaders } from '../../components/event-readers'; export type RoomViewFollowingProps = { room: Room; }; export const RoomViewFollowing = as<'div', RoomViewFollowingProps>( ({ className, room, ...props }, ref) => { const mx = useMatrixClient(); const [open, setOpen] = useState(false); const latestEvent = useRoomLatestRenderedEvent(room); const latestEventReaders = useRoomEventReaders(room, latestEvent?.getId()); const names = latestEventReaders .filter((readerId) => readerId !== mx.getUserId()) .map( (readerId) => getMemberDisplayName(room, readerId) ?? getMxIdLocalPart(readerId) ?? readerId ); const eventId = latestEvent?.getId(); return ( <> {eventId && ( }> setOpen(false), clickOutsideDeactivates: true, }} > setOpen(false)} /> )} 0 ? 'button' : 'div'} onClick={names.length > 0 ? () => setOpen(true) : undefined} className={classNames(css.RoomViewFollowing({ clickable: names.length > 0 }), className)} alignItems="Center" justifyContent="End" gap="200" {...props} ref={ref} > {names.length > 0 && ( <> {names.length === 1 && ( <> {names[0]} {' is following the conversation.'} )} {names.length === 2 && ( <> {names[0]} {' and '} {names[1]} {' are following the conversation.'} )} {names.length === 3 && ( <> {names[0]} {', '} {names[1]} {' and '} {names[2]} {' are following the conversation.'} )} {names.length > 3 && ( <> {names[0]} {', '} {names[1]} {', '} {names[2]} {' and '} {names.length - 3} others {' are following the conversation.'} )} )} ); } );