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}
{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}
{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}