diff options
| author | Filip <[email protected]> | 2026-02-13 12:08:13 +0100 |
|---|---|---|
| committer | GitHub <[email protected]> | 2026-02-13 05:08:13 -0600 |
| commit | ebb907d646022d2e7bb8effc164e1f09943d64a9 (patch) | |
| tree | 65662b4834701f2dc1e2e46da7ed5206341f8ba3 /packages/app/src/pages/session | |
| parent | b8ee88212639ec63f4fe87555b5e87f74643e76b (diff) | |
| download | opencode-ebb907d646022d2e7bb8effc164e1f09943d64a9.tar.gz opencode-ebb907d646022d2e7bb8effc164e1f09943d64a9.zip | |
fix(desktop): performance optimization for showing large diff & files (#13460)
Diffstat (limited to 'packages/app/src/pages/session')
| -rw-r--r-- | packages/app/src/pages/session/file-tabs.tsx | 23 |
1 files changed, 16 insertions, 7 deletions
diff --git a/packages/app/src/pages/session/file-tabs.tsx b/packages/app/src/pages/session/file-tabs.tsx index 5b3f57dbe..d22fa358b 100644 --- a/packages/app/src/pages/session/file-tabs.tsx +++ b/packages/app/src/pages/session/file-tabs.tsx @@ -1,7 +1,7 @@ import { type ValidComponent, createEffect, createMemo, For, Match, on, onCleanup, Show, Switch } from "solid-js" import { createStore, produce } from "solid-js/store" import { Dynamic } from "solid-js/web" -import { checksum } from "@opencode-ai/util/encode" +import { sampledChecksum } from "@opencode-ai/util/encode" import { decode64 } from "@/utils/base64" import { showToast } from "@opencode-ai/ui/toast" import { LineComment as LineCommentView, LineCommentEditor } from "@opencode-ai/ui/line-comment" @@ -49,7 +49,7 @@ export function FileTabContent(props: { return props.file.get(p) }) const contents = createMemo(() => state()?.content?.content ?? "") - const cacheKey = createMemo(() => checksum(contents())) + const cacheKey = createMemo(() => sampledChecksum(contents())) const isImage = createMemo(() => { const c = state()?.content return c?.encoding === "base64" && c?.mimeType?.startsWith("image/") && c?.mimeType !== "image/svg+xml" @@ -163,11 +163,20 @@ export function FileTabContent(props: { return } + const estimateTop = (range: SelectedLineRange) => { + const line = Math.max(range.start, range.end) + const height = 24 + const offset = 2 + return Math.max(0, (line - 1) * height + offset) + } + + const large = contents().length > 500_000 + const next: Record<string, number> = {} for (const comment of fileComments()) { const marker = findMarker(root, comment.selection) - if (!marker) continue - next[comment.id] = markerTop(el, marker) + if (marker) next[comment.id] = markerTop(el, marker) + else if (large) next[comment.id] = estimateTop(comment.selection) } const removed = Object.keys(note.positions).filter((id) => next[id] === undefined) @@ -194,12 +203,12 @@ export function FileTabContent(props: { } const marker = findMarker(root, range) - if (!marker) { - setNote("draftTop", undefined) + if (marker) { + setNote("draftTop", markerTop(el, marker)) return } - setNote("draftTop", markerTop(el, marker)) + setNote("draftTop", large ? estimateTop(range) : undefined) } const scheduleComments = () => { |
