All files / utils useBackend.js

100% Statements 75/75
100% Branches 20/20
100% Functions 6/6
100% Lines 75/75

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 831x 1x 1x   1x 1x 1x   1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x   1x 1x 1x 1x 1x 1x   1x 1200x 1200x 1200x 317x 317x 268x 316x 48x 48x 1x 47x 47x 47x 47x 35x 35x 1200x 1200x 1200x 1200x 1200x   1x 31x 31x 20x 20x   1x 580x 580x 580x 580x 580x   580x 580x 11x 11x 1x 10x 10x 10x 10x 580x 580x 580x 22x 580x 580x 580x 580x 580x 580x  
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, rest) {
  return useQuery({
    queryKey: queryKey,
    queryFn: async () => {
      try {
        const response = await axios(axiosParameters);
        return response.data;
      } catch (e) {
        // Stryker disable next-line OptionalChaining
        if (e.response?.data?.message) {
          toast.error(e.response.data.message);
        } else {
          const errorMessage = `Error communicating with backend via ${axiosParameters.method} on ${axiosParameters.url}`;
          toast.error(errorMessage);
        }
        throw e;
      }
    },
    initialData: initialData,
    ...rest,
  });
}
 
const wrappedParams = async (params) => {
  return await (
    await axios(params)
  ).data;
};
 
export function useBackendMutation(
  objectToAxiosParams,
  useMutationParams,
  queryKey = null,
) {
  const queryClient = useQueryClient();
 
  return useMutation((object) => wrappedParams(objectToAxiosParams(object)), {
    onError: (error) => {
      // Stryker disable next-line OptionalChaining : we want to check if each nested object is there but we dont want to write tests for each specific case
      if (error.response?.data?.message) {
        toast.error(error.response.data.message);
      } else {
        const errorMessage = `Error communicating with backend via ${error.response.config.method} on ${error.response.config.url}`;
        toast.error(errorMessage);
      }
    },
    // 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,
  });
}