import { useWorkspace } from "@/contexts/workspace-context"; import { NodeDef } from "@/misc/b3type"; import { Hotkey, isMacos } from "@/misc/keys"; import Path from "@/misc/path"; import { SearchOutlined } from "@ant-design/icons"; import { Button, Flex, LayoutProps, Select } from "antd"; import React, { FC, useMemo } from "react"; import { Menu } from "./menu"; interface OptionType { label: string | React.ReactNode; value: string; path?: string; nodeDef?: NodeDef; } export const TitleBar: FC = () => { const workspace = { allFiles: useWorkspace((state) => state.allFiles), fileTree: useWorkspace((state) => state.fileTree), nodeDefs: useWorkspace((state) => state.nodeDefs), isShowingSearch: useWorkspace((state) => state.isShowingSearch), onShowingSearch: useWorkspace((state) => state.onShowingSearch), onEditingNodeDef: useWorkspace((state) => state.onEditingNodeDef), open: useWorkspace((state) => state.open), name: useWorkspace((state) => state.path), relative: useWorkspace((state) => state.relative), }; const searchOptions = useMemo(() => { const options: OptionType[] = []; workspace.allFiles.forEach((file) => { const value = workspace.relative(file.path); const desc = file.desc ?? ""; options.push({ label: (
{Path.basename(value)} {Path.dirname(value)} {desc}
), value: `${value.toLocaleLowerCase()} ${desc.toLocaleLowerCase()}`, path: file.path, }); }); workspace.nodeDefs.forEach((def) => { const value = def.name; const desc = def.desc ?? ""; options.push({ label: (
{value} {desc}
), value: `${value.toLocaleLowerCase()} ${desc.toLocaleLowerCase()}`, nodeDef: def, }); }); return options; }, [workspace.allFiles, workspace.fileTree]); return (
{!isMacos && }
{workspace.isShowingSearch && (