diff --git a/app/sitemap.tsx b/app/sitemap.tsx index 0e1598a..d4615f5 100644 --- a/app/sitemap.tsx +++ b/app/sitemap.tsx @@ -1,74 +1,91 @@ -import type { MetadataRoute } from "next"; +import type {GetServerSideProps} from "next"; interface SitemapRoute { - url: string; - lastModified: string; - changeFrequency?: - | "always" - | "hourly" - | "daily" - | "weekly" - | "monthly" - | "yearly" - | "never"; - priority?: number; + url: string; + lastModified: string; + changeFrequency?: + | "always" + | "hourly" + | "daily" + | "weekly" + | "monthly" + | "yearly" + | "never"; + priority?: number; } -export default async function sitemap(): Promise { - const baseUrl = "https://dki.one"; +const baseUrl = "https://dki.one"; - try { - const response = await fetch(`${baseUrl}/api/sitemap`); - if (!response.ok) { - throw new Error(`Failed to fetch sitemap: ${response.statusText}`); - } - - const sitemapData = (await response.json()) as SitemapRoute[]; - - return sitemapData.map((route) => { - const config: Record< - string, - { changeFrequency: SitemapRoute["changeFrequency"]; priority: number } - > = { - [`${baseUrl}/`]: { changeFrequency: "weekly", priority: 1.0 }, - }; - - if (route.url.startsWith(`${baseUrl}/projects`)) { - config[route.url] = { changeFrequency: "monthly", priority: 0.8 }; - } else if (route.url.startsWith(`${baseUrl}/blog`)) { - config[route.url] = { changeFrequency: "weekly", priority: 0.6 }; - } else { - config[route.url] = { changeFrequency: "monthly", priority: 0.5 }; - } - - return { - url: route.url, - lastModified: route.lastModified, - ...config[route.url], - }; - }); - } catch (error) { - console.error("Failed to fetch dynamic sitemap, using fallback:", error); - - return [ - { - url: `${baseUrl}/`, - lastModified: new Date().toISOString(), - changeFrequency: "weekly", - priority: 1.0, - }, - { - url: `${baseUrl}/privacy-policy`, - lastModified: new Date().toISOString(), - changeFrequency: "yearly", - priority: 0.3, - }, - { - url: `${baseUrl}/legal-notice`, - lastModified: new Date().toISOString(), - changeFrequency: "yearly", - priority: 0.3, - }, +export const getServerSideProps: GetServerSideProps = async () => { + const staticRoutes: SitemapRoute[] = [ + {url: `${baseUrl}/`, lastModified: new Date().toISOString(), changeFrequency: "weekly", priority: 1.0}, + { + url: `${baseUrl}/privacy-policy`, + lastModified: new Date().toISOString(), + changeFrequency: "yearly", + priority: 0.3 + }, + { + url: `${baseUrl}/legal-notice`, + lastModified: new Date().toISOString(), + changeFrequency: "yearly", + priority: 0.3 + }, ]; - } -} + + try { + const response = await fetch(`${baseUrl}/api/sitemap`); + if (!response.ok) { + console.error(`Failed to fetch dynamic sitemap: ${response.statusText}`); + } + + const dynamicRoutes = (await response.json()) as SitemapRoute[]; + + return { + props: { + sitemap: [...staticRoutes, ...dynamicRoutes], + }, + }; + } catch (error) { + console.error("Failed to fetch dynamic sitemap, using fallback:", error); + + return { + props: { + sitemap: staticRoutes, + }, + }; + } +}; + +const generateXml = (routes: SitemapRoute[]): string => { + const xmlHeader = ''; + const urlsetOpen = ''; + const urlsetClose = ''; + + const urlEntries = routes + .map( + (route) => ` + + ${route.url} + ${route.lastModified} + ${route.changeFrequency ? `${route.changeFrequency}` : ""} + ${route.priority ? `${route.priority}` : ""} + ` + ) + .join(""); + + return `${xmlHeader}${urlsetOpen}${urlEntries}${urlsetClose}`; +}; + +const Sitemap = ({sitemap}: { sitemap: SitemapRoute[] }) => { + const xmlSitemap = generateXml(sitemap); + + return new Response(xmlSitemap, { + headers: { + "Content-Type": "application/xml", + "Cache-Control": "no-cache", + }, + }); +}; + +export default Sitemap; \ No newline at end of file