import React from 'react'; import classNames from 'classnames'; import { Avatar, Box, Header, Icon, IconButton, Icons, MenuItem, Scroll, Text, as, config, } from 'folds'; import { Room } from 'matrix-js-sdk'; import { useRoomEventReaders } from '../../hooks/useRoomEventReaders'; import * as css from './EventReaders.css'; import { useMatrixClient } from '../../hooks/useMatrixClient'; import { UserAvatar } from '../user-avatar'; import { useMemberAvatar } from '../../hooks/useMemberAvatar'; import { useOpenUserRoomProfile } from '../../state/hooks/userRoomProfile'; import { useSpaceOptionally } from '../../hooks/useSpace'; import { getMouseEventCords } from '../../utils/dom'; import { useSetting } from '../../state/hooks/settings'; import { settingsAtom } from '../../state/settings'; import { today, yesterday, timeHourMinute, timeMon, timeDay, timeYear } from '../../utils/time'; function formatReadTs(ts: number, hour24Clock: boolean): string { const timeStr = timeHourMinute(ts, hour24Clock); if (today(ts)) return `Today at ${timeStr}`; if (yesterday(ts)) return `Yesterday at ${timeStr}`; const sameYear = timeYear(ts) === timeYear(Date.now()); return sameYear ? `${timeMon(ts)} ${timeDay(ts)} at ${timeStr}` : `${timeMon(ts)} ${timeDay(ts)} ${timeYear(ts)} at ${timeStr}`; } type EventReaderItemProps = { room: Room; readerId: string; hour24Clock: boolean; lotusTerminal: boolean; onSelect: React.MouseEventHandler; }; function EventReaderItem({ room, readerId, hour24Clock, lotusTerminal, onSelect, }: EventReaderItemProps) { const { name, avatarUrl } = useMemberAvatar(room, readerId, 100, 100); const receiptTs = room.getReadReceiptForUserId(readerId)?.data.ts; return ( } /> } > {name} {receiptTs !== undefined && ( {formatReadTs(receiptTs, hour24Clock)} )} ); } export type EventReadersProps = { room: Room; eventId: string; requestClose: () => void; }; export const EventReaders = as<'div', EventReadersProps>( ({ className, room, eventId, requestClose, ...props }, ref) => { const mx = useMatrixClient(); const myUserId = mx.getUserId(); const latestEventReaders = useRoomEventReaders(room, eventId).filter((id) => id !== myUserId); const openProfile = useOpenUserRoomProfile(); const space = useSpaceOptionally(); const [hour24Clock] = useSetting(settingsAtom, 'hour24Clock'); const [lotusTerminal] = useSetting(settingsAtom, 'lotusTerminal'); return (
Seen by
{latestEventReaders.map((readerId) => ( { openProfile( room.roomId, space?.roomId, readerId, getMouseEventCords(event.nativeEvent), 'Bottom', ); }} /> ))}
); }, );