diff options
| author | adamelmore <[email protected]> | 2026-01-27 11:34:30 -0600 |
|---|---|---|
| committer | adamelmore <[email protected]> | 2026-01-27 11:40:39 -0600 |
| commit | 7de42ca242af2045fdfc4bbbe1ada33069d2769e (patch) | |
| tree | 2df894cba88a9fb6c098853b8f0e9d0c7fa64c6e /packages/app/src/context | |
| parent | e2c57735b43d4bbca3b8de1ea0d2fe706f3e2799 (diff) | |
| download | opencode-7de42ca242af2045fdfc4bbbe1ada33069d2769e.tar.gz opencode-7de42ca242af2045fdfc4bbbe1ada33069d2769e.zip | |
feat(app): improved layout
Diffstat (limited to 'packages/app/src/context')
| -rw-r--r-- | packages/app/src/context/layout.tsx | 104 |
1 files changed, 51 insertions, 53 deletions
diff --git a/packages/app/src/context/layout.tsx b/packages/app/src/context/layout.tsx index 414c3d6f1..d30fd11cf 100644 --- a/packages/app/src/context/layout.tsx +++ b/packages/app/src/context/layout.tsx @@ -51,16 +51,37 @@ export const { use: useLayout, provider: LayoutProvider } = createSimpleContext( const migrate = (value: unknown) => { if (!isRecord(value)) return value + const sidebar = value.sidebar - if (!isRecord(sidebar)) return value - if (typeof sidebar.workspaces !== "boolean") return value - return { - ...value, - sidebar: { + const migratedSidebar = (() => { + if (!isRecord(sidebar)) return sidebar + if (typeof sidebar.workspaces !== "boolean") return sidebar + return { ...sidebar, workspaces: {}, workspacesDefault: sidebar.workspaces, - }, + } + })() + + const fileTree = value.fileTree + const migratedFileTree = (() => { + if (!isRecord(fileTree)) return fileTree + if (fileTree.tab === "changes" || fileTree.tab === "all") return fileTree + + const width = typeof fileTree.width === "number" ? fileTree.width : 344 + return { + ...fileTree, + opened: true, + width: width === 260 ? 344 : width, + tab: "changes", + } + })() + + if (migratedSidebar === sidebar && migratedFileTree === fileTree) return value + return { + ...value, + sidebar: migratedSidebar, + fileTree: migratedFileTree, } } @@ -80,11 +101,11 @@ export const { use: useLayout, provider: LayoutProvider } = createSimpleContext( }, review: { diffStyle: "split" as ReviewDiffStyle, - panelOpened: true, }, fileTree: { - opened: false, - width: 260, + opened: true, + width: 344, + tab: "changes" as "changes" | "all", }, session: { width: 600, @@ -454,32 +475,40 @@ export const { use: useLayout, provider: LayoutProvider } = createSimpleContext( }, }, fileTree: { - opened: createMemo(() => store.fileTree?.opened ?? false), - width: createMemo(() => store.fileTree?.width ?? 260), + opened: createMemo(() => store.fileTree?.opened ?? true), + width: createMemo(() => store.fileTree?.width ?? 344), + tab: createMemo(() => store.fileTree?.tab ?? "changes"), + setTab(tab: "changes" | "all") { + if (!store.fileTree) { + setStore("fileTree", { opened: true, width: 344, tab }) + return + } + setStore("fileTree", "tab", tab) + }, open() { if (!store.fileTree) { - setStore("fileTree", { opened: true, width: 260 }) + setStore("fileTree", { opened: true, width: 344, tab: "changes" }) return } setStore("fileTree", "opened", true) }, close() { if (!store.fileTree) { - setStore("fileTree", { opened: false, width: 260 }) + setStore("fileTree", { opened: false, width: 344, tab: "changes" }) return } setStore("fileTree", "opened", false) }, toggle() { if (!store.fileTree) { - setStore("fileTree", { opened: true, width: 260 }) + setStore("fileTree", { opened: true, width: 344, tab: "changes" }) return } setStore("fileTree", "opened", (x) => !x) }, resize(width: number) { if (!store.fileTree) { - setStore("fileTree", { opened: true, width }) + setStore("fileTree", { opened: true, width, tab: "changes" }) return } setStore("fileTree", "width", width) @@ -526,7 +555,6 @@ 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 @@ -540,18 +568,6 @@ 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) @@ -571,18 +587,6 @@ 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[]) { @@ -620,10 +624,11 @@ export const { use: useLayout, provider: LayoutProvider } = createSimpleContext( const tabs = createMemo(() => store.sessionTabs[key()] ?? { all: [] }) return { tabs, - active: createMemo(() => tabs().active), - all: createMemo(() => tabs().all), + active: createMemo(() => (tabs().active === "review" ? undefined : 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 { @@ -632,25 +637,18 @@ export const { use: useLayout, provider: LayoutProvider } = createSimpleContext( }, setAll(all: string[]) { const session = key() + const next = all.filter((tab) => tab !== "review") if (!store.sessionTabs[session]) { - setStore("sessionTabs", session, { all, active: undefined }) + setStore("sessionTabs", session, { all: next, active: undefined }) } else { - setStore("sessionTabs", session, "all", all) + setStore("sessionTabs", session, "all", next) } }, 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: [], 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]) { |
