monitorHeaderActions.tsx 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. import {browserHistory} from 'react-router';
  2. import styled from '@emotion/styled';
  3. import {
  4. addErrorMessage,
  5. addLoadingMessage,
  6. clearIndicators,
  7. } from 'sentry/actionCreators/indicator';
  8. import Access from 'sentry/components/acl/access';
  9. import Button from 'sentry/components/button';
  10. import ButtonBar from 'sentry/components/buttonBar';
  11. import Confirm from 'sentry/components/confirm';
  12. import {IconDelete, IconEdit} from 'sentry/icons';
  13. import {t} from 'sentry/locale';
  14. import space from 'sentry/styles/space';
  15. import {logException} from 'sentry/utils/logging';
  16. import useApi from 'sentry/utils/useApi';
  17. import {Monitor} from './types';
  18. type Props = {
  19. monitor: Monitor;
  20. onUpdate: (data: Monitor) => void;
  21. orgId: string;
  22. };
  23. const DISABLED_TOOLTIP_TEXT = t(
  24. 'These settings can only be edited by users with the organization owner, manager, or admin role.'
  25. );
  26. const MonitorHeaderActions = ({monitor, orgId, onUpdate}: Props) => {
  27. const api = useApi();
  28. const handleDelete = () => {
  29. const redirectPath = `/organizations/${orgId}/monitors/`;
  30. addLoadingMessage(t('Deleting Monitor...'));
  31. api
  32. .requestPromise(`/monitors/${monitor.id}/`, {
  33. method: 'DELETE',
  34. })
  35. .then(() => {
  36. browserHistory.push(redirectPath);
  37. })
  38. .catch(() => {
  39. addErrorMessage(t('Unable to remove monitor.'));
  40. });
  41. };
  42. const updateMonitor = (data: Partial<Monitor>) => {
  43. addLoadingMessage();
  44. api
  45. .requestPromise(`/monitors/${monitor.id}/`, {
  46. method: 'PUT',
  47. data,
  48. })
  49. .then(resp => {
  50. clearIndicators();
  51. onUpdate?.(resp);
  52. })
  53. .catch(err => {
  54. logException(err);
  55. addErrorMessage(t('Unable to update monitor.'));
  56. });
  57. };
  58. const toggleStatus = () =>
  59. updateMonitor({
  60. status: monitor.status === 'disabled' ? 'active' : 'disabled',
  61. });
  62. return (
  63. <Access access={['project:write']}>
  64. {({hasAccess}) => (
  65. <ButtonContainer>
  66. <ButtonBar gap={1}>
  67. <Button
  68. size="sm"
  69. icon={<IconEdit size="xs" />}
  70. to={`/organizations/${orgId}/monitors/${monitor.id}/edit/`}
  71. >
  72. {hasAccess ? t('Edit') : t('View Config')}
  73. </Button>
  74. <Button
  75. size="sm"
  76. onClick={toggleStatus}
  77. disabled={!hasAccess}
  78. title={DISABLED_TOOLTIP_TEXT}
  79. tooltipProps={{disabled: hasAccess}}
  80. >
  81. {monitor.status !== 'disabled' ? t('Pause') : t('Enable')}
  82. </Button>
  83. <Confirm
  84. onConfirm={handleDelete}
  85. message={t(
  86. 'Deleting this monitor is permanent. Are you sure you wish to continue?'
  87. )}
  88. disabled={!hasAccess}
  89. >
  90. <Button
  91. size="sm"
  92. icon={<IconDelete size="xs" />}
  93. title={DISABLED_TOOLTIP_TEXT}
  94. tooltipProps={{disabled: hasAccess}}
  95. >
  96. {t('Delete')}
  97. </Button>
  98. </Confirm>
  99. </ButtonBar>
  100. </ButtonContainer>
  101. )}
  102. </Access>
  103. );
  104. };
  105. const ButtonContainer = styled('div')`
  106. margin-bottom: ${space(3)};
  107. display: flex;
  108. flex-shrink: 1;
  109. `;
  110. export default MonitorHeaderActions;