summaryrefslogtreecommitdiffhomepage
path: root/packages/app/src/pages/session
diff options
context:
space:
mode:
authorFilip <[email protected]>2026-02-13 12:08:13 +0100
committerGitHub <[email protected]>2026-02-13 05:08:13 -0600
commitebb907d646022d2e7bb8effc164e1f09943d64a9 (patch)
tree65662b4834701f2dc1e2e46da7ed5206341f8ba3 /packages/app/src/pages/session
parentb8ee88212639ec63f4fe87555b5e87f74643e76b (diff)
downloadopencode-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.tsx23
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 = () => {