import React, { useCallback } from 'react'; import { Box, Line } from 'folds'; import { useParams } from 'react-router-dom'; import { isKeyHotkey } from 'is-hotkey'; import { useAtomValue } from 'jotai'; import { RoomView } from './RoomView'; import { MembersDrawer } from './MembersDrawer'; import { ScreenSize, useScreenSizeContext } from '../../hooks/useScreenSize'; import { useSetting } from '../../state/hooks/settings'; import { settingsAtom } from '../../state/settings'; import { PowerLevelsContextProvider, usePowerLevels } from '../../hooks/usePowerLevels'; import { useIsOneOnOne, useRoom } from '../../hooks/useRoom'; import { useKeyDown } from '../../hooks/useKeyDown'; import { markAsRead } from '../../utils/notifications'; import { useMatrixClient } from '../../hooks/useMatrixClient'; import { useRoomMembers } from '../../hooks/useRoomMembers'; import { CallView } from '../call/CallView'; import { RoomViewHeader } from './RoomViewHeader'; import { callChatAtom } from '../../state/callEmbed'; import { CallChatView } from './CallChatView'; type RoomProps = { renderRoomView?: (props: { eventId?: string }) => React.ReactNode; }; export function Room({ renderRoomView }: RoomProps) { const { eventId } = useParams(); const room = useRoom(); const mx = useMatrixClient(); const [isDrawer] = useSetting(settingsAtom, 'isPeopleDrawer'); const [hideActivity] = useSetting(settingsAtom, 'hideActivity'); const screenSize = useScreenSizeContext(); const powerLevels = usePowerLevels(room); const members = useRoomMembers(mx, room.roomId); const chat = useAtomValue(callChatAtom); // 1:1 rooms get peer-profile-sheet via avatar tap in the header instead of // the members drawer — see dm_1x1_redesign.md §8 P4 deliverable 9. The // value comes from the same `IsOneOnOneProvider` the header reads, so the // drawer-suppression and header chrome flip together when membership // changes (provider is reactive via `useIsOneOnOneRoom` upstream). const isOneOnOne = useIsOneOnOne(); useKeyDown( window, useCallback( (evt) => { if (isKeyHotkey('escape', evt)) { markAsRead(mx, room.roomId, hideActivity); } }, [mx, room.roomId, hideActivity] ) ); const callView = room.isCallRoom(); return ( {callView && (screenSize === ScreenSize.Desktop || !chat) && ( )} {!callView && ( {renderRoomView?.({ eventId }) ?? } )} {callView && chat && ( <> {screenSize === ScreenSize.Desktop && ( )} )} {!callView && !isOneOnOne && screenSize === ScreenSize.Desktop && isDrawer && ( <> )} ); }