Skip to content

Commit 19b6a79

Browse files
committed
fix(webview): reset prompt navigation on source change
Amp-Thread-ID: https://ampcode.com/threads/T-01a0aac1-c3f8-7220-a896-ac2dafbf72e1
1 parent 1a2ddab commit 19b6a79

2 files changed

Lines changed: 63 additions & 4 deletions

File tree

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
import { ClineMessage, HistoryItem } from "@roo-code/types"
2+
import { act, renderHook } from "@testing-library/react"
3+
4+
import { usePromptHistory } from "../usePromptHistory"
5+
6+
describe("usePromptHistory", () => {
7+
it("resets navigation when switching to conversation history with identical prompts", () => {
8+
const prompt = "Explain this code"
9+
const taskHistory: HistoryItem[] = [
10+
{
11+
id: "task-1",
12+
number: 1,
13+
ts: 1,
14+
task: prompt,
15+
tokensIn: 0,
16+
tokensOut: 0,
17+
totalCost: 0,
18+
workspace: "/workspace",
19+
},
20+
]
21+
const conversationHistory: ClineMessage[] = [
22+
{ ts: 2, type: "say", say: "user_feedback", text: prompt },
23+
]
24+
const setInputValue = vi.fn()
25+
26+
const { result, rerender } = renderHook(
27+
({ clineMessages }: { clineMessages: ClineMessage[] | undefined }) =>
28+
usePromptHistory({
29+
clineMessages,
30+
taskHistory,
31+
cwd: "/workspace",
32+
inputValue: "draft",
33+
setInputValue,
34+
}),
35+
{ initialProps: { clineMessages: undefined } },
36+
)
37+
38+
act(() => {
39+
result.current.setHistoryIndex(0)
40+
result.current.setTempInput("draft")
41+
})
42+
43+
expect(result.current.promptHistory).toEqual([prompt])
44+
expect(result.current.historyIndex).toBe(0)
45+
expect(result.current.tempInput).toBe("draft")
46+
47+
rerender({ clineMessages: conversationHistory })
48+
49+
expect(result.current.promptHistory).toEqual([prompt])
50+
expect(result.current.historyIndex).toBe(-1)
51+
expect(result.current.tempInput).toBe("")
52+
})
53+
})

‎webview-ui/src/components/chat/hooks/usePromptHistory.ts‎

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { ClineMessage, HistoryItem } from "@roo-code/types"
2-
import { useCallback, useEffect, useMemo, useState } from "react"
2+
import { useCallback, useEffect, useMemo, useRef, useState } from "react"
33

44
interface UsePromptHistoryProps {
55
clineMessages: ClineMessage[] | undefined
@@ -38,6 +38,8 @@ export const usePromptHistory = ({
3838
const [historyIndex, setHistoryIndex] = useState(-1)
3939
const [tempInput, setTempInput] = useState("")
4040
const [promptHistory, setPromptHistory] = useState<string[]>([])
41+
const historySource = clineMessages?.length ? "conversation" : "task"
42+
const previousHistorySource = useRef(historySource)
4143

4244
// Initialize prompt history with hybrid approach: conversation messages if in task, otherwise task history
4345
const filteredPromptHistory = useMemo(() => {
@@ -74,14 +76,18 @@ export const usePromptHistory = ({
7476
const historyChanged =
7577
promptHistory.length !== filteredPromptHistory.length ||
7678
promptHistory.some((prompt, index) => prompt !== filteredPromptHistory[index])
79+
const historySourceChanged = previousHistorySource.current !== historySource
80+
previousHistorySource.current = historySource
7781

78-
if (!historyChanged) return
82+
if (!historyChanged && !historySourceChanged) return
7983

80-
setPromptHistory(filteredPromptHistory)
84+
if (historyChanged) {
85+
setPromptHistory(filteredPromptHistory)
86+
}
8187
// Reset navigation state when switching between history sources
8288
setHistoryIndex(-1)
8389
setTempInput("")
84-
}, [filteredPromptHistory, promptHistory])
90+
}, [filteredPromptHistory, historySource, promptHistory])
8591

8692
// Reset history navigation when user types (but not when we're setting it programmatically)
8793
const resetOnInputChange = useCallback(() => {

0 commit comments

Comments
 (0)