Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

> Here is the [working version](https://mate-academy.github.io/react_pagination/)

You a given a list of items and markup for the `Pagination`. Implement the
You a given a list of items and markup for the `Pagination`. Implement the
`Pagination` as a stateless component to show only the items for a current page.

1. The `Pagination` should be used with the next props:
Expand Down Expand Up @@ -32,4 +32,4 @@ You a given a list of items and markup for the `Pagination`. Implement the
- Implement a solution following the [React task guideline](https://github.com/mate-academy/react_task-guideline#react-tasks-guideline).
- Use the [React TypeScript cheat sheet](https://mate-academy.github.io/fe-program/js/extra/react-typescript).
- Open one more terminal and run tests with `npm test` to ensure your solution is correct.
- Replace `<your_account>` with your Github username in the [DEMO LINK](https://<your_account>.github.io/react_pagination/) and add it to the PR description.
- Replace `<your_account>` with your Github username in the [DEMO LINK](https://Banderos14.github.io/react_pagination/) and add it to the PR description.
108 changes: 33 additions & 75 deletions src/App.tsx
Original file line number Diff line number Diff line change
@@ -1,25 +1,42 @@
import React from 'react';
import React, { useState } from 'react';
import './App.css';
import { getNumbers } from './utils';
import { Pagination } from './components/Pagination';
Comment thread
Banderos14 marked this conversation as resolved.
Comment thread
Banderos14 marked this conversation as resolved.

// eslint-disable-next-line @typescript-eslint/no-unused-vars
const items = getNumbers(1, 42).map(n => `Item ${n}`);

export const App: React.FC = () => {
const [currentPage, setCurrentPage] = useState(1);
const [perPage, setPerPage] = useState(5);

const total = items.length;

const firstItemIndex = (currentPage - 1) * perPage;
const lastItemIndex = Math.min(firstItemIndex + perPage, total);

const visibleItems = items.slice(firstItemIndex, lastItemIndex);

return (
<div className="container">
<h1>Items with Pagination</h1>

<p className="lead" data-cy="info">
Page 1 (items 1 - 5 of 42)
Page {currentPage} (items {firstItemIndex + 1} - {lastItemIndex} of{' '}
{total})
</p>

<div className="form-group row">
<div className="col-3 col-sm-2 col-xl-1">
<select
data-cy="perPageSelector"
id="perPageSelector"
className="form-control">
className="form-control"
value={perPage}
onChange={event => {
setPerPage(Number(event.target.value));
setCurrentPage(1);
}}
>
<option value="3">3</option>
<option value="5">5</option>
<option value="10">10</option>
Expand All @@ -32,78 +49,19 @@ export const App: React.FC = () => {
</label>
</div>

{/* Move this markup to Pagination */}
<ul className="pagination">
<li className="page-item disabled">
<a
data-cy="prevLink"
className="page-link"
href="#prev"
aria-disabled="true">
«
</a>
</li>
<li className="page-item active">
<a data-cy="pageLink" className="page-link" href="#1">
1
</a>
</li>
<li className="page-item">
<a data-cy="pageLink" className="page-link" href="#2">
2
</a>
</li>
<li className="page-item">
<a data-cy="pageLink" className="page-link" href="#3">
3
</a>
</li>
<li className="page-item">
<a data-cy="pageLink" className="page-link" href="#4">
4
</a>
</li>
<li className="page-item">
<a data-cy="pageLink" className="page-link" href="#5">
5
</a>
</li>
<li className="page-item">
<a data-cy="pageLink" className="page-link" href="#6">
6
</a>
</li>
<li className="page-item">
<a data-cy="pageLink" className="page-link" href="#7">
7
</a>
</li>
<li className="page-item">
<a data-cy="pageLink" className="page-link" href="#8">
8
</a>
</li>
<li className="page-item">
<a data-cy="pageLink" className="page-link" href="#9">
9
</a>
</li>
<li className="page-item">
<a
data-cy="nextLink"
className="page-link"
href="#next"
aria-disabled="false">
»
</a>
</li>
</ul>
<Pagination
total={total}
perPage={perPage}
currentPage={currentPage}
onPageChange={setCurrentPage}
/>

<ul>
<li data-cy="item">Item 1</li>
<li data-cy="item">Item 2</li>
<li data-cy="item">Item 3</li>
<li data-cy="item">Item 4</li>
<li data-cy="item">Item 5</li>
{visibleItems.map(item => (
<li key={item} data-cy="item">
{item}
</li>
))}
</ul>
</div>
);
Expand Down
79 changes: 78 additions & 1 deletion src/components/Pagination/Pagination.tsx
Original file line number Diff line number Diff line change
@@ -1 +1,78 @@
export const Pagination = () => {};
type Props = {
total: number;
perPage: number;
currentPage: number;
Comment thread
Banderos14 marked this conversation as resolved.
Outdated
onPageChange: (page: number) => void;
};

export const Pagination = ({
total,
perPage,
currentPage,
onPageChange,
}: Props) => {
const totalPages = Math.ceil(total / perPage);
const pages = Array.from({ length: totalPages }, (_, index) => index + 1);

const isFirstPage = currentPage === 1;
const isLastPage = currentPage === totalPages;

return (
<ul className="pagination">
<li className={`page-item ${isFirstPage ? 'disabled' : ''}`}>
<a
data-cy="prevLink"
className="page-link"
href="#prev"
aria-disabled={isFirstPage}
onClick={event => {
event.preventDefault();

if (!isFirstPage) {
onPageChange(currentPage - 1);
}
}}
>
«
</a>
</li>

{pages.map(page => (
<li
key={page}
className={`page-item ${currentPage === page ? 'active' : ''}`}
>
<a
data-cy="pageLink"
className="page-link"
href={`#${page}`}
onClick={event => {
event.preventDefault();
onPageChange(page);
Comment thread
Banderos14 marked this conversation as resolved.
Outdated
}}
>
{page}
</a>
</li>
))}

<li className={`page-item ${isLastPage ? 'disabled' : ''}`}>
<a
data-cy="nextLink"
className="page-link"
href="#next"
aria-disabled={isLastPage}
onClick={event => {
event.preventDefault();

if (!isLastPage) {
onPageChange(currentPage + 1);
}
}}
>
»
</a>
</li>
</ul>
);
};
Loading