11import { UseComboboxStateChange , UseSelectStateChange } from "downshift" ;
2- import { useEffect , useState } from "react" ;
2+ import { useMemo , useState } from "react" ;
33
44import { Option } from "~/components/BaseSelect" ;
55
@@ -12,31 +12,33 @@ export function useHighlightedIndex<T extends Option>(
1212 change : UseComboboxStateChange < T > | UseSelectStateChange < T >
1313 ) => void ;
1414} {
15- // Initially we don't show any item as highlighted
16- const [ highlightedIndex , setHighlightedIndex ] = useState < number | undefined > (
17- - 1
18- ) ;
19-
20- // When data from API comes we can calculate initially highlighted index
21- // Or when we change the selected item
22- useEffect ( ( ) => {
23- // If we don't have selected item leave highlighted index as -1
24- if ( ! selectedItem || highlightedIndex !== - 1 ) {
25- return ;
26- }
27-
28- // Find highlighted index in items to select base on selected item value
29- // If there is no match, leave highlighted index as -1
30- setHighlightedIndex ( getIndexToHighlight ( items , selectedItem ) ) ;
31- } , [ highlightedIndex , items , selectedItem ] ) ;
15+ // Derive highlighted index from items and selectedItem
16+ // This automatically updates when items array changes (e.g., API data arrives)
17+ const derivedHighlightedIndex = useMemo ( ( ) => {
18+ if ( ! selectedItem ) return - 1 ;
19+ return getIndexToHighlight ( items , selectedItem ) ;
20+ } , [ items , selectedItem ] ) ;
21+
22+ // Track whether user has interacted with keyboard navigation
23+ // undefined means we should use the derived index
24+ const [ userHighlightedIndex , setUserHighlightedIndex ] = useState <
25+ number | undefined
26+ > ( undefined ) ;
27+
28+ // Use user-set index if available, otherwise use derived index
29+ const highlightedIndex =
30+ userHighlightedIndex !== undefined
31+ ? userHighlightedIndex
32+ : derivedHighlightedIndex ;
3233
3334 const handleHighlightedIndexChange = ( {
34- highlightedIndex,
35+ highlightedIndex : newIndex ,
3536 } : UseComboboxStateChange < T > | UseSelectStateChange < T > ) => {
36- if ( selectedItem && highlightedIndex === - 1 ) {
37- setHighlightedIndex ( getIndexToHighlight ( items , selectedItem ) ) ;
37+ if ( selectedItem && newIndex === - 1 ) {
38+ // When Downshift resets to -1, fall back to derived index
39+ setUserHighlightedIndex ( undefined ) ;
3840 } else {
39- setHighlightedIndex ( highlightedIndex ) ;
41+ setUserHighlightedIndex ( newIndex ) ;
4042 }
4143 } ;
4244
0 commit comments