summaryrefslogtreecommitdiffhomepage
path: root/packages/app
diff options
context:
space:
mode:
authorAdam <[email protected]>2025-12-29 14:23:16 -0600
committerAdam <[email protected]>2025-12-29 14:23:41 -0600
commit68b4038196d6275cc274dc776d89002e2592b55b (patch)
tree33b610d7cefee4dfd4bf94960fb9174fa899fd5c /packages/app
parent31092149002eb69111f4b94a16f875e101c61432 (diff)
downloadopencode-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.tsx53
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) => {