// type MyQueryVariables always has accessToken
type MyQueryVariables = Record<string, unknown> & { accessToken?: string };
const useAuthenticatedMutation = <
TData = unknown,
TError = unknown,
TVariables = MyQueryVariables,
TContext = unknown
>(
options: UseMutationOptions<TData, TError, TVariables, TContext>
) => {
const { accessToken, fetchAccessToken } = useAuth();
return useMutation<TData, TError, TVariables, TContext>({
...options,
mutationFn: async (variables) => {
// Attach access token to variables
const myVariables = { ...variables, accessToken } as TVariables;
console.log("Access token of length", accessToken?.length, "attached to variables");
return (
options && options.mutationFn && (options.mutationFn(myVariables as TVariables) as any)
);
},
retry: (failureCount, error) => {
if (failureCount > 2) {
return false;
}
if (!(error instanceof AxiosError)) {
return false;
}
if (error.response?.status != 401) {
return false;
}
if (error.response?.data?.message === "EXPIRED_TOKEN") {
console.log("Access token expired, fetching new access token...");
fetchAccessToken();
return true;
}
return false;
},
});
};
export default useAuthenticatedMutation;
// type MyQueryVariables always has accessToken
type MyQueryVariables = Record<string, unknown> & { accessToken?: string };
const useAuthenticatedMutation = <
TData = unknown,
TError = unknown,
TVariables = MyQueryVariables,
TContext = unknown
>(
options: UseMutationOptions<TData, TError, TVariables, TContext>
) => {
const { accessToken, fetchAccessToken } = useAuth();
return useMutation<TData, TError, TVariables, TContext>({
...options,
mutationFn: async (variables) => {
// Attach access token to variables
const myVariables = { ...variables, accessToken } as TVariables;
console.log("Access token of length", accessToken?.length, "attached to variables");
return (
options && options.mutationFn && (options.mutationFn(myVariables as TVariables) as any)
);
},
retry: (failureCount, error) => {
if (failureCount > 2) {
return false;
}
if (!(error instanceof AxiosError)) {
return false;
}
if (error.response?.status != 401) {
return false;
}
if (error.response?.data?.message === "EXPIRED_TOKEN") {
console.log("Access token expired, fetching new access token...");
fetchAccessToken();
return true;
}
return false;
},
});
};
export default useAuthenticatedMutation;