'use client'; import * as React from 'react'; import { OpenAPIClientContext } from './types'; import { OpenAPIV3 } from 'openapi-types'; import { ServerSelector } from './ServerSelector'; import { useOpenAPIClientState } from './OpenAPIClientStateContext'; import { getServersURL } from './utils'; export function ServerURLForm(props: { children: React.ReactNode; context: OpenAPIClientContext; servers: OpenAPIV3.ServerObject[]; serverIndex: number; }) { const { children, context, servers, serverIndex } = props; const stateContext = useOpenAPIClientState(); const server = servers[serverIndex]; const formRef = React.useRef(null); function switchServer(index: number) { if (index !== serverIndex) { update({ server: `${index}` ?? '0', ...(stateContext?.state?.edit ? { edit: 'true' } : undefined), }); } } function updateServerVariables(formData: FormData) { const variableKeys = Object.keys(server.variables ?? {}); const variables: Record = {}; for (const pair of formData) { if (variableKeys.includes(pair[0]) && !isNaN(Number(pair[1]))) { variables[pair[0]] = `${pair[1]}`; } } update({ server: `${formData.get('server')}` ?? '0', ...variables, ...(stateContext?.state?.edit ? { edit: 'true' } : undefined), }); } function update(variables?: Record) { if (!context.blockKey) { return; } stateContext?.onUpdate({ block: context.blockKey, ...variables, }); } // Only make the server url editable if there is some onUpdate callback // and if there are variations on the server url (e.g. an array of servers or url variables). const isEditable = stateContext?.onUpdate && (servers.length > 1 || server.variables); const isEditing = isEditable && stateContext?.state?.edit; return (
{ e.preventDefault(); updateServerVariables(new FormData(e.currentTarget)); }} className="contents" >
{children} {isEditing && servers.length > 1 ? ( ) : null} {isEditable ? ( ) : null}
); }