docusaurus-theme-openapi-docs 0.0.0-1258 → 0.0.0-1267

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -69,6 +69,7 @@ var __importDefault =
69
69
  Object.defineProperty(exports, "__esModule", { value: true });
70
70
  exports.languageSet = void 0;
71
71
  const react_1 = __importStar(require("react"));
72
+ const theme_common_1 = require("@docusaurus/theme-common");
72
73
  const useDocusaurusContext_1 = __importDefault(
73
74
  require("@docusaurus/useDocusaurusContext")
74
75
  );
@@ -94,6 +95,17 @@ function CodeTab({ children, hidden, className }) {
94
95
  children
95
96
  );
96
97
  }
98
+ /** Align with Docusaurus `<Tabs groupId="code-samples">` persisted tab value. */
99
+ function resolveOuterLanguageFromPersistedTab(persistedTab, langs) {
100
+ if (langs.length === 1) {
101
+ return langs[0];
102
+ }
103
+ const matched = langs.find((lang) => lang.language === persistedTab);
104
+ if (matched) {
105
+ return matched;
106
+ }
107
+ return langs[0];
108
+ }
97
109
  function CodeSnippets({
98
110
  postman,
99
111
  codeSamples,
@@ -170,35 +182,44 @@ function CodeSnippets({
170
182
  // Can override languageSet, change order of langs, override options and variants
171
183
  const userDefinedLanguageSet =
172
184
  siteConfig?.themeConfig?.languageTabs ?? exports.languageSet;
173
- // Filter languageSet by user-defined langs
174
- const filteredLanguageSet = exports.languageSet.filter((ls) => {
175
- return userDefinedLanguageSet?.some((lang) => {
176
- return lang.language === ls.language;
185
+ const mergedLangs = (0, react_1.useMemo)(() => {
186
+ const filteredLanguageSet = exports.languageSet.filter((ls) => {
187
+ return userDefinedLanguageSet?.some((lang) => {
188
+ return lang.language === ls.language;
189
+ });
177
190
  });
178
- });
179
- // Merge user-defined langs into languageSet
180
- const mergedLangs = (0, languages_1.mergeCodeSampleLanguage)(
181
- (0, languages_1.mergeArraysbyLanguage)(
182
- userDefinedLanguageSet,
183
- filteredLanguageSet
184
- ),
185
- codeSamples
191
+ return (0, languages_1.mergeCodeSampleLanguage)(
192
+ (0, languages_1.mergeArraysbyLanguage)(
193
+ userDefinedLanguageSet,
194
+ filteredLanguageSet
195
+ ),
196
+ codeSamples
197
+ );
198
+ }, [userDefinedLanguageSet, codeSamples]);
199
+ const [persistedOuterTab] = (0, theme_common_1.useStorageSlot)(
200
+ "docusaurus.tab.code-samples"
186
201
  );
187
- // Read defaultLang from localStorage
188
- const defaultLang = mergedLangs.filter(
189
- (lang) =>
190
- lang.language === localStorage.getItem("docusaurus.tab.code-samples")
202
+ const initialOuterLanguage = (0, react_1.useMemo)(
203
+ () => resolveOuterLanguageFromPersistedTab(persistedOuterTab, mergedLangs),
204
+ [persistedOuterTab, mergedLangs]
191
205
  );
192
206
  const [selectedVariant, setSelectedVariant] = (0, react_1.useState)();
193
207
  const [selectedSample, setSelectedSample] = (0, react_1.useState)();
194
- const [language, setLanguage] = (0, react_1.useState)(() => {
195
- // Return first index if only 1 user-defined language exists
196
- if (mergedLangs.length === 1) {
197
- return mergedLangs[0];
198
- }
199
- // Fall back to language in localStorage or first user-defined language
200
- return defaultLang[0] ?? mergedLangs[0];
201
- });
208
+ const [language, setLanguage] = (0, react_1.useState)(() =>
209
+ resolveOuterLanguageFromPersistedTab(persistedOuterTab, mergedLangs)
210
+ );
211
+ (0, react_1.useEffect)(() => {
212
+ const next = resolveOuterLanguageFromPersistedTab(
213
+ persistedOuterTab,
214
+ mergedLangs
215
+ );
216
+ setLanguage((prev) => {
217
+ if (prev?.language !== next.language) {
218
+ return next;
219
+ }
220
+ return mergedLangs.find((l) => l.language === next.language) ?? next;
221
+ });
222
+ }, [persistedOuterTab, mergedLangs]);
202
223
  const [codeText, setCodeText] = (0, react_1.useState)("");
203
224
  const [codeSampleCodeText, setCodeSampleCodeText] = (0, react_1.useState)(
204
225
  () => (0, languages_1.getCodeSampleSourceFromLanguage)(language)
@@ -315,7 +336,7 @@ function CodeSnippets({
315
336
  setSelectedSample: setSelectedSample,
316
337
  },
317
338
  languageSet: mergedLangs,
318
- defaultValue: defaultLang[0]?.language ?? mergedLangs[0].language,
339
+ defaultValue: initialOuterLanguage.language,
319
340
  lazy: true,
320
341
  },
321
342
  mergedLangs.map((lang) => {
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "docusaurus-theme-openapi-docs",
3
3
  "description": "OpenAPI theme for Docusaurus.",
4
- "version": "0.0.0-1258",
4
+ "version": "0.0.0-1267",
5
5
  "license": "MIT",
6
6
  "keywords": [
7
7
  "openapi",
@@ -38,7 +38,7 @@
38
38
  "@types/postman-collection": "^3.5.11",
39
39
  "@types/react-modal": "^3.16.3",
40
40
  "concurrently": "^9.2.0",
41
- "docusaurus-plugin-openapi-docs": "0.0.0-1258",
41
+ "docusaurus-plugin-openapi-docs": "0.0.0-1267",
42
42
  "docusaurus-plugin-sass": "^0.2.6",
43
43
  "eslint-plugin-prettier": "^5.5.1"
44
44
  },
@@ -82,5 +82,5 @@
82
82
  "engines": {
83
83
  "node": ">=14"
84
84
  },
85
- "gitHead": "54019febae5105135595ecb0eef0e1a88ec2eeb0"
85
+ "gitHead": "fae66624a389286ba5ccf067ff73ac435307cbb9"
86
86
  }
@@ -5,20 +5,20 @@
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  * ========================================================================== */
7
7
 
8
- import React, { useState, useEffect } from "react";
8
+ import React, { useEffect, useMemo, useState } from "react";
9
9
 
10
+ import { useStorageSlot } from "@docusaurus/theme-common";
10
11
  import useDocusaurusContext from "@docusaurus/useDocusaurusContext";
11
12
  import ApiCodeBlock from "@theme/ApiExplorer/ApiCodeBlock";
12
13
  import buildPostmanRequest from "@theme/ApiExplorer/buildPostmanRequest";
13
14
  import CodeTabs from "@theme/ApiExplorer/CodeTabs";
14
15
  import { useResolvedEncoding } from "@theme/ApiExplorer/EncodingSelection/useResolvedEncoding";
15
16
  import { useTypedSelector } from "@theme/ApiItem/hooks";
17
+ import type { ThemeConfig } from "docusaurus-theme-openapi-docs/src/types";
16
18
  import cloneDeep from "lodash/cloneDeep";
17
19
  import codegen from "postman-code-generators";
18
20
  import * as sdk from "postman-collection";
19
21
 
20
- import type { ThemeConfig } from "docusaurus-theme-openapi-docs/src/types";
21
-
22
22
  import { CodeSample, Language } from "./code-snippets-types";
23
23
  import {
24
24
  getCodeSampleSourceFromLanguage,
@@ -44,6 +44,21 @@ function CodeTab({ children, hidden, className }: any): React.JSX.Element {
44
44
  );
45
45
  }
46
46
 
47
+ /** Align with Docusaurus `<Tabs groupId="code-samples">` persisted tab value. */
48
+ function resolveOuterLanguageFromPersistedTab(
49
+ persistedTab: string | null,
50
+ langs: Language[]
51
+ ): Language {
52
+ if (langs.length === 1) {
53
+ return langs[0];
54
+ }
55
+ const matched = langs.find((lang) => lang.language === persistedTab);
56
+ if (matched) {
57
+ return matched;
58
+ }
59
+ return langs[0];
60
+ }
61
+
47
62
  function CodeSnippets({
48
63
  postman,
49
64
  codeSamples,
@@ -126,34 +141,43 @@ function CodeSnippets({
126
141
  (siteConfig?.themeConfig?.languageTabs as Language[] | undefined) ??
127
142
  languageSet;
128
143
 
129
- // Filter languageSet by user-defined langs
130
- const filteredLanguageSet = languageSet.filter((ls) => {
131
- return userDefinedLanguageSet?.some((lang) => {
132
- return lang.language === ls.language;
144
+ const mergedLangs = useMemo(() => {
145
+ const filteredLanguageSet = languageSet.filter((ls) => {
146
+ return userDefinedLanguageSet?.some((lang) => {
147
+ return lang.language === ls.language;
148
+ });
133
149
  });
134
- });
150
+ return mergeCodeSampleLanguage(
151
+ mergeArraysbyLanguage(userDefinedLanguageSet, filteredLanguageSet),
152
+ codeSamples
153
+ );
154
+ }, [userDefinedLanguageSet, codeSamples]);
135
155
 
136
- // Merge user-defined langs into languageSet
137
- const mergedLangs = mergeCodeSampleLanguage(
138
- mergeArraysbyLanguage(userDefinedLanguageSet, filteredLanguageSet),
139
- codeSamples
140
- );
156
+ const [persistedOuterTab] = useStorageSlot("docusaurus.tab.code-samples");
141
157
 
142
- // Read defaultLang from localStorage
143
- const defaultLang: Language[] = mergedLangs.filter(
144
- (lang) =>
145
- lang.language === localStorage.getItem("docusaurus.tab.code-samples")
158
+ const initialOuterLanguage = useMemo(
159
+ () => resolveOuterLanguageFromPersistedTab(persistedOuterTab, mergedLangs),
160
+ [persistedOuterTab, mergedLangs]
146
161
  );
162
+
147
163
  const [selectedVariant, setSelectedVariant] = useState<string | undefined>();
148
164
  const [selectedSample, setSelectedSample] = useState<string | undefined>();
149
- const [language, setLanguage] = useState(() => {
150
- // Return first index if only 1 user-defined language exists
151
- if (mergedLangs.length === 1) {
152
- return mergedLangs[0];
153
- }
154
- // Fall back to language in localStorage or first user-defined language
155
- return defaultLang[0] ?? mergedLangs[0];
156
- });
165
+ const [language, setLanguage] = useState(() =>
166
+ resolveOuterLanguageFromPersistedTab(persistedOuterTab, mergedLangs)
167
+ );
168
+
169
+ useEffect(() => {
170
+ const next = resolveOuterLanguageFromPersistedTab(
171
+ persistedOuterTab,
172
+ mergedLangs
173
+ );
174
+ setLanguage((prev) => {
175
+ if (prev?.language !== next.language) {
176
+ return next;
177
+ }
178
+ return mergedLangs.find((l) => l.language === next.language) ?? next;
179
+ });
180
+ }, [persistedOuterTab, mergedLangs]);
157
181
  const [codeText, setCodeText] = useState<string>("");
158
182
  const [codeSampleCodeText, setCodeSampleCodeText] = useState<string>(() =>
159
183
  getCodeSampleSourceFromLanguage(language)
@@ -273,7 +297,7 @@ function CodeSnippets({
273
297
  setSelectedSample: setSelectedSample,
274
298
  }}
275
299
  languageSet={mergedLangs}
276
- defaultValue={defaultLang[0]?.language ?? mergedLangs[0].language}
300
+ defaultValue={initialOuterLanguage.language}
277
301
  lazy
278
302
  >
279
303
  {mergedLangs.map((lang) => {