43 lines
1.3 KiB
JavaScript
43 lines
1.3 KiB
JavaScript
import { useCallback } from "react";
|
|
import { useMutation } from "@apollo/client";
|
|
|
|
function withError(fn) {
|
|
// eslint-disable-next-line react-hooks/rules-of-hooks
|
|
return useCallback(
|
|
async (...args) => {
|
|
const result = {};
|
|
try {
|
|
const { data, errors } = await fn(...args);
|
|
result.data = data;
|
|
result.errors = errors;
|
|
} catch (error) {
|
|
// maybe related to https://github.com/apollographql/apollo-link/issues/828
|
|
if (
|
|
error.name === "ApolloError" &&
|
|
error.message === "Error message not found."
|
|
) {
|
|
if (error.networkError?.graphQLErrors?.[0]?.extensions?.statusCode) {
|
|
const { extensions } = error.networkError.graphQLErrors[0];
|
|
error.message =
|
|
extensions.responseBody.message || extensions.statusText;
|
|
}
|
|
}
|
|
if (error.networkError?.graphQLErrors?.[0]?.extensions?.responseBody) {
|
|
result.data =
|
|
error.networkError.graphQLErrors[0].extensions.responseBody;
|
|
} else {
|
|
result.data = null;
|
|
}
|
|
result.errors = [error];
|
|
}
|
|
return result;
|
|
},
|
|
[fn],
|
|
);
|
|
}
|
|
function useMutationWithError(...args) {
|
|
const [action, ...res] = useMutation(...args);
|
|
return [withError(action), ...res];
|
|
}
|
|
|
|
export { useMutationWithError, withError };
|