alertBadge.tsx 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. import styled from '@emotion/styled';
  2. import {IconCheckmark, IconFire, IconIssues, IconWarning} from 'sentry/icons';
  3. import {t} from 'sentry/locale';
  4. import space from 'sentry/styles/space';
  5. import {Color} from 'sentry/utils/theme';
  6. import {IncidentStatus} from './types';
  7. type Props = {
  8. status?: IncidentStatus;
  9. hideText?: boolean;
  10. isIssue?: boolean;
  11. };
  12. function AlertBadge({status, hideText = false, isIssue}: Props) {
  13. let statusText = t('Resolved');
  14. let Icon = IconCheckmark;
  15. let color: Color = 'green300';
  16. if (isIssue) {
  17. statusText = t('Issue');
  18. Icon = IconIssues;
  19. color = 'gray300';
  20. } else if (status === IncidentStatus.CRITICAL) {
  21. statusText = t('Critical');
  22. Icon = IconFire;
  23. color = 'red300';
  24. } else if (status === IncidentStatus.WARNING) {
  25. statusText = t('Warning');
  26. Icon = IconWarning;
  27. color = 'yellow300';
  28. }
  29. return (
  30. <Wrapper data-test-id="alert-badge" displayFlex={!hideText}>
  31. <AlertIconWrapper color={color} icon={Icon}>
  32. <Icon color="white" />
  33. </AlertIconWrapper>
  34. {!hideText && <IncidentStatusValue color={color}>{statusText}</IncidentStatusValue>}
  35. </Wrapper>
  36. );
  37. }
  38. export default AlertBadge;
  39. const Wrapper = styled('div')<{displayFlex: boolean}>`
  40. display: ${p => (p.displayFlex ? `flex` : `block`)};
  41. align-items: center;
  42. `;
  43. const AlertIconWrapper = styled('div')<{color: Color; icon: React.ReactNode}>`
  44. display: flex;
  45. align-items: center;
  46. justify-content: center;
  47. flex-shrink: 0;
  48. /* icon warning needs to be treated differently to look visually centered */
  49. line-height: ${p => (p.icon === IconWarning ? undefined : 1)};
  50. left: 3px;
  51. min-width: 30px;
  52. &:before {
  53. content: '';
  54. position: absolute;
  55. width: 22px;
  56. height: 22px;
  57. border-radius: ${p => p.theme.borderRadius};
  58. background-color: ${p => p.theme[p.color]};
  59. transform: rotate(45deg);
  60. }
  61. svg {
  62. width: ${p => (p.icon === IconIssues ? '11px' : '13px')};
  63. z-index: 1;
  64. }
  65. `;
  66. const IncidentStatusValue = styled('div')<{color: Color}>`
  67. margin-left: ${space(1)};
  68. color: ${p => p.theme[p.color]};
  69. `;