eventMessage.tsx 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  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 type {Event, EventOrGroupType, Level} from 'sentry/types/event';
  7. import type {BaseGroup, GroupTombstoneHelper} from 'sentry/types/group';
  8. import {eventTypeHasLogLevel, getTitle} from 'sentry/utils/events';
  9. import useOrganization from 'sentry/utils/useOrganization';
  10. import {Divider} from 'sentry/views/issueDetails/divider';
  11. import {useHasStreamlinedUI} from 'sentry/views/issueDetails/utils';
  12. type Props = {
  13. data: Event | BaseGroup | GroupTombstoneHelper;
  14. message: React.ReactNode;
  15. type: EventOrGroupType;
  16. className?: string;
  17. level?: Level;
  18. /**
  19. * Size of the level indicator.
  20. */
  21. levelIndicatorSize?: '9px' | '10px' | '11px';
  22. showUnhandled?: boolean;
  23. };
  24. function EventMessage({
  25. data,
  26. className,
  27. level,
  28. levelIndicatorSize,
  29. message,
  30. type,
  31. showUnhandled = false,
  32. }: Props) {
  33. const organization = useOrganization({allowNull: true});
  34. const hasStreamlinedUI = useHasStreamlinedUI();
  35. // TODO(malwilley): When the new layout is GA'd, this component should be renamed
  36. const hasNewIssueStreamTableLayout = organization?.features.includes(
  37. 'issue-stream-table-layout'
  38. );
  39. const showEventLevel = level && eventTypeHasLogLevel(type);
  40. const {subtitle} = getTitle(data);
  41. const renderedMessage = message ? (
  42. <Message>{message}</Message>
  43. ) : (
  44. <NoMessage>({t('No error message')})</NoMessage>
  45. );
  46. return (
  47. <LevelMessageContainer className={className}>
  48. {showEventLevel && <ErrorLevel level={level} size={levelIndicatorSize} />}
  49. {hasStreamlinedUI && showEventLevel ? <Divider /> : null}
  50. {showUnhandled ? <UnhandledTag /> : null}
  51. {hasStreamlinedUI && showUnhandled ? <Divider /> : null}
  52. {hasNewIssueStreamTableLayout ? subtitle : renderedMessage}
  53. </LevelMessageContainer>
  54. );
  55. }
  56. const LevelMessageContainer = styled('div')`
  57. display: flex;
  58. gap: ${space(1)};
  59. align-items: center;
  60. position: relative;
  61. line-height: 1.2;
  62. overflow: hidden;
  63. `;
  64. const Message = styled('div')`
  65. ${p => p.theme.overflowEllipsis}
  66. width: auto;
  67. max-height: 38px;
  68. `;
  69. const NoMessage = styled(Message)`
  70. color: ${p => p.theme.subText};
  71. `;
  72. export default EventMessage;