"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 (
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;