monitorHeaderActions.tsx 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  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 Button from 'sentry/components/button';
  9. import ButtonBar from 'sentry/components/buttonBar';
  10. import Confirm from 'sentry/components/confirm';
  11. import {IconDelete, IconEdit} from 'sentry/icons';
  12. import {t} from 'sentry/locale';
  13. import space from 'sentry/styles/space';
  14. import {logException} from 'sentry/utils/logging';
  15. import useApi from 'sentry/utils/useApi';
  16. import CronsFeedbackButton from './cronsFeedbackButton';
  17. import {Monitor} from './types';
  18. type Props = {
  19. monitor: Monitor;
  20. onUpdate: (data: Monitor) => void;
  21. orgId: string;
  22. };
  23. const MonitorHeaderActions = ({monitor, orgId, onUpdate}: Props) => {
  24. const api = useApi();
  25. const handleDelete = () => {
  26. const redirectPath = `/organizations/${orgId}/crons/`;
  27. addLoadingMessage(t('Deleting Monitor...'));
  28. api
  29. .requestPromise(`/organizations/${orgId}/monitors/${monitor.id}/`, {
  30. method: 'DELETE',
  31. })
  32. .then(() => {
  33. browserHistory.push(redirectPath);
  34. })
  35. .catch(() => {
  36. addErrorMessage(t('Unable to remove monitor.'));
  37. });
  38. };
  39. const updateMonitor = (data: Partial<Monitor>) => {
  40. addLoadingMessage();
  41. api
  42. .requestPromise(`/organizations/${orgId}/monitors/${monitor.id}/`, {
  43. method: 'PUT',
  44. data,
  45. })
  46. .then(resp => {
  47. clearIndicators();
  48. onUpdate?.(resp);
  49. })
  50. .catch(err => {
  51. logException(err);
  52. addErrorMessage(t('Unable to update monitor.'));
  53. });
  54. };
  55. const toggleStatus = () =>
  56. updateMonitor({
  57. status: monitor.status === 'disabled' ? 'active' : 'disabled',
  58. });
  59. return (
  60. <ButtonContainer>
  61. <ButtonBar gap={1}>
  62. <Button
  63. size="sm"
  64. icon={<IconEdit size="xs" />}
  65. to={`/organizations/${orgId}/crons/${monitor.id}/edit/`}
  66. >
  67. {t('Edit')}
  68. </Button>
  69. <Button size="sm" onClick={toggleStatus}>
  70. {monitor.status !== 'disabled' ? t('Pause') : t('Enable')}
  71. </Button>
  72. <Confirm
  73. onConfirm={handleDelete}
  74. message={t('Are you sure you want to permanently delete this cron monitor?')}
  75. >
  76. <Button size="sm" icon={<IconDelete size="xs" />}>
  77. {t('Delete')}
  78. </Button>
  79. </Confirm>
  80. <CronsFeedbackButton />
  81. </ButtonBar>
  82. </ButtonContainer>
  83. );
  84. };
  85. const ButtonContainer = styled('div')`
  86. margin-bottom: ${space(3)};
  87. display: flex;
  88. flex-shrink: 1;
  89. align-self: flex-end;
  90. `;
  91. export default MonitorHeaderActions;