diff --git a/src/components/ExampleExplanation.tsx b/src/components/ExampleExplanation.tsx new file mode 100644 index 0000000..6517c00 --- /dev/null +++ b/src/components/ExampleExplanation.tsx @@ -0,0 +1,19 @@ +import { ReactNode } from "react"; + +type Props = { + title: string; + description: string; + children?: ReactNode; +}; + +const ExampleExplanation = ({ title, description, children }: Props) => { + return ( +
+

{title}

+

{description}

+ {children} +
+ ); +}; + +export default ExampleExplanation; diff --git a/src/pages/_app.tsx b/src/pages/_app.tsx index 35d7342..050bc6f 100644 --- a/src/pages/_app.tsx +++ b/src/pages/_app.tsx @@ -9,7 +9,9 @@ export default function App({ Component, pageProps }: AppProps) { return ( - +
+ +
); diff --git a/src/pages/offset-pagination-expanded/index.tsx b/src/pages/offset-pagination-expanded/index.tsx index 9025f68..ae97aed 100644 --- a/src/pages/offset-pagination-expanded/index.tsx +++ b/src/pages/offset-pagination-expanded/index.tsx @@ -1,3 +1,4 @@ +import ExampleExplanation from "@/components/ExampleExplanation"; import { Button } from "@/components/ui/button"; import { GetDealsOffsetBasedDocument, @@ -6,18 +7,29 @@ import { useGetDealsOffsetBasedQuery, } from "@/generated/graphql"; import { addApolloState, initializeApollo } from "@/utils/apolloClient"; +import { NetworkStatus } from "@apollo/client"; + +const EXPLANATION = { + title: "Offset Pagination - rozšířené query", + description: + "Tento příklad demonstruje offset paginaci, která se používá pro načítání dat v určitých intervalech. 'Single field query' znamená, že dotaz je založen pouze na jednom poli, například 'ID'. V tomto případě se však jedná o 'rozšířený dotaz', kde se využívají více fieldů (např. deals a totalCount). Důležité je, že tento pattern funguje efektivně při server-side rendering, protože SSR umožňuje rychlejší načítání komponent na straně serveru předtím, než jsou odeslány klientovi. V případě, že dotaz obsahuje více polí, je potřeba správně nastavit 'type policies' v 'inMemoryCache', aby se zajistilo efektivní cachování dat a optimalizovala se výkon aplikace.", +}; export default function BasedPagitanionPage() { - const { data, fetchMore, loading } = useGetDealsOffsetBasedExpandedQuery({ - variables: { - limitTotal: 3, - offsetTotal: 0, - }, - }); + const { data, fetchMore, loading, error, refetch, networkStatus } = + useGetDealsOffsetBasedExpandedQuery({ + variables: { + limitTotal: 3, + offsetTotal: 0, + }, + notifyOnNetworkStatusChange: true, + }); + + const isLoadingMoreDeals = networkStatus === NetworkStatus.fetchMore; + const isRefetching = networkStatus === NetworkStatus.refetch; const loadMore = () => { const currentLength = data.dealsOffsetBasedExpanded.deals.length || 0; - console.log(currentLength); fetchMore({ variables: { offsetTotal: currentLength, @@ -26,27 +38,70 @@ export default function BasedPagitanionPage() { }); }; - console.log(data); - if (loading) { - return
loading
; - } + const areMoreDeals = + data.dealsOffsetBasedExpanded.deals.length < + data.dealsOffsetBasedExpanded.totalCount; - return ( -
-
- {data.dealsOffsetBasedExpanded.deals && - data.dealsOffsetBasedExpanded.deals.map((deal) => ( -
-

{deal.title}

+ if (data.dealsOffsetBasedExpanded) { + return ( +
+ +
+

Poznámky

+
    +
  • refetch defaultně má nastavené variables hooku
  • +
  • Pořadí podmínek v tomto příkladu funguje pouze při SSR
  • +
  • + Musí být nastavený v options hooku notifyOnNetworkStatusChange, + jinak networkStatus ukazuje stále na 'ready' (7) +
  • +
+
+
+
+ {data.dealsOffsetBasedExpanded.deals && + data.dealsOffsetBasedExpanded.deals.map((deal) => ( +
+

{deal.title}

+
+ ))} + {!areMoreDeals && ( +
+ Žádné další výsledky
- ))} -
- -
- ); + )} +
+
+ {areMoreDeals && ( + + )} + +
+
+ ); + } + + if (loading && !isLoadingMoreDeals) return
Loading
; + + if (error) { + return
Něco se pokazilo
; + } + + return
Nic tu není
; } -/* export async function getServerSideProps() { +export async function getServerSideProps() { const apolloClient = initializeApollo(); await apolloClient.query({ @@ -61,4 +116,3 @@ export default function BasedPagitanionPage() { props: {}, }); } - */