import { useEffect, useState } from 'react'; import { Card, Typography, Switch, Button, Table, Modal, message, Space, Divider } from 'antd'; import { useNavigate } from 'react-router-dom'; import { fetchMyOrders, OrderHistoryItem, updateConsent, exportMyData, deleteMyAccount } from './customerApi'; import { setFavoriteAlerts } from './favoritesApi'; import { useCustomerAuth } from './CustomerAuthContext'; const { Title, Text } = Typography; export default function Account() { const { customer, loading, refresh, logout } = useCustomerAuth(); const [orders, setOrders] = useState([]); const navigate = useNavigate(); useEffect(() => { if (customer) fetchMyOrders().then(setOrders); }, [customer]); useEffect(() => { if (!loading && !customer) navigate('/login'); }, [loading, customer, navigate]); if (!customer) return null; async function handleFavoriteAlertsToggle(checked: boolean) { try { await setFavoriteAlerts(checked); } catch (err) { message.error((err as Error).message); return; } refresh(); message.success(checked ? 'We will email you when a favorite sells' : 'Turned off'); } async function handleConsentToggle(checked: boolean) { await updateConsent(checked); message.success(checked ? 'Subscribed to emails' : 'Unsubscribed from emails'); refresh(); } async function handleLogout() { try { await logout(); } catch (err) { message.error(`Couldn't log out — ${(err as Error).message}`); return; } // replace, so Back doesn't return to the account page — which would only // bounce to /login now that the session is gone. navigate('/', { replace: true }); } function handleDelete() { Modal.confirm({ title: 'Delete your account?', content: 'This permanently removes your account and personal data. Your past orders are kept for accounting purposes but disconnected from your identity. This cannot be undone.', okText: 'Delete my account', okButtonProps: { danger: true }, onOk: async () => { await deleteMyAccount(); message.success('Account deleted'); navigate('/'); } }); } return (
My Account {customer.email} {!customer.email_verified && (
Email not verified — check your inbox for a verification link.
)} Receive emails about new items {/* A separate consent from marketing above, and shown separately so a customer can hold one without the other. */}
Email me when an item I favorited is sold
Order History `$${(v / 100).toFixed(2)}` }, { title: 'Processor', dataIndex: 'processor' }, { title: 'Date', dataIndex: 'created_at', render: (v: string) => new Date(v).toLocaleDateString() } ]} /> ); }