2

I am building an e-commerce web app in Next.js and I got stuck on product filtering. Let's say there are 3 possible filtering options:

  1. by category - dioptric / sunglasses
  2. by sex - men / women
  3. by brand - rayban / gucci

Now, the filters should work as subpages. Let's say the user chose sunglasses for men, so the URL should look like this: /sunglasses/men. Now, here are 4 possible example URLs on my website:

  1. /sunglasses/men
  2. /sunglasses/rayban
  3. /sunglasses/men/rayban
  4. /sunglasses/rayban/men

I cannot figure out how the router should be able to distinguish between the first two URLs and figure out that the second parameter in the first URL is a sex filter, but the second parameter in the second URL is a brand filter.

I am using Next.js and its server side rendering (getServerSideProps).

Thank you for any help.

tomasxboda
  • 539
  • 3
  • 15

3 Answers3

2

If you don't want to create separate routes , you can use below implementation of gerServerSideProps

export async function gerServerSideProps({ params, ...props }) {
  const products = await fetchProducts();
  if (params.slugs && params.slugs instanceof Array) {
    if (params.slugs.length > 2) {
      const filteredProducts = products.filter(
        (p) =>
          p.category === params.slugs[0] &&
          (p.sex === params.slugs[1] || p.sex === params.slugs[2])&&
          (p.brand === params.slugs[1] || p.brand === params.slugs[2])
      );
      return {
        props: {
          products:filteredProducts
        },
      };
    } else if (params.slugs.length > 1) {
        const filteredProducts = products.filter(
            (p) =>
              p.category === params.slugs[0] &&
              (p.sex === params.slugs[1] || 
              p.brand === params.slugs[1])
          );
          return {
            props: {
              products:filteredProducts
            },
          };
      
    } else if(params.slugs.length > 0){
        const filteredProducts = products.filter(
            (p) =>
              p.category === params.slugs[0])
          return {
            props: {
              products:filteredProducts
            },
          };
  }
  else{
    return {
        props: {
          products:[]
        },
    };

}
}
Anish Antony
  • 1,379
  • 8
  • 13
  • Thanks! This seems like the solution I am looking for. I'm going to try this in the next few days and will let you know if it works. – tomasxboda Jul 04 '21 at 15:28
1

You can use the spread operator inside the route name to solve this problem.

#  pages/[...product].ts

Example: pages/sunglasses/men/gucci

Your query object will be like this

{"product": ["sunglasses","men","gucci"]}

More information check Nextjs Docs

juliomalves
  • 42,130
  • 20
  • 150
  • 146
0

You can create a separate folder for routes that have same params.

e.g

1./sunglasses/men

1./pages/sunglasses/gender/[gender].js

2./sunglasses/rayban

2./pages/sunglasses/type/[type].js

3./sunglasses/men/rayban

3./pages/sunglasses/item/[gender]/[item].js

4./sunglasses/rayban/men

4./pages/sunglasses/gender/[item]/[gender].js

Dharman
  • 30,962
  • 25
  • 85
  • 135
  • 1
    Yes, I also came up with this solution but in my app, there are hundreds of variations, so the solution must be dynamic – tomasxboda Jul 04 '21 at 15:30