edit.tsx 2.5 KB

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