summaryrefslogtreecommitdiffhomepage
path: root/packages/app/src/context
diff options
context:
space:
mode:
authorAdam <[email protected]>2026-02-05 13:51:08 -0600
committerGitHub <[email protected]>2026-02-05 13:51:08 -0600
commit83646e0366c47a3bccb5135d40628176a6776f33 (patch)
treecd8525d1a684a659e31a4413301577fac3f8fb63 /packages/app/src/context
parentc40ce47e92befbe4cb27735e4d870f540e75b646 (diff)
downloadopencode-83646e0366c47a3bccb5135d40628176a6776f33.tar.gz
opencode-83646e0366c47a3bccb5135d40628176a6776f33.zip
fix(app): allow toggling file tree closed independently (#12293)
Diffstat (limited to 'packages/app/src/context')
-rw-r--r--packages/app/src/context/layout.tsx62
1 files changed, 57 insertions, 5 deletions
diff --git a/packages/app/src/context/layout.tsx b/packages/app/src/context/layout.tsx
index e2fd0a7f4..95a2006ea 100644
--- a/packages/app/src/context/layout.tsx
+++ b/packages/app/src/context/layout.tsx
@@ -71,6 +71,7 @@ export const { use: useLayout, provider: LayoutProvider } = createSimpleContext(
}
})()
+ const review = value.review
const fileTree = value.fileTree
const migratedFileTree = (() => {
if (!isRecord(fileTree)) return fileTree
@@ -85,10 +86,22 @@ export const { use: useLayout, provider: LayoutProvider } = createSimpleContext(
}
})()
- if (migratedSidebar === sidebar && migratedFileTree === fileTree) return value
+ const migratedReview = (() => {
+ if (!isRecord(review)) return review
+ if (typeof review.panelOpened === "boolean") return review
+
+ const opened = isRecord(fileTree) && typeof fileTree.opened === "boolean" ? fileTree.opened : true
+ return {
+ ...review,
+ panelOpened: opened,
+ }
+ })()
+
+ if (migratedSidebar === sidebar && migratedReview === review && migratedFileTree === fileTree) return value
return {
...value,
sidebar: migratedSidebar,
+ review: migratedReview,
fileTree: migratedFileTree,
}
}
@@ -109,6 +122,7 @@ export const { use: useLayout, provider: LayoutProvider } = createSimpleContext(
},
review: {
diffStyle: "split" as ReviewDiffStyle,
+ panelOpened: true,
},
fileTree: {
opened: true,
@@ -490,7 +504,7 @@ export const { use: useLayout, provider: LayoutProvider } = createSimpleContext(
diffStyle: createMemo(() => store.review?.diffStyle ?? "split"),
setDiffStyle(diffStyle: ReviewDiffStyle) {
if (!store.review) {
- setStore("review", { diffStyle })
+ setStore("review", { diffStyle, panelOpened: true })
return
}
setStore("review", "diffStyle", diffStyle)
@@ -620,6 +634,7 @@ export const { use: useLayout, provider: LayoutProvider } = createSimpleContext(
const s = createMemo(() => store.sessionView[key()] ?? { scroll: {} })
const terminalOpened = createMemo(() => store.terminal?.opened ?? false)
+ const reviewPanelOpened = createMemo(() => store.review?.panelOpened ?? true)
function setTerminalOpened(next: boolean) {
const current = store.terminal
@@ -633,6 +648,18 @@ export const { use: useLayout, provider: LayoutProvider } = createSimpleContext(
setStore("terminal", "opened", next)
}
+ function setReviewPanelOpened(next: boolean) {
+ const current = store.review
+ if (!current) {
+ setStore("review", { diffStyle: "split" as ReviewDiffStyle, panelOpened: next })
+ return
+ }
+
+ const value = current.panelOpened ?? true
+ if (value === next) return
+ setStore("review", "panelOpened", next)
+ }
+
return {
scroll(tab: string) {
return scroll.scroll(key(), tab)
@@ -652,6 +679,18 @@ export const { use: useLayout, provider: LayoutProvider } = createSimpleContext(
setTerminalOpened(!terminalOpened())
},
},
+ reviewPanel: {
+ opened: reviewPanelOpened,
+ open() {
+ setReviewPanelOpened(true)
+ },
+ close() {
+ setReviewPanelOpened(false)
+ },
+ toggle() {
+ setReviewPanelOpened(!reviewPanelOpened())
+ },
+ },
review: {
open: createMemo(() => s().reviewOpen),
setOpen(open: string[]) {
@@ -689,11 +728,10 @@ export const { use: useLayout, provider: LayoutProvider } = createSimpleContext(
const tabs = createMemo(() => store.sessionTabs[key()] ?? { all: [] })
return {
tabs,
- active: createMemo(() => (tabs().active === "review" ? undefined : tabs().active)),
+ active: createMemo(() => tabs().active),
all: createMemo(() => tabs().all.filter((tab) => tab !== "review")),
setActive(tab: string | undefined) {
const session = key()
- if (tab === "review") return
if (!store.sessionTabs[session]) {
setStore("sessionTabs", session, { all: [], active: tab })
} else {
@@ -710,10 +748,18 @@ export const { use: useLayout, provider: LayoutProvider } = createSimpleContext(
}
},
async open(tab: string) {
- if (tab === "review") return
const session = key()
const current = store.sessionTabs[session] ?? { all: [] }
+ if (tab === "review") {
+ if (!store.sessionTabs[session]) {
+ setStore("sessionTabs", session, { all: current.all.filter((x) => x !== "review"), active: tab })
+ return
+ }
+ setStore("sessionTabs", session, "active", tab)
+ return
+ }
+
if (tab === "context") {
const all = [tab, ...current.all.filter((x) => x !== tab)]
if (!store.sessionTabs[session]) {
@@ -746,6 +792,12 @@ export const { use: useLayout, provider: LayoutProvider } = createSimpleContext(
const current = store.sessionTabs[session]
if (!current) return
+ if (tab === "review") {
+ if (current.active !== tab) return
+ setStore("sessionTabs", session, "active", current.all[0])
+ return
+ }
+
const all = current.all.filter((x) => x !== tab)
if (current.active !== tab) {
setStore("sessionTabs", session, "all", all)