Untitled

mail@pastecode.io avatar
unknown
javascript
12 days ago
18 kB
2
Indexable
Never
export async function loader({ params, context, request }: LoaderArgs) {
  const { handle, subcategory } = params;
  const { session } = context;
  const url = new URL(request.url);


  try {
    var reqMetaobjects = await fetchAPI("/api/shopify/metaobjects-new", {
      method: "POST",
      headers: {
        'Content-Type': 'application/json',
      },
      body: JSON.stringify({
        "first": 250,
        "type": ["tipologia_prodotto", "tipo_di_pelle", "sostanza_funzionale", "esigenze", 'linee_prodotti', 'zone_prodotti', 'sottocategoria_prodotti', 'card_promozionali']
      })
    }, context, request);
    var listMetaobjects: TReqMetaObjects = { tipo_di_pelle: { nodes: [] }, tipologia_prodotto: { nodes: [] }, sostanza_funzionale: { nodes: [] }, esigenze: { nodes: [] }, linee_prodotti: { nodes: [] }, zone_prodotti: { nodes: [] }, sottocategoria_prodotti: { nodes: [] }, card_promozionali: { nodes: [] } };
    if (reqMetaobjects.status == 200) {
      listMetaobjects = await reqMetaobjects.json() as TReqMetaObjects;

      listMetaobjects.tipo_di_pelle.nodes = listMetaobjects.tipo_di_pelle.nodes.map((item) => {
        var title = item.fields.filter((e) => e.key == "titolo");
        return { ...item, displayName: title[0].value }
      });
      listMetaobjects.tipologia_prodotto.nodes = listMetaobjects.tipologia_prodotto.nodes.map((item) => {
        var title = item.fields.filter((e) => e.key == "titolo");
        return { ...item, displayName: title[0].value }
      });
      listMetaobjects.sostanza_funzionale.nodes = listMetaobjects.sostanza_funzionale.nodes.map((item) => {
        var title = item.fields.filter((e) => e.key == "titolo");
        return { ...item, displayName: title[0].value }
      });
      listMetaobjects.esigenze.nodes = listMetaobjects.esigenze.nodes.map((item) => {
        var title = item.fields.filter((e) => e.key == "titolo");
        return { ...item, displayName: title[0].value }
      });
      listMetaobjects.linee_prodotti.nodes = listMetaobjects.linee_prodotti.nodes.map((item) => {
        var title = item.fields.filter((e) => e.key == "titolo");
        return { ...item, displayName: title[0].value }
      });
      listMetaobjects.zone_prodotti.nodes = listMetaobjects.zone_prodotti.nodes.map((item) => {
        var title = item.fields.filter((e) => e.key == "titolo");
        return { ...item, displayName: title[0].value }
      });
      listMetaobjects.sottocategoria_prodotti.nodes = listMetaobjects.sottocategoria_prodotti.nodes.map((item) => {
        var title = item.fields.filter((e) => e.key == "titolo");
        return { ...item, displayName: title[0].value }
      });
      listMetaobjects.card_promozionali.nodes = listMetaobjects.card_promozionali.nodes.map((item) => {
        var title = item.fields.filter((e) => e.key == "titolo");
        return { ...item, displayName: title[0].value }
      });
    } else {
      throw new Error(JSON.stringify(reqMetaobjects));
    }
  } catch (error) {
    console.log(error)
    throw new Error("E101: Errore nel recuperare le tipologie di prodotti.");
  }



  var hide_filter = {
    tipologia_prodotto: false,
    tipo_di_pelle: false,
    esigenze: false,
    sostanza_funzionale: false,
    linee_prodotti: false,
    zone_prodotti: false,
    sottocategoria_prodotti: false
  }
  try {
    var filters: any = [];
    if (subcategory) {
      var filter_tp = listMetaobjects.tipologia_prodotto.nodes.filter((e) => toSeoUrl(e.displayName).toLowerCase() == subcategory.toLowerCase());
      var filter_tpl = listMetaobjects.tipo_di_pelle.nodes.filter((e) => toSeoUrl(e.displayName).toLowerCase() == subcategory.toLowerCase());
      var filter_es = listMetaobjects.esigenze.nodes.filter((e) => toSeoUrl(e.displayName).toLowerCase() == subcategory.toLowerCase());
      var filter_sf = listMetaobjects.sostanza_funzionale.nodes.filter((e) => toSeoUrl(e.displayName).toLowerCase() == subcategory.toLowerCase());
      var filter_linee = listMetaobjects.linee_prodotti.nodes.filter((e) => toSeoUrl(e.displayName).toLowerCase() == subcategory.toLowerCase());
      var filter_zone = listMetaobjects.zone_prodotti.nodes.filter((e) => toSeoUrl(e.displayName).toLowerCase() == subcategory.toLowerCase());
      var filter_sottocategoria = listMetaobjects.sottocategoria_prodotti.nodes.filter((e) => toSeoUrl(e.displayName).toLowerCase() == subcategory.toLowerCase());

      if (filter_tp.length > 0) {
        hide_filter.tipologia_prodotto = true;
        filters.push({ "productMetafield": { "namespace": "custom", "key": "tipologia_prodotto", "value": filter_tp[0].displayName } });
      }
      if (filter_tpl.length > 0) {
        hide_filter.tipo_di_pelle = true;
        filters.push({ "productMetafield": { "namespace": "custom", "key": "tipo_di_pelle", "value": filter_tpl[0].displayName } });
      }
      if (filter_es.length > 0) {
        hide_filter.esigenze = true;
        filters.push({ "productMetafield": { "namespace": "custom", "key": "esigenze", "value": filter_es[0].displayName } });
      }
      if (filter_sf.length > 0) {
        hide_filter.sostanza_funzionale = true;
        filters.push({ "productMetafield": { "namespace": "custom", "key": "sostanza_funzionale", "value": filter_sf[0].displayName } });
      }
      if (filter_linee.length > 0) {
        hide_filter.linee_prodotti = true;
        filters.push({ "productMetafield": { "namespace": "custom", "key": "sostanza_funzionale", "value": filter_linee[0].displayName } });
      }
      if (filter_zone.length > 0) {
        hide_filter.zone_prodotti = true;
        filters.push({ "productMetafield": { "namespace": "custom", "key": "zone", "value": filter_linee[0].displayName } });
      }
      if (filter_sottocategoria.length > 0) {
        hide_filter.sottocategoria_prodotti = true;
        filters.push({ "productMetafield": { "namespace": "custom", "key": "filtro_sottocategorie", "value": filter_sottocategoria[0].displayName } });
      }

      if (!hide_filter.sostanza_funzionale && !hide_filter.tipo_di_pelle && !hide_filter.esigenze && !hide_filter.tipologia_prodotto && !hide_filter.linee_prodotti) {
        // throw new Response(null, {
        //   status: 404,
        //   statusText: "Not Found",
        // })
      }
    }



    const params_tp = url.searchParams.get("tp");
    if (params_tp && !hide_filter.tipologia_prodotto) {
      var list = params_tp.split(",");
      list.forEach((item) => {
        var filter_tp = listMetaobjects.tipologia_prodotto.nodes.filter((e) => e.displayName.toLowerCase() == item.toLowerCase());
        if (filter_tp.length > 0) {
          filters.push({ "productMetafield": { "namespace": "custom", "key": "tipologia_prodotto", "value": item } })
        }
      })
    }

    const params_tpl = url.searchParams.get("tpl");
    if (params_tpl && !hide_filter.tipo_di_pelle) {
      var list = params_tpl.split(",");
      list.forEach((item) => {
        var filter_tp = listMetaobjects.tipo_di_pelle.nodes.filter((e) => e.displayName.toLowerCase() == item.toLowerCase());
        if (filter_tp.length > 0) {
          filters.push({ "productMetafield": { "namespace": "custom", "key": "tipo_di_pelle", "value": item } })
        }
      })
    }

    const params_es = url.searchParams.get("es");
    if (params_es && !hide_filter.esigenze) {
      var list = params_es.split(",");
      list.forEach((item) => {
        var filter_es = listMetaobjects.esigenze.nodes.filter((e) => e.displayName.toLowerCase() == item.toLowerCase());
        if (filter_es.length > 0) {
          filters.push({ "productMetafield": { "namespace": "custom", "key": "esigenze", "value": item } })
        }
      })
    }

    const params_linee = url.searchParams.get("linee");
    if (params_linee && !hide_filter.linee_prodotti) {
      var list = params_linee.split(",");
      list.forEach((item) => {
        var filter_linee = listMetaobjects.linee_prodotti.nodes.filter((e) => e.displayName.toLowerCase() == item.toLowerCase());
        if (filter_linee.length > 0) {
          filters.push({ "productMetafield": { "namespace": "custom", "key": "linee", "value": item } })
        }
      })
    }

    const params_zone = url.searchParams.get("zone");
    if (params_zone && !hide_filter.zone_prodotti) {
      var list = params_zone.split(",");
      list.forEach((item) => {
        var filter_zone = listMetaobjects.zone_prodotti.nodes.filter((e) => e.displayName.toLowerCase() == item.toLowerCase());
        if (filter_zone.length > 0) {
          filters.push({ "productMetafield": { "namespace": "custom", "key": "zone", "value": item } })
        }
      })
    }

    const params_sottocategoria = url.searchParams.get("sottocategoria");
    if (params_sottocategoria && !hide_filter.sottocategoria_prodotti) {
      var list = params_sottocategoria.split(",");
      list.forEach((item) => {
        var filter_sottocategoria = listMetaobjects.sottocategoria_prodotti.nodes.filter((e) => e.displayName.toLowerCase() == item.toLowerCase());
        if (filter_sottocategoria.length > 0) {
          filters.push({ "productMetafield": { "namespace": "custom", "key": "filtro_sottocategorie", "value": item } })
        }
      })
    }

    const params_sf = url.searchParams.get("sf");
    if (params_sf && !hide_filter.sostanza_funzionale) {
      var list = params_sf.split(",");
      list.forEach((item) => {
        var filter_tp = listMetaobjects.sostanza_funzionale.nodes.filter((e) => e.displayName.toLowerCase() == item.toLowerCase());
        if (filter_tp.length > 0) {
          filters.push({ "productMetafield": { "namespace": "custom", "key": "sostanza_funzionale", "value": item } })
        }
      })
    }

    const params_eta = url.searchParams.get("eta");
    if (params_eta) {
      var list = params_eta.split(",");
      list.forEach((item) => {
        filters.push({ "productMetafield": { "namespace": "custom", "key": "fascia_di_et_", "value": item } })
      })
    }

    const params_travel = url.searchParams.get("travel");
    if (params_travel == "1") {
      filters.push({ "productMetafield": { "namespace": "custom", "key": "variante_travel", "value": "true" } });
    }
    if (params_travel == "2") {
      filters.push({ "productMetafield": { "namespace": "custom", "key": "variante_travel", "value": "false" } });
    }
    var order: any = {};
    const params_order = url.searchParams.get("order");
    if (params_order) {
      switch (params_order) {
        case "piu-votati":
          order = {
            "sortKey": "TITLE",
            "sort": true
          }
          break;
        case "novita":
          order = {
            "sortKey": "CREATED",
            "sort": true
          }
          break;
        case "bestseller":
          order = {
            "sortKey": "BEST_SELLING",
            "sort": true
          }
          break;
        case "prezzo-crescente":
          order = {
            "sortKey": "PRICE",
            "sort": false
          }
          break;
        case "prezzo-decrescente":
          order = {
            "sortKey": "PRICE",
            "sort": true
          }
          break;
        default:
          break;
      }
    } else {
      order = {
        "sortKey": "CREATED",
        "sort": true
      }
    }

    const params_price = url.searchParams.get("price");
    if (params_price) {
      var list = params_price.split("-");
      filters.push({ "price": { "min": parseInt(list[0]), "max": parseInt(list[1]) } })
    }


    // CINICA-862 Calcola il numero di card promozionali per l'handle corrente
    const nOfCardPromozionali = () => {
      if (!handle) return 0;

      const correspondingItems = listMetaobjects.card_promozionali.nodes.filter(
        (item) => item.handle?.includes(handle),
      );
      if(!correspondingItems.length) return 0
      //  Hanno inserito più di 2 carte per corpo, questo sfasa i calcoli 
      // e comunque ne mostriamo sempre solo 2
      if(correspondingItems.length > 2) return 2
      return correspondingItems.length
    };

    var reqCollection = await fetchAPI("/api/shopify/products-collection", {
      method: "POST",
      headers: {
        'Content-Type': 'application/json',
      },
      body: JSON.stringify({
        "collection_filters": true,
        "handle": handle,
        // CINICA-862 fetch 12 - n of card_promozionali per l'handle corrente
        // in questo modo le card mostrate inizialmente sono sempre 12 
        // e poi fetchandone con "carica altro" il numero totale rimane multiplo di 4
        // Cosi l'ultima riga prima di "carica altro" è sempre full
        "first": (12 - nOfCardPromozionali()),
        "cursor": null,
        "filters": filters,
        "firstVariant": 40,
        "subcategory": subcategory || "",
        "language": params.language ? params.language.toUpperCase() : "IT",
        "country": "IT",
        ...order
      })
    }, context, request);

    var collection: TSingleCollection & { list_filters: any } | null = null;
    if (reqCollection.status == 200) {
      collection = await reqCollection.json() as TSingleCollection & { list_filters: any };
    } else {
      var error = await reqCollection.json() as any;
      throw new Error(JSON.stringify(error));
    }
  } catch (error) {
    console.log(error)
    throw new Error("E101: Errore nel recuperare i dati della collection.");
  }


  var infoCollection = {
    "title": collection.title,
    "descrizione": collection.descriptionHtml,
    "category": false
  } as { title: string, descrizione: string, category: boolean };

  if (subcategory) {
    var filter_tp = listMetaobjects.tipologia_prodotto.nodes.filter((e) => toSeoUrl(e.displayName).toLowerCase() == subcategory.toLowerCase());
    var filter_tpl = listMetaobjects.tipo_di_pelle.nodes.filter((e) => toSeoUrl(e.displayName).toLowerCase() == subcategory.toLowerCase());
    var filter_es = listMetaobjects.esigenze.nodes.filter((e) => toSeoUrl(e.displayName).toLowerCase() == subcategory.toLowerCase());
    var filter_sf = listMetaobjects.sostanza_funzionale.nodes.filter((e) => toSeoUrl(e.displayName).toLowerCase() == subcategory.toLowerCase());
    var filter_linee = listMetaobjects.linee_prodotti.nodes.filter((e) => toSeoUrl(e.displayName).toLowerCase() == subcategory.toLowerCase());
    var filter_zone = listMetaobjects.zone_prodotti.nodes.filter((e) => toSeoUrl(e.displayName).toLowerCase() == subcategory.toLowerCase());
    var filter_sottocategoria = listMetaobjects.sottocategoria_prodotti.nodes.filter((e) => toSeoUrl(e.displayName).toLowerCase() == subcategory.toLowerCase());

    if (filter_tp.length > 0) {
      var title = filter_tp[0].displayName;
      var check_description = filter_tp[0].fields.filter((e) => e.key == "descrizione");
      var descrizione = "";
      if (check_description.length > 0 && check_description[0].value) {
        descrizione = toHTML(check_description[0].value);
      }
      infoCollection = {
        "title": title,
        "descrizione": descrizione,
        "category": true
      };
    }

    if (filter_tpl.length > 0) {
      var title = filter_tpl[0].displayName;
      var check_description = filter_tpl[0].fields.filter((e) => e.key == "descrizione");
      var descrizione = "";
      if (check_description.length > 0 && check_description[0].value) {
        descrizione = toHTML(check_description[0].value);
      }
      infoCollection = {
        "title": title,
        "descrizione": descrizione,
        "category": true
      };
    }

    if (filter_es.length > 0) {
      var title = filter_es[0].displayName;
      var check_description = filter_es[0].fields.filter((e) => e.key == "descrizione");
      var descrizione = "";
      if (check_description.length > 0 && check_description[0].value) {
        descrizione = toHTML(check_description[0].value);
      }
      infoCollection = {
        "title": title,
        "descrizione": descrizione,
        "category": true
      };
    }


    if (filter_linee.length > 0) {
      var title = filter_linee[0].displayName;
      var check_description = filter_linee[0].fields.filter((e) => e.key == "descrizione");
      var descrizione = "";
      if (check_description.length > 0 && check_description[0].value) {
        descrizione = toHTML(check_description[0].value);
      }
      infoCollection = {
        "title": title,
        "descrizione": descrizione,
        "category": true
      };
    }


    if (filter_zone.length > 0) {
      var title = filter_zone[0].displayName;
      var check_description = filter_zone[0].fields.filter((e) => e.key == "descrizione");
      var descrizione = "";
      if (check_description.length > 0 && check_description[0].value) {
        descrizione = toHTML(check_description[0].value);
      }
      infoCollection = {
        "title": title,
        "descrizione": descrizione,
        "category": true
      };
    }


    if (filter_sottocategoria.length > 0) {
      var title = filter_sottocategoria[0].displayName;
      var check_description = filter_sottocategoria[0].fields.filter((e) => e.key == "descrizione");
      var descrizione = "";
      if (check_description.length > 0 && check_description[0].value) {
        descrizione = toHTML(check_description[0].value);
      }
      infoCollection = {
        "title": title,
        "descrizione": descrizione,
        "category": true
      };
    }


    if (filter_sf.length > 0) {
      var title = filter_sf[0].displayName;
      var check_description = filter_sf[0].fields.filter((e) => e.key == "descrizione");
      var descrizione = "";
      if (check_description.length > 0 && check_description[0].value) {
        descrizione = toHTML(check_description[0].value);
      }
      infoCollection = {
        "title": title,
        "descrizione": descrizione,
        "category": true
      };
    }

  }

  return defer({
    metaobjects: listMetaobjects,
    collection: collection,
    infoCollection: infoCollection,
    hide_filter: hide_filter,
    initialFilters: filters
  });
}
Leave a Comment