Skip to content
Snippets Groups Projects
useVersion.js 1.69 KiB
Newer Older
import { useEffect, useState } from 'react'
import useAsync from '@hooks/useAsync'
import semver from 'semver'
import ExecutionEnvironment from '@docusaurus/ExecutionEnvironment'
import getLatestVersion from '@lib/utils/getLatestVersion'
import getVersionList from '@lib/utils/getVersionList'

function useVersion(version, queryVersion, gitlabProjectId, includePrerelease, includePrereleaseVersion) {
  const [selectedVersion, setSelectedVersion] = useState(version);
  const isInBrowser = ExecutionEnvironment.canUseDOM
  const {execute: executeList, status: statusList, value: versions} = useAsync(getVersionList, {
    projectId: gitlabProjectId,
    includePrerelease,
  }, false)
  const getLatestVersionOptions = {
    siteVersion: version === undefined ? '*' : version,
    projectId: gitlabProjectId,
    includePrerelease: !!includePrereleaseVersion,
    versions: versions,
  }
  const {execute, status, value: latestVersion} = useAsync(() => getLatestVersion(getLatestVersionOptions), {}, false)

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

    useEffect(async () => {
      if (statusList === 'success') {
        getLatestVersionOptions.versions = versions
        execute()
      }
    }, [statusList])

    useEffect(async () => {
      if (status === 'success' || latestVersion) {
        if (semver.valid(queryVersion) && versions.includes(queryVersion)) {
          setSelectedVersion(queryVersion)
        } else {
          setSelectedVersion(version && !version.includes('*') ? version : latestVersion)
        }
      }
    }, [status])
  }

  return [versions, selectedVersion, setSelectedVersion];
}

export default useVersion;