muerwre.github.io/api/_content/query/2vMf3x3doM.json
muerwre c4cc70ced6 commit 7d311fd60e8e534e3b641d1179480b27b472d1e2
Author: Fedor Katurov <gotham48@gmail.com>
Date:   Thu Nov 3 16:04:38 2022 +0600

    fixed headers size
2022-11-03 10:07:05 +00:00

1 line
No EOL
41 KiB
JSON

{"_path":"/graphql/apollo-client-pagination","_dir":"graphql","_draft":false,"_partial":false,"_locale":"en","_empty":false,"title":"Apollo Client Pagination","description":"Say, we have gql response like this and we wan't to have pagination with it. Let's merge it as it specified in official documentation","excerpt":{"type":"root","children":[{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Say, we have "},{"type":"element","tag":"code-inline","props":{},"children":[{"type":"text","value":"gql"}]},{"type":"text","value":" response like this and we wan't to have pagination with it. Let's merge it as it specified in "},{"type":"element","tag":"a","props":{"href":"https://www.apollographql.com/docs/react/caching/cache-field-behavior/#the-merge-function","rel":["nofollow"]},"children":[{"type":"text","value":"official documentation"}]}]},{"type":"element","tag":"code","props":{"code":"query listItems(\n filter: Filter, \n sort: String,\n limit: Number,\n offset: Number,\n): ItemList!\n\ninput Filter {\n name: String!\n type: String!\n}\n\ntype ItemList {\n items: [Item!]!\n totalCount: Int!\n}\n","language":"graphql"},"children":[{"type":"element","tag":"pre","props":{},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"text","value":"query listItems(\n filter: Filter, \n sort: String,\n limit: Number,\n offset: Number,\n): ItemList!\n\ninput Filter {\n name: String!\n type: String!\n}\n\ntype ItemList {\n items: [Item!]!\n totalCount: Int!\n}\n"}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"We will setup "},{"type":"element","tag":"code-inline","props":{},"children":[{"type":"text","value":"ApolloClient"}]},{"type":"text","value":" with "},{"type":"element","tag":"code-inline","props":{},"children":[{"type":"text","value":"typePolicies"}]},{"type":"text","value":" to merge incoming data in cache:"}]},{"type":"element","tag":"code","props":{"code":"import { ApolloClient, InMemoryCache } from '@apollo/client';\n\nconst client = new ApolloClient({\n // ...\n cache: new InMemoryCache({ typePolicies }),\n // ...\n});\n\nexport const typePolicies: TypePolicies = {\n Query: {\n fields: {\n // query name\n listItems: {\n // apollo will serialize and use keyArgs as unique\n // identifier in cache for every query\n // consider choosing the right fields, \n // i.e. limit and offset won't work here\n keyArgs: [\n 'sort', // primitive type\n 'filter', ['name', 'type'] // nested fields of `filter`\n ],\n merge: mergeItemsWithTotalCount,\n },\n }\n}\n","language":"typescript"},"children":[{"type":"element","tag":"pre","props":{},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"text","value":"import { ApolloClient, InMemoryCache } from '@apollo/client';\n\nconst client = new ApolloClient({\n // ...\n cache: new InMemoryCache({ typePolicies }),\n // ...\n});\n\nexport const typePolicies: TypePolicies = {\n Query: {\n fields: {\n // query name\n listItems: {\n // apollo will serialize and use keyArgs as unique\n // identifier in cache for every query\n // consider choosing the right fields, \n // i.e. limit and offset won't work here\n keyArgs: [\n 'sort', // primitive type\n 'filter', ['name', 'type'] // nested fields of `filter`\n ],\n merge: mergeItemsWithTotalCount,\n },\n }\n}\n"}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"We will need merge function "},{"type":"element","tag":"code-inline","props":{},"children":[{"type":"text","value":"mergeItemsWithTotalCount"}]},{"type":"text","value":", which will join results of query and cached data for specific key:"}]},{"type":"element","tag":"code","props":{"code":"/** merges all sources with { items: unknown[], totalCount: number } */\nconst mergeItemsWithTotalCount = (existing, incoming, { args }) => {\n // no existing data\n if (!existing || !args?.offset || args.offset < existing.length) {\n return incoming || [];\n }\n\n // If hook was called multiple times\n if (existing?.items?.length && args?.offset < existing.items.length) {\n return existing || [];\n }\n\n // merge cache and incoming data\n const items = [...(existing?.items || []), ...(incoming?.items || [])];\n\n // apply latest result for totalCount\n const totalCount = incoming?.totalCount || existing?.totalCount;\n\n return {\n ...(incoming || existing || {}),\n items,\n totalCount,\n };\n };\n","language":"typescript"},"children":[{"type":"element","tag":"pre","props":{},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"text","value":"/** merges all sources with { items: unknown[], totalCount: number } */\nconst mergeItemsWithTotalCount = (existing, incoming, { args }) => {\n // no existing data\n if (!existing || !args?.offset || args.offset < existing.length) {\n return incoming || [];\n }\n\n // If hook was called multiple times\n if (existing?.items?.length && args?.offset < existing.items.length) {\n return existing || [];\n }\n\n // merge cache and incoming data\n const items = [...(existing?.items || []), ...(incoming?.items || [])];\n\n // apply latest result for totalCount\n const totalCount = incoming?.totalCount || existing?.totalCount;\n\n return {\n ...(incoming || existing || {}),\n items,\n totalCount,\n };\n };\n"}]}]}]}]},"body":{"type":"root","children":[{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Say, we have "},{"type":"element","tag":"code-inline","props":{},"children":[{"type":"text","value":"gql"}]},{"type":"text","value":" response like this and we wan't to have pagination with it. Let's merge it as it specified in "},{"type":"element","tag":"a","props":{"href":"https://www.apollographql.com/docs/react/caching/cache-field-behavior/#the-merge-function","rel":["nofollow"]},"children":[{"type":"text","value":"official documentation"}]}]},{"type":"element","tag":"code","props":{"code":"query listItems(\n filter: Filter, \n sort: String,\n limit: Number,\n offset: Number,\n): ItemList!\n\ninput Filter {\n name: String!\n type: String!\n}\n\ntype ItemList {\n items: [Item!]!\n totalCount: Int!\n}\n","language":"graphql"},"children":[{"type":"element","tag":"pre","props":{},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-b51767"},"children":[{"type":"text","value":"query"}]},{"type":"element","tag":"span","props":{"class":"ct-03a597"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-938f0a"},"children":[{"type":"text","value":"listItems"}]},{"type":"element","tag":"span","props":{"class":"ct-03a597"},"children":[{"type":"text","value":"("}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-c8742a"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-ec611b"},"children":[{"type":"text","value":"filter"}]},{"type":"element","tag":"span","props":{"class":"ct-c8742a"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"class":"ct-3a8412"},"children":[{"type":"text","value":"Filter"}]},{"type":"element","tag":"span","props":{"class":"ct-c8742a"},"children":[{"type":"text","value":", "}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-c8742a"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-ec611b"},"children":[{"type":"text","value":"sort"}]},{"type":"element","tag":"span","props":{"class":"ct-c8742a"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"class":"ct-3a8412"},"children":[{"type":"text","value":"String"}]},{"type":"element","tag":"span","props":{"class":"ct-c8742a"},"children":[{"type":"text","value":","}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-c8742a"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-ec611b"},"children":[{"type":"text","value":"limit"}]},{"type":"element","tag":"span","props":{"class":"ct-c8742a"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"class":"ct-3a8412"},"children":[{"type":"text","value":"Number"}]},{"type":"element","tag":"span","props":{"class":"ct-c8742a"},"children":[{"type":"text","value":","}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-c8742a"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-ec611b"},"children":[{"type":"text","value":"offset"}]},{"type":"element","tag":"span","props":{"class":"ct-c8742a"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"class":"ct-3a8412"},"children":[{"type":"text","value":"Number"}]},{"type":"element","tag":"span","props":{"class":"ct-c8742a"},"children":[{"type":"text","value":","}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-03a597"},"children":[{"type":"text","value":"): "}]},{"type":"element","tag":"span","props":{"class":"ct-938f0a"},"children":[{"type":"text","value":"ItemList"}]},{"type":"element","tag":"span","props":{"class":"ct-03a597"},"children":[{"type":"text","value":"!"}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-b51767"},"children":[{"type":"text","value":"input"}]},{"type":"element","tag":"span","props":{"class":"ct-03a597"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-e65a4c"},"children":[{"type":"text","value":"Filter"}]},{"type":"element","tag":"span","props":{"class":"ct-03a597"},"children":[{"type":"text","value":" {"}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-c8742a"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-ec611b"},"children":[{"type":"text","value":"name"}]},{"type":"element","tag":"span","props":{"class":"ct-c8742a"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"class":"ct-3a8412"},"children":[{"type":"text","value":"String"}]},{"type":"element","tag":"span","props":{"class":"ct-8bd8a4"},"children":[{"type":"text","value":"!"}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-c8742a"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-ec611b"},"children":[{"type":"text","value":"type"}]},{"type":"element","tag":"span","props":{"class":"ct-c8742a"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"class":"ct-3a8412"},"children":[{"type":"text","value":"String"}]},{"type":"element","tag":"span","props":{"class":"ct-8bd8a4"},"children":[{"type":"text","value":"!"}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-03a597"},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-b51767"},"children":[{"type":"text","value":"type"}]},{"type":"element","tag":"span","props":{"class":"ct-03a597"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-e65a4c"},"children":[{"type":"text","value":"ItemList"}]},{"type":"element","tag":"span","props":{"class":"ct-03a597"},"children":[{"type":"text","value":" {"}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-c8742a"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-ec611b"},"children":[{"type":"text","value":"items"}]},{"type":"element","tag":"span","props":{"class":"ct-c8742a"},"children":[{"type":"text","value":": ["}]},{"type":"element","tag":"span","props":{"class":"ct-3a8412"},"children":[{"type":"text","value":"Item"}]},{"type":"element","tag":"span","props":{"class":"ct-8bd8a4"},"children":[{"type":"text","value":"!"}]},{"type":"element","tag":"span","props":{"class":"ct-c8742a"},"children":[{"type":"text","value":"]"}]},{"type":"element","tag":"span","props":{"class":"ct-8bd8a4"},"children":[{"type":"text","value":"!"}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-c8742a"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-ec611b"},"children":[{"type":"text","value":"totalCount"}]},{"type":"element","tag":"span","props":{"class":"ct-c8742a"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"class":"ct-3a8412"},"children":[{"type":"text","value":"Int"}]},{"type":"element","tag":"span","props":{"class":"ct-8bd8a4"},"children":[{"type":"text","value":"!"}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-03a597"},"children":[{"type":"text","value":"}"}]}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"We will setup "},{"type":"element","tag":"code-inline","props":{},"children":[{"type":"text","value":"ApolloClient"}]},{"type":"text","value":" with "},{"type":"element","tag":"code-inline","props":{},"children":[{"type":"text","value":"typePolicies"}]},{"type":"text","value":" to merge incoming data in cache:"}]},{"type":"element","tag":"code","props":{"code":"import { ApolloClient, InMemoryCache } from '@apollo/client';\n\nconst client = new ApolloClient({\n // ...\n cache: new InMemoryCache({ typePolicies }),\n // ...\n});\n\nexport const typePolicies: TypePolicies = {\n Query: {\n fields: {\n // query name\n listItems: {\n // apollo will serialize and use keyArgs as unique\n // identifier in cache for every query\n // consider choosing the right fields, \n // i.e. limit and offset won't work here\n keyArgs: [\n 'sort', // primitive type\n 'filter', ['name', 'type'] // nested fields of `filter`\n ],\n merge: mergeItemsWithTotalCount,\n },\n }\n}\n","language":"typescript"},"children":[{"type":"element","tag":"pre","props":{},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-b51767"},"children":[{"type":"text","value":"import"}]},{"type":"element","tag":"span","props":{"class":"ct-03a597"},"children":[{"type":"text","value":" { "}]},{"type":"element","tag":"span","props":{"class":"ct-d98dbb"},"children":[{"type":"text","value":"ApolloClient"}]},{"type":"element","tag":"span","props":{"class":"ct-03a597"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"class":"ct-d98dbb"},"children":[{"type":"text","value":"InMemoryCache"}]},{"type":"element","tag":"span","props":{"class":"ct-03a597"},"children":[{"type":"text","value":" } "}]},{"type":"element","tag":"span","props":{"class":"ct-b51767"},"children":[{"type":"text","value":"from"}]},{"type":"element","tag":"span","props":{"class":"ct-03a597"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-24c886"},"children":[{"type":"text","value":"'@apollo/client'"}]},{"type":"element","tag":"span","props":{"class":"ct-03a597"},"children":[{"type":"text","value":";"}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-6b9c4d"},"children":[{"type":"text","value":"const"}]},{"type":"element","tag":"span","props":{"class":"ct-03a597"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-bce347"},"children":[{"type":"text","value":"client"}]},{"type":"element","tag":"span","props":{"class":"ct-03a597"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-b51767"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"class":"ct-03a597"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-b51767"},"children":[{"type":"text","value":"new"}]},{"type":"element","tag":"span","props":{"class":"ct-03a597"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-938f0a"},"children":[{"type":"text","value":"ApolloClient"}]},{"type":"element","tag":"span","props":{"class":"ct-03a597"},"children":[{"type":"text","value":"({"}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-03a597"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-84bc7a"},"children":[{"type":"text","value":"// ..."}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-03a597"},"children":[{"type":"text","value":" cache: "}]},{"type":"element","tag":"span","props":{"class":"ct-b51767"},"children":[{"type":"text","value":"new"}]},{"type":"element","tag":"span","props":{"class":"ct-03a597"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-938f0a"},"children":[{"type":"text","value":"InMemoryCache"}]},{"type":"element","tag":"span","props":{"class":"ct-03a597"},"children":[{"type":"text","value":"({ "}]},{"type":"element","tag":"span","props":{"class":"ct-d98dbb"},"children":[{"type":"text","value":"typePolicies"}]},{"type":"element","tag":"span","props":{"class":"ct-03a597"},"children":[{"type":"text","value":" }),"}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-03a597"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-84bc7a"},"children":[{"type":"text","value":"// ..."}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-03a597"},"children":[{"type":"text","value":"});"}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-b51767"},"children":[{"type":"text","value":"export"}]},{"type":"element","tag":"span","props":{"class":"ct-03a597"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-6b9c4d"},"children":[{"type":"text","value":"const"}]},{"type":"element","tag":"span","props":{"class":"ct-03a597"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-bce347"},"children":[{"type":"text","value":"typePolicies"}]},{"type":"element","tag":"span","props":{"class":"ct-b51767"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"class":"ct-03a597"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-ca850d"},"children":[{"type":"text","value":"TypePolicies"}]},{"type":"element","tag":"span","props":{"class":"ct-03a597"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-b51767"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"class":"ct-03a597"},"children":[{"type":"text","value":" {"}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-03a597"},"children":[{"type":"text","value":" Query: {"}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-03a597"},"children":[{"type":"text","value":" fields: {"}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-03a597"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-84bc7a"},"children":[{"type":"text","value":"// query name"}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-03a597"},"children":[{"type":"text","value":" listItems: {"}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-03a597"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-84bc7a"},"children":[{"type":"text","value":"// apollo will serialize and use keyArgs as unique"}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-03a597"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-84bc7a"},"children":[{"type":"text","value":"// identifier in cache for every query"}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-03a597"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-84bc7a"},"children":[{"type":"text","value":"// consider choosing the right fields, "}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-03a597"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-84bc7a"},"children":[{"type":"text","value":"// i.e. limit and offset won't work here"}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-03a597"},"children":[{"type":"text","value":" keyArgs: ["}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-03a597"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-24c886"},"children":[{"type":"text","value":"'sort'"}]},{"type":"element","tag":"span","props":{"class":"ct-03a597"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"class":"ct-84bc7a"},"children":[{"type":"text","value":"// primitive type"}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-03a597"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-24c886"},"children":[{"type":"text","value":"'filter'"}]},{"type":"element","tag":"span","props":{"class":"ct-03a597"},"children":[{"type":"text","value":", ["}]},{"type":"element","tag":"span","props":{"class":"ct-24c886"},"children":[{"type":"text","value":"'name'"}]},{"type":"element","tag":"span","props":{"class":"ct-03a597"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"class":"ct-24c886"},"children":[{"type":"text","value":"'type'"}]},{"type":"element","tag":"span","props":{"class":"ct-03a597"},"children":[{"type":"text","value":"] "}]},{"type":"element","tag":"span","props":{"class":"ct-84bc7a"},"children":[{"type":"text","value":"// nested fields of `filter`"}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-03a597"},"children":[{"type":"text","value":" ],"}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-03a597"},"children":[{"type":"text","value":" merge: "}]},{"type":"element","tag":"span","props":{"class":"ct-d98dbb"},"children":[{"type":"text","value":"mergeItemsWithTotalCount"}]},{"type":"element","tag":"span","props":{"class":"ct-03a597"},"children":[{"type":"text","value":","}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-03a597"},"children":[{"type":"text","value":" },"}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-03a597"},"children":[{"type":"text","value":" }"}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-03a597"},"children":[{"type":"text","value":"}"}]}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"We will need merge function "},{"type":"element","tag":"code-inline","props":{},"children":[{"type":"text","value":"mergeItemsWithTotalCount"}]},{"type":"text","value":", which will join results of query and cached data for specific key:"}]},{"type":"element","tag":"code","props":{"code":"/** merges all sources with { items: unknown[], totalCount: number } */\nconst mergeItemsWithTotalCount = (existing, incoming, { args }) => {\n // no existing data\n if (!existing || !args?.offset || args.offset < existing.length) {\n return incoming || [];\n }\n\n // If hook was called multiple times\n if (existing?.items?.length && args?.offset < existing.items.length) {\n return existing || [];\n }\n\n // merge cache and incoming data\n const items = [...(existing?.items || []), ...(incoming?.items || [])];\n\n // apply latest result for totalCount\n const totalCount = incoming?.totalCount || existing?.totalCount;\n\n return {\n ...(incoming || existing || {}),\n items,\n totalCount,\n };\n };\n","language":"typescript"},"children":[{"type":"element","tag":"pre","props":{},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-84bc7a"},"children":[{"type":"text","value":"/** merges all sources with { items: unknown[], totalCount: number } */"}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-8a041d"},"children":[{"type":"text","value":"const"}]},{"type":"element","tag":"span","props":{"class":"ct-c8742a"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-c2c491"},"children":[{"type":"text","value":"mergeItemsWithTotalCount"}]},{"type":"element","tag":"span","props":{"class":"ct-c8742a"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-8bd8a4"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"class":"ct-c8742a"},"children":[{"type":"text","value":" ("}]},{"type":"element","tag":"span","props":{"class":"ct-ec611b"},"children":[{"type":"text","value":"existing"}]},{"type":"element","tag":"span","props":{"class":"ct-c8742a"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"class":"ct-ec611b"},"children":[{"type":"text","value":"incoming"}]},{"type":"element","tag":"span","props":{"class":"ct-c8742a"},"children":[{"type":"text","value":", { "}]},{"type":"element","tag":"span","props":{"class":"ct-ec611b"},"children":[{"type":"text","value":"args"}]},{"type":"element","tag":"span","props":{"class":"ct-c8742a"},"children":[{"type":"text","value":" }) "}]},{"type":"element","tag":"span","props":{"class":"ct-8a041d"},"children":[{"type":"text","value":"=>"}]},{"type":"element","tag":"span","props":{"class":"ct-c8742a"},"children":[{"type":"text","value":" {"}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-03a597"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-84bc7a"},"children":[{"type":"text","value":"// no existing data"}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-03a597"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-b51767"},"children":[{"type":"text","value":"if"}]},{"type":"element","tag":"span","props":{"class":"ct-03a597"},"children":[{"type":"text","value":" ("}]},{"type":"element","tag":"span","props":{"class":"ct-b51767"},"children":[{"type":"text","value":"!"}]},{"type":"element","tag":"span","props":{"class":"ct-d98dbb"},"children":[{"type":"text","value":"existing"}]},{"type":"element","tag":"span","props":{"class":"ct-03a597"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-b51767"},"children":[{"type":"text","value":"||"}]},{"type":"element","tag":"span","props":{"class":"ct-03a597"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-b51767"},"children":[{"type":"text","value":"!"}]},{"type":"element","tag":"span","props":{"class":"ct-d98dbb"},"children":[{"type":"text","value":"args"}]},{"type":"element","tag":"span","props":{"class":"ct-03a597"},"children":[{"type":"text","value":"?."}]},{"type":"element","tag":"span","props":{"class":"ct-d98dbb"},"children":[{"type":"text","value":"offset"}]},{"type":"element","tag":"span","props":{"class":"ct-03a597"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-b51767"},"children":[{"type":"text","value":"||"}]},{"type":"element","tag":"span","props":{"class":"ct-03a597"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-d98dbb"},"children":[{"type":"text","value":"args"}]},{"type":"element","tag":"span","props":{"class":"ct-03a597"},"children":[{"type":"text","value":"."}]},{"type":"element","tag":"span","props":{"class":"ct-d98dbb"},"children":[{"type":"text","value":"offset"}]},{"type":"element","tag":"span","props":{"class":"ct-03a597"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-b51767"},"children":[{"type":"text","value":"<"}]},{"type":"element","tag":"span","props":{"class":"ct-03a597"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-d98dbb"},"children":[{"type":"text","value":"existing"}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-03a597"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-b51767"},"children":[{"type":"text","value":"return"}]},{"type":"element","tag":"span","props":{"class":"ct-03a597"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-d98dbb"},"children":[{"type":"text","value":"incoming"}]},{"type":"element","tag":"span","props":{"class":"ct-03a597"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-b51767"},"children":[{"type":"text","value":"||"}]},{"type":"element","tag":"span","props":{"class":"ct-03a597"},"children":[{"type":"text","value":" [];"}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-03a597"},"children":[{"type":"text","value":" }"}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-03a597"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-84bc7a"},"children":[{"type":"text","value":"// If hook was called multiple times"}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-03a597"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-b51767"},"children":[{"type":"text","value":"if"}]},{"type":"element","tag":"span","props":{"class":"ct-03a597"},"children":[{"type":"text","value":" ("}]},{"type":"element","tag":"span","props":{"class":"ct-d98dbb"},"children":[{"type":"text","value":"existing"}]},{"type":"element","tag":"span","props":{"class":"ct-03a597"},"children":[{"type":"text","value":"?."}]},{"type":"element","tag":"span","props":{"class":"ct-d98dbb"},"children":[{"type":"text","value":"items"}]},{"type":"element","tag":"span","props":{"class":"ct-03a597"},"children":[{"type":"text","value":"?."}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-03a597"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-b51767"},"children":[{"type":"text","value":"return"}]},{"type":"element","tag":"span","props":{"class":"ct-03a597"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-d98dbb"},"children":[{"type":"text","value":"existing"}]},{"type":"element","tag":"span","props":{"class":"ct-03a597"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-b51767"},"children":[{"type":"text","value":"||"}]},{"type":"element","tag":"span","props":{"class":"ct-03a597"},"children":[{"type":"text","value":" [];"}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-03a597"},"children":[{"type":"text","value":" }"}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-03a597"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-84bc7a"},"children":[{"type":"text","value":"// merge cache and incoming data"}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-03a597"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-6b9c4d"},"children":[{"type":"text","value":"const"}]},{"type":"element","tag":"span","props":{"class":"ct-03a597"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-bce347"},"children":[{"type":"text","value":"items"}]},{"type":"element","tag":"span","props":{"class":"ct-03a597"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-b51767"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"class":"ct-03a597"},"children":[{"type":"text","value":" ["}]},{"type":"element","tag":"span","props":{"class":"ct-b51767"},"children":[{"type":"text","value":"..."}]},{"type":"element","tag":"span","props":{"class":"ct-03a597"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"class":"ct-d98dbb"},"children":[{"type":"text","value":"existing"}]},{"type":"element","tag":"span","props":{"class":"ct-03a597"},"children":[{"type":"text","value":"?."}]},{"type":"element","tag":"span","props":{"class":"ct-d98dbb"},"children":[{"type":"text","value":"items"}]},{"type":"element","tag":"span","props":{"class":"ct-03a597"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-b51767"},"children":[{"type":"text","value":"||"}]},{"type":"element","tag":"span","props":{"class":"ct-03a597"},"children":[{"type":"text","value":" "}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-03a597"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-84bc7a"},"children":[{"type":"text","value":"// apply latest result for totalCount"}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-03a597"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-6b9c4d"},"children":[{"type":"text","value":"const"}]},{"type":"element","tag":"span","props":{"class":"ct-03a597"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-bce347"},"children":[{"type":"text","value":"totalCount"}]},{"type":"element","tag":"span","props":{"class":"ct-03a597"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-b51767"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"class":"ct-03a597"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-d98dbb"},"children":[{"type":"text","value":"incoming"}]},{"type":"element","tag":"span","props":{"class":"ct-03a597"},"children":[{"type":"text","value":"?."}]},{"type":"element","tag":"span","props":{"class":"ct-d98dbb"},"children":[{"type":"text","value":"totalCount"}]},{"type":"element","tag":"span","props":{"class":"ct-03a597"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-b51767"},"children":[{"type":"text","value":"||"}]},{"type":"element","tag":"span","props":{"class":"ct-03a597"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-d98dbb"},"children":[{"type":"text","value":"existing"}]},{"type":"element","tag":"span","props":{"class":"ct-03a597"},"children":[{"type":"text","value":"?."}]},{"type":"element","tag":"span","props":{"class":"ct-d98dbb"},"children":[{"type":"text","value":"totalCount"}]},{"type":"element","tag":"span","props":{"class":"ct-03a597"},"children":[{"type":"text","value":";"}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-03a597"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-b51767"},"children":[{"type":"text","value":"return"}]},{"type":"element","tag":"span","props":{"class":"ct-03a597"},"children":[{"type":"text","value":" {"}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-03a597"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-b51767"},"children":[{"type":"text","value":"..."}]},{"type":"element","tag":"span","props":{"class":"ct-03a597"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"class":"ct-d98dbb"},"children":[{"type":"text","value":"incoming"}]},{"type":"element","tag":"span","props":{"class":"ct-03a597"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-b51767"},"children":[{"type":"text","value":"||"}]},{"type":"element","tag":"span","props":{"class":"ct-03a597"},"children":[{"type":"text","value":" "}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-03a597"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-d98dbb"},"children":[{"type":"text","value":"items"}]},{"type":"element","tag":"span","props":{"class":"ct-03a597"},"children":[{"type":"text","value":","}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-03a597"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-d98dbb"},"children":[{"type":"text","value":"totalCount"}]},{"type":"element","tag":"span","props":{"class":"ct-03a597"},"children":[{"type":"text","value":","}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-03a597"},"children":[{"type":"text","value":" };"}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-03a597"},"children":[{"type":"text","value":" };"}]}]}]}]}]},{"type":"element","tag":"style","children":[{"type":"text","value":".ct-c2c491{color:#D2A8FF}.ct-8a041d{color:#FF7B72}.ct-ca850d{color:#FFA657}.ct-84bc7a{color:#8B949E}.ct-bce347{color:#79C0FF}.ct-6b9c4d{color:#FF7B72}.ct-24c886{color:#A5D6FF}.ct-d98dbb{color:#C9D1D9}.ct-8bd8a4{color:#FF7B72}.ct-e65a4c{color:#79C0FF}.ct-3a8412{color:#79C0FF}.ct-ec611b{color:#FFA657}.ct-c8742a{color:#C9D1D9}.ct-938f0a{color:#D2A8FF}.ct-03a597{color:#C9D1D9}.ct-b51767{color:#FF7B72}.light .ct-b51767{color:#859900}.light .ct-03a597{color:#657B83}.light .ct-938f0a{color:#268BD2}.light .ct-c8742a{color:#657B83}.light .ct-ec611b{color:#657B83}.light .ct-3a8412{color:#859900}.light .ct-e65a4c{color:#859900}.light .ct-8bd8a4{color:#859900}.light .ct-d98dbb{color:#268BD2}.light .ct-24c886{color:#2AA198}.light .ct-6b9c4d{color:#073642}.light .ct-bce347{color:#268BD2}.light .ct-84bc7a{color:#93A1A1}.light .ct-ca850d{color:#268BD2}.light .ct-8a041d{color:#073642}.light .ct-c2c491{color:#268BD2}"}]}],"toc":{"title":"","searchDepth":2,"depth":2,"links":[]}},"_type":"markdown","_id":"content:GraphQL:Apollo Client pagination.md","_source":"content","_file":"GraphQL/Apollo Client pagination.md","_extension":"md"}