eventMessage.tsx 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  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 useOrganization from 'sentry/utils/useOrganization';
  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. }: Pick<Props, 'level' | 'levelIndicatorSize' | 'type'>) {
  32. if (level && EVENT_TYPES_WITH_LOG_LEVEL.has(type)) {
  33. return <ErrorLevel level={level} size={levelIndicatorSize} />;
  34. }
  35. return null;
  36. }
  37. function EventMessage({
  38. className,
  39. annotations,
  40. level,
  41. levelIndicatorSize,
  42. message,
  43. type,
  44. showUnhandled = false,
  45. }: Props) {
  46. const organization = useOrganization({allowNull: true});
  47. const hasIssuePriority = organization?.features.includes('issue-priority-ui');
  48. if (!hasIssuePriority) {
  49. return (
  50. <LevelMessageContainer className={className}>
  51. {level ? (
  52. <EventOrGroupLevel
  53. level={level}
  54. levelIndicatorSize={levelIndicatorSize}
  55. type={type}
  56. />
  57. ) : null}
  58. {showUnhandled ? <UnhandledTag /> : null}
  59. {message ? <Message>{message}</Message> : null}
  60. </LevelMessageContainer>
  61. );
  62. }
  63. return (
  64. <LevelMessageContainer className={className}>
  65. <EventOrGroupLevel
  66. level={level}
  67. levelIndicatorSize={levelIndicatorSize}
  68. type={type}
  69. />
  70. {showUnhandled ? <UnhandledTag /> : null}
  71. {message ? (
  72. <Message>{message}</Message>
  73. ) : (
  74. <NoMessage>({t('No error message')})</NoMessage>
  75. )}
  76. {annotations}
  77. </LevelMessageContainer>
  78. );
  79. }
  80. const LevelMessageContainer = styled('div')`
  81. display: flex;
  82. gap: ${space(1)};
  83. align-items: center;
  84. position: relative;
  85. line-height: 1.2;
  86. overflow: hidden;
  87. `;
  88. const Message = styled('div')`
  89. ${p => p.theme.overflowEllipsis}
  90. width: auto;
  91. max-height: 38px;
  92. `;
  93. const NoMessage = styled(Message)`
  94. color: ${p => p.theme.subText};
  95. `;
  96. export default EventMessage;