SPB Git forge
38commits 1branches 0releases
338.7 MBsize
maindefault branch
6 h agolast push
HTML 53.9% TypeScript 44.5% JavaScript 0.6% SQL 0.5%
1.4 KB · 38 lines tsx
Raw Blame History
1import type { CloudRegionSummary } from "@dci/core";2import { Badge, type BadgeTone } from "@/components/ui/badge";3import { api } from "@/lib/api";4import { routes } from "@/lib/routes";56export type CloudStatus = CloudRegionSummary["status"];78export const CLOUD_STATUSES: CloudStatus[] = ["operational", "announced", "restricted", "retired"];910export const CLOUD_STATUS_LABEL: Record<CloudStatus, string> = {11  operational: "Operational",12  announced: "Announced",13  restricted: "Restricted",14  retired: "Retired",15};1617const TONE: Record<CloudStatus, BadgeTone> = { operational: "ok", announced: "info", restricted: "warn", retired: "neutral" };1819export function CloudStatusBadge({ status, size = "xs" }: { status: CloudStatus; size?: "xs" | "sm" }) {20  return (21    <Badge tone={TONE[status]} size={size} title={`Region status: ${CLOUD_STATUS_LABEL[status]}`}>22      {CLOUD_STATUS_LABEL[status]}23    </Badge>24  );25}2627/** iso2 → canonical country page href (falls back to the facility index filtered by country). */28export async function countryHrefMap(): Promise<(iso2: string | null | undefined) => string | null> {29  const c = await api.countries();30  const map = new Map<string, string>();31  for (const x of c.items) map.set(x.iso2.toUpperCase(), x.slug);32  return (iso2) => {33    if (!iso2) return null;34    const slug = map.get(iso2.toUpperCase());35    return slug ? routes.country(slug) : routes.datacenters(`country=${iso2.toUpperCase()}`);36  };37}38