import { useState, useEffect } from "react"; import { updatePassword } from "firebase/auth"; import { auth } from "../../firebase/config"; import { getAccount, createPortalSession } from "../../api/account"; import "./Account.css"; export default function Account() { const [account, setAccount] = useState(null); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const [newPassword, setNewPassword] = useState(""); const [confirmPassword, setConfirmPassword] = useState(""); const [passwordMsg, setPasswordMsg] = useState(null); const [passwordErr, setPasswordErr] = useState(null); const [changingPassword, setChangingPassword] = useState(false); const [portalLoading, setPortalLoading] = useState(false); useEffect(() => { async function fetchAccount() { try { const data = await getAccount(); setAccount(data); } catch (err) { setError(err.message); } finally { setLoading(false); } } fetchAccount(); }, []); async function handlePasswordChange(e) { e.preventDefault(); setPasswordMsg(null); setPasswordErr(null); if (newPassword.length < 6) { setPasswordErr("Password must be at least 6 characters"); return; } if (newPassword !== confirmPassword) { setPasswordErr("Passwords do not match"); return; } try { setChangingPassword(true); await updatePassword(auth.currentUser, newPassword); setPasswordMsg("Password updated successfully"); setNewPassword(""); setConfirmPassword(""); } catch (err) { setPasswordErr(err.message); } finally { setChangingPassword(false); } } async function handleManageSubscription() { try { setPortalLoading(true); const { url } = await createPortalSession(); window.location.href = url; } catch (err) { setError(err.message); } finally { setPortalLoading(false); } } if (loading) { return
Loading...
; } if (error && !account) { return
Error: {error}
; } const isCanceling = account.cancel_at_period_end; const statusLabel = isCanceling ? "Canceling" : account.subscription_status === "active" ? "Active" : account.subscription_status.charAt(0).toUpperCase() + account.subscription_status.slice(1); return (

Account

{error &&
{error}
} {/* ── Profile Section ──────────────────────── */}

Profile

Email {account.email}
User Name {account.user_name}
User ID {account.user_id}
{/* ── Subscription Section ─────────────────── */}

Subscription

Plan {account.subscription_plan}
Status {statusLabel}
{account.member_since && (
Member Since {account.member_since}
)} {account.next_billing_date && !isCanceling && (
Next Billing Date {account.next_billing_date}
)} {isCanceling && account.period_end_date && (
Access Until {account.period_end_date}
)} {isCanceling && (
Your subscription has been canceled and will not renew. You have full access until {account.period_end_date}.
)}

Cancel subscription, update payment method, or view invoices via Stripe.

{/* ── Change Password Section ──────────────── */}

Change Password

{passwordMsg &&
{passwordMsg}
} {passwordErr &&
{passwordErr}
}
setNewPassword(e.target.value)} disabled={changingPassword} required />
setConfirmPassword(e.target.value)} disabled={changingPassword} required />
); }