"use client";
import React from "react";
import { formatPlanShort } from "@/shared/utils";
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) => formatPlanShort(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.eid && (
{simDetails.eid}
)}
{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)}
))}
)}
);
}