import React from 'react'; import classnames from 'classnames'; import { getContentType, safeStringifyJSON, safeParseXML } from 'utils/common'; import { getCodeMirrorModeBasedOnContentType } from 'utils/common/codemirror'; import QueryResultPreview from './QueryResultPreview'; import StyledWrapper from './StyledWrapper'; import { useState } from 'react'; import { useMemo } from 'react'; import { useEffect } from 'react'; import { useTheme } from 'providers/Theme/index'; const formatResponse = (data, mode) => { if (!data) { return ''; } if (mode.includes('json')) { return safeStringifyJSON(data, true); } if (mode.includes('xml')) { let parsed = safeParseXML(data, { collapseContent: true }); if (typeof parsed === 'string') { return parsed; } return safeStringifyJSON(parsed, true); } if (typeof data === 'string') { return data; } return safeStringifyJSON(data, true); }; const QueryResult = ({ item, collection, data, dataBuffer, width, disableRunEventListener, headers, error }) => { const contentType = getContentType(headers); const mode = getCodeMirrorModeBasedOnContentType(contentType, data); const formattedData = formatResponse(data, mode); const { storedTheme } = useTheme(); const allowedPreviewModes = useMemo(() => { // Always show raw const allowedPreviewModes = ['raw']; if (mode.includes('html') && typeof data === 'string') { allowedPreviewModes.unshift('preview-web'); } else if (mode.includes('image')) { allowedPreviewModes.unshift('preview-image'); } return allowedPreviewModes; }, [mode, data, formattedData]); const [previewTab, setPreviewTab] = useState(allowedPreviewModes[0]); // Ensure the active Tab is always allowed useEffect(() => { if (!allowedPreviewModes.includes(previewTab)) { setPreviewTab(allowedPreviewModes[0]); } }, [previewTab, allowedPreviewModes]); const tabs = useMemo(() => { if (allowedPreviewModes.length === 1) { return null; } return allowedPreviewModes.map((previewMode) => (