"use client"; import React from "react"; import { formatPlanShort } from "@/lib/utils"; import { DevicePhoneMobileIcon, WifiIcon, SignalIcon, ClockIcon, CheckCircleIcon, ExclamationTriangleIcon, XCircleIcon, } from "@heroicons/react/24/outline"; import type { SimDetails } from "@customer-portal/domain/sim"; interface SimDetailsCardProps { simDetails: SimDetails; isLoading?: boolean; error?: string | null; embedded?: boolean; // when true, render content without card container showFeaturesSummary?: boolean; // show the right-side Service Features summary } export function SimDetailsCard({ simDetails, isLoading, error, embedded = false, showFeaturesSummary = true, }: SimDetailsCardProps) { const formatPlan = (code?: string) => formatPlanShort(code); const isEsim = simDetails.simType === "esim"; const hasVoice = Boolean(simDetails.hasVoice ?? simDetails.voiceMailEnabled); const hasSms = Boolean(simDetails.hasSms); const voiceMailEnabled = Boolean(simDetails.voiceMailEnabled); const callWaitingEnabled = Boolean(simDetails.callWaitingEnabled); const internationalRoamingEnabled = Boolean(simDetails.internationalRoamingEnabled); const sizeLabel = simDetails.size ?? simDetails.simType; const ipv4Address = simDetails.ipv4; const ipv6Address = simDetails.ipv6; const getStatusIcon = (status: string) => { switch (status) { case "active": return ; case "suspended": return ; case "cancelled": return ; case "pending": return ; default: return ; } }; const getStatusColor = (status: string) => { switch (status) { case "active": return "bg-green-100 text-green-800"; case "suspended": return "bg-yellow-100 text-yellow-800"; case "cancelled": return "bg-red-100 text-red-800"; case "pending": return "bg-blue-100 text-blue-800"; default: return "bg-gray-100 text-gray-800"; } }; const formatDate = (dateString: string) => { try { const date = new Date(dateString); return date.toLocaleDateString("en-US", { year: "numeric", month: "short", day: "numeric", }); } catch { return dateString; } }; const formatQuota = (quotaMb: number) => { if (quotaMb >= 1000) { return `${(quotaMb / 1000).toFixed(1)} GB`; } return `${quotaMb.toFixed(0)} MB`; }; if (isLoading) { const Skeleton = (
); return Skeleton; } if (error) { return (

Error Loading SIM Details

{error}

); } // Specialized, minimal eSIM details view if (simDetails.simType === "esim") { return (
{/* Header */}

eSIM Details

Current Plan: {formatPlan(simDetails.planCode)}

{simDetails.status.charAt(0).toUpperCase() + simDetails.status.slice(1)}

SIM Information

{simDetails.msisdn}

{formatQuota(simDetails.remainingQuotaMb)}

{showFeaturesSummary && (

Service Features

Voice Mail (¥300/month) {voiceMailEnabled ? "Enabled" : "Disabled"}
Call Waiting (¥300/month) {callWaitingEnabled ? "Enabled" : "Disabled"}
International Roaming {internationalRoamingEnabled ? "Enabled" : "Disabled"}
4G/5G {simDetails.networkType || "5G"}
)}
); } return (
{/* Header */}

Physical SIM Details

{formatPlan(simDetails.planCode)} • {`${sizeLabel ?? "Unknown"} SIM`}

{getStatusIcon(simDetails.status)} {simDetails.status.charAt(0).toUpperCase() + simDetails.status.slice(1)}
{/* Content */}
{/* SIM Information */}

SIM Information

{simDetails.msisdn}

{simDetails.simType === "physical" && (

{simDetails.iccid}

)} {simDetails.eid && (

{simDetails.eid}

)} {simDetails.imsi && (

{simDetails.imsi}

)} {simDetails.startDate && (

{formatDate(simDetails.startDate)}

)}
{/* Service Features */} {showFeaturesSummary && (

Service Features

{formatQuota(simDetails.remainingQuotaMb)}

Voice {hasVoice ? "Enabled" : "Disabled"}
SMS {hasSms ? "Enabled" : "Disabled"}
{(simDetails.ipv4 || simDetails.ipv6) && (
{ipv4Address && (

IPv4: {ipv4Address}

)} {ipv6Address && (

IPv6: {ipv6Address}

)} {!ipv4Address && !ipv6Address && (

No IP assigned

)}
)}
)}
{/* Pending Operations */} {simDetails.pendingOperations && simDetails.pendingOperations.length > 0 && (

Pending Operations

{simDetails.pendingOperations.map((operation, index) => (
{operation.operation} scheduled for {formatDate(operation.scheduledDate)}
))}
)}
); }