export function useChangeOperationMutation()

in experimenter/experimenter/nimbus-ui/src/hooks/useChangeOperationMutation.tsx [18:95]


export function useChangeOperationMutation(
  experiment: Experiment | undefined,
  refetch?: () => Promise<unknown>,
  ...dataSets: Partial<ExperimentInput>[]
) {
  const [submitError, setSubmitError] = useState<string | null>(null);
  const [isLoading, setIsLoading] = useState(false);

  const [updateExperiment] = useMutation<
    updateExperiment,
    updateExperimentVariables
  >(UPDATE_EXPERIMENT_MUTATION);

  const callbacks = useMemo(
    () =>
      dataSets.map(
        (baseDataChanges: Partial<ExperimentInput>) =>
          async (
            _inputEvent?: any,
            submitDataChanges?: Partial<ExperimentInput>,
          ) => {
            setIsLoading(true);
            setSubmitError(null);

            try {
              const result = await updateExperiment({
                variables: {
                  input: {
                    id: experiment?.id,
                    ...baseDataChanges,
                    ...submitDataChanges,
                  },
                },
              });

              // istanbul ignore next - can't figure out how to trigger this in a test
              if (!result.data?.updateExperiment) {
                throw new Error(SUBMIT_ERROR);
              }

              const { message } = result.data.updateExperiment;

              if (
                message &&
                message !== "success" &&
                typeof message === "object"
              ) {
                const errors = [];
                for (const name of CHANGE_MUTATION_DISPLAY_ERROR_FIELDS) {
                  if (message[name]) {
                    errors.push(...message[name]);
                  }
                }
                setSubmitError(
                  errors.length ? errors.join(", ") : SUBMIT_ERROR,
                );
              }
              if (refetch) {
                await refetch();
              }
            } catch (error) {
              setSubmitError(SUBMIT_ERROR);
            }
            setIsLoading(false);
          },
      ),
    [
      updateExperiment,
      experiment,
      refetch,
      dataSets,
      setIsLoading,
      setSubmitError,
    ],
  );

  return { callbacks, isLoading, submitError };
}