eventMessage.tsx 2.2 KB

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