@@ -70,51 +70,7 @@ export default function Products() {
7070 } ) ;
7171 } , [ allProducts , filters , maxProductPrice ] ) ;
7272
73- // Apply client-side sorting to filtered products
74- const sortedProducts = useMemo ( ( ) => {
75- if ( ! filteredProducts || filteredProducts . length === 0 ) return [ ] ;
76-
77- // shallow copy to avoid mutating original array
78- const copy = [ ...filteredProducts ] ;
79-
80- const getString = ( p , key ) => ( p [ key ] || p . name || p . title || '' ) . toString ( ) . toLowerCase ( ) ;
81- const getNumber = ( p , key ) => {
82- const val = p [ key ] ;
83- if ( val === undefined || val === null || val === '' ) return 0 ;
84- const n = Number ( val ) ;
85- return Number . isNaN ( n ) ? 0 : n ;
86- } ;
87-
88- switch ( `${ sortBy } :${ sortOrder } ` ) {
89- case 'title:asc' :
90- copy . sort ( ( a , b ) => getString ( a , 'name' ) . localeCompare ( getString ( b , 'name' ) ) ) ;
91- break ;
92- case 'title:desc' :
93- copy . sort ( ( a , b ) => getString ( b , 'name' ) . localeCompare ( getString ( a , 'name' ) ) ) ;
94- break ;
95- case 'price:asc' :
96- copy . sort ( ( a , b ) => getNumber ( a , 'price' ) - getNumber ( b , 'price' ) ) ;
97- break ;
98- case 'price:desc' :
99- copy . sort ( ( a , b ) => getNumber ( b , 'price' ) - getNumber ( a , 'price' ) ) ;
100- break ;
101- case 'rating:asc' :
102- copy . sort ( ( a , b ) => getNumber ( a , 'rating' ) - getNumber ( b , 'rating' ) ) ;
103- break ;
104- case 'rating:desc' :
105- copy . sort ( ( a , b ) => getNumber ( b , 'rating' ) - getNumber ( a , 'rating' ) ) ;
106- break ;
107- case 'featured:desc' :
108- default :
109- // Featured (placeholder) - keep backend/default ordering
110- break ;
111- }
112-
113- return copy ;
114- } , [ filteredProducts , sortBy , sortOrder ] ) ;
115-
116- // Simple display of filtered products with pagination/infinite scroll
117- const displayedProducts = sortedProducts . slice ( 0 , displayedCount ) ;
73+ const displayedProducts = filteredProducts . slice ( 0 , displayedCount ) ;
11874 const hasMoreProducts = displayedCount < filteredProducts . length ;
11975
12076 // Infinite scroll callback
@@ -135,7 +91,7 @@ export default function Products() {
13591 ) ;
13692
13793 useEffect ( ( ) => {
138- dispatch ( fetchProducts ( { page : 1 , limit : 1000 } ) ) ;
94+ dispatch ( fetchProducts ( { page : 1 , limit : 1000 , sort : 'feature' } ) ) ;
13995 } , [ dispatch ] ) ;
14096
14197 return (
@@ -174,7 +130,7 @@ export default function Products() {
174130 < section className = "max-w-6xl mx-auto px-4 sm:px-6 lg:px-8 py-8" >
175131 < div className = "flex flex-col sm:flex-row sm:justify-between sm:items-center gap-4" >
176132 { /* Left: All Filters button (full width on mobile) */ }
177- < button onClick = { ( ) => setIsFilterOpen ( true ) } className = "w-full sm:w-auto flex items-center justify-center gap-2 bg-transparent text-gray-700 px-4 py-2 sm:px-6 sm:py-3 rounded-lg font-medium border border-gray-300 hover:border-blue-500 hover:text-blue-600 hover:bg-blue-50 transition-all duration-300" >
133+ < button onClick = { ( ) => setIsFilterOpen ( true ) } className = "w-full sm:w-auto flex items-center justify-center gap-2 bg-transparent text-gray-700 px-4 py-2 sm:px-6 sm:py-3 rounded-lg font-medium border border-gray-300 hover:border-blue-500 hover:text-blue-600 hover:bg-blue-50 transition-all duration-300 cursor-pointer " >
178134 < span className = "hidden sm:inline" > All Filters</ span >
179135 < span className = "sm:hidden" > Filters</ span >
180136 < svg
@@ -197,11 +153,24 @@ export default function Products() {
197153 sortBy = { sortBy }
198154 sortOrder = { sortOrder }
199155 onSortChange = { ( field , order ) => {
200- // If user chooses Featured (placeholder), map empty or featured
201- setSortBy ( field || 'featured' ) ;
156+ // Update local sort state
157+ setSortBy ( field || 'featured' ) ;
202158 setSortOrder ( order || 'desc' ) ;
203- // reset displayed count to show top results
204159 setDisplayedCount ( 12 ) ;
160+
161+ // Map selection to backend sort key
162+ // Supported backend keys: feature (default), a-z, z-a, price_asc, price_desc, rating_asc, rating_desc
163+ let sortKey = 'feature' ;
164+ if ( field === 'title' && order === 'asc' ) sortKey = 'a-z' ;
165+ else if ( field === 'title' && order === 'desc' ) sortKey = 'z-a' ;
166+ else if ( field === 'price' && order === 'asc' ) sortKey = 'price_asc' ;
167+ else if ( field === 'price' && order === 'desc' ) sortKey = 'price_desc' ;
168+ else if ( field === 'rating' && order === 'asc' ) sortKey = 'rating_asc' ;
169+ else if ( field === 'rating' && order === 'desc' ) sortKey = 'rating_desc' ;
170+ else sortKey = 'feature' ;
171+
172+ // Fetch products from backend with sort
173+ dispatch ( fetchProducts ( { page : 1 , limit : 1000 , sort : sortKey } ) ) ;
205174 } }
206175 />
207176 </ div >
0 commit comments