Files
web/app/page.js
Husanjonazamov 64af77101f classify web
2026-02-24 12:52:49 +05:00

203 lines
6.1 KiB
JavaScript

import Layout from "@/components/Layout/Layout";
import StructuredData from "@/components/Layout/StructuredData";
import Home from "@/components/PagesComponent/Home/Home";
import { SEO_REVALIDATE_SECONDS } from "@/lib/constants";
export const generateMetadata = async ({ searchParams }) => {
if (process.env.NEXT_PUBLIC_SEO === "false") return;
const langCode = (await searchParams)?.lang;
try {
const res = await fetch(
`${process.env.NEXT_PUBLIC_API_URL}${process.env.NEXT_PUBLIC_END_POINT}seo-settings?page=home`,
{
headers: {
"Content-Language": langCode || "en",
},
next: {
revalidate: SEO_REVALIDATE_SECONDS,
},
}
);
const data = await res.json();
const home = data?.data?.[0];
return {
title: home?.translated_title || process.env.NEXT_PUBLIC_META_TITLE,
description:
home?.translated_description ||
process.env.NEXT_PUBLIC_META_DESCRIPTION,
openGraph: {
images: home?.image ? [home?.image] : [],
},
keywords:
home?.translated_keywords || process.env.NEXT_PUBLIC_META_kEYWORDS,
};
} catch (error) {
console.error("Error fetching MetaData:", error);
return null;
}
};
const fetchCategories = async (langCode) => {
if (process.env.NEXT_PUBLIC_SEO === "false") return [];
try {
const res = await fetch(
`${process.env.NEXT_PUBLIC_API_URL}${process.env.NEXT_PUBLIC_END_POINT}get-categories?page=1`,
{
headers: {
"Content-Language": langCode || "en",
},
next: {
revalidate: SEO_REVALIDATE_SECONDS,
},
}
);
const data = await res.json();
return data?.data?.data || [];
} catch (error) {
console.error("Error fetching Categories Data:", error);
return [];
}
};
const fetchProductItems = async (langCode) => {
if (process.env.NEXT_PUBLIC_SEO === "false") return [];
try {
const res = await fetch(
`${process.env.NEXT_PUBLIC_API_URL}${process.env.NEXT_PUBLIC_END_POINT}get-item?page=1`,
{
headers: {
"Content-Language": langCode || "en",
},
next: {
revalidate: SEO_REVALIDATE_SECONDS,
},
}
);
const data = await res.json();
return data?.data?.data || [];
} catch (error) {
console.error("Error fetching Product Items Data:", error);
return [];
}
};
const fetchFeaturedSections = async (langCode) => {
if (process.env.NEXT_PUBLIC_SEO === "false") return [];
try {
const res = await fetch(
`${process.env.NEXT_PUBLIC_API_URL}${process.env.NEXT_PUBLIC_END_POINT}get-featured-section`,
{
headers: {
"Content-Language": langCode || "en",
},
next: {
revalidate: SEO_REVALIDATE_SECONDS,
},
}
);
const data = await res.json();
return data?.data || [];
} catch (error) {
console.error("Error fetching Featured sections Data:", error);
return [];
}
};
export default async function HomePage({ searchParams }) {
const langCode = (await searchParams)?.lang;
const [categoriesData, productItemsData, featuredSectionsData] =
await Promise.all([
fetchCategories(langCode),
fetchProductItems(langCode),
fetchFeaturedSections(langCode),
]);
let jsonLd = null;
if (process.env.NEXT_PUBLIC_SEO !== "false") {
const existingSlugs = new Set(
productItemsData.map((product) => product.slug)
);
let featuredItems = [];
featuredSectionsData.forEach((section) => {
section.section_data.slice(0, 4).forEach((item) => {
if (!existingSlugs.has(item.slug)) {
featuredItems.push(item);
existingSlugs.add(item.slug); // Mark this item as included
}
});
});
jsonLd = {
"@context": "https://schema.org",
"@type": "ItemList",
itemListElement: [
...categoriesData.map((category, index) => ({
"@type": "ListItem",
position: index + 1,
item: {
"@type": "Thing", // No "Category" type in Schema.org
name: category?.translated_name,
url: `${process.env.NEXT_PUBLIC_WEB_URL}/ads?category=${category?.slug}`,
},
})),
...productItemsData.map((product, index) => ({
"@type": "ListItem",
position: categoriesData?.length + index + 1, // Ensure unique positions
item: {
"@type": "Product",
name: product?.translated_item?.name,
productID: product?.id,
description: product?.translated_item?.description,
image: product?.image,
url: `${process.env.NEXT_PUBLIC_WEB_URL}/ad-details/${product?.slug}`,
category: product?.category?.translated_name,
...(product?.price && {
offers: {
"@type": "Offer",
price: product?.price,
priceCurrency: "USD",
},
}),
countryOfOrigin: product?.translated_item?.country,
},
})),
...featuredItems.map((item, index) => ({
"@type": "ListItem",
position: categoriesData.length + productItemsData.length + index + 1, // Ensure unique positions
item: {
"@type": "Product", // Assuming items from featured sections are products
name: item?.translated_item?.name,
productID: item?.id,
description: item?.translated_item?.description,
image: item?.image,
url: `${process.env.NEXT_PUBLIC_WEB_URL}/ad-details/${item?.slug}`,
category: item?.category?.translated_name,
...(item?.price && {
offers: {
"@type": "Offer",
price: item?.price,
priceCurrency: "USD",
},
}),
countryOfOrigin: item?.translated_item?.country,
},
})),
],
};
}
return (
<>
{jsonLd && <StructuredData data={jsonLd} />}
<Layout>
<Home productItemsData={productItemsData} />
</Layout>
</>
);
}