import React from "react"; import { Pressable, StyleSheet, Text, View } from "react-native"; const usePagination = ({ currPage, totalPages, pagesPerBatch, }: Record) => { const pagination = React.useMemo(() => { let startPage = Math.max(1, currPage - Math.floor(pagesPerBatch / 2)); let endPage = Math.min(totalPages, startPage + pagesPerBatch - 1); startPage = Math.max(1, endPage - pagesPerBatch + 1); return Array.from( { length: endPage - startPage + 1 }, (_, i) => startPage + i ); }, [currPage, totalPages, pagesPerBatch]); return pagination; }; export interface PaginationProps { currPage: number; totalPages: number; onPageChange: (page: number) => void; pagesPerBatch?: number; } const Pagination: React.FC = ({ currPage, totalPages, onPageChange, pagesPerBatch = 3, }) => { const getPageNumbers = usePagination({ currPage, totalPages, pagesPerBatch, }); const handlePageChange = (pageNum: number) => { if (pageNum >= 1 && pageNum <= totalPages) { onPageChange(pageNum); } }; return ( handlePageChange(1)} disabled={currPage === 1} > {"<<"} handlePageChange(currPage - 1)} disabled={currPage === 1} > {"<"} {getPageNumbers.map((pageNum) => ( handlePageChange(pageNum)} > {pageNum} ))} handlePageChange(currPage + 1)} disabled={currPage === totalPages} > {">"} handlePageChange(totalPages)} disabled={currPage === totalPages} > {">>"} ); }; const styles = StyleSheet.create({ container: { flexDirection: "row", justifyContent: "space-between", alignItems: "center", }, button: { height: 40, width: 40, justifyContent: "center", alignItems: "center", borderRadius: 10, backgroundColor: "#FFF", }, buttonText: { fontSize: 14, color: "#666666", }, activeButtonText: { color: "#EF7E22", }, disabledButton: { opacity: 0.5, }, }); export default React.memo(Pagination);