@gqty/react
Version:
The No-GraphQL Client for React
117 lines (114 loc) • 3.15 kB
JavaScript
import { GQtyError } from 'gqty';
import * as React from 'react';
import { translateFetchPolicy } from '../common.mjs';
function UseLazyQueryReducer(state, action) {
switch (action.type) {
case "loading": {
if (state.isLoading) return state;
return {
data: state.data,
isLoading: true,
isCalled: true,
promise: action.promise
};
}
case "success": {
return {
data: action.data,
isLoading: false,
isCalled: true
};
}
case "failure": {
return {
data: state.data,
isLoading: false,
error: action.error,
isCalled: true
};
}
case "cache-found": {
return {
data: action.data,
isLoading: state.isLoading,
isCalled: true
};
}
}
}
function InitUseLazyQueryReducer() {
return {
data: void 0,
isLoading: false,
isCalled: false
};
}
function createUseLazyQuery({ resolve }, {
defaults: {
retry: defaultRetry,
lazyQuerySuspense: defaultSuspense,
lazyFetchPolicy: defaultFetchPolicy
}
}) {
const useLazyQuery = (fn, {
onCompleted,
onError,
fetchPolicy: hookDefaultFetchPolicy = defaultFetchPolicy,
retry = defaultRetry,
suspense = defaultSuspense,
operationName: defaultOperationName
} = {}) => {
const [state, dispatch] = React.useReducer(
UseLazyQueryReducer,
void 0,
InitUseLazyQueryReducer
);
if (suspense) {
if (state.promise) throw state.promise;
if (state.error) throw state.error;
}
return React.useMemo(() => {
const fetchQuery = async ({
fn: resolveFn = fn,
args,
fetchPolicy = hookDefaultFetchPolicy,
operationName = defaultOperationName
} = {}) => {
let innerFetchPromise;
try {
const fetchPromise = resolve(
({ query }) => resolveFn(query, args),
{
awaitsFetch: false,
cachePolicy: translateFetchPolicy(fetchPolicy),
onFetch(promise) {
innerFetchPromise = promise;
},
retryPolicy: retry,
operationName
}
).then((data2) => {
const typedData = data2;
if (fetchPolicy === "cache-and-network") {
dispatch({ type: "cache-found", data: typedData });
}
return innerFetchPromise != null ? innerFetchPromise : typedData;
});
dispatch({ type: "loading", promise: fetchPromise });
const data = await fetchPromise;
onCompleted == null ? void 0 : onCompleted(data);
dispatch({ type: "success", data });
return data;
} catch (error) {
const typedError = GQtyError.create(error);
onError == null ? void 0 : onError(typedError);
dispatch({ type: "failure", error: typedError });
throw error;
}
};
return Object.freeze([fetchQuery, state]);
}, [fn, onCompleted, onError, retry]);
};
return useLazyQuery;
}
export { createUseLazyQuery };