## Corrections Critiques ### Race Condition - Statuts de Messages - Fix : Les icônes de statut (✓, ✓✓, ✓✓ bleu) ne s'affichaient pas - Cause : WebSocket delivery confirmations arrivaient avant messages locaux - Solution : Pattern Optimistic UI dans chat_bloc.dart - Création message temporaire immédiate - Ajout à la liste AVANT requête HTTP - Remplacement par message serveur à la réponse - Fichier : lib/presentation/state_management/chat_bloc.dart ## Implémentation TODOs (13/21) ### Social (social_header_widget.dart) - ✅ Copier lien du post dans presse-papiers - ✅ Partage natif via Share.share() - ✅ Dialogue de signalement avec 5 raisons ### Partage (share_post_dialog.dart) - ✅ Interface sélection d'amis avec checkboxes - ✅ Partage externe via Share API ### Média (media_upload_service.dart) - ✅ Parsing JSON réponse backend - ✅ Méthode deleteMedia() pour suppression - ✅ Génération miniature vidéo ### Posts (create_post_dialog.dart, edit_post_dialog.dart) - ✅ Extraction URL depuis uploads - ✅ Documentation chargement médias ### Chat (conversations_screen.dart) - ✅ Navigation vers notifications - ✅ ConversationSearchDelegate pour recherche ## Nouveaux Fichiers ### Configuration - build-prod.ps1 : Script build production avec dart-define - lib/core/constants/env_config.dart : Gestion environnements ### Documentation - TODOS_IMPLEMENTED.md : Documentation complète TODOs ## Améliorations ### Architecture - Refactoring injection de dépendances - Amélioration routing et navigation - Optimisation providers (UserProvider, FriendsProvider) ### UI/UX - Amélioration thème et couleurs - Optimisation animations - Meilleure gestion erreurs ### Services - Configuration API avec env_config - Amélioration datasources (events, users) - Optimisation modèles de données
366 lines
7.6 KiB
Markdown
366 lines
7.6 KiB
Markdown
# 🤝 Guide de Contribution - AfterWork
|
|
|
|
Merci de votre intérêt pour contribuer au projet AfterWork ! Ce document vous guidera à travers le processus de contribution.
|
|
|
|
## 📋 Table des Matières
|
|
|
|
- [Code de Conduite](#code-de-conduite)
|
|
- [Comment Contribuer](#comment-contribuer)
|
|
- [Standards de Code](#standards-de-code)
|
|
- [Processus de Pull Request](#processus-de-pull-request)
|
|
- [Conventions de Commit](#conventions-de-commit)
|
|
- [Architecture du Projet](#architecture-du-projet)
|
|
|
|
---
|
|
|
|
## 📜 Code de Conduite
|
|
|
|
En participant à ce projet, vous acceptez de respecter notre code de conduite :
|
|
|
|
- Être respectueux envers tous les contributeurs
|
|
- Accepter les critiques constructives
|
|
- Se concentrer sur ce qui est le mieux pour la communauté
|
|
- Faire preuve d'empathie envers les autres membres
|
|
|
|
---
|
|
|
|
## 🚀 Comment Contribuer
|
|
|
|
### 1. Fork et Clone
|
|
|
|
```bash
|
|
# Fork le repository sur GitHub
|
|
# Puis clone votre fork
|
|
git clone https://github.com/votre-username/afterwork.git
|
|
cd afterwork
|
|
```
|
|
|
|
### 2. Créer une Branche
|
|
|
|
```bash
|
|
# Créer une branche pour votre feature/fix
|
|
git checkout -b feature/nom-de-votre-feature
|
|
|
|
# Ou pour un bugfix
|
|
git checkout -b fix/nom-du-bug
|
|
```
|
|
|
|
### 3. Développer
|
|
|
|
- Écrivez du code propre et testé
|
|
- Suivez les standards de code du projet
|
|
- Ajoutez des tests pour les nouvelles fonctionnalités
|
|
- Documentez votre code
|
|
|
|
### 4. Tester
|
|
|
|
```bash
|
|
# Lancer les tests
|
|
flutter test
|
|
|
|
# Vérifier le linting
|
|
flutter analyze
|
|
|
|
# Formater le code
|
|
dart format .
|
|
```
|
|
|
|
### 5. Commit
|
|
|
|
```bash
|
|
# Ajouter vos changements
|
|
git add .
|
|
|
|
# Commit avec un message descriptif
|
|
git commit -m "feat: ajouter fonctionnalité X"
|
|
```
|
|
|
|
### 6. Push et Pull Request
|
|
|
|
```bash
|
|
# Push vers votre fork
|
|
git push origin feature/nom-de-votre-feature
|
|
|
|
# Créer une Pull Request sur GitHub
|
|
```
|
|
|
|
---
|
|
|
|
## 💻 Standards de Code
|
|
|
|
### Formatage
|
|
|
|
- **Indentation** : 2 espaces
|
|
- **Ligne max** : 80 caractères (flexible pour la lisibilité)
|
|
- **Trailing commas** : Obligatoires pour les listes multi-lignes
|
|
|
|
### Conventions de Nommage
|
|
|
|
```dart
|
|
// Classes : PascalCase
|
|
class UserProfile {}
|
|
|
|
// Fichiers : snake_case
|
|
// user_profile.dart
|
|
|
|
// Variables et fonctions : camelCase
|
|
String userName = 'John';
|
|
void getUserById() {}
|
|
|
|
// Constantes : lowerCamelCase
|
|
const String apiBaseUrl = 'https://api.example.com';
|
|
|
|
// Constantes privées : _lowerCamelCase
|
|
const String _privateKey = 'secret';
|
|
```
|
|
|
|
### Widgets
|
|
|
|
```dart
|
|
// Toujours utiliser const pour les widgets immuables
|
|
const Text('Hello World');
|
|
|
|
// Préférer les constructeurs const
|
|
class MyWidget extends StatelessWidget {
|
|
const MyWidget({super.key});
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return const Placeholder();
|
|
}
|
|
}
|
|
|
|
// Trailing comma pour meilleure lisibilité
|
|
return Container(
|
|
padding: const EdgeInsets.all(16),
|
|
child: Column(
|
|
children: [
|
|
const Text('Title'),
|
|
const SizedBox(height: 8),
|
|
const Text('Subtitle'),
|
|
],
|
|
),
|
|
);
|
|
```
|
|
|
|
### Documentation
|
|
|
|
```dart
|
|
/// Récupère un utilisateur par son ID.
|
|
///
|
|
/// [userId] L'identifiant unique de l'utilisateur.
|
|
///
|
|
/// Retourne un [User] ou null si non trouvé.
|
|
///
|
|
/// Throws [ServerException] si l'API est inaccessible.
|
|
Future<User?> getUserById(String userId) async {
|
|
// Implementation
|
|
}
|
|
```
|
|
|
|
### Gestion des Erreurs
|
|
|
|
```dart
|
|
// Utiliser try-catch pour les opérations à risque
|
|
try {
|
|
final result = await apiCall();
|
|
return Right(result);
|
|
} on ServerException catch (e) {
|
|
return Left(ServerFailure(e.message));
|
|
} catch (e) {
|
|
return Left(UnexpectedFailure());
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## 🔄 Processus de Pull Request
|
|
|
|
### Checklist avant PR
|
|
|
|
- [ ] Le code compile sans erreur
|
|
- [ ] Tous les tests passent (`flutter test`)
|
|
- [ ] Le linting est propre (`flutter analyze`)
|
|
- [ ] Le code est formaté (`dart format .`)
|
|
- [ ] Les nouvelles fonctionnalités ont des tests
|
|
- [ ] La documentation est à jour
|
|
- [ ] Les commits suivent les conventions
|
|
|
|
### Template de PR
|
|
|
|
```markdown
|
|
## Description
|
|
Brève description des changements
|
|
|
|
## Type de changement
|
|
- [ ] Bug fix
|
|
- [ ] Nouvelle fonctionnalité
|
|
- [ ] Breaking change
|
|
- [ ] Documentation
|
|
|
|
## Tests
|
|
- [ ] Tests unitaires ajoutés/mis à jour
|
|
- [ ] Tests d'intégration ajoutés/mis à jour
|
|
- [ ] Tests manuels effectués
|
|
|
|
## Captures d'écran (si applicable)
|
|
Ajoutez des captures d'écran ici
|
|
|
|
## Checklist
|
|
- [ ] Mon code suit les standards du projet
|
|
- [ ] J'ai effectué une auto-review
|
|
- [ ] J'ai commenté les parties complexes
|
|
- [ ] J'ai mis à jour la documentation
|
|
- [ ] Mes changements ne génèrent pas de warnings
|
|
- [ ] J'ai ajouté des tests
|
|
- [ ] Tous les tests passent
|
|
```
|
|
|
|
---
|
|
|
|
## 📝 Conventions de Commit
|
|
|
|
Nous utilisons les [Conventional Commits](https://www.conventionalcommits.org/) :
|
|
|
|
### Format
|
|
|
|
```
|
|
<type>(<scope>): <subject>
|
|
|
|
<body>
|
|
|
|
<footer>
|
|
```
|
|
|
|
### Types
|
|
|
|
- **feat** : Nouvelle fonctionnalité
|
|
- **fix** : Correction de bug
|
|
- **docs** : Documentation uniquement
|
|
- **style** : Formatage, points-virgules manquants, etc.
|
|
- **refactor** : Refactoring de code
|
|
- **perf** : Amélioration de performance
|
|
- **test** : Ajout ou correction de tests
|
|
- **chore** : Maintenance, dépendances, etc.
|
|
|
|
### Exemples
|
|
|
|
```bash
|
|
# Feature
|
|
git commit -m "feat(auth): ajouter authentification biométrique"
|
|
|
|
# Bug fix
|
|
git commit -m "fix(events): corriger crash lors du chargement"
|
|
|
|
# Documentation
|
|
git commit -m "docs(readme): mettre à jour instructions d'installation"
|
|
|
|
# Refactoring
|
|
git commit -m "refactor(user): extraire logique de validation"
|
|
|
|
# Breaking change
|
|
git commit -m "feat(api): changer format de réponse
|
|
|
|
BREAKING CHANGE: Le format de réponse de l'API a changé"
|
|
```
|
|
|
|
---
|
|
|
|
## 🏗 Architecture du Projet
|
|
|
|
### Clean Architecture
|
|
|
|
Le projet suit les principes de Clean Architecture :
|
|
|
|
```
|
|
lib/
|
|
├── core/ # Code partagé (constantes, utils, thèmes)
|
|
├── domain/ # Logique métier pure (entités, usecases)
|
|
├── data/ # Implémentation data (models, repositories)
|
|
└── presentation/ # UI (screens, widgets, state management)
|
|
```
|
|
|
|
### Règles
|
|
|
|
1. **Domain** ne dépend de rien
|
|
2. **Data** dépend de Domain
|
|
3. **Presentation** dépend de Domain (et peut utiliser Data via interfaces)
|
|
4. Les dépendances pointent toujours vers l'intérieur
|
|
|
|
### Exemple d'ajout de fonctionnalité
|
|
|
|
1. **Créer l'entité** dans `domain/entities/`
|
|
2. **Créer le use case** dans `domain/usecases/`
|
|
3. **Créer le modèle** dans `data/models/`
|
|
4. **Créer le repository** dans `data/repositories/`
|
|
5. **Créer le BLoC/Provider** dans `presentation/state_management/`
|
|
6. **Créer l'UI** dans `presentation/screens/` ou `presentation/widgets/`
|
|
|
|
---
|
|
|
|
## 🧪 Tests
|
|
|
|
### Structure des Tests
|
|
|
|
```
|
|
test/
|
|
├── domain/
|
|
│ ├── entities/
|
|
│ └── usecases/
|
|
├── data/
|
|
│ ├── models/
|
|
│ └── repositories/
|
|
└── presentation/
|
|
├── screens/
|
|
└── widgets/
|
|
```
|
|
|
|
### Exemple de Test Unitaire
|
|
|
|
```dart
|
|
import 'package:flutter_test/flutter_test.dart';
|
|
|
|
void main() {
|
|
group('User Entity', () {
|
|
test('should create user with valid data', () {
|
|
// Arrange
|
|
const userId = '123';
|
|
const email = 'test@example.com';
|
|
|
|
// Act
|
|
final user = User(
|
|
userId: userId,
|
|
email: email,
|
|
// ...
|
|
);
|
|
|
|
// Assert
|
|
expect(user.userId, userId);
|
|
expect(user.email, email);
|
|
});
|
|
});
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## 📚 Ressources
|
|
|
|
- [Flutter Documentation](https://flutter.dev/docs)
|
|
- [Dart Style Guide](https://dart.dev/guides/language/effective-dart/style)
|
|
- [Clean Architecture](https://blog.cleancoder.com/uncle-bob/2012/08/13/the-clean-architecture.html)
|
|
- [BLoC Pattern](https://bloclibrary.dev/)
|
|
|
|
---
|
|
|
|
## ❓ Questions
|
|
|
|
Si vous avez des questions, n'hésitez pas à :
|
|
- Ouvrir une issue
|
|
- Contacter l'équipe de développement
|
|
|
|
---
|
|
|
|
**Merci de contribuer à AfterWork ! 🚀**
|
|
|