/** * Copyright (c) Facebook, Inc. and its affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ import React, {useContext, useEffect, useState, type ReactNode} from 'react'; import {useDocsPreferredVersion} from '@docusaurus/theme-common'; import {useVersions} from '@docusaurus/plugin-content-docs/client'; import CodeBlock from '@theme/CodeBlock'; import Translate from '@docusaurus/Translate'; type ContextValue = { name: string; time: string; }; const Context = React.createContext(null); export function VersionsProvider({ children, }: { children: ReactNode; }): JSX.Element { const [canaryVersion, setCanaryVersion] = useState(null); useEffect(() => { fetch('https://registry.npmjs.org/@docusaurus/core') .then((res) => res.json()) .then((data) => { const name = Object.keys(data.versions).at(-1)!; const time = data.time[name]; setCanaryVersion({name, time}); }); }, []); return {children}; } function useStableVersion(): string { const preferredVersion = useDocsPreferredVersion('default').preferredVersion?.name; const allVersions = useVersions('default'); const lastVersion = ( allVersions.find((v) => v.name !== 'current') ?? allVersions[0] ).name; return preferredVersion && preferredVersion !== 'current' ? preferredVersion : lastVersion; } export function CanaryVersion(): JSX.Element { const canaryVersion = useContext(Context); // Show a sensible name return canaryVersion ? ( {canaryVersion.name}}}> {'Current: {canaryVersionName}'} ) : ( Example: 0.0.0-4922 ); } export function StableVersion(): JSX.Element { const currentVersion = useStableVersion(); return {currentVersion}; } export function InsertIfCanaryVersionUnknown({ children, }: { children: ReactNode; }): ReactNode | null { const canaryVersion = useContext(Context); if (!canaryVersion) { return children; } return null; } export function InsertIfCanaryVersionKnown({ children, }: { children: ReactNode; }): ReactNode | null { const canaryVersion = useContext(Context); if (canaryVersion) { return children; } return null; } export function PackageJSONDiff(): JSX.Element { const canaryVersion = useContext(Context)?.name ?? '0.0.0-4922'; const stableVersion = useStableVersion(); return ( {`- "@docusaurus/core": "^${stableVersion}", - "@docusaurus/preset-classic": "^${stableVersion}", + "@docusaurus/core": "${canaryVersion}", + "@docusaurus/preset-classic": "${canaryVersion}", `} ); } export function PublishTime(): JSX.Element | null { const time = useContext(Context)?.time; if (!time) { return null; } return ( {new Date(time).toLocaleString()}}}> { "The latest canary version that's available on npm is published at {time}." } ); }