224 lines
6.6 KiB
JavaScript
224 lines
6.6 KiB
JavaScript
import { SITEMAP_REVALIDATE_SECONDS } from "@/lib/constants";
|
|
|
|
export default async function sitemap() {
|
|
// Check if SEO is enabled via environment variable
|
|
// If SEO is disabled, return empty array to prevent sitemap generation
|
|
const seoEnabled = process.env.NEXT_PUBLIC_SEO === "true";
|
|
if (!seoEnabled) {
|
|
// Return empty sitemap when SEO is disabled
|
|
return [];
|
|
}
|
|
|
|
const baseUrl = process.env.NEXT_PUBLIC_WEB_URL;
|
|
const apiUrl = process.env.NEXT_PUBLIC_API_URL;
|
|
|
|
let defaultLanguageCode = "en";
|
|
let languages = [];
|
|
|
|
try {
|
|
const res = await fetch(
|
|
`${apiUrl}${process.env.NEXT_PUBLIC_END_POINT}get-system-settings`,
|
|
{ next: { revalidate: SITEMAP_REVALIDATE_SECONDS } } // Revalidate weekly
|
|
);
|
|
|
|
if (res.ok) {
|
|
const data = await res.json();
|
|
defaultLanguageCode = data?.data?.default_language || "en";
|
|
languages = data?.data?.languages || [];
|
|
}
|
|
} catch (error) {
|
|
console.error("Error fetching languages for sitemap:", error);
|
|
return [];
|
|
}
|
|
|
|
const publicRoutes = [
|
|
"about-us",
|
|
"ads",
|
|
"blogs",
|
|
"contact-us",
|
|
"faqs",
|
|
"landing",
|
|
"privacy-policy",
|
|
"refund-policy",
|
|
"subscription",
|
|
"terms-and-condition",
|
|
];
|
|
|
|
// ✅ Escape XML entities
|
|
const escapeXml = (unsafe) =>
|
|
unsafe.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">");
|
|
|
|
const buildHreflangLinks = (url) => {
|
|
const links = {};
|
|
const separator = url.includes("?") ? "&" : "?";
|
|
languages.forEach((lang) => {
|
|
links[lang.code] = escapeXml(`${url}${separator}lang=${lang.code}`);
|
|
});
|
|
// Add x-default
|
|
links["x-default"] = escapeXml(
|
|
`${url}${separator}lang=${defaultLanguageCode}`
|
|
);
|
|
return { languages: links };
|
|
};
|
|
// ✅ Add default lang param to main <loc> URLs
|
|
const withDefaultLang = (url) => {
|
|
const separator = url.includes("?") ? "&" : "?";
|
|
return escapeXml(`${url}${separator}lang=${defaultLanguageCode}`);
|
|
};
|
|
|
|
const staticSitemapEntries = publicRoutes.map((route) => {
|
|
const url = `${baseUrl}/${route}`;
|
|
return {
|
|
url: withDefaultLang(url),
|
|
lastModified: new Date(),
|
|
changeFrequency: "weekly",
|
|
priority: 0.9,
|
|
alternates: buildHreflangLinks(url),
|
|
};
|
|
});
|
|
|
|
// Add the base URL entry
|
|
const baseEntry = {
|
|
url: withDefaultLang(baseUrl),
|
|
lastModified: new Date(),
|
|
changeFrequency: "weekly",
|
|
priority: 1,
|
|
alternates: buildHreflangLinks(baseUrl),
|
|
};
|
|
|
|
let adEntries = [];
|
|
try {
|
|
const res = await fetch(
|
|
`${apiUrl}${process.env.NEXT_PUBLIC_END_POINT}get-item-slug`,
|
|
{ next: { revalidate: SITEMAP_REVALIDATE_SECONDS } } // Revalidate weekly
|
|
);
|
|
|
|
if (res.ok) {
|
|
const json = await res.json();
|
|
const products = json?.data || [];
|
|
adEntries = products.map((product) => {
|
|
const url = `${baseUrl}/ad-details/${product?.slug}`;
|
|
return {
|
|
url: withDefaultLang(url),
|
|
lastModified: new Date(product?.updated_at),
|
|
changeFrequency: "weekly",
|
|
priority: 0.8,
|
|
alternates: buildHreflangLinks(url),
|
|
};
|
|
});
|
|
}
|
|
} catch (error) {
|
|
console.error("Error fetching products for sitemap:", error);
|
|
}
|
|
|
|
let categoryEntries = [];
|
|
try {
|
|
const res = await fetch(
|
|
`${apiUrl}${process.env.NEXT_PUBLIC_END_POINT}get-categories-slug`,
|
|
{ next: { revalidate: SITEMAP_REVALIDATE_SECONDS } } // Revalidate weekly
|
|
);
|
|
|
|
if (res.ok) {
|
|
const json = await res.json();
|
|
const categories = json?.data || [];
|
|
categoryEntries = categories.map((category) => {
|
|
const url = `${baseUrl}/ads?category=${category?.slug}`;
|
|
return {
|
|
url: withDefaultLang(url),
|
|
lastModified: new Date(category?.updated_at),
|
|
changeFrequency: "weekly",
|
|
priority: 0.7,
|
|
alternates: buildHreflangLinks(url),
|
|
};
|
|
});
|
|
}
|
|
} catch (error) {
|
|
console.error("Error fetching categories for sitemap:", error);
|
|
}
|
|
|
|
let blogEntries = [];
|
|
try {
|
|
const res = await fetch(
|
|
`${apiUrl}${process.env.NEXT_PUBLIC_END_POINT}get-blogs-slug`,
|
|
{ next: { revalidate: SITEMAP_REVALIDATE_SECONDS } } // Revalidate weekly
|
|
);
|
|
|
|
if (res.ok) {
|
|
const json = await res.json();
|
|
const blogs = json?.data || [];
|
|
blogEntries = blogs.map((blog) => {
|
|
const url = `${baseUrl}/blogs/${blog?.slug}`;
|
|
return {
|
|
url: withDefaultLang(url),
|
|
lastModified: new Date(blog?.updated_at),
|
|
changeFrequency: "weekly",
|
|
priority: 0.7,
|
|
alternates: buildHreflangLinks(url),
|
|
};
|
|
});
|
|
}
|
|
} catch (error) {
|
|
console.error("Error fetching blogs for sitemap:", error);
|
|
}
|
|
|
|
let featuredSectionEntries = [];
|
|
try {
|
|
const res = await fetch(
|
|
`${apiUrl}${process.env.NEXT_PUBLIC_END_POINT}get-featured-section-slug`,
|
|
{ next: { revalidate: SITEMAP_REVALIDATE_SECONDS } } // Revalidate weekly
|
|
);
|
|
|
|
if (res.ok) {
|
|
const json = await res.json();
|
|
const featuredSections = json?.data || [];
|
|
featuredSectionEntries = featuredSections.map((featuredSection) => {
|
|
const url = `${baseUrl}/ads?featured_section=${featuredSection?.slug}`;
|
|
return {
|
|
url: withDefaultLang(url),
|
|
lastModified: new Date(featuredSection?.updated_at),
|
|
changeFrequency: "weekly",
|
|
priority: 0.7,
|
|
alternates: buildHreflangLinks(url),
|
|
};
|
|
});
|
|
}
|
|
} catch (error) {
|
|
console.error("Error fetching featured sections for sitemap:", error);
|
|
}
|
|
|
|
let sellerProfileEntries = [];
|
|
try {
|
|
const res = await fetch(
|
|
`${apiUrl}${process.env.NEXT_PUBLIC_END_POINT}get-seller-slug`,
|
|
{ next: { revalidate: SITEMAP_REVALIDATE_SECONDS } } // Revalidate weekly
|
|
);
|
|
|
|
if (res.ok) {
|
|
const json = await res.json();
|
|
const sellers = json?.data || [];
|
|
sellerProfileEntries = sellers.map((seller) => {
|
|
const url = `${baseUrl}/seller/${seller?.id}`;
|
|
return {
|
|
url: withDefaultLang(url),
|
|
lastModified: new Date(seller?.updated_at),
|
|
changeFrequency: "weekly",
|
|
priority: 0.7,
|
|
alternates: buildHreflangLinks(url),
|
|
};
|
|
});
|
|
}
|
|
} catch (error) {
|
|
console.error("Error fetching featured sections for sitemap:", error);
|
|
}
|
|
|
|
return [
|
|
baseEntry,
|
|
...staticSitemapEntries,
|
|
...adEntries,
|
|
...categoryEntries,
|
|
...blogEntries,
|
|
...featuredSectionEntries,
|
|
...sellerProfileEntries,
|
|
];
|
|
}
|