mirror of
https://github.com/muerwre/muerwre.github.io.git
synced 2025-04-25 02:46:39 +07:00

Author: Fedor Katurov <gotham48@gmail.com> Date: Thu Nov 10 16:21:06 2022 +0600 made contacts page
1 line
No EOL
41 KiB
JSON
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-d0a6bd"},"children":[{"type":"text","value":"query"}]},{"type":"element","tag":"span","props":{"class":"ct-33d3d6"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-7bd0d9"},"children":[{"type":"text","value":"listItems"}]},{"type":"element","tag":"span","props":{"class":"ct-33d3d6"},"children":[{"type":"text","value":"("}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-2f8c78"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-3bd622"},"children":[{"type":"text","value":"filter"}]},{"type":"element","tag":"span","props":{"class":"ct-2f8c78"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"class":"ct-766ca2"},"children":[{"type":"text","value":"Filter"}]},{"type":"element","tag":"span","props":{"class":"ct-2f8c78"},"children":[{"type":"text","value":", "}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-2f8c78"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-3bd622"},"children":[{"type":"text","value":"sort"}]},{"type":"element","tag":"span","props":{"class":"ct-2f8c78"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"class":"ct-766ca2"},"children":[{"type":"text","value":"String"}]},{"type":"element","tag":"span","props":{"class":"ct-2f8c78"},"children":[{"type":"text","value":","}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-2f8c78"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-3bd622"},"children":[{"type":"text","value":"limit"}]},{"type":"element","tag":"span","props":{"class":"ct-2f8c78"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"class":"ct-766ca2"},"children":[{"type":"text","value":"Number"}]},{"type":"element","tag":"span","props":{"class":"ct-2f8c78"},"children":[{"type":"text","value":","}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-2f8c78"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-3bd622"},"children":[{"type":"text","value":"offset"}]},{"type":"element","tag":"span","props":{"class":"ct-2f8c78"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"class":"ct-766ca2"},"children":[{"type":"text","value":"Number"}]},{"type":"element","tag":"span","props":{"class":"ct-2f8c78"},"children":[{"type":"text","value":","}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-33d3d6"},"children":[{"type":"text","value":"): "}]},{"type":"element","tag":"span","props":{"class":"ct-7bd0d9"},"children":[{"type":"text","value":"ItemList"}]},{"type":"element","tag":"span","props":{"class":"ct-33d3d6"},"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-d0a6bd"},"children":[{"type":"text","value":"input"}]},{"type":"element","tag":"span","props":{"class":"ct-33d3d6"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-8394df"},"children":[{"type":"text","value":"Filter"}]},{"type":"element","tag":"span","props":{"class":"ct-33d3d6"},"children":[{"type":"text","value":" {"}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-2f8c78"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-3bd622"},"children":[{"type":"text","value":"name"}]},{"type":"element","tag":"span","props":{"class":"ct-2f8c78"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"class":"ct-766ca2"},"children":[{"type":"text","value":"String"}]},{"type":"element","tag":"span","props":{"class":"ct-8c81b6"},"children":[{"type":"text","value":"!"}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-2f8c78"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-3bd622"},"children":[{"type":"text","value":"type"}]},{"type":"element","tag":"span","props":{"class":"ct-2f8c78"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"class":"ct-766ca2"},"children":[{"type":"text","value":"String"}]},{"type":"element","tag":"span","props":{"class":"ct-8c81b6"},"children":[{"type":"text","value":"!"}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-33d3d6"},"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-d0a6bd"},"children":[{"type":"text","value":"type"}]},{"type":"element","tag":"span","props":{"class":"ct-33d3d6"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-8394df"},"children":[{"type":"text","value":"ItemList"}]},{"type":"element","tag":"span","props":{"class":"ct-33d3d6"},"children":[{"type":"text","value":" {"}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-2f8c78"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-3bd622"},"children":[{"type":"text","value":"items"}]},{"type":"element","tag":"span","props":{"class":"ct-2f8c78"},"children":[{"type":"text","value":": ["}]},{"type":"element","tag":"span","props":{"class":"ct-766ca2"},"children":[{"type":"text","value":"Item"}]},{"type":"element","tag":"span","props":{"class":"ct-8c81b6"},"children":[{"type":"text","value":"!"}]},{"type":"element","tag":"span","props":{"class":"ct-2f8c78"},"children":[{"type":"text","value":"]"}]},{"type":"element","tag":"span","props":{"class":"ct-8c81b6"},"children":[{"type":"text","value":"!"}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-2f8c78"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-3bd622"},"children":[{"type":"text","value":"totalCount"}]},{"type":"element","tag":"span","props":{"class":"ct-2f8c78"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"class":"ct-766ca2"},"children":[{"type":"text","value":"Int"}]},{"type":"element","tag":"span","props":{"class":"ct-8c81b6"},"children":[{"type":"text","value":"!"}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-33d3d6"},"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-d0a6bd"},"children":[{"type":"text","value":"import"}]},{"type":"element","tag":"span","props":{"class":"ct-33d3d6"},"children":[{"type":"text","value":" { "}]},{"type":"element","tag":"span","props":{"class":"ct-fc51a1"},"children":[{"type":"text","value":"ApolloClient"}]},{"type":"element","tag":"span","props":{"class":"ct-33d3d6"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"class":"ct-fc51a1"},"children":[{"type":"text","value":"InMemoryCache"}]},{"type":"element","tag":"span","props":{"class":"ct-33d3d6"},"children":[{"type":"text","value":" } "}]},{"type":"element","tag":"span","props":{"class":"ct-d0a6bd"},"children":[{"type":"text","value":"from"}]},{"type":"element","tag":"span","props":{"class":"ct-33d3d6"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-399b31"},"children":[{"type":"text","value":"'@apollo/client'"}]},{"type":"element","tag":"span","props":{"class":"ct-33d3d6"},"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-efadc6"},"children":[{"type":"text","value":"const"}]},{"type":"element","tag":"span","props":{"class":"ct-33d3d6"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-54835b"},"children":[{"type":"text","value":"client"}]},{"type":"element","tag":"span","props":{"class":"ct-33d3d6"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-d0a6bd"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"class":"ct-33d3d6"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-d0a6bd"},"children":[{"type":"text","value":"new"}]},{"type":"element","tag":"span","props":{"class":"ct-33d3d6"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-7bd0d9"},"children":[{"type":"text","value":"ApolloClient"}]},{"type":"element","tag":"span","props":{"class":"ct-33d3d6"},"children":[{"type":"text","value":"({"}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-33d3d6"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-9cf15c"},"children":[{"type":"text","value":"// ..."}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-33d3d6"},"children":[{"type":"text","value":" cache: "}]},{"type":"element","tag":"span","props":{"class":"ct-d0a6bd"},"children":[{"type":"text","value":"new"}]},{"type":"element","tag":"span","props":{"class":"ct-33d3d6"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-7bd0d9"},"children":[{"type":"text","value":"InMemoryCache"}]},{"type":"element","tag":"span","props":{"class":"ct-33d3d6"},"children":[{"type":"text","value":"({ "}]},{"type":"element","tag":"span","props":{"class":"ct-fc51a1"},"children":[{"type":"text","value":"typePolicies"}]},{"type":"element","tag":"span","props":{"class":"ct-33d3d6"},"children":[{"type":"text","value":" }),"}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-33d3d6"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-9cf15c"},"children":[{"type":"text","value":"// ..."}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-33d3d6"},"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-d0a6bd"},"children":[{"type":"text","value":"export"}]},{"type":"element","tag":"span","props":{"class":"ct-33d3d6"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-efadc6"},"children":[{"type":"text","value":"const"}]},{"type":"element","tag":"span","props":{"class":"ct-33d3d6"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-54835b"},"children":[{"type":"text","value":"typePolicies"}]},{"type":"element","tag":"span","props":{"class":"ct-d0a6bd"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"class":"ct-33d3d6"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-d0eec6"},"children":[{"type":"text","value":"TypePolicies"}]},{"type":"element","tag":"span","props":{"class":"ct-33d3d6"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-d0a6bd"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"class":"ct-33d3d6"},"children":[{"type":"text","value":" {"}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-33d3d6"},"children":[{"type":"text","value":" Query: {"}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-33d3d6"},"children":[{"type":"text","value":" fields: {"}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-33d3d6"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-9cf15c"},"children":[{"type":"text","value":"// query name"}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-33d3d6"},"children":[{"type":"text","value":" listItems: {"}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-33d3d6"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-9cf15c"},"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-33d3d6"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-9cf15c"},"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-33d3d6"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-9cf15c"},"children":[{"type":"text","value":"// consider choosing the right fields, "}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-33d3d6"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-9cf15c"},"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-33d3d6"},"children":[{"type":"text","value":" keyArgs: ["}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-33d3d6"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-399b31"},"children":[{"type":"text","value":"'sort'"}]},{"type":"element","tag":"span","props":{"class":"ct-33d3d6"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"class":"ct-9cf15c"},"children":[{"type":"text","value":"// primitive type"}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-33d3d6"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-399b31"},"children":[{"type":"text","value":"'filter'"}]},{"type":"element","tag":"span","props":{"class":"ct-33d3d6"},"children":[{"type":"text","value":", ["}]},{"type":"element","tag":"span","props":{"class":"ct-399b31"},"children":[{"type":"text","value":"'name'"}]},{"type":"element","tag":"span","props":{"class":"ct-33d3d6"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"class":"ct-399b31"},"children":[{"type":"text","value":"'type'"}]},{"type":"element","tag":"span","props":{"class":"ct-33d3d6"},"children":[{"type":"text","value":"] "}]},{"type":"element","tag":"span","props":{"class":"ct-9cf15c"},"children":[{"type":"text","value":"// nested fields of `filter`"}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-33d3d6"},"children":[{"type":"text","value":" ],"}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-33d3d6"},"children":[{"type":"text","value":" merge: "}]},{"type":"element","tag":"span","props":{"class":"ct-fc51a1"},"children":[{"type":"text","value":"mergeItemsWithTotalCount"}]},{"type":"element","tag":"span","props":{"class":"ct-33d3d6"},"children":[{"type":"text","value":","}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-33d3d6"},"children":[{"type":"text","value":" },"}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-33d3d6"},"children":[{"type":"text","value":" }"}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-33d3d6"},"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-9cf15c"},"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-5c730c"},"children":[{"type":"text","value":"const"}]},{"type":"element","tag":"span","props":{"class":"ct-2f8c78"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-edf9aa"},"children":[{"type":"text","value":"mergeItemsWithTotalCount"}]},{"type":"element","tag":"span","props":{"class":"ct-2f8c78"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-8c81b6"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"class":"ct-2f8c78"},"children":[{"type":"text","value":" ("}]},{"type":"element","tag":"span","props":{"class":"ct-3bd622"},"children":[{"type":"text","value":"existing"}]},{"type":"element","tag":"span","props":{"class":"ct-2f8c78"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"class":"ct-3bd622"},"children":[{"type":"text","value":"incoming"}]},{"type":"element","tag":"span","props":{"class":"ct-2f8c78"},"children":[{"type":"text","value":", { "}]},{"type":"element","tag":"span","props":{"class":"ct-3bd622"},"children":[{"type":"text","value":"args"}]},{"type":"element","tag":"span","props":{"class":"ct-2f8c78"},"children":[{"type":"text","value":" }) "}]},{"type":"element","tag":"span","props":{"class":"ct-5c730c"},"children":[{"type":"text","value":"=>"}]},{"type":"element","tag":"span","props":{"class":"ct-2f8c78"},"children":[{"type":"text","value":" {"}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-33d3d6"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-9cf15c"},"children":[{"type":"text","value":"// no existing data"}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-33d3d6"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-d0a6bd"},"children":[{"type":"text","value":"if"}]},{"type":"element","tag":"span","props":{"class":"ct-33d3d6"},"children":[{"type":"text","value":" ("}]},{"type":"element","tag":"span","props":{"class":"ct-d0a6bd"},"children":[{"type":"text","value":"!"}]},{"type":"element","tag":"span","props":{"class":"ct-fc51a1"},"children":[{"type":"text","value":"existing"}]},{"type":"element","tag":"span","props":{"class":"ct-33d3d6"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-d0a6bd"},"children":[{"type":"text","value":"||"}]},{"type":"element","tag":"span","props":{"class":"ct-33d3d6"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-d0a6bd"},"children":[{"type":"text","value":"!"}]},{"type":"element","tag":"span","props":{"class":"ct-fc51a1"},"children":[{"type":"text","value":"args"}]},{"type":"element","tag":"span","props":{"class":"ct-33d3d6"},"children":[{"type":"text","value":"?."}]},{"type":"element","tag":"span","props":{"class":"ct-fc51a1"},"children":[{"type":"text","value":"offset"}]},{"type":"element","tag":"span","props":{"class":"ct-33d3d6"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-d0a6bd"},"children":[{"type":"text","value":"||"}]},{"type":"element","tag":"span","props":{"class":"ct-33d3d6"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-fc51a1"},"children":[{"type":"text","value":"args"}]},{"type":"element","tag":"span","props":{"class":"ct-33d3d6"},"children":[{"type":"text","value":"."}]},{"type":"element","tag":"span","props":{"class":"ct-fc51a1"},"children":[{"type":"text","value":"offset"}]},{"type":"element","tag":"span","props":{"class":"ct-33d3d6"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-d0a6bd"},"children":[{"type":"text","value":"<"}]},{"type":"element","tag":"span","props":{"class":"ct-33d3d6"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-fc51a1"},"children":[{"type":"text","value":"existing"}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-33d3d6"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-d0a6bd"},"children":[{"type":"text","value":"return"}]},{"type":"element","tag":"span","props":{"class":"ct-33d3d6"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-fc51a1"},"children":[{"type":"text","value":"incoming"}]},{"type":"element","tag":"span","props":{"class":"ct-33d3d6"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-d0a6bd"},"children":[{"type":"text","value":"||"}]},{"type":"element","tag":"span","props":{"class":"ct-33d3d6"},"children":[{"type":"text","value":" [];"}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-33d3d6"},"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-33d3d6"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-9cf15c"},"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-33d3d6"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-d0a6bd"},"children":[{"type":"text","value":"if"}]},{"type":"element","tag":"span","props":{"class":"ct-33d3d6"},"children":[{"type":"text","value":" ("}]},{"type":"element","tag":"span","props":{"class":"ct-fc51a1"},"children":[{"type":"text","value":"existing"}]},{"type":"element","tag":"span","props":{"class":"ct-33d3d6"},"children":[{"type":"text","value":"?."}]},{"type":"element","tag":"span","props":{"class":"ct-fc51a1"},"children":[{"type":"text","value":"items"}]},{"type":"element","tag":"span","props":{"class":"ct-33d3d6"},"children":[{"type":"text","value":"?."}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-33d3d6"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-d0a6bd"},"children":[{"type":"text","value":"return"}]},{"type":"element","tag":"span","props":{"class":"ct-33d3d6"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-fc51a1"},"children":[{"type":"text","value":"existing"}]},{"type":"element","tag":"span","props":{"class":"ct-33d3d6"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-d0a6bd"},"children":[{"type":"text","value":"||"}]},{"type":"element","tag":"span","props":{"class":"ct-33d3d6"},"children":[{"type":"text","value":" [];"}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-33d3d6"},"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-33d3d6"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-9cf15c"},"children":[{"type":"text","value":"// merge cache and incoming data"}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-33d3d6"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-efadc6"},"children":[{"type":"text","value":"const"}]},{"type":"element","tag":"span","props":{"class":"ct-33d3d6"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-54835b"},"children":[{"type":"text","value":"items"}]},{"type":"element","tag":"span","props":{"class":"ct-33d3d6"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-d0a6bd"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"class":"ct-33d3d6"},"children":[{"type":"text","value":" ["}]},{"type":"element","tag":"span","props":{"class":"ct-d0a6bd"},"children":[{"type":"text","value":"..."}]},{"type":"element","tag":"span","props":{"class":"ct-33d3d6"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"class":"ct-fc51a1"},"children":[{"type":"text","value":"existing"}]},{"type":"element","tag":"span","props":{"class":"ct-33d3d6"},"children":[{"type":"text","value":"?."}]},{"type":"element","tag":"span","props":{"class":"ct-fc51a1"},"children":[{"type":"text","value":"items"}]},{"type":"element","tag":"span","props":{"class":"ct-33d3d6"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-d0a6bd"},"children":[{"type":"text","value":"||"}]},{"type":"element","tag":"span","props":{"class":"ct-33d3d6"},"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-33d3d6"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-9cf15c"},"children":[{"type":"text","value":"// apply latest result for totalCount"}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-33d3d6"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-efadc6"},"children":[{"type":"text","value":"const"}]},{"type":"element","tag":"span","props":{"class":"ct-33d3d6"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-54835b"},"children":[{"type":"text","value":"totalCount"}]},{"type":"element","tag":"span","props":{"class":"ct-33d3d6"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-d0a6bd"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"class":"ct-33d3d6"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-fc51a1"},"children":[{"type":"text","value":"incoming"}]},{"type":"element","tag":"span","props":{"class":"ct-33d3d6"},"children":[{"type":"text","value":"?."}]},{"type":"element","tag":"span","props":{"class":"ct-fc51a1"},"children":[{"type":"text","value":"totalCount"}]},{"type":"element","tag":"span","props":{"class":"ct-33d3d6"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-d0a6bd"},"children":[{"type":"text","value":"||"}]},{"type":"element","tag":"span","props":{"class":"ct-33d3d6"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-fc51a1"},"children":[{"type":"text","value":"existing"}]},{"type":"element","tag":"span","props":{"class":"ct-33d3d6"},"children":[{"type":"text","value":"?."}]},{"type":"element","tag":"span","props":{"class":"ct-fc51a1"},"children":[{"type":"text","value":"totalCount"}]},{"type":"element","tag":"span","props":{"class":"ct-33d3d6"},"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-33d3d6"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-d0a6bd"},"children":[{"type":"text","value":"return"}]},{"type":"element","tag":"span","props":{"class":"ct-33d3d6"},"children":[{"type":"text","value":" {"}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-33d3d6"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-d0a6bd"},"children":[{"type":"text","value":"..."}]},{"type":"element","tag":"span","props":{"class":"ct-33d3d6"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"class":"ct-fc51a1"},"children":[{"type":"text","value":"incoming"}]},{"type":"element","tag":"span","props":{"class":"ct-33d3d6"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-d0a6bd"},"children":[{"type":"text","value":"||"}]},{"type":"element","tag":"span","props":{"class":"ct-33d3d6"},"children":[{"type":"text","value":" "}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-33d3d6"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-fc51a1"},"children":[{"type":"text","value":"items"}]},{"type":"element","tag":"span","props":{"class":"ct-33d3d6"},"children":[{"type":"text","value":","}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-33d3d6"},"children":[{"type":"text","value":" "}]},{"type":"element","tag":"span","props":{"class":"ct-fc51a1"},"children":[{"type":"text","value":"totalCount"}]},{"type":"element","tag":"span","props":{"class":"ct-33d3d6"},"children":[{"type":"text","value":","}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-33d3d6"},"children":[{"type":"text","value":" };"}]}]},{"type":"element","tag":"span","props":{"class":"line"},"children":[{"type":"element","tag":"span","props":{"class":"ct-33d3d6"},"children":[{"type":"text","value":" };"}]}]}]}]}]},{"type":"element","tag":"style","children":[{"type":"text","value":".ct-edf9aa{color:#D2A8FF}.ct-5c730c{color:#FF7B72}.ct-d0eec6{color:#FFA657}.ct-9cf15c{color:#8B949E}.ct-54835b{color:#79C0FF}.ct-efadc6{color:#FF7B72}.ct-399b31{color:#A5D6FF}.ct-fc51a1{color:#C9D1D9}.ct-8c81b6{color:#FF7B72}.ct-8394df{color:#79C0FF}.ct-766ca2{color:#79C0FF}.ct-3bd622{color:#FFA657}.ct-2f8c78{color:#C9D1D9}.ct-7bd0d9{color:#D2A8FF}.ct-33d3d6{color:#C9D1D9}.ct-d0a6bd{color:#FF7B72}.light .ct-d0a6bd{color:#859900}.light .ct-33d3d6{color:#657B83}.light .ct-7bd0d9{color:#268BD2}.light .ct-2f8c78{color:#657B83}.light .ct-3bd622{color:#657B83}.light .ct-766ca2{color:#859900}.light .ct-8394df{color:#859900}.light .ct-8c81b6{color:#859900}.light .ct-fc51a1{color:#268BD2}.light .ct-399b31{color:#2AA198}.light .ct-efadc6{color:#073642}.light .ct-54835b{color:#268BD2}.light .ct-9cf15c{color:#93A1A1}.light .ct-d0eec6{color:#268BD2}.light .ct-5c730c{color:#073642}.light .ct-edf9aa{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"} |