function Billing({ go, user, plan, onCancel }) { const wide = useWide(); const [tab, setTab] = React.useState('overview'); const [confirm, setConfirm] = React.useState(false); const price = plan === 'yearly' ? 800 : 99; return (
§ ACCOUNT · BILLING
Your subscription.
{[['overview','Overview'],['history','Payment history'],['account','Account']].map(([k, l]) => (
setTab(k)} style={{ padding: '12px 18px', cursor: 'pointer', color: tab === k ? TH.accent : TH.inkSoft, borderBottom: tab === k ? `2px solid ${TH.accent}` : '2px solid transparent', marginBottom: -1, }}>{l}
))}
{tab === 'overview' && (
CURRENT PLAN
Walkforward Membership
● ACTIVE
${price} / {plan === 'yearly' ? 'year' : 'month'}
NEXT PAYMENT · APR 18, {plan === 'yearly' ? '2027' : 'MAY 18'} · VIA WHOP
{plan === 'monthly' ? { /* upgrade */ }}>Switch to yearly · save $388 : Switch to monthly} setConfirm(true)}>Cancel subscription
PAYMENT METHOD
W
Whop Crypto Checkout
USDC · Ethereum
Manage in Whop →
✓ 30-DAY REFUND WINDOW
✓ ARCHIVE ACCESS · 30 DAYS POST-CANCEL
✓ NO HIDDEN FEES
)} {tab === 'history' && (
{[ ['Apr 18, 2026', `${plan === 'yearly' ? 'Yearly' : 'Monthly'} renewal`, `$${price}.00`, '0x8fa...3c1e', 'Paid'], ['Mar 18, 2026', 'Monthly renewal', '$99.00', '0x2b7...9a4d', 'Paid'], ['Feb 18, 2026', 'Monthly renewal', '$99.00', '0xe41...77cc', 'Paid'], ['Jan 18, 2026', 'Monthly renewal', '$99.00', '0x5f2...88a1', 'Paid'], ['Dec 18, 2025', 'Initial subscription', '$99.00', '0xa89...12ff', 'Paid'], ].map((row, i) => (
{row[0]} {row[1]} {wide && {row[2]}} {wide && {row[3]}} ● {row[4].toUpperCase()}
))}
)} {tab === 'account' && (
Save changes
)} {confirm && (
⚠ CANCEL SUBSCRIPTION
Sorry to see you go.
Your access continues through {plan === 'yearly' ? 'Apr 18, 2027' : 'May 18, 2026'}. Archive access stays for 30 days after that. No hard feelings — reactivate anytime.
setConfirm(false)} style={{ flex: 1 }}>Keep subscription { onCancel(); setConfirm(false); go('landing'); }} style={{ flex: 1, borderColor: TH.red, color: TH.red }}>Confirm cancel
)}
); } Object.assign(window, { Billing });