Sistema completo de gerenciamento de rifas em React + Firebase Firestore, sem backend próprio, pronto para hospedar no GitHub Pages.
- Grade de números com status em tempo real (disponível / reservado / pago)
- Reserva de múltiplos números com confirmação por transação do Firestore (impede que duas pessoas reservem o mesmo número ao mesmo tempo)
- Painel administrativo com dashboard, busca, exportação em CSV, edição e cancelamento de reservas
- Tela de configuração da rifa (nome, valor, quantidade de números, PIX, etc.)
src/
components/ → peças de interface reutilizáveis
pages/ → Home (site público) e Admin (painel)
services/ → firebase.js (conexão) e rifaService.js (regras de negócio)
hooks/ → useRifa.js (dados em tempo real + estatísticas)
utils/ → formatters.js e validators.js
context/ → AuthContext.jsx (login do admin)
firestore.rules → regras de segurança do Firestore
scripts/seedRifa.js → script opcional para popular números via linha de comando
-
Acesse o Console do Firebase e crie um novo projeto.
-
Ative o Firestore Database (modo produção).
-
Ative o Authentication → método "Email/senha".
-
Em Configurações do projeto → Seus apps, crie um app Web e copie as credenciais (
apiKey,authDomain, etc.). -
Copie
.env.examplepara.enve preencha com essas credenciais:cp .env.example .env -
Publique as regras de segurança (
firestore.rules) usando a Firebase CLI:npm install -g firebase-tools firebase login firebase init firestore # aponte para o projeto criado, aceite os arquivos padrão firebase deploy --only firestore:rulesOu cole o conteúdo de
firestore.rulesdiretamente em Firestore Database → Regras no Console.
Como o projeto não usa backend, a permissão de administrador é controlada por
um documento na coleção admins, cujo ID é o UID do usuário:
- Em Authentication → Users, crie manualmente um usuário com email e senha.
- Copie o UID desse usuário.
- Em Firestore Database, crie a coleção
adminse um documento com esse UID como ID (o conteúdo pode ser apenas{ "email": "seuemail@exemplo.com" }).
A partir daí, esse usuário poderá entrar em /#/admin e, uma vez logado,
poderá promover outros administradores pelo mesmo processo (ou diretamente
pelo Console).
npm install
npm run dev
Acesse http://localhost:5173. A área administrativa fica em
http://localhost:5173/#/admin.
Na primeira vez que você salvar a tela Configuração (dentro do painel
admin), o sistema cria automaticamente todos os documentos da coleção rifa
de 1 até a quantidade configurada — não é necessário nenhum script.
Se preferir popular via linha de comando (por exemplo, para um número muito
grande de rifas), use o script opcional em scripts/seedRifa.js (instruções
dentro do próprio arquivo).
-
Crie um repositório no GitHub e suba o projeto.
-
Se o nome do repositório não for
rifa-beneficente, ajuste a propriedadebaseemvite.config.jspara/nome-do-seu-repositorio/. -
Instale as dependências e publique:
npm install npm run deployIsso gera a build (
npm run build) e publica a pastadistna branchgh-pagesusando o pacotegh-pages. -
Em Settings → Pages do repositório, confirme que a branch
gh-pagesestá selecionada como fonte.
Importante: como o
.envnão é commitado (está no.gitignore), o GitHub Pages não terá acesso às variáveis de ambiente automaticamente. Rodenpm run buildlocalmente (com o.envpreenchido) antes donpm run deploy, para que as credenciais do Firebase já fiquem embutidas nos arquivos gerados.
Ao confirmar uma reserva, o app roda uma transação do Firestore
(runTransaction) que:
- Relê o estado atual de cada número selecionado direto do servidor;
- Reserva apenas os que ainda estiverem disponíveis;
- Retorna a lista de números que já haviam sido reservados por outra pessoa enquanto o formulário estava sendo preenchido.
Isso garante que, mesmo com dois usuários clicando em "Reservar" no mesmo instante para o mesmo número, apenas um deles terá sucesso.
As cores, tipografia e espaçamentos ficam centralizados em
src/styles/global.css (variáveis CSS no topo do arquivo), inspiradas em um
layout de rifa beneficente com tema de festa infantil — roxo profundo, ribbon
vermelho e um medalhão dourado com o valor do ponto. Basta editar as
variáveis para adaptar à identidade visual da sua própria rifa.