import { appWindow } from '@tauri-apps/api/window'; 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 { BODY_TYPE_GRAPHQL, BODY_TYPE_JSON, BODY_TYPE_NONE, BODY_TYPE_XML } from '../lib/models'; import { Editor } from './core/Editor'; import type { TabItem } from './core/Tabs/Tabs'; import { TabContent, Tabs } from './core/Tabs/Tabs'; import { EmptyStateText } from './EmptyStateText'; 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( () => activeRequest === null ? [] : [ { value: 'body', options: { value: activeRequest.bodyType, items: [ { label: 'No Body', shortLabel: 'Body', value: BODY_TYPE_NONE }, { label: 'JSON', value: BODY_TYPE_JSON }, { label: 'XML', value: BODY_TYPE_XML }, { label: 'GraphQL', value: BODY_TYPE_GRAPHQL }, ], onChange: async (bodyType) => { const patch: Partial = { bodyType }; if (bodyType == BODY_TYPE_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: 'auth', label: 'Auth', options: { value: activeRequest.authenticationType, items: [ { label: 'No Auth', shortLabel: 'Auth', value: null }, { label: 'Basic', value: 'basic' }, ], onChange: async (a) => { await updateRequest.mutate({ authenticationType: a, authentication: { username: '', password: '' }, }); }, }, }, { value: 'params', label: 'URL Params' }, { value: 'headers', label: 'Headers' }, ], [activeRequest?.bodyType, activeRequest?.headers, activeRequest?.authenticationType], ); const handleBodyChange = useCallback((body: string) => updateRequest.mutate({ body }), []); const handleHeadersChange = useCallback( (headers: HttpHeader[]) => updateRequest.mutate({ headers }), [], ); const forceUpdateKey = activeRequest?.updatedBy === appWindow.label ? undefined : activeRequest?.updatedAt; return (
{activeRequest && ( <>
Hello
null} /> {activeRequest.bodyType === BODY_TYPE_JSON ? ( tryFormatJson(v)} /> ) : activeRequest.bodyType === BODY_TYPE_XML ? ( ) : activeRequest.bodyType === BODY_TYPE_GRAPHQL ? ( ) : ( No Body )}
)}
); });