/* Admin → Marketplace Manager: approve vendors, run fundraisers. Feeds the parent app's Marketplace screen. */ function MarketplaceManagerScreen() { const [pending, setPending] = React.useState([ { id:1, n:'Bright Minds Tutoring', cat:'Tutoring', sub:'1-on-1 reading & math · submitted 2d ago', icon:'graduation-cap', tint:'var(--blue-100)', ic:'var(--blue-500)' }, { id:2, n:'Katy Dance Academy', cat:'Enrichment', sub:'Ballet & hip-hop · submitted 3d ago', icon:'music', tint:'var(--danger-100)', ic:'var(--danger-500)' }, { id:3, n:'Junior Robotics Lab', cat:'After-School', sub:'STEM club · submitted 5d ago', icon:'cpu', tint:'var(--info-100)', ic:'var(--info-500)' }, ]); const [fundraisers, setFundraisers] = React.useState([ { id:1, n:'New Library Books Drive', raised:3240, goal:5000, days:8 }, { id:2, n:'8th Grade DC Trip', raised:11800, goal:18000, days:24 }, ]); const approved = [ { n:'Mathnasium of Katy', cat:'Tutoring', price:'$35/session', rating:'4.9', enroll:42 }, { n:'Katy Youth Soccer League', cat:'Sports', price:'$120/season', rating:'4.7', enroll:88 }, { n:'Young Coders Club', cat:'After-School', price:'$80/month', rating:'4.8', enroll:31 }, { n:'Reading Buddies', cat:'Tutoring', price:'Free', rating:'5.0', enroll:64 }, ]; const decide = (v, ok) => { setPending(ps => ps.filter(x => x.id !== v.id)); jlToast(v.n + (ok ? ' approved & published' : ' declined'), { icon: ok?'check-check':'x', color: ok?'#1F9D57':'#E5484D' }); }; const money = (n) => '$' + n.toLocaleString(); return (
{/* stat tiles */}
{/* pending approvals */} {pending.length} waiting}> {pending.length === 0 ? (
All caught up — no vendors awaiting review.
) : pending.map((v,i) => (
{v.n}
{v.cat} · {v.sub}
))}
{/* fundraisers */} jlToast('New fundraiser form opened', { icon:'plus' })} style={{ display:'inline-flex', alignItems:'center', gap:5, fontSize:12.5, fontWeight:700, color:'var(--blue-500)', cursor:'pointer' }}>New}> {fundraisers.map((f,i) => { const pct = Math.round((f.raised/f.goal)*100); return (
{f.n} {f.days} days left
{money(f.raised)} / {money(f.goal)} {pct}%
); })}
{/* approved listings */} jlToast('Add a new listing', { icon:'plus' })} style={{ fontSize:12.5, fontWeight:700, color:'var(--blue-500)', cursor:'pointer' }}>Add Listing} pad={false}>
ProgramCategoryPriceRatingEnrolled
{approved.map((a,i) => (
jlToast('Opening '+a.n, { icon:'store' })} style={{ display:'grid', gridTemplateColumns:'2fr 1fr 1fr .8fr 1fr', alignItems:'center', padding:'12px 18px', borderTop:'1px solid var(--gray-100)', fontSize:13.5, cursor:'pointer' }}> {a.n} {a.cat} {a.price} {a.rating} {a.enroll}
))}
); } Object.assign(window, { MarketplaceManagerScreen });