title | sidebar_label | hide_table_of_contents |
---|---|---|
Document example calling API |
Document example calling API |
true |
import Rapidoc from "@theme/Rapidoc"
import React, { useRef, useEffect, useState } from 'react' | |
import Head from '@docusaurus/Head' | |
import useThemeContext from '@theme/hooks/useThemeContext' | |
import useDocusaurusContext from '@docusaurus/useDocusaurusContext' | |
import ExecutionEnvironment from '@docusaurus/ExecutionEnvironment' | |
import { useQuery } from 'react-query' | |
import axios from 'axios' | |
import Loader from '@theme/Loaders' | |
import './styles.module.css' | |
const customThemeColors = { | |
'darkmode-background': '#121E24', | |
'xp-primary-500': '#FFCC00', | |
'xp-tertiaries': { | |
'primary-ciel': '#63C2C7', | |
'secondary-blue': '#006D8C', | |
}, | |
} | |
const Rapidoc = ({ apiUrl }) => { | |
const { isDarkTheme } = useThemeContext() | |
const { siteConfig } = useDocusaurusContext() | |
const baseAPIUrls = siteConfig.themeConfig.baseAPIUrls | |
const prodDomains = siteConfig.themeConfig.prodDomains | |
let serverUrl = '' | |
// Rapidoc rendering | |
const rapidocRef = useRef() | |
const [renderRapidoc, setRenderRapidoc] = useState(false) | |
// Mount Rapidoc on client-side | |
useEffect(() => { | |
if (ExecutionEnvironment.canUseDOM) { | |
require('rapidoc') | |
} | |
}, []) | |
// React Query fn | |
const fetchAPI = async () => { | |
const isProd = prodDomains[0].includes(window.location.host) | |
const baseAPIUrl = isProd ? baseAPIUrls.production : baseAPIUrls.sandbox | |
const fullAPIUrl = `${baseAPIUrl}${apiUrl}` | |
serverUrl = isProd | |
? '<YOURAPIPRODSERVERURL>' | |
: '<YOURAPIDEVURL>' | |
try { | |
const response = await axios.get(fullAPIUrl) | |
return response.data | |
} catch (error) { | |
throw new Error(error.message) | |
} | |
} | |
// React query init | |
const { isLoading, isError, data, error } = useQuery( | |
['fetchAPI', { apiUrl }], | |
fetchAPI, | |
{ | |
retry: false, | |
retryOnMount: false, | |
refetchOnWindowFocus: false, | |
}, | |
) | |
// Rapidoc parsing | |
const loadRapidocSpec = async (stringifiedData) => { | |
await rapidocRef.current.loadSpec(stringifiedData) | |
// Programmatic credentials auth on Rapidoc UI | |
rapidocRef.current.shadowRoot.querySelector('#auth .m-btn').click() | |
} | |
useEffect(() => { | |
if (data) { | |
data.components.securitySchemes['Sts authentication']['x-client-id'] = | |
'<YOUR CLIENT ID>' | |
data.components.securitySchemes['Sts authentication']['x-client-secret'] = | |
'<YOUR CLIENT SECRET>' | |
delete data.components.securitySchemes['Bearer token authorization'] | |
const stringifiedData = JSON.stringify(data) | |
if (rapidocRef.current) { | |
loadRapidocSpec(JSON.parse(stringifiedData)) | |
const handleRenderRapidoc = (e) => { | |
setRenderRapidoc(true) | |
} | |
rapidocRef.current.addEventListener( | |
'before-render', | |
handleRenderRapidoc, | |
) | |
setRenderRapidoc(true) | |
// Cleanup | |
return () => { | |
rapidocRef.current.removeEventListener( | |
'before-render', | |
handleRenderRapidoc, | |
) | |
} | |
} | |
} | |
}, [data]) | |
return ( | |
<> | |
<Head> | |
<style>{'body { overflow: visible; }'}</style> | |
<body className="api"></body> | |
</Head> | |
<div className="flex items-center justify-start p-5 lg:p-0"> | |
{/* justify-center */} | |
{(isLoading || (!renderRapidoc && !isError)) && ( | |
<div className="absolute flex flex-col items-center -translate-x-1/2 -translate-y-1/2 top-1/2 left-1/2"> | |
<Loader /> | |
<div className="mt-4 font-semibold ">Fetching API...</div> | |
</div> | |
)} | |
{isError && ( | |
<div className="absolute flex flex-col items-center text-red-500 -translate-x-1/2 -translate-y-1/2 top-1/2 left-1/2"> | |
<div className="font-bold ">Error: </div> | |
<div>{error.message}</div> | |
</div> | |
)} | |
<div | |
className="w-full" | |
style={{ | |
visibility: | |
!renderRapidoc || isError || isLoading ? 'hidden' : 'visible', | |
}} | |
> | |
<rapi-doc | |
ref={rapidocRef} | |
theme={isDarkTheme ? 'dark' : 'light'} | |
bg-color={ | |
isDarkTheme ? customThemeColors['darkmode-background'] : '#fff' | |
} | |
nav-bg-color={isDarkTheme ? '#081014' : '#f7f7f7'} | |
nav-text-color={isDarkTheme ? '#ffffff' : '#000000'} | |
nav-accent-color={ | |
isDarkTheme | |
? customThemeColors['xp-tertiaries']['primary-ciel'] | |
: customThemeColors['xp-tertiaries']['secondary-blue'] | |
} | |
nav-item-spacing="relaxed" | |
layout="row" | |
sort-tags="true" | |
render-style="read" | |
load-fonts="false" | |
regular-font="Poppins" | |
primary-color="#63C2C7" | |
allow-server-selection="false" | |
server-url={serverUrl} | |
default-api-server={serverUrl} | |
show-header="false" | |
show-info="true" | |
show-components="false" | |
allow-api-list-style-selection="false" | |
style={{ | |
height: 'calc(100vh - 60px)', | |
width: '100%', | |
maxWidth: '100%', | |
}} | |
></rapi-doc> | |
</div> | |
</div> | |
</> | |
) | |
} | |
export default Rapidoc |
rapi-doc::part(label-overview-title) { | |
@apply font-bold; | |
} | |
html[data-theme='dark'] { | |
rapi-doc::part(label-overview-title) { | |
@apply text-white; | |
} | |
} |