diff options
| author | Albin Groen <[email protected]> | 2026-01-05 18:24:49 +0100 |
|---|---|---|
| committer | GitHub <[email protected]> | 2026-01-05 11:24:49 -0600 |
| commit | bbd1c071c4f3258cc2612f20a7ba306ac730060a (patch) | |
| tree | 6a2047b1016278404cce36c7d4bf028fbf3a7292 /packages/app/src | |
| parent | 8e9a0c4ad014eb54d7ddd8de3b5f321de931f2f7 (diff) | |
| download | opencode-bbd1c071c4f3258cc2612f20a7ba306ac730060a.tar.gz opencode-bbd1c071c4f3258cc2612f20a7ba306ac730060a.zip | |
fix(app): fix flicker and navigation when collapsing/expanding projects (#6658)
Diffstat (limited to 'packages/app/src')
| -rw-r--r-- | packages/app/src/components/session/session-header.tsx | 6 | ||||
| -rw-r--r-- | packages/app/src/context/layout.tsx | 8 | ||||
| -rw-r--r-- | packages/app/src/pages/session.tsx | 7 | ||||
| -rw-r--r-- | packages/app/src/utils/same.ts | 6 |
4 files changed, 12 insertions, 15 deletions
diff --git a/packages/app/src/components/session/session-header.tsx b/packages/app/src/components/session/session-header.tsx index 876521142..6c102e4bd 100644 --- a/packages/app/src/components/session/session-header.tsx +++ b/packages/app/src/components/session/session-header.tsx @@ -1,4 +1,4 @@ -import { createEffect, createMemo, createResource, Show } from "solid-js" +import { createMemo, createResource, Show } from "solid-js" import { A, useNavigate, useParams } from "@solidjs/router" import { useLayout } from "@/context/layout" import { useCommand } from "@/context/command" @@ -20,6 +20,7 @@ import { DialogSelectServer } from "@/components/dialog-select-server" import { SessionLspIndicator } from "@/components/session-lsp-indicator" import { SessionMcpIndicator } from "@/components/session-mcp-indicator" import type { Session } from "@opencode-ai/sdk/v2/client" +import { same } from "@/utils/same" export function SessionHeader() { const globalSDK = useGlobalSDK() @@ -36,6 +37,7 @@ export function SessionHeader() { const sessions = createMemo(() => (sync.data.session ?? []).filter((s) => !s.parentID)) const currentSession = createMemo(() => sessions().find((s) => s.id === params.id)) const shareEnabled = createMemo(() => sync.data.config.share !== "disabled") + const worktrees = createMemo(() => layout.projects.list().map((p) => p.worktree), [], { equals: same }) function navigateToProject(directory: string) { navigate(`/${base64Encode(directory)}`) @@ -60,7 +62,7 @@ export function SessionHeader() { <div class="flex items-center gap-2 min-w-0"> <div class="hidden xl:flex items-center gap-2"> <Select - options={layout.projects.list().map((project) => project.worktree)} + options={worktrees()} current={sync.project?.worktree ?? projectDirectory()} label={(x) => getFilename(x)} onSelect={(x) => (x ? navigateToProject(x) : undefined)} diff --git a/packages/app/src/context/layout.tsx b/packages/app/src/context/layout.tsx index bc0d49758..5836365ba 100644 --- a/packages/app/src/context/layout.tsx +++ b/packages/app/src/context/layout.tsx @@ -6,6 +6,7 @@ import { useGlobalSDK } from "./global-sdk" import { useServer } from "./server" import { Project } from "@opencode-ai/sdk/v2" import { persisted } from "@/utils/persist" +import { same } from "@/utils/same" const AVATAR_COLOR_KEYS = ["pink", "mint", "orange", "purple", "cyan", "lime"] as const export type AvatarColorKey = (typeof AVATAR_COLOR_KEYS)[number] @@ -23,13 +24,6 @@ export function getAvatarColors(key?: string) { } } -function same<T>(a: readonly T[] | undefined, b: readonly T[] | undefined) { - if (a === b) return true - if (!a || !b) return false - if (a.length !== b.length) return false - return a.every((x, i) => x === b[i]) -} - type SessionTabs = { active?: string all: string[] diff --git a/packages/app/src/pages/session.tsx b/packages/app/src/pages/session.tsx index 1b0449752..113f4c432 100644 --- a/packages/app/src/pages/session.tsx +++ b/packages/app/src/pages/session.tsx @@ -48,12 +48,7 @@ import { NewSessionView, } from "@/components/session" import { usePlatform } from "@/context/platform" - -function same<T>(a: readonly T[], b: readonly T[]) { - if (a === b) return true - if (a.length !== b.length) return false - return a.every((x, i) => x === b[i]) -} +import { same } from "@/utils/same" type DiffStyle = "unified" | "split" diff --git a/packages/app/src/utils/same.ts b/packages/app/src/utils/same.ts new file mode 100644 index 000000000..c956f9299 --- /dev/null +++ b/packages/app/src/utils/same.ts @@ -0,0 +1,6 @@ +export function same<T>(a: readonly T[] | undefined, b: readonly T[] | undefined) { + if (a === b) return true + if (!a || !b) return false + if (a.length !== b.length) return false + return a.every((x, i) => x === b[i]) +} |
