monitorHeaderActions.tsx 2.5 KB

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