11import { FC , useEffect , useRef , useState } from "react" ;
22import { useAppSelector , useAppDispatch } from "../redux/hooks" ;
3- import { addCategories , addProducts } from "../redux/features/productSlice" ;
3+ import { addProducts } from "../redux/features/productSlice" ;
44import ProductCard from "../components/ProductCard" ;
55import { Product } from "../models/Product" ;
66
77const AllProducts : FC = ( ) => {
88 const dispatch = useAppDispatch ( ) ;
9- const [ category , setCategory ] = useState ( "all" ) ;
109 const sortRef = useRef < HTMLSelectElement > ( null ) ;
1110 const [ currentProducts , setCurrentProducts ] = useState < Product [ ] > ( [ ] ) ;
1211 const allProducts = useAppSelector (
1312 ( state ) => state . productReducer . allProducts
1413 ) ;
15- const allCategories = useAppSelector (
16- ( state ) => state . productReducer . categories
17- ) ;
1814
1915 useEffect ( ( ) => {
2016 const fetchProducts = ( ) => {
21- fetch ( "https://dummyjson.com/products?limit=100 " )
17+ fetch ( "https://dummyjson.com/products?limit=500 " )
2218 . then ( ( res ) => res . json ( ) )
2319 . then ( ( { products } ) => {
2420 dispatch ( addProducts ( products ) ) ;
2521 } ) ;
2622 } ;
27- const fetchCategories = ( ) => {
28- fetch ( "https://dummyjson.com/products/categories" )
29- . then ( ( res ) => res . json ( ) )
30- . then ( ( data ) => {
31- dispatch ( addCategories ( data ) ) ;
32- } ) ;
33- } ;
23+
3424 if ( allProducts . length === 0 ) fetchProducts ( ) ;
35- if ( allCategories . length === 0 ) fetchCategories ( ) ;
36- } , [ allProducts , allCategories , dispatch ] ) ;
25+ } , [ allProducts , dispatch ] ) ;
3726
3827 useEffect ( ( ) => {
3928 setCurrentProducts ( allProducts ) ;
4029 } , [ allProducts ] ) ;
4130
42- useEffect ( ( ) => {
43- if ( category !== "all" ) {
44- const updated = allProducts . filter ( ( pro ) => pro . category === category ) ;
45- setCurrentProducts ( updated ) ;
46- }
47- } , [ category , allProducts ] ) ;
48-
4931 const sortProducts = ( sortValue : string ) => {
5032 if ( sortValue === "asc" ) {
5133 setCurrentProducts (
@@ -74,35 +56,10 @@ const AllProducts: FC = () => {
7456
7557 return (
7658 < div className = "container mx-auto min-h-[83vh] p-4 font-karla" >
77- < div className = "grid grid-cols-5 gap-1" >
78- < div className = "col-span-1" >
79- < h1 className = "font-bold mb-2 dark:text-white" > Categories</ h1 >
80- < div className = "space-y-1" >
81- { allCategories . map ( ( _category ) => (
82- < div
83- key = { _category . slug }
84- className = { `cursor-pointer dark:text-white hover:text-blue-500 ${
85- _category . slug === category ? "text-blue-500" : ""
86- } `}
87- onClick = { ( ) => {
88- setCategory ( _category . slug ) ;
89- if ( sortRef && sortRef . current )
90- sortRef . current . value = "default" ;
91- sortProducts ( "default" ) ;
92- } }
93- >
94- { _category . name }
95- </ div >
96- ) ) }
97- </ div >
98- </ div >
59+ < div className = "grid grid-cols-4 gap-1" >
9960 < div className = "col-span-4 space-y-4" >
10061 < div className = "flex items-center justify-between" >
101- < div className = "flex items-center space-x-2 text-lg dark:text-white" >
102- < span > Products</ span >
103- < span > { ">" } </ span >
104- < span className = "font-bold" > { category } </ span >
105- </ div >
62+ < span className = "text-lg dark:text-white" > Products</ span >
10663 < select
10764 ref = { sortRef }
10865 className = "border border-black dark:border-white rounded p-1 dark:text-white dark:bg-slate-600"
@@ -113,7 +70,7 @@ const AllProducts: FC = () => {
11370 < option value = "desc" > Price (high to low)</ option >
11471 </ select >
11572 </ div >
116- < div className = "grid gap-4 xl:grid-cols-3 lg:grid-cols-2 md:grid-cols-1" >
73+ < div className = "grid gap-4 xl:grid-cols-4 lg:grid-cols-3 md:grid-cols-2 sm :grid-cols-1" >
11774 { currentProducts . map ( ( product ) => (
11875 < ProductCard key = { product . id } { ...product } />
11976 ) ) }
0 commit comments