import type { HttpResponse } from '@yaakapp-internal/models'; import { lazy, Suspense } from 'react'; import { useHttpRequestBody } from '../hooks/useHttpRequestBody'; import { getMimeTypeFromContentType, languageFromContentType } from '../lib/contentType'; import { LoadingIcon } from './core/LoadingIcon'; import { EmptyStateText } from './EmptyStateText'; import { AudioViewer } from './responseViewers/AudioViewer'; import { CsvViewer } from './responseViewers/CsvViewer'; import { ImageViewer } from './responseViewers/ImageViewer'; import { MultipartViewer } from './responseViewers/MultipartViewer'; import { SvgViewer } from './responseViewers/SvgViewer'; import { TextViewer } from './responseViewers/TextViewer'; import { VideoViewer } from './responseViewers/VideoViewer'; import { WebPageViewer } from './responseViewers/WebPageViewer'; const PdfViewer = lazy(() => import('./responseViewers/PdfViewer').then((m) => ({ default: m.PdfViewer })), ); interface Props { response: HttpResponse; } export function RequestBodyViewer({ response }: Props) { return ; } function RequestBodyViewerInner({ response }: Props) { const { data, isLoading, error } = useHttpRequestBody(response); if (isLoading) { return ( ); } if (error) { return Error loading request body: {error.message}; } if (data?.bodyText == null || data.bodyText.length === 0) { return No request body; } const { bodyText, body } = data; // Try to detect language from content-type header that was sent const contentTypeHeader = response.requestHeaders.find( (h) => h.name.toLowerCase() === 'content-type', ); const contentType = contentTypeHeader?.value ?? null; const mimeType = contentType ? getMimeTypeFromContentType(contentType).essence : null; const language = languageFromContentType(contentType, bodyText); // Route to appropriate viewer based on content type if (mimeType?.match(/^multipart/i)) { const boundary = contentType?.split('boundary=')[1] ?? 'unknown'; // Create a copy because parseMultipart may detach the buffer const bodyCopy = new Uint8Array(body); return ( ); } if (mimeType?.match(/^image\/svg/i)) { return ; } if (mimeType?.match(/^image/i)) { return ; } if (mimeType?.match(/^audio/i)) { return ; } if (mimeType?.match(/^video/i)) { return ; } if (mimeType?.match(/csv|tab-separated/i)) { return ; } if (mimeType?.match(/^text\/html/i)) { return ; } if (mimeType?.match(/pdf/i)) { return ( }> ); } return ( ); }