diff options
| author | Adam <[email protected]> | 2025-12-29 14:23:16 -0600 |
|---|---|---|
| committer | Adam <[email protected]> | 2025-12-29 14:23:41 -0600 |
| commit | 68b4038196d6275cc274dc776d89002e2592b55b (patch) | |
| tree | 33b610d7cefee4dfd4bf94960fb9174fa899fd5c /packages/app | |
| parent | 31092149002eb69111f4b94a16f875e101c61432 (diff) | |
| download | opencode-68b4038196d6275cc274dc776d89002e2592b55b.tar.gz opencode-68b4038196d6275cc274dc776d89002e2592b55b.zip | |
fix(desktop): more performance/scrolling fixes
Diffstat (limited to 'packages/app')
| -rw-r--r-- | packages/app/src/pages/session.tsx | 53 |
1 files changed, 37 insertions, 16 deletions
diff --git a/packages/app/src/pages/session.tsx b/packages/app/src/pages/session.tsx index 7be5552de..22856d4f2 100644 --- a/packages/app/src/pages/session.tsx +++ b/packages/app/src/pages/session.tsx @@ -63,6 +63,12 @@ import { SessionLspIndicator } from "@/components/session-lsp-indicator" import { usePermission } from "@/context/permission" import { showToast } from "@opencode-ai/ui/toast" +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]) +} + export default function Page() { const layout = useLayout() const local = useLocal() @@ -82,13 +88,22 @@ export default function Page() { const info = createMemo(() => (params.id ? sync.session.get(params.id) : undefined)) const revertMessageID = createMemo(() => info()?.revert?.messageID) const messages = createMemo(() => (params.id ? (sync.data.message[params.id] ?? []) : [])) - const userMessages = createMemo(() => messages().filter((m) => m.role === "user")) - const visibleUserMessages = createMemo(() => { - const revert = revertMessageID() - if (!revert) return userMessages() - return userMessages().filter((m) => m.id < revert) - }) - const lastUserMessage = createMemo(() => visibleUserMessages()?.at(-1)) + const emptyUserMessages: UserMessage[] = [] + const userMessages = createMemo( + () => messages().filter((m) => m.role === "user") as UserMessage[], + emptyUserMessages, + { equals: same }, + ) + const visibleUserMessages = createMemo( + () => { + const revert = revertMessageID() + if (!revert) return userMessages() + return userMessages().filter((m) => m.id < revert) + }, + emptyUserMessages, + { equals: same }, + ) + const lastUserMessage = createMemo(() => visibleUserMessages().at(-1)) createEffect( on( @@ -170,16 +185,22 @@ export default function Page() { ), ) - createEffect(() => { - params.id - const status = sync.data.session_status[params.id ?? ""] ?? { type: "idle" } - batch(() => { - setStore("userInteracted", false) - setStore("stepsExpanded", status.type !== "idle") - }) - }) + const idle = { type: "idle" as const } + + createEffect( + on( + () => params.id, + (id) => { + const status = sync.data.session_status[id ?? ""] ?? idle + batch(() => { + setStore("userInteracted", false) + setStore("stepsExpanded", status.type !== "idle") + }) + }, + ), + ) - const status = createMemo(() => sync.data.session_status[params.id ?? ""] ?? { type: "idle" }) + const status = createMemo(() => sync.data.session_status[params.id ?? ""] ?? idle) const working = createMemo(() => status().type !== "idle" && activeMessage()?.id === lastUserMessage()?.id) createRenderEffect((prev) => { |
