Aplicativo mobile para gerenciamento de treinos e acompanhamento fitness, desenvolvido em React Native com Expo. Permite criar, editar e acompanhar exercícios e treinos, oferecendo uma interface intuitiva para melhorar a rotina de atividades físicas.
- Tecnologias Utilizadas
- Requisitos
- Instalação
- Estrutura do Projeto
- Modelos de Dados
- Funcionalidades Principais
- Como Contribuir
- Autor
- React Native - Framework para desenvolvimento mobile
- Expo - Plataforma de desenvolvimento e deployment
- React Navigation - Navegação entre telas
- Context API - Gerenciamento de estado global
- Firebase Authentication - Autenticação de usuários
- Firebase Database - Armazenamento de dados
- JavaScript/ES6+ - Linguagem principal
- Metro - Bundler do React Native
- Expo CLI - Interface de linha de comando
Antes de começar, certifique-se de ter as seguintes ferramentas instaladas:
- Node.js (versão 18.0 ou superior)
- npm ou yarn
- Expo CLI
- macOS: Necessário para desenvolvimento iOS (Xcode)
- Windows/Linux: Para desenvolvimento Android (Android Studio)
- Visual Studio Code (recomendado)
- Android Studio - Para emulador Android
- Xcode - Para simulador iOS (apenas macOS)
-
Clone o repositório:
git clone https://github.com/PhelipeScript/fit-plus.git cd fit-plus -
Instale as dependências:
npm install
-
Para rodar no ambiente web do Expo (opcional), force a instalação das dependências:
npm install --force
-
Configuração do Firebase
- Crie um projeto no Firebase Console
- Ative Authentication e Firestore Database
- Adicione suas credenciais no arquivo src/services/firebaseConfig.js
- Lembre-se de modificar as rules do Firestore Database
-
Execute o projeto:
# Inicie o servidor de desenvolvimento npx expo start # Ou usando npm script npm run start
-
Executar em Dispositivo
- Dispositivo Físico: Instale o app Expo Go e escaneie o QR code
- Emulador Android: Pressione a no terminal
- Simulador iOS: Pressione i no terminal (apenas macOS)
O projeto está organizado da seguinte maneira:
fit-plus/
├── assets/
│ ├── adaptive-icon.png
│ ├── favicon.png
│ ├── icon.png
│ ├── logo.png
│ ├── splash-icon.png
│ └── splash_screen.json
├── src/
│ ├── components/
│ │ ├── Avatar/
│ │ │ ├── index.js
│ │ │ └── styles.js
│ │ ├── CustomButton/
│ │ │ ├── index.js
│ │ │ └── styles.js
│ │ ├── CustomInput/
│ │ │ ├── index.js
│ │ │ └── styles.js
│ │ ├── Divider/
│ │ │ ├── index.js
│ │ │ └── styles.js
│ │ ├── SelectInput/
│ │ │ ├── index.js
│ │ │ └── styles.js
│ │ ├── cards/
│ │ │ ├── GenericCard/
│ │ │ │ ├── index.js
│ │ │ │ └── styles.js
│ │ │ ├── InfoCard/
│ │ │ │ ├── index.js
│ │ │ │ └── styles.js
│ │ │ └── StatCard/
│ │ │ ├── index.js
│ │ │ └── styles.js
│ │ └── modals/
│ │ ├── DeleteConfirmationModal/
│ │ │ ├── index.js
│ │ │ └── styles.js
│ │ ├── ExerciseDetailsModal/
│ │ │ ├── index.js
│ │ │ └── styles.js
│ │ ├── ResetPasswordModal/
│ │ │ ├── index.js
│ │ │ └── styles.js
│ │ └── UpdateFieldModal/
│ │ ├── index.js
│ │ └── styles.js
│ ├── contexts/
│ │ ├── UserContext.js
│ │ └── WorkoutContext.js
│ ├── errors/
│ │ ├── EmailAlreadyExistsError.js
│ │ ├── InvalidCredentialError.js
│ │ ├── InvalidEmailError.js
│ │ ├── UserNotFoundError.js
│ │ └── WeakPasswordError.js
│ ├── hooks/
│ │ ├── useUser.js
│ │ └── useWorkouts.js
│ ├── navigation/
│ │ ├── AppNavigation/
│ │ │ └── index.js
│ │ ├── BottomTabsNavigation/
│ │ │ └── index.js
│ │ ├── PrivateNavigation/
│ │ │ └── index.js
│ │ └── PublicNavigation/
│ │ └── index.js
│ ├── screens/
│ │ ├── EditExercise/
│ │ │ ├── index.js
│ │ │ └── styles.js
│ │ ├── EditWorkout/
│ │ │ ├── index.js
│ │ │ └── styles.js
│ │ ├── NewExercise/
│ │ │ ├── index.js
│ │ │ └── styles.js
│ │ ├── NewWorkout/
│ │ │ ├── index.js
│ │ │ └── styles.js
│ │ ├── Profile/
│ │ │ ├── index.js
│ │ │ └── styles.js
│ │ ├── SignIn/
│ │ │ ├── index.js
│ │ │ └── styles.js
│ │ ├── SignUp/
│ │ │ ├── index.js
│ │ │ └── styles.js
│ │ ├── SplashScreen/
│ │ │ ├── index.js
│ │ │ └── styles.js
│ │ ├── WorkoutDetails/
│ │ │ ├── index.js
│ │ │ └── styles.js
│ │ ├── WorkoutMetrics/
│ │ │ ├── index.js
│ │ │ └── styles.js
│ │ └── Workouts/
│ │ ├── index.js
│ │ └── styles.js
│ ├── services/
│ │ ├── authService.js
│ │ ├── firebaseConfig.js
│ │ └── firestoreService.js
│ ├── styles/
│ │ └── theme.js
│ └── types/
│ ├── userProps.js
│ └── workoutProps.js
├── .gitignore
├── App.js
├── app.json
├── babel.config.js
├── index.js
├── metro.config.js
├── package-lock.json
└── package.json
{
uid: string;
name: string;
email: string;
avatarUri?: string;
age?: number;
height?: number;
weight?: number;
phone?: string;
gender?: 'male' | 'female' | null;
goal?: 'gain' | 'lose' | 'maintain' | null;
activityLevel?: 'low' | 'medium' | 'high' | null;
createdAt?: string;
updatedAt?: string;
} {
id: string;
name: string;
description: string;
frequency: 'Diariamente' | '3x por semana' | '2x por semana' | '1x por semana';
kcal: string;
level: 'Iniciante' | 'Intermediário' | 'Avançado';
totalExercises: number;
createdAt: string;
updatedAt: string;
} {
id: string;
name: string;
series: number;
repetitions: number;
weight: number;
muscleGroup: 'Peito' | 'Costas' | 'Bíceps' | 'Tríceps' | 'Ombros' | 'Abdômen' | 'Pernas' | 'Glúteos';
notes?: string;
createdAt: string;
updatedAt: string;
} {
id: string;
startedAt: string;
endedAt?: string;
status: 'in_progress' | 'finished';
duration: {
seconds: number;
minutes: number;
hours: number;
};
exercises: ExerciseSessionProps[];
} {
id: string;
name: string;
series: number;
repetitions: number;
weight: number;
muscleGroup: 'Peito' | 'Costas' | 'Bíceps' | 'Tríceps' | 'Ombros' | 'Abdômen' | 'Pernas' | 'Glúteos';
notes?: string;
done: boolean;
createdAt: string;
}- Cadastro de novos usuários
- Login com email e senha
- Recuperação de senha
- Logout seguro
- Edição de informações pessoais
- Upload de foto de perfil
- Histórico de atividades
- Criação de treinos personalizados
- Adição/remoção de exercícios
- Edição de parâmetros (séries, repetições, peso)
- Categorização por grupo muscular
- Visualização de estatísticas de treino
- Gráficos de progresso
- Histórico de sessões
Contribuições são sempre bem-vindas! Para contribuir:
- Fork o projeto
- Crie uma branch para sua feature (git checkout -b feature/AmazingFeature)
- Commit suas mudanças (git commit -m 'Add some AmazingFeature')
- Push para a branch (git push origin feature/AmazingFeature)
- Abra um Pull Request
- Siga os padrões de código existentes
- Atualize a documentação quando necessário
- Use mensagens de commit descritivas
- Expo Web: Algumas funcionalidades podem ter limitações na versão web
Phelipe Pereira