/* 11 Partners — "Cupido cobra" (Fase 1e) Alta de partner, login y mini-panel con su código PART-XXXXXX, sus números y sus referidos (SOLO el ID del cliente: privacidad RGPD por diseño). */ function Partner({ go }) { const [mode, setMode] = React.useState(() => (CruceAPI.Partner.Session.get() ? 'panel' : 'hero')); const [form, setForm] = React.useState({ name:'', email:'', phone:'', city:'', iban:'', password:'', accepts_terms:false }); const [login, setLogin] = React.useState({ email:'', password:'' }); const [panel, setPanel] = React.useState(null); const [referrals, setReferrals] = React.useState(null); const [error, setError] = React.useState(''); const [busy, setBusy] = React.useState(false); const [copied, setCopied] = React.useState(''); const set = (k, v) => setForm(f => ({ ...f, [k]: v })); const setL = (k, v) => setLogin(f => ({ ...f, [k]: v })); async function loadPanel() { const [me, refs] = await Promise.all([CruceAPI.Partner.me(), CruceAPI.Partner.referrals()]); setPanel(me); setReferrals(refs.referrals || []); if (me && me.partner) CruceAPI.Partner.Session.set(CruceAPI.Partner.Session.get().token, me.partner); } React.useEffect(() => { if (mode === 'panel') loadPanel().catch(e => { setError(e.message); setMode('hero'); }); }, [mode]); async function doRegister(ev) { ev.preventDefault(); setError(''); setBusy(true); try { const r = await CruceAPI.Partner.register({ name: form.name.trim(), email: form.email.trim(), phone: form.phone.trim() || undefined, city: form.city.trim() || undefined, iban: form.iban.trim() || undefined, password: form.password, accepts_terms: form.accepts_terms, }); CruceAPI.Partner.Session.set(r.token, r.partner); setMode('panel'); } catch (e) { setError(e.message); } finally { setBusy(false); } } async function doLogin(ev) { ev.preventDefault(); setError(''); setBusy(true); try { const r = await CruceAPI.Partner.login(login.email.trim(), login.password); CruceAPI.Partner.Session.set(r.token, r.partner); setMode('panel'); } catch (e) { setError(e.message); } finally { setBusy(false); } } function logout() { CruceAPI.Partner.Session.clear(); setPanel(null); setReferrals(null); setMode('hero'); } function copy(text, what) { navigator.clipboard && navigator.clipboard.writeText(text); setCopied(what); setTimeout(() => setCopied(''), 1500); } if (mode === 'panel' && panel) { const p = panel.partner, s = panel.stats || {}; const saleLabel = { pending_payment: 'Pendiente de pago', paid: 'Pagado', refunded: 'Reembolsado', cancelled: 'Cancelado' }; return (
Cruce
PANEL PARTNER
Hola, {p.name}. Tu clabe de Cupido:
{p.code}
{panel.referral_link}

Quien se registre con tu código queda vinculado a ti: aparece en tu panel como cliente tuyo y, cuando pague el Club, se confirma tu comisión de 10€. El pago siempre lo hace el cliente con Stripe — tú nunca tocas su dinero ni su tarjeta.

{[ ['Registrados', s.registrados || 0], ['Pagados', s.pagados || 0], ['Pendientes de pago', s.pendientes || 0], ['Comisión pendiente (€)', s.comision_pendiente || 0], ['Comisión cobrada (€)', s.comision_cobrada || 0], ].map(([label, val]) => (
{val}
{label}
))}
TUS CLIENTES
{!referrals || referrals.length === 0 ? (

Todavía no has registrado a nadie. Comparte tu código en la calle, en tus redes o por WhatsApp.

) : ( {referrals.map(r => ( ))}
ID clienteAltaPlanVentaComisión
#{r.client_id} {(r.registered_at || '').slice(0, 16)} {r.plan} {saleLabel[r.sale_status] || r.sale_status} {r.sale_status === 'refunded' ? '0€' : r.commission + '€'}{r.commission_paid ? ' · cobrada' : ''}
)}

Por privacidad (RGPD) solo ves el ID numérico de cada cliente. Nunca verás su nombre, email ni teléfono.

); } return (
Cruce
CUPIDO COBRA
Programa de partners

Lleva tu código.
Cobra 10€ por cada uno que pague.

En la feria, en el concierto, en la fiesta de pueblo: registras gente en 2 minutos desde tu móvil. El cliente paga online cuando quiera (Stripe, 3DS2), tú cobras 10€ por cada suscripción. Tú nunca pides tarjeta: solo compartes tu código.

  • Sin inversión ni stock: solo tu código PART-XXXXXX
  • Cobro mensual por transferencia a tu IBAN
  • Panel con tus números en tiempo real
{(mode === 'register' || mode === 'login') && (
{mode === 'register' ? 'ALTA DE PARTNER' : 'ENTRAR AL PANEL'}
{mode === 'register' && ( <> set('name',e.target.value)} placeholder="María Pérez" required/> set('email',e.target.value)} placeholder="tu@email.com" required/> set('phone',e.target.value)} placeholder="+34 600 000 000"/> set('city',e.target.value)} placeholder="Madrid"/> set('iban',e.target.value)} placeholder="ES91 2100 0418 4502 0005 1332"/> set('password',e.target.value)} required/> )} {mode === 'login' && ( <> setL('email',e.target.value)} required/> setL('password',e.target.value)} required/> )} {error &&
{error}
}
)}
); } function PF({ label, children }) { return ( ); } window.Partner = Partner;