edit.tsx 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. import {useEffect} from 'react';
  2. import * as Layout from 'sentry/components/layouts/thirds';
  3. import LoadingError from 'sentry/components/loadingError';
  4. import LoadingIndicator from 'sentry/components/loadingIndicator';
  5. import {t} from 'sentry/locale';
  6. import type {Organization} from 'sentry/types/organization';
  7. import type {Project} from 'sentry/types/project';
  8. import {setApiQueryData, useApiQuery, useQueryClient} from 'sentry/utils/queryClient';
  9. import normalizeUrl from 'sentry/utils/url/normalizeUrl';
  10. import {useNavigate} from 'sentry/utils/useNavigate';
  11. import usePageFilters from 'sentry/utils/usePageFilters';
  12. import {useParams} from 'sentry/utils/useParams';
  13. import MonitorForm from 'sentry/views/monitors/components/monitorForm';
  14. import type {Monitor} from 'sentry/views/monitors/types';
  15. import {makeMonitorDetailsQueryKey} from 'sentry/views/monitors/utils';
  16. type Props = {
  17. onChangeTitle: (data: string) => void;
  18. organization: Organization;
  19. project: Project;
  20. };
  21. export function CronRulesEdit({onChangeTitle, project, organization}: Props) {
  22. const {monitorSlug, projectId} = useParams<{
  23. monitorSlug: string;
  24. projectId: string;
  25. }>();
  26. const navigate = useNavigate();
  27. const {selection} = usePageFilters();
  28. const queryClient = useQueryClient();
  29. const queryKey = makeMonitorDetailsQueryKey(organization, project.slug, monitorSlug, {
  30. expand: ['alertRule'],
  31. });
  32. const {
  33. isPending,
  34. isError,
  35. data: monitor,
  36. refetch,
  37. } = useApiQuery<Monitor>(queryKey, {
  38. gcTime: 0,
  39. staleTime: 0,
  40. });
  41. useEffect(
  42. () => onChangeTitle(monitor?.name ?? t('Editing Monitor')),
  43. [onChangeTitle, monitor?.name]
  44. );
  45. function onSubmitSuccess(data: Monitor) {
  46. setApiQueryData(queryClient, queryKey, data);
  47. navigate(
  48. normalizeUrl({
  49. pathname: `/organizations/${organization.slug}/alerts/rules/crons/${data.project.slug}/${data.slug}/details/`,
  50. query: {
  51. environment: selection.environments,
  52. project: selection.projects,
  53. },
  54. })
  55. );
  56. }
  57. if (isPending) {
  58. return <LoadingIndicator />;
  59. }
  60. if (isError) {
  61. return <LoadingError onRetry={refetch} message={t('Failed to load monitor.')} />;
  62. }
  63. return (
  64. <Layout.Main fullWidth>
  65. <MonitorForm
  66. monitor={monitor}
  67. apiMethod="PUT"
  68. apiEndpoint={`/projects/${organization.slug}/${projectId}/monitors/${monitor.slug}/`}
  69. onSubmitSuccess={onSubmitSuccess}
  70. />
  71. </Layout.Main>
  72. );
  73. }