import React from 'react'; import { route } from 'nextjs-routes'; import config from 'configs/app'; import useApiQuery from 'lib/api/useApiQuery'; import { AccordionItem, AccordionItemContent, AccordionItemTrigger, AccordionRoot, useAccordion } from 'toolkit/chakra/accordion'; import { ContentLoader } from 'toolkit/components/loaders/ContentLoader'; import CopyToClipboard from 'ui/shared/CopyToClipboard'; import SwaggerUI from './SwaggerUI'; import { REST_API_SECTIONS } from './utils'; const RestApi = () => { const configQuery = useApiQuery('general:config_backend', { queryOptions: { refetchOnMount: false, enabled: config.features.apiDocs.isEnabled, }, }); const configVersionQuery = useApiQuery('general:config_backend_version', { queryOptions: { refetchOnMount: false, enabled: config.features.apiDocs.isEnabled, }, }); const isLoading = config.features.apiDocs.isEnabled ? configQuery.isPending || configVersionQuery.isPending : false; const { value, onValueChange, scrollToItemFromUrl } = useAccordion(REST_API_SECTIONS); React.useEffect(() => { if (!isLoading) { scrollToItemFromUrl(); } // runs only on mount once all queries are resolved // eslint-disable-next-line react-hooks/exhaustive-deps }, [ isLoading ]); const coreApiSwaggerUrl = React.useMemo(() => { if (isLoading || !config.features.apiDocs.isEnabled) { return; } // v[release_number]+commit.[commit_hash] // v10.0.0-alpha.17 or v9.3.2+commit.a7ab3460 const version = configVersionQuery.data?.backend_version; const releaseNumber = version?.match(/^v(\d+\.\d+\.\d+)/)?.[1]; const folderName = configQuery.data?.openapi_spec_folder_name; if (releaseNumber && folderName) { return `https://raw.githubusercontent.com/blockscout/swaggers/master/blockscout/${ releaseNumber }/${ folderName }/swagger.yaml`; } }, [ configQuery.data?.openapi_spec_folder_name, configVersionQuery.data?.backend_version, isLoading ]); const sections = React.useMemo(() => { if (!coreApiSwaggerUrl) { return REST_API_SECTIONS; } return REST_API_SECTIONS.map((section) => { if (section.id === 'blockscout-core-api') { return { ...section, swagger: { ...section.swagger, url: coreApiSwaggerUrl, }, }; } return section; }); }, [ coreApiSwaggerUrl ]); if (isLoading) { return ; } if (sections.length === 0) { return null; } if (sections.length === 1) { return ; } return ( { sections.map((section, index) => ( { section.title } )) } ); }; export default React.memo(RestApi);