diff options
| author | Adam <[email protected]> | 2026-02-19 11:36:32 -0600 |
|---|---|---|
| committer | Adam <[email protected]> | 2026-02-19 11:36:37 -0600 |
| commit | f2858a42ba17fba1e3376440e8f3aae2aa64ca61 (patch) | |
| tree | 3fbc753ccb26a79f015aa7a6dd71f384348e383a /packages/app/src/pages | |
| parent | 3c21735b35f779d69a5458b1fa5fada49fb7decb (diff) | |
| download | opencode-f2858a42ba17fba1e3376440e8f3aae2aa64ca61.tar.gz opencode-f2858a42ba17fba1e3376440e8f3aae2aa64ca61.zip | |
chore: cleanup
Diffstat (limited to 'packages/app/src/pages')
| -rw-r--r-- | packages/app/src/pages/layout.tsx | 46 | ||||
| -rw-r--r-- | packages/app/src/pages/layout/helpers.test.ts | 39 | ||||
| -rw-r--r-- | packages/app/src/pages/layout/helpers.ts | 18 |
3 files changed, 32 insertions, 71 deletions
diff --git a/packages/app/src/pages/layout.tsx b/packages/app/src/pages/layout.tsx index 1e46b3085..62094a6e4 100644 --- a/packages/app/src/pages/layout.tsx +++ b/packages/app/src/pages/layout.tsx @@ -61,7 +61,6 @@ import { displayName, errorMessage, getDraggableId, - projectSessionTarget, sortedRootSessions, syncWorkspaceOrder, workspaceKey, @@ -82,8 +81,7 @@ export default function Layout(props: ParentProps) { const [store, setStore, , ready] = persisted( Persist.global("layout.page", ["layout.page.v1"]), createStore({ - lastSession: {} as { [directory: string]: string }, - lastSessionAt: {} as { [directory: string]: number }, + lastProjectSession: {} as { [directory: string]: { directory: string; id: string; at: number } }, activeProject: undefined as string | undefined, activeWorkspace: undefined as string | undefined, workspaceOrder: {} as Record<string, string[]>, @@ -1076,19 +1074,37 @@ export default function Layout(props: ParentProps) { dialog.show(() => <DialogSettings />) } - function navigateToProject(directory: string | undefined) { - if (!directory) return - server.projects.touch(directory) + function projectRoot(directory: string) { const project = layout.projects .list() .find((item) => item.worktree === directory || item.sandboxes?.includes(directory)) - const target = projectSessionTarget({ - directory, - project, - lastSession: store.lastSession, - lastSessionAt: store.lastSessionAt, - }) - navigateWithSidebarReset(`/${base64Encode(target.directory)}${target.id ? `/session/${target.id}` : ""}`) + if (project) return project.worktree + + const known = Object.entries(store.workspaceOrder).find( + ([root, dirs]) => root === directory || dirs.includes(directory), + ) + if (known) return known[0] + + const [child] = globalSync.child(directory, { bootstrap: false }) + const id = child.project + if (!id) return directory + + const meta = globalSync.data.project.find((item) => item.id === id) + return meta?.worktree ?? directory + } + + function navigateToProject(directory: string | undefined) { + if (!directory) return + const root = projectRoot(directory) + server.projects.touch(root) + + const projectSession = store.lastProjectSession[root] + if (projectSession?.id) { + navigateWithSidebarReset(`/${base64Encode(projectSession.directory)}/session/${projectSession.id}`) + return + } + + navigateWithSidebarReset(`/${base64Encode(root)}/session`) } function navigateToSession(session: Session | undefined) { @@ -1442,8 +1458,8 @@ export default function Layout(props: ParentProps) { if (!dir || !id) return const directory = decode64(dir) if (!directory) return - setStore("lastSession", directory, id) - setStore("lastSessionAt", directory, Date.now()) + const at = Date.now() + setStore("lastProjectSession", projectRoot(directory), { directory, id, at }) notification.session.markViewed(id) const expanded = untrack(() => store.workspaceExpanded[directory]) if (expanded === false) { diff --git a/packages/app/src/pages/layout/helpers.test.ts b/packages/app/src/pages/layout/helpers.test.ts index 6f868ab69..83d8f4748 100644 --- a/packages/app/src/pages/layout/helpers.test.ts +++ b/packages/app/src/pages/layout/helpers.test.ts @@ -1,13 +1,6 @@ import { describe, expect, test } from "bun:test" import { collectOpenProjectDeepLinks, drainPendingDeepLinks, parseDeepLink } from "./deep-links" -import { - displayName, - errorMessage, - getDraggableId, - projectSessionTarget, - syncWorkspaceOrder, - workspaceKey, -} from "./helpers" +import { displayName, errorMessage, getDraggableId, syncWorkspaceOrder, workspaceKey } from "./helpers" describe("layout deep links", () => { test("parses open-project deep links", () => { @@ -96,34 +89,4 @@ describe("layout workspace helpers", () => { expect(errorMessage(new Error("broken"), "fallback")).toBe("broken") expect(errorMessage("unknown", "fallback")).toBe("fallback") }) - - test("picks newest session across project workspaces", () => { - const result = projectSessionTarget({ - directory: "/root", - project: { worktree: "/root", sandboxes: ["/root/a", "/root/b"] }, - lastSession: { - "/root": "root-session", - "/root/a": "sandbox-a", - "/root/b": "sandbox-b", - }, - lastSessionAt: { - "/root": 1, - "/root/a": 3, - "/root/b": 2, - }, - }) - - expect(result).toEqual({ directory: "/root/a", id: "sandbox-a", at: 3 }) - }) - - test("falls back to project route when no session exists", () => { - const result = projectSessionTarget({ - directory: "/root", - project: { worktree: "/root", sandboxes: ["/root/a"] }, - lastSession: {}, - lastSessionAt: {}, - }) - - expect(result).toEqual({ directory: "/root" }) - }) }) diff --git a/packages/app/src/pages/layout/helpers.ts b/packages/app/src/pages/layout/helpers.ts index 88066cfb8..6a1e7c012 100644 --- a/packages/app/src/pages/layout/helpers.ts +++ b/packages/app/src/pages/layout/helpers.ts @@ -62,24 +62,6 @@ export const errorMessage = (err: unknown, fallback: string) => { return fallback } -export function projectSessionTarget(input: { - directory: string - project?: { worktree: string; sandboxes?: string[] } - lastSession: Record<string, string> - lastSessionAt: Record<string, number> -}): { directory: string; id?: string; at?: number } { - const dirs = input.project ? [input.project.worktree, ...(input.project.sandboxes ?? [])] : [input.directory] - const best = dirs.reduce<{ directory: string; id: string; at: number } | undefined>((result, directory) => { - const id = input.lastSession[directory] - if (!id) return result - const at = input.lastSessionAt[directory] ?? 0 - if (result && result.at >= at) return result - return { directory, id, at } - }, undefined) - if (best) return best - return { directory: input.directory } -} - export const syncWorkspaceOrder = (local: string, dirs: string[], existing?: string[]) => { if (!existing) return dirs const keep = existing.filter((d) => d !== local && dirs.includes(d)) |
