Skip to content
Snippets Groups Projects
ApiSpec.js 1.99 KiB
Newer Older
import React, {useEffect} from 'react'
import ExecutionEnvironment from '@docusaurus/ExecutionEnvironment'
import useDocusaurusContext from '@docusaurus/useDocusaurusContext'
import BrowserOnly from '@docusaurus/BrowserOnly'

import useAsync from '@site/src/hooks/useAsync'
import getLatestVersion from "@site/src/utils/getLatestVersion";
import DownloadLabel from "./DownloadLabel";

const SCHEMA_BASE_URL = 'https://schema.fitko.de/fit-connect/openapi'
const GITLAB_PROJECT_ID = 1

export default function ApiSpec(props) {
  const isInBrowser = ExecutionEnvironment.canUseDOM
  const {siteVersion = 'next'} = useDocusaurusContext().siteMetadata

  const {execute, status, error, value: latestVersion} = useAsync(getLatestVersion, {
    siteVersion,
    projectId: GITLAB_PROJECT_ID
  }, false)

  if (isInBrowser) {
    useEffect(() => {
      execute()
    }, [])
  }

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

        return (
          <div>
            <p>Die aktuell angezeigte Version der API ist {status === 'success' &&
            <code>{latestVersion}</code>} {status === 'success' &&
            <DownloadLabel baseURL={SCHEMA_BASE_URL} version={latestVersion} artifact={props.artifact}/>}.</p>

            {status === 'success' && latestVersion && <rapi-doc
              render-style="view"
              layout="column"
              spec-url={`${SCHEMA_BASE_URL}/${latestVersion}/${props.artifact}`}
              theme="light"
              show-info="false"
              show-header="false"
              show-components="false"
              allow-spec-file-load="false"
              info-description-headings-in-navbar="false"
              allow-try="false"
              primary-color="#11171a"
              allow-server-selection="false"
              server-url=""
            />}

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