diff --git a/src/app/features/room/RoomViewHeader.tsx b/src/app/features/room/RoomViewHeader.tsx index 8dc27581..9e102f30 100644 --- a/src/app/features/room/RoomViewHeader.tsx +++ b/src/app/features/room/RoomViewHeader.tsx @@ -21,12 +21,11 @@ import { RectCords, Badge, Spinner, -} from 'folds'; // Assuming 'folds' is your UI library +} from 'folds'; import { useNavigate } from 'react-router-dom'; import { JoinRule, Room } from 'matrix-js-sdk'; import { useAtomValue } from 'jotai'; -// --- Required Imports (Adjust paths as needed) --- import { useStateEvent } from '../../hooks/useStateEvent'; import { PageHeader } from '../../components/page'; import { RoomAvatar, RoomIcon } from '../../components/room-avatar'; @@ -41,7 +40,7 @@ import { useSpaceOptionally } from '../../hooks/useSpace'; import { getHomeSearchPath, getSpaceSearchPath, withSearchParam } from '../../pages/pathUtils'; import { getCanonicalAliasOrRoomId, isRoomAlias, mxcUrlToHttp } from '../../utils/matrix'; import { _SearchPathSearchParams } from '../../pages/paths'; -import * as css from './RoomViewHeader.css'; // Assuming CSS Modules +import * as css from './RoomViewHeader.css'; import { useRoomUnread } from '../../state/hooks/unread'; import { usePowerLevelsAPI, usePowerLevelsContext } from '../../hooks/usePowerLevels'; import { markAsRead } from '../../../client/action/notifications'; @@ -67,14 +66,11 @@ import { useRoomsNotificationPreferencesContext, } from '../../hooks/useRoomsNotificationPreferences'; -// --- RoomMenu Component (Assuming it's defined elsewhere or here) --- -// (Include the RoomMenu component code from the previous snippet here if needed) type RoomMenuProps = { room: Room; requestClose: () => void; }; const RoomMenu = forwardRef(({ room, requestClose }, ref) => { - // ... (RoomMenu implementation from previous snippet) ... const mx = useMatrixClient(); const [hideActivity] = useSetting(settingsAtom, 'hideActivity'); const unread = useRoomUnread(room.roomId, roomToUnreadAtom); @@ -213,9 +209,7 @@ const RoomMenu = forwardRef(({ room, requestClose ); }); -// --- RoomViewHeader Component --- export function RoomViewHeader() { - // --- Hooks --- const navigate = useNavigate(); const mx = useMatrixClient(); const useAuthentication = useMediaAuthentication(); @@ -238,22 +232,19 @@ export function RoomViewHeader() { const setPeopleDrawer = useSetSetting(settingsAtom, 'isPeopleDrawer'); - // --- Event Handlers --- + // I assume there is a global state so I don't have to run this check every time but for now we'll stub this in const isDirectMessage = () => { - // Simplified check - consider optimizing if performance is an issue const mDirectsEvent = mx.getAccountData('m.direct'); const { roomId } = room; return ( - !!mDirectsEvent?.event.content && - Object.values(mDirectsEvent.event.content).flat().includes(roomId) + Object.values(mDirectsEvent?.event.content).filter((e) => { + if (e.indexOf(roomId) === 0) return true; + }).length !== 0 ); }; const handleCall: MouseEventHandler = (evt) => { - // Placeholder for call initiation logic - console.log('Initiate call'); - // Potentially set anchor for a call menu if needed, similar to other menus - // setMenuAnchor(evt.currentTarget.getBoundingClientRect()); + setMenuAnchor(evt.currentTarget.getBoundingClientRect()); }; const handleSearchClick = () => { @@ -274,29 +265,21 @@ export function RoomViewHeader() { setPinMenuAnchor(evt.currentTarget.getBoundingClientRect()); }; - // --- Render --- return ( - // Use PageHeader component for consistent header styling - {/* Main container Box: Uses Flexbox (row), aligns items vertically centered */} - - {' '} - {/* Adjust gap as needed */} - {/* --- LEFT GROUP --- */} - {/* This Box groups elements intended for the left side */} - {/* It takes only the width required by its content */} - - {/* Back button shown only on mobile */} - {screenSize === ScreenSize.Mobile && ( - - {(onBack) => ( + + {screenSize === ScreenSize.Mobile && ( + + {(onBack) => ( + - )} - - )} - {/* Avatar shown only on desktop */} + + )} + + )} + {screenSize !== ScreenSize.Mobile && ( )} - {/* Room name and topic */} {name} - {/* Topic is conditionally rendered and includes logic for an overlay */} {topic && ( {(viewTopic, setViewTopic) => ( <> - {/* Overlay for viewing full topic */} }> - {/* Clickable truncated topic text */} setViewTopic(true)} - className={css.HeaderTopic} // Apply specific styles if needed + className={css.HeaderTopic} size="T200" priority="300" truncate @@ -359,18 +338,8 @@ export function RoomViewHeader() { )} - {' '} - {/* --- END OF LEFT GROUP --- */} - {/* --- SPACER --- */} - {/* This empty Box has 'grow="Yes"', making it expand */} - {/* It pushes the Left Group and Right Group to opposite ends */} - - {/* --- RIGHT GROUP --- */} - {/* This Box groups elements intended for the right side */} - {/* 'shrink="No"' prevents it from collapsing if space is tight */} - {/* Items are vertically centered, gap adjusted for icons */} - - {/* Call button, shown only for Direct Messages */} + + {isDirectMessage() && ( )} - {/* Search button, hidden for encrypted rooms */} {!ecryptedRoom && ( )} - {/* Pinned Messages button */} {(triggerRef) => ( - {/* Badge showing pin count */} {pinnedEvents.length > 0 && ( )} - {/* Members button, shown only on desktop */} + setPinMenuAnchor(undefined), + clickOutsideDeactivates: true, + isKeyForward: (evt: KeyboardEvent) => evt.key === 'ArrowDown', + isKeyBackward: (evt: KeyboardEvent) => evt.key === 'ArrowUp', + escapeDeactivates: stopPropagation, + }} + > + setPinMenuAnchor(undefined)} /> + + } + /> + {screenSize === ScreenSize.Desktop && ( )} - {/* More Options button */} )} - {' '} - {/* --- END OF RIGHT GROUP --- */} - {/* PopOuts render their content outside the normal flow (usually via React Portals) */} - {/* They are placed here logically near their trigger buttons */} - - setPinMenuAnchor(undefined)} /> - - } - /> - - setMenuAnchor(undefined)} /> - - } - /> - {' '} - {/* --- END OF MAIN CONTAINER BOX --- */} + setMenuAnchor(undefined), + clickOutsideDeactivates: true, + isKeyForward: (evt: KeyboardEvent) => evt.key === 'ArrowDown', + isKeyBackward: (evt: KeyboardEvent) => evt.key === 'ArrowUp', + escapeDeactivates: stopPropagation, + }} + > + setMenuAnchor(undefined)} /> + + } + /> + + ); }