'use client'; import { Cookie, getHarRequest, getParametersFromOperation, type TransformedOperation, getRequestFromOperation, Query, Header, RequestBody, } from '@scalar/oas-utils'; import React from 'react'; import { OpenAPIOperationData, fromJSON } from './fetchOpenAPIOperation'; const ApiClientReact = React.lazy(async () => { const mod = await import('@scalar/api-client-react'); return { default: mod.ApiClientReact }; }); const ScalarContext = React.createContext< (fetchOperationData: () => Promise) => void >(() => {}); /** * Button which launches the Scalar API Client */ export function ScalarApiButton(props: { fetchOperationData: () => Promise; }) { const { fetchOperationData } = props; const open = React.useContext(ScalarContext); return (
); } /** * Wrap the rendering with a context to open the scalar modal. */ export function ScalarApiClient(props: { children: React.ReactNode }) { const { children } = props; const [active, setActive] = React.useState(null); const proxy = '/~scalar/proxy'; const open = React.useCallback( async (fetchOperationData: () => Promise) => { setActive({ operationData: null }); const operationData = fromJSON(await fetchOperationData()); setActive({ operationData }); }, [], ); const onClose = React.useCallback(() => { setActive(null); }, []); const request = React.useMemo(() => { const operationData = active?.operationData; if (!operationData) { return null; } const operationId = operationData.operation.operationId ?? operationData.method + operationData.path; const operation = { ...operationData, httpVerb: operationData.method, pathParameters: operationData.operation.parameters, } as TransformedOperation; const variables = getParametersFromOperation(operation, 'path', false); const request = getHarRequest( { url: operationData.path, }, getRequestFromOperation( { ...operation, information: { requestBody: operationData.operation.requestBody as RequestBody, }, }, { requiredOnly: false }, ), ); return { id: operationId, type: operationData.method, path: operationData.path, variables, cookies: request.cookies.map((cookie: Cookie) => { return { ...cookie, enabled: true }; }), query: request.queryString.map((queryString: Query) => { const query: typeof queryString & { required?: boolean } = queryString; return { ...queryString, enabled: query.required ?? true }; }), headers: request.headers.map((header: Header) => { return { ...header, enabled: true }; }), url: operationData.servers[0]?.url, body: request.postData?.text, }; }, [active]); return ( {children} {active ? (
}>
onClose()} className="scalar-app-exit">
) : null}
); } function ScalarLoading() { return
Loading...
; }