From 2b7ea27cc6fca5e6ae3b5f6a7f635738dd2fdf21 Mon Sep 17 00:00:00 2001 From: Brett Jephson Date: Tue, 24 Sep 2024 11:37:40 +0100 Subject: [PATCH] Add server url cache to update request code sample --- .../src/app/(space)/(content)/[[...pathname]]/page.tsx | 3 +++ .../gitbook/src/components/DocumentView/OpenAPI/OpenAPI.tsx | 4 ++++ .../src/components/DocumentView/OpenAPI/ServerUrlCache.tsx | 5 +++++ packages/react-openapi/src/OpenAPICodeSample.tsx | 3 ++- packages/react-openapi/src/OpenAPIServerURL.tsx | 1 - packages/react-openapi/src/OpenAPIServerURLForm.tsx | 3 ++- packages/react-openapi/src/types.ts | 5 ++--- 7 files changed, 18 insertions(+), 6 deletions(-) create mode 100644 packages/gitbook/src/components/DocumentView/OpenAPI/ServerUrlCache.tsx diff --git a/packages/gitbook/src/app/(space)/(content)/[[...pathname]]/page.tsx b/packages/gitbook/src/app/(space)/(content)/[[...pathname]]/page.tsx index b5ab1424e6..4b126ee903 100644 --- a/packages/gitbook/src/app/(space)/(content)/[[...pathname]]/page.tsx +++ b/packages/gitbook/src/app/(space)/(content)/[[...pathname]]/page.tsx @@ -3,6 +3,7 @@ import { Metadata, Viewport } from 'next'; import { notFound, redirect } from 'next/navigation'; import React from 'react'; +import { serverUrlCache } from '@/components/DocumentView/OpenAPI/ServerUrlCache'; import { PageAside } from '@/components/PageAside'; import { PageBody, PageCover } from '@/components/PageBody'; import { PageHrefContext, absoluteHref, pageHref } from '@/lib/links'; @@ -26,6 +27,8 @@ export default async function Page(props: { }) { const { params, searchParams } = props; + serverUrlCache.parse(searchParams); + const { content: contentPointer, contentTarget, diff --git a/packages/gitbook/src/components/DocumentView/OpenAPI/OpenAPI.tsx b/packages/gitbook/src/components/DocumentView/OpenAPI/OpenAPI.tsx index bf18e3be5f..7fd3671843 100644 --- a/packages/gitbook/src/components/DocumentView/OpenAPI/OpenAPI.tsx +++ b/packages/gitbook/src/components/DocumentView/OpenAPI/OpenAPI.tsx @@ -8,6 +8,7 @@ import { fetchOpenAPIBlock } from '@/lib/openapi'; import { tcls } from '@/lib/tailwind'; import OpenAPIContext from './OpenAPIContext'; +import { serverUrlCache } from './ServerUrlCache'; import { BlockProps } from '../Block'; import { PlainCodeBlock } from '../CodeBlock'; @@ -46,6 +47,8 @@ async function OpenAPIBody(props: BlockProps) { return null; } + const serverUrl = serverUrlCache.get('serverUrl'); + return ( ) { defaultInteractiveOpened: context.mode === 'print', id: block.meta?.id, blockKey: block.key, + serverUrl }} className="openapi-block" /> diff --git a/packages/gitbook/src/components/DocumentView/OpenAPI/ServerUrlCache.tsx b/packages/gitbook/src/components/DocumentView/OpenAPI/ServerUrlCache.tsx new file mode 100644 index 0000000000..b715ce3dbc --- /dev/null +++ b/packages/gitbook/src/components/DocumentView/OpenAPI/ServerUrlCache.tsx @@ -0,0 +1,5 @@ +import { createSearchParamsCache, parseAsString } from 'nuqs/server'; + +export const serverUrlCache = createSearchParamsCache({ + serverUrl: parseAsString +}) \ No newline at end of file diff --git a/packages/react-openapi/src/OpenAPICodeSample.tsx b/packages/react-openapi/src/OpenAPICodeSample.tsx index b3021263a5..ac63e4779e 100644 --- a/packages/react-openapi/src/OpenAPICodeSample.tsx +++ b/packages/react-openapi/src/OpenAPICodeSample.tsx @@ -48,11 +48,12 @@ export function OpenAPICodeSample(props: { } }); + const serverUrl = context.serverUrl ?? getServersURL(data.servers); const requestBody = noReference(data.operation.requestBody); const requestBodyContent = requestBody ? Object.entries(requestBody.content)[0] : undefined; const input: CodeSampleInput = { url: - getServersURL(data.servers, context.enumSelectors) + + serverUrl + data.path + (searchParams.size ? `?${searchParams.toString()}` : ''), method: data.method, diff --git a/packages/react-openapi/src/OpenAPIServerURL.tsx b/packages/react-openapi/src/OpenAPIServerURL.tsx index ec225c430e..5bce960355 100644 --- a/packages/react-openapi/src/OpenAPIServerURL.tsx +++ b/packages/react-openapi/src/OpenAPIServerURL.tsx @@ -22,7 +22,6 @@ export function OpenAPIServerURL(props: { const serverIndex = !isNaN(Number(ctx?.state?.server)) ? Number(ctx?.state?.server) : 0; const server = servers[serverIndex]; const parts = parseServerURL(server?.url ?? ''); - console.log({ ctxState: ctx?.state }); return ( diff --git a/packages/react-openapi/src/OpenAPIServerURLForm.tsx b/packages/react-openapi/src/OpenAPIServerURLForm.tsx index 98aa205345..8864f9b2d4 100644 --- a/packages/react-openapi/src/OpenAPIServerURLForm.tsx +++ b/packages/react-openapi/src/OpenAPIServerURLForm.tsx @@ -5,6 +5,7 @@ import { OpenAPIClientContext } from './types'; import { OpenAPIV3 } from 'openapi-types'; import { ServerSelector } from './ServerSelector'; import { useOpenAPIContext } from './OpenAPIContextProvider'; +import { getServersURL } from './utils'; export function ServerURLForm(props: { children: React.ReactNode; @@ -80,7 +81,7 @@ export function ServerURLForm(props: { update({ server: `${serverIndex}`, ...state, - ...(ctx?.state?.edit ? undefined : { edit: 'true' }), + ...(ctx?.state?.edit ? { serverUrl: getServersURL(servers, state) } : { edit: 'true' }), }); }} title={ctx?.state?.edit ? undefined : 'Try different server options'} diff --git a/packages/react-openapi/src/types.ts b/packages/react-openapi/src/types.ts index e8297efa45..415bf8e49c 100644 --- a/packages/react-openapi/src/types.ts +++ b/packages/react-openapi/src/types.ts @@ -27,11 +27,10 @@ export interface OpenAPIClientContext { * Optional id attached to the OpenAPI Operation heading and used as an anchor */ id?: string; - /** - * Selectors to update openapi enums, e.g. for server url variables + * Optional serverUrl to use with OpenAPI operations */ - enumSelectors?: Record; + serverUrl?: string | null; } export interface OpenAPIFetcher {