muerwre.github.io/docs/api/_content/query/2vMf3x3doM.json
2024-03-06 11:16:30 +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-d0d74c"},"children":[{"type":"text","value":"query"}]},{"type":"element","tag":"span","props":{"class":"ct-b4b4ef"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-becc01"},"children":[{"type":"text","value":"listItems"}]},{"type":"element","tag":"span","props":{"class":"ct-b4b4ef"},"children":[{"type":"text","value":"("}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-b37a0d"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-8a3271"},"children":[{"type":"text","value":"filter"}]},{"type":"element","tag":"span","props":{"class":"ct-b37a0d"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"class":"ct-fda88d"},"children":[{"type":"text","value":"Filter"}]},{"type":"element","tag":"span","props":{"class":"ct-b37a0d"},"children":[{"type":"text","value":", "}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-b37a0d"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-8a3271"},"children":[{"type":"text","value":"sort"}]},{"type":"element","tag":"span","props":{"class":"ct-b37a0d"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"class":"ct-fda88d"},"children":[{"type":"text","value":"String"}]},{"type":"element","tag":"span","props":{"class":"ct-b37a0d"},"children":[{"type":"text","value":","}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-b37a0d"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-8a3271"},"children":[{"type":"text","value":"limit"}]},{"type":"element","tag":"span","props":{"class":"ct-b37a0d"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"class":"ct-fda88d"},"children":[{"type":"text","value":"Number"}]},{"type":"element","tag":"span","props":{"class":"ct-b37a0d"},"children":[{"type":"text","value":","}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-b37a0d"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-8a3271"},"children":[{"type":"text","value":"offset"}]},{"type":"element","tag":"span","props":{"class":"ct-b37a0d"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"class":"ct-fda88d"},"children":[{"type":"text","value":"Number"}]},{"type":"element","tag":"span","props":{"class":"ct-b37a0d"},"children":[{"type":"text","value":","}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-b4b4ef"},"children":[{"type":"text","value":"): "}]},{"type":"element","tag":"span","props":{"class":"ct-becc01"},"children":[{"type":"text","value":"ItemList"}]},{"type":"element","tag":"span","props":{"class":"ct-b4b4ef"},"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-d0d74c"},"children":[{"type":"text","value":"input"}]},{"type":"element","tag":"span","props":{"class":"ct-b4b4ef"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-ab8cdd"},"children":[{"type":"text","value":"Filter"}]},{"type":"element","tag":"span","props":{"class":"ct-b4b4ef"},"children":[{"type":"text","value":" {"}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-b37a0d"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-8a3271"},"children":[{"type":"text","value":"name"}]},{"type":"element","tag":"span","props":{"class":"ct-b37a0d"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"class":"ct-fda88d"},"children":[{"type":"text","value":"String"}]},{"type":"element","tag":"span","props":{"class":"ct-f01ad5"},"children":[{"type":"text","value":"!"}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-b37a0d"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-8a3271"},"children":[{"type":"text","value":"type"}]},{"type":"element","tag":"span","props":{"class":"ct-b37a0d"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"class":"ct-fda88d"},"children":[{"type":"text","value":"String"}]},{"type":"element","tag":"span","props":{"class":"ct-f01ad5"},"children":[{"type":"text","value":"!"}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-b4b4ef"},"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-d0d74c"},"children":[{"type":"text","value":"type"}]},{"type":"element","tag":"span","props":{"class":"ct-b4b4ef"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-ab8cdd"},"children":[{"type":"text","value":"ItemList"}]},{"type":"element","tag":"span","props":{"class":"ct-b4b4ef"},"children":[{"type":"text","value":" {"}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-b37a0d"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-8a3271"},"children":[{"type":"text","value":"items"}]},{"type":"element","tag":"span","props":{"class":"ct-b37a0d"},"children":[{"type":"text","value":": ["}]},{"type":"element","tag":"span","props":{"class":"ct-fda88d"},"children":[{"type":"text","value":"Item"}]},{"type":"element","tag":"span","props":{"class":"ct-f01ad5"},"children":[{"type":"text","value":"!"}]},{"type":"element","tag":"span","props":{"class":"ct-b37a0d"},"children":[{"type":"text","value":"]"}]},{"type":"element","tag":"span","props":{"class":"ct-f01ad5"},"children":[{"type":"text","value":"!"}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-b37a0d"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-8a3271"},"children":[{"type":"text","value":"totalCount"}]},{"type":"element","tag":"span","props":{"class":"ct-b37a0d"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"class":"ct-fda88d"},"children":[{"type":"text","value":"Int"}]},{"type":"element","tag":"span","props":{"class":"ct-f01ad5"},"children":[{"type":"text","value":"!"}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-b4b4ef"},"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-d0d74c"},"children":[{"type":"text","value":"import"}]},{"type":"element","tag":"span","props":{"class":"ct-b4b4ef"},"children":[{"type":"text","value":" { "}]},{"type":"element","tag":"span","props":{"class":"ct-a2898b"},"children":[{"type":"text","value":"ApolloClient"}]},{"type":"element","tag":"span","props":{"class":"ct-b4b4ef"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"class":"ct-a2898b"},"children":[{"type":"text","value":"InMemoryCache"}]},{"type":"element","tag":"span","props":{"class":"ct-b4b4ef"},"children":[{"type":"text","value":" } "}]},{"type":"element","tag":"span","props":{"class":"ct-d0d74c"},"children":[{"type":"text","value":"from"}]},{"type":"element","tag":"span","props":{"class":"ct-b4b4ef"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-b376f1"},"children":[{"type":"text","value":"'@apollo/client'"}]},{"type":"element","tag":"span","props":{"class":"ct-b4b4ef"},"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-586d7c"},"children":[{"type":"text","value":"const"}]},{"type":"element","tag":"span","props":{"class":"ct-b4b4ef"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-103aed"},"children":[{"type":"text","value":"client"}]},{"type":"element","tag":"span","props":{"class":"ct-b4b4ef"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-d0d74c"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"class":"ct-b4b4ef"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-d0d74c"},"children":[{"type":"text","value":"new"}]},{"type":"element","tag":"span","props":{"class":"ct-b4b4ef"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-becc01"},"children":[{"type":"text","value":"ApolloClient"}]},{"type":"element","tag":"span","props":{"class":"ct-b4b4ef"},"children":[{"type":"text","value":"({"}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-b4b4ef"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-c250e1"},"children":[{"type":"text","value":"// ..."}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-b4b4ef"},"children":[{"type":"text","value":" cache: "}]},{"type":"element","tag":"span","props":{"class":"ct-d0d74c"},"children":[{"type":"text","value":"new"}]},{"type":"element","tag":"span","props":{"class":"ct-b4b4ef"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-becc01"},"children":[{"type":"text","value":"InMemoryCache"}]},{"type":"element","tag":"span","props":{"class":"ct-b4b4ef"},"children":[{"type":"text","value":"({ "}]},{"type":"element","tag":"span","props":{"class":"ct-a2898b"},"children":[{"type":"text","value":"typePolicies"}]},{"type":"element","tag":"span","props":{"class":"ct-b4b4ef"},"children":[{"type":"text","value":" }),"}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-b4b4ef"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-c250e1"},"children":[{"type":"text","value":"// ..."}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-b4b4ef"},"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-d0d74c"},"children":[{"type":"text","value":"export"}]},{"type":"element","tag":"span","props":{"class":"ct-b4b4ef"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-586d7c"},"children":[{"type":"text","value":"const"}]},{"type":"element","tag":"span","props":{"class":"ct-b4b4ef"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-103aed"},"children":[{"type":"text","value":"typePolicies"}]},{"type":"element","tag":"span","props":{"class":"ct-d0d74c"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"class":"ct-b4b4ef"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-7c6dc1"},"children":[{"type":"text","value":"TypePolicies"}]},{"type":"element","tag":"span","props":{"class":"ct-b4b4ef"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-d0d74c"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"class":"ct-b4b4ef"},"children":[{"type":"text","value":" {"}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-b4b4ef"},"children":[{"type":"text","value":" Query: {"}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-b4b4ef"},"children":[{"type":"text","value":" fields: {"}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-b4b4ef"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-c250e1"},"children":[{"type":"text","value":"// query name"}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-b4b4ef"},"children":[{"type":"text","value":" listItems: {"}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-b4b4ef"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-c250e1"},"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-b4b4ef"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-c250e1"},"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-b4b4ef"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-c250e1"},"children":[{"type":"text","value":"// consider choosing the right fields, "}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-b4b4ef"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-c250e1"},"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-b4b4ef"},"children":[{"type":"text","value":" keyArgs: ["}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-b4b4ef"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-b376f1"},"children":[{"type":"text","value":"'sort'"}]},{"type":"element","tag":"span","props":{"class":"ct-b4b4ef"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"class":"ct-c250e1"},"children":[{"type":"text","value":"// primitive type"}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-b4b4ef"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-b376f1"},"children":[{"type":"text","value":"'filter'"}]},{"type":"element","tag":"span","props":{"class":"ct-b4b4ef"},"children":[{"type":"text","value":", ["}]},{"type":"element","tag":"span","props":{"class":"ct-b376f1"},"children":[{"type":"text","value":"'name'"}]},{"type":"element","tag":"span","props":{"class":"ct-b4b4ef"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"class":"ct-b376f1"},"children":[{"type":"text","value":"'type'"}]},{"type":"element","tag":"span","props":{"class":"ct-b4b4ef"},"children":[{"type":"text","value":"] "}]},{"type":"element","tag":"span","props":{"class":"ct-c250e1"},"children":[{"type":"text","value":"// nested fields of `filter`"}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-b4b4ef"},"children":[{"type":"text","value":" ],"}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-b4b4ef"},"children":[{"type":"text","value":" merge: "}]},{"type":"element","tag":"span","props":{"class":"ct-a2898b"},"children":[{"type":"text","value":"mergeItemsWithTotalCount"}]},{"type":"element","tag":"span","props":{"class":"ct-b4b4ef"},"children":[{"type":"text","value":","}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-b4b4ef"},"children":[{"type":"text","value":" },"}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-b4b4ef"},"children":[{"type":"text","value":" }"}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-b4b4ef"},"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-c250e1"},"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-492565"},"children":[{"type":"text","value":"const"}]},{"type":"element","tag":"span","props":{"class":"ct-b37a0d"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-e2a3ed"},"children":[{"type":"text","value":"mergeItemsWithTotalCount"}]},{"type":"element","tag":"span","props":{"class":"ct-b37a0d"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-f01ad5"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"class":"ct-b37a0d"},"children":[{"type":"text","value":" ("}]},{"type":"element","tag":"span","props":{"class":"ct-8a3271"},"children":[{"type":"text","value":"existing"}]},{"type":"element","tag":"span","props":{"class":"ct-b37a0d"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"class":"ct-8a3271"},"children":[{"type":"text","value":"incoming"}]},{"type":"element","tag":"span","props":{"class":"ct-b37a0d"},"children":[{"type":"text","value":", { "}]},{"type":"element","tag":"span","props":{"class":"ct-8a3271"},"children":[{"type":"text","value":"args"}]},{"type":"element","tag":"span","props":{"class":"ct-b37a0d"},"children":[{"type":"text","value":" }) "}]},{"type":"element","tag":"span","props":{"class":"ct-492565"},"children":[{"type":"text","value":"=>"}]},{"type":"element","tag":"span","props":{"class":"ct-b37a0d"},"children":[{"type":"text","value":" {"}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-b4b4ef"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-c250e1"},"children":[{"type":"text","value":"// no existing data"}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-b4b4ef"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-d0d74c"},"children":[{"type":"text","value":"if"}]},{"type":"element","tag":"span","props":{"class":"ct-b4b4ef"},"children":[{"type":"text","value":" ("}]},{"type":"element","tag":"span","props":{"class":"ct-d0d74c"},"children":[{"type":"text","value":"!"}]},{"type":"element","tag":"span","props":{"class":"ct-a2898b"},"children":[{"type":"text","value":"existing"}]},{"type":"element","tag":"span","props":{"class":"ct-b4b4ef"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-d0d74c"},"children":[{"type":"text","value":"||"}]},{"type":"element","tag":"span","props":{"class":"ct-b4b4ef"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-d0d74c"},"children":[{"type":"text","value":"!"}]},{"type":"element","tag":"span","props":{"class":"ct-a2898b"},"children":[{"type":"text","value":"args"}]},{"type":"element","tag":"span","props":{"class":"ct-b4b4ef"},"children":[{"type":"text","value":"?."}]},{"type":"element","tag":"span","props":{"class":"ct-a2898b"},"children":[{"type":"text","value":"offset"}]},{"type":"element","tag":"span","props":{"class":"ct-b4b4ef"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-d0d74c"},"children":[{"type":"text","value":"||"}]},{"type":"element","tag":"span","props":{"class":"ct-b4b4ef"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-a2898b"},"children":[{"type":"text","value":"args"}]},{"type":"element","tag":"span","props":{"class":"ct-b4b4ef"},"children":[{"type":"text","value":"."}]},{"type":"element","tag":"span","props":{"class":"ct-a2898b"},"children":[{"type":"text","value":"offset"}]},{"type":"element","tag":"span","props":{"class":"ct-b4b4ef"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-d0d74c"},"children":[{"type":"text","value":"<"}]},{"type":"element","tag":"span","props":{"class":"ct-b4b4ef"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-a2898b"},"children":[{"type":"text","value":"existing"}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-b4b4ef"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-d0d74c"},"children":[{"type":"text","value":"return"}]},{"type":"element","tag":"span","props":{"class":"ct-b4b4ef"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-a2898b"},"children":[{"type":"text","value":"incoming"}]},{"type":"element","tag":"span","props":{"class":"ct-b4b4ef"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-d0d74c"},"children":[{"type":"text","value":"||"}]},{"type":"element","tag":"span","props":{"class":"ct-b4b4ef"},"children":[{"type":"text","value":" [];"}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-b4b4ef"},"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-b4b4ef"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-c250e1"},"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-b4b4ef"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-d0d74c"},"children":[{"type":"text","value":"if"}]},{"type":"element","tag":"span","props":{"class":"ct-b4b4ef"},"children":[{"type":"text","value":" ("}]},{"type":"element","tag":"span","props":{"class":"ct-a2898b"},"children":[{"type":"text","value":"existing"}]},{"type":"element","tag":"span","props":{"class":"ct-b4b4ef"},"children":[{"type":"text","value":"?."}]},{"type":"element","tag":"span","props":{"class":"ct-a2898b"},"children":[{"type":"text","value":"items"}]},{"type":"element","tag":"span","props":{"class":"ct-b4b4ef"},"children":[{"type":"text","value":"?."}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-b4b4ef"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-d0d74c"},"children":[{"type":"text","value":"return"}]},{"type":"element","tag":"span","props":{"class":"ct-b4b4ef"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-a2898b"},"children":[{"type":"text","value":"existing"}]},{"type":"element","tag":"span","props":{"class":"ct-b4b4ef"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-d0d74c"},"children":[{"type":"text","value":"||"}]},{"type":"element","tag":"span","props":{"class":"ct-b4b4ef"},"children":[{"type":"text","value":" [];"}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-b4b4ef"},"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-b4b4ef"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-c250e1"},"children":[{"type":"text","value":"// merge cache and incoming data"}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-b4b4ef"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-586d7c"},"children":[{"type":"text","value":"const"}]},{"type":"element","tag":"span","props":{"class":"ct-b4b4ef"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-103aed"},"children":[{"type":"text","value":"items"}]},{"type":"element","tag":"span","props":{"class":"ct-b4b4ef"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-d0d74c"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"class":"ct-b4b4ef"},"children":[{"type":"text","value":" ["}]},{"type":"element","tag":"span","props":{"class":"ct-d0d74c"},"children":[{"type":"text","value":"..."}]},{"type":"element","tag":"span","props":{"class":"ct-b4b4ef"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"class":"ct-a2898b"},"children":[{"type":"text","value":"existing"}]},{"type":"element","tag":"span","props":{"class":"ct-b4b4ef"},"children":[{"type":"text","value":"?."}]},{"type":"element","tag":"span","props":{"class":"ct-a2898b"},"children":[{"type":"text","value":"items"}]},{"type":"element","tag":"span","props":{"class":"ct-b4b4ef"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-d0d74c"},"children":[{"type":"text","value":"||"}]},{"type":"element","tag":"span","props":{"class":"ct-b4b4ef"},"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-b4b4ef"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-c250e1"},"children":[{"type":"text","value":"// apply latest result for totalCount"}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-b4b4ef"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-586d7c"},"children":[{"type":"text","value":"const"}]},{"type":"element","tag":"span","props":{"class":"ct-b4b4ef"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-103aed"},"children":[{"type":"text","value":"totalCount"}]},{"type":"element","tag":"span","props":{"class":"ct-b4b4ef"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-d0d74c"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"class":"ct-b4b4ef"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-a2898b"},"children":[{"type":"text","value":"incoming"}]},{"type":"element","tag":"span","props":{"class":"ct-b4b4ef"},"children":[{"type":"text","value":"?."}]},{"type":"element","tag":"span","props":{"class":"ct-a2898b"},"children":[{"type":"text","value":"totalCount"}]},{"type":"element","tag":"span","props":{"class":"ct-b4b4ef"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-d0d74c"},"children":[{"type":"text","value":"||"}]},{"type":"element","tag":"span","props":{"class":"ct-b4b4ef"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-a2898b"},"children":[{"type":"text","value":"existing"}]},{"type":"element","tag":"span","props":{"class":"ct-b4b4ef"},"children":[{"type":"text","value":"?."}]},{"type":"element","tag":"span","props":{"class":"ct-a2898b"},"children":[{"type":"text","value":"totalCount"}]},{"type":"element","tag":"span","props":{"class":"ct-b4b4ef"},"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-b4b4ef"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-d0d74c"},"children":[{"type":"text","value":"return"}]},{"type":"element","tag":"span","props":{"class":"ct-b4b4ef"},"children":[{"type":"text","value":" {"}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-b4b4ef"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-d0d74c"},"children":[{"type":"text","value":"..."}]},{"type":"element","tag":"span","props":{"class":"ct-b4b4ef"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"class":"ct-a2898b"},"children":[{"type":"text","value":"incoming"}]},{"type":"element","tag":"span","props":{"class":"ct-b4b4ef"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-d0d74c"},"children":[{"type":"text","value":"||"}]},{"type":"element","tag":"span","props":{"class":"ct-b4b4ef"},"children":[{"type":"text","value":" "}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-b4b4ef"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-a2898b"},"children":[{"type":"text","value":"items"}]},{"type":"element","tag":"span","props":{"class":"ct-b4b4ef"},"children":[{"type":"text","value":","}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-b4b4ef"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-a2898b"},"children":[{"type":"text","value":"totalCount"}]},{"type":"element","tag":"span","props":{"class":"ct-b4b4ef"},"children":[{"type":"text","value":","}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-b4b4ef"},"children":[{"type":"text","value":" };"}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-b4b4ef"},"children":[{"type":"text","value":" };"}]}]}]}]}]},{"type":"element","tag":"style","children":[{"type":"text","value":".ct-e2a3ed{color:#D2A8FF}.ct-492565{color:#FF7B72}.ct-7c6dc1{color:#FFA657}.ct-c250e1{color:#8B949E}.ct-103aed{color:#79C0FF}.ct-586d7c{color:#FF7B72}.ct-b376f1{color:#A5D6FF}.ct-a2898b{color:#C9D1D9}.ct-f01ad5{color:#FF7B72}.ct-ab8cdd{color:#79C0FF}.ct-fda88d{color:#79C0FF}.ct-8a3271{color:#FFA657}.ct-b37a0d{color:#C9D1D9}.ct-becc01{color:#D2A8FF}.ct-b4b4ef{color:#C9D1D9}.ct-d0d74c{color:#FF7B72}.light .ct-d0d74c{color:#859900}.light .ct-b4b4ef{color:#657B83}.light .ct-becc01{color:#268BD2}.light .ct-b37a0d{color:#657B83}.light .ct-8a3271{color:#657B83}.light .ct-fda88d{color:#859900}.light .ct-ab8cdd{color:#859900}.light .ct-f01ad5{color:#859900}.light .ct-a2898b{color:#268BD2}.light .ct-b376f1{color:#2AA198}.light .ct-586d7c{color:#073642}.light .ct-103aed{color:#268BD2}.light .ct-c250e1{color:#93A1A1}.light .ct-7c6dc1{color:#268BD2}.light .ct-492565{color:#073642}.light .ct-e2a3ed{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"}