import type { Metadata } from "next"; import { Suspense } from "react"; import { CartContent } from "./components/CartContent"; import { RelatedProducts } from "./components/RelatedProducts"; import { TrustRow } from "../components/TrustRow"; import { Footer } from "../components/Footer"; import { getCartTrustBadges, getShippingMethods, getShippingSettings, getDefaultTaxRatePercent, getKleinunternehmer } from "../lib/payload"; import { hasActiveDiscountCode } from "../lib/discountServer"; // robots: noindex — transactional page (mirrors a specific shopper's cart // contents), per the figma-to-nextjs skill's Step 5 guidance: indexing // this wastes crawl budget and could surface cart state in search results. export const metadata: Metadata = { title: "Warenkorb", description: "Dein Warenkorb bei einfach produktiv.", robots: { index: false, follow: true, }, }; export default async function CartPage() { const [trustBadges, shippingMethods, shipping, defaultTaxRate, kleinunternehmer, showDiscountField] = await Promise.all([ getCartTrustBadges(), getShippingMethods(), getShippingSettings(), getDefaultTaxRatePercent(), getKleinunternehmer(), hasActiveDiscountCode(), ]); // The cart doesn't ask which shipping method the shopper wants yet // (that's /checkout) — it just estimates using the first active method // (Standard, by sortOrder) for the sidebar's "Versand" line, and shows // the FreeShippingBanner toward whichever active method's threshold is // lowest/easiest to reach (Express has none — it never goes free). const defaultShipping = shippingMethods[0] ?? null; const thresholds = shippingMethods .map((m) => m.freeShippingThreshold) .filter((t): t is number => t !== null); const freeShippingThreshold = thresholds.length > 0 ? Math.min(...thresholds) : null; return ( <>
{/* Suspense required — CartContent uses useSearchParams() (?code= auto-apply, see its own comment) which opts any consumer into client-side rendering unless wrapped. fallback={null}: the cart itself is entirely client-rendered from localStorage anyway (see CartContent's own productsLoading handling), so there's no meaningful server-rendered content this would flash away from. */}