Skip to content

Commit b5b93ae

Browse files
authored
fix(app): toggle file tree and review panel better ux (#12481)
1 parent 4abf804 commit b5b93ae

5 files changed

Lines changed: 180 additions & 161 deletions

File tree

packages/app/src/components/session/session-header.tsx

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -544,11 +544,7 @@ export function SessionHeader() {
544544
<Button
545545
variant="ghost"
546546
class="group/file-tree-toggle size-6 p-0"
547-
onClick={() => {
548-
const opening = !layout.fileTree.opened()
549-
if (opening && !view().reviewPanel.opened()) view().reviewPanel.open()
550-
layout.fileTree.toggle()
551-
}}
547+
onClick={() => layout.fileTree.toggle()}
552548
aria-label={language.t("command.fileTree.toggle")}
553549
aria-expanded={layout.fileTree.opened()}
554550
aria-controls="file-tree-panel"

packages/app/src/components/settings-keybinds.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ function groupFor(id: string): KeybindGroup {
4444
if (id === PALETTE_ID) return "General"
4545
if (id.startsWith("terminal.")) return "Terminal"
4646
if (id.startsWith("model.") || id.startsWith("agent.") || id.startsWith("mcp.")) return "Model and agent"
47-
if (id.startsWith("file.")) return "Navigation"
47+
if (id.startsWith("file.") || id.startsWith("fileTree.")) return "Navigation"
4848
if (id.startsWith("prompt.")) return "Prompt"
4949
if (
5050
id.startsWith("session.") ||

packages/app/src/pages/session.tsx

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -233,7 +233,15 @@ export default function Page() {
233233
}
234234

235235
const isDesktop = createMediaQuery("(min-width: 768px)")
236-
const centered = createMemo(() => isDesktop() && !view().reviewPanel.opened())
236+
const desktopReviewOpen = createMemo(() => isDesktop() && view().reviewPanel.opened())
237+
const desktopFileTreeOpen = createMemo(() => isDesktop() && layout.fileTree.opened())
238+
const desktopSidePanelOpen = createMemo(() => desktopReviewOpen() || desktopFileTreeOpen())
239+
const sessionPanelWidth = createMemo(() => {
240+
if (!desktopSidePanelOpen()) return "100%"
241+
if (desktopReviewOpen()) return `${layout.session.width()}px`
242+
return `calc(100% - ${layout.fileTree.width()}px)`
243+
})
244+
const centered = createMemo(() => isDesktop() && !desktopSidePanelOpen())
237245

238246
function normalizeTab(tab: string) {
239247
if (!tab.startsWith("file://")) return tab
@@ -252,12 +260,18 @@ export default function Page() {
252260
return next
253261
}
254262

263+
const openReviewPanel = () => {
264+
if (!view().reviewPanel.opened()) view().reviewPanel.open()
265+
}
266+
255267
const openTab = (value: string) => {
256268
const next = normalizeTab(value)
257269
tabs().open(next)
258270

259271
const path = file.pathFromTab(next)
260-
if (path) file.load(path)
272+
if (!path) return
273+
file.load(path)
274+
openReviewPanel()
261275
}
262276

263277
createEffect(() => {
@@ -1085,6 +1099,7 @@ export default function Page() {
10851099
}
10861100

10871101
const focusReviewDiff = (path: string) => {
1102+
openReviewPanel()
10881103
const current = view().review.open() ?? []
10891104
if (!current.includes(path)) view().review.setOpen([...current, path])
10901105
setTree({ activeDiff: path, pendingDiff: path })
@@ -1203,7 +1218,7 @@ export default function Page() {
12031218
if (!id) return
12041219

12051220
const wants = isDesktop()
1206-
? view().reviewPanel.opened() && (layout.fileTree.opened() || activeTab() === "review")
1221+
? desktopFileTreeOpen() || (desktopReviewOpen() && activeTab() === "review")
12071222
: store.mobileTab === "changes"
12081223
if (!wants) return
12091224
if (sync.data.session_diff[id] !== undefined) return
@@ -1216,7 +1231,6 @@ export default function Page() {
12161231
createEffect(() => {
12171232
const dir = sdk.directory
12181233
if (!isDesktop()) return
1219-
if (!view().reviewPanel.opened()) return
12201234
if (!layout.fileTree.opened()) return
12211235
if (sync.status === "loading") return
12221236

@@ -1533,10 +1547,10 @@ export default function Page() {
15331547
classList={{
15341548
"@container relative shrink-0 flex flex-col min-h-0 h-full bg-background-stronger": true,
15351549
"flex-1 pt-2 md:pt-3": true,
1536-
"md:flex-none": view().reviewPanel.opened(),
1550+
"md:flex-none": desktopSidePanelOpen(),
15371551
}}
15381552
style={{
1539-
width: isDesktop() && view().reviewPanel.opened() ? `${layout.session.width()}px` : "100%",
1553+
width: sessionPanelWidth(),
15401554
"--prompt-height": store.promptHeight ? `${store.promptHeight}px` : undefined,
15411555
}}
15421556
>
@@ -1663,7 +1677,7 @@ export default function Page() {
16631677
setPromptDockRef={(el) => (promptDock = el)}
16641678
/>
16651679

1666-
<Show when={isDesktop() && view().reviewPanel.opened()}>
1680+
<Show when={desktopReviewOpen()}>
16671681
<ResizeHandle
16681682
direction="horizontal"
16691683
size={layout.session.width()}
@@ -1675,7 +1689,8 @@ export default function Page() {
16751689
</div>
16761690

16771691
<SessionSidePanel
1678-
open={isDesktop() && view().reviewPanel.opened()}
1692+
open={desktopSidePanelOpen()}
1693+
reviewOpen={desktopReviewOpen()}
16791694
language={language}
16801695
layout={layout}
16811696
command={command}

0 commit comments

Comments
 (0)