/* Blackstock — Checkout / Onboarding flow */
const CheckoutPage = ({ onNavigate }) => {
const [step, setStep] = React.useState(1);
const [plan, setPlan] = React.useState('PRO');
const [billing, setBilling] = React.useState('monthly');
const [accounts, setAccounts] = React.useState(2);
const [email, setEmail] = React.useState('');
const [coupon, setCoupon] = React.useState('');
const [couponApplied, setCouponApplied] = React.useState(false);
// CheckoutPage está deprecado: el flujo comercial ahora se hace por
// llamada (BookingModal). Si alguien aterriza aquí, redirigimos al
// home y abrimos la reserva de llamada automáticamente.
React.useEffect(() => {
if (typeof window.bsOpenBooking === 'function') {
window.bsOpenBooking();
}
onNavigate && onNavigate('home');
}, []);
const planMap = {
BASIC: { monthly: 22.90, max: 1 },
PRO: { monthly: 149.90, max: 4 },
};
const price = (planMap[plan] || planMap.BASIC).monthly;
const discount = couponApplied ? Math.round(price * 0.2 * 100) / 100 : 0;
const total = Math.round((price - discount) * 100) / 100;
return (
{/* Compact nav */}
● PAGO SEGURO · STRIPE
{/* Step indicator */}
{[
{ n: 1, l: 'Plan' },
{ n: 2, l: 'Cuenta' },
{ n: 3, l: 'Pago' }].
map((s, i) =>
= s.n ? 'var(--acid)' : 'var(--bg-2)',
color: step >= s.n ? '#000' : 'var(--fg-3)',
border: '1px solid', borderColor: step >= s.n ? 'var(--acid)' : 'var(--line-2)',
display: 'flex', alignItems: 'center', justifyContent: 'center',
fontFamily: 'var(--font-mono)', fontSize: 12, fontWeight: 700
}}>{step > s.n ? '✓' : s.n}
= s.n ? 'var(--fg)' : 'var(--fg-3)', textTransform: 'uppercase'
}}>{s.l}
{i < 2 && s.n ? 'var(--acid)' : 'var(--line)' }} />}
)}
{/* Left form */}
{step === 1 &&
}
{step === 2 &&
}
{step === 3 &&
}
{/* Right summary */}
);
};
const Step1Plan = ({ plan, setPlan, billing, setBilling, accounts, setAccounts, planMap }) => {
const plans = [
{ id: 'BASIC', tag: 'Estándar', desc: 'Todo Blackstock. Opera desde tu equipo.' },
{ id: 'PRO', tag: 'Incluye Bazooka', desc: 'Todo Blackstock + worker remoto 24/7.', highlight: true }];
return (
Elige tu plan
Cambias o cancelas cuando quieras. Sin permanencia. Facturación mensual.
{/* Toggle anual eliminado: solo facturación mensual */}
{plans.map((p) =>
)}
);
};
const Step2Account = ({ email, setEmail }) =>
Crea tu cuenta
Acceso inmediato al panel y a la academia. Recibes el welcome kit en tu email.
{[
{ label: 'EMAIL', placeholder: 'tu@email.com', value: email, onChange: setEmail, type: 'email' },
{ label: 'NOMBRE', placeholder: 'Tu nombre', type: 'text' },
{ label: 'TELÉFONO (opcional)', placeholder: '+34 ...', type: 'tel' }].
map((f, i) =>
f.onChange && f.onChange(e.target.value)}
style={{
width: '100%', height: 52, padding: '0 18px',
background: 'var(--bg-1)', border: '1px solid var(--line-2)', borderRadius: 12,
color: 'var(--fg)', fontSize: 15, fontFamily: 'var(--font-body)',
outline: 'none'
}}
onFocus={(e) => e.target.style.borderColor = 'var(--acid)'}
onBlur={(e) => e.target.style.borderColor = 'var(--line-2)'} />
)}
;
const Step3Payment = ({ coupon, setCoupon, couponApplied, setCouponApplied }) =>
Método de pago
Pago seguro. Te cobramos hoy y se renueva mensualmente. Cancelas cuando quieras.
Acceso inmediato. Activamos el panel en cuanto se confirma el pago.
{['Tarjeta', 'PayPal', 'Bizum'].map((m, i) =>
)}
;
const OrderSummary = ({ plan, planMap, billing, price, discount, total, couponApplied }) =>
RESUMEN
BLACKSTOCK {plan}
Facturación mensual · hasta {planMap[plan].max} cuenta{planMap[plan].max > 1 ? 's' : ''}
{price}€
{/* Whats included */}
INCLUIDO
{[
'Bot de mercado ilimitado',
'IA negociadora',
'Multicuenta unificada',
'Restocks automáticos',
'Academia + comunidad',
'Soporte prioritario'].
map((f, i) =>
)}
Subtotal{price}€
{couponApplied &&
Descuento (20%)−{discount}€
}
TOTAL HOY
{total}€
Renovación mensual · cancelas cuando quieras
🛡
Pago seguro con Stripe. Sin permanencia.
;
Object.assign(window, { CheckoutPage, Step1Plan, Step2Account, Step3Payment, OrderSummary });