"use client"; import { useEffect, useState } from "react"; import { useParams, useSearchParams } from "next/navigation"; import Link from "next/link"; import { ServerIcon, CalendarIcon, DocumentTextIcon, XCircleIcon, CreditCardIcon, } from "@heroicons/react/24/outline"; import { useSubscription } from "@/features/subscriptions/hooks"; import { Formatting } from "@customer-portal/domain/toolkit"; import { PageLayout } from "@/components/templates/PageLayout"; import { SectionCard } from "@/components/molecules/SectionCard"; import { StatusPill } from "@/components/atoms/status-pill"; import { SubscriptionDetailStatsSkeleton } from "@/components/atoms/loading-skeleton"; import { formatIsoDate, cn } from "@/shared/utils"; import { SimManagementSection } from "@/features/subscriptions/components/sim"; import type { SubscriptionStatus, SubscriptionCycle } from "@customer-portal/domain/subscriptions"; import { getBillingCycleLabel, getSubscriptionStatusVariant, } from "@/features/subscriptions/utils/status-presenters"; const { formatCurrency: sharedFormatCurrency } = Formatting; function SubscriptionStatsCard({ subscription, }: { subscription: { status: SubscriptionStatus; amount: number; cycle: SubscriptionCycle; nextDue?: string | undefined; registrationDate?: string | undefined; }; }) { return (

Service Status

Billing Amount

{sharedFormatCurrency(subscription.amount || 0)}

{getBillingCycleLabel(subscription.cycle)}

Next Due Date

{formatIsoDate(subscription.nextDue)}

Registration Date

{formatIsoDate(subscription.registrationDate)}

); } function SimTabNavigation({ subscriptionId, activeTab, }: { subscriptionId: number; activeTab: string; }) { return (
Overview & Billing SIM Management
); } function detectServiceType(productName: string | undefined): { isSim: boolean; isInternet: boolean; } { const lower = productName?.toLowerCase() ?? ""; const isNttFiber = lower.includes("ntt") && lower.includes("fiber"); return { isSim: lower.includes("sim"), isInternet: lower.includes("internet") || lower.includes("sonixnet") || isNttFiber, }; } function getPageError(error: unknown): string | null { if (!error) return null; if (process.env.NODE_ENV === "development" && error instanceof Error) return error.message; return "Unable to load subscription details. Please try again."; } function useActiveTab(searchParams: ReturnType) { const [activeTab, setActiveTab] = useState<"overview" | "sim">("overview"); useEffect(() => { const updateTab = () => { const hash = typeof window === "undefined" ? "" : window.location.hash; const service = (searchParams.get("service") || "").toLowerCase(); setActiveTab(hash.includes("sim-management") || service === "sim" ? "sim" : "overview"); }; updateTab(); if (typeof window === "undefined") return; window.addEventListener("hashchange", updateTab); return () => window.removeEventListener("hashchange", updateTab); }, [searchParams]); return activeTab; } function CancelServiceAction({ subscriptionId }: { subscriptionId: number }) { return ( Cancel Service ); } function SubscriptionDetailContent({ subscription, subscriptionId, activeTab, }: { subscription: { productName: string; status: SubscriptionStatus; amount: number; cycle: SubscriptionCycle; nextDue?: string | undefined; registrationDate?: string | undefined; }; subscriptionId: number; activeTab: string; }) { const { isSim } = detectServiceType(subscription.productName); return (
{isSim && } {activeTab === "sim" && isSim && } {activeTab === "overview" && ( } title="Billing Information" subtitle="Payment and invoices" tone="primary" actions={ View Invoices } >

Invoices and payment history are available on the billing page.

)}
); } export function SubscriptionDetailContainer() { const params = useParams(); const searchParams = useSearchParams(); const subscriptionId = Number.parseInt(params["id"] as string); const { data: subscription, error } = useSubscription(subscriptionId); const activeTab = useActiveTab(searchParams); if (!subscription && !error) { return ( } title="Subscription" backLink={{ label: "Back to Subscriptions", href: "/account/subscriptions" }} >
); } const { isInternet } = detectServiceType(subscription?.productName); const headerActions = isInternet && subscription?.status === "Active" ? ( ) : undefined; return ( } title={subscription?.productName ?? "Subscription"} actions={headerActions} backLink={{ label: "Back to Subscriptions", href: "/account/subscriptions" }} error={getPageError(error)} > {subscription ? ( ) : null} ); } export default SubscriptionDetailContainer;