import { useEffect, useState } from "react"; import { Avatar, Modal, Popover, Tooltip } from "@douyinfe/semi-ui-19"; import { IconBeaker, IconChevronDown, IconClose, IconCommand, IconExit, IconGridView, IconList, IconMoon, IconSidebar, IconUser, } from "@douyinfe/semi-icons"; import type { Account } from "../types"; import type { WorkspacePage } from "../ai/workspace"; const navigation = [ { id: "datasets", label: "数据目录", icon: IconList, group: "数据与素材" }, { id: "operators", label: "算子库", icon: IconList, group: "数据与素材" }, { id: "templates", label: "模板工坊", icon: IconGridView, group: "数据与素材", }, { id: "features", label: "特征工程", icon: IconBeaker, group: "研究实验" }, { id: "variants", label: "Alpha 变体", icon: IconBeaker, group: "研究实验" }, { id: "backtests", label: "回测研究", icon: IconBeaker, group: "研究实验" }, { id: "pipeline", label: "研究流水线", icon: IconBeaker, group: "研究编排" }, { id: "alphas", label: "Alpha 管理", icon: IconGridView, group: "研究成果" }, { id: "account", label: "个人信息", icon: IconUser, group: "" }, ] as const; export function AppSidebar({ account, page, collapsed, blocked, onCollapse, onNavigate, onLogout, onTheme, }: { account: Account | null; page: WorkspacePage; collapsed: boolean; blocked: boolean; onCollapse: () => void; onNavigate: (page: WorkspacePage) => void; onLogout: () => void; onTheme: () => void; }) { const [userOpen, setUserOpen] = useState(false); const [commandOpen, setCommandOpen] = useState(false); const [recent, setRecent] = useState([page]); const name = account?.display_name || "研究员"; useEffect(() => { setRecent((old) => [page, ...old.filter((id) => id !== page)].slice(0, 4)); }, [page]); useEffect(() => { if (blocked) { setUserOpen(false); setCommandOpen(false); } const shortcut = (event: KeyboardEvent) => { if ( !blocked && (event.metaKey || event.ctrlKey) && event.key.toLowerCase() === "k" ) { event.preventDefault(); setCommandOpen((open) => !open); } }; window.addEventListener("keydown", shortcut); return () => window.removeEventListener("keydown", shortcut); }, [blocked]); function navigate(id: WorkspacePage) { setUserOpen(false); setCommandOpen(false); onNavigate(id); } function closeRecent(id: WorkspacePage) { if (recent.length <= 1) return; const next = recent.filter((item) => item !== id); setRecent(next); if (id === page) navigate(next[0]); } return ( <> setCommandOpen(false)} width={420} >
{navigation.map(({ id, label, icon: Icon }) => ( ))}
); }