import { useState } from "react"; import { Icon } from "../../../components/Icon"; import { AdaptersDrawer, AdaptersRail } from "./AdaptersNav"; import { PLATFORM_LABEL } from "../channelFields"; import { platformOf } from "./channelUtils"; import { useAdapterNav, type AdapterNav } from "./useAdapterNav"; import { OverviewPage } from "./OverviewPage"; import { CreatePage } from "./CreatePage"; import { ListPage } from "./ListPage"; import { GlobalLogPage } from "./GlobalLogPage"; import { AdapterDetailPage } from "./AdapterDetailPage"; /** Title for the mobile sub-nav bar; also echoed by the rail when in a detail page. */ function pageTitle(nav: AdapterNav): string { if (nav.kind === "detail") { const platform = platformOf(nav.adapter); return `${PLATFORM_LABEL[platform] ?? platform} · ${nav.adapter}`; } switch (nav.page) { case "create": return "新建适配器"; case "list": return "活动适配器"; case "log": return "模块总日志"; default: return "活动总览"; } } function renderPage(nav: AdapterNav, navigate: (n: AdapterNav) => void): React.ReactNode { if (nav.kind === "detail") { return navigate({ kind: "page", page: "list" })} />; } switch (nav.page) { case "create": return ; case "list": return ; case "log": return ; default: return ; } } /** Adapter module shell: sub-sidebar + 4 pages, sub-routed by the location hash * (design/17 §1). Desktop keeps the rail sticky at the top; mobile (<768px) * collapses it into a drawer opened from a hamburger in the page title bar. */ export function ChannelsModule(): React.ReactNode { const { nav, navigate } = useAdapterNav(); const [drawerOpen, setDrawerOpen] = useState(false); return (

{pageTitle(nav)}

{renderPage(nav, navigate)}
{ navigate(n); setDrawerOpen(false); }} onClose={() => setDrawerOpen(false)} />
); }