Skip to content
Merged
Next Next commit
pagination with useQuery fetchMore
  • Loading branch information
jackdclark committed Feb 21, 2019
commit a04f137e2527060e87aaf7400bf52e0a2aeedf48
8 changes: 6 additions & 2 deletions src/useClientRequest.js
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ function useClientRequest(query, initialOpts = {}) {
});

// arguments to fetchData override the useClientRequest arguments
async function fetchData(newOpts) {
async function fetchData(newOpts, updateResult) {
const revisedOpts = {
...initialOpts,
...newOpts
Expand Down Expand Up @@ -88,7 +88,11 @@ function useClientRequest(query, initialOpts = {}) {
}

dispatch({ type: actionTypes.LOADING });
const result = await client.request(revisedOperation, revisedOpts);
let result = await client.request(revisedOperation, revisedOpts);

if (result.data && updateResult && typeof updateResult === 'function') {
result.data = updateResult(state.data, result.data);
}

if (revisedOpts.useCache && client.cache) {
client.cache.set(revisedCacheKey, result);
Expand Down
23 changes: 18 additions & 5 deletions src/useQuery.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,10 @@ const defaultOpts = {
};

module.exports = function useQuery(query, opts = {}) {
const allOpts = { ...defaultOpts, ...opts };
const client = React.useContext(ClientContext);
const [calledDuringSSR, setCalledDuringSSR] = React.useState(false);
const [queryReq, state] = useClientRequest(query, {
...defaultOpts,
...opts
});
const [queryReq, state] = useClientRequest(query, allOpts);

if (client.ssrMode && opts.ssr !== false && !calledDuringSSR) {
// result may already be in the cache from previous SSR iterations
Expand All @@ -30,6 +28,21 @@ module.exports = function useQuery(query, opts = {}) {

return {
...state,
refetch: () => queryReq({ skipCache: true })
refetch: () => queryReq({ skipCache: true }),
fetchMore: (fetchMoreOpts, updateResult) => {
if (!updateResult) {
throw new Error(
'useQuery fetchMore: updateResult function is required'
);
}
queryReq(
{
...allOpts,
...fetchMoreOpts,
variables: { ...opts.variables, ...fetchMoreOpts.variables }
},
updateResult
);
}
};
};