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[]; // 板块 id → 名称/配色下标:板块管理员徽章展示「{板块名}板块管理员」并对齐板块色 boardNames?: Record; boardColors?: Record; } // 内置块注册表: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; } }