Skip to content

Commit d1e4e6f

Browse files
Fix x-codeSamples load when switching language tabs in V3 (#706)
* fix x-codeSamples load when switch language tabs * update prop name * set code sample text on initial state load
1 parent 1f9c9fa commit d1e4e6f

File tree

3 files changed

+46
-23
lines changed

3 files changed

+46
-23
lines changed

packages/docusaurus-theme-openapi-docs/src/theme/ApiExplorer/CodeSnippets/index.tsx

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,10 @@ import { useTypedSelector } from "@theme/ApiItem/hooks";
1717
import merge from "lodash/merge";
1818

1919
import { CodeSample, Language } from "./code-snippets-types";
20-
import { mergeCodeSampleLanguage } from "./languages";
20+
import {
21+
getCodeSampleSourceFromLanguage,
22+
mergeCodeSampleLanguage,
23+
} from "./languages";
2124

2225
export const languageSet: Language[] = [
2326
{
@@ -198,20 +201,13 @@ function CodeSnippets({ postman, codeSamples }: Props) {
198201
return defaultLang[0] ?? mergedLangs[0];
199202
});
200203
const [codeText, setCodeText] = useState<string>("");
201-
const [codeSampleCodeText, setCodeSampleCodeText] = useState<string>("");
204+
const [codeSampleCodeText, setCodeSampleCodeText] = useState<
205+
string | (() => string)
206+
>(() => getCodeSampleSourceFromLanguage(language));
202207

203208
useEffect(() => {
204-
// initial active language is custom code sample
205-
if (
206-
language &&
207-
language.sample &&
208-
language.samples &&
209-
language.samplesSources
210-
) {
211-
const sampleIndex = language.samples.findIndex(
212-
(smp) => smp === language.sample
213-
);
214-
setCodeSampleCodeText(language.samplesSources[sampleIndex]);
209+
if (language && !!language.sample) {
210+
setCodeSampleCodeText(getCodeSampleSourceFromLanguage(language));
215211
}
216212

217213
if (language && !!language.options) {
@@ -344,7 +340,9 @@ function CodeSnippets({ postman, codeSamples }: Props) {
344340
action={{
345341
setLanguage: setLanguage,
346342
setSelectedVariant: setSelectedVariant,
343+
setSelectedSample: setSelectedSample,
347344
}}
345+
languageSet={mergedLangs}
348346
lazy
349347
>
350348
{mergedLangs.map((lang) => {
@@ -367,6 +365,7 @@ function CodeSnippets({ postman, codeSamples }: Props) {
367365
includeSample={true}
368366
currentLanguage={lang.language}
369367
defaultValue={selectedSample}
368+
languageSet={mergedLangs}
370369
lazy
371370
>
372371
{lang.samples.map((sample, index) => {
@@ -406,6 +405,7 @@ function CodeSnippets({ postman, codeSamples }: Props) {
406405
includeVariant={true}
407406
currentLanguage={lang.language}
408407
defaultValue={selectedVariant}
408+
languageSet={mergedLangs}
409409
lazy
410410
>
411411
{lang.variants.map((variant, index) => {

packages/docusaurus-theme-openapi-docs/src/theme/ApiExplorer/CodeSnippets/languages.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,3 +35,19 @@ export function mergeCodeSampleLanguage(
3535
return language;
3636
});
3737
}
38+
39+
export function getCodeSampleSourceFromLanguage(language: Language) {
40+
if (
41+
language &&
42+
language.sample &&
43+
language.samples &&
44+
language.samplesSources
45+
) {
46+
const sampleIndex = language.samples.findIndex(
47+
(smp) => smp === language.sample
48+
);
49+
return language.samplesSources[sampleIndex];
50+
}
51+
52+
return "";
53+
}

packages/docusaurus-theme-openapi-docs/src/theme/ApiExplorer/CodeTabs/index.tsx

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -15,32 +15,34 @@ import {
1515
} from "@docusaurus/theme-common/internal";
1616
import { TabItemProps } from "@docusaurus/theme-common/lib/utils/tabsUtils";
1717
import useIsBrowser from "@docusaurus/useIsBrowser";
18-
import { Language, languageSet } from "@theme/ApiExplorer/CodeSnippets";
18+
import { Language } from "@theme/ApiExplorer/CodeSnippets";
1919
import clsx from "clsx";
2020

2121
export interface Props {
2222
action: {
2323
[key: string]: React.Dispatch<any>;
2424
};
2525
currentLanguage: Language;
26+
languageSet: Language[];
2627
includeVariant: boolean;
2728
}
2829

29-
export interface TabListProps extends Props, TabProps {
30+
export interface CodeTabsProps extends Props, TabProps {
3031
includeSample?: boolean;
3132
}
3233

3334
function TabList({
3435
action,
3536
currentLanguage,
37+
languageSet,
3638
includeVariant,
3739
includeSample,
3840
className,
3941
block,
4042
selectedValue,
4143
selectValue,
4244
tabValues,
43-
}: TabListProps & ReturnType<typeof useTabs>) {
45+
}: CodeTabsProps & ReturnType<typeof useTabs>) {
4446
const tabRefs: (HTMLLIElement | null)[] = [];
4547
const { blockElementScrollPositionUntilNextRender } =
4648
useScrollPositionBlocker();
@@ -68,15 +70,18 @@ function TabList({
6870
)[0];
6971
newLanguage.variant = newTabValue;
7072
action.setSelectedVariant(newTabValue.toLowerCase());
73+
} else if (currentLanguage && includeSample) {
74+
newLanguage = languageSet.filter(
75+
(lang: Language) => lang.language === currentLanguage
76+
)[0];
77+
newLanguage.sample = newTabValue;
78+
action.setSelectedSample(newTabValue);
7179
} else {
7280
newLanguage = languageSet.filter(
7381
(lang: Language) => lang.language === newTabValue
7482
)[0];
7583
action.setSelectedVariant(newLanguage.variant.toLowerCase());
76-
}
77-
if (currentLanguage && includeSample) {
78-
newLanguage.sample = newTabValue;
79-
action.setSelectedSample(newTabValue.toLowerCase());
84+
action.setSelectedSample(newLanguage.sample);
8085
}
8186
action.setLanguage(newLanguage);
8287
}
@@ -151,7 +156,7 @@ function TabContent({
151156
lazy,
152157
children,
153158
selectedValue,
154-
}: TabProps & ReturnType<typeof useTabs>): React.JSX.Element | null {
159+
}: CodeTabsProps & ReturnType<typeof useTabs>): React.JSX.Element | null {
155160
const childTabs = (Array.isArray(children) ? children : [children]).filter(
156161
Boolean
157162
) as ReactElement<TabItemProps>[];
@@ -177,7 +182,7 @@ function TabContent({
177182
);
178183
}
179184

180-
function TabsComponent(props: TabProps & Props): React.JSX.Element {
185+
function TabsComponent(props: CodeTabsProps & Props): React.JSX.Element {
181186
const tabs = useTabs(props);
182187
const { className } = props;
183188

@@ -191,7 +196,9 @@ function TabsComponent(props: TabProps & Props): React.JSX.Element {
191196
);
192197
}
193198

194-
export default function CodeTabs(props: TabProps & Props): React.JSX.Element {
199+
export default function CodeTabs(
200+
props: CodeTabsProps & Props
201+
): React.JSX.Element {
195202
const isBrowser = useIsBrowser();
196203
return (
197204
<TabsComponent

0 commit comments

Comments
 (0)