diff options
| author | Adam <[email protected]> | 2026-01-04 20:32:34 -0600 |
|---|---|---|
| committer | Adam <[email protected]> | 2026-01-05 13:21:29 -0600 |
| commit | d1191675c68d8995333fc4300b11d09e87d711d2 (patch) | |
| tree | 41041b9ff3f0a8a880f3ddd6e82f3b0ac2d88cbd /packages/app/src/context/layout.tsx | |
| parent | 362a657b4f27619588b4f60026c9022e99a7c2d2 (diff) | |
| download | opencode-d1191675c68d8995333fc4300b11d09e87d711d2.tar.gz opencode-d1191675c68d8995333fc4300b11d09e87d711d2.zip | |
fix(app): worktree selection should navigate to worktree
Diffstat (limited to 'packages/app/src/context/layout.tsx')
| -rw-r--r-- | packages/app/src/context/layout.tsx | 48 |
1 files changed, 41 insertions, 7 deletions
diff --git a/packages/app/src/context/layout.tsx b/packages/app/src/context/layout.tsx index 5836365ba..e454f6cfa 100644 --- a/packages/app/src/context/layout.tsx +++ b/packages/app/src/context/layout.tsx @@ -1,5 +1,5 @@ import { createStore, produce } from "solid-js/store" -import { batch, createMemo, onMount } from "solid-js" +import { batch, createEffect, createMemo, onMount } from "solid-js" import { createSimpleContext } from "@opencode-ai/ui/context" import { useGlobalSync } from "./global-sync" import { useGlobalSDK } from "./global-sdk" @@ -91,8 +91,8 @@ export const { use: useLayout, provider: LayoutProvider } = createSimpleContext( : globalSync.data.project.find((x) => x.worktree === project.worktree) return [ { - ...project, ...(metadata ?? {}), + ...project, icon: { url: metadata?.icon?.url, color: metadata?.icon?.color }, }, ] @@ -109,6 +109,41 @@ export const { use: useLayout, provider: LayoutProvider } = createSimpleContext( return project } + const roots = createMemo(() => { + const map = new Map<string, string>() + for (const project of globalSync.data.project) { + const sandboxes = project.sandboxes ?? [] + for (const sandbox of sandboxes) { + map.set(sandbox, project.worktree) + } + } + return map + }) + + createEffect(() => { + const map = roots() + if (map.size === 0) return + + const projects = server.projects.list() + const seen = new Set(projects.map((project) => project.worktree)) + + batch(() => { + for (const project of projects) { + const root = map.get(project.worktree) + if (!root) continue + + server.projects.close(project.worktree) + + if (!seen.has(root)) { + server.projects.open(root) + seen.add(root) + } + + if (project.expanded) server.projects.expand(root) + } + }) + }) + const enriched = createMemo(() => server.projects.list().flatMap(enrich)) const list = createMemo(() => enriched().flatMap(colorize)) @@ -125,11 +160,10 @@ export const { use: useLayout, provider: LayoutProvider } = createSimpleContext( projects: { list, open(directory: string) { - if (server.projects.list().find((x) => x.worktree === directory)) { - return - } - globalSync.project.loadSessions(directory) - server.projects.open(directory) + const root = roots().get(directory) ?? directory + if (server.projects.list().find((x) => x.worktree === root)) return + globalSync.project.loadSessions(root) + server.projects.open(root) }, close(directory: string) { server.projects.close(directory) |
