Skip to content

Commit be1abc8

Browse files
antiisaintjuliusmarmingecodex
authored
feat: add terminal toggle button to chat header (pingdotgg#633)
Co-authored-by: Julius Marminge <julius0216@outlook.com> Co-authored-by: codex <codex@users.noreply.github.com>
1 parent 384f350 commit be1abc8

File tree

2 files changed

+41
-1
lines changed

2 files changed

+41
-1
lines changed

apps/web/src/components/ChatView.tsx

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1119,6 +1119,10 @@ export default function ChatView({ threadId }: ChatViewProps) {
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) {
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) {
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

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import {
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,13 +24,17 @@ interface ChatHeaderProps {
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;
3033
onRunProjectScript: (script: ProjectScript) => void;
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,13 +48,17 @@ export const ChatHeader = memo(function ChatHeader({
4448
preferredScriptId,
4549
keybindings,
4650
availableEditors,
51+
terminalAvailable,
52+
terminalOpen,
53+
terminalToggleShortcutLabel,
4754
diffToggleShortcutLabel,
4855
gitCwd,
4956
diffOpen,
5057
onRunProjectScript,
5158
onAddProjectScript,
5259
onUpdateProjectScript,
5360
onDeleteProjectScript,
61+
onToggleTerminal,
5462
onToggleDiff,
5563
}: ChatHeaderProps) {
5664
return (
@@ -94,6 +102,30 @@ export const ChatHeader = memo(function ChatHeader({
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={

0 commit comments

Comments
 (0)