"use client"; import { SubCard } from "@/components/molecules/SubCard/SubCard"; import { DetailHeader } from "@/components/molecules/DetailHeader/DetailHeader"; import { useEffect, useState } from "react"; import { useParams, useSearchParams } from "next/navigation"; import Link from "next/link"; import { ServerIcon, CalendarIcon, DocumentTextIcon } from "@heroicons/react/24/outline"; import { format } from "date-fns"; import { useSubscription } from "@/features/subscriptions/hooks"; import { InvoicesList } from "@/features/billing/components/InvoiceList/InvoiceList"; import { Formatting } from "@customer-portal/domain/toolkit"; import { PageLayout } from "@/components/templates/PageLayout"; const { formatCurrency: sharedFormatCurrency } = Formatting; import { SimManagementSection } from "@/features/sim-management"; import { getBillingCycleLabel, getSubscriptionStatusIcon, getSubscriptionStatusVariant, } from "@/features/subscriptions/utils/status-presenters"; export function SubscriptionDetailContainer() { const params = useParams(); const searchParams = useSearchParams(); const [showInvoices, setShowInvoices] = useState(true); const [showSimManagement, setShowSimManagement] = useState(false); const subscriptionId = parseInt(params.id as string); const { data: subscription, isLoading, error } = useSubscription(subscriptionId); useEffect(() => { const updateVisibility = () => { const hash = typeof window !== "undefined" ? window.location.hash : ""; const service = (searchParams.get("service") || "").toLowerCase(); const isSimContext = hash.includes("sim-management") || service === "sim"; if (isSimContext) { setShowInvoices(false); setShowSimManagement(true); } else { setShowInvoices(true); setShowSimManagement(false); } }; updateVisibility(); if (typeof window !== "undefined") { window.addEventListener("hashchange", updateVisibility); return () => window.removeEventListener("hashchange", updateVisibility); } return; }, [searchParams]); const formatDate = (dateString: string | undefined) => { if (!dateString) return "N/A"; try { return format(new Date(dateString), "MMM d, yyyy"); } catch { return "Invalid date"; } }; const formatCurrency = (amount: number) => sharedFormatCurrency(amount || 0); const pageError = error || !subscription ? process.env.NODE_ENV === "development" ? error instanceof Error ? error.message : "Subscription not found" : "Unable to load subscription details. Please try again." : null; const isSimService = Boolean(subscription?.productName?.toLowerCase().includes("sim")); return ( } title={subscription?.productName ?? "Subscription"} description={ subscription ? `Service ID: ${subscription.serviceId}` : "View your subscription details" } breadcrumbs={[ { label: "Subscriptions", href: "/subscriptions" }, { label: subscription?.productName ?? "Subscription" }, ]} loading={isLoading} error={pageError} > {subscription ? (

Billing Amount

{formatCurrency(subscription.amount)}

{getBillingCycleLabel(subscription.cycle)}

Next Due Date

{formatDate(subscription.nextDue)}

Registration Date

{formatDate(subscription.registrationDate)}

{isSimService && (

Service Management

Switch between billing and SIM management views

SIM Management Invoices
)} {showSimManagement && (
)} {showInvoices && }
) : null}
); } export default SubscriptionDetailContainer;