import { IgnitionErrorPayload, IgnitionFrame, } from '@common/utils/http/ignition-error-dialog/ignition-error-payload'; import React, {Fragment, useState} from 'react'; import {Trans} from '@common/i18n/trans'; import {KeyboardArrowDownIcon} from '@common/icons/material/KeyboardArrowDown'; import clsx from 'clsx'; import {Button} from '@common/ui/buttons/button'; import {UnfoldMoreIcon} from '@common/icons/material/UnfoldMore'; import {UnfoldLessIcon} from '@common/icons/material/UnfoldLess'; interface StackTraceProps { trace: IgnitionErrorPayload['trace']; onSelectedIndexChange: (index: number) => void; selectedIndex: number; totalVendorGroups: number; } export function IgnitionStackTrace({ trace, onSelectedIndexChange, selectedIndex, totalVendorGroups, }: StackTraceProps) { const [expandedVendorGroups, setExpandedVendorGroups] = useState( [], ); const allVendorGroupsExpanded = expandedVendorGroups.length === totalVendorGroups; return (
{trace.map((frame, index) => { if ('vendorGroup' in frame) { // vendor group is expanded, display all vendor frames if (expandedVendorGroups.includes(index)) { return ( {frame.items.map((vendorFrame, index) => ( onSelectedIndexChange(vendorFrame.flatIndex)} isSelected={selectedIndex === vendorFrame.flatIndex} /> ))} ); } // vendor group is collapsed, only show vendor group header return (
setExpandedVendorGroups(prev => [...prev, index])} >
); } // app frame item return ( onSelectedIndexChange(frame.flatIndex)} isSelected={selectedIndex === frame.flatIndex} /> ); })}
); } interface StackTrackItemProps { frame: IgnitionFrame; onClick: () => void; isSelected: boolean; } function StackTrackItem({frame, onClick, isSelected}: StackTrackItemProps) { return (
{frame.method}
); } interface IgnitionFilePath { frame: IgnitionFrame; } export function IgnitionFilePath({frame}: IgnitionFilePath) { return (
{frame.path.map((part, index) => frame.path.length - 1 === index ? (
{part}
) : (
{part}/
), )}
:{frame.lineNumber}
); }