groupingComponentStacktrace.tsx 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. import {Fragment} from 'react';
  2. import {EventGroupComponent} from 'sentry/types';
  3. import GroupingComponent from './groupingComponent';
  4. import GroupingComponentFrames from './groupingComponentFrames';
  5. import {groupingComponentFilter} from './utils';
  6. type FrameGroup = {
  7. data: EventGroupComponent[];
  8. key: string;
  9. };
  10. type Props = {
  11. component: EventGroupComponent;
  12. showNonContributing: boolean;
  13. };
  14. const GroupingComponentStacktrace = ({component, showNonContributing}: Props) => {
  15. const getFrameGroups = () => {
  16. const frameGroups: FrameGroup[] = [];
  17. (component.values as EventGroupComponent[])
  18. .filter(value => groupingComponentFilter(value, showNonContributing))
  19. .forEach(value => {
  20. const key = (value.values as EventGroupComponent[])
  21. .filter(v => groupingComponentFilter(v, showNonContributing))
  22. .map(v => v.id)
  23. .sort((a, b) => a.localeCompare(b))
  24. .join('');
  25. const lastGroup = frameGroups[frameGroups.length - 1];
  26. if (lastGroup?.key === key) {
  27. lastGroup.data.push(value);
  28. } else {
  29. frameGroups.push({key, data: [value]});
  30. }
  31. });
  32. return frameGroups;
  33. };
  34. return (
  35. <Fragment>
  36. {getFrameGroups().map((group, index) => (
  37. <GroupingComponentFrames
  38. key={index}
  39. items={group.data.map((v, idx) => (
  40. <GroupingComponent
  41. key={idx}
  42. component={v}
  43. showNonContributing={showNonContributing}
  44. />
  45. ))}
  46. />
  47. ))}
  48. </Fragment>
  49. );
  50. };
  51. export default GroupingComponentStacktrace;