mirror of
https://github.com/cinnyapp/cinny.git
synced 2025-11-15 19:50:28 +03:00
* add hide activity toggle * stop sending/receiving typing status * send private read receipt when setting toggle is activated * prevent showing read-receipt when feature toggle in on
145 lines
4.9 KiB
TypeScript
145 lines
4.9 KiB
TypeScript
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';
|
|
import { stopPropagation } from '../../utils/keyboard';
|
|
|
|
export function RoomViewFollowingPlaceholder() {
|
|
return <div className={css.RoomViewFollowingPlaceholder} />;
|
|
}
|
|
|
|
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 && (
|
|
<Overlay open={open} backdrop={<OverlayBackdrop />}>
|
|
<OverlayCenter>
|
|
<FocusTrap
|
|
focusTrapOptions={{
|
|
initialFocus: false,
|
|
onDeactivate: () => setOpen(false),
|
|
clickOutsideDeactivates: true,
|
|
escapeDeactivates: stopPropagation,
|
|
}}
|
|
>
|
|
<Modal variant="Surface" size="300">
|
|
<EventReaders room={room} eventId={eventId} requestClose={() => setOpen(false)} />
|
|
</Modal>
|
|
</FocusTrap>
|
|
</OverlayCenter>
|
|
</Overlay>
|
|
)}
|
|
<Box
|
|
as={names.length > 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 && (
|
|
<>
|
|
<Icon style={{ opacity: config.opacity.P300 }} size="100" src={Icons.CheckTwice} />
|
|
<Text size="T300" truncate>
|
|
{names.length === 1 && (
|
|
<>
|
|
<b>{names[0]}</b>
|
|
<Text as="span" size="Inherit" priority="300">
|
|
{' is following the conversation.'}
|
|
</Text>
|
|
</>
|
|
)}
|
|
{names.length === 2 && (
|
|
<>
|
|
<b>{names[0]}</b>
|
|
<Text as="span" size="Inherit" priority="300">
|
|
{' and '}
|
|
</Text>
|
|
<b>{names[1]}</b>
|
|
<Text as="span" size="Inherit" priority="300">
|
|
{' are following the conversation.'}
|
|
</Text>
|
|
</>
|
|
)}
|
|
{names.length === 3 && (
|
|
<>
|
|
<b>{names[0]}</b>
|
|
<Text as="span" size="Inherit" priority="300">
|
|
{', '}
|
|
</Text>
|
|
<b>{names[1]}</b>
|
|
<Text as="span" size="Inherit" priority="300">
|
|
{' and '}
|
|
</Text>
|
|
<b>{names[2]}</b>
|
|
<Text as="span" size="Inherit" priority="300">
|
|
{' are following the conversation.'}
|
|
</Text>
|
|
</>
|
|
)}
|
|
{names.length > 3 && (
|
|
<>
|
|
<b>{names[0]}</b>
|
|
<Text as="span" size="Inherit" priority="300">
|
|
{', '}
|
|
</Text>
|
|
<b>{names[1]}</b>
|
|
<Text as="span" size="Inherit" priority="300">
|
|
{', '}
|
|
</Text>
|
|
<b>{names[2]}</b>
|
|
<Text as="span" size="Inherit" priority="300">
|
|
{' and '}
|
|
</Text>
|
|
<b>{names.length - 3} others</b>
|
|
<Text as="span" size="Inherit" priority="300">
|
|
{' are following the conversation.'}
|
|
</Text>
|
|
</>
|
|
)}
|
|
</Text>
|
|
</>
|
|
)}
|
|
</Box>
|
|
</>
|
|
);
|
|
}
|
|
);
|