import { Metadata } from "next"; import Link from "next/link"; import { getTranslations } from "next-intl/server"; import { ChevronRight, Droplets } from "lucide-react"; import Header from "@/components/layout/Header"; import Footer from "@/components/layout/Footer"; import { getAllOilForConcernPages, getLocalizedString, getAllOils } from "@/lib/programmatic-seo/dataLoader"; import { isValidLocale, DEFAULT_LOCALE } from "@/lib/i18n/locales"; type Params = Promise<{ locale: string }>; export async function generateMetadata({ params, }: { params: Params; }): Promise { const { locale } = await params; const validLocale = isValidLocale(locale) ? locale : DEFAULT_LOCALE; const t = await getTranslations({ locale: validLocale, namespace: "Solutions.ByOil" }); const baseUrl = process.env.NEXT_PUBLIC_SITE_URL || "https://manoonoils.com"; const localePrefix = `/${validLocale}`; const canonicalUrl = `${baseUrl}${localePrefix}/solutions/by-oil`; return { title: t("metaTitle"), description: t("metaDescription"), alternates: { canonical: canonicalUrl, }, openGraph: { url: canonicalUrl, }, }; } interface OilCardProps { oilName: string; concernCount: number; concerns: string[]; locale: string; firstSolutionSlug: string; bestFor: string; exploreSolutions: string; solutionLabel: string; solutionsLabel: string; shortDescription: string; } function OilCard({ oilName, concernCount, concerns, locale, firstSolutionSlug, bestFor, exploreSolutions, solutionLabel, solutionsLabel, shortDescription, }: OilCardProps) { return (

{oilName}

{shortDescription}

{concernCount} {concernCount === 1 ? solutionLabel : solutionsLabel}

{bestFor}

{concerns.slice(0, 3).map((concernName) => (
{concernName}
))} {concerns.length > 3 && (

+{concerns.length - 3} more

)}
{exploreSolutions}
); } export default async function ByOilPage({ params, }: { params: Params; }) { const { locale } = await params; const t = await getTranslations({ locale, namespace: "Solutions" }); const pageT = await getTranslations({ locale, namespace: "Solutions.ByOil" }); const [oils, allPages] = await Promise.all([ getAllOils(), getAllOilForConcernPages(), ]); const oilsWithPages = oils .map(oil => { const pages = allPages.filter(page => page.oilId === oil.id); return { ...oil, pages, concernCount: pages.length, }; }) .filter(oil => oil.pages.length > 0) .sort((a, b) => a.name[locale as "sr" | "en" | "de" | "fr"].localeCompare(b.name[locale as "sr" | "en" | "de" | "fr"])); return ( <>

{pageT("title")}

{pageT("subtitle")}

{pageT("stats.availableOils", { count: oilsWithPages.length })}

{pageT("stats.totalSolutions", { count: allPages.length })}

{oilsWithPages.map((oil) => { const oilName = getLocalizedString(oil.name, locale); const shortDescription = getLocalizedString(oil.shortDescription, locale); const concerns = oil.pages.map(p => getLocalizedString(p.concernName, locale)); return ( ); })}
{oilsWithPages.length === 0 && (

{pageT("noResults")}

)}