import type {
ActiveUser,
AnnouncementSummary,
Board,
BoardModerator,
BoardSidebarStats,
BoardWithCount,
CheckinStatus,
NewUser,
OverviewStats,
PostListItem,
PublicAdItem,
PublicSponsorItem,
SidebarPageItem,
User,
UserProfile,
} from "@/lib/api";
import PostToc, { type TocItem } from "@/components/PostToc";
import { WorkspaceNavPanel } from "@/components/home/WorkspaceNav";
import {
PulseCard,
Announcements,
AdsPanel,
SponsorsPanel,
HotRanking,
NewUsers,
ActiveUsers,
FriendLinks,
AboutSite,
} from "@/components/home/CommunityPanels";
import {
Moderators,
BoardIntro,
BoardPulse,
BoardHot,
BoardActive,
} from "@/components/home/BoardPanels";
import {
BoardCard as PostBoardCard,
AuthorRailCard as PostAuthorCard,
AuthorPosts as PostAuthorPosts,
} from "@/components/post/PostRailBlocks";
// 侧栏块 props 汇总:页面把已有数据整包传入,块按需取用;
// 某块所需数据缺失(如板块态没传 stats)时对应块渲染为空,安全跳过。
export interface SidebarBlockProps {
allowComments: boolean;
user?: User | null;
checkin?: CheckinStatus | null;
// home 范围
boards?: BoardWithCount[];
stats?: OverviewStats;
announcements?: AnnouncementSummary[];
canManageAnnouncements?: boolean;
ads?: PublicAdItem[];
adsPanelTitle?: string;
adsEnabled?: boolean;
sponsors?: PublicSponsorItem[];
sponsorsPanelTitle?: string;
sponsorsEnabled?: boolean;
hot?: PostListItem[];
newUsers?: NewUser[];
activeUsers?: ActiveUser[];
sidebarPages?: SidebarPageItem[];
siteDescription?: string;
canManagePages?: boolean;
// board 范围
board?: BoardWithCount;
moderators?: BoardModerator[];
boardStats?: BoardSidebarStats;
boardHot?: PostListItem[];
boardActiveUsers?: ActiveUser[];
// post 范围
postBoard?: Board;
authorProfile?: UserProfile;
authorPosts?: PostListItem[];
toc?: TocItem[];
}
// 内置块注册表:key → 组件。数据未就绪或未知 key 返回 null(渲染层静默跳过)。
export function renderSidebarBlock(key: string, p: SidebarBlockProps) {
switch (key) {
case "board_nav":
return p.boards ? : null;
case "pulse":
return p.stats ? (
) : null;
case "announcements":
return p.announcements ? (
) : null;
case "ads":
return p.ads && p.adsEnabled !== false ? (
) : null;
case "sponsors":
return p.sponsors && p.sponsorsEnabled !== false ? (
) : null;
case "hot":
return p.hot ? : null;
case "new_users":
return p.newUsers ? : null;
case "active_users":
return p.activeUsers ? (
) : null;
case "friend_links":
return ;
case "about_site":
return p.sidebarPages || p.canManagePages ? (
) : null;
case "board_moderators":
return p.moderators ? : null;
case "board_intro":
return p.board ? : null;
case "board_pulse":
return p.boardStats ? (
) : null;
case "board_hot":
return p.boardHot ? (
) : null;
case "board_active":
return p.boardActiveUsers ? (
) : null;
case "post_board":
return p.postBoard ? : null;
case "post_author":
return p.authorProfile ? (
) : null;
case "post_author_posts":
return p.authorPosts ? : null;
case "post_toc":
return p.toc && p.toc.length > 0 ? : null;
default:
return null;
}
}