History

feat: add terminal toggle button to chat header (#633)

ANTI committed 7 months ago

Commit be1abc81 parent 384f3502 files · +41 −1Browse files

Unified · Split

2 files
  1. apps/web/src/components/ChatView.tsx +8 −0
  2. apps/web/src/components/chat/ChatHeader.tsx +33 −1
apps/web/src/components/ChatView.tsx+8−0
@@ -1119,6 +1119,10 @@ export default function ChatView({ threadId }: ChatViewProps) { · 1118 unmodified lines
11191119 }, [activeProjectCwd, activeThreadWorktreePath]);
11201120 // Default true while loading to avoid toolbar flicker.
11211121 const isGitRepo = branchesQuery.data?.isRepo ?? true;
1122+ const terminalToggleShortcutLabel = useMemo(
1123+ () => shortcutLabelForCommand(keybindings, "terminal.toggle"),
1124+ [keybindings],
1125+ );
11221126 const splitTerminalShortcutLabel = useMemo(
11231127 () => shortcutLabelForCommand(keybindings, "terminal.split"),
11241128 [keybindings],
@@ -3474,6 +3478,9 @@ export default function ChatView({ threadId }: ChatViewProps) { · 2349 unmodified lines
34743478 }
34753479 keybindings={keybindings}
34763480 availableEditors={availableEditors}
3481+ terminalAvailable={activeProject !== undefined}
3482+ terminalOpen={terminalState.terminalOpen}
3483+ terminalToggleShortcutLabel={terminalToggleShortcutLabel}
34773484 diffToggleShortcutLabel={diffPanelShortcutLabel}
34783485 gitCwd={gitCwd}
34793486 diffOpen={diffOpen}
@@ -3483,6 +3490,7 @@ export default function ChatView({ threadId }: ChatViewProps) { · 3 unmodified lines
34833490 onAddProjectScript={saveProjectScript}
34843491 onUpdateProjectScript={updateProjectScript}
34853492 onDeleteProjectScript={deleteProjectScript}
3493+ onToggleTerminal={toggleTerminalVisibility}
34863494 onToggleDiff={onToggleDiff}
34873495 />
34883496 </header>
apps/web/src/components/chat/ChatHeader.tsx+33−1
@@ -6,7 +6,7 @@ import { · 5 unmodified lines
66 } from "@t3tools/contracts";
77 import { memo } from "react";
88 import GitActionsControl from "../GitActionsControl";
9−import { DiffIcon } from "lucide-react";
9+import { DiffIcon, TerminalSquareIcon } from "lucide-react";
1010 import { Badge } from "../ui/badge";
1111 import { Tooltip, TooltipPopup, TooltipTrigger } from "../ui/tooltip";
1212 import ProjectScriptsControl, { type NewProjectScriptInput } from "../ProjectScriptsControl";
@@ -24,6 +24,9 @@ interface ChatHeaderProps { · 11 unmodified lines
2424 preferredScriptId: string | null;
2525 keybindings: ResolvedKeybindingsConfig;
2626 availableEditors: ReadonlyArray<EditorId>;
27+ terminalAvailable: boolean;
28+ terminalOpen: boolean;
29+ terminalToggleShortcutLabel: string | null;
2730 diffToggleShortcutLabel: string | null;
2831 gitCwd: string | null;
2932 diffOpen: boolean;
@@ -31,6 +34,7 @@ interface ChatHeaderProps { · 1 unmodified line
3134 onAddProjectScript: (input: NewProjectScriptInput) => Promise<void>;
3235 onUpdateProjectScript: (scriptId: string, input: NewProjectScriptInput) => Promise<void>;
3336 onDeleteProjectScript: (scriptId: string) => Promise<void>;
37+ onToggleTerminal: () => void;
3438 onToggleDiff: () => void;
3539 }
3640
@@ -44,6 +48,9 @@ export const ChatHeader = memo(function ChatHeader({ · 7 unmodified lines
4448 preferredScriptId,
4549 keybindings,
4650 availableEditors,
51+ terminalAvailable,
52+ terminalOpen,
53+ terminalToggleShortcutLabel,
4754 diffToggleShortcutLabel,
4855 gitCwd,
4956 diffOpen,
@@ -51,6 +58,7 @@ export const ChatHeader = memo(function ChatHeader({ · 1 unmodified line
5158 onAddProjectScript,
5259 onUpdateProjectScript,
5360 onDeleteProjectScript,
61+ onToggleTerminal,
5462 onToggleDiff,
5563 }: ChatHeaderProps) {
5664 return (
@@ -94,6 +102,30 @@ export const ChatHeader = memo(function ChatHeader({ · 37 unmodified lines
94102 />
95103 )}
96104 {activeProjectName && <GitActionsControl gitCwd={gitCwd} activeThreadId={activeThreadId} />}
105+ <Tooltip>
106+ <TooltipTrigger
107+ render={
108+ <Toggle
109+ className="shrink-0"
110+ pressed={terminalOpen}
111+ onPressedChange={onToggleTerminal}
112+ aria-label="Toggle terminal drawer"
113+ variant="outline"
114+ size="xs"
115+ disabled={!terminalAvailable}
116+ >
117+ <TerminalSquareIcon className="size-3" />
118+ </Toggle>
119+ }
120+ />
121+ <TooltipPopup side="bottom">
122+ {!terminalAvailable
123+ ? "Terminal is unavailable until this thread has an active project."
124+ : terminalToggleShortcutLabel
125+ ? `Toggle terminal drawer (${terminalToggleShortcutLabel})`
126+ : "Toggle terminal drawer"}
127+ </TooltipPopup>
128+ </Tooltip>
97129 <Tooltip>
98130 <TooltipTrigger
99131 render={