errorLevel.tsx 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. import {Fragment} from 'react';
  2. import styled from '@emotion/styled';
  3. import Divider from 'sentry/components/events/interfaces/debugMeta/debugImageDetails/candidate/information/divider';
  4. import UnhandledTag from 'sentry/components/group/inboxBadges/unhandledTag';
  5. import {Tooltip} from 'sentry/components/tooltip';
  6. import {tct} from 'sentry/locale';
  7. import type {Level} from 'sentry/types/event';
  8. import {capitalize} from 'sentry/utils/string/capitalize';
  9. import {useHasStreamlinedUI} from 'sentry/views/issueDetails/utils';
  10. const DEFAULT_SIZE = '13px';
  11. type Props = {
  12. className?: string;
  13. level?: Level;
  14. showUnhandled?: boolean;
  15. size?: string;
  16. };
  17. function ErrorLevel({className, showUnhandled, level = 'unknown', size = '11px'}: Props) {
  18. const hasStreamlinedUI = useHasStreamlinedUI();
  19. const levelLabel = tct('Level: [level]', {level: capitalize(level)});
  20. if (hasStreamlinedUI) {
  21. return (
  22. <Fragment>
  23. {showUnhandled ? (
  24. <Fragment>
  25. <UnhandledTag />
  26. <Divider />
  27. </Fragment>
  28. ) : null}
  29. {capitalize(level)}
  30. <Divider />
  31. </Fragment>
  32. );
  33. }
  34. return (
  35. <Tooltip skipWrapper disabled={level === 'unknown'} title={levelLabel}>
  36. <ColoredCircle className={className} level={level} size={size}>
  37. {levelLabel}
  38. </ColoredCircle>
  39. </Tooltip>
  40. );
  41. }
  42. const ColoredCircle = styled('span')<Props>`
  43. padding: 0;
  44. position: relative;
  45. width: ${p => p.size || DEFAULT_SIZE};
  46. height: ${p => p.size || DEFAULT_SIZE};
  47. text-indent: -9999em;
  48. display: inline-block;
  49. border-radius: 50%;
  50. flex-shrink: 0;
  51. background-color: ${p => (p.level ? p.theme.level[p.level] : p.theme.level.error)};
  52. `;
  53. export default ErrorLevel;