monitorEnvironmentLabel.tsx 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. import styled from '@emotion/styled';
  2. import {Tooltip} from 'sentry/components/tooltip';
  3. import {IconFix, IconMute} from 'sentry/icons';
  4. import {t} from 'sentry/locale';
  5. import {space} from 'sentry/styles/space';
  6. import type {ColorOrAlias} from 'sentry/utils/theme';
  7. import {
  8. type MonitorEnvironment,
  9. MonitorStatus,
  10. type StatusNotice,
  11. } from 'sentry/views/monitors/types';
  12. import {statusIconColorMap} from 'sentry/views/monitors/utils/constants';
  13. interface Props {
  14. monitorEnv: MonitorEnvironment;
  15. }
  16. const userNotifiedDisplay: StatusNotice = {
  17. label: t(
  18. 'This environment is likely broken due to being in an error state for multiple days.'
  19. ),
  20. icon: <IconFix color="subText" />,
  21. color: 'subText',
  22. };
  23. const envMutedDisplay: StatusNotice = {
  24. label: t(
  25. 'This environment is likely broken due to being in an error state for multiple days. It has been automatically muted.'
  26. ),
  27. icon: <IconMute color="subText" />,
  28. color: 'subText',
  29. };
  30. export default function MonitorEnvironmentLabel({monitorEnv}: Props) {
  31. const {name, status, isMuted, activeIncident} = monitorEnv;
  32. const {userNotifiedTimestamp, environmentMutedTimestamp} =
  33. activeIncident?.brokenNotice ?? {};
  34. const envStatus = isMuted ? MonitorStatus.DISABLED : status;
  35. const {label, icon, color} = environmentMutedTimestamp
  36. ? envMutedDisplay
  37. : userNotifiedTimestamp
  38. ? userNotifiedDisplay
  39. : statusIconColorMap[envStatus];
  40. return (
  41. <EnvWithStatus>
  42. <MonitorEnvLabel color={color}>{name}</MonitorEnvLabel>
  43. <Tooltip disabled={!label} title={label} skipWrapper>
  44. {icon}
  45. </Tooltip>
  46. </EnvWithStatus>
  47. );
  48. }
  49. const EnvWithStatus = styled('div')`
  50. display: grid;
  51. grid-template-columns: 1fr max-content;
  52. gap: ${space(0.5)};
  53. align-items: center;
  54. opacity: var(--disabled-opacity);
  55. `;
  56. const MonitorEnvLabel = styled('div')<{color: ColorOrAlias}>`
  57. text-overflow: ellipsis;
  58. overflow: hidden;
  59. white-space: nowrap;
  60. min-width: 0;
  61. color: ${p => p.theme[p.color]};
  62. opacity: var(--disabled-opacity);
  63. `;