All files / utils useBackend.js

100% Statements 73/73
100% Branches 13/13
100% Functions 7/7
100% Lines 73/73

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 811x 1x 1x   1x 1x 1x   1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x   1x 1x 1x 1x 1x 1x   1x 109x 109x 109x 109x 109x 109x 109x 109x 69x 69x 50x 68x 19x 19x 18x 18x 19x 19x 19x 109x 109x 109x 109x   1x 38x 38x 35x 35x   1x 188x 188x 188x 188x 188x   188x 188x 188x 3x 188x 188x 188x 38x 38x 188x 188x 188x 188x 188x 188x  
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,
) {
  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,
  });
}
 
const wrappedParams = async (params) => {
  return await (
    await axios(params)
  ).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)
        queryClient.invalidateQueries({ queryKey: queryKey });
    },
    // Stryker restore all
    retry: false,
    ...useMutationParams,
  });
}