diff --git a/src/app/features/room/RoomViewHeader.tsx b/src/app/features/room/RoomViewHeader.tsx index 9e102f30..8dc27581 100644 --- a/src/app/features/room/RoomViewHeader.tsx +++ b/src/app/features/room/RoomViewHeader.tsx @@ -21,11 +21,12 @@ import { RectCords, Badge, Spinner, -} from 'folds'; +} from 'folds'; // Assuming 'folds' is your UI library 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'; @@ -40,7 +41,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'; +import * as css from './RoomViewHeader.css'; // Assuming CSS Modules import { useRoomUnread } from '../../state/hooks/unread'; import { usePowerLevelsAPI, usePowerLevelsContext } from '../../hooks/usePowerLevels'; import { markAsRead } from '../../../client/action/notifications'; @@ -66,11 +67,14 @@ 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); @@ -209,7 +213,9 @@ const RoomMenu = forwardRef(({ room, requestClose ); }); +// --- RoomViewHeader Component --- export function RoomViewHeader() { + // --- Hooks --- const navigate = useNavigate(); const mx = useMatrixClient(); const useAuthentication = useMediaAuthentication(); @@ -232,19 +238,22 @@ export function RoomViewHeader() { const setPeopleDrawer = useSetSetting(settingsAtom, 'isPeopleDrawer'); - // 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 + // --- Event Handlers --- const isDirectMessage = () => { + // Simplified check - consider optimizing if performance is an issue const mDirectsEvent = mx.getAccountData('m.direct'); const { roomId } = room; return ( - Object.values(mDirectsEvent?.event.content).filter((e) => { - if (e.indexOf(roomId) === 0) return true; - }).length !== 0 + !!mDirectsEvent?.event.content && + Object.values(mDirectsEvent.event.content).flat().includes(roomId) ); }; const handleCall: MouseEventHandler = (evt) => { - setMenuAnchor(evt.currentTarget.getBoundingClientRect()); + // 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()); }; const handleSearchClick = () => { @@ -265,21 +274,29 @@ export function RoomViewHeader() { setPinMenuAnchor(evt.currentTarget.getBoundingClientRect()); }; + // --- Render --- return ( + // Use PageHeader component for consistent header styling - - {screenSize === ScreenSize.Mobile && ( - - {(onBack) => ( - + {/* 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) => ( - - )} - - )} - + )} + + )} + {/* 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} + className={css.HeaderTopic} // Apply specific styles if needed size="T200" priority="300" truncate @@ -338,8 +359,18 @@ 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 && ( )} - setPinMenuAnchor(undefined), - clickOutsideDeactivates: true, - isKeyForward: (evt: KeyboardEvent) => evt.key === 'ArrowDown', - isKeyBackward: (evt: KeyboardEvent) => evt.key === 'ArrowUp', - escapeDeactivates: stopPropagation, - }} - > - setPinMenuAnchor(undefined)} /> - - } - /> - + {/* Members button, shown only on desktop */} {screenSize === ScreenSize.Desktop && ( )} + {/* More Options button */} )} - setMenuAnchor(undefined), - clickOutsideDeactivates: true, - isKeyForward: (evt: KeyboardEvent) => evt.key === 'ArrowDown', - isKeyBackward: (evt: KeyboardEvent) => evt.key === 'ArrowUp', - escapeDeactivates: stopPropagation, - }} - > - setMenuAnchor(undefined)} /> - - } - /> - - + {' '} + {/* --- 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 --- */} ); }