You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
This repository has been archived by the owner on Jan 20, 2024. It is now read-only.
The total number of pages, calculated based on Backend data
number
0
yes
onPageChange
On change handler which returns the last selected page
(nextPage: number) => void
yes
isDisabled
Disables all of the pagination components. You can always disable each individual component via the isDisabled prop, as the components render HTML buttons
boolean
false
no
activeStyles
The styles of the active page button
ButtonProps
{}
no
normalStyles
The styles of the inactive page buttons
ButtonProps
{}
no
separatorStyles
The styles of the separator wrapper
ButtonProps
{}
no
outerLimit
The amount of pages to show at the start and at the end
number
0
no
innerLimit
The amount of pages to show from the currentPage backwards and forward
number
0
no
currentPage
Manually set the currentPage of the pagination
number
1
no
usePaginator
Options
Prop
Description
Type
Default
Required
total
The total amount of items obtained from a Backend call
number
0
no
initialState
Initial states for pagination values
InitialState
yes
Returned values
Prop
Description
Type
Default
Required
offset
Generic offset value generated if pageSize is provided
number
0
no
pagesQuantity
Automatically calculated based on total and pageSize. Keep in mind that you can pass this directly to Paginator. This is a commodity if you know the total
number
0
no
currentPage
The current page number
number
yes
pageSize
The amount of items per page
number
10
no
isDisabled
Disabled or enables all the pagination components
boolean
false
no
setPageSize
A setter for the pageSize value
Dispatch<SetStateAction >
no
setIsDisabled
A setter for the isDisabled value
Dispatch<SetStateAction >
no
setCurrentPage
A setter for the currentPage value
Dispatch<SetStateAction >
yes
Container
Container is a _Flex_ component, so any _FlexProps_ are accepted
PageGroup
PageGroup is a _Stack_ component, so any _StackProps_ are accepted
Previous
Previous is a _Button_ component, so any _ButtonProps_ are accepted
Next
Next is a _Button_ component, so any _ButtonProps_ are accepted
Usage
Minimal
This is the bare minimum set up you need to get it up and working
importReact,{FC,ChangeEvent,useEffect,useState}from"react";import{ChakraProvider}from"@chakra-ui/react";import{Paginator,Container,Previous,Next,PageGroup,usePaginator}from"chakra-paginator";constDemo: FC=()=>{constpagesQuantity=12;const{ currentPage, setCurrentPage }=usePaginator({initialState: {currentPage: 1}});return(<ChakraProvider><PaginatorpagesQuantity={pagesQuantity}currentPage={currentPage}onPageChange={setCurrentPage}><Containeralign="center"justify="space-between"w="full"p={4}><Previous>
Previous
{/* Or an icon from `react-icons` */}</Previous><PageGroupisInlinealign="center"/><Next>
Next
{/* Or an icon from `react-icons` */}</Next></Container></Paginator></ChakraProvider>);};exportdefaultDemo;
+ From here on, the examples are only partial. You can think of them as modules you can add to the previous component+ Merge them togheter and you would be adding the given functionality
Styling
Add styles to the possible components inside PageGroup
First: the styles for the unselected and selected page buttons
Second: the styles for the separator button
It's possible that the API for the pagination you are consuming works with an offset
One it's calculated and provided for you using the pageSize and currentPage values
This is calculated with the next formula:
[currentPage * pageSize - pageSize]
currentPage === 1 && pageSize === 5 // offset = 0;
currentPage === 2 && pageSize === 5 // offset = 5;
currentPage === 3 && pageSize === 5 // offset = 10;
const{ offset }=usePaginator({initialState: {pageSize: 5}});fetchUsingOffset(pageSize,offset).then((data)=>{// use data});
Pages quantity
Keep in mind that if you know the total amount of items of the requested endpoint, which is not
a strange thing to be returned, you can use that to generate the pages quantity value for you
In this example you can see all the possible features provided by the library being applied
to show 10 pokemons names, with the ability to play with the page size and disable state
importReact,{FC,ChangeEvent,useEffect,useState}from"react";import{Grid,Center,Select,ButtonProps,Text,Button,ChakraProvider}from"@chakra-ui/react";import{Paginator,Container,Previous,usePaginator,Next,PageGroup}from"chakra-paginator";constfetchPokemons=(pageSize: number,offset: number)=>{returnfetch(`https://pokeapi.co/api/v2/pokemon?limit=${pageSize}&offset=${offset}`).then((res)=>res.json());};constDemo: FC=()=>{// statesconst[pokemonsTotal,setPokemonsTotal]=useState<number|undefined>(undefined);const[pokemons,setPokemons]=useState<any[]>([]);// constantsconstouterLimit=2;constinnerLimit=2;const{
pagesQuantity,
offset,
currentPage,
setCurrentPage,
setIsDisabled,
isDisabled,
pageSize,
setPageSize
}=usePaginator({total: pokemonsTotal,initialState: {pageSize: 5,isDisabled: false,currentPage: 1}});// effectsuseEffect(()=>{fetchPokemons(pageSize,offset).then((pokemons)=>{setPokemonsTotal(pokemons.count);setPokemons(pokemons.results);});},[currentPage,pageSize,offset]);// stylesconstbaseStyles: ButtonProps={w: 7,fontSize: "sm"};constnormalStyles: ButtonProps={
...baseStyles,_hover: {bg: "green.300"},bg: "red.300"};constactiveStyles: ButtonProps={
...baseStyles,_hover: {bg: "blue.300"},bg: "green.300"};constseparatorStyles: ButtonProps={w: 7,bg: "green.200"};// handlersconsthandlePageChange=(nextPage: number)=>{// -> request new data using the page numbersetCurrentPage(nextPage);console.log("request new data with ->",nextPage);};consthandlePageSizeChange=(event: ChangeEvent<HTMLSelectElement>)=>{constpageSize=Number(event.target.value);setPageSize(pageSize);};consthandleDisableClick=()=>{returnsetIsDisabled((oldState)=>!oldState);};return(<ChakraProvider><PaginatorisDisabled={isDisabled}activeStyles={activeStyles}innerLimit={innerLimit}currentPage={currentPage}outerLimit={outerLimit}normalStyles={normalStyles}separatorStyles={separatorStyles}pagesQuantity={pagesQuantity}onPageChange={handlePageChange}><Containeralign="center"justify="space-between"w="full"p={4}><Previous>
Previous
{/* Or an icon from `react-icons` */}</Previous><PageGroupisInlinealign="center"/><Next>
Next
{/* Or an icon from `react-icons` */}</Next></Container></Paginator><Centerw="full"><ButtononClick={handleDisableClick}>Disable ON / OFF</Button><Selectw={40}ml={3}onChange={handlePageSizeChange}><optionvalue="10">10</option><optionvalue="25">25</option><optionvalue="50">50</option></Select></Center><GridtemplateRows="repeat(2, 1fr)"templateColumns="repeat(5, 1fr)"gap={3}px={20}mt={20}>{pokemons?.map(({ name })=>(<Centerp={4}bg="green.100"key={name}><Text>{name}</Text></Center>))}</Grid></ChakraProvider>);};exportdefaultDemo;