import classnames from 'classnames'; import type { CSSProperties } from 'react'; import { memo, useCallback, useMemo, useState } from 'react'; import { useActiveRequest } from '../hooks/useActiveRequest'; import { useKeyValue } from '../hooks/useKeyValue'; import { useUpdateRequest } from '../hooks/useUpdateRequest'; import { tryFormatJson } from '../lib/formatters'; import type { HttpHeader, HttpRequest } from '../lib/models'; import { HttpRequestBodyType } from '../lib/models'; import { Editor } from './core/Editor'; import type { TabItem } from './core/Tabs/Tabs'; import { TabContent, Tabs } from './core/Tabs/Tabs'; import { GraphQLEditor } from './GraphQLEditor'; import { HeaderEditor } from './HeaderEditor'; import { ParametersEditor } from './ParameterEditor'; import { UrlBar } from './UrlBar'; interface Props { style?: CSSProperties; fullHeight: boolean; className?: string; } export const RequestPane = memo(function RequestPane({ style, fullHeight, className }: Props) { const activeRequest = useActiveRequest(); const activeRequestId = activeRequest?.id ?? null; const updateRequest = useUpdateRequest(activeRequestId); const [forceUpdateHeaderEditorKey, setForceUpdateHeaderEditorKey] = useState(0); const activeTab = useKeyValue({ key: ['active_request_body_tab'], defaultValue: 'body', }); const tabs: TabItem[] = useMemo( () => [ { value: 'body', label: activeRequest?.bodyType ?? 'No Body', options: { onChange: async (bodyType: HttpRequest['bodyType']) => { const patch: Partial = { bodyType }; if (bodyType == HttpRequestBodyType.GraphQL) { patch.method = 'POST'; patch.headers = [ ...(activeRequest?.headers.filter((h) => h.name.toLowerCase() !== 'content-type') ?? []), { name: 'Content-Type', value: 'application/json', enabled: true, }, ]; setTimeout(() => { setForceUpdateHeaderEditorKey((u) => u + 1); }, 100); } await updateRequest.mutate(patch); }, value: activeRequest?.bodyType ?? null, items: [ { label: 'No Body', value: null }, { label: 'JSON', value: HttpRequestBodyType.JSON }, { label: 'XML', value: HttpRequestBodyType.XML }, { label: 'GraphQL', value: HttpRequestBodyType.GraphQL }, ], }, }, { value: 'params', label: 'Params' }, { value: 'headers', label: 'Headers' }, { value: 'auth', label: 'Auth' }, ], [activeRequest?.bodyType, activeRequest?.headers], ); const handleBodyChange = useCallback((body: string) => updateRequest.mutate({ body }), []); const handleHeadersChange = useCallback( (headers: HttpHeader[]) => updateRequest.mutate({ headers }), [], ); return (
{activeRequest && ( <>
Hello
null} /> {activeRequest.bodyType === HttpRequestBodyType.JSON ? ( tryFormatJson(v)} /> ) : activeRequest.bodyType === HttpRequestBodyType.XML ? ( ) : activeRequest.bodyType === HttpRequestBodyType.GraphQL ? ( ) : (
No Body
)}
)}
); });