1
1
/**
2
2
* External dependencies
3
3
*/
4
- import { useStoreState } from '@ariakit/react' ;
4
+ import * as Ariakit from '@ariakit/react' ;
5
+ import clsx from 'clsx' ;
5
6
6
7
/**
7
8
* WordPress dependencies
@@ -14,11 +15,10 @@ import { useMergeRefs } from '@wordpress/compose';
14
15
* Internal dependencies
15
16
*/
16
17
import type { TabListProps } from './types' ;
17
- import { useTabsContext } from './context' ;
18
- import { StyledTabList } from './styles' ;
19
18
import type { WordPressComponentProps } from '../context' ;
20
- import clsx from 'clsx' ;
21
19
import type { ElementOffsetRect } from '../utils/element-rect' ;
20
+ import { useTabsContext } from './context' ;
21
+ import { StyledTabList } from './styles' ;
22
22
import { useTrackElementOffsetRect } from '../utils/element-rect' ;
23
23
import { useTrackOverflow } from './use-track-overflow' ;
24
24
import { useAnimatedOffsetRect } from '../utils/hooks/use-animated-offset-rect' ;
@@ -62,15 +62,25 @@ export const TabList = forwardRef<
62
62
> ( function TabList ( { children, ...otherProps } , ref ) {
63
63
const { store } = useTabsContext ( ) ?? { } ;
64
64
65
- const selectedId = useStoreState ( store , 'selectedId' ) ;
66
- const activeId = useStoreState ( store , 'activeId' ) ;
67
- const selectOnMove = useStoreState ( store , 'selectOnMove' ) ;
68
- const items = useStoreState ( store , 'items' ) ;
65
+ const selectedId = Ariakit . useStoreState ( store , 'selectedId' ) ;
66
+ const activeId = Ariakit . useStoreState ( store , 'activeId' ) ;
67
+ const selectOnMove = Ariakit . useStoreState ( store , 'selectOnMove' ) ;
68
+ const items = Ariakit . useStoreState ( store , 'items' ) ;
69
69
const [ parent , setParent ] = useState < HTMLElement > ( ) ;
70
70
const refs = useMergeRefs ( [ ref , setParent ] ) ;
71
- const selectedRect = useTrackElementOffsetRect (
72
- store ?. item ( selectedId ) ?. element
73
- ) ;
71
+
72
+ const selectedItem = store ?. item ( selectedId ) ;
73
+ const renderedItems = Ariakit . useStoreState ( store , 'renderedItems' ) ;
74
+
75
+ const selectedItemIndex =
76
+ renderedItems && selectedItem
77
+ ? renderedItems . indexOf ( selectedItem )
78
+ : - 1 ;
79
+ // Use selectedItemIndex as a dependency to force recalculation when the
80
+ // selected item index changes (elements are swapped / added / removed).
81
+ const selectedRect = useTrackElementOffsetRect ( selectedItem ?. element , [
82
+ selectedItemIndex ,
83
+ ] ) ;
74
84
75
85
// Track overflow to show scroll hints.
76
86
const overflow = useTrackOverflow ( parent , {
0 commit comments