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