Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
57 commits
Select commit Hold shift + click to select a range
455a766
setting firebase databases
gabrielbfranca Nov 17, 2025
3fe128c
adding login implementation
gabrielbfranca Jan 19, 2026
682b171
implementando página de módulo e resolvendo duplicação do docker
gabrielbfranca Feb 5, 2026
23bc06a
Merge pull request #17 from UnB-CIS/firebase-database
pedronascimentos Feb 10, 2026
7c99d68
implementando tela de ranking
gabrielbfranca Feb 16, 2026
bda3462
feat: add theme constants
pedronascimentos Mar 2, 2026
fd33ca8
feat: add lesson data for modulo 1
pedronascimentos Mar 2, 2026
603fdb1
feat: update navigation types for all screens
pedronascimentos Mar 2, 2026
88bde6c
feat: register new screens in navigator
pedronascimentos Mar 2, 2026
b0eda0d
fix: auth flow conditional navigation
pedronascimentos Mar 2, 2026
4675949
feat: add bug reports firebase service
pedronascimentos Mar 2, 2026
76f26df
feat: add user profile update functions
pedronascimentos Mar 2, 2026
a655b8a
feat: add seed script for lesson data
pedronascimentos Mar 2, 2026
5fdbfcf
feat: add horizontal menu component
pedronascimentos Mar 2, 2026
b771ea8
SIGN-11: add tela de recuperacao de senha
pedronascimentos Mar 2, 2026
5f8d554
SIGN-7: add streak display and load modules from data
pedronascimentos Mar 2, 2026
7f0bca4
SIGN-7: add module detail and lesson complete screens
pedronascimentos Mar 2, 2026
7a35c02
SIGN-8: upgrade tela de perfil com dados do usuario
pedronascimentos Mar 2, 2026
ac362b5
SIGN-8: add tela de editar perfil
pedronascimentos Mar 2, 2026
82a27cf
SIGN-8: add tela de alterar senha
pedronascimentos Mar 2, 2026
5d6d054
SIGN-9: upgrade tela de ranking com filtros e destaque do usuario
pedronascimentos Mar 2, 2026
f167e86
SIGN-10: add tela de report de bug
pedronascimentos Mar 2, 2026
35277ba
SIGN-12: add tela de ensino do sinal
pedronascimentos Mar 2, 2026
dbb6df9
SIGN-13: add tela de gravacao do sinal
pedronascimentos Mar 2, 2026
fa3bf99
feat: tela de quiz/avaliação com questões múltipla escolha
pedronascimentos Mar 2, 2026
56ac5f2
feat: tela de pesquisa com filtros por categoria
pedronascimentos Mar 2, 2026
35d4d6f
feat: tela de progresso com estatísticas e gráfico semanal
pedronascimentos Mar 2, 2026
8d54a02
feat: tela de configurações com toggles e preferências
pedronascimentos Mar 2, 2026
1f1d43f
feat: fluxo de onboarding com 4 telas de boas-vindas
pedronascimentos Mar 2, 2026
27ed27f
feat: tela de notificações com filtros, marcar como lida e deletar
pedronascimentos Mar 2, 2026
866da12
Foundation: theme, navigation types, data, services
DaniloCTM Mar 8, 2026
b5f6b68
SIGN-5: APP-001 — Implementação da Tela de Cadastro (#19)
pedronascimentos Mar 8, 2026
f113c26
SIGN-6: APP-002 — Implementação da Tela de Login (#20)
pedronascimentos Mar 8, 2026
d724a90
adding link on LoginScreen
gabrielbfranca Mar 23, 2026
9929fff
Merge branch 'staging' into feature/SIGN-11/tela-recuperacao-senha
gabrielbfranca Mar 23, 2026
fc041a7
Merge pull request #21 from UnB-CIS/feature/SIGN-11/tela-recuperacao-…
gabrielbfranca Mar 23, 2026
3c76839
Merge pull request #22 from UnB-CIS/feature/SIGN-7/tela-modulos
gabrielbfranca Mar 23, 2026
d6ee847
Merge pull request #23 from UnB-CIS/feature/SIGN-8/tela-perfil
gabrielbfranca Mar 23, 2026
e558f0a
Merge pull request #24 from UnB-CIS/feature/SIGN-9/tela-ranking
gabrielbfranca Mar 23, 2026
c05c2c7
Merge pull request #25 from UnB-CIS/feature/SIGN-10/tela-report-bug
gabrielbfranca Mar 23, 2026
37886bf
Merge pull request #26 from UnB-CIS/feature/SIGN-12/tela-ensino-sinal
gabrielbfranca Mar 23, 2026
7dc09c0
Merge pull request #27 from UnB-CIS/feature/SIGN-13/tela-gravacao-sinal
gabrielbfranca Mar 23, 2026
cdbdc2d
Merge pull request #35 from UnB-CIS/feature/SIGN-31/tela-notificacoes
gabrielbfranca Mar 23, 2026
a9e9160
Merge branch 'staging' into feature/SIGN-26/tela-quiz
gabrielbfranca Mar 23, 2026
2539d37
Merge pull request #29 from UnB-CIS/feature/SIGN-26/tela-quiz
gabrielbfranca Mar 23, 2026
0be64e5
Merge branch 'staging' into feature/SIGN-27/tela-pesquisar
gabrielbfranca Mar 23, 2026
9521711
Merge pull request #31 from UnB-CIS/feature/SIGN-27/tela-pesquisar
gabrielbfranca Mar 23, 2026
7fe3221
Merge branch 'staging' into feature/SIGN-28/tela-progresso
gabrielbfranca Mar 23, 2026
07a9c5c
Merge pull request #32 from UnB-CIS/feature/SIGN-28/tela-progresso
gabrielbfranca Mar 23, 2026
80940c5
Merge branch 'staging' into feature/SIGN-29/tela-configuracoes
gabrielbfranca Mar 23, 2026
8c7d3d5
Merge pull request #33 from UnB-CIS/feature/SIGN-29/tela-configuracoes
gabrielbfranca Mar 23, 2026
05233f2
Merge branch 'staging' into feature/SIGN-30/tela-onboarding
gabrielbfranca Mar 23, 2026
71c6030
Merge pull request #34 from UnB-CIS/feature/SIGN-30/tela-onboarding
gabrielbfranca Mar 23, 2026
77bbf4f
removendo Stack de forgot password
gabrielbfranca Mar 23, 2026
bc9b01d
Add tests for ProgressoScreen and LoginScreen; enhance error handling…
DaniloCTM Mar 31, 2026
65bdd86
feat: enhance SignTeachingScreen navigation and add quiz functionality
DaniloCTM Apr 13, 2026
a2d5a01
feat/ fixing forgot password
gabrielbfranca Apr 26, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
File renamed without changes.
5 changes: 5 additions & 0 deletions .firebaserc
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"projects": {
"default": "sign-59b97"
}
}
5 changes: 5 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -73,3 +73,8 @@ yarn-error.log
!.yarn/releases
!.yarn/sdks
!.yarn/versions

# Local tooling and debug logs
firebase-debug.log
.codex/
.claude/
53 changes: 23 additions & 30 deletions App.tsx
Original file line number Diff line number Diff line change
@@ -1,28 +1,24 @@
import React, { useEffect, useState } from 'react';
import "./global.css";
import { NavigationContainer, LinkingOptions } from '@react-navigation/native';
import { AuthProvider } from './src/contexts/AuthContext';
import { useAuth } from './src/hooks/useAuth';
import SplashScreen from './src/screens/SplashScreen';
import AuthNavigator from './src/navigation/AuthNavigator';
import AppNavigator from './src/navigation/AppNavigator';
import { View, ActivityIndicator, StyleSheet } from 'react-native';
// @types
import { onAuthStateChanged } from 'firebase/auth';
import { auth } from './src/services/firebase';
import { AuthStackParamList, AppStackParamList } from './src/@types/navigation';
type RootStackParamList = AuthStackParamList & AppStackParamList;


type RootStackParamList = AuthStackParamList & AppStackParamList;

const linkingConfig: LinkingOptions<RootStackParamList> = {
prefixes: ['sign://'],
config: {
// mapeando os links das telas
screens: {
// AuthNavigator (AuthStackParamList)
Register: 'register',
Login: 'login',

// AppNavigator (AppStackParamList)
ForgotPassword: 'forgot-password',
MainTabs: {
screens: {
Home: 'home',
Expand All @@ -36,39 +32,37 @@ const linkingConfig: LinkingOptions<RootStackParamList> = {
};

function RootNavigator() {
const { token, isLoading: isAuthLoading } = useAuth();
const { signIn, signOut } = useAuth();
const [isAppLoading, setIsAppLoading] = useState(true);
const [firebaseUser, setFirebaseUser] = useState<boolean | null>(null);

useEffect(() => {
const unsubscribe = onAuthStateChanged(auth, (user) => {
setFirebaseUser(!!user);
if (user) {
signIn(user.uid);
} else {
signOut();
}
});
return unsubscribe;
}, [signIn, signOut]);

useEffect(() => {
setTimeout(() => {
setIsAppLoading(false);
// react-native-splash-screen (nativo) o .hide() aqui
}, 1500);
setTimeout(() => setIsAppLoading(false), 1500);
}, []);


if (isAppLoading || isAuthLoading) {
if (isAppLoading || firebaseUser === null) {
return <SplashScreen />;
}

// <></> (Fragmento) necessário
return (
<>
{token == null ? (
<AuthNavigator />
) : (
<AppNavigator />
)}
</>
);
return firebaseUser ? <AppNavigator /> : <AuthNavigator />;
}


export default function App() { // o AuthProvider envolve tudo pois passa diretamente o estado do usuário para todos os componentes dentro
export default function App() {
return (
<AuthProvider>
<NavigationContainer<RootStackParamList> // após isso vem o de navegação
<AuthProvider>
<NavigationContainer<RootStackParamList>
linking={linkingConfig}
fallback={
<View style={styles.loading}>
Expand All @@ -89,4 +83,3 @@ const styles = StyleSheet.create({
alignItems: 'center',
},
});

209 changes: 209 additions & 0 deletions BACKEND_LINEAR_ISSUES.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,209 @@
# Backend Issues Para Linear

Cada bloco abaixo foi escrito para ser usado como uma issue individual no Linear.

---

## 📌 Título da Issue
[Backend] Definir e versionar a configuração do Firebase no repositório

---

### 🎯 Descrição
Hoje o projeto inicializa Firebase no app, mas o repositório não contém arquivos de infraestrutura como `firebase.json`, `firestore.rules`, `storage.rules` ou uma configuração documentada de emuladores. Isso deixa segurança, ambientes locais e deploys pouco padronizados.

### ✅ Critérios de Aceitação
- [ ] O repositório possui `firebase.json` com configuração mínima de emuladores e serviços usados pelo app.
- [ ] Existem arquivos versionados de regras do Firestore e do Storage.
- [ ] O fluxo local de desenvolvimento com Firebase Emulator está documentado.
- [ ] Existe uma orientação clara para diferenciar ambiente local, staging e produção.

### 📝 Checklist de Tarefas
- [ ] Criar `firebase.json`.
- [ ] Criar `firestore.rules`.
- [ ] Criar `storage.rules`.
- [ ] Documentar comandos para subir emuladores.
- [ ] Documentar como apontar o app para ambiente local quando necessário.

---

## 📌 Título da Issue
[Backend] Implementar upload real de mídia no Firebase Storage

---

### 🎯 Descrição
O app já prevê uso de imagens para avatar e bug report, mas hoje não existe upload real para Storage. No cadastro, apenas o caminho lógico da imagem é salvo; no bug report, o anexo ainda está marcado como "em desenvolvimento".

### ✅ Critérios de Aceitação
- [ ] O app consegue fazer upload de avatar do usuário para o Firebase Storage.
- [ ] O app consegue anexar imagens em bug reports e persistir as URLs no Firestore.
- [ ] Existe tratamento de erro para falha de upload e limite de quantidade/tamanho de imagens.
- [ ] As regras do Storage restringem acesso de escrita a usuários autenticados.

### 📝 Checklist de Tarefas
- [ ] Definir estrutura de pastas no Storage para avatares e bug reports.
- [ ] Implementar serviço de upload e remoção de arquivos.
- [ ] Persistir `profilePictureUrl` com URL utilizável pelo app.
- [ ] Persistir `imageUrls` em `bugReports`.
- [ ] Validar limite de anexos e tamanho máximo.

---

## 📌 Título da Issue
[Backend] Persistir todos os campos do perfil do usuário

---

### 🎯 Descrição
A tela de edição de perfil já expõe `name`, `phone`, `gender` e `birth_date`, mas atualmente apenas `name` é salvo no Firestore. Falta consolidar o schema do usuário e persistir os demais campos de forma consistente.

### ✅ Critérios de Aceitação
- [ ] O documento de `users` contempla nome, telefone, gênero e data de nascimento.
- [ ] A tela de perfil exibe os novos campos persistidos.
- [ ] A edição de perfil salva todos os campos suportados pelo formulário.
- [ ] Existe validação básica para os novos atributos antes de persistir.

### 📝 Checklist de Tarefas
- [ ] Atualizar a tipagem do usuário no serviço.
- [ ] Salvar `phone`, `gender` e `birth_date` no Firestore.
- [ ] Carregar os campos persistidos na tela de edição.
- [ ] Exibir os campos relevantes na tela de perfil.
- [ ] Definir valores opcionais e regras de validação.

---

## 📌 Título da Issue
[Backend] Migrar cursos e lições de dados locais para Firestore

---

### 🎯 Descrição
As telas de `Home`, `ModuleDetail` e `SignTeaching` ainda dependem de `src/data/modules.ts`. Embora já exista uma camada de serviços para `courses` e `lessons`, ela ainda não está sendo usada pela experiência principal do app.

### ✅ Critérios de Aceitação
- [ ] A listagem de módulos e lições é carregada do Firestore.
- [ ] O app não depende mais de `src/data/modules.ts` como fonte principal de verdade.
- [ ] Existe um fluxo documentado para seed inicial do conteúdo.
- [ ] O app lida com estados de loading, vazio e erro ao buscar conteúdo.

### 📝 Checklist de Tarefas
- [ ] Criar consultas para listar cursos e lições consumidas pela UI.
- [ ] Adaptar `HomeScreen` para carregar conteúdo remoto.
- [ ] Adaptar `ModuleDetailScreen` para carregar lições remotas.
- [ ] Revisar `seedLessons.ts` para garantir uso idempotente e documentado.
- [ ] Remover dependência estrutural dos dados mockados locais.

---

## 📌 Título da Issue
[Backend] Persistir progresso do usuário, XP e ofensiva no Firestore

---

### 🎯 Descrição
Existe um modelo de `progress` e o documento de usuário já prevê `xp`, `xpEarnedThisWeek` e `streak`, mas a jornada principal do app ainda não persiste progresso real de lição concluída, desbloqueio de módulos, ofensiva diária e ganho de XP.

### ✅ Critérios de Aceitação
- [ ] Ao concluir uma lição, o progresso do usuário é persistido no Firestore.
- [ ] O app registra pontuação por lição, XP acumulado e ofensiva atual.
- [ ] O desbloqueio de módulos depende do progresso real do usuário.
- [ ] A tela inicial e a tela de perfil refletem os dados persistidos.

### 📝 Checklist de Tarefas
- [ ] Definir a estratégia de identificação do documento de progresso por usuário e curso.
- [ ] Persistir conclusão de lições e score.
- [ ] Atualizar `xp` e `xpEarnedThisWeek` após conclusão.
- [ ] Atualizar `streak.current`, `streak.longest` e `lastPracticedAt`.
- [ ] Usar progresso real para liberar ou bloquear módulos.

---

## 📌 Título da Issue
[Backend] Integrar ranking com leaderboards reais do Firestore

---

### 🎯 Descrição
A tela de ranking ainda usa `MOCK_PLAYERS`, mesmo já existindo uma camada de serviços para `leaderboards`. Falta integrar leitura real, ordenação por critério e destaque do usuário autenticado com dados persistidos.

### ✅ Critérios de Aceitação
- [ ] A tela de ranking carrega participantes de um leaderboard real no Firestore.
- [ ] O ranking suporta ao menos o critério principal de pontuação semanal.
- [ ] O usuário autenticado aparece destacado corretamente quando estiver no ranking.
- [ ] O refresh da tela consulta dados reais em vez de resetar mocks locais.

### 📝 Checklist de Tarefas
- [ ] Conectar `Ranking.tsx` aos serviços de `leaderboards`.
- [ ] Definir como identificar o leaderboard ativo.
- [ ] Mapear o formato dos participantes para a UI.
- [ ] Remover `MOCK_PLAYERS`.
- [ ] Tratar estados de loading, vazio e erro.

---

## 📌 Título da Issue
[Backend] Implementar automação server-side para ciclos de leaderboard

---

### 🎯 Descrição
O modelo de `leaderboards` já prevê `startDate`, `endDate` e `xpEarnedThisWeek`, mas não há automação visível para abertura de novas temporadas, reset semanal de XP ou movimentação de usuários entre rankings. Essa lógica precisa existir no backend, não apenas no cliente.

### ✅ Critérios de Aceitação
- [ ] Existe um fluxo server-side para criar ou encerrar leaderboards por período.
- [ ] O XP semanal é reiniciado no início de um novo ciclo.
- [ ] A aplicação consegue localizar o leaderboard ativo com base na data atual.
- [ ] A lógica crítica não depende de execução manual pelo app cliente.

### 📝 Checklist de Tarefas
- [ ] Definir se a automação será feita por Cloud Functions, job externo ou outro mecanismo.
- [ ] Criar rotina para abertura de novo ciclo semanal.
- [ ] Criar rotina para fechamento do ciclo anterior.
- [ ] Revisar impacto no campo `xpEarnedThisWeek`.
- [ ] Documentar operação e monitoramento do processo.

---

## 📌 Título da Issue
[Backend] Revisar o fluxo de sessão local para não tratar UID como token

---

### 🎯 Descrição
Atualmente o `AuthContext` persiste o `uid` do Firebase no AsyncStorage sob a chave `@App:token`. Isso funciona como estado local de navegação, mas não representa um token real de autenticação e pode gerar confusão na evolução da arquitetura.

### ✅ Critérios de Aceitação
- [ ] O app deixa de tratar `uid` como token de API.
- [ ] O nome da chave e do estado local reflete corretamente seu propósito.
- [ ] O fluxo de autenticação permanece funcional após a refatoração.
- [ ] Existe documentação breve explicando a estratégia adotada para sessão local.

### 📝 Checklist de Tarefas
- [ ] Renomear o estado salvo localmente para algo semântico.
- [ ] Revisar chamadas de `signIn` e `signOut` do contexto.
- [ ] Garantir compatibilidade com o listener de `onAuthStateChanged`.
- [ ] Limpar dependências futuras em cima do pseudo-token atual.

---

## 📌 Título da Issue
[Backend] Aumentar a cobertura de testes da camada de serviços Firebase

---

### 🎯 Descrição
Hoje há poucos testes cobrindo a camada que conversa com Firebase. Como o app depende diretamente de Auth e Firestore, vale fortalecer a cobertura com casos reais em emulator e testes unitários para fluxos críticos.

### ✅ Critérios de Aceitação
- [ ] Existem testes para cadastro, login, atualização de perfil e bug report.
- [ ] Existem testes para progresso, cursos, lições e leaderboards.
- [ ] Os testes críticos podem rodar contra Firebase Emulator localmente.
- [ ] O fluxo de execução dos testes está documentado.

### 📝 Checklist de Tarefas
- [ ] Mapear os fluxos críticos da camada de serviços.
- [ ] Adicionar testes unitários e de integração com emulator.
- [ ] Documentar setup local dos testes.
- [ ] Garantir limpeza de dados criados durante os testes.

2 changes: 2 additions & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
FROM node:20

RUN apt-get update && apt-get install -y watchman && rm -rf /var/lib/apt/lists/*

WORKDIR /app

COPY package.json package-lock.json ./
Expand Down
Loading