// Agora Seller Dashboard — "Sell on Agora" view for sellers managing their storefront. const SellerDash = ({ setRoute }) => { const data = window.AG_DATA; const seller = data.sellers.par; // "you" as a seller const myItems = data.items.filter(i => i.seller === seller.id); const [tab, setTab] = useState('listings'); return (
{/* Header */}
Seller dashboard

Good morning, Maya.

Rive Droite · Paris · CET 09:14
{/* KPI strip */}
{[ { l:'Sales · 30d', v:'€84,210', d:'+22% vs prior', up:true }, { l:'Open orders', v:'4', d:'2 awaiting auth' }, { l:'Active listings', v: myItems.length, d:'3 ending soon' }, { l:'Active offers', v:'7', d:'3 require response', red: true }, { l:'Payout next', v:'€18,460', d:'Releases 24 Apr · 3 days' }, ].map(k => (
{k.l}
{k.v}
{k.up && } {k.red && } {k.d}
))}
{/* Tabs */}
{[ { id:'listings', l:'Listings · '+myItems.length }, { id:'orders', l:'Orders · 4' }, { id:'offers', l:'Offers · 7' }, { id:'dreams', l:'Dream Finder briefs · 12 matching' }, { id:'analytics',l:'Analytics' }, { id:'payouts', l:'Payouts' }, ].map(t => ( setTab(t.id)} className="ag-label" style={{ cursor:'pointer', padding:'14px 0', color: tab===t.id ? 'var(--ag-ink)':'var(--ap-fg-muted)', borderBottom: tab===t.id ? '2px solid var(--ag-ink)':'2px solid transparent', marginBottom: -1 }}>{t.l} ))}
{/* Content */}
{tab === 'listings' && } {tab === 'orders' && } {tab === 'offers' && } {tab === 'dreams' && } {tab === 'analytics' && } {tab === 'payouts' && }
); }; // ----- LISTINGS TABLE ----- const ListingsTable = ({ items, setRoute }) => (
All · {items.length} Live · {items.length} Drafts · 2 Sold · 18 Paused · 0
{['','Piece','Title','Price','Cond.','Watchers','Listed','Status'].map((h, i) => (
{h}
))}
{items.map((it, i) => (
setRoute({ name:'product', id: it.id })}>
{it.brand}
{it.id.toUpperCase()}
{it.title}
€{it.eur.toLocaleString()}
{it.cond}
{it.watchers}
{it.listedAgo} ago
{i===0 ? '3 Offers' : 'Live'}
))}
); // ----- ORDERS TABLE ----- const OrdersTable = () => { const data = window.AG_DATA; const orders = [ { id:'#AG-26-04-21-9482', buyer:'Lea Kobayashi', loc:'Berlin', item: data.byId.i01, price: 11420, status:'Awaiting auth', when:'2h ago' }, { id:'#AG-26-04-20-7621', buyer:'Henrik Jensen', loc:'Hamburg', item: data.byId.i05, price: 14800, status:'In transit to hub', when:'1d ago' }, { id:'#AG-26-04-18-5104', buyer:'Sophia Reuter', loc:'Munich', item: data.byId.i12, price: 1740, status:'Authenticated · ready to ship', when:'3d ago' }, { id:'#AG-26-04-15-2208', buyer:'Élise Martin', loc:'Paris', item: data.byId.j01, price: 5840, status:'Delivered', when:'1w ago' }, ]; return (
{orders.map(o => (
{o.id}
{o.item.title}
Buyer
{o.buyer}
{o.loc}
Status
{o.status}
{o.when}
€{o.price.toLocaleString()}
))}
); }; // ----- OFFERS ----- const OffersTable = () => { const data = window.AG_DATA; const offers = [ { item: data.byId.i02, buyer:'Lea K.', loc:'Berlin', offered: 4500, asked: 5090, when:'2h ago', state:'pending' }, { item: data.byId.i01, buyer:'Mateo G.', loc:'Madrid', offered: 10200, asked: 11420, when:'5h ago', state:'pending' }, { item: data.byId.i08, buyer:'Yuki S.', loc:'Tokyo', offered: 5800, asked: 6320, when:'1d ago', state:'pending' }, { item: data.byId.i03, buyer:'Anna M.', loc:'Stockholm', offered: 540, asked: 608, when:'2d ago', state:'countered' }, ]; return (
{offers.map((o, i) => (
{o.item.brand} · {o.item.title.split('·')[0].trim()}
{o.buyer} · {o.loc} · {o.when}
Asking
€{o.asked.toLocaleString()}
Offered
€{o.offered.toLocaleString()}
{Math.round((o.offered/o.asked)*100)}% of asking
))}
); }; // ----- DREAM FINDER BRIEFS (your listings matching open searches) ----- const DreamsTable = () => { const data = window.AG_DATA; const briefs = [ { brief:'Hermès Kelly 28 · Etoupe · Palladium', buyers:7, budget:'€11k–€13k', match: data.byId.i01, score: 96 }, { brief:'Chanel Classic Flap Medium · Caviar · Black', buyers:12, budget:'€4.8k–€5.5k', match: data.byId.i02, score: 92 }, { brief:'Birkin 30 · Gold hardware', buyers:4, budget:'€13k–€16k', match: data.byId.i05, score: 88 }, ]; return (

Buyers commission Agora to find pieces. Your active listings that match open Dream Finder briefs surface here — message the buyer directly when ready.

{briefs.map((b, i) => (
Open brief · {b.buyers} buyers
{b.brief}
Budget {b.budget}
Your match
{b.match.brand} · {b.match.title.split('·')[0].trim()}
{b.score}
Match score
))}
); }; // ----- ANALYTICS ----- const Analytics = () => (
Sales · last 90 days
€241,820
7d 30d 90d All
Top countries
{[ { c:'Germany', v: 42, n:'34 sales' }, { c:'United States', v: 28, n:'22 sales' }, { c:'United Kingdom', v: 18, n:'14 sales' }, { c:'Switzerland', v: 12, n:'10 sales' }, { c:'Japan', v: 8, n:'7 sales' }, ].map(c => (
{c.c}{c.n}
))}
); // ----- PAYOUTS ----- const Payouts = () => (
Next payout
€18,460
Releases 24 April 2026 · 3 orders · 1.5% Agora fee · 0.6% FX
Payout method
SEPA · FR76 •••• •••• 8842 1208
Crédit Mutuel · Paris
Payout history
{[ { d:'10 Apr 26', a:'€22,140', n:'5 orders' }, { d:'27 Mar 26', a:'€14,820', n:'4 orders' }, { d:'13 Mar 26', a:'€18,920', n:'5 orders' }, { d:'27 Feb 26', a:'€11,640', n:'3 orders' }, ].map(p => (
{p.d}
{p.n}
{p.a}
))}
); window.SellerDash = SellerDash;