44import { useCallback , useEffect , useRef } from 'react'
55import { useBoolean } from 'react-use'
66import { onResultChange , findIndex } from '../../hooks/useSearch'
7+ import type { DisplayResult } from '../../../types'
78import type { VirtuosoHandle } from 'react-virtuoso'
89
910let ref : VirtuosoHandle
@@ -17,6 +18,7 @@ const collapseMap = new Map<string, boolean>()
1718onResultChange ( ( ) => {
1819 collapseMap . clear ( )
1920 lastActiveFile = ''
21+ activeItem = null
2022} )
2123
2224export function useToggleResult ( filePath : string ) {
@@ -72,8 +74,30 @@ export function useStickyShadow(filePath: string) {
7274 }
7375}
7476
75- // let activeItem: DisplayResult | null = null
77+ // Display for one match, Array for active header
78+ type ActiveItem = DisplayResult | DisplayResult [ ]
7679
77- // function setActiveItem(match: DisplayResult) {
80+ let activeItem : ActiveItem | null = null
81+ let refreshers : WeakMap < ActiveItem , ( b : boolean ) => void > = new WeakMap ( )
7882
79- // }
83+ function setActive ( item : ActiveItem ) {
84+ if ( activeItem ) {
85+ refreshers . get ( activeItem ) ?.( false )
86+ }
87+ refreshers . get ( item ) ?.( true )
88+ activeItem = item
89+ }
90+
91+ export function useActiveItem ( item : ActiveItem ) {
92+ const [ active , forceUpdate ] = useBoolean ( activeItem === item )
93+ useEffect ( ( ) => {
94+ refreshers . set ( item , forceUpdate )
95+ return ( ) => {
96+ refreshers . delete ( item )
97+ }
98+ } , [ item ] )
99+ const set = useCallback ( ( ) => {
100+ setActive ( item )
101+ } , [ item ] )
102+ return [ active , set ] as const
103+ }
0 commit comments