@@ -4,7 +4,7 @@ import { useState, useEffect, use, Suspense, lazy, useMemo } from "react"
44import { Product } from "@/types/product"
55import { Review } from "@/types/review"
66import { ReviewSummary } from "@/types/reviewSummary"
7- import { getProduct , getProductReviews , getReviewSummary , getBrandById , getProductsWithGenericName , getProductsByBrand , getUserById } from "@/lib/api"
7+ import { getProduct , getProductReviews , getReviewSummary , getBrandById , getProductsByBrand , getUserById , getSimilarProductsByCategories } from "@/lib/api"
88import { onAuthStateChanged , User } from "firebase/auth"
99import { auth } from "@/lib/firebaseClient"
1010import { useRouter } from "next/navigation"
@@ -152,6 +152,11 @@ export default function ProductPage({ params }: { params: Promise<{ id: string }
152152 } > ( { min : 0 , max : 0 , q1 : 0 , median : 0 , q3 : 0 } ) ;
153153 const [ showAllergenWarning , setShowAllergenWarning ] = useState ( false ) ;
154154 const [ allergenWarningDismissed , setAllergenWarningDismissed ] = useState ( false ) ;
155+
156+ const sameProducts = useMemo ( ( ) => {
157+ if ( ! product ) return [ ] ;
158+ return [ ...similarProducts . filter ( p => p . categoriesTags . includes ( product . categoriesTags [ product . categoriesTags . length - 1 ] ) ) , product ] ;
159+ } , [ similarProducts , product ] ) ;
155160
156161 // Calculate all radar chart scores
157162 const priceScore = product ? getQuartileScore ( product . price || 0 , priceStats . q1 , priceStats . q3 ) : 3 ;
@@ -199,11 +204,10 @@ export default function ProductPage({ params }: { params: Promise<{ id: string }
199204 // Filter out the current product and limit to 8 products
200205 setBrandProducts ( brandProds . filter ( p => p . id !== id ) . slice ( 0 , 8 ) ) ;
201206 }
202- // Fetch similar products based on genericName
203- if ( productData . genericNameLower ) {
204- const similar = await getProductsWithGenericName ( productData . genericNameLower ) ;
205- // Filter out the current product and limit to 8 products
206- setSimilarProducts ( similar . filter ( p => p . id !== id ) . slice ( 0 , 8 ) ) ;
207+ // Fetch similar products based on categories_tags
208+ if ( productData . categoriesTags && productData . categoriesTags . length > 0 ) {
209+ const similar = await getSimilarProductsByCategories ( productData . categoriesTags , id ) ;
210+ setSimilarProducts ( similar ) ;
207211 }
208212 }
209213 setLoading ( false ) ;
@@ -320,11 +324,11 @@ export default function ProductPage({ params }: { params: Promise<{ id: string }
320324
321325 // Calculate price statistics when similar products change
322326 useEffect ( ( ) => {
323- if ( ! product || ! similarProducts . length ) return ;
327+ if ( ! product || ! ( sameProducts . length - 1 ) ) return ;
324328
325329 const getPrice = ( p : Product ) => p . price || p . expectedPrice || 0 ;
326- const prices = [ ...similarProducts . map ( getPrice ) , getPrice ( product ) ] . filter ( p => p > 0 ) ;
327-
330+ const prices = [ ...sameProducts . map ( getPrice ) , getPrice ( product ) ] . filter ( p => p > 0 ) ;
331+
328332 if ( prices . length ) {
329333 setPriceStats ( {
330334 min : Math . min ( ...prices ) ,
@@ -334,7 +338,7 @@ export default function ProductPage({ params }: { params: Promise<{ id: string }
334338 q3 : calculateQuartile ( prices , 0.75 )
335339 } ) ;
336340 }
337- } , [ similarProducts , product ] ) ;
341+ } , [ sameProducts , product ] ) ;
338342
339343 if ( loading ) {
340344 return < LoadingAnimation /> ;
@@ -427,8 +431,8 @@ export default function ProductPage({ params }: { params: Promise<{ id: string }
427431 brandRating = { brandRating }
428432 brandProducts = { brandProducts }
429433 priceStats = { priceStats }
430- maxPriceProduct = { similarProducts . reduce ( ( max , p ) => ( ! max || ( p . price || 0 ) > ( max . price || 0 ) ) ? p : max , null ) }
431- minPriceProduct = { similarProducts . reduce ( ( min , p ) => ( ! min || ( p . price || 0 ) < ( min . price || 0 ) ) ? p : min , null ) }
434+ maxPriceProduct = { sameProducts . reduce ( ( max , p ) => ( ! max || ( p . price || 0 ) > ( max . price || 0 ) ) ? p : max , null ) }
435+ minPriceProduct = { sameProducts . reduce ( ( min , p ) => ( ! min || ( p . price || 0 ) < ( min . price || 0 ) ) ? p : min , null ) }
432436 />
433437 { ( product . alergenInformation && product . alergenInformation . length > 0 || product . labels && product . labels . length > 0 || product . countryOfOriginCode ) && (
434438 < div className = "w-full" >
0 commit comments