From 0d1c2e4f24ed59659815543b88fc39ee4940e425 Mon Sep 17 00:00:00 2001 From: Vladimir Gorej Date: Sat, 20 Apr 2024 20:50:55 +0200 Subject: [PATCH 1/7] feat(swagger-ui-react): rewrite into SSR compatible func component Refs #9243 --- flavors/swagger-ui-react/index.jsx | 227 +++++++++++++++-------------- 1 file changed, 121 insertions(+), 106 deletions(-) diff --git a/flavors/swagger-ui-react/index.jsx b/flavors/swagger-ui-react/index.jsx index 1080ca97576..f3811ffcae0 100644 --- a/flavors/swagger-ui-react/index.jsx +++ b/flavors/swagger-ui-react/index.jsx @@ -1,93 +1,131 @@ -import React from "react" +/** + * @prettier + */ +"use client" +import React, { useEffect, useCallback, useState, useRef } from "react" import PropTypes from "prop-types" import SwaggerUIConstructor from "#swagger-ui" -class SwaggerUI extends React.Component { - constructor (props) { - super(props) - this.SwaggerUIComponent = null - this.system = null - } +const SwaggerUI = ({ + spec = SwaggerUIConstructor.defaultOptions.url, + url = SwaggerUIConstructor.defaultOptions.url, + layout = SwaggerUIConstructor.defaultOptions.layout, + requestInterceptor = SwaggerUIConstructor.defaultOptions.requestInterceptor, + responseInterceptor = SwaggerUIConstructor.defaultOptions.responseInterceptor, + supportedSubmitMethods = SwaggerUIConstructor.defaultOptions + .supportedSubmitMethods, + queryConfigEnabled = SwaggerUIConstructor.defaultOptions.queryConfigEnabled, + plugins = SwaggerUIConstructor.defaultOptions.plugins, + displayOperationId = SwaggerUIConstructor.defaultOptions.displayOperationId, + showMutatedRequest = SwaggerUIConstructor.defaultOptions.showMutatedRequest, + docExpansion = SwaggerUIConstructor.defaultOptions.docExpansion, + defaultModelExpandDepth = SwaggerUIConstructor.defaultOptions + .defaultModelExpandDepth, + defaultModelsExpandDepth = SwaggerUIConstructor.defaultOptions + .defaultModelsExpandDepth, + defaultModelRendering = SwaggerUIConstructor.defaultOptions + .defaultModelRendering, + presets = SwaggerUIConstructor.defaultOptions.presets, + deepLinking = SwaggerUIConstructor.defaultOptions.deepLinking, + showExtensions = SwaggerUIConstructor.defaultOptions.showExtensions, + showCommonExtensions = SwaggerUIConstructor.defaultOptions + .showCommonExtensions, + filter = SwaggerUIConstructor.defaultOptions.filter, + requestSnippetsEnabled = SwaggerUIConstructor.defaultOptions + .requestSnippetsEnabled, + requestSnippets = SwaggerUIConstructor.defaultOptions.requestSnippets, + tryItOutEnabled = SwaggerUIConstructor.defaultOptions.tryItOutEnabled, + displayRequestDuration = SwaggerUIConstructor.defaultOptions + .displayRequestDuration, + withCredentials = SwaggerUIConstructor.defaultOptions.withCredentials, + persistAuthorization = SwaggerUIConstructor.defaultOptions + .persistAuthorization, + oauth2RedirectUrl = SwaggerUIConstructor.defaultOptions.oauth2RedirectUrl, + onComplete = null, +}) => { + const systemRef = useRef(null) + const SwaggerUIComponentRef = useRef(null) + const [, forceUpdate] = useState(undefined) - componentDidMount() { - const ui = SwaggerUIConstructor({ - plugins: this.props.plugins, - spec: this.props.spec, - url: this.props.url, + const handleComplete = useCallback(() => { + if (typeof onComplete === "function") { + onComplete() + } + }, [onComplete]) + + useEffect(() => { + const system = SwaggerUIConstructor({ + plugins, + spec, + url, dom_id: null, domNode: null, - layout: this.props.layout, - defaultModelsExpandDepth: this.props.defaultModelsExpandDepth, - defaultModelRendering: this.props.defaultModelRendering, - presets: [SwaggerUIConstructor.presets.apis, ...this.props.presets], - requestInterceptor: this.props.requestInterceptor, - responseInterceptor: this.props.responseInterceptor, - onComplete: this.onComplete, - docExpansion: this.props.docExpansion, - supportedSubmitMethods: this.props.supportedSubmitMethods, - queryConfigEnabled: this.props.queryConfigEnabled, - defaultModelExpandDepth: this.props.defaultModelExpandDepth, - displayOperationId: this.props.displayOperationId, - tryItOutEnabled: this.props.tryItOutEnabled, - displayRequestDuration: this.props.displayRequestDuration, - requestSnippetsEnabled: this.props.requestSnippetsEnabled, - requestSnippets: this.props.requestSnippets, - showMutatedRequest: this.props.showMutatedRequest, - deepLinking: this.props.deepLinking, - showExtensions: this.props.showExtensions, - showCommonExtensions: this.props.showCommonExtensions, - filter: this.props.filter, - persistAuthorization: this.props.persistAuthorization, - withCredentials: this.props.withCredentials, - ...(typeof this.props.oauth2RedirectUrl === "string" ? { oauth2RedirectUrl: this.props.oauth2RedirectUrl} : {}) + layout, + defaultModelsExpandDepth, + defaultModelRendering, + presets: [SwaggerUIConstructor.presets.apis, ...presets], + requestInterceptor, + responseInterceptor, + onComplete: handleComplete, + docExpansion, + supportedSubmitMethods, + queryConfigEnabled, + defaultModelExpandDepth, + displayOperationId, + tryItOutEnabled, + displayRequestDuration, + requestSnippetsEnabled, + requestSnippets, + showMutatedRequest, + deepLinking, + showExtensions, + showCommonExtensions, + filter, + persistAuthorization, + withCredentials, + ...(typeof oauth2RedirectUrl === "string" + ? { oauth2RedirectUrl: oauth2RedirectUrl } + : {}), }) + const SwaggerUIComponent = system.getComponent("App", "root") - this.system = ui - this.SwaggerUIComponent = ui.getComponent("App", "root") - - this.forceUpdate() - } + systemRef.current = system + SwaggerUIComponentRef.current = SwaggerUIComponent + forceUpdate(true) - render() { - return this.SwaggerUIComponent ? : null - } - - componentDidUpdate(prevProps) { - const prevStateUrl = this.system.specSelectors.url() - if(this.props.url !== prevStateUrl || this.props.url !== prevProps.url) { - // flush current content - this.system.specActions.updateSpec("") + return () => { + systemRef.current = null + SwaggerUIComponentRef.current = null + } + }, []) - if(this.props.url) { - // update the internal URL - this.system.specActions.updateUrl(this.props.url) - // trigger remote definition fetch - this.system.specActions.download(this.props.url) + useEffect(() => { + if (systemRef.current) { + const prevStateUrl = systemRef.current.specSelectors.url() + if (url !== prevStateUrl) { + systemRef.current.specActions.updateSpec("") + if (url) { + systemRef.current.specActions.updateUrl(url) + systemRef.current.specActions.download(url) + } } - } - const prevStateSpec = this.system.specSelectors.specStr() - if(this.props.spec && (this.props.spec !== prevStateSpec || this.props.spec !== prevProps.spec)) { - if(typeof this.props.spec === "object") { - this.system.specActions.updateSpec(JSON.stringify(this.props.spec)) - } else { - this.system.specActions.updateSpec(this.props.spec) + const prevStateSpec = systemRef.current.specSelectors.specStr() + if (spec && spec !== prevStateSpec) { + const updatedSpec = + typeof spec === "object" ? JSON.stringify(spec) : spec + systemRef.current.specActions.updateSpec(updatedSpec) } } - } + }, [url, spec]) - onComplete = () => { - if (typeof this.props.onComplete === "function") { - return this.props.onComplete(this.system) - } - } + return SwaggerUIComponentRef.current ? ( + + ) : null } SwaggerUI.propTypes = { - spec: PropTypes.oneOfType([ - PropTypes.string, - PropTypes.object, - ]), + spec: PropTypes.oneOfType([PropTypes.string, PropTypes.object]), url: PropTypes.string, layout: PropTypes.string, requestInterceptor: PropTypes.func, @@ -95,7 +133,16 @@ SwaggerUI.propTypes = { onComplete: PropTypes.func, docExpansion: PropTypes.oneOf(["list", "full", "none"]), supportedSubmitMethods: PropTypes.arrayOf( - PropTypes.oneOf(["get", "put", "post", "delete", "options", "head", "patch", "trace"]) + PropTypes.oneOf([ + "get", + "put", + "post", + "delete", + "options", + "head", + "patch", + "trace", + ]) ), queryConfigEnabled: PropTypes.bool, plugins: PropTypes.oneOfType([ @@ -112,10 +159,7 @@ SwaggerUI.propTypes = { deepLinking: PropTypes.bool, showExtensions: PropTypes.bool, showCommonExtensions: PropTypes.bool, - filter: PropTypes.oneOfType([ - PropTypes.string, - PropTypes.bool, - ]), + filter: PropTypes.oneOfType([PropTypes.string, PropTypes.bool]), requestSnippetsEnabled: PropTypes.bool, requestSnippets: PropTypes.object, tryItOutEnabled: PropTypes.bool, @@ -125,35 +169,6 @@ SwaggerUI.propTypes = { oauth2RedirectUrl: PropTypes.string, } -SwaggerUI.defaultProps = { - spec: SwaggerUIConstructor.defaultOptions.spec, - url: SwaggerUIConstructor.defaultOptions.url, - layout: SwaggerUIConstructor.defaultOptions.layout, - requestInterceptor: SwaggerUIConstructor.defaultOptions.requestInterceptor, - responseInterceptor: SwaggerUIConstructor.defaultOptions.responseInterceptor, - supportedSubmitMethods: SwaggerUIConstructor.defaultOptions.supportedSubmitMethods, - queryConfigEnabled: SwaggerUIConstructor.defaultOptions.queryConfigEnabled, - plugins: SwaggerUIConstructor.defaultOptions.plugins, - displayOperationId: SwaggerUIConstructor.defaultOptions.displayOperationId, - showMutatedRequest: SwaggerUIConstructor.defaultOptions.showMutatedRequest, - docExpansion: SwaggerUIConstructor.defaultOptions.docExpansion, - defaultModelExpandDepth: SwaggerUIConstructor.defaultOptions.defaultModelExpandDepth, - defaultModelsExpandDepth: SwaggerUIConstructor.defaultOptions.defaultModelsExpandDepth, - defaultModelRendering: SwaggerUIConstructor.defaultOptions.defaultModelRendering, - presets: SwaggerUIConstructor.defaultOptions.presets, - deepLinking: SwaggerUIConstructor.defaultOptions.deepLinking, - showExtensions: SwaggerUIConstructor.defaultOptions.showExtensions, - showCommonExtensions: SwaggerUIConstructor.defaultOptions.showCommonExtensions, - filter: SwaggerUIConstructor.defaultOptions.filter, - requestSnippetsEnabled: SwaggerUIConstructor.defaultOptions.requestSnippetsEnabled, - requestSnippets: SwaggerUIConstructor.defaultOptions.requestSnippets, - tryItOutEnabled: SwaggerUIConstructor.defaultOptions.tryItOutEnabled, - displayRequestDuration: SwaggerUIConstructor.defaultOptions.displayRequestDuration, - withCredentials: SwaggerUIConstructor.defaultOptions.withCredentials, - persistAuthorization: SwaggerUIConstructor.defaultOptions.persistAuthorization, - oauth2RedirectUrl: undefined, -} - SwaggerUI.System = SwaggerUIConstructor.System SwaggerUI.presets = SwaggerUIConstructor.presets SwaggerUI.plugins = SwaggerUIConstructor.plugins From 8456dd46ce33595e0dffd1dc86de200890456eb0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Gorej?= Date: Sat, 20 Apr 2024 20:56:24 +0200 Subject: [PATCH 2/7] Update flavors/swagger-ui-react/index.jsx --- flavors/swagger-ui-react/index.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flavors/swagger-ui-react/index.jsx b/flavors/swagger-ui-react/index.jsx index f3811ffcae0..58d0efbd506 100644 --- a/flavors/swagger-ui-react/index.jsx +++ b/flavors/swagger-ui-react/index.jsx @@ -45,7 +45,7 @@ const SwaggerUI = ({ }) => { const systemRef = useRef(null) const SwaggerUIComponentRef = useRef(null) - const [, forceUpdate] = useState(undefined) + const [, forceUpdate] = useState(false) const handleComplete = useCallback(() => { if (typeof onComplete === "function") { From 8b7125baec504881796c6975a0f7b46f65850f12 Mon Sep 17 00:00:00 2001 From: Vladimir Gorej Date: Sat, 20 Apr 2024 21:02:49 +0200 Subject: [PATCH 3/7] fix: defaultProps --- flavors/swagger-ui-react/index.jsx | 44 ++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/flavors/swagger-ui-react/index.jsx b/flavors/swagger-ui-react/index.jsx index 58d0efbd506..12c3c326085 100644 --- a/flavors/swagger-ui-react/index.jsx +++ b/flavors/swagger-ui-react/index.jsx @@ -169,8 +169,52 @@ SwaggerUI.propTypes = { oauth2RedirectUrl: PropTypes.string, } +/** + * TODO(vladimir.gorej@gmail.com): can be removed when SwaggerEditor@5 stars to use SwaggerUI.defaultOptions + * + * SwaggerEditor@5 currently relies on SwaggerUI.defaultProps. As soon as it migrates to SwaggerUI.defaultOptions, + * we can remove SwaggerUI.defaultProps as we already use defaults in the props destructuring. * + */ +SwaggerUI.defaultProps = { + spec: SwaggerUIConstructor.defaultOptions.spec, + url: SwaggerUIConstructor.defaultOptions.url, + layout: SwaggerUIConstructor.defaultOptions.layout, + requestInterceptor: SwaggerUIConstructor.defaultOptions.requestInterceptor, + responseInterceptor: SwaggerUIConstructor.defaultOptions.responseInterceptor, + supportedSubmitMethods: + SwaggerUIConstructor.defaultOptions.supportedSubmitMethods, + queryConfigEnabled: SwaggerUIConstructor.defaultOptions.queryConfigEnabled, + plugins: SwaggerUIConstructor.defaultOptions.plugins, + displayOperationId: SwaggerUIConstructor.defaultOptions.displayOperationId, + showMutatedRequest: SwaggerUIConstructor.defaultOptions.showMutatedRequest, + docExpansion: SwaggerUIConstructor.defaultOptions.docExpansion, + defaultModelExpandDepth: + SwaggerUIConstructor.defaultOptions.defaultModelExpandDepth, + defaultModelsExpandDepth: + SwaggerUIConstructor.defaultOptions.defaultModelsExpandDepth, + defaultModelRendering: + SwaggerUIConstructor.defaultOptions.defaultModelRendering, + presets: SwaggerUIConstructor.defaultOptions.presets, + deepLinking: SwaggerUIConstructor.defaultOptions.deepLinking, + showExtensions: SwaggerUIConstructor.defaultOptions.showExtensions, + showCommonExtensions: + SwaggerUIConstructor.defaultOptions.showCommonExtensions, + filter: SwaggerUIConstructor.defaultOptions.filter, + requestSnippetsEnabled: + SwaggerUIConstructor.defaultOptions.requestSnippetsEnabled, + requestSnippets: SwaggerUIConstructor.defaultOptions.requestSnippets, + tryItOutEnabled: SwaggerUIConstructor.defaultOptions.tryItOutEnabled, + displayRequestDuration: + SwaggerUIConstructor.defaultOptions.displayRequestDuration, + withCredentials: SwaggerUIConstructor.defaultOptions.withCredentials, + persistAuthorization: + SwaggerUIConstructor.defaultOptions.persistAuthorization, + oauth2RedirectUrl: SwaggerUIConstructor.defaultOptions.oauth2RedirectUrl, +} + SwaggerUI.System = SwaggerUIConstructor.System SwaggerUI.presets = SwaggerUIConstructor.presets SwaggerUI.plugins = SwaggerUIConstructor.plugins +SwaggerUI.defaultOptions = SwaggerUIConstructor.defaultOptions export default SwaggerUI From a28be34380dea095c8673a9c7235be0cc4ac78b9 Mon Sep 17 00:00:00 2001 From: Vladimir Gorej Date: Sat, 20 Apr 2024 21:12:27 +0200 Subject: [PATCH 4/7] fix: remove defaultProps --- flavors/swagger-ui-react/index.jsx | 43 ------------------------------ 1 file changed, 43 deletions(-) diff --git a/flavors/swagger-ui-react/index.jsx b/flavors/swagger-ui-react/index.jsx index 12c3c326085..f865eb020c4 100644 --- a/flavors/swagger-ui-react/index.jsx +++ b/flavors/swagger-ui-react/index.jsx @@ -169,49 +169,6 @@ SwaggerUI.propTypes = { oauth2RedirectUrl: PropTypes.string, } -/** - * TODO(vladimir.gorej@gmail.com): can be removed when SwaggerEditor@5 stars to use SwaggerUI.defaultOptions - * - * SwaggerEditor@5 currently relies on SwaggerUI.defaultProps. As soon as it migrates to SwaggerUI.defaultOptions, - * we can remove SwaggerUI.defaultProps as we already use defaults in the props destructuring. * - */ -SwaggerUI.defaultProps = { - spec: SwaggerUIConstructor.defaultOptions.spec, - url: SwaggerUIConstructor.defaultOptions.url, - layout: SwaggerUIConstructor.defaultOptions.layout, - requestInterceptor: SwaggerUIConstructor.defaultOptions.requestInterceptor, - responseInterceptor: SwaggerUIConstructor.defaultOptions.responseInterceptor, - supportedSubmitMethods: - SwaggerUIConstructor.defaultOptions.supportedSubmitMethods, - queryConfigEnabled: SwaggerUIConstructor.defaultOptions.queryConfigEnabled, - plugins: SwaggerUIConstructor.defaultOptions.plugins, - displayOperationId: SwaggerUIConstructor.defaultOptions.displayOperationId, - showMutatedRequest: SwaggerUIConstructor.defaultOptions.showMutatedRequest, - docExpansion: SwaggerUIConstructor.defaultOptions.docExpansion, - defaultModelExpandDepth: - SwaggerUIConstructor.defaultOptions.defaultModelExpandDepth, - defaultModelsExpandDepth: - SwaggerUIConstructor.defaultOptions.defaultModelsExpandDepth, - defaultModelRendering: - SwaggerUIConstructor.defaultOptions.defaultModelRendering, - presets: SwaggerUIConstructor.defaultOptions.presets, - deepLinking: SwaggerUIConstructor.defaultOptions.deepLinking, - showExtensions: SwaggerUIConstructor.defaultOptions.showExtensions, - showCommonExtensions: - SwaggerUIConstructor.defaultOptions.showCommonExtensions, - filter: SwaggerUIConstructor.defaultOptions.filter, - requestSnippetsEnabled: - SwaggerUIConstructor.defaultOptions.requestSnippetsEnabled, - requestSnippets: SwaggerUIConstructor.defaultOptions.requestSnippets, - tryItOutEnabled: SwaggerUIConstructor.defaultOptions.tryItOutEnabled, - displayRequestDuration: - SwaggerUIConstructor.defaultOptions.displayRequestDuration, - withCredentials: SwaggerUIConstructor.defaultOptions.withCredentials, - persistAuthorization: - SwaggerUIConstructor.defaultOptions.persistAuthorization, - oauth2RedirectUrl: SwaggerUIConstructor.defaultOptions.oauth2RedirectUrl, -} - SwaggerUI.System = SwaggerUIConstructor.System SwaggerUI.presets = SwaggerUIConstructor.presets SwaggerUI.plugins = SwaggerUIConstructor.plugins From 8c6af1a2bc4def4b0faac3bc023aa09ebb349e95 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Gorej?= Date: Sat, 20 Apr 2024 21:14:08 +0200 Subject: [PATCH 5/7] Update flavors/swagger-ui-react/index.jsx --- flavors/swagger-ui-react/index.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flavors/swagger-ui-react/index.jsx b/flavors/swagger-ui-react/index.jsx index f865eb020c4..8ec75fa3f25 100644 --- a/flavors/swagger-ui-react/index.jsx +++ b/flavors/swagger-ui-react/index.jsx @@ -7,7 +7,7 @@ import PropTypes from "prop-types" import SwaggerUIConstructor from "#swagger-ui" const SwaggerUI = ({ - spec = SwaggerUIConstructor.defaultOptions.url, + spec = SwaggerUIConstructor.defaultOptions.spec, url = SwaggerUIConstructor.defaultOptions.url, layout = SwaggerUIConstructor.defaultOptions.layout, requestInterceptor = SwaggerUIConstructor.defaultOptions.requestInterceptor, From feb410514f92cc29cf6f3b4a427603371d7267da Mon Sep 17 00:00:00 2001 From: Vladimir Gorej Date: Sat, 20 Apr 2024 21:56:51 +0200 Subject: [PATCH 6/7] fix: use useState instead of useRef --- flavors/swagger-ui-react/index.jsx | 103 +++++++++++++---------------- 1 file changed, 46 insertions(+), 57 deletions(-) diff --git a/flavors/swagger-ui-react/index.jsx b/flavors/swagger-ui-react/index.jsx index 8ec75fa3f25..7766c94c3d4 100644 --- a/flavors/swagger-ui-react/index.jsx +++ b/flavors/swagger-ui-react/index.jsx @@ -2,7 +2,7 @@ * @prettier */ "use client" -import React, { useEffect, useCallback, useState, useRef } from "react" +import React, { useEffect, useCallback, useState } from "react" import PropTypes from "prop-types" import SwaggerUIConstructor from "#swagger-ui" @@ -43,9 +43,8 @@ const SwaggerUI = ({ oauth2RedirectUrl = SwaggerUIConstructor.defaultOptions.oauth2RedirectUrl, onComplete = null, }) => { - const systemRef = useRef(null) - const SwaggerUIComponentRef = useRef(null) - const [, forceUpdate] = useState(false) + const [system, setSystem] = useState(null) + const SwaggerUIComponent = system?.getComponent("App", "root") const handleComplete = useCallback(() => { if (typeof onComplete === "function") { @@ -54,74 +53,64 @@ const SwaggerUI = ({ }, [onComplete]) useEffect(() => { - const system = SwaggerUIConstructor({ - plugins, - spec, - url, - dom_id: null, - domNode: null, - layout, - defaultModelsExpandDepth, - defaultModelRendering, - presets: [SwaggerUIConstructor.presets.apis, ...presets], - requestInterceptor, - responseInterceptor, - onComplete: handleComplete, - docExpansion, - supportedSubmitMethods, - queryConfigEnabled, - defaultModelExpandDepth, - displayOperationId, - tryItOutEnabled, - displayRequestDuration, - requestSnippetsEnabled, - requestSnippets, - showMutatedRequest, - deepLinking, - showExtensions, - showCommonExtensions, - filter, - persistAuthorization, - withCredentials, - ...(typeof oauth2RedirectUrl === "string" - ? { oauth2RedirectUrl: oauth2RedirectUrl } - : {}), - }) - const SwaggerUIComponent = system.getComponent("App", "root") - - systemRef.current = system - SwaggerUIComponentRef.current = SwaggerUIComponent - forceUpdate(true) - - return () => { - systemRef.current = null - SwaggerUIComponentRef.current = null - } + setSystem( + SwaggerUIConstructor({ + plugins, + spec, + url, + dom_id: null, + domNode: null, + layout, + defaultModelsExpandDepth, + defaultModelRendering, + presets: [SwaggerUIConstructor.presets.apis, ...presets], + requestInterceptor, + responseInterceptor, + onComplete: handleComplete, + docExpansion, + supportedSubmitMethods, + queryConfigEnabled, + defaultModelExpandDepth, + displayOperationId, + tryItOutEnabled, + displayRequestDuration, + requestSnippetsEnabled, + requestSnippets, + showMutatedRequest, + deepLinking, + showExtensions, + showCommonExtensions, + filter, + persistAuthorization, + withCredentials, + ...(typeof oauth2RedirectUrl === "string" + ? { oauth2RedirectUrl: oauth2RedirectUrl } + : {}), + }) + ) }, []) useEffect(() => { - if (systemRef.current) { - const prevStateUrl = systemRef.current.specSelectors.url() + if (system) { + const prevStateUrl = system.specSelectors.url() if (url !== prevStateUrl) { - systemRef.current.specActions.updateSpec("") + system.specActions.updateSpec("") if (url) { - systemRef.current.specActions.updateUrl(url) - systemRef.current.specActions.download(url) + system.specActions.updateUrl(url) + system.specActions.download(url) } } - const prevStateSpec = systemRef.current.specSelectors.specStr() + const prevStateSpec = system.specSelectors.specStr() if (spec && spec !== prevStateSpec) { const updatedSpec = typeof spec === "object" ? JSON.stringify(spec) : spec - systemRef.current.specActions.updateSpec(updatedSpec) + system.specActions.updateSpec(updatedSpec) } } }, [url, spec]) - return SwaggerUIComponentRef.current ? ( - - ) : null + return SwaggerUIComponent ? : null } SwaggerUI.propTypes = { From 9333ee564259ef95ee0adfb4e2688129e89e4e86 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Gorej?= Date: Mon, 22 Apr 2024 13:42:43 +0200 Subject: [PATCH 7/7] Update flavors/swagger-ui-react/index.jsx --- flavors/swagger-ui-react/index.jsx | 1 + 1 file changed, 1 insertion(+) diff --git a/flavors/swagger-ui-react/index.jsx b/flavors/swagger-ui-react/index.jsx index 7766c94c3d4..7c9b50d80e7 100644 --- a/flavors/swagger-ui-react/index.jsx +++ b/flavors/swagger-ui-react/index.jsx @@ -2,6 +2,7 @@ * @prettier */ "use client" + import React, { useEffect, useCallback, useState } from "react" import PropTypes from "prop-types" import SwaggerUIConstructor from "#swagger-ui"