From 1c692c0e9e12fe1811695020edd58fd375b4e749 Mon Sep 17 00:00:00 2001 From: Mark Kane <info@markkane.de> Date: Wed, 7 Dec 2022 17:25:49 +0100 Subject: [PATCH] add logic to verify and handle wrong versions (planning#679) --- src/components/VersionSelect.js | 13 +--------- src/views/ApiSpec.js | 45 ++++++++++++++++++++++++--------- 2 files changed, 34 insertions(+), 24 deletions(-) diff --git a/src/components/VersionSelect.js b/src/components/VersionSelect.js index ea45a44a4..a969e717b 100644 --- a/src/components/VersionSelect.js +++ b/src/components/VersionSelect.js @@ -1,14 +1,7 @@ import React, {useEffect} from "react" -import useAsync from '@hooks/useAsync' -import getVersionList from "@lib/utils/getVersionList"; import { useHistory } from '@docusaurus/router'; -export default ({ version, setVersion, gitlabId, includePrerelease = false }) => { - - const {execute, status, error, value: versions} = useAsync(getVersionList, { - projectId: gitlabId, - includePrerelease, - }, false) +export default ({ version, versions, setVersion, gitlabId, includePrerelease = false }) => { const selectStyle = { border: "1px solid rgba(128, 126, 163, 0.8)", @@ -20,10 +13,6 @@ export default ({ version, setVersion, gitlabId, includePrerelease = false }) => const history = useHistory() const params = new URLSearchParams() - useEffect(() => { - execute() - }, []) - return <div> API Version anzeigen: <select style={selectStyle} diff --git a/src/views/ApiSpec.js b/src/views/ApiSpec.js index 91ff67eb7..180da7370 100644 --- a/src/views/ApiSpec.js +++ b/src/views/ApiSpec.js @@ -1,14 +1,15 @@ import React, {useEffect, useState} from 'react' -import semver from "semver"; +import semver from 'semver' import ExecutionEnvironment from '@docusaurus/ExecutionEnvironment' import BrowserOnly from '@docusaurus/BrowserOnly' -import { useLocation } from '@docusaurus/router'; +import { useLocation } from '@docusaurus/router' import useAsync from '@hooks/useAsync' -import getLatestVersion from "@lib/utils/getLatestVersion"; -import DownloadLabel from "@components/DownloadLabel"; -import VersionSelect from "@components/VersionSelect"; +import getLatestVersion from '@lib/utils/getLatestVersion' +import getVersionList from '@lib/utils/getVersionList' +import DownloadLabel from '@components/DownloadLabel' +import VersionSelect from '@components/VersionSelect' const SCHEMA_BASE_URL = 'https://schema.fitko.de/fit-connect' @@ -17,14 +18,16 @@ export default function ApiSpec(props) { let { version } = props const search = useLocation().search; const queryVersion = new URLSearchParams(search).get('version'); - if (queryVersion && semver.valid(queryVersion)) { - version = queryVersion; - } const [selectedVersion, setSelectedVersion] = useState('') const isInBrowser = ExecutionEnvironment.canUseDOM - const {execute, status, error, value: latestVersion} = useAsync(getLatestVersion, { + const {execute: executeList, status: statusList, value: versions} = useAsync(getVersionList, { + projectId: gitlabProjectId, + includePrerelease, + }, false) + + const {execute, status, value: latestVersion} = useAsync(getLatestVersion, { siteVersion: version === undefined ? '*' : version, projectId: gitlabProjectId, includePrerelease: !!includePrereleaseVersion @@ -32,12 +35,22 @@ export default function ApiSpec(props) { if (isInBrowser) { useEffect(() => { - execute() + executeList() }, []) + useEffect(async () => { + if (statusList === 'success') { + execute() + } + }, [statusList]) + useEffect(async () => { if (status === 'success') { - setSelectedVersion(version && version !== '*' ? version : latestVersion) + if (semver.valid(queryVersion) && versions.includes(queryVersion)) { + setSelectedVersion(queryVersion) + } else { + setSelectedVersion(version && version !== '*' ? version : latestVersion) + } } }, [status]) } @@ -52,7 +65,15 @@ export default function ApiSpec(props) { <p> Diese API-Spezifikation {status === 'success' && <DownloadLabel baseURL={`${SCHEMA_BASE_URL}/${path}`} version={selectedVersion} artifact={artifact} label="OpenAPI"/>}. </p> - <VersionSelect version={selectedVersion} setVersion={setSelectedVersion} gitlabId={gitlabProjectId} includePrerelease={includePrerelease} /><br/> + + {statusList === 'success' && selectedVersion && <VersionSelect + versions={versions} + version={selectedVersion} + setVersion={setSelectedVersion} + gitlabId={gitlabProjectId} + includePrerelease={includePrerelease} + />} + <br /> {status === 'success' && selectedVersion && <rapi-doc render-style="view" -- GitLab