All files / utils useBackend.js

100% Statements 20/20
100% Branches 9/9
100% Functions 8/8
100% Lines 20/20

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 89                                                                    672x     254x 254x 151x   103x 103x 32x   103x 103x               31x   73x 48x               2176x   2176x 73x   2x       71x   63x 62x 75x                    
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,
  });
}