// Módulo LIVE — Planejamento (hub de lives) const LivePlanejamentoPage = () => { const [creating, setCreating] = React.useState(false); const goToApresentar = () => { window.location.hash = "#live-apresentar"; }; const lives = [ { id: 48, nome: "Live #48 — Vestidos Verão 26", data: "19/05/2026", hora: "20:00", duracao: "38m em andamento", status: "Ao vivo", roteiro: 10, apresentados: 4, faturamento: 8240.50, pedidos: 47, clientes: 23, ticket: 175.33, apresentadora: "Letícia Borges", cor: "var(--red)" }, { id: 49, nome: "Live #49 — Vibes praia + linho", data: "22/05/2026", hora: "20:00", duracao: "agendada", status: "Agendada", roteiro: 14, apresentados: 0, faturamento: 0, pedidos: 0, clientes: 0, ticket: 0, apresentadora: "Letícia Borges", convites: 2418, cor: "var(--cyan)" }, { id: 50, nome: "Live #50 — Marco · Coleção Inverno", data: "29/05/2026", hora: "20:00", duracao: "rascunho", status: "Rascunho", roteiro: 6, apresentados: 0, faturamento: 0, pedidos: 0, clientes: 0, ticket: 0, apresentadora: "—", cor: "var(--text-3)" }, ]; return (
Gestão de lives

Lives

Crie roteiros, inicie a transmissão, acompanhe resultados. Toque Iniciar para abrir o painel de Apresentar no celular.

{/* Ativa + agendadas */}
Em andamento · Próximas
{lives.map(l => )}
{/* Histórico */}

Lives realizadas

{LIVES_HISTORICO.map((l, i) => ( ))}
LiveDataPedidosClientesFaturamentoTicket% pagos
{l.nome} {l.data} {l.pedidos} {l.clientes} {brl(l.faturamento)} {brl(l.ticket)} = 85 ? "green" : "amber"} dot>{l.pagos}%
{creating && setCreating(false)} onCreate={() => { setCreating(false); }}/>}
); }; const LiveCard = ({ live, onStart }) => { const isAtiva = live.status === "Ao vivo"; const isAgendada = live.status === "Agendada"; const isRascunho = live.status === "Rascunho"; return (
{/* status bar lateral */}
{isAtiva && ( AO VIVO )} {isAgendada && AGENDADA} {isRascunho && RASCUNHO} {live.duracao}

{live.nome}

{live.data} · {live.hora} · {live.roteiro} produtos no roteiro {live.apresentadora !== "—" && <>· {live.apresentadora}}
{isAtiva && (
FATURADO
{brl(live.faturamento)}
PEDIDOS
{live.pedidos}
CLIENTES
{live.clientes}
APRESENTADOS
{live.apresentados}/{live.roteiro}
)} {isAgendada && (
CONVITES ENVIADOS
{numFmt(live.convites)} destinatários
LEMBRETE AUTO
1h antes · WhatsApp
SE INSCREVERAM
847 pessoas
)} {isRascunho && (
⚠️ Roteiro incompleto · faltam ao menos 4 produtos para confirmar a live.
)}
{/* Right side: actions */}
{isAtiva && ( <> )} {isAgendada && ( <> )} {isRascunho && ( <> )}
); }; const NovaLiveModal = ({ onClose, onCreate }) => { const [step, setStep] = React.useState(1); const [nome, setNome] = React.useState("Live #51 — "); const [produtos, setProdutos] = React.useState([]); const toggleProduto = (id) => { setProdutos(p => p.includes(id) ? p.filter(x => x !== id) : [...p, id]); }; return (
{ if (e.target === e.currentTarget) onClose(); }}>
NOVA LIVE · ETAPA {step}/3

{step === 1 ? "Quando vai ser?" : step === 2 ? "Quais produtos no roteiro?" : "Convidar audiência"}

{step === 1 && (
Nome da live
setNome(e.target.value)}/>
Data
Horário
Apresentadora
Duplicar de
)} {step === 2 && (
{produtos.length} produtos selecionados · arraste para reordenar depois
{PRODUTOS.map(p => { const sel = produtos.includes(p.id); return (
toggleProduto(p.id)} style={{padding:'10px 12px', borderBottom:'1px solid var(--line)', cursor:'pointer', background: sel ? 'var(--accent-soft)' : 'transparent'}}>
{p.foto}
{p.nome}
{p.id} · {p.estoqueTotal} un
{brl(p.precoLive)}
); })}
)} {step === 3 && (
Segmentação dos convites
Champions + Leais Compraram na última live + filtro
Estimativa: 2.418 destinatários · custo R$ 120,90
Lembrete automático
1h antes da live · WhatsApp
Cashback de live
5% sobre cada pedido
)}
{step < 3 ? : }
); }; Object.assign(window, { LivePlanejamentoPage });