"use client"; import React from "react"; import { DevicePhoneMobileIcon, WifiIcon, SignalIcon, ClockIcon, CheckCircleIcon, ExclamationTriangleIcon, XCircleIcon, } from "@heroicons/react/24/outline"; export interface SimDetails { account: string; msisdn: string; iccid?: string; imsi?: string; eid?: string; planCode: string; status: "active" | "suspended" | "cancelled" | "pending"; simType: "physical" | "esim"; size: "standard" | "nano" | "micro" | "esim"; hasVoice: boolean; hasSms: boolean; remainingQuotaKb: number; remainingQuotaMb: number; startDate?: string; ipv4?: string; ipv6?: string; voiceMailEnabled?: boolean; callWaitingEnabled?: boolean; internationalRoamingEnabled?: boolean; networkType?: string; pendingOperations?: Array<{ operation: string; scheduledDate: string; }>; } 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) => { const map: Record = { PASI_5G: "5GB Plan", PASI_10G: "10GB Plan", PASI_25G: "25GB Plan", PASI_50G: "50GB Plan", }; return (code && map[code]) || code || "—"; }; 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) {simDetails.voiceMailEnabled ? "Enabled" : "Disabled"}
Call Waiting (¥300/month) {simDetails.callWaitingEnabled ? "Enabled" : "Disabled"}
International Roaming {simDetails.internationalRoamingEnabled ? "Enabled" : "Disabled"}
4G/5G {simDetails.networkType || "5G"}
)}
); } return (
{/* Header */}

Physical SIM Details

{formatPlan(simDetails.planCode)} • {`${simDetails.size} 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 {simDetails.hasVoice ? "Enabled" : "Disabled"}
SMS {simDetails.hasSms ? "Enabled" : "Disabled"}
{(simDetails.ipv4 || simDetails.ipv6) && (
{simDetails.ipv4 && (

IPv4: {simDetails.ipv4}

)} {simDetails.ipv6 && (

IPv6: {simDetails.ipv6}

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

Pending Operations

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