feat: Implement forum feed layout and refactor space navigation logic to support new routing structure

This commit is contained in:
2026-07-06 15:35:21 +10:00
parent 09db721b7e
commit 3ee95a295d
17 changed files with 296 additions and 135 deletions

View File

@@ -1,15 +1,31 @@
import React from 'react';
import React, { useMemo } from 'react';
import { PageRoot } from '../../components/page';
import { AnimatedOutlet } from '../../components/AnimatedOutlet';
import { MobileFriendlyPageNav } from '../../pages/MobileFriendly';
import { SPACE_PATH } from '../../pages/paths';
import { Space } from '../../pages/client/space/Space';
import { useMatrixClient } from '../../hooks/useMatrixClient';
import { useSelectedRoom } from '../../hooks/router/useSelectedRoom';
import { useSpace } from '../../hooks/useSpace';
import { isForumContainer, shouldShowForumLobby } from '../../utils/room';
import { ForumBoardProvider } from './ForumBoardContext';
/**
* Space sidebar + outlet. Forum spaces render ForumFeedSidebar in Space.tsx.
*/
export function ForumAwareSpaceLayout() {
return (
const mx = useMatrixClient();
const space = useSpace();
const selectedRoomId = useSelectedRoom();
const scope = useMemo(() => {
const room = selectedRoomId ? mx.getRoom(selectedRoomId) : null;
const topicRoomId =
room && room.roomId !== space.roomId && !isForumContainer(room) ? room.roomId : undefined;
return { forumSpaceId: space.roomId, topicRoomId };
}, [mx, selectedRoomId, space.roomId]);
const layout = (
<PageRoot
nav={
<MobileFriendlyPageNav path={SPACE_PATH}>
@@ -20,4 +36,14 @@ export function ForumAwareSpaceLayout() {
<AnimatedOutlet />
</PageRoot>
);
if (!shouldShowForumLobby(space)) {
return layout;
}
return (
<ForumBoardProvider forumSpace={space} scope={scope}>
{layout}
</ForumBoardProvider>
);
}

View File

@@ -0,0 +1,6 @@
import { ForumBoardDetail } from './ForumBoardDetail';
/** Forum post feed in the main pane (sidebar holds filters + post list). */
export function ForumFeedPage() {
return <ForumBoardDetail />;
}

View File

@@ -1,30 +1,8 @@
import React, { ReactNode, useMemo } from 'react';
import { useMatrixClient } from '../../hooks/useMatrixClient';
import { useSelectedRoom } from '../../hooks/router/useSelectedRoom';
import { useSpace } from '../../hooks/useSpace';
import { isForumContainer, shouldShowForumLobby } from '../../utils/room';
import { ForumBoardProvider } from './ForumBoardContext';
import React, { ReactNode } from 'react';
/** Shares forum board state between space sidebar and lobby/room outlet. */
/**
* @deprecated Forum board context now lives in ForumAwareSpaceLayout.
*/
export function ForumSpaceLayout({ children }: { children: ReactNode }) {
const mx = useMatrixClient();
const space = useSpace();
const selectedRoomId = useSelectedRoom();
const scope = useMemo(() => {
const room = selectedRoomId ? mx.getRoom(selectedRoomId) : null;
const topicRoomId =
room && room.roomId !== space.roomId && !isForumContainer(room) ? room.roomId : undefined;
return { forumSpaceId: space.roomId, topicRoomId };
}, [mx, selectedRoomId, space.roomId]);
if (!shouldShowForumLobby(space)) {
return children;
}
return (
<ForumBoardProvider forumSpace={space} scope={scope}>
{children}
</ForumBoardProvider>
);
return children;
}

View File

@@ -3,6 +3,7 @@ export { ForumBoardDetail } from './ForumBoardDetail';
export { ForumSortIcons } from './forumLucideIcons';
export { ForumSpaceShell } from './ForumSpaceShell';
export { ForumThreadDetail } from './ForumThreadDetail';
export { ForumFeedPage } from './ForumFeedPage';
export { ForumAwareSpaceLayout } from './ForumAwareSpaceLayout';
export { ForumSpaceLayout } from './ForumSpaceLayout';
export type { ForumBoardScope } from './useForumBoard';