import type { Metadata } from "next"; import Link from "next/link"; import { Container, SectionHeading, Button, FormPanel } from "@/components/ui"; import { OrderStatusBadge, OrderStatusTimeline } from "@/components/account-ui"; import { getOrderForTracking } from "@/lib/account-data"; import { formatPrice, formatDate } from "@/lib/format"; import { getCarrierTrackingUrl, isDhlCarrier } from "@/lib/shipment-tracking"; import { getDhlTracking, type DhlTrackingResult } from "@/lib/dhl-tracking"; import { ShipmentTrackingHistory } from "@/components/shipment-tracking-history"; import { rateLimit, getClientIp } from "@/lib/rate-limit"; import { getLocale } from "@/i18n/locale"; import { getDictionary } from "@/i18n/get-dictionary"; export const metadata: Metadata = { title: "Bestellung verfolgen", robots: { index: false } }; export const dynamic = "force-dynamic"; const TRACK_ATTEMPTS_PER_WINDOW = 10; const TRACK_WINDOW_MS = 15 * 60 * 1000; export default async function TrackOrderPage(props: PageProps<"/bestellung-verfolgen">) { const locale = await getLocale(); const t = getDictionary(locale); const { order: orderNumber, email } = await props.searchParams; const hasQuery = typeof orderNumber === "string" && typeof email === "string" && orderNumber && email; let order = null; let rateLimited = false; if (hasQuery) { const ip = await getClientIp(); if (rateLimit(`track-order:${ip}`, TRACK_ATTEMPTS_PER_WINDOW, TRACK_WINDOW_MS)) { order = await getOrderForTracking(orderNumber, email); } else { rateLimited = true; } } // Erst NACH erfolgreicher Pruefung von Bestellnummer + E-Mail bei DHL // nachfragen: sonst liesse sich diese Seite als offener Proxy fuer beliebige // Sendungsabfragen missbrauchen und das DHL-Kontingent leerraeumen. let dhlTracking: DhlTrackingResult = { kind: "disabled" }; if (order?.shipment?.trackingNumber && isDhlCarrier(order.shipment.carrier)) { dhlTracking = await getDhlTracking({ trackingNumber: order.shipment.trackingNumber, postalCode: order.zip, locale, }); } return (

{t.trackOrderPage.intro}

{rateLimited ? (

{t.trackOrderPage.rateLimitError}

) : null} {hasQuery && !order && !rateLimited ? (

{t.trackOrderPage.notFoundError}

) : null} {order ? (

{order.orderNumber}

{formatDate(order.createdAt, locale)}

{order.fulfillmentMethod === "VERSAND" ? order.shipment?.shippedAt ? t.ordersPage.shippedOn(formatDate(order.shipment.shippedAt, locale)) : t.ordersPage.shippingPending : order.pickup?.pickedUpAt ? t.ordersPage.pickedUpOn(formatDate(order.pickup.pickedUpAt, locale)) : order.pickup?.readyAt ? t.ordersPage.readySince(formatDate(order.pickup.readyAt, locale)) : t.ordersPage.pickupPending}

    {order.items.map((item) => (
  • {item.quantity} ×{" "} {item.productName}
  • ))}
{order.shipment?.carrier && order.shipment.trackingNumber ? (

{t.shipmentInfo.carrierLabel}: {order.shipment.carrier} · {t.shipmentInfo.trackingNumberLabel}:{" "} {order.shipment.trackingNumber} {(() => { const url = getCarrierTrackingUrl(order.shipment.carrier, order.shipment.trackingNumber); return url ? ( <> {" "} ·{" "} {t.shipmentInfo.trackPackage} ) : null; })()}

) : null}

{formatPrice(order.totalCents, order.currency, locale)}

{order.invoice ? ( {t.trackOrderPage.viewInvoice} ) : null}
) : null}
); }