From 18f531c478e35ebb1c50b56248311956028f66b9 Mon Sep 17 00:00:00 2001 From: kitajchuk Date: Tue, 4 Oct 2022 07:28:53 -0700 Subject: [PATCH] Pagination optimizations --- src/components/pagination/index.tsx | 150 ++++++++++-------- .../internal/views/alerts/index.tsx | 6 +- .../internal/views/recent-calls/index.tsx | 6 +- 3 files changed, 90 insertions(+), 72 deletions(-) diff --git a/src/components/pagination/index.tsx b/src/components/pagination/index.tsx index 81d883b..6361769 100644 --- a/src/components/pagination/index.tsx +++ b/src/components/pagination/index.tsx @@ -1,4 +1,4 @@ -import React from "react"; +import React, { useCallback, useMemo } from "react"; import { Icon } from "jambonz-ui"; import { Icons } from "../icons"; @@ -24,9 +24,84 @@ export const Pagination = ({ jumpNum = 3, showMin = 4, }: PaginationProps) => { - const handleSetPageNumber = (num: number) => { - setPageNumber(Math.max(1, Math.min(maxPageNumber, num))); - }; + const memoizedPages = useMemo(() => { + return Array(maxPageNumber).fill(0); + }, [maxPageNumber]); + + const handleSetPageNumber = useCallback( + (num: number) => { + setPageNumber(Math.max(1, Math.min(maxPageNumber, num))); + }, + [maxPageNumber, setPageNumber] + ); + + const handleNumberMapping = useCallback( + (_: number, index: number) => { + const num = index + 1; + + if ( + pageNumber === num || + num === 1 || + num === maxPageNumber || + (pageNumber > num && pageNumber <= num + nextTo) || + (pageNumber < num && pageNumber >= num - nextTo) || + (pageNumber <= showMin && num <= showMin) || + (maxPageNumber - pageNumber + 1 <= showMin && + maxPageNumber - num + 1 <= showMin) + ) { + return ( + + ); + } + + if ( + pageNumber >= showMin + ? num === pageNumber + nextTo + 1 + : num === showMin + 1 + ) { + return ( + + ); + } + + if ( + maxPageNumber - pageNumber + 1 >= showMin + ? num === pageNumber - nextTo - 1 + : maxPageNumber - num + 1 === showMin + 1 + ) { + return ( + + ); + } + }, + [maxPageNumber, pageNumber] + ); return (
@@ -39,72 +114,7 @@ export const Pagination = ({ - {Array(maxPageNumber) - .fill(0) - .map((_, index) => { - const num = index + 1; - - if ( - pageNumber === num || - num === 1 || - num === maxPageNumber || - (pageNumber > num && pageNumber <= num + nextTo) || - (pageNumber < num && pageNumber >= num - nextTo) || - (pageNumber <= showMin && num <= showMin) || - (maxPageNumber - pageNumber + 1 <= showMin && - maxPageNumber - num + 1 <= showMin) - ) { - return ( - - ); - } - - if ( - pageNumber >= showMin - ? num === pageNumber + nextTo + 1 - : num === showMin + 1 - ) { - return ( - - ); - } - - if ( - maxPageNumber - pageNumber + 1 >= showMin - ? num === pageNumber - nextTo - 1 - : maxPageNumber - num + 1 === showMin + 1 - ) { - return ( - - ); - } - })} + {memoizedPages.map(handleNumberMapping)}