2
2
3
3
import { createContext , useContext , useEffect , useMemo , useRef , useState } from 'react' ;
4
4
import { type Key , Tab , TabList , TabPanel , Tabs , type TabsProps } from 'react-aria-components' ;
5
+ import { useEventCallback } from 'usehooks-ts' ;
5
6
import { Markdown } from './Markdown' ;
6
7
import { getOrCreateTabStoreByKey } from './useSyncedTabsGlobalState' ;
7
8
@@ -44,6 +45,16 @@ export function OpenAPITabs(
44
45
}
45
46
return items [ 0 ] ?. key ?? null ;
46
47
} ) ;
48
+ const selectTab = useEventCallback ( ( key : Key | null ) => {
49
+ if ( ! key || key === tabKey ) {
50
+ return ;
51
+ }
52
+ const tab = items . find ( ( item ) => item . key === key ) ;
53
+ if ( ! tab ) {
54
+ return ;
55
+ }
56
+ setTabKey ( key ) ;
57
+ } ) ;
47
58
const selectedTab = items . find ( ( item ) => item . key === tabKey ) ?? items [ 0 ] ?? null ;
48
59
const cancelDeferRef = useRef < ( ( ) => void ) | null > ( null ) ;
49
60
useEffect ( ( ) => {
@@ -53,9 +64,9 @@ export function OpenAPITabs(
53
64
const store = getOrCreateTabStoreByKey ( stateKey ) ;
54
65
return store . subscribe ( ( state ) => {
55
66
cancelDeferRef . current ?.( ) ;
56
- cancelDeferRef . current = defer ( ( ) => setTabKey ( state . tabKey ) ) ;
67
+ cancelDeferRef . current = defer ( ( ) => selectTab ( state . tabKey ) ) ;
57
68
} ) ;
58
- } , [ stateKey ] ) ;
69
+ } , [ stateKey , selectTab ] ) ;
59
70
useEffect ( ( ) => {
60
71
return ( ) => cancelDeferRef . current ?.( ) ;
61
72
} , [ ] ) ;
@@ -65,7 +76,7 @@ export function OpenAPITabs(
65
76
< Tabs
66
77
className = "openapi-tabs"
67
78
onSelectionChange = { ( tabKey ) => {
68
- setTabKey ( tabKey ) ;
79
+ selectTab ( tabKey ) ;
69
80
if ( stateKey ) {
70
81
const store = getOrCreateTabStoreByKey ( stateKey ) ;
71
82
store . setState ( { tabKey } ) ;
0 commit comments