Skip to content
Snippets Groups Projects
ApiSpec.js 2.82 KiB
Newer Older
Mark Kane's avatar
Mark Kane committed
import React, {useEffect, useState} from 'react'
import semver from "semver";

import ExecutionEnvironment from '@docusaurus/ExecutionEnvironment'
import BrowserOnly from '@docusaurus/BrowserOnly'
import { useLocation } from '@docusaurus/router';
import useAsync from '@hooks/useAsync'
import getLatestVersion from "@lib/utils/getLatestVersion";
import DownloadLabel from "@components/DownloadLabel";
Mark Kane's avatar
Mark Kane committed
import VersionSelect from "@components/VersionSelect";
Marco Holz's avatar
Marco Holz committed
const SCHEMA_BASE_URL = 'https://schema.fitko.de/fit-connect'

export default function ApiSpec(props) {
  const {artifact, path, gitlabProjectId, includePrerelease, includePrereleaseVersion} = props
  let { version } = props
  const search = useLocation().search;
  const queryVersion = new URLSearchParams(search).get('version');
  if (queryVersion && semver.valid(queryVersion)) {
    version = queryVersion;
  }
Mark Kane's avatar
Mark Kane committed
  const [selectedVersion, setSelectedVersion] = useState('')
Mark Kane's avatar
Mark Kane committed
  const isInBrowser = ExecutionEnvironment.canUseDOM

  const {execute, status, error, value: latestVersion} = useAsync(getLatestVersion, {
Mark Kane's avatar
Mark Kane committed
    siteVersion: version === undefined ? '*' : version,
    projectId: gitlabProjectId,
    includePrerelease: !!includePrereleaseVersion
  }, false)

  if (isInBrowser) {
    useEffect(() => {
      execute()
    }, [])
Mark Kane's avatar
Mark Kane committed

    useEffect(async () => {
      if (status === 'success') {
        setSelectedVersion(version && version !== '*' ? version : latestVersion)
Mark Kane's avatar
Mark Kane committed
      }
    }, [status])
  }

  return (
    <BrowserOnly fallback={<div>Lädt...</div>}>
      {() => {
        import('rapidoc')

        return (
          <div>
            <p> Diese API-Spezifikation {status === 'success' &&
Mark Kane's avatar
Mark Kane committed
              <DownloadLabel baseURL={`${SCHEMA_BASE_URL}/${path}`} version={selectedVersion} artifact={artifact} label="OpenAPI"/>}.
Mark Kane's avatar
Mark Kane committed
            <VersionSelect version={selectedVersion} setVersion={setSelectedVersion} gitlabId={gitlabProjectId} includePrerelease={includePrerelease} /><br/>
Mark Kane's avatar
Mark Kane committed
            {status === 'success' && selectedVersion && <rapi-doc
              render-style="view"
              layout="column"
Mark Kane's avatar
Mark Kane committed
              spec-url={`${SCHEMA_BASE_URL}/${path}/${selectedVersion}/${artifact}`}
              schema-description-expanded="true"
              show-info="false"
              show-header="false"
              show-components="false"
              allow-spec-file-load="false"
              allow-authentication={props.allowAuthentication || "true"}
              info-description-headings-in-navbar="false"
              allow-try={props.allowTry || "false"}
              primary-color="#11171a"
              allow-server-selection="false"
              server-url=""
            />}

            {status === 'error' && <p>Die API-Spezifikation konnte leider nicht geladen werden.</p>}
          </div>
        )
      }}
    </BrowserOnly>
  )
}