diff --git a/src/App.tsx b/src/App.tsx index 189a990c8..ffc5d1628 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,17 +1,70 @@ -import React from 'react'; +import React, { useState, useEffect } from 'react'; import './App.css'; import { getNumbers } from './utils'; +import { Pagination } from './components/Pagination/Pagination'; -// eslint-disable-next-line @typescript-eslint/no-unused-vars const items = getNumbers(1, 42).map(n => `Item ${n}`); export const App: React.FC = () => { + const getParamsFromUrl = () => { + const params = new URLSearchParams(window.location.search); + const perPageValue = Number(params.get('perPage')) || 5; + const rawPage = Number(params.get('page')) || 1; + + const totalPages = Math.ceil(items.length / perPageValue) || 1; + const pageValue = Math.max(1, Math.min(rawPage, totalPages)); + + return { page: pageValue, perPage: perPageValue }; + }; + + const [{ page, perPage }, setQueryParams] = useState(getParamsFromUrl); + + useEffect(() => { + const handlePopState = () => { + setQueryParams(getParamsFromUrl()); + }; + + window.addEventListener('popstate', handlePopState); + + return () => window.removeEventListener('popstate', handlePopState); + }, []); + + const updateUrlParams = (newPage: number, newPerPage: number) => { + const params = new URLSearchParams(); + + params.set('page', String(newPage)); + params.set('perPage', String(newPerPage)); + + const newUrl = `${window.location.pathname}?${params.toString()}`; + + window.history.pushState({}, '', newUrl); + + setQueryParams({ page: newPage, perPage: newPerPage }); + }; + + const indexOfLastItem = page * perPage; + const indexOfFirstItem = indexOfLastItem - perPage; + const visibleItems = items.slice(indexOfFirstItem, indexOfLastItem); + + const startItemNum = items.length === 0 ? 0 : indexOfFirstItem + 1; + const endItemNum = Math.min(indexOfLastItem, items.length); + + const handlePerPageChange = (event: React.ChangeEvent) => { + const newPerPage = Number(event.target.value); + + updateUrlParams(1, newPerPage); + }; + + const handlePageChange = (newPageNum: number) => { + updateUrlParams(newPageNum, perPage); + }; + return (

Items with Pagination

- Page 1 (items 1 - 5 of 42) + {`Page ${page} (items ${startItemNum} - ${endItemNum} of ${items.length})`}

@@ -19,7 +72,10 @@ export const App: React.FC = () => {