import type { HttpResponse } from '@yaakapp-internal/models'; import { useMemo, type ReactNode } from 'react'; import { useSaveResponse } from '../hooks/useSaveResponse'; import { useToggle } from '../hooks/useToggle'; import { isProbablyTextContentType } from '../lib/contentType'; import { getContentTypeFromHeaders } from '../lib/model_util'; import { getResponseBodyText } from '../lib/responseBody'; import { CopyButton } from './CopyButton'; import { Banner } from './core/Banner'; import { Button } from './core/Button'; import { InlineCode } from './core/InlineCode'; import { SizeTag } from './core/SizeTag'; import { HStack } from './core/Stacks'; interface Props { children: ReactNode; response: HttpResponse; } const LARGE_TEXT_BYTES = 2 * 1000 * 1000; const LARGE_OTHER_BYTES = 10 * 1000 * 1000; export function ConfirmLargeResponse({ children, response }: Props) { const { mutate: saveResponse } = useSaveResponse(response); const [showLargeResponse, toggleShowLargeResponse] = useToggle(); const isProbablyText = useMemo(() => { const contentType = getContentTypeFromHeaders(response.headers); return isProbablyTextContentType(contentType); }, [response.headers]); const contentLength = response.contentLength ?? 0; const tooLargeBytes = isProbablyText ? LARGE_TEXT_BYTES : LARGE_OTHER_BYTES; const isLarge = contentLength > tooLargeBytes; if (!showLargeResponse && isLarge) { return (

Showing responses over{' '} {' '} may impact performance

{isProbablyText && ( getResponseBodyText(response)} /> )}
); } return <>{children}; }