From 599b70cd2390d08ce26ee44174b3f39c6587110c Mon Sep 17 00:00:00 2001
From: Armand Philippot <git@armandphilippot.com>
Date: Mon, 13 Nov 2023 12:37:50 +0100
Subject: refactor(hooks): rewrite usePagination hook

* replace `isLoadingInitialData` with `isLoading` & `isRefreshing`
* rename `fallbackData` prop to `fallback`
* replace `setSize` return with a `loadMore` callback
* add tests
---
 src/utils/hooks/use-pagination.tsx | 119 -------------------------------------
 1 file changed, 119 deletions(-)
 delete mode 100644 src/utils/hooks/use-pagination.tsx

(limited to 'src/utils/hooks/use-pagination.tsx')

diff --git a/src/utils/hooks/use-pagination.tsx b/src/utils/hooks/use-pagination.tsx
deleted file mode 100644
index 706e656..0000000
--- a/src/utils/hooks/use-pagination.tsx
+++ /dev/null
@@ -1,119 +0,0 @@
-import useSWRInfinite, { SWRInfiniteKeyLoader } from 'swr/infinite';
-import {
-  type EdgesResponse,
-  type GraphQLEdgesInput,
-  type Search,
-} from '../../types';
-
-export type UsePaginationProps<T> = {
-  /**
-   * The initial data.
-   */
-  fallbackData: EdgesResponse<T>[];
-  /**
-   * A function to fetch more data.
-   */
-  fetcher: (props: GraphQLEdgesInput & Search) => Promise<EdgesResponse<T>>;
-  /**
-   * The number of results per page.
-   */
-  perPage: number;
-  /**
-   * An optional search string.
-   */
-  search?: string;
-};
-
-export type UsePaginationReturn<T> = {
-  /**
-   * The data from the API.
-   */
-  data?: EdgesResponse<T>[];
-  /**
-   * An error thrown by fetcher.
-   */
-  error: any;
-  /**
-   * Determine if there's more data to fetch.
-   */
-  hasNextPage?: boolean;
-  /**
-   * Determine if the initial data is loading.
-   */
-  isLoadingInitialData: boolean;
-  /**
-   * Determine if more data is currently loading.
-   */
-  isLoadingMore?: boolean;
-  /**
-   * Determine if the data is refreshing.
-   */
-  isRefreshing?: boolean;
-  /**
-   * Determine if there's a request or revalidation loading.
-   */
-  isValidating: boolean;
-  /**
-   * Set the number of pages that need to be fetched.
-   */
-  setSize: (
-    size: number | ((_size: number) => number)
-  ) => Promise<EdgesResponse<T>[] | undefined>;
-};
-
-/**
- * Handle data fetching with pagination.
- *
- * This hook is a wrapper of `useSWRInfinite` hook.
- *
- * @param {UsePaginationProps} props - The pagination configuration.
- * @returns {UsePaginationReturn} An object with pagination data and helpers.
- */
-export const usePagination = <T extends object>({
-  fallbackData,
-  fetcher,
-  perPage,
-  search,
-}: UsePaginationProps<T>): UsePaginationReturn<T> => {
-  const getKey: SWRInfiniteKeyLoader = (
-    pageIndex: number,
-    previousData: EdgesResponse<T>
-  ): (GraphQLEdgesInput & Search) | null => {
-    // Reached the end.
-    if (previousData && !previousData.edges.length) return null;
-
-    // Fetch data using this parameters.
-    return pageIndex === 0
-      ? { first: perPage, search }
-      : {
-          first: perPage,
-          after: previousData.pageInfo.endCursor,
-          search,
-        };
-  };
-
-  const { data, error, isValidating, size, setSize } = useSWRInfinite(
-    getKey,
-    fetcher,
-    { fallbackData }
-  );
-
-  const isLoadingInitialData = !data && !error;
-  const isLoadingMore =
-    isLoadingInitialData ||
-    (size > 0 && data && typeof data[size - 1] === 'undefined');
-  const isRefreshing = isValidating && data && data.length === size;
-  const hasNextPage =
-    data && data.length > 0 && data[data.length - 1].pageInfo.hasNextPage;
-
-  return {
-    data,
-    error,
-    hasNextPage,
-    isLoadingInitialData,
-    isLoadingMore,
-    isRefreshing,
-    isValidating,
-    setSize,
-  };
-};
-- 
cgit v1.2.3

