Huge News!Announcing our $40M Series B led by Abstract Ventures.Learn More
Socket
Sign inDemoInstall
Socket

chakra-paginator

Package Overview
Dependencies
Maintainers
1
Versions
28
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

chakra-paginator

## Version

  • 0.6.4
  • npm
  • Socket score

Version published
Weekly downloads
535
increased by24.42%
Maintainers
1
Weekly downloads
 
Created
Source

Chakra paginator

Version

npm version


Installation

npm

npm i chakra-paginator

Yarn

yarn add chakra-paginator

Demo

Check it out in this Sandbox


Usage

import React, { FC, ChangeEvent, useEffect, useState, useMemo } from "react";
import {
  Grid,
  Center,
  Select,
  ButtonProps,
  Text,
  Button,
  ChakraProvider
} from "@chakra-ui/react";
import {
  Paginator,
  Container,
  Previous,
  Next,
  PageGroup
} from "chakra-paginator";

const fetchPokemons = (pageSize: number, offset: number) => {
  return fetch(
    `https://pokeapi.co/api/v2/pokemon?limit=${pageSize}&offset=${offset}`
  ).then((res) => res.json());
};

const Demo: FC = () => {
  // react hooks
  const [currentPage, setCurrentPage] = useState<number>(1);
  const [pageSize, setPageSize] = useState<number>(10);
  const [pokemonsTotal, setPokemonsTotal] = useState<number | undefined>(
    undefined
  );
  const [pokemons, setPokemons] = useState<any[]>([]);
  const [isPaginatorDisabled, setIsPaginatorDisabled] = useState<boolean>(
    false
  );

  // constants
  const outerLimit = 2;
  const innerLimit = 2;

  // memos
  const offset = useMemo(() => {
    return currentPage * pageSize - pageSize;
  }, [currentPage, pageSize]);
  const pagesQuantity = useMemo(() => {
    if (!pokemonsTotal || !pageSize) {
      return undefined;
    }

    return Math.ceil(pokemonsTotal / pageSize);
  }, [pokemonsTotal, pageSize]);

  // effects
  useEffect(() => {
    fetchPokemons(pageSize, offset).then((pokemons) => {
      setPokemonsTotal(pokemons.count);
      setPokemons(pokemons.results);
    });
  }, [currentPage, pageSize, offset]);

  // styles
  const baseStyles: ButtonProps = {
    w: 7,
    fontSize: "sm"
  };

  const normalStyles: ButtonProps = {
    ...baseStyles,
    _hover: {
      bg: "green.300"
    },
    bg: "red.300"
  };

  const activeStyles: ButtonProps = {
    ...baseStyles,
    _hover: {
      bg: "blue.300"
    },
    bg: "green.300"
  };

  const separatorStyles: ButtonProps = {
    w: 7,
    bg: "green.200"
  };

  // handlers
  const handlePageChange = (nextPage: number) => {
    // -> request new data using the page number
    setCurrentPage(nextPage);
    console.log("request new data with ->", nextPage);
  };

  const handlePageSizeChange = (event: ChangeEvent<HTMLSelectElement>) => {
    const pageSize = Number(event.target.value);

    setPageSize(pageSize);
  };

  const handleDisableClick = () =>
    setIsPaginatorDisabled((oldState) => !oldState);

  return (
    <ChakraProvider>
      <Paginator
        isDisabled={isPaginatorDisabled}
        activeStyles={activeStyles}
        innerLimit={innerLimit}
        currentPage={currentPage}
        outerLimit={outerLimit}
        currentPage={currentPage}
        normalStyles={normalStyles}
        separatorStyles={separatorStyles}
        pagesQuantity={pagesQuantity}
        onPageChange={handlePageChange}
      >
        <Container align="center" justify="space-between" w="full" p={4}>
          <Previous>
            Previous
            {/* Or an icon from `react-icons` */}
          </Previous>
          <PageGroup isInline align="center" />
          <Next>
            Next
            {/* Or an icon from `react-icons` */}
          </Next>
        </Container>
      </Paginator>
      <Center w="full">
        <Button onClick={handleDisableClick}>Disable ON / OFF</Button>
        <Select w={40} ml={3} onChange={handlePageSizeChange}>
          <option value="10">10</option>
          <option value="25">25</option>
          <option value="50">50</option>
        </Select>
      </Center>
      <Grid
        templateRows="repeat(2, 1fr)"
        templateColumns="repeat(5, 1fr)"
        gap={3}
        px={20}
        mt={20}
      >
        {pokemons?.map((pokemon) => (
          <Center p={4} bg="green.100">
            <Text>{pokemon.name}</Text>
          </Center>
        ))}
      </Grid>
    </ChakraProvider>
  );
};

export default Demo;

Components API

Paginator

PropDescriptionTypeDefaultRequired
pagesQuantityThe total number of pages, calculated based on Backend datanumber0yes
onPageChangeOn change handler which returns the last selected page(nextPage: number) => voidyes
isDisabledDisables all of the pagination components. You can always disable each individual component via the isDisabled prop, as the components render HTML buttonsbooleanfalseno
activeStylesThe styles of the active page buttonButtonProps{}no
normalStylesThe styles of the inactive page buttonsButtonProps{}no
separatorStylesThe styles of the separator wrapperButtonProps{}no
outerLimitThe amount of pages to show at the start and at the endnumber0no
innerLimitThe amount of pages to show from the currentPage backwards and forwardnumber0no
currentPageManually set the currentPage of the paginationnumber1no

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

Keywords

FAQs

Package last updated on 11 May 2021

Did you know?

Socket

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Install

Related posts

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc