eventMessage.tsx 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. import styled from '@emotion/styled';
  2. import ErrorLevel from 'sentry/components/events/errorLevel';
  3. import UnhandledTag from 'sentry/components/group/inboxBadges/unhandledTag';
  4. import {t} from 'sentry/locale';
  5. import {space} from 'sentry/styles/space';
  6. import {EventOrGroupType, type Level} from 'sentry/types/event';
  7. import {useHasStreamlinedUI} from 'sentry/views/issueDetails/utils';
  8. type Props = {
  9. type: EventOrGroupType;
  10. annotations?: React.ReactNode;
  11. className?: string;
  12. hasGuideAnchor?: boolean;
  13. level?: Level;
  14. levelIndicatorSize?: string;
  15. message?: React.ReactNode;
  16. showUnhandled?: boolean;
  17. };
  18. const EVENT_TYPES_WITH_LOG_LEVEL = new Set([
  19. EventOrGroupType.ERROR,
  20. EventOrGroupType.CSP,
  21. EventOrGroupType.EXPECTCT,
  22. EventOrGroupType.DEFAULT,
  23. EventOrGroupType.EXPECTSTAPLE,
  24. EventOrGroupType.HPKP,
  25. EventOrGroupType.NEL,
  26. ]);
  27. function EventOrGroupLevel({
  28. level,
  29. levelIndicatorSize,
  30. type,
  31. showUnhandled,
  32. }: Pick<Props, 'level' | 'levelIndicatorSize' | 'type' | 'showUnhandled'>) {
  33. if (level && EVENT_TYPES_WITH_LOG_LEVEL.has(type)) {
  34. return (
  35. <ErrorLevel level={level} size={levelIndicatorSize} showUnhandled={showUnhandled} />
  36. );
  37. }
  38. return null;
  39. }
  40. function EventMessage({
  41. className,
  42. annotations,
  43. level,
  44. levelIndicatorSize,
  45. message,
  46. type,
  47. showUnhandled = false,
  48. }: Props) {
  49. const hasStreamlinedUI = useHasStreamlinedUI();
  50. return (
  51. <LevelMessageContainer className={className}>
  52. <EventOrGroupLevel
  53. level={level}
  54. levelIndicatorSize={levelIndicatorSize}
  55. type={type}
  56. showUnhandled={showUnhandled}
  57. />
  58. {showUnhandled && !hasStreamlinedUI ? <UnhandledTag /> : null}
  59. {message ? (
  60. <Message>{message}</Message>
  61. ) : (
  62. <NoMessage>({t('No error message')})</NoMessage>
  63. )}
  64. {annotations}
  65. </LevelMessageContainer>
  66. );
  67. }
  68. const LevelMessageContainer = styled('div')`
  69. display: flex;
  70. gap: ${space(1)};
  71. align-items: center;
  72. position: relative;
  73. line-height: 1.2;
  74. overflow: hidden;
  75. `;
  76. const Message = styled('div')`
  77. ${p => p.theme.overflowEllipsis}
  78. width: auto;
  79. max-height: 38px;
  80. `;
  81. const NoMessage = styled(Message)`
  82. color: ${p => p.theme.subText};
  83. `;
  84. export default EventMessage;