From 624bef4810ba65723579060bf8001827c39bfadd Mon Sep 17 00:00:00 2001 From: indugunturu Date: Wed, 8 Nov 2023 10:20:02 +0100 Subject: [PATCH] Commit style a cool beer page add a list of favourite beers, do not clean after page reload Beer list filtering + pagination + sorting --- BeerApp - Senior/.gitattributes | 2 + BeerApp - Senior/src/views/BeerList/index.tsx | 81 ++++++++++- .../src/views/Home/Home.module.css | 12 ++ BeerApp - Senior/src/views/Home/index.tsx | 132 ++++++++++++++++-- 4 files changed, 210 insertions(+), 17 deletions(-) create mode 100644 BeerApp - Senior/.gitattributes diff --git a/BeerApp - Senior/.gitattributes b/BeerApp - Senior/.gitattributes new file mode 100644 index 0000000..dfe0770 --- /dev/null +++ b/BeerApp - Senior/.gitattributes @@ -0,0 +1,2 @@ +# Auto detect text files and perform LF normalization +* text=auto diff --git a/BeerApp - Senior/src/views/BeerList/index.tsx b/BeerApp - Senior/src/views/BeerList/index.tsx index 07dfd6f..c62b552 100644 --- a/BeerApp - Senior/src/views/BeerList/index.tsx +++ b/BeerApp - Senior/src/views/BeerList/index.tsx @@ -1,9 +1,11 @@ import { useEffect, useState } from 'react'; import { Beer } from '../../types'; import { fetchData } from './utils'; -import { Avatar, List, ListItemAvatar, ListItemButton, ListItemText } from '@mui/material'; +import { Avatar, BadgeRoot, List, ListItemAvatar, ListItemButton, ListItemText } from '@mui/material'; import SportsBar from '@mui/icons-material/SportsBar'; import { useNavigate } from 'react-router-dom'; +import { Button } from "@mui/material"; +import styles from "../Home/Home.module.css"; const BeerList = () => { const navigate = useNavigate(); @@ -14,6 +16,52 @@ const BeerList = () => { const onBeerClick = (id: string) => navigate(`/beer/${id}`); + const [currentPage, setCurrentPage] = useState(1); + const totalPages = Math.ceil(beerList.length / 5); + + const itemsPerPage = 5; // Number of items to display per page + + // Calculate the index range for the current page + const startIndex = (currentPage - 1) * itemsPerPage; + const endIndex = startIndex + itemsPerPage; + const displayedItems = beerList.slice(startIndex, endIndex); + + const changePage = (pageNumber: number) => { + if (pageNumber >= 1 && pageNumber <= totalPages) { + setCurrentPage(pageNumber); + } + }; + + // Handle page navigation + const prevPage = () => { + if (currentPage > 1) { + setCurrentPage(currentPage - 1); + } + }; + + const nextPage = () => { + if (currentPage < Math.ceil(beerList.length / itemsPerPage)) { + setCurrentPage(currentPage + 1); + } + }; + +// // Render the paginated list +// return ( +//
+// +//
+// +// +//
+//
+// ); +// }; + + return (
@@ -22,17 +70,40 @@ const BeerList = () => {
- {beerList.map((beer) => ( + {displayedItems.map((beer) => ( - + - + - + ))} + + {/*
    + {displayedItems.map((bear) => ( +
  • {bear.name}
  • + ))} +
*/} + + +
+
+
+ +
+
+ +
+ +
+
diff --git a/BeerApp - Senior/src/views/Home/Home.module.css b/BeerApp - Senior/src/views/Home/Home.module.css index 5ce0380..b83659b 100644 --- a/BeerApp - Senior/src/views/Home/Home.module.css +++ b/BeerApp - Senior/src/views/Home/Home.module.css @@ -12,4 +12,16 @@ display: flex; align-items: center; justify-content: space-between; +} +.pagination { + display: flex; +} +.button { + margin-right: 20px; +} +.listitem { + background-color: blue; +} +.listitembeer { + color:blue; } \ No newline at end of file diff --git a/BeerApp - Senior/src/views/Home/index.tsx b/BeerApp - Senior/src/views/Home/index.tsx index 2adc6df..83c53cc 100644 --- a/BeerApp - Senior/src/views/Home/index.tsx +++ b/BeerApp - Senior/src/views/Home/index.tsx @@ -1,17 +1,90 @@ -import { useEffect, useState } from 'react'; -import { fetchData } from './utils'; -import { Beer } from '../../types'; -import { Link as RouterLink } from 'react-router-dom'; -import { Button, Checkbox, Paper, TextField, Link } from '@mui/material'; -import styles from './Home.module.css'; +import { useEffect, useState } from "react"; +import { fetchData } from "./utils"; +import { Beer } from "../../types"; +import { Link as RouterLink } from "react-router-dom"; +import { Button, Checkbox, Paper, TextField, Link } from "@mui/material"; +import styles from "./Home.module.css"; const Home = () => { const [beerList, setBeerList] = useState>([]); - const [savedList, setSavedList] = useState>([]); + const [filterText, setFilterText] = useState(""); + const localStorageKey = "savedItems"; + + const initialSavedList = JSON.parse( + localStorage.getItem(localStorageKey) || "[]" + ); + + const [savedList, setSavedList] = useState>(initialSavedList); + + const [savedBufferList, setSavedBufferList] = + useState>(savedList); + + const [sortByName, setSortByName] = useState(false); // State for sorting // eslint-disable-next-line useEffect(fetchData.bind(this, setBeerList), []); + const filteredBeerList = beerList.filter((beer) => + beer.name.toLowerCase().includes(filterText.toLowerCase()) + ); + + const handleReload: React.MouseEventHandler = (event) => { + fetchData(setBeerList); + }; + + const handleSaveItems = (beer: Beer) => { + if (!savedBufferList.some((item) => item.id === beer.id)) { + // If the item is not in the saved list, add it + const updatedSavedBufferList = [...savedBufferList, beer]; + setSavedBufferList(updatedSavedBufferList); + } else { + // If the item is already in the saved list, remove it + const updatedSavedList = savedBufferList.filter( + (item) => item.id !== beer.id + ); + setSavedBufferList(updatedSavedList); + } + }; + + console.log({ savedBufferList }); + + const handleSave = () => { + const existingData = JSON.parse( + localStorage.getItem(localStorageKey) || "[]" + ); + + // Combine existing data with savedBufferList + const updatedData = [...existingData, ...savedBufferList]; + + const uniqueData = updatedData.reduce((acc, obj) => { + if (!acc.find((item: any) => item.id === obj.id)) { + acc.push(obj); + } + return acc; + }, []); + + // Save the unique data to local storage + localStorage.setItem(localStorageKey, JSON.stringify(uniqueData)); + + // Update the state and clear the buffer + setSavedList(uniqueData); + setSavedBufferList([]); + }; + + const handleRemove = () => { + localStorage.removeItem(localStorageKey); + setSavedList([]); + setSavedBufferList([]); + }; + + const sortItemsByName = () => { + const sortedList = [...filteredBeerList]; + sortedList.sort((a, b) => a.name.localeCompare(b.name)); + return sortedList; + }; + + const sortedList = sortByName ? sortItemsByName() : filteredBeerList; + return (
@@ -19,13 +92,48 @@ const Home = () => {
- - + setFilterText(event?.target.value)} + value={filterText} + /> +
+ {savedBufferList.length > 0 && ( + + )} + + + +
    - {beerList.map((beer, index) => ( + {sortedList.map((beer, index) => (
  • - + handleSaveItems(beer)} + checked={savedBufferList.some( + (item) => item.id === beer.id + )} + /> {beer.name} @@ -39,7 +147,7 @@ const Home = () => {

    Saved items

    -