'use client'; import { ApiClientModalProvider, useApiClientModal } from '@scalar/api-client-react'; import { Suspense, useEffect, useImperativeHandle, useMemo, useRef, useState } from 'react'; import { createPortal } from 'react-dom'; import type { OpenAPIV3_1 } from '@gitbook/openapi-parser'; import { useOpenAPIOperationContext } from './OpenAPIOperationContext'; import { useOpenAPIPrefillContext } from './OpenAPIPrefillContextProvider'; import type { OpenAPIClientContext } from './context'; import { t } from './translate'; import type { OpenAPIOperationData } from './types'; import { resolveTryItPrefillForOperation } from './util/tryit-prefill'; /** * Button which launches the Scalar API Client */ export function ScalarApiButton(props: { method: OpenAPIV3_1.HttpMethods; path: string; securities: OpenAPIOperationData['securities']; servers: OpenAPIOperationData['servers']; specUrl: string; context: OpenAPIClientContext; }) { const { method, path, securities, servers, specUrl, context } = props; const [isOpen, setIsOpen] = useState(false); const controllerRef = useRef(null); return (
{isOpen && createPortal( , document.body )}
); } function ScalarModal(props: { method: OpenAPIV3_1.HttpMethods; path: string; securities: OpenAPIOperationData['securities']; servers: OpenAPIOperationData['servers']; specUrl: string; controllerRef: React.Ref; }) { const { method, path, securities, servers, specUrl, controllerRef } = props; const getPrefillInputContextData = useOpenAPIPrefillContext(); const prefillInputContext = getPrefillInputContextData(); const prefillConfig = resolveTryItPrefillForOperation({ operation: { securities, servers }, prefillInputContext, }); return ( ); } function toScalarHttpMethod(method: T): Uppercase { return method.toUpperCase() as Uppercase; } type ScalarModalControllerRef = { openClient: (() => void) | undefined; }; function ScalarModalController(props: { method: OpenAPIV3_1.HttpMethods; path: string; controllerRef: React.Ref; }) { const { method, path, controllerRef } = props; const client = useApiClientModal(); const openScalarClient = client?.open; const { onOpenClient: trackClientOpening } = useOpenAPIOperationContext(); const openClient = useMemo(() => { if (openScalarClient && method !== 'connect') { return () => { openScalarClient({ method: toScalarHttpMethod(method), path, _source: 'gitbook', }); trackClientOpening({ method, path }); }; } return null; }, [openScalarClient, method, path, trackClientOpening]); useImperativeHandle( controllerRef, () => ({ openClient: openClient ? () => openClient() : undefined }), [openClient] ); // Open at mount useEffect(() => { openClient?.(); }, [openClient]); return null; }