update CodeSnippets to fix issue with overlay examples tab not showing correctly

This commit is contained in:
darrell-thobe-sp
2025-02-01 21:36:09 -05:00
parent 99511b5ff9
commit 2c404124a7
9 changed files with 3180 additions and 3200 deletions

View File

@@ -5,23 +5,23 @@
* LICENSE file in the root directory of this source tree.
* ========================================================================== */
import React, { useState, useEffect } from "react";
import React, {useState, useEffect} from 'react';
import useDocusaurusContext from "@docusaurus/useDocusaurusContext";
import ApiCodeBlock from "@theme/ApiExplorer/ApiCodeBlock";
import buildPostmanRequest from "@theme/ApiExplorer/buildPostmanRequest";
import CodeTabs from "@theme/ApiExplorer/CodeTabs";
import { useTypedSelector } from "@theme/ApiItem/hooks";
import codegen from "postman-code-generators";
import sdk from "postman-collection";
import useDocusaurusContext from '@docusaurus/useDocusaurusContext';
import ApiCodeBlock from '@theme/ApiExplorer/ApiCodeBlock';
import buildPostmanRequest from '@theme/ApiExplorer/buildPostmanRequest';
import CodeTabs from '@theme/ApiExplorer/CodeTabs';
import {useTypedSelector} from '@theme/ApiItem/hooks';
import codegen from 'postman-code-generators';
import sdk from 'postman-collection';
import { CodeSample, Language } from "./code-snippets-types";
import {CodeSample, Language} from './code-snippets-types';
import {
getCodeSampleSourceFromLanguage,
mergeArraysbyLanguage,
mergeCodeSampleLanguage,
generateLanguageSet,
} from "./languages";
} from './languages';
export const languageSet: Language[] = generateLanguageSet();
@@ -30,16 +30,16 @@ export interface Props {
codeSamples: CodeSample[];
}
function CodeTab({ children, hidden, className }: any): JSX.Element {
function CodeTab({children, hidden, className}: any): JSX.Element {
return (
<div role="tabpanel" className={className} {...{ hidden }}>
<div role="tabpanel" className={className} {...{hidden}}>
{children}
</div>
);
}
function CodeSnippets({ postman, codeSamples }: Props) {
const { siteConfig } = useDocusaurusContext();
function CodeSnippets({postman, codeSamples}: Props) {
const {siteConfig} = useDocusaurusContext();
const contentType = useTypedSelector((state: any) => state.contentType.value);
const accept = useTypedSelector((state: any) => state.accept.value);
@@ -69,13 +69,13 @@ function CodeSnippets({ postman, codeSamples }: Props) {
// Merge user-defined langs into languageSet
const mergedLangs = mergeCodeSampleLanguage(
mergeArraysbyLanguage(userDefinedLanguageSet, filteredLanguageSet),
codeSamples
codeSamples,
);
// Read defaultLang from localStorage
const defaultLang: Language[] = mergedLangs.filter(
(lang) =>
lang.language === localStorage.getItem("docusaurus.tab.code-samples")
lang.language === localStorage.getItem('docusaurus.tab.code-samples'),
);
const [selectedVariant, setSelectedVariant] = useState<string | undefined>();
const [selectedSample, setSelectedSample] = useState<string | undefined>();
@@ -87,7 +87,7 @@ function CodeSnippets({ postman, codeSamples }: Props) {
// Fall back to language in localStorage or first user-defined language
return defaultLang[0] ?? mergedLangs[0];
});
const [codeText, setCodeText] = useState<string>("");
const [codeText, setCodeText] = useState<string>('');
const [codeSampleCodeText, setCodeSampleCodeText] = useState<
string | (() => string)
>(() => getCodeSampleSourceFromLanguage(language));
@@ -119,17 +119,17 @@ function CodeSnippets({ postman, codeSamples }: Props) {
return;
}
setCodeText(snippet);
}
},
);
} else if (language && !language.options) {
const langSource = mergedLangs.filter(
(lang) => lang.language === language.language
(lang) => lang.language === language.language,
);
// Merges user-defined language with default languageSet
// This allows users to define only the minimal properties necessary in languageTabs
// User-defined properties should override languageSet properties
const mergedLanguage = { ...langSource[0], ...language };
const mergedLanguage = {...langSource[0], ...language};
const postmanRequest = buildPostmanRequest(postman, {
queryParams,
pathParams,
@@ -152,10 +152,10 @@ function CodeSnippets({ postman, codeSamples }: Props) {
return;
}
setCodeText(snippet);
}
},
);
} else {
setCodeText("");
setCodeText('');
}
}, [
accept,
@@ -195,7 +195,7 @@ function CodeSnippets({ postman, codeSamples }: Props) {
return;
}
setCodeText(snippet);
}
},
);
}
});
@@ -211,7 +211,7 @@ function CodeSnippets({ postman, codeSamples }: Props) {
selectedSample !== language.sample
) {
const sampleIndex = language.samples.findIndex(
(smp) => smp === selectedSample
(smp) => smp === selectedSample,
);
setCodeSampleCodeText(language.samplesSources[sampleIndex]);
}
@@ -233,8 +233,7 @@ function CodeSnippets({ postman, codeSamples }: Props) {
}}
languageSet={mergedLangs}
defaultValue={defaultLang[0]?.language ?? mergedLangs[0].language}
lazy
>
lazy>
{mergedLangs.map((lang) => {
return (
<CodeTab
@@ -243,23 +242,24 @@ function CodeSnippets({ postman, codeSamples }: Props) {
key={lang.language}
attributes={{
className: `openapi-tabs__code-item--${lang.logoClass}`,
}}
>
{/* Inner x-codeSamples tabs */}
{lang.samples && (
<CodeTabs
className="openapi-tabs__code-container-inner"
action={{
setLanguage: setLanguage,
setSelectedSample: setSelectedSample,
}}
includeSample={true}
currentLanguage={lang.language}
defaultValue={selectedSample}
languageSet={mergedLangs}
lazy
>
{lang.samples.map((sample, index) => {
}}>
{/* Merged CodeTabs for both samples and variants */}
<CodeTabs
className="openapi-tabs__code-container-inner"
action={{
setLanguage: setLanguage,
setSelectedSample: setSelectedSample,
setSelectedVariant: setSelectedVariant,
}}
includeSample={true}
includeVariant={true}
currentLanguage={lang.language}
defaultValue={selectedSample || selectedVariant} // Set default value based on whichever is selected
languageSet={mergedLangs}
lazy>
{/* Render Sample Tabs */}
{lang.samples &&
lang.samples.map((sample, index) => {
return (
<CodeTab
value={sample}
@@ -268,59 +268,42 @@ function CodeSnippets({ postman, codeSamples }: Props) {
? lang.samplesLabels[index]
: sample
}
key={`${lang.language}-${lang.sample}`}
key={`${lang.language}-sample-${index}`} // Unique key for each sample
attributes={{
className: `openapi-tabs__code-item--sample`,
}}
>
}}>
{/* @ts-ignore */}
<ApiCodeBlock
language={lang.highlight}
className="openapi-explorer__code-block"
showLineNumbers={true}
>
showLineNumbers={true}>
{codeSampleCodeText}
</ApiCodeBlock>
</CodeTab>
);
})}
</CodeTabs>
)}
{/* Inner generated code snippets */}
<CodeTabs
className="openapi-tabs__code-container-inner"
action={{
setLanguage: setLanguage,
setSelectedVariant: setSelectedVariant,
}}
includeVariant={true}
currentLanguage={lang.language}
defaultValue={selectedVariant}
languageSet={mergedLangs}
lazy
>
{lang.variants.map((variant, index) => {
return (
<CodeTab
value={variant.toLowerCase()}
label={variant.toUpperCase()}
key={`${lang.language}-${lang.variant}`}
attributes={{
className: `openapi-tabs__code-item--variant`,
}}
>
{/* @ts-ignore */}
<ApiCodeBlock
language={lang.highlight}
className="openapi-explorer__code-block"
showLineNumbers={true}
>
{codeText}
</ApiCodeBlock>
</CodeTab>
);
})}
{/* Render Variant Tabs */}
{lang.variants &&
lang.variants.map((variant, index) => {
return (
<CodeTab
value={variant.toLowerCase()}
label={variant.toUpperCase()}
key={`${lang.language}-variant-${index}`} // Unique key for each variant
attributes={{
className: `openapi-tabs__code-item--variant`,
}}>
{/* @ts-ignore */}
<ApiCodeBlock
language={lang.highlight}
className="openapi-explorer__code-block"
showLineNumbers={true}>
{codeText}
</ApiCodeBlock>
</CodeTab>
);
})}
</CodeTabs>
</CodeTab>
);

View File

@@ -136,6 +136,7 @@ function TabList({
};
return (
<ul
role="tablist"
aria-orientation="horizontal"
@@ -209,7 +210,6 @@ function TabContent({
function TabsComponent(props: CodeTabsProps & Props): React.JSX.Element {
const tabs = useTabs(props);
const { className } = props;
return (
<div
className={clsx("tabs-container openapi-tabs__code-container", className)}

View File

@@ -8,8 +8,6 @@ function SecuritySchemes(props: any) {
const selected = useTypedSelector((state: any) => state.auth.selected);
const infoAuthPath = `/${props.infoPath}#authentication`;
console.log(props)
if (selected === undefined) return null;
if (options[selected]?.[0]?.type === undefined) {
@@ -182,7 +180,6 @@ function SecuritySchemes(props: any) {
}
if (isOauth2) {
console.log(auth)
const { name, key, type, scopes, flows, ...rest } = auth;
return (
<React.Fragment key={selected}>

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff