Skip to content

Commit 0c7eb4e

Browse files
committed
Files count fix
1 parent 898d8d0 commit 0c7eb4e

File tree

3 files changed

+43
-31
lines changed

3 files changed

+43
-31
lines changed

packages/opencode/webgui/src/components/FileChangesPanel.tsx

Lines changed: 14 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import type { FileDiff } from "@opencode-ai/sdk/client"
33
import { useOpenFile } from "../hooks/useOpenFile"
44
import { useProject } from "../state/ProjectContext"
55
import { normalizePath, toDisplayPath } from "../utils/path"
6+
import { useMergedFileDiffs } from "../hooks/useMergedFileDiffs"
67

78
interface FileChangesPanelProps {
89
diffs?: FileDiff[]
@@ -12,23 +13,7 @@ interface FileChangesPanelProps {
1213
export function FileChangesPanel({ diffs = [], fallbackFiles = [] }: FileChangesPanelProps) {
1314
const openFile = useOpenFile()
1415
const { worktree } = useProject()
15-
16-
const mergedDiffs = useMemo(() => {
17-
if (fallbackFiles.length === 0) return diffs
18-
// sessionDiff entries (diffs) are primary
19-
// Use toDisplayPath to normalize both absolute and relative paths to a consistent format
20-
const sessionPaths = new Set(diffs.map((d) => toDisplayPath(d.file, worktree)))
21-
const fallbackOnly = fallbackFiles
22-
.filter((f) => !sessionPaths.has(toDisplayPath(f, worktree)))
23-
.map((file) => ({
24-
file,
25-
before: "",
26-
after: "",
27-
additions: 0,
28-
deletions: 0,
29-
}))
30-
return [...diffs, ...fallbackOnly]
31-
}, [diffs, fallbackFiles, worktree])
16+
const mergedDiffs = useMergedFileDiffs(diffs, fallbackFiles)
3217

3318
const { modified, deleted, totalAdditions, totalDeletions, netChange } = useMemo(() => {
3419
const sortByBasename = (a: FileDiff, b: FileDiff) => {
@@ -75,8 +60,8 @@ export function FileChangesPanel({ diffs = [], fallbackFiles = [] }: FileChanges
7560
<span>
7661
{modified.length} modified • {deleted.length} deleted
7762
</span>
78-
<span className="text-green-600 dark:text-green-400">+{totalAdditions}</span>
79-
<span className="text-red-600 dark:text-red-400">-{totalDeletions}</span>
63+
{totalAdditions > 0 && <span className="text-green-600 dark:text-green-400">+{totalAdditions}</span>}
64+
{totalDeletions > 0 && <span className="text-red-600 dark:text-red-400">-{totalDeletions}</span>}
8065
<span className="text-gray-500 dark:text-gray-500">
8166
net {netChange >= 0 ? "+" : ""}
8267
{netChange}
@@ -103,11 +88,11 @@ export function FileChangesPanel({ diffs = [], fallbackFiles = [] }: FileChanges
10388
title={displayPath || diff.file}
10489
>
10590
{baseName}
106-
{(diff.additions > 0 || diff.deletions > 0) && (
107-
<>
108-
<span className="text-green-600 dark:text-green-400 text-[10px]">+{diff.additions}</span>
109-
<span className="text-red-600 dark:text-red-400 text-[10px]">-{diff.deletions}</span>
110-
</>
91+
{diff.additions > 0 && (
92+
<span className="text-green-600 dark:text-green-400 text-[10px]">+{diff.additions}</span>
93+
)}
94+
{diff.deletions > 0 && (
95+
<span className="text-red-600 dark:text-red-400 text-[10px]">-{diff.deletions}</span>
11196
)}
11297
</span>
11398
)
@@ -127,11 +112,11 @@ export function FileChangesPanel({ diffs = [], fallbackFiles = [] }: FileChanges
127112
title={displayPath || diff.file}
128113
>
129114
{baseName}
130-
{(diff.additions > 0 || diff.deletions > 0) && (
131-
<>
132-
<span className="text-green-600 dark:text-green-400 text-[10px] no-underline">+{diff.additions}</span>
133-
<span className="text-red-600 dark:text-red-400 text-[10px] no-underline">-{diff.deletions}</span>
134-
</>
115+
{diff.additions > 0 && (
116+
<span className="text-green-600 dark:text-green-400 text-[10px] no-underline">+{diff.additions}</span>
117+
)}
118+
{diff.deletions > 0 && (
119+
<span className="text-red-600 dark:text-red-400 text-[10px] no-underline">-{diff.deletions}</span>
135120
)}
136121
</span>
137122
)

packages/opencode/webgui/src/components/MessageInput/FooterPanels.tsx

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { useMessages } from "../../state/MessagesContext"
33
import { useSession } from "../../state/SessionContext"
44
import { TodosList } from "./TodosPanel"
55
import { FileChangesPanel } from "../FileChangesPanel"
6+
import { useMergedFileDiffs } from "../../hooks/useMergedFileDiffs"
67

78
interface FooterPanelsProps {
89
sessionID: string | null
@@ -50,13 +51,14 @@ export function FooterPanels({ sessionID }: FooterPanelsProps) {
5051
}, [sessionID, getMessagesBySession])
5152

5253
const diffs = sessionID ? sessionDiff[sessionID] : undefined
54+
const mergedDiffs = useMergedFileDiffs(diffs, modifiedFiles)
5355
const hasTodos = todos && todos.length > 0
54-
const hasFiles = (diffs && diffs.length > 0) || modifiedFiles.length > 0
56+
const hasFiles = mergedDiffs.length > 0
5557

5658
if (!hasTodos && !hasFiles) return null
5759

5860
const completedTodos = todos?.filter((t: any) => t.status === "completed").length ?? 0
59-
const fileCount = diffs?.length ?? modifiedFiles.length
61+
const fileCount = mergedDiffs.length
6062

6163
return (
6264
<div className="px-2 py-1 border-b border-gray-100 dark:border-gray-800 bg-gray-50 dark:bg-gray-900/50 flex flex-col gap-1">
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
import { useMemo } from "react"
2+
import type { FileDiff } from "@opencode-ai/sdk/client"
3+
import { useProject } from "../state/ProjectContext"
4+
import { toDisplayPath } from "../utils/path"
5+
6+
export function useMergedFileDiffs(diffs: FileDiff[] = [], fallbackFiles: string[] = []) {
7+
const { worktree } = useProject()
8+
9+
return useMemo(() => {
10+
if (fallbackFiles.length === 0) return diffs
11+
// sessionDiff entries (diffs) are primary
12+
// Use toDisplayPath to normalize both absolute and relative paths to a consistent format
13+
const sessionPaths = new Set(diffs.map((d) => toDisplayPath(d.file, worktree)))
14+
const fallbackOnly = fallbackFiles
15+
.filter((f) => !sessionPaths.has(toDisplayPath(f, worktree)))
16+
.map((file) => ({
17+
file,
18+
before: "",
19+
after: "",
20+
additions: 0,
21+
deletions: 0,
22+
}))
23+
return [...diffs, ...fallbackOnly]
24+
}, [diffs, fallbackFiles, worktree])
25+
}

0 commit comments

Comments
 (0)