Skip to content

Commit c66ef5d

Browse files
authored
Fix OpenAPI tabs selection (#2914)
1 parent f774f9b commit c66ef5d

File tree

1 file changed

+14
-3
lines changed

1 file changed

+14
-3
lines changed

packages/react-openapi/src/OpenAPITabs.tsx

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import { createContext, useContext, useEffect, useMemo, useRef, useState } from 'react';
44
import { type Key, Tab, TabList, TabPanel, Tabs, type TabsProps } from 'react-aria-components';
5+
import { useEventCallback } from 'usehooks-ts';
56
import { Markdown } from './Markdown';
67
import { 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

Comments
 (0)