"use client"; import React, { useEffect, useMemo, useState } from "react"; import { authenticatedApi } from "@/lib/api"; interface SimFeatureTogglesProps { subscriptionId: number; voiceMailEnabled?: boolean; callWaitingEnabled?: boolean; internationalRoamingEnabled?: boolean; networkType?: string; // '4G' | '5G' onChanged?: () => void; embedded?: boolean; // when true, render without outer card wrappers } export function SimFeatureToggles({ subscriptionId, voiceMailEnabled, callWaitingEnabled, internationalRoamingEnabled, networkType, onChanged, embedded = false, }: SimFeatureTogglesProps) { // Initial values const initial = useMemo(() => ({ vm: !!voiceMailEnabled, cw: !!callWaitingEnabled, ir: !!internationalRoamingEnabled, nt: networkType === '5G' ? '5G' : '4G', }), [voiceMailEnabled, callWaitingEnabled, internationalRoamingEnabled, networkType]); // Working values const [vm, setVm] = useState(initial.vm); const [cw, setCw] = useState(initial.cw); const [ir, setIr] = useState(initial.ir); const [nt, setNt] = useState<'4G' | '5G'>(initial.nt as '4G' | '5G'); const [loading, setLoading] = useState(false); const [error, setError] = useState(null); const [success, setSuccess] = useState(null); useEffect(() => { setVm(initial.vm); setCw(initial.cw); setIr(initial.ir); setNt(initial.nt as '4G' | '5G'); }, [initial.vm, initial.cw, initial.ir, initial.nt]); const reset = () => { setVm(initial.vm); setCw(initial.cw); setIr(initial.ir); setNt(initial.nt as '4G' | '5G'); setError(null); setSuccess(null); }; const applyChanges = async () => { setLoading(true); setError(null); setSuccess(null); try { const featurePayload: any = {}; if (vm !== initial.vm) featurePayload.voiceMailEnabled = vm; if (cw !== initial.cw) featurePayload.callWaitingEnabled = cw; if (ir !== initial.ir) featurePayload.internationalRoamingEnabled = ir; if (nt !== initial.nt) featurePayload.networkType = nt; if (Object.keys(featurePayload).length > 0) { await authenticatedApi.post(`/subscriptions/${subscriptionId}/sim/features`, featurePayload); } setSuccess('Changes submitted successfully'); onChanged?.(); } catch (e: any) { setError(e instanceof Error ? e.message : 'Failed to submit changes'); } finally { setLoading(false); setTimeout(() => setSuccess(null), 3000); } }; return (
{/* Service Options */}
{/* Voice Mail */}
Voice Mail
¥300/month
Current: {initial.vm ? 'Enabled' : 'Disabled'}
{/* Call Waiting */}
Call Waiting
¥300/month
Current: {initial.cw ? 'Enabled' : 'Disabled'}
{/* International Roaming */}
International Roaming
Global connectivity
Current: {initial.ir ? 'Enabled' : 'Disabled'}
{/* Network Type */}
Network Type
4G/5G connectivity
Current: {initial.nt}
{/* Notes and Actions */}

Important Notes:

  • Changes will take effect instantaneously (approx. 30min)
  • May require smartphone/device restart after changes are applied
  • 5G requires a compatible smartphone/device. Will not function on 4G devices
  • Changes to Voice Mail / Call Waiting must be requested before the 25th of the month
{success && (

{success}

)} {error && (

{error}

)}
); }