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

import CodeBlock from '@theme/CodeBlock'

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/metadata'
const SCHEMA_FILE_NAME = 'metadata.schema.json'
const GITLAB_PROJECT_ID = 40

const loadSchema = async (version) => {
  return await axios.get(`${SCHEMA_BASE_URL}/${version}/${SCHEMA_FILE_NAME}`).catch((error) => {
    throw `Fetching of schema with version ${version} failed with status code ${error.response.status}`
  }).then(({data}) => JSON.stringify(data, null, 2))
}

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

  const {
    execute: getVersion,
    status: versionStatus,
    error: versionError,
    value: latestVersion
  } = useAsync(getLatestVersion, {siteVersion, projectId: GITLAB_PROJECT_ID}, false)
  const [metadataSchema, setMetadataSchema] = useState(null)

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

    useEffect(async () => {
      if (versionStatus === 'success') {
        setMetadataSchema(await loadSchema(latestVersion))
      }
    }, [versionStatus])
  }

  return (
    <BrowserOnly fallback={<div>Lädt...</div>}>
      {() => (
        <div>
          <p>Die aktuell angezeigte Version des Metadatenschema ist {versionStatus === 'success' &&
          <code>{latestVersion}</code>} {versionStatus === 'success' &&
          <DownloadLabel baseURL={SCHEMA_BASE_URL} version={latestVersion} artifact={SCHEMA_FILE_NAME}/>}.</p>

          {metadataSchema && <CodeBlock className={'json'}>{metadataSchema}</CodeBlock>}

          {versionStatus === 'error' && <p>Das Metadatenschema konnte leider nicht geladen werden.</p>}
        </div>
      )
      }
    </BrowserOnly>
  )
}