Files
cinny/src/app/components/event-readers/EventReaders.tsx
T

95 lines
2.9 KiB
TypeScript
Raw Normal View History

2023-10-06 13:44:06 +11:00
import React from 'react';
import classNames from 'classnames';
import {
Avatar,
Box,
Header,
Icon,
IconButton,
Icons,
MenuItem,
Scroll,
Text,
as,
config,
} from 'folds';
2023-10-10 17:07:15 +11:00
import { Room } from 'matrix-js-sdk';
2023-10-06 13:44:06 +11:00
import { useRoomEventReaders } from '../../hooks/useRoomEventReaders';
import { getMemberDisplayName } from '../../utils/room';
import { getMxIdLocalPart } from '../../utils/matrix';
import * as css from './EventReaders.css';
import { useMatrixClient } from '../../hooks/useMatrixClient';
import { openProfileViewer } from '../../../client/action/navigation';
import { UserAvatar } from '../user-avatar';
2023-10-06 13:44:06 +11:00
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 latestEventReaders = useRoomEventReaders(room, eventId);
2023-10-10 17:07:15 +11:00
const getName = (userId: string) =>
getMemberDisplayName(room, userId) ?? getMxIdLocalPart(userId) ?? userId;
2023-10-06 13:44:06 +11:00
return (
<Box
className={classNames(css.EventReaders, className)}
direction="Column"
{...props}
ref={ref}
>
<Header className={css.Header} variant="Surface" size="600">
<Box grow="Yes">
<Text size="H3">Seen by</Text>
</Box>
<IconButton size="300" onClick={requestClose}>
<Icon src={Icons.Cross} />
</IconButton>
</Header>
<Box grow="Yes">
<Scroll visibility="Hover" hideTrack size="300">
<Box className={css.Content} direction="Column">
2023-10-10 17:07:15 +11:00
{latestEventReaders.map((readerId) => {
const name = getName(readerId);
const avatarUrl = room
.getMember(readerId)
?.getAvatarUrl(mx.baseUrl, 100, 100, 'crop', undefined, false);
2023-10-06 13:44:06 +11:00
return (
<MenuItem
2023-10-10 17:07:15 +11:00
key={readerId}
2023-10-06 13:44:06 +11:00
style={{ padding: `0 ${config.space.S200}` }}
radii="400"
onClick={() => {
requestClose();
2023-10-10 17:07:15 +11:00
openProfileViewer(readerId, room.roomId);
2023-10-06 13:44:06 +11:00
}}
before={
<Avatar size="200">
<UserAvatar
userId={readerId}
src={avatarUrl ?? undefined}
alt={name}
renderFallback={() => <Icon size="50" src={Icons.User} filled />}
/>
2023-10-06 13:44:06 +11:00
</Avatar>
}
>
<Text size="T400" truncate>
{name}
</Text>
</MenuItem>
);
})}
</Box>
</Scroll>
</Box>
</Box>
);
}
);