summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorAdam <[email protected]>2026-01-15 14:11:55 -0600
committerAdam <[email protected]>2026-01-15 15:45:11 -0600
commitda3dea0429a3526241119974f18dfcbe8bcf286f (patch)
tree4a5aee080dbea484b73cc91b16869e847c2048ae
parent9862303eedff320ebe632602b6728037feb44371 (diff)
downloadopencode-da3dea0429a3526241119974f18dfcbe8bcf286f.tar.gz
opencode-da3dea0429a3526241119974f18dfcbe8bcf286f.zip
fix(app): persist workspace order and collapsed state
-rw-r--r--packages/app/src/pages/layout.tsx21
1 files changed, 13 insertions, 8 deletions
diff --git a/packages/app/src/pages/layout.tsx b/packages/app/src/pages/layout.tsx
index 72224f349..2a36a99f2 100644
--- a/packages/app/src/pages/layout.tsx
+++ b/packages/app/src/pages/layout.tsx
@@ -16,6 +16,7 @@ import {
import { A, useNavigate, useParams } from "@solidjs/router"
import { useLayout, getAvatarColors, LocalProject } from "@/context/layout"
import { useGlobalSync } from "@/context/global-sync"
+import { Persist, persisted } from "@/utils/persist"
import { base64Decode, base64Encode } from "@opencode-ai/util/encode"
import { Avatar } from "@opencode-ai/ui/avatar"
import { ResizeHandle } from "@opencode-ai/ui/resize-handle"
@@ -62,13 +63,16 @@ import { Titlebar } from "@/components/titlebar"
import { useServer } from "@/context/server"
export default function Layout(props: ParentProps) {
- const [store, setStore] = createStore({
- lastSession: {} as { [directory: string]: string },
- activeProject: undefined as string | undefined,
- activeWorkspace: undefined as string | undefined,
- workspaceOrder: {} as Record<string, string[]>,
- workspaceExpanded: {} as Record<string, boolean>,
- })
+ const [store, setStore, , ready] = persisted(
+ Persist.global("layout.page", ["layout.page.v1"]),
+ createStore({
+ lastSession: {} as { [directory: string]: string },
+ activeProject: undefined as string | undefined,
+ activeWorkspace: undefined as string | undefined,
+ workspaceOrder: {} as Record<string, string[]>,
+ workspaceExpanded: {} as Record<string, boolean>,
+ }),
+ )
let scrollContainerRef: HTMLDivElement | undefined
const xlQuery = window.matchMedia("(min-width: 1280px)")
@@ -289,6 +293,7 @@ export default function Layout(props: ParentProps) {
})
createEffect(() => {
+ if (!ready()) return
const project = currentProject()
if (!project) return
@@ -708,7 +713,7 @@ export default function Layout(props: ParentProps) {
const id = params.id
setStore("lastSession", directory, id)
notification.session.markViewed(id)
- untrack(() => setStore("workspaceExpanded", directory, true))
+ untrack(() => setStore("workspaceExpanded", directory, (value) => value ?? true))
requestAnimationFrame(() => scrollToSession(id))
})