import React, { useState } from 'react'; import { useSelector, useDispatch } from 'react-redux'; import { IconX, IconBug, IconFileText, IconCode, IconStack, IconBrandGithub } from '@tabler/icons'; import { clearSelectedError } from 'providers/ReduxStore/slices/logs'; import { useApp } from 'providers/App'; import platformLib from 'platform'; import StyledWrapper from './StyledWrapper'; const ErrorInfoTab = ({ error }) => { const { version } = useApp(); const formatTimestamp = (timestamp) => { const date = new Date(timestamp); return date.toLocaleString(); }; const generateGitHubIssueUrl = () => { const title = `Bug: ${error.message.substring(0, 50)}${error.message.length > 50 ? '...' : ''}`; const body = `## Bug Report ### Error Details - **Message**: ${error.message} - **File**: ${error.filename || 'Unknown'} - **Line**: ${error.lineno || 'Unknown'}:${error.colno || 'Unknown'} - **Timestamp**: ${formatTimestamp(error.timestamp)} ### Environment - **Bruno Version**: ${version} - **OS**: ${platformLib.os.family} ${platformLib.os.version || ''} - **Browser**: ${platformLib.name} ${platformLib.version || ''} ### Stack Trace \`\`\` ${error.stack || 'No stack trace available'} \`\`\` ### Arguments \`\`\` ${error.args ? error.args.map((arg, index) => { if (arg && typeof arg === 'object' && arg.__type === 'Error') { return `[${index}]: Error: ${arg.message}`; } return `[${index}]: ${typeof arg === 'object' ? JSON.stringify(arg, null, 2) : String(arg)}`; }).join('\n') : 'No arguments'} \`\`\` ### Steps to Reproduce 1. 2. 3. ### Expected Behavior ### Additional Context `; const encodedTitle = encodeURIComponent(title); const encodedBody = encodeURIComponent(body); return `https://github.com/usebruno/bruno/issues/new?template=BLANK_ISSUE&title=${encodedTitle}&body=${encodedBody}`; }; const handleReportIssue = () => { const url = generateGitHubIssueUrl(); window.open(url, '_blank'); }; return (

Error Information

{error.message || 'No message available'}
{error.filename && (
{error.filename}
)} {error.lineno && (
{error.lineno}{error.colno ? `:${error.colno}` : ''}
)}
{formatTimestamp(error.timestamp)}

Report Issue

Found a bug? Help us improve Bruno by reporting this error on GitHub.

); }; const StackTraceTab = ({ error }) => { const formatStackTrace = (stack) => { if (!stack) return 'Stack trace not available'; return stack .split('\n') .map((line) => line.trim()) .filter((line) => line.length > 0) .join('\n'); }; return (

Stack Trace

            {formatStackTrace(error.stack)}
          
); }; const ArgumentsTab = ({ error }) => { const formatArguments = (args) => { if (!args || args.length === 0) return 'No arguments available'; try { return args.map((arg, index) => { // Handle special Error object format if (arg && typeof arg === 'object' && arg.__type === 'Error') { return `[${index}]: Error: ${arg.message}\n Name: ${arg.name}\n Stack: ${arg.stack || 'No stack trace'}`; } if (typeof arg === 'object' && arg !== null) { return `[${index}]: ${JSON.stringify(arg, null, 2)}`; } return `[${index}]: ${String(arg)}`; }).join('\n\n'); } catch (e) { return 'Arguments could not be formatted'; } }; return (

Arguments

            {formatArguments(error.args)}
          
); }; const ErrorDetailsPanel = () => { const dispatch = useDispatch(); const { selectedError } = useSelector((state) => state.logs); const [activeTab, setActiveTab] = useState('info'); if (!selectedError) return null; const handleClose = () => { dispatch(clearSelectedError()); }; const formatTime = (timestamp) => { const date = new Date(timestamp); return date.toLocaleString(); }; const getTabContent = () => { switch (activeTab) { case 'info': return ; case 'stack': return ; case 'args': return ; default: return ; } }; return (
Error Details ({formatTime(selectedError.timestamp)})
{getTabContent()}
); }; export default ErrorDetailsPanel;