useMutateProject.tsx 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. import {addErrorMessage, addSuccessMessage} from 'sentry/actionCreators/indicator';
  2. import type {
  3. HighlightContext,
  4. HighlightTags,
  5. } from 'sentry/components/events/highlights/util';
  6. import {tct} from 'sentry/locale';
  7. import type {Organization} from 'sentry/types/organization';
  8. import type {Project} from 'sentry/types/project';
  9. import {setApiQueryData, useMutation, useQueryClient} from 'sentry/utils/queryClient';
  10. import type RequestError from 'sentry/utils/requestError/requestError';
  11. import useApi from 'sentry/utils/useApi';
  12. import {makeDetailedProjectQueryKey} from 'sentry/utils/useDetailedProject';
  13. interface MutateProjectPayload {
  14. // We can mutate more with this API call, but we'll keep this typed to the few places this is used
  15. highlightContext?: HighlightContext;
  16. highlightTags?: HighlightTags;
  17. }
  18. interface UseMutateProjectProps {
  19. organization: Organization;
  20. project: Project;
  21. onError?: (error: RequestError) => void;
  22. onSuccess?: (project: Project) => void;
  23. }
  24. export default function useMutateProject({
  25. organization,
  26. project,
  27. onSuccess,
  28. onError,
  29. }: UseMutateProjectProps) {
  30. const api = useApi({
  31. persistInFlight: false,
  32. });
  33. const queryClient = useQueryClient();
  34. return useMutation<Project, RequestError, MutateProjectPayload>({
  35. mutationFn: data =>
  36. api.requestPromise(`/projects/${organization.slug}/${project.slug}/`, {
  37. method: 'PUT',
  38. data,
  39. }),
  40. onSuccess: (updatedProject: Project) => {
  41. addSuccessMessage(
  42. tct(`Successfully updated '[projectName]' project`, {
  43. projectName: project.name,
  44. })
  45. );
  46. setApiQueryData<Project>(
  47. queryClient,
  48. makeDetailedProjectQueryKey({
  49. orgSlug: organization.slug,
  50. projectSlug: project.slug,
  51. }),
  52. existingData => (updatedProject ? updatedProject : existingData)
  53. );
  54. return onSuccess?.(updatedProject);
  55. },
  56. onError: error => {
  57. addErrorMessage(
  58. tct(`Failed to update '[projectName]' project`, {
  59. projectName: project.name,
  60. })
  61. );
  62. return onError?.(error);
  63. },
  64. });
  65. }