import type { Metadata } from "next"; import Link from "next/link"; import { WorldMap } from "@/components/market/world-map"; import { ChangeCell } from "@/components/ui/price"; import { Page, PageHeader, Section } from "@/components/ui/section"; import { StatusBadge } from "@/components/ui/status-badge"; import { api } from "@/lib/api"; import type { Breadth, Exchange, ExchangeStatus } from "@/lib/types"; type Row = Exchange & { status: ExchangeStatus; instruments_tracked: number; instruments_quoted: number; breadth: Breadth | null }; export const metadata: Metadata = { title: "Exchanges", description: "World exchanges with live session state, local time, instruments tracked and breadth.", alternates: { canonical: "/exchanges" } }; export const dynamic = "force-dynamic"; const ORDER = ["OPEN", "PRE", "POST", "AUCTION", "HALTED", "CLOSED", "UNKNOWN"]; export default async function ExchangesPage() { const rows = await api("/v1/exchanges"); const sorted = [...rows].sort((a, b) => ORDER.indexOf(a.status.state) - ORDER.indexOf(b.status.state) || b.instruments_tracked - a.instruments_tracked || a.name.localeCompare(b.name)); const open = rows.filter((r) => r.status.state === "OPEN").length; const mapRows = rows.map((r) => ({ id: r.id, name: r.name, mic: r.mic, country: r.country, city: r.city, timezone: r.timezone, lat: r.lat, lon: r.lon, status: r.status, asset_classes: r.asset_classes ?? [], breadth: r.breadth })); return (
{sorted.map((r) => ( ))}
Exchange MIC Country State Local time Next Tracked Quoted Adv / Dec Median
{r.name} {r.city ?? r.operator ?? ""} {r.mic ?? "—"} {r.country} {r.status.isHoliday && r.status.holidayName && {r.status.holidayName}} {r.status.localTime} {r.status.nextTransition ? `${r.status.nextTransition.state.toLowerCase()} · ${new Date(r.status.nextTransition.at).toLocaleString("en-GB", { timeZone: r.timezone, weekday: "short", hour: "2-digit", minute: "2-digit", hourCycle: "h23" })}` : r.sessions.continuous ? "24/7" : "—"} {r.instruments_tracked.toLocaleString("en-US")} {r.instruments_quoted} {r.breadth ? `${r.breadth.advancers} / ${r.breadth.decliners}` : "—"} {r.breadth ? : "—"}
); }