edit.tsx 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. import {browserHistory} from 'react-router';
  2. import Breadcrumbs from 'sentry/components/breadcrumbs';
  3. import * as Layout from 'sentry/components/layouts/thirds';
  4. import LoadingError from 'sentry/components/loadingError';
  5. import LoadingIndicator from 'sentry/components/loadingIndicator';
  6. import SentryDocumentTitle from 'sentry/components/sentryDocumentTitle';
  7. import {t} from 'sentry/locale';
  8. import {useQuery, useQueryClient} from 'sentry/utils/queryClient';
  9. import useOrganization from 'sentry/utils/useOrganization';
  10. import {useParams} from 'sentry/utils/useParams';
  11. import {normalizeUrl} from 'sentry/utils/withDomainRequired';
  12. import MonitorForm from './components/monitorForm';
  13. import {Monitor} from './types';
  14. export default function EditMonitor() {
  15. const {monitorSlug} = useParams();
  16. const organization = useOrganization();
  17. const queryClient = useQueryClient();
  18. const queryKeyUrl = `/organizations/${organization.slug}/monitors/${monitorSlug}/`;
  19. const {
  20. isLoading,
  21. isError,
  22. data: monitor,
  23. refetch,
  24. } = useQuery<Monitor>([queryKeyUrl], {
  25. staleTime: 0,
  26. });
  27. function onSubmitSuccess(data: Monitor) {
  28. queryClient.setQueryData([queryKeyUrl], data);
  29. browserHistory.push(
  30. normalizeUrl(`/organizations/${organization.slug}/crons/${data.slug}/`)
  31. );
  32. }
  33. function getTitle() {
  34. if (monitor) {
  35. return `${monitor.name} - Crons - ${organization.slug}`;
  36. }
  37. return `Crons - ${organization.slug}`;
  38. }
  39. if (isLoading) {
  40. return <LoadingIndicator />;
  41. }
  42. if (isError) {
  43. return <LoadingError onRetry={refetch} message="Failed to load monitor." />;
  44. }
  45. return (
  46. <SentryDocumentTitle title={getTitle()}>
  47. <Layout.Page>
  48. <Layout.Header>
  49. <Layout.HeaderContent>
  50. <Breadcrumbs
  51. crumbs={[
  52. {
  53. label: t('Crons'),
  54. to: `/organizations/${organization.slug}/crons/`,
  55. },
  56. {
  57. label: t('Editing %s', monitor.name),
  58. },
  59. ]}
  60. />
  61. <Layout.Title>{t('Edit Monitor')}</Layout.Title>
  62. </Layout.HeaderContent>
  63. </Layout.Header>
  64. <Layout.Body>
  65. <Layout.Main fullWidth>
  66. <MonitorForm
  67. monitor={monitor}
  68. apiMethod="PUT"
  69. apiEndpoint={`/organizations/${organization.slug}/monitors/${monitor.slug}/`}
  70. onSubmitSuccess={onSubmitSuccess}
  71. />
  72. </Layout.Main>
  73. </Layout.Body>
  74. </Layout.Page>
  75. </SentryDocumentTitle>
  76. );
  77. }