summaryrefslogtreecommitdiffhomepage
path: root/packages/app/src/components
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/components
parentc40ce47e92befbe4cb27735e4d870f540e75b646 (diff)
downloadopencode-83646e0366c47a3bccb5135d40628176a6776f33.tar.gz
opencode-83646e0366c47a3bccb5135d40628176a6776f33.zip
fix(app): allow toggling file tree closed independently (#12293)
Diffstat (limited to 'packages/app/src/components')
-rw-r--r--packages/app/src/components/dialog-select-file.tsx2
-rw-r--r--packages/app/src/components/prompt-input.tsx3
-rw-r--r--packages/app/src/components/session-context-usage.tsx2
-rw-r--r--packages/app/src/components/session/session-header.tsx46
4 files changed, 45 insertions, 8 deletions
diff --git a/packages/app/src/components/dialog-select-file.tsx b/packages/app/src/components/dialog-select-file.tsx
index 167f21195..36448dd3e 100644
--- a/packages/app/src/components/dialog-select-file.tsx
+++ b/packages/app/src/components/dialog-select-file.tsx
@@ -47,6 +47,7 @@ export function DialogSelectFile(props: { mode?: DialogSelectFileMode; onOpenFil
const filesOnly = () => props.mode === "files"
const sessionKey = createMemo(() => `${params.dir}${params.id ? "/" + params.id : ""}`)
const tabs = createMemo(() => layout.tabs(sessionKey))
+ const view = createMemo(() => layout.view(sessionKey))
const state = { cleanup: undefined as (() => void) | void, committed: false }
const [grouped, setGrouped] = createSignal(false)
const common = [
@@ -282,6 +283,7 @@ export function DialogSelectFile(props: { mode?: DialogSelectFileMode; onOpenFil
const value = file.tab(path)
tabs().open(value)
file.load(path)
+ if (!view().reviewPanel.opened()) view().reviewPanel.open()
layout.fileTree.open()
layout.fileTree.setTab("all")
props.onOpenFile?.(path)
diff --git a/packages/app/src/components/prompt-input.tsx b/packages/app/src/components/prompt-input.tsx
index b897e394a..f40b61bca 100644
--- a/packages/app/src/components/prompt-input.tsx
+++ b/packages/app/src/components/prompt-input.tsx
@@ -172,6 +172,7 @@ export const PromptInput: Component<PromptInputProps> = (props) => {
const sessionKey = createMemo(() => `${params.dir}${params.id ? "/" + params.id : ""}`)
const tabs = createMemo(() => layout.tabs(sessionKey))
+ const view = createMemo(() => layout.view(sessionKey))
const commentInReview = (path: string) => {
const sessionID = params.id
@@ -190,12 +191,14 @@ export const PromptInput: Component<PromptInputProps> = (props) => {
const wantsReview = item.commentOrigin === "review" || (item.commentOrigin !== "file" && commentInReview(item.path))
if (wantsReview) {
+ if (!view().reviewPanel.opened()) view().reviewPanel.open()
layout.fileTree.open()
layout.fileTree.setTab("changes")
requestAnimationFrame(() => comments.setFocus(focus))
return
}
+ if (!view().reviewPanel.opened()) view().reviewPanel.open()
layout.fileTree.open()
layout.fileTree.setTab("all")
const tab = files.tab(item.path)
diff --git a/packages/app/src/components/session-context-usage.tsx b/packages/app/src/components/session-context-usage.tsx
index c5de54cf0..c6256395f 100644
--- a/packages/app/src/components/session-context-usage.tsx
+++ b/packages/app/src/components/session-context-usage.tsx
@@ -23,6 +23,7 @@ export function SessionContextUsage(props: SessionContextUsageProps) {
const variant = createMemo(() => props.variant ?? "button")
const sessionKey = createMemo(() => `${params.dir}${params.id ? "/" + params.id : ""}`)
const tabs = createMemo(() => layout.tabs(sessionKey))
+ const view = createMemo(() => layout.view(sessionKey))
const messages = createMemo(() => (params.id ? (sync.data.message[params.id] ?? []) : []))
const usd = createMemo(
@@ -57,6 +58,7 @@ export function SessionContextUsage(props: SessionContextUsageProps) {
const openContext = () => {
if (!params.id) return
+ if (!view().reviewPanel.opened()) view().reviewPanel.open()
layout.fileTree.open()
layout.fileTree.setTab("all")
tabs().open("context")
diff --git a/packages/app/src/components/session/session-header.tsx b/packages/app/src/components/session/session-header.tsx
index 5b00f80c0..f2bfc8d25 100644
--- a/packages/app/src/components/session/session-header.tsx
+++ b/packages/app/src/components/session/session-header.tsx
@@ -283,27 +283,57 @@ export function SessionHeader() {
<TooltipKeybind title={language.t("command.review.toggle")} keybind={command.keybind("review.toggle")}>
<Button
variant="ghost"
- class="group/file-tree-toggle size-6 p-0"
- onClick={() => layout.fileTree.toggle()}
+ class="group/review-toggle size-6 p-0"
+ onClick={() => view().reviewPanel.toggle()}
aria-label={language.t("command.review.toggle")}
- aria-expanded={layout.fileTree.opened()}
+ aria-expanded={view().reviewPanel.opened()}
aria-controls="review-panel"
>
<div class="relative flex items-center justify-center size-4 [&>*]:absolute [&>*]:inset-0">
<Icon
size="small"
- name={layout.fileTree.opened() ? "layout-right-full" : "layout-right"}
- class="group-hover/file-tree-toggle:hidden"
+ name={view().reviewPanel.opened() ? "layout-right-full" : "layout-right"}
+ class="group-hover/review-toggle:hidden"
/>
<Icon
size="small"
name="layout-right-partial"
- class="hidden group-hover/file-tree-toggle:inline-block"
+ class="hidden group-hover/review-toggle:inline-block"
+ />
+ <Icon
+ size="small"
+ name={view().reviewPanel.opened() ? "layout-right" : "layout-right-full"}
+ class="hidden group-active/review-toggle:inline-block"
/>
+ </div>
+ </Button>
+ </TooltipKeybind>
+ </div>
+ <div class="hidden md:block shrink-0">
+ <TooltipKeybind
+ title={language.t("command.fileTree.toggle")}
+ keybind={command.keybind("fileTree.toggle")}
+ >
+ <Button
+ variant="ghost"
+ class="group/file-tree-toggle size-6 p-0"
+ onClick={() => {
+ const opening = !layout.fileTree.opened()
+ if (opening && !view().reviewPanel.opened()) view().reviewPanel.open()
+ layout.fileTree.toggle()
+ }}
+ aria-label={language.t("command.fileTree.toggle")}
+ aria-expanded={layout.fileTree.opened()}
+ aria-controls="file-tree-panel"
+ >
+ <div class="relative flex items-center justify-center size-4">
<Icon
size="small"
- name={layout.fileTree.opened() ? "layout-right" : "layout-right-full"}
- class="hidden group-active/file-tree-toggle:inline-block"
+ name="bullet-list"
+ classList={{
+ "text-icon-strong": layout.fileTree.opened(),
+ "text-icon-weak": !layout.fileTree.opened(),
+ }}
/>
</div>
</Button>