Skip to content

Commit 9180ac5

Browse files
feat: refresh toggleState when search update
1 parent 8c24302 commit 9180ac5

File tree

2 files changed

+25
-9
lines changed

2 files changed

+25
-9
lines changed

src/webview/SearchSidebar/SearchResultList/useListState.tsx

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,14 @@
33

44
import { useCallback } from 'react'
55
import { useBoolean } from 'react-use'
6+
import { onResultChange } from '../../hooks/useSearch'
67

78
const collapseMap = new Map<string, boolean>()
89

10+
onResultChange(() => {
11+
collapseMap.clear()
12+
})
13+
914
export function useToggleResult(filePath: string) {
1015
const collapsedBefore = collapseMap.get(filePath)
1116
const [isExpanded, toggle] = useBoolean(!collapsedBefore)

src/webview/hooks/useSearch.tsx

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,27 @@ let queryInFlight: SearchQuery = {
2626
let searching = true
2727
let notify = () => {}
2828
let searchError: Error | null = null
29+
2930
// we will not immediately drop previous result
3031
// instead, use a stale flag and update it on streaming or end
32+
// TODO: refactor this state
3133
let hasStaleResult = false
34+
const resultChangeCallbacks: Set<() => void> = new Set()
35+
36+
function refreshResultIfStale() {
37+
if (hasStaleResult) {
38+
// empty previous result
39+
hasStaleResult = false
40+
grouped = []
41+
resultChangeCallbacks.forEach(f => f())
42+
}
43+
}
44+
export function onResultChange(f: () => void) {
45+
resultChangeCallbacks.add(f)
46+
return () => {
47+
resultChangeCallbacks.delete(f)
48+
}
49+
}
3250

3351
// this function is also called in useQuery
3452
function postSearch(searchQuery: SearchQuery) {
@@ -45,11 +63,7 @@ childPort.onMessage('searchResultStreaming', event => {
4563
if (eventId !== id) {
4664
return
4765
}
48-
if (hasStaleResult) {
49-
// empty previous result
50-
hasStaleResult = false
51-
grouped = []
52-
}
66+
refreshResultIfStale()
5367
queryInFlight = query
5468
grouped = merge(groupBy(event.searchResult))
5569
notify()
@@ -61,10 +75,7 @@ childPort.onMessage('searchEnd', event => {
6175
return
6276
}
6377
searching = false
64-
if (hasStaleResult) {
65-
grouped = []
66-
}
67-
hasStaleResult = false
78+
refreshResultIfStale()
6879
queryInFlight = query
6980
notify()
7081
})

0 commit comments

Comments
 (0)