All files / utils useBackend.jsx

100% Statements 76/76
100% Branches 15/15
100% Functions 7/7
100% Lines 76/76

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 881x 1x 1x   1x 1x 1x   1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x   1x 1x 1x 1x 1x 1x   1x 75x 75x 75x 32x 32x 20x 31x 12x 12x 12x 12x 12x 32x 75x 75x 75x   75x   1x 1x   1x 4x 4x 4x 4x   1x 24x 24x 24x 20x 23x 4x 4x 4x 24x   1x 254x 254x 254x   254x   254x 254x 4x 4x 254x 254x 24x 24x 254x 254x 254x 254x 254x  
import { useQuery, useMutation, useQueryClient } from "react-query";
import axios from "axios";
import { toast } from "react-toastify";
 
// example
//  queryKey ["/api/users/all"] for "api/users/all"
//  queryKey ["/api/users","4"]  for "/api/users?id=4"
 
// For axiosParameters
//
// {
//     method: 'post',
//     url: '/user/12345',
//     data: {
//       firstName: 'Fred',
//       lastName: 'Flintstone'
//     }
//  }
//
 
// GET Example:
// useBackend(
//     ["/api/admin/users"],
//     { method: "GET", url: "/api/admin/users" },
//     []
// );
 
export function useBackend(queryKey, axiosParameters, initialData) {
  return useQuery(
    queryKey,
    async () => {
      try {
        const response = await axios(axiosParameters);
        return response.data;
      } catch (e) {
        const errorMessage = `Error communicating with backend via ${axiosParameters.method} on ${axiosParameters.url}`;
        toast(errorMessage);
        console.error(errorMessage, e);
        throw e;
      }
    },
    {
      initialData,
    },
  );
}
 
// const wrappedParams = async (params) =>
//   await ( await axios(params)).data;
 
const reportAxiosError = (error) => {
  console.error("Axios Error:", error);
  toast(`Axios Error: ${error}`);
  return null;
};
 
const wrappedParams = async (params) => {
  try {
    return await (
      await axios(params)
    ).data;
  } catch (rejectedValue) {
    reportAxiosError(rejectedValue);
    throw rejectedValue;
  }
};
 
export function useBackendMutation(
  objectToAxiosParams,
  useMutationParams,
  queryKey = null,
) {
  const queryClient = useQueryClient();
 
  return useMutation((object) => wrappedParams(objectToAxiosParams(object)), {
    onError: (data) => {
      toast(`${data}`);
    },
    // Stryker disable all: Not sure how to set up the complex behavior needed to test this
    onSettled: () => {
      if (queryKey !== null) queryClient.invalidateQueries(queryKey);
    },
    // Stryker restore all
    retry: false,
    ...useMutationParams,
  });
}