summaryrefslogtreecommitdiffhomepage
path: root/packages
diff options
context:
space:
mode:
authorDax Raad <[email protected]>2025-11-21 18:27:16 -0500
committerDax Raad <[email protected]>2025-11-21 18:27:25 -0500
commitf5ac98251eec55130f1db2ca65c56d53dfa5f3a1 (patch)
tree4bb39bc10b5691473cbcf1f70ea927c493d89f1c /packages
parent78239045ba8cfe33115711ad0ba83601ef09bece (diff)
downloadopencode-f5ac98251eec55130f1db2ca65c56d53dfa5f3a1.tar.gz
opencode-f5ac98251eec55130f1db2ca65c56d53dfa5f3a1.zip
tui: split revert memo into smaller tracked computations to prevent unnecessary re-evaluations
Diffstat (limited to 'packages')
-rw-r--r--packages/opencode/src/cli/cmd/tui/routes/session/index.tsx76
1 files changed, 41 insertions, 35 deletions
diff --git a/packages/opencode/src/cli/cmd/tui/routes/session/index.tsx b/packages/opencode/src/cli/cmd/tui/routes/session/index.tsx
index f028e8a6c..6c83bf68c 100644
--- a/packages/opencode/src/cli/cmd/tui/routes/session/index.tsx
+++ b/packages/opencode/src/cli/cmd/tui/routes/session/index.tsx
@@ -653,44 +653,50 @@ export function Session() {
},
])
- const revert = createMemo(() => {
- const s = session()
- if (!s) return
- const messageID = s.revert?.messageID
- if (!messageID) return
- const reverted = messages().filter((x) => x.id >= messageID && x.role === "user")
-
- const diffFiles = (() => {
- const diffText = s.revert?.diff || ""
- if (!diffText) return []
+ const revertInfo = createMemo(() => session()?.revert)
+ const revertMessageID = createMemo(() => revertInfo()?.messageID)
+
+ const revertDiffFiles = createMemo(() => {
+ const diffText = revertInfo()?.diff ?? ""
+ if (!diffText) return []
+
+ try {
+ const patches = parsePatch(diffText)
+ return patches.map((patch) => {
+ const filename = patch.newFileName || patch.oldFileName || "unknown"
+ const cleanFilename = filename.replace(/^[ab]\//, "")
+ return {
+ filename: cleanFilename,
+ additions: patch.hunks.reduce(
+ (sum, hunk) => sum + hunk.lines.filter((line) => line.startsWith("+")).length,
+ 0,
+ ),
+ deletions: patch.hunks.reduce(
+ (sum, hunk) => sum + hunk.lines.filter((line) => line.startsWith("-")).length,
+ 0,
+ ),
+ }
+ })
+ } catch (error) {
+ return []
+ }
+ })
- try {
- const patches = parsePatch(diffText)
- return patches.map((patch) => {
- const filename = patch.newFileName || patch.oldFileName || "unknown"
- const cleanFilename = filename.replace(/^[ab]\//, "")
- return {
- filename: cleanFilename,
- additions: patch.hunks.reduce(
- (sum, hunk) => sum + hunk.lines.filter((line) => line.startsWith("+")).length,
- 0,
- ),
- deletions: patch.hunks.reduce(
- (sum, hunk) => sum + hunk.lines.filter((line) => line.startsWith("-")).length,
- 0,
- ),
- }
- })
- } catch (error) {
- return []
- }
- })()
+ const revertRevertedMessages = createMemo(() => {
+ const messageID = revertMessageID()
+ if (!messageID) return []
+ return messages().filter((x) => x.id >= messageID && x.role === "user")
+ })
+ const revert = createMemo(() => {
+ const info = revertInfo()
+ if (!info) return
+ if (!info.messageID) return
return {
- messageID,
- reverted,
- diff: s.revert!.diff,
- diffFiles,
+ messageID: info.messageID,
+ reverted: revertRevertedMessages(),
+ diff: info.diff,
+ diffFiles: revertDiffFiles(),
}
})