// blackpool.jsx — BLACK POOL (Black Friday) mode
// Janela oficial (horário de Brasília, UTC-3):
// início 01/11 às 12h · fim 30/11 às 20h
const BP_START = Date.UTC(2026, 10, 1, 15, 0, 0);
const BP_END = Date.UTC(2026, 10, 30, 23, 0, 0);
const BP_WHATS_NUMBER = "5512982340551";
function getBlackPoolMode(override) {
const q = new URLSearchParams(location.search).get("blackpool");
const forced = q || (override && override !== "auto" ? override : null);
if (forced === "pre" || forced === "on" || forced === "off") return forced;
const now = Date.now();
if (now < BP_START) return "pre";
if (now <= BP_END) return "on";
return "off";
}
function useCountdown(target) {
const [now, setNow] = React.useState(Date.now());
React.useEffect(() => {
const id = setInterval(() => setNow(Date.now()), 1000);
return () => clearInterval(id);
}, []);
const ms = Math.max(0, target - now);
const pad = (n) => String(n).padStart(2, "0");
return {
d: pad(Math.floor(ms / 864e5)),
h: pad(Math.floor(ms / 36e5) % 24),
m: pad(Math.floor(ms / 6e4) % 60),
s: pad(Math.floor(ms / 1e3) % 60),
};
}
function BPCountdown({ target, size = "md" }) {
const c = useCountdown(target);
const cells = [[c.d, "dias"], [c.h, "horas"], [c.m, "min"], [c.s, "seg"]];
return (
{cells.map(([v, l], i) => (
{v}
{l}
))}
);
}
/* ───────────── Pré-Black: tela de entrada (pop-up) ───────────── */
function BPIntroModal({ onClose, onJoin, joined }) {
React.useEffect(() => {
const onKey = (e) => { if (e.key === "Escape") onClose(); };
document.addEventListener("keydown", onKey);
document.body.style.overflow = "hidden";
return () => { document.removeEventListener("keydown", onKey); document.body.style.overflow = ""; };
}, []);
return (
e.stopPropagation()} role="dialog" aria-label="Black Pool">
✕
Vem aí · Método DDP
BLACK POOL
Começa 01/11 · 12h
Termina 30/11 · 20h
Quem entrar no Método DDP durante a Black Pool ganha uma aula individual comigo , no Meet, sobre pool de liquidez.
Faltam
{joined ? (
Você já está na lista VIP ✓
) : (
Entrar na lista VIP
)}
Continuar para o site
);
}
/* ───────────── Pré-Black: barra de aquecimento + lista VIP ───────────── */
function BlackPoolTeaser() {
const [open, setOpen] = React.useState(false);
const [joined, setJoined] = React.useState(() => localStorage.getItem("bp-waitlist") === "1");
const [intro, setIntro] = React.useState(() => sessionStorage.getItem("bp-intro-seen") !== "1");
const closeIntro = () => { sessionStorage.setItem("bp-intro-seen", "1"); setIntro(false); };
const c = useCountdown(BP_START);
return (
<>
{intro && { closeIntro(); setOpen(true); }} />}
BLACK POOL
começa 01/11 às 12h
{c.d}d {c.h}h {c.m}m {c.s}s
setOpen(true)}>
{joined ? "Você está na lista ✓" : "Entrar na lista VIP"}
{open && (
setOpen(false)}
onJoined={() => { localStorage.setItem("bp-waitlist", "1"); setJoined(true); }}
/>
)}
>
);
}
function BPWaitlistModal({ onClose, onJoined }) {
const [name, setName] = React.useState("");
const [phone, setPhone] = React.useState("");
const [sent, setSent] = React.useState(false);
const valid = name.trim().length > 1 && phone.replace(/\D/g, "").length >= 10;
const submit = (e) => {
e.preventDefault();
if (!valid) return;
const msg = `Quero entrar na lista VIP da BLACK POOL.\nNome: ${name.trim()}\nWhatsApp: ${phone.trim()}`;
window.open(`https://api.whatsapp.com/send?phone=${BP_WHATS_NUMBER}&text=${encodeURIComponent(msg)}`, "_blank", "noopener");
onJoined();
setSent(true);
};
return (
e.stopPropagation()}>
✕
BLACKPOOL
{sent ? (
<>
Pronto, {name.split(" ")[0]}. Você está na lista.
Dia 01/11 às 12h você recebe o aviso no WhatsApp antes de todo mundo.
Fechar
>
) : (
)}
);
}
/* ───────────── Checkout Pix em modal (sem sair da página) ───────────── */
const BP_PIX = { API: "https://criptonahora.com", SLUG: "s3vp7a4nr7", PRICE_CENTS: 39999 };
const bpCpfOk = (d) => {
if (!/^\d{11}$/.test(d) || /^(\d)\1+$/.test(d)) return false;
const dv = (n) => { let s = 0; for (let i = 0; i < n; i++) s += +d[i] * (n + 1 - i); const r = s % 11; return r < 2 ? 0 : 11 - r; };
return dv(9) === +d[9] && dv(10) === +d[10];
};
const bpFmtCPF = (v) => v.replace(/\D/g, "").slice(0, 11).replace(/(\d{3})(\d{0,3})(\d{0,3})(\d{0,2})/, (m, a, b, c, e) => a + (b ? "." + b : "") + (c ? "." + c : "") + (e ? "-" + e : ""));
const bpBRL = (c) => "R$ " + (c / 100).toLocaleString("pt-BR", { minimumFractionDigits: 2 });
async function bpApi(path, opts) {
const r = await fetch(BP_PIX.API + path, opts); let d = {};
try { d = await r.json(); } catch (e) {}
if (!r.ok) { const e = new Error(d.detail || "Algo deu errado. Tente de novo."); e.data = d; e.status = r.status; throw e; }
return d;
}
function BPPixModal({ onClose }) {
const demo = React.useMemo(() => new URLSearchParams(location.search).has("demo") || /claude|localhost|127\.0\.0\.1/.test(location.hostname) || location.protocol === "file:", []);
const [step, setStep] = React.useState("form");
const [f, setF] = React.useState({ name: "", email: "", doc: "" });
const [errs, setErrs] = React.useState({});
const [formErr, setFormErr] = React.useState("");
const [busy, setBusy] = React.useState(false);
const [charge, setCharge] = React.useState(null);
const [left, setLeft] = React.useState(0);
const [status, setStatus] = React.useState("Aguardando pagamento…");
const [review, setReview] = React.useState(false);
const [copied, setCopied] = React.useState(false);
const [price, setPrice] = React.useState(BP_PIX.PRICE_CENTS);
const touch = React.useMemo(() => window.matchMedia && matchMedia("(pointer: coarse)").matches, []);
const close = () => { try { sessionStorage.removeItem("bp-pix-live"); } catch (e) {} onClose(); };
React.useEffect(() => {
try {
const s = JSON.parse(sessionStorage.getItem("bp-pix-live") || "null");
if (s && s.charge && new Date(s.charge.expires_at).getTime() > Date.now()) { setF(s.f); setCharge(s.charge); setStep("qr"); }
} catch (e) {}
}, []);
React.useEffect(() => {
try {
if (step === "qr" && charge) sessionStorage.setItem("bp-pix-live", JSON.stringify({ f, charge }));
else if (step !== "qr") sessionStorage.removeItem("bp-pix-live");
} catch (e) {}
}, [step, charge]);
React.useEffect(() => {
const k = (e) => e.key === "Escape" && close();
document.addEventListener("keydown", k);
const o = document.body.style.overflow; document.body.style.overflow = "hidden";
if (!demo) bpApi("/api/pagar/" + BP_PIX.SLUG).then((i) => { if (i.amount_cents) setPrice(i.amount_cents); if (i.active === false) setStep("off"); }).catch(() => {});
return () => { document.removeEventListener("keydown", k); document.body.style.overflow = o; };
}, []);
React.useEffect(() => {
if (step !== "qr" || !charge) return;
const end = new Date(charge.expires_at).getTime();
const tick = () => setLeft(Math.max(0, Math.round((end - Date.now()) / 1000)));
tick();
const cd = setInterval(tick, 1000);
let poll = null;
if (charge.demo) { poll = setTimeout(() => setStep("paid"), 7000); return () => { clearInterval(cd); clearTimeout(poll); }; }
const check = async () => {
try {
const d = await bpApi("/api/pagar/status/" + encodeURIComponent(charge.cashin_id));
if (d.paid) return setStep("paid");
if (d.status === "under_review") { setReview(true); setStatus("Pagamento recebido, em análise. Não pague de novo."); return; }
if (d.refund_reason === "PAYER_MISMATCH") { setStatus("O Pix saiu de outro CPF e foi devolvido."); setStep("again"); }
else if (["expired", "failed", "refunded"].includes(d.status)) { setStatus(d.status === "expired" ? "O QR expirou." : "Pagamento não concluído."); setStep("again"); }
} catch (e) {}
};
const vis = () => { if (document.visibilityState === "visible") { tick(); check(); } };
document.addEventListener("visibilitychange", vis);
window.addEventListener("pageshow", vis);
check(); poll = setInterval(check, 3000);
return () => { clearInterval(cd); clearInterval(poll); document.removeEventListener("visibilitychange", vis); window.removeEventListener("pageshow", vis); };
}, [step, charge]);
React.useEffect(() => {
if (step === "qr" && charge && !review && left === 0 && new Date(charge.expires_at).getTime() < Date.now()) { setStatus("O QR expirou."); setStep("again"); }
}, [left]);
React.useEffect(() => { if (step === "paid") { try { navigator.vibrate && navigator.vibrate([120, 60, 120]); } catch (e) {} } }, [step]);
const set = (k) => (e) => { const v = k === "doc" ? bpFmtCPF(e.target.value) : e.target.value; setF((s) => ({ ...s, [k]: v })); setErrs((s) => ({ ...s, [k]: "" })); };
const submit = async (e) => {
e.preventDefault(); setFormErr("");
const name = f.name.trim().replace(/\s+/g, " "), email = f.email.trim(), doc = f.doc.replace(/\D/g, "");
const er = {};
if (name.split(" ").length < 2 || name.length < 5) er.name = "Digite seu nome completo.";
if (!/^[^\s@]+@[^\s@]+\.[^\s@]{2,}$/.test(email)) er.email = "Digite um e-mail válido.";
if (!bpCpfOk(doc)) er.doc = doc.length !== 11 ? "Digite os 11 números do CPF." : "CPF inválido. Confira os números.";
setErrs(er); if (Object.keys(er).length) return;
setBusy(true);
try {
let c;
if (demo) { await new Promise((r) => setTimeout(r, 900)); c = { cashin_id: "demo-" + Date.now(), qr_copypaste: "00020126580014br.gov.bcb.pix0136demo-black-pool-metodo-ddp5204000053039865406399.995802BR", expires_at: new Date(Date.now() + 15 * 60000).toISOString(), demo: true }; }
else c = await bpApi("/api/pagar/" + BP_PIX.SLUG + "/cobrar", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ payer_name: name, payer_email: email, payer_tax_number: doc }) });
setCharge(c); setReview(false); setStatus("Aguardando pagamento…"); setStep("qr");
} catch (e) {
const map = { name: "name", email: "email", doc: "doc" };
if (e.data && map[e.data.field]) setErrs({ [map[e.data.field]]: e.message });
else if (e instanceof TypeError) setStep("error");
else setFormErr(e.message);
} finally { setBusy(false); }
};
const copy = async () => {
const t = charge.qr_copypaste; let ok = false;
try { await navigator.clipboard.writeText(t); ok = true; } catch (e) {}
if (!ok) { try { const a = document.createElement("textarea"); a.value = t; a.setAttribute("readonly", ""); a.style.cssText = "position:fixed;top:0;left:0;opacity:0;font-size:16px"; document.body.appendChild(a); a.select(); a.setSelectionRange(0, t.length); ok = document.execCommand("copy"); a.remove(); } catch (e) {} }
if (ok) { setCopied(true); setTimeout(() => setCopied(false), 2500); }
};
const ref = charge ? String(charge.cashin_id).slice(-8).toUpperCase() : "";
const wpp = "https://api.whatsapp.com/send?phone=" + BP_WHATS_NUMBER + "&text=" + encodeURIComponent("Olá Zulu! Acabei de pagar a Black Pool no Pix.\nNome: " + f.name.trim() + "\nPedido: " + ref + "\nQuero meu acesso e o código da aula individual.");
const mm = String(Math.floor(left / 60)).padStart(2, "0"), ss = String(left % 60).padStart(2, "0");
const dots = ["form", "qr", "paid"].indexOf(step === "again" ? "qr" : step);
return (
e.stopPropagation()} role="dialog" aria-label="Pagar no Pix">
✕
{demo &&
Demonstração · nenhum Pix real é gerado
}
{dots >= 0 &&
= 1 ? "on" : ""}> = 2 ? "on" : ""}>
}
{step === "form" && (
)}
{(step === "qr" || step === "again") && charge && (
{touch ? <>COPIE E PAGUE > : <>ESCANEIE E PAGUE >}
{step === "qr" && touch && (
<>
Pagando pelo celular? Copie o código e cole no app do banco em Pix Copia e Cola .
{copied ? "Código copiado ✓ Agora abra o banco" : "Copiar código Pix"}
>
)}
{charge.qr_image_url ?
:
QR CODE (demonstração) }
{step === "qr" && !review && }{status}
{step === "qr" && !review &&
{left ? "Expira em " + mm + ":" + ss : ""}
}
{step === "qr" ? (
<>
{charge.qr_copypaste}
{!touch &&
{copied ? "Código copiado ✓" : "Copiar código Pix"} }
{touch ? "Depois de pagar, volte para esta tela: ela confirma sozinha." : <>Abra o app do banco → Pix → Copia e Cola . Esta tela confirma sozinha quando o pagamento cair.>}
>
) : (
{ setCharge(null); setStep("form"); }}>Gerar um novo Pix
)}
)}
{step === "paid" && (
PAGAMENTO CONFIRMADO
Bem-vindo à Black Pool! Chame no WhatsApp para receber seu acesso e o código da aula individual .
Pedido {ref}
Receber acesso no WhatsApp
)}
{step === "error" && (
NÃO DEU PARA GERAR O PIX
O sistema de pagamento não respondeu. Tente de novo ou fale comigo no WhatsApp.
setStep("form")}>Tentar de novo
Falar no WhatsApp
)}
{step === "off" && (
PIX PAUSADO
O pagamento está pausado no momento. Fale comigo no WhatsApp.
Falar no WhatsApp
)}
);
}
/* ───────────── Black ativa: página BLACK POOL ───────────── */
function BlackPoolPage({ phase = "on" }) {
const pre = phase === "pre";
const target = pre ? BP_START : BP_END;
const [waitOpen, setWaitOpen] = React.useState(false);
const [pixOpen, setPixOpen] = React.useState(false);
const [joined, setJoined] = React.useState(() => localStorage.getItem("bp-waitlist") === "1");
const [intro, setIntro] = React.useState(() => pre && sessionStorage.getItem("bp-intro-seen") !== "1");
const closeIntro = () => { sessionStorage.setItem("bp-intro-seen", "1"); setIntro(false); };
const openWait = () => setWaitOpen(true);
const WaitBtn = ({ cls = "bp-btn bp-btn--violet", label = "Entrar na lista VIP" }) => (
joined ? Você está na lista VIP ✓
: {label}
);
const included = [
"Método DDP completo — 7 módulos, do zero ao avançado",
"Acesso vitalício ao conteúdo gravado",
"Grupo VIP no WhatsApp",
"Reunião ao vivo sobre pool de liquidez todo sábado, 9h",
];
const ticker = pre
? ["BLACK POOL", "COMEÇA 01/11 ÀS 12H", "AULA INDIVIDUAL", "LISTA VIP ABERTA"]
: ["BLACK POOL", "AULA INDIVIDUAL", "R$ 399,99 NO PIX OU USDT", "ATÉ 30/11 ÀS 20H"];
const tickerRow = [...ticker, ...ticker, ...ticker, ...ticker];
return (
{intro &&
{ closeIntro(); openWait(); }} />}
{waitOpen && (
setWaitOpen(false)}
onJoined={() => { localStorage.setItem("bp-waitlist", "1"); setJoined(true); }}
/>
)}
BLACK POOL
{pre ? "começa 01/11 às 12h" : "termina 30/11 às 20h"}
{pre ? "Vem aí · Método DDP · 01/11 — 30/11" : "Método DDP · 01/11 — 30/11"}
BLACK
POOL
{pre ? "De 01/11 a 30/11, quem" : "Quem"} entrar no Método DDP durante a Black Pool recebe uma aula individual comigo , no Meet, sobre pool de liquidez.
a partir de R$ 399,99 no Pix
{pre && (
Abre em
)}
Zulu Martimiano
{tickerRow.map((t, i) => (
{t}✦
))}
Só na Black Pool
1 aluno
1 hora
1 Meet comigo
Todo aluno que comprar na Black Pool ganha uma aula individual sobre pool de liquidez. Só você e eu, no Google Meet, olhando para a sua pool.
A oferta
Tudo do Método DDP+ aula individual
{included.map((t, i) => (
{t}
))}
★ Aula individual comigo no Meet — exclusivo Black Pool
Cartão
De R$ 597,99
R$ 539
ou 12x de R$ 53,00
Melhor preço
Pix ou USDT
De R$ 597,99
R$ 399,99
à vista
{pre ?
:
setPixOpen(true)}>Pagar no Pix · R$ 399,99 }
{pre ? "Compra liberada dia 01/11 às 12h. Quem está na lista VIP recebe o aviso primeiro." : "Garantia de 7 dias — 100% do dinheiro de volta."}
A BLACK POOL {pre ? "COMEÇA EM" : "ACABA EM"}
{pre ? "01/11 às 12h · até 30/11 às 20h" : "30/11 às 20h a aula individual sai da oferta."}
{pixOpen && setPixOpen(false)} />}
);
}