Você pode manter vários eventos abertos ao mesmo tempo. Dois controles independentes por evento: inscrições (aceitar novos cadastros) e edição (mexer em quem já cadastrou). Fechar inscrições não trava a edição — pra congelar tudo, use Travar edição.
{eventos == null ?
carregando…
: eventos.length === 0 ?
Nenhum evento. Crie um e ative pra abrir inscrições.
:
Evento
Inscrições
Edição
{eventos.map(ev => (
{ev.nome}{ev.wp_event_id ? 🔗 vinculado : avulso}
{ev.ativo ? abertas : fechadas}
{ev.edicao_travada ? travada : liberada}
{ev.ativo ?
: }
{ev.edicao_travada ?
: }
))}
}
);
}
function Empresas({ produtorId, ehAdmin, onAbrir }) {
const [empresas, setEmpresas] = useState(null);
const [solics, setSolics] = useState([]);
const load = useCallback(() => {
API.listarEmpresas().then(es => setEmpresas(ehAdmin ? es.filter(e => e.produtor_id === produtorId) : es)).catch(e => toast(e.message, true));
API.listarSolicitacoes().then(ss => setSolics(ehAdmin ? ss.filter(e => e.produtor_id === produtorId) : ss)).catch(() => {});
}, [produtorId, ehAdmin]);
useEffect(() => { load(); }, [load]);
const criar = async (e) => {
e.preventDefault(); const f = e.target;
const payload = { nome: f.nome.value.trim(), cota: parseInt(f.cota.value || '0', 10), login: f.login.value.trim(), senha: f.senha.value };
if (ehAdmin) payload.produtor_id = produtorId;
try { await API.criarEmpresa(payload); f.reset(); f.cota.value = 0; toast('Empresa cadastrada'); load(); }
catch (err) { toast(err.message, true); }
};
const novaCota = async (e) => {
const v = window.prompt('Nova cota (0 = ilimitada):', e.cota);
if (v === null) return;
try { await API.atualizarEmpresa(e.id, { cota: parseInt(v, 10) }); toast('Cota atualizada'); load(); } catch (err) { toast(err.message, true); }
};
const aprovar = async (e) => {
const v = window.prompt('Aprovar "' + e.nome + '" com qual cota? (0 = ilimitada)', '0');
if (v === null) return;
try { await API.aprovarEmpresa(e.id, parseInt(v || '0', 10)); toast('Empresa aprovada'); load(); } catch (err) { toast(err.message, true); }
};
const rejeitar = async (e) => {
if (!confirm('Rejeitar e apagar a solicitação de "' + e.nome + '"?')) return;
try { await API.rejeitarEmpresa(e.id); toast('Solicitação rejeitada'); load(); } catch (err) { toast(err.message, true); }
};
const desativar = async (e) => {
if (!confirm('Desativar "' + e.nome + '"? Ela não vai mais conseguir entrar nem cadastrar. Dá pra reativar depois.')) return;
try { await API.desativarEmpresa(e.id); toast('Empresa desativada'); load(); } catch (err) { toast(err.message, true); }
};
const reativar = async (e) => {
try { await API.ativarEmpresa(e.id); toast('Empresa reativada'); load(); } catch (err) { toast(err.message, true); }
};
const excluir = async (e) => {
if (!confirm('EXCLUIR "' + e.nome + '" e TODOS os participantes dela? Os ingressos no sistema de eventos serão cancelados. Esta ação não dá pra desfazer.\n\n(Pra só impedir o acesso sem apagar, use Desativar.)')) return;
if (!confirm('Tem certeza? Digite OK no próximo aviso pra confirmar a exclusão de "' + e.nome + '".')) return;
try { await API.excluirEmpresa(e.id); toast('Empresa excluída'); load(); } catch (err) { toast(err.message, true); }
};
const linkCadastro = window.location.origin + window.location.pathname + '?cadastro=' + produtorId;
const copiarLink = () => { navigator.clipboard.writeText(linkCadastro).then(() => toast('Link copiado')).catch(() => window.prompt('Copie o link:', linkCadastro)); };
const aprovadas = empresas ? empresas.filter(e => e.status !== 'pendente') : null;
return (
Empresas parceiras
🔗 Link de cadastro: envie pros parceiros se cadastrarem sozinhos (você aprova e define a cota).
⚠️ Nenhum evento disponível — não há evento aberto, nem evento fechado com participantes seus. Quando o produtor abrir um evento, o cadastro libera por aqui.
) : !selId ? (
Escolha o evento
Você tem mais de um evento. Selecione em qual quer trabalhar (os abertos aceitam novos cadastros; os fechados seguem editáveis até o produtor travar).
) : (
<>
{(() => {
const st = statusEv(evento);
const aviso = (evento && evento.edicao_travada)
? { txt: '🔒 Edição travada — esta lista está só para leitura.', cls: 'fechado' }
: podeCadastrar
? { txt: cheia ? '🎟️ Cota cheia — não há vagas restantes neste evento.' : '🎟️ Inscrições abertas — cadastre os participantes da sua empresa.', cls: '' }
: { txt: '✏️ Inscrições fechadas — você ainda pode editar e remover quem já cadastrou.', cls: '' };
return (