From 564d3edfac6e3cc872d35d7b2d1e8bc1ea4b84bd Mon Sep 17 00:00:00 2001 From: Adam <2363879+adamdotdevin@users.noreply.github.com> Date: Thu, 15 Jan 2026 07:00:53 -0600 Subject: [PATCH] fix(app): new layout issues --- packages/app/src/context/layout.tsx | 38 +++++++++-- packages/app/src/pages/layout.tsx | 98 +++++++++++++++++++++------ packages/desktop/src-tauri/src/lib.rs | 5 ++ packages/desktop/src/index.tsx | 3 - 4 files changed, 113 insertions(+), 31 deletions(-) diff --git a/packages/app/src/context/layout.tsx b/packages/app/src/context/layout.tsx index ba332be7b..a49e891bf 100644 --- a/packages/app/src/context/layout.tsx +++ b/packages/app/src/context/layout.tsx @@ -47,13 +47,34 @@ export const { use: useLayout, provider: LayoutProvider } = createSimpleContext( const globalSdk = useGlobalSDK() const globalSync = useGlobalSync() const server = useServer() + + const isRecord = (value: unknown): value is Record => + typeof value === "object" && value !== null && !Array.isArray(value) + + 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: { + ...sidebar, + workspaces: {}, + workspacesDefault: sidebar.workspaces, + }, + } + } + + const target = Persist.global("layout", ["layout.v6"]) const [store, setStore, _, ready] = persisted( - Persist.global("layout", ["layout.v6"]), + { ...target, migrate }, createStore({ sidebar: { opened: false, width: 280, - workspaces: false, + workspaces: {} as Record, + workspacesDefault: false, }, terminal: { height: 280, @@ -305,12 +326,15 @@ export const { use: useLayout, provider: LayoutProvider } = createSimpleContext( resize(width: number) { setStore("sidebar", "width", width) }, - workspaces: createMemo(() => store.sidebar.workspaces ?? false), - setWorkspaces(value: boolean) { - setStore("sidebar", "workspaces", value) + workspaces(directory: string) { + return createMemo(() => store.sidebar.workspaces[directory] ?? store.sidebar.workspacesDefault ?? false) }, - toggleWorkspaces() { - setStore("sidebar", "workspaces", (x) => !x) + setWorkspaces(directory: string, value: boolean) { + setStore("sidebar", "workspaces", directory, value) + }, + toggleWorkspaces(directory: string) { + const current = store.sidebar.workspaces[directory] ?? store.sidebar.workspacesDefault ?? false + setStore("sidebar", "workspaces", directory, !current) }, }, terminal: { diff --git a/packages/app/src/pages/layout.tsx b/packages/app/src/pages/layout.tsx index cc5396656..b2c617bfa 100644 --- a/packages/app/src/pages/layout.tsx +++ b/packages/app/src/pages/layout.tsx @@ -271,6 +271,12 @@ export default function Layout(props: ParentProps) { return layout.projects.list().find((p) => p.worktree === directory || p.sandboxes?.includes(directory)) }) + const workspaceSetting = createMemo(() => { + const project = currentProject() + if (!project) return false + return layout.sidebar.workspaces(project.worktree)() + }) + createEffect(() => { const project = currentProject() if (!project) return @@ -306,7 +312,16 @@ export default function Layout(props: ParentProps) { return sessions.filter((s) => !s.parentID) } - const currentSessions = createMemo(() => projectSessions(currentProject())) + const currentSessions = createMemo(() => { + const project = currentProject() + if (!project) return [] as Session[] + if (workspaceSetting()) return projectSessions(project) + const [projectStore] = globalSync.child(project.worktree) + return projectStore.session + .filter((session) => session.directory === projectStore.path.directory) + .filter((session) => !session.parentID) + .toSorted(sortSessions) + }) type PrefetchQueue = { inflight: Set @@ -729,6 +744,21 @@ export default function Layout(props: ParentProps) { requestAnimationFrame(() => scrollToSession(id)) }) + createEffect(() => { + const project = currentProject() + if (!project) return + + if (workspaceSetting()) { + const dirs = [project.worktree, ...(project.sandboxes ?? [])] + for (const directory of dirs) { + globalSync.project.loadSessions(directory) + } + return + } + + globalSync.project.loadSessions(project.worktree) + }) + createEffect(() => { if (isLargeViewport()) { const sidebarWidth = layout.sidebar.opened() ? layout.sidebar.width() : 64 @@ -943,6 +973,7 @@ export default function Layout(props: ParentProps) { }) const workspaces = createMemo(() => workspaceIds(props.project).slice(0, 2)) + const workspaceEnabled = createMemo(() => layout.sidebar.workspaces(props.project.worktree)()) const label = (directory: string) => { const [data] = globalSync.child(directory) const kind = directory === props.project.worktree ? "local" : "sandbox" @@ -959,6 +990,15 @@ export default function Layout(props: ParentProps) { .slice(0, 2) } + const projectSessions = () => { + const [data] = globalSync.child(props.project.worktree) + return data.session + .filter((session) => session.directory === data.path.directory) + .filter((session) => !session.parentID) + .toSorted(sortSessions) + .slice(0, 2) + } + const trigger = (