All files / utils useBackend.js

100% Statements 81/81
100% Branches 14/14
100% Functions 7/7
100% Lines 81/81

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 88 891x 1x 1x   1x 1x 1x   1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x   1x 1x 1x 1x 1x 1x   1x 441x 441x 441x 441x 441x 441x 441x 441x 441x 158x 158x 88x 157x 70x 70x 17x 17x 70x 70x 70x 441x 441x 441x 441x 441x   1x 60x 60x 39x 39x   1x 1538x 1538x 1538x 1538x 1538x   1538x 1538x 1538x 2x 1538x 1538x 1538x 58x 55x 55x 55x 65x 55x 55x 55x 1538x 1538x 1538x 1538x 1538x 1538x  
import { useQuery, useMutation, useQueryClient } from "@tanstack/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,
  suppressToasts = false,
  options = {},
) {
  return useQuery({
    queryKey: queryKey,
    queryFn: async () => {
      try {
        const response = await axios(axiosParameters);
        return response.data;
      } catch (e) {
        const errorMessage = `Error communicating with backend via ${axiosParameters.method} on ${axiosParameters.url}`;
        if (!suppressToasts) {
          toast(errorMessage);
        }
        console.error(errorMessage, e);
        throw e;
      }
    },
    initialData: initialData,
    ...options,
  });
}
 
const wrappedParams = async (params) => {
  // Directly returning the promise allows useMutation to handle rejections.
  const response = await axios(params);
  return response.data;
};
 
export function useBackendMutation(
  objectToAxiosParams,
  useMutationParams,
  queryKey = null,
) {
  const queryClient = useQueryClient();
 
  return useMutation({
    mutationFn: (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) {
        // Handle array of query keys for cache invalidation
        if (Array.isArray(queryKey)) {
          queryKey.forEach((key) => {
            queryClient.invalidateQueries({ queryKey: [key] });
          });
        }
      }
    },
    // Stryker restore all
    retry: false,
    ...useMutationParams,
  });
}