1import { AppBar } from "../../components/ui/AppBar";
2import type { AppBarAction, AppBarMenu } from "../../components/ui/AppBar.types";
3import {
4 useAdaptiveWorkspaceLayout,
5 useWorkspacePaneState,
6} from "../layout/AdaptiveWorkspaceLayout";
7import type { ThreadInspectorMode } from "./thread-inspector-navigation";
8import { useWorkspaceBackNavigation } from "../layout/workspace/useAndroidWorkspaceNavigation";
9import {
10 threadTerminalMenu,
11 useThreadGitMenuDefinition,
12 type ThreadGitControlsProps,
13} from "./ThreadGitControls";
14
15export function ThreadHeader(props: {
16 readonly title: string;
17 readonly subtitle: string;
18 readonly gitControls: ThreadGitControlsProps;
19 readonly onReturnToThread?: () => void;
20 readonly draft?: boolean;
21 readonly hasThreadCwd: boolean;
22 readonly inspectorMode: ThreadInspectorMode | null;
23 readonly onOpenFilesInspector: () => void;
24}) {
25 const goBack = useWorkspaceBackNavigation();
26 const { toggleAuxiliaryPane, startNewTask } = useAdaptiveWorkspaceLayout();
27 const { panes } = useWorkspacePaneState();
28 const gitMenu = useThreadGitMenuDefinition(props.gitControls);
29 const terminalMenu = threadTerminalMenu(props.gitControls);
30 const filesVisible = props.inspectorMode === "files" && panes.auxiliaryPaneVisible;
31 const actions: AppBarAction[] = props.hasThreadCwd
32 ? [
33 {
34 accessibilityLabel: filesVisible ? "Close files" : "Open files",
35 icon: "folder",
36 selected: filesVisible,
37 disabled: !props.gitControls.canOpenFiles,
38 separateBackground: false,
39 onPress: filesVisible ? toggleAuxiliaryPane : props.onOpenFilesInspector,
40 },
41 ]
42 : [];
43 const menus = [gitMenu, terminalMenu].filter((menu): menu is AppBarMenu => menu !== null);
44
45 return (
46 <AppBar
47 title={props.title}
48 subtitle={props.subtitle}
49 onBackToList={goBack}
50 onCompose={props.draft ? undefined : startNewTask}
51 backInSplitView={
52 props.onReturnToThread
53 ? {
54 accessibilityLabel: "Return to chat",
55 icon: "chevron.left",
56 onPress: props.onReturnToThread,
57 }
58 : undefined
59 }
60 actions={actions}
61 menus={menus}
62 hideBottomBorder
63 />
64 );
65}