| | import React from 'react' |
| | import { Flash } from '@primer/react' |
| | import { useRouter } from 'next/router' |
| |
|
| | import { DEFAULT_VERSION, useVersion } from '@/versions/components/useVersion' |
| | import { Link } from '@/frame/components/Link' |
| | import { useMainContext } from '@/frame/components/context/MainContext' |
| | import { useTranslation } from '@/languages/components/useTranslation' |
| |
|
| | const restRepoDisplayPages = [ |
| | 'branches', |
| | 'collaborators', |
| | 'commits', |
| | 'deploy_keys', |
| | 'deployments', |
| | 'pages', |
| | 'releases', |
| | 'repos', |
| | 'metrics', |
| | 'webhooks', |
| | ] |
| | const restEnterpriseDisplayPages = ['enterprise-admin'] |
| | const restRepoCategoryExceptionsTitles = { |
| | branches: 'Branches', |
| | collaborators: 'Collaborators', |
| | commits: 'Commits', |
| | 'deploy-keys': 'Deploy Keys', |
| | deployments: 'Deployments', |
| | pages: 'GitHub Pages', |
| | releases: 'Releases', |
| | metrics: 'Metrics', |
| | webhooks: 'Webhooks', |
| | } |
| |
|
| | export const RestBanner = () => { |
| | const router = useRouter() |
| | const { t } = useTranslation('rest') |
| | |
| | const isRestPage = router.query.productId === 'rest' || router.query.category |
| | const restPage = router.query.category as string |
| | const { currentVersion } = useVersion() |
| | const { allVersions } = useMainContext() |
| | const currentVersionObj = allVersions[currentVersion] |
| | const apiVersions = currentVersionObj.apiVersions |
| |
|
| | let bannerText = '' |
| | let versionWithApiVersion = '' |
| |
|
| | if (isRestPage && apiVersions.length) { |
| | bannerText = t('rest.banner.api_versioned') |
| | versionWithApiVersion = currentVersion |
| | } else { |
| | if (currentVersionObj.isGHES) { |
| | |
| | |
| | const firstGhesReleaseWithApiVersions = Object.values(allVersions) |
| | .reverse() |
| | .find((v) => { |
| | return v.isGHES && v.apiVersions.length |
| | }) |
| |
|
| | if (firstGhesReleaseWithApiVersions) { |
| | versionWithApiVersion = firstGhesReleaseWithApiVersions.version |
| | bannerText = t('rest.banner.ghes_api_versioned') |
| | .replace( |
| | '{{ firstGhesReleaseWithApiVersions.versionTitle }}', |
| | firstGhesReleaseWithApiVersions.versionTitle, |
| | ) |
| | .replace(/{{\s*currentVersion\s*}}/, currentVersion) |
| | } |
| | } |
| | } |
| | |
| | if (isRestPage && bannerText !== '') { |
| | return ( |
| | <div |
| | data-testid="rest-api-versioning-temporary-banner" |
| | className="container-xl mt-3 mx-auto p-responsive" |
| | > |
| | <Flash> |
| | <span dangerouslySetInnerHTML={{ __html: bannerText }} />{' '} |
| | <span |
| | dangerouslySetInnerHTML={{ |
| | __html: t('rest.banner.api_version_info').replace( |
| | /{{\s*versionWithApiVersion\s*}}/, |
| | versionWithApiVersion === DEFAULT_VERSION ? '' : `/${versionWithApiVersion}`, |
| | ), |
| | }} |
| | /> |
| | </Flash> |
| | </div> |
| | ) |
| | } |
| |
|
| | if (!restRepoDisplayPages.includes(restPage) && !restEnterpriseDisplayPages.includes(restPage)) { |
| | return null |
| | } |
| |
|
| | let noticeString |
| |
|
| | if (restRepoDisplayPages.includes(restPage)) { |
| | const pages = Object.keys(restRepoCategoryExceptionsTitles) as Array< |
| | keyof typeof restRepoCategoryExceptionsTitles |
| | > |
| | const newRestPagesText = pages.map((page, i) => [ |
| | <React.Fragment key={page}> |
| | <Link href={`/${router.locale}/rest/${page}`}> |
| | {restRepoCategoryExceptionsTitles[page]} |
| | </Link> |
| | {i < pages.length - 1 && ', '} |
| | </React.Fragment>, |
| | ]) |
| |
|
| | const noticeStringParts = t('rest.banner.redirect_repo').split('{{ newRestPagesLinks }}') |
| | noticeString = ( |
| | <React.Fragment> |
| | {noticeStringParts[0]} |
| | {newRestPagesText} |
| | {noticeStringParts[1] || null} |
| | </React.Fragment> |
| | ) |
| | } else if (restEnterpriseDisplayPages.includes(restPage)) { |
| | const noticeStringParts = t('rest.banner.redirect_enterprise').split('{{ actionsPageLink }}') |
| | noticeString = ( |
| | <React.Fragment> |
| | {noticeStringParts[0]} |
| | <Link href={`/${router.locale}/rest/actions`}>{t('rest.banner.actions_api_title')}</Link> |
| | {noticeStringParts[1] || null} |
| | </React.Fragment> |
| | ) |
| | } |
| |
|
| | return ( |
| | <div data-testid="rest-api-repos-banner" className="container-xl mt-3 mx-auto p-responsive"> |
| | <Flash variant="warning"> |
| | <p> |
| | <b className="text-bold"> |
| | <span> |
| | {t('rest.banner.redirect_notice')} {noticeString} |
| | </span> |
| | </b>{' '} |
| | </p> |
| | </Flash> |
| | </div> |
| | ) |
| | } |
| |
|