"use client"; import React, { useState, useEffect } from "react"; import { useRouter } from "next/navigation"; import axios from "axios"; import { ApiBaseUrl, ApiServerBaseUrl } from "@/utils/baseurl.utils"; import Swal from 'sweetalert2'; interface Invoice { id: string; number: string; date: string; status: "Paid" | "Pending" | "Overdue"; amount: number; } interface UserDetails { id?: string; name?: string; email?: string; mobileNumber?: string; role?: string; _id?: string; // Add this as MongoDB uses _id } const AccountSettings: React.FC = () => { const router = useRouter(); const [activeTab, setActiveTab] = useState<"subscription" | "billing" | "profile">("subscription"); const [paymentData, setPaymentData] = useState(null); const [subStatus, setSubStatus] = useState(null); const [billingInfo, setBillingInfo] = useState(null); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const [userDetails, setUserDetails] = useState(null) useEffect(() => { const fetchData = async () => { try { const sessionId = localStorage.getItem('payment_session'); const storedUser = localStorage.getItem("userDetails"); let currentUser: UserDetails | null = null; if (storedUser) { const parsedUser = JSON.parse(storedUser); setUserDetails(parsedUser); currentUser = parsedUser; } // Fetch Subscription Status (Trial / Active Plan) if (currentUser && (currentUser.id || currentUser._id)) { try { const userId = currentUser.id || currentUser._id; // 1. Status const statusRes = await axios.get(`${ApiServerBaseUrl}/payment/status`, { params: { userId } }); setSubStatus(statusRes.data); // 2. Billing Info const billingRes = await axios.get(`${ApiServerBaseUrl}/payment/billing-info`, { params: { userId } }); setBillingInfo(billingRes.data); } catch (statusErr) { console.error("Error fetching status/billing:", statusErr); } } // Fetch Payment Details (if session exists) if (sessionId) { try { const res: any = await axios.get( `${ApiServerBaseUrl}/payment/details`, { params: { session_id: sessionId } } ); setPaymentData(res.data.data); } catch (paymentErr: any) { console.error("Error fetching payment data:", paymentErr); } } } catch (err: any) { console.error("Error in fetchData:", err); setError("Failed to load account details"); } finally { setLoading(false); } }; fetchData(); }, []); const handleManageBilling = async () => { if (!userDetails || (!userDetails.id && !userDetails._id)) return; try { const res = await axios.post(`${ApiServerBaseUrl}/payment/create-portal-session`, { userId: userDetails.id || userDetails._id }); if (res.data.url) { window.location.href = res.data.url; } } catch (err: any) { Swal.fire({ icon: 'error', title: 'Error', text: err.response?.data?.error || "Could not redirect to billing portal", background: '#111', color: '#fff', confirmButtonColor: '#d33' }); } }; const handleActivateTrial = async () => { if (!userDetails || (!userDetails.id && !userDetails._id)) return; try { const res = await axios.post(`${ApiServerBaseUrl}/payment/activate-trial`, { userId: userDetails.id || userDetails._id, email: userDetails.email }); if (res.data.success) { if (res.data.payment && res.data.payment.sessionId) { localStorage.setItem('payment_session', res.data.payment.sessionId); localStorage.setItem('paymentDetails', JSON.stringify(res.data.payment)); } Swal.fire({ icon: 'success', title: 'Trial Activated!', text: 'Your 7-day free trial has started.', background: '#111', color: '#fff', confirmButtonColor: '#4361ee' }); // Refresh status const statusRes = await axios.get(`${ApiServerBaseUrl}/payment/status`, { params: { userId: userDetails.id || userDetails._id } }); setSubStatus(statusRes.data); // Redirect for immediate access to dashboard/feature pages router.push('/'); } } catch (err: any) { Swal.fire({ icon: 'error', title: 'Activation Failed', text: err.response?.data?.error || "Could not activate trial", background: '#111', color: '#fff', confirmButtonColor: '#d33' }); } }; const handleCancelTrial = async () => { if (!userDetails || (!userDetails.id && !userDetails._id)) return; const result = await Swal.fire({ title: 'Are you sure?', text: "Your free trial will end immediately and you will lose access to premium features.", icon: 'warning', showCancelButton: true, confirmButtonColor: '#d33', cancelButtonColor: '#4361ee', confirmButtonText: 'Yes, cancel it!', background: '#111', color: '#fff', }); if (result.isConfirmed) { try { const res = await axios.post(`${ApiServerBaseUrl}/payment/cancel`, { session_id: subStatus?.stripeSessionId }); if (res.data) { localStorage.removeItem('payment_session'); localStorage.removeItem('paymentDetails'); Swal.fire({ title: 'Cancelled!', text: 'Your trial has been cancelled.', icon: 'success', background: '#111', color: '#fff', confirmButtonColor: '#4361ee' }); // Refresh status const userId = userDetails.id || userDetails._id; const statusRes = await axios.get(`${ApiServerBaseUrl}/payment/status`, { params: { userId } }); setSubStatus(statusRes.data); } } catch (err: any) { Swal.fire({ icon: 'error', title: 'Cancellation Failed', text: err.response?.data?.error || "Could not cancel trial", background: '#111', color: '#fff', confirmButtonColor: '#d33' }); } } }; // Construct invoices from either Payment Data or Subscription Status let invoices: Invoice[] = []; if (paymentData) { invoices.push({ id: paymentData.id || "1", number: paymentData.stripeSessionId?.substring(0, 12) || "INV-001", date: paymentData.subscriptionStartDate ? new Date(paymentData.subscriptionStartDate).toLocaleDateString() : "N/A", status: paymentData.status === "active" ? "Paid" : "Pending", amount: paymentData.amount || 0, }); } else if (subStatus && subStatus.hasUsedTrial) { // If no payment data but Trial was used/active invoices.push({ id: "trial-inv", number: subStatus.stripeSessionId ? subStatus.stripeSessionId.substring(0, 12) : "TRIAL-START", date: subStatus.trialStartDate ? new Date(subStatus.trialStartDate).toLocaleDateString() : "N/A", status: "Paid", // Free trial is considered 'paid' for access amount: 0, }); } const handleViewInvoice = (invoiceId: string) => { router.push(`/account-settings/invoice/${invoiceId}`); }; if (loading) { return (
Loading account details...
); } // Removed the blocking error page so users can still see trial options even if they haven't paid yet. return (
{/* Background Glows by User Request */}
{/* Header */}

Account Settings

Manage your account preferences and billing

{/* Tabs */}
{/* Content */}
{/* Subscription Section */} {activeTab === "subscription" && ( <>

Subscription Details

{/* 1. Active Subscription (Paid or Trial) */} {subStatus?.isTrialActive ? ( // CASE A: ACTIVE FREE TRIAL

Free Trial Active

ACTIVE

You are currently enjoying the 7-day free trial.

Plan Type Free Trial
Ends On {subStatus?.trialEndsAt ? new Date(subStatus.trialEndsAt).toLocaleDateString() : "N/A"}
) : (paymentData && paymentData.planId !== 'free_trial') ? ( // CASE B: ACTIVE PAID SUBSCRIPTION

{paymentData?.planId ? paymentData.planId.replace(/_/g, " ").toUpperCase() : "CURRENT PLAN"}

ACTIVE

Your subscription is active and running.

Plan Type {paymentData?.planId?.replace(/_/g, " ") || "N/A"}
Renews On {paymentData?.subscriptionEndDate ? new Date(paymentData.subscriptionEndDate).toLocaleDateString() : "N/A"}
) : ( // CASE C: NO ACTIVE SUBSCRIPTION

You don't have an active subscription.

{/* Show Activate Trial if not used yet */} {!subStatus?.hasUsedTrial ? (

Start Your 7-Day Free Trial

Experience all premium features for free. No credit card required (optional).

) : (
Your free trial has expired. Please upgrade to continue.
)}
)}
)} {/* Billing Tab Content */} {activeTab === "billing" && (

Billing Methods

{billingInfo?.hasPaymentMethod ? (
{billingInfo.brand?.toUpperCase()}

{billingInfo.brand?.charAt(0).toUpperCase() + billingInfo.brand?.slice(1)} ending in {billingInfo.last4}

Expires {billingInfo.exp_month}/{billingInfo.exp_year}

Default
) : (

No payment method saved.

)}

Redirects to secure Stripe Billing Portal

)} {/* Profile Tab Content */} {activeTab === "profile" && (

Profile

Full Name {userDetails?.name || "N/A"}
Email {userDetails?.email || "N/A"}
Phone {userDetails?.mobileNumber || "N/A"}
)}
{/* Billing History - Always visible */}

Billing History

{invoices.length > 0 ? invoices.map((invoice) => ( )) : ( )}
Invoice Number Date Status Amount
{invoice.number} {invoice.date} {invoice?.status} ${invoice?.amount}
No billing history found.
); }; export default AccountSettings;