Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
54 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
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
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 { token, signIn, signOut } = useAuth();
const [isAppLoading, setIsAppLoading] = useState(true);

const [firebaseUser, setFirebaseUser] = useState<boolean | null>(null);

useEffect(() => {
setTimeout(() => {
setIsAppLoading(false);
// react-native-splash-screen (nativo) o .hide() aqui
}, 1500);
const unsubscribe = onAuthStateChanged(auth, (user) => {
setFirebaseUser(!!user);
if (user) {
signIn(user.uid);
} else {
signOut();
}
});
return unsubscribe;
}, []);

useEffect(() => {
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',
},
});

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
82 changes: 54 additions & 28 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@

[![Version](https://img.shields.io/badge/version-1.0.0-blue.svg)](https://github.com/seu-usuario/sign-app)
[![License](https://img.shields.io/badge/license-MIT-green.svg)](https://claude.ai/chat/LICENSE)
[![React Native](https://img.shields.io/badge/React%20Native-0.73-61DAFB.svg?logo=react)](https://reactnative.dev/)
[![Node](https://img.shields.io/badge/Node-22.0-339933.svg?logo=node.js)](https://nodejs.org/)
[![React Native](https://img.shields.io/badge/React%20Native-0.81-61DAFB.svg?logo=react)](https://reactnative.dev/)
[![Node](https://img.shields.io/badge/Node-%3E%3D20-339933.svg?logo=node.js)](https://nodejs.org/)

</div>

Expand All @@ -25,12 +25,18 @@ Repositório principal do app **Sign** desenvolvido pelo IEEE Computational Inte
Antes de começar, certifique-se de que você tem as seguintes ferramentas instaladas e configuradas em sua máquina:

* [**Git**](https://git-scm.com/downloads)
* [**Node.js e NPM**](https://nodejs.org/)
* [**Docker e Docker Compose**](https://www.docker.com/products/docker-desktop/)
* [**Android SDK Command-Line Tools**](https://developer.android.com/studio)
* **Pelo menos um Emulador (AVD)** Você precisa ter um Android Virtual Device criado.
* [**Node.js >= 20**](https://nodejs.org/) — recomendado via [nvm](https://github.com/nvm-sh/nvm)
* [**Android Studio + Android SDK**](https://developer.android.com/studio) com pelo menos um Emulador (AVD) criado
* **watchman** (Linux/macOS) — necessário para o Hot Reload funcionar corretamente:

**IMPORTANTE:** Após instalar o Android SDK, é necessário configurar a variável de ambiente `ANDROID_HOME` apontando para o diretório do SDK.
```bash
# Ubuntu/Debian
sudo apt-get install -y watchman
# macOS
brew install watchman
```

**IMPORTANTE:** Após instalar o Android SDK, é necessário configurar a variável de ambiente `ANDROID_HOME` apontando para o diretório do SDK.

* [Tutorial de instalação e configuração do Android Studio e AVD Manager](https://youtu.be/XfJj6EQZfAc)

Expand Down Expand Up @@ -72,40 +78,60 @@ npm run dev:start:win

E **pronto**, suas alterações no código serão refletidas automaticamente no emulador (Hot Reload).

### Dentro dos entrypoints
### Dentro dos entrypoints

O comando `npm run dev:start:*` executa uma série de passos para criar um ambiente de desenvolvimento completo e funcional:

- 1 Verifica se a variável de ambiente `ANDROID_HOME` está configurada.
- 2 Encontra um emulador Android (AVD) disponível em sua máquina.
- 3 Inicia o emulador automaticamente em segundo plano.
- 4 Aguarda o sistema operacional do emulador carregar por completo.
- 5 Inicia o container Docker (via `docker-compose`), que irá:

- Construir a imagem, executando `npm install` **dentro do container**.
- Iniciar o servidor Metro Bundler.
🔗 Configura o `adb reverse`, permitindo que o app no emulador se comunique com o Metro dentro do container.
📲 Instala e inicia o aplicativo React Native no emulador.
1. Verifica se a variável de ambiente `ANDROID_HOME` está configurada.
2. Inicia o **Metro Bundler diretamente no host** (na porta 8081) com reset de cache.
3. Aguarda a porta 8081 ficar disponível.
4. Inicia o emulador Android (AVD) automaticamente em segundo plano *(modo emulador)* ou aguarda um dispositivo USB *(modo device)*.
5. Aguarda o sistema operacional do emulador carregar por completo.
6. Configura o `adb reverse tcp:8081 tcp:8081`, permitindo que o app no emulador se comunique com o Metro no host.
7. Compila o app via Gradle (`assembleDebug`) e instala no dispositivo (`installDebug`).
8. Inicia o aplicativo automaticamente.

### Solução de Problemas (Troubleshooting)

1. **Erro: `A variável de ambiente ANDROID_HOME não está definida.`**
1. **Erro: `A variável de ambiente ANDROID_HOME não está definida.`**

* **Solução:** Crie a variável de ambiente `ANDROID_HOME` apontando para a pasta do Android SDK (normalmente `~/Android/Sdk` no Linux/macOS). Adicione ao seu `~/.bashrc` ou `~/.zshrc`:

```bash
export ANDROID_HOME="$HOME/Android/Sdk"
export PATH="$PATH:$ANDROID_HOME/platform-tools:$ANDROID_HOME/emulator"
```

2. **Erro: `Nenhum emulador (AVD) encontrado.`**

* **Solução:** Crie um dispositivo virtual pelo AVD Manager no Android Studio ou via linha de comando:

```bash
avdmanager create avd -n MeuEmulador -k "system-images;android-34;google_apis;x86_64"
```

3. **O comando `adb` não foi encontrado.**

* **Solução:** Você precisa criar a variável de ambiente `ANDROID_HOME` e fazê-la apontar para a pasta onde seu Android SDK foi instalado.
* **Solução:** O `adb` fica em `$ANDROID_HOME/platform-tools`. Certifique-se de que esse caminho está no seu `PATH` (veja item 1).

2. **Erro: `Nenhum emulador (AVD) encontrado.`**
4. **Hot Reload não funciona (alterações no código não refletem no emulador).**

* **Solução:** Você precisa criar um dispositivo virtual através do AVD Manager no Android Studio ou via linha de comando com `avdmanager`.
* **Solução:** Certifique-se de que o **watchman** está instalado (`watchman --version`). Sem ele, o Metro usa um watcher menos eficiente que pode não detectar mudanças de arquivos corretamente no Linux.

3. **O Docker parece não funcionar ou o comando `docker-compose` falha.**
5. **Erro de versão do Node.js.**

* **Solução:** Certifique-se de que o Docker Desktop está em execução na sua máquina.
* **Solução:** O projeto requer Node.js >= 20. Use o [nvm](https://github.com/nvm-sh/nvm) para gerenciar versões:

4. **O comando `adb` não foi encontrado.**
```bash
nvm install 20
nvm use 20
```

* **Solução:** O `adb` fica na pasta `platform-tools` dentro do seu Android SDK. Adicione `%ANDROID_HOME%\platform-tools` (Windows) ou `$ANDROID_HOME/platform-tools` (Linux/macOS) à sua variável de ambiente `PATH`.
6. **A porta 8081 já está em uso.**

5. **Erro durante o `docker-compose up` (falha no `npm install` dentro do container).**
* **Solução:** Encerre o processo que está ocupando a porta e tente novamente:

* **Solução:** Isso pode ser um problema de rede ou um pacote quebrado no `package.json`. Tente forçar uma reconstrução limpa da imagem com o comando: `docker-compose build --no-cache` e depois rode o script de start novamente. Verifique o log do Docker para mensagens de erro específicas do `npm`.
```bash
fuser -k 8081/tcp
```

2 changes: 2 additions & 0 deletions android/app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -124,3 +124,5 @@ dependencies {
implementation("com.google.firebase:firebase-auth")
implementation("com.google.firebase:firebase-firestore")
}

apply from: "../../node_modules/react-native-vector-icons/fonts.gradle"
Empty file modified android/gradlew
100644 → 100755
Empty file.
2 changes: 1 addition & 1 deletion entrypoint.bat
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ echo [INFO] Emulador pronto!

:: Passo 5: Iniciar o container Docker com o Metro Bundler
echo [INFO] Iniciando o container Docker com docker-compose...
docker-compose up -d --build
docker-compose up -d

:: Passo 6: Configurar o redirecionamento de porta
echo [INFO] Configurando 'adb reverse' para a porta 8081...
Expand Down
36 changes: 18 additions & 18 deletions entrypoint.sh
Original file line number Diff line number Diff line change
Expand Up @@ -13,26 +13,19 @@ log() {
echo -e "\n${GREEN}[INFO]${NC} $1"
}

# PASSO 0: Derrubar containers antigos
log "Garantindo que containers antigos estao parados e removidos..."
docker compose down
log "Ambiente Docker limpo."

# PASSO 1: Verificar se o ANDROID_HOME está configurado
# PASSO 0: Verificar se o ANDROID_HOME está configurado
if [ -z "$ANDROID_HOME" ]; then
echo "Erro: A variável de ambiente ANDROID_HOME não está definida."
exit 1
fi
export PATH=$PATH:$ANDROID_HOME/emulator:$ANDROID_HOME/platform-tools

export ANDROID_HOME=$HOME/Android/Sdk
export PATH=$PATH:$ANDROID_HOME/emulator
export PATH=$PATH:$ANDROID_HOME/platform-tools

# PASSO 2: Iniciar o container Docker com o Metro Bundler PRIMEIRO
log "Iniciando o container Docker com docker-compose..."
docker compose up -d --build
# PASSO 1: Iniciar o Metro Bundler diretamente no host (com reset de cache)
log "Iniciando o Metro Bundler no host..."
npx react-native start --host 0.0.0.0 --reset-cache &
METRO_PID=$!

# PASSO 3: Aguardar a PORTA 8081 ficar pronta
# PASSO 2: Aguardar a PORTA 8081 ficar pronta
log "Aguardando a porta 8081 ficar pronta..."
until /usr/bin/nc -zvw1 127.0.0.1 8081 &> /dev/null; do
echo -n "."
Expand All @@ -41,7 +34,7 @@ done
log "Porta 8081 detectada! Prosseguindo..."

# ==================================================================
# PASSO 4, 5, 6: LÓGICA CONDICIONAL PARA EMULADOR OU DISPOSITIVO
# PASSO 3, 4, 5: LÓGICA CONDICIONAL PARA EMULADOR OU DISPOSITIVO
# ==================================================================
if [ "$MODE" == "emulator" ]; then
# --- Bloco de código para o Emulador ---
Expand All @@ -51,6 +44,7 @@ if [ "$MODE" == "emulator" ]; then
AVD_NAME=$(emulator -list-avds | head -n 1)
if [ -z "$AVD_NAME" ]; then
echo "Erro: Nenhum emulador (AVD) encontrado."
kill $METRO_PID 2>/dev/null
exit 1
fi
log "Usando o emulador: $AVD_NAME"
Expand All @@ -72,17 +66,19 @@ elif [ "$MODE" == "device" ]; then
log "Aguardando dispositivo físico via USB... (Certifique-se de que a depuração USB está ativada e autorizada)"
adb wait-for-device
log "Dispositivo físico detectado!"

else
# --- Bloco de Erro para opção inválida ---
echo "Erro: Modo inválido '$MODE'. Use 'emulator' ou 'device'."
kill $METRO_PID 2>/dev/null
exit 1
fi

# PASSO 7: Configurar o redirecionamento de porta
# PASSO 6: Configurar o redirecionamento de porta
log "Configurando 'adb reverse' para a porta 8081..."
adb reverse tcp:8081 tcp:8081

# PASSO 8: Build e Instalação via Gradle
# PASSO 7: Build e Instalação via Gradle
log "Garantindo permissão de execução para o gradlew..."
chmod +x android/gradlew
log "Compilando o app com Gradle (assembleDebug)..."
Expand All @@ -93,4 +89,8 @@ PACKAGE_NAME="com.signapp"
log "Iniciando o app ($PACKAGE_NAME) no dispositivo..."
adb shell am start -n "$PACKAGE_NAME/$PACKAGE_NAME.MainActivity"

log "Setup concluído! O app deve estar iniciando no dispositivo."
log "Setup concluído! Metro rodando em background (PID: $METRO_PID). O app está iniciando no dispositivo."
log "Para parar o Metro: kill $METRO_PID"

# Mantém o Metro em foreground
wait $METRO_PID
11 changes: 10 additions & 1 deletion jest.config.js
Original file line number Diff line number Diff line change
@@ -1,3 +1,12 @@
module.exports = {
preset: 'react-native',
};
transform: {
'^.+\\.(js|jsx|ts|tsx)$': 'babel-jest',
},
moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json'],
transformIgnorePatterns: [
'node_modules/(?!(react-native|@react-native|@react-navigation)/)'
],
testPathIgnorePatterns: ['/node_modules/', '/android/', '/ios/'],
resetMocks: true,
};
Loading