All files / utils useBackend.js

100% Statements 29/29
100% Branches 9/9
100% Functions 9/9
100% Lines 28/28

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 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104                                                          896x     155x 155x 123x     31x 1x   30x 30x   16x                   512x     61x 61x 49x     12x 1x   11x 11x   5x               28x 23x       536x   536x     10x 1x   9x 9x         14x 12x                
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
        });
}
 
export function useBackendNoToast(queryKey, axiosParameters, initialData, rest) {
//sends error messages to console.log rather than toast pop up
    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) {
                    console.log(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
    })
}