feat: Implement forum feed layout and refactor space navigation logic to support new routing structure
This commit is contained in:
@@ -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>
|
||||
);
|
||||
}
|
||||
|
||||
6
src/app/features/forum/ForumFeedPage.tsx
Normal file
6
src/app/features/forum/ForumFeedPage.tsx
Normal 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 />;
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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';
|
||||
|
||||
Reference in New Issue
Block a user