classify web

This commit is contained in:
Husanjonazamov
2026-02-24 12:52:49 +05:00
commit 64af77101f
310 changed files with 45449 additions and 0 deletions

119
app/blogs/[slug]/page.jsx Normal file
View File

@@ -0,0 +1,119 @@
import StructuredData from "@/components/Layout/StructuredData";
import BlogDetailPage from "@/components/PagesComponent/BlogDetail/BlogDetailPage";
import { SEO_REVALIDATE_SECONDS } from "@/lib/constants";
const stripHtml = (html) => {
return html.replace(/<[^>]*>/g, ""); // Regular expression to remove HTML tags
};
// Function to format the date correctly (ISO 8601)
const formatDate = (dateString) => {
// Remove microseconds and ensure it follows ISO 8601 format
const validDateString = dateString.slice(0, 19) + "Z"; // Remove microseconds and add 'Z' for UTC
return validDateString;
};
export const generateMetadata = async ({ params, searchParams }) => {
try {
if (process.env.NEXT_PUBLIC_SEO === "false") return;
const slugParams = await params;
const langParams = await searchParams;
const langCode = langParams?.lang || "en";
const response = await fetch(
`${process.env.NEXT_PUBLIC_API_URL}${process.env.NEXT_PUBLIC_END_POINT}blogs?slug=${slugParams?.slug}`,
{
headers: {
"Content-Language": langCode || "en",
},
next: {
revalidate: SEO_REVALIDATE_SECONDS,
},
}
);
if (!response.ok) {
throw new Error("Failed to fetch metadata");
}
const responseData = await response.json();
const data = responseData?.data?.data[0];
const plainTextDescription = data?.translated_description?.replace(
/<\/?[^>]+(>|$)/g,
""
);
return {
title: data?.translated_title || process.env.NEXT_PUBLIC_META_TITLE,
description: plainTextDescription
? plainTextDescription
: process.env.NEXT_PUBLIC_META_DESCRIPTION,
openGraph: {
images: data?.image ? [data?.image] : [],
},
keywords: data?.translated_tags || process.env.NEXT_PUBLIC_META_kEYWORDS,
};
} catch (error) {
console.error("Error fetching MetaData:", error);
return null;
}
};
const fetchSingleBlogItem = async (slug, langCode) => {
try {
if (process.env.NEXT_PUBLIC_SEO === "false") return;
const url = `${process.env.NEXT_PUBLIC_API_URL}${process.env.NEXT_PUBLIC_END_POINT}blogs?slug=${slug}`;
const response = await fetch(url, {
headers: {
"Content-Language": langCode || "en",
},
next: {
revalidate: SEO_REVALIDATE_SECONDS,
},
});
if (!response.ok) {
throw new Error("Failed to fetch blog data");
}
const responseData = await response.json();
return responseData?.data?.data[0] || [];
} catch (error) {
console.error("Error fetching Blog Items Data:", error);
return [];
}
};
const BlogPage = async ({ params, searchParams }) => {
const { slug } = await params;
const langCode = (await searchParams).lang || "en";
const singleBlog = await fetchSingleBlogItem(slug, langCode);
const jsonLd = singleBlog
? {
"@context": "https://schema.org",
"@type": "BlogPosting",
headline: singleBlog?.translated_title,
description: singleBlog?.translated_description
? stripHtml(singleBlog.translated_description)
: "No description available", // Strip HTML from description
url: `${process.env.NEXT_PUBLIC_WEB_URL}/blogs/${singleBlog?.slug}`,
image: singleBlog?.image,
datePublished: singleBlog?.created_at
? formatDate(singleBlog.created_at)
: "", // Format date to ISO 8601
keywords: singleBlog?.translated_tags
? singleBlog.translated_tags.join(", ")
: "", // Adding tags as keywords
}
: null;
return (
<>
<StructuredData data={jsonLd} />
<BlogDetailPage slug={slug} />
</>
);
};
export default BlogPage;

123
app/blogs/page.jsx Normal file
View File

@@ -0,0 +1,123 @@
import StructuredData from "@/components/Layout/StructuredData";
import Blogs from "@/components/PagesComponent/Blogs/Blogs";
import { SEO_REVALIDATE_SECONDS } from "@/lib/constants";
export const dynamic = "force-dynamic";
export const generateMetadata = async ({ searchParams }) => {
try {
if (process.env.NEXT_PUBLIC_SEO === "false") return;
const params = await searchParams;
const langCode = params?.lang || "en";
const response = await fetch(
`${process.env.NEXT_PUBLIC_API_URL}${process.env.NEXT_PUBLIC_END_POINT}seo-settings?page=blogs`,
{
headers: {
"Content-Language": langCode || "en",
},
next: {
revalidate: SEO_REVALIDATE_SECONDS,
},
}
);
if (!response.ok) {
throw new Error("Failed to fetch blogs metadata");
}
const data = await response.json();
const blogs = data?.data[0];
return {
title: blogs?.translated_title || process.env.NEXT_PUBLIC_META_TITLE,
description:
blogs?.translated_description ||
process.env.NEXT_PUBLIC_META_DESCRIPTION,
openGraph: {
images: blogs?.image ? [blogs?.image] : [],
},
keywords:
blogs?.translated_keywords || process.env.NEXT_PUBLIC_META_kEYWORDS,
};
} catch (error) {
console.error("Error fetching MetaData:", error);
return null;
}
};
const stripHtml = (html) => {
return html.replace(/<[^>]*>/g, ""); // Regular expression to remove HTML tags
};
// Function to format the date correctly (ISO 8601)
const formatDate = (dateString) => {
// Remove microseconds and ensure it follows ISO 8601 format
const validDateString = dateString.slice(0, 19) + "Z"; // Remove microseconds and add 'Z' for UTC
return validDateString;
};
const fetchBlogItems = async (langCode, tag) => {
try {
if (process.env.NEXT_PUBLIC_SEO === "false") return;
let url = `${process.env.NEXT_PUBLIC_API_URL}${process.env.NEXT_PUBLIC_END_POINT}blogs`;
if (tag) {
url += `?tag=${encodeURIComponent(tag)}`;
}
const response = await fetch(url, {
headers: {
"Content-Language": langCode || "en",
},
next: {
revalidate: SEO_REVALIDATE_SECONDS,
},
});
if (!response.ok) {
throw new Error("Failed to fetch blogs json-ld data");
}
const data = await response.json();
return data?.data?.data || [];
} catch (error) {
console.error("Error fetching Blog Items Data:", error);
return [];
}
};
const BlogsPage = async ({ searchParams }) => {
const params = await searchParams;
const langCode = params?.lang || "en";
const tag = params?.tag || null;
const blogItems = await fetchBlogItems(langCode, tag);
const jsonLd = blogItems
? {
"@context": "https://schema.org",
"@type": "ItemList",
itemListElement: blogItems.map((blog, index) => ({
"@type": "ListItem",
position: index + 1,
item: {
"@type": "BlogPosting",
headline: blog?.translated_title,
description: blog?.translated_description
? stripHtml(blog.translated_description)
: "No description available", // Strip HTML from description
url: `${process.env.NEXT_PUBLIC_WEB_URL}/blogs/${blog?.slug}`,
image: blog?.image,
datePublished: blog?.created_at ? formatDate(blog.created_at) : "", // Format date to ISO 8601
keywords: blog?.translated_tags
? blog.translated_tags.join(", ")
: "", // Adding tags as keywords
},
})),
}
: null;
return (
<>
<StructuredData data={jsonLd} />
<Blogs />
</>
);
};
export default BlogsPage;