22
33import { createContext , useContext , useEffect , useMemo , useRef , useState } from 'react' ;
44import { type Key , Tab , TabList , TabPanel , Tabs , type TabsProps } from 'react-aria-components' ;
5+ import { useEventCallback } from 'usehooks-ts' ;
56import { Markdown } from './Markdown' ;
67import { getOrCreateTabStoreByKey } from './useSyncedTabsGlobalState' ;
78
@@ -44,6 +45,16 @@ export function OpenAPITabs(
4445 }
4546 return items [ 0 ] ?. key ?? null ;
4647 } ) ;
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+ } ) ;
4758 const selectedTab = items . find ( ( item ) => item . key === tabKey ) ?? items [ 0 ] ?? null ;
4859 const cancelDeferRef = useRef < ( ( ) => void ) | null > ( null ) ;
4960 useEffect ( ( ) => {
@@ -53,9 +64,9 @@ export function OpenAPITabs(
5364 const store = getOrCreateTabStoreByKey ( stateKey ) ;
5465 return store . subscribe ( ( state ) => {
5566 cancelDeferRef . current ?.( ) ;
56- cancelDeferRef . current = defer ( ( ) => setTabKey ( state . tabKey ) ) ;
67+ cancelDeferRef . current = defer ( ( ) => selectTab ( state . tabKey ) ) ;
5768 } ) ;
58- } , [ stateKey ] ) ;
69+ } , [ stateKey , selectTab ] ) ;
5970 useEffect ( ( ) => {
6071 return ( ) => cancelDeferRef . current ?.( ) ;
6172 } , [ ] ) ;
@@ -65,7 +76,7 @@ export function OpenAPITabs(
6576 < Tabs
6677 className = "openapi-tabs"
6778 onSelectionChange = { ( tabKey ) => {
68- setTabKey ( tabKey ) ;
79+ selectTab ( tabKey ) ;
6980 if ( stateKey ) {
7081 const store = getOrCreateTabStoreByKey ( stateKey ) ;
7182 store . setState ( { tabKey } ) ;
0 commit comments