diff --git a/apps/portal/src/features/services/components/sim/SimPlansContent.tsx b/apps/portal/src/features/services/components/sim/SimPlansContent.tsx
index bd415212..3ad25d98 100644
--- a/apps/portal/src/features/services/components/sim/SimPlansContent.tsx
+++ b/apps/portal/src/features/services/components/sim/SimPlansContent.tsx
@@ -1,6 +1,6 @@
"use client";
-import { useMemo, useState, type ElementType, type ReactNode } from "react";
+import { useMemo } from "react";
import {
Smartphone,
Check,
@@ -10,7 +10,6 @@ import {
Signal,
Sparkles,
CreditCard,
- ChevronDown,
Info,
CircleDollarSign,
TriangleAlert,
@@ -27,6 +26,8 @@ import { ServicesBackLink } from "@/features/services/components/base/ServicesBa
import { ServicesHero } from "@/features/services/components/base/ServicesHero";
import { useServicesBasePath } from "@/features/services/hooks/useServicesBasePath";
import { CardPricing } from "@/features/services/components/base/CardPricing";
+import { CollapsibleSection } from "@/features/services/components/base/CollapsibleSection";
+import { ServiceFAQ, type FAQItem } from "@/features/services/components/base/ServiceFAQ";
import { DeviceCompatibility } from "./DeviceCompatibility";
import {
ServiceHighlights,
@@ -43,48 +44,110 @@ interface PlansByType {
VoiceOnly: SimCatalogProduct[];
}
-function CollapsibleSection({
- title,
- icon: Icon,
- defaultOpen = false,
- children,
-}: {
- title: string;
- icon: ElementType;
- defaultOpen?: boolean;
- children: ReactNode;
-}) {
- const [isOpen, setIsOpen] = useState(defaultOpen);
+const simFeatures: HighlightFeature[] = [
+ {
+ icon: ,
+ title: "Foreign Cards Accepted",
+ description: "Use your overseas credit card. No Japanese bank account needed",
+ highlight: "Easy payment",
+ },
+ {
+ icon: ,
+ title: "Japan's Best Network",
+ description: "NTT Docomo coverage reaches 99.9% of Japan's population",
+ highlight: "Nationwide",
+ },
+ {
+ icon: ,
+ title: "First Month Free",
+ description: "Try risk-free. Your first month's basic fee is waived",
+ highlight: "Great value",
+ },
+ {
+ icon: ,
+ title: "Flexible Terms",
+ description: "No multi-year contracts. Stay as long as you need",
+ highlight: "No lock-in",
+ },
+ {
+ icon: ,
+ title: "Keep Your Number",
+ description: "Switching from another carrier? Bring your Japanese number with you",
+ highlight: "Easy transfer",
+ },
+ {
+ icon: ,
+ title: "Free Plan Changes",
+ description: "Switch data plans anytime for the next billing cycle",
+ highlight: "Flexibility",
+ },
+];
- return (
-
-
-
-
{children}
-
-
- );
-}
+const SIM_TABS = [
+ {
+ key: "data-voice" as const,
+ icon: Phone,
+ label: "Data + Voice",
+ shortLabel: "All-in",
+ planTypeKey: "DataSmsVoice" as const,
+ },
+ {
+ key: "data-only" as const,
+ icon: Globe,
+ label: "Data Only",
+ shortLabel: "Data",
+ planTypeKey: "DataOnly" as const,
+ },
+ {
+ key: "voice-only" as const,
+ icon: Check,
+ label: "Voice Only",
+ shortLabel: "Voice",
+ planTypeKey: "VoiceOnly" as const,
+ },
+];
+
+const SIM_FAQ_ITEMS: FAQItem[] = [
+ {
+ question: "What is the service contract period?",
+ answer:
+ "The minimum service requirement period is activation month + 3 billing months. After this period, the service will switch to a monthly service and you will be able to cancel at the end of each month.",
+ },
+ {
+ question: "I've changed my phone and the SIM card is not working on the new device.",
+ answer:
+ "Whenever the SIM card is used with a new device, the APN profile would need to be installed on said device. Please refer to the APN Setup Guide in the Documents section to check how the profile can be installed.",
+ },
+ {
+ question: "Are international calling features available?",
+ answer: (
+ <>
+ Enter "+" or "010", "recipient's country code", and
+ "recipient's phone number (regular phone number/mobile phone number)" → Make
+ a call.
+
+
+ If the recipient's phone number begins with a 0, enter it without the first 0 (except
+ in some countries and regions).
+
+ International calling rate is on the following Docomo's website:{" "}
+
+ Docomo International Calling Rates
+
+ >
+ ),
+ },
+ {
+ question: "How do I cancel the service?",
+ answer:
+ "To cancel, please log into the SonixNet SIM Management Website and send us a cancellation request before the 25th to cancel your account at the end of the month. For example, cancellation requests will need to be sent in by May 25th, in order to cancel at the end of May.",
+ },
+];
function SimPlanCardCompact({
plan,
@@ -187,45 +250,6 @@ export function SimPlansContent({
const simPlans: SimCatalogProduct[] = useMemo(() => plans ?? [], [plans]);
const hasExistingSim = useMemo(() => simPlans.some(p => p.simHasFamilyDiscount), [simPlans]);
- const simFeatures: HighlightFeature[] = [
- {
- icon: ,
- title: "Foreign Cards Accepted",
- description: "Use your overseas credit card. No Japanese bank account needed",
- highlight: "Easy payment",
- },
- {
- icon: ,
- title: "Japan's Best Network",
- description: "NTT Docomo coverage reaches 99.9% of Japan's population",
- highlight: "Nationwide",
- },
- {
- icon: ,
- title: "First Month Free",
- description: "Try risk-free. Your first month's basic fee is waived",
- highlight: "Great value",
- },
- {
- icon: ,
- title: "Flexible Terms",
- description: "No multi-year contracts. Stay as long as you need",
- highlight: "No lock-in",
- },
- {
- icon: ,
- title: "Keep Your Number",
- description: "Switching from another carrier? Bring your Japanese number with you",
- highlight: "Easy transfer",
- },
- {
- icon: ,
- title: "Free Plan Changes",
- description: "Switch data plans anytime for the next billing cycle",
- highlight: "Flexibility",
- },
- ];
-
if (isLoading) {
return (
-
-
-
- Enter "+" or "010", "recipient's country code",
- and "recipient's phone number (regular phone number/mobile phone
- number)" → Make a call.
-
-
- If the recipient's phone number begins with a 0, enter it without the first 0
- (except in some countries and regions).
-
- International calling rate is on the following Docomo's website:{" "}
-
- Docomo International Calling Rates
-
- >
- }
- />
-
-