summaryrefslogtreecommitdiffhomepage
path: root/packages/app/src/context
diff options
context:
space:
mode:
authoradamelmore <[email protected]>2026-01-24 00:35:02 -0600
committerAdam <[email protected]>2026-01-24 07:00:41 -0600
commit962ab3bc8cf0b051e9858db0c6c3e4b96a42bf1b (patch)
tree3d147aebe8bb7e7c615e5fe96b49f90eb841393e /packages/app/src/context
parentda8f3e92a7bbc3b288f89f6b535b72b94c1d1c19 (diff)
downloadopencode-962ab3bc8cf0b051e9858db0c6c3e4b96a42bf1b.tar.gz
opencode-962ab3bc8cf0b051e9858db0c6c3e4b96a42bf1b.zip
fix(app): reactive loops
Diffstat (limited to 'packages/app/src/context')
-rw-r--r--packages/app/src/context/layout.tsx31
1 files changed, 25 insertions, 6 deletions
diff --git a/packages/app/src/context/layout.tsx b/packages/app/src/context/layout.tsx
index ddd66aa2f..c24e433d1 100644
--- a/packages/app/src/context/layout.tsx
+++ b/packages/app/src/context/layout.tsx
@@ -267,17 +267,36 @@ export const { use: useLayout, provider: LayoutProvider } = createSimpleContext(
return map
})
- createEffect(() => {
+ const rootFor = (directory: string) => {
const map = roots()
- if (map.size === 0) return
+ if (map.size === 0) return directory
+
+ const visited = new Set<string>()
+ const chain = [directory]
+
+ while (chain.length) {
+ const current = chain[chain.length - 1]
+ if (!current) return directory
+ const next = map.get(current)
+ if (!next) return current
+
+ if (visited.has(next)) return directory
+ visited.add(next)
+ chain.push(next)
+ }
+
+ return directory
+ }
+
+ createEffect(() => {
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
+ const root = rootFor(project.worktree)
+ if (root === project.worktree) continue
server.projects.close(project.worktree)
@@ -350,7 +369,7 @@ export const { use: useLayout, provider: LayoutProvider } = createSimpleContext(
projects: {
list,
open(directory: string) {
- const root = roots().get(directory) ?? directory
+ const root = rootFor(directory)
if (server.projects.list().find((x) => x.worktree === root)) return
globalSync.project.loadSessions(root)
server.projects.open(root)
@@ -384,7 +403,7 @@ export const { use: useLayout, provider: LayoutProvider } = createSimpleContext(
setStore("sidebar", "width", width)
},
workspaces(directory: string) {
- return createMemo(() => store.sidebar.workspaces[directory] ?? store.sidebar.workspacesDefault ?? false)
+ return () => store.sidebar.workspaces[directory] ?? store.sidebar.workspacesDefault ?? false
},
setWorkspaces(directory: string, value: boolean) {
setStore("sidebar", "workspaces", directory, value)