"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.eid && (
{simDetails.eid}
)}
{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)}
))}
)}
);
}