## 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
7.6 KiB
7.6 KiB
🤝 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
- Comment Contribuer
- Standards de Code
- Processus de Pull Request
- Conventions de Commit
- 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
# 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
# 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
# Lancer les tests
flutter test
# Vérifier le linting
flutter analyze
# Formater le code
dart format .
5. Commit
# Ajouter vos changements
git add .
# Commit avec un message descriptif
git commit -m "feat: ajouter fonctionnalité X"
6. Push et Pull Request
# 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
// 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
// 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
/// 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
// 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
## 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 :
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
# 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
- Domain ne dépend de rien
- Data dépend de Domain
- Presentation dépend de Domain (et peut utiliser Data via interfaces)
- Les dépendances pointent toujours vers l'intérieur
Exemple d'ajout de fonctionnalité
- Créer l'entité dans
domain/entities/ - Créer le use case dans
domain/usecases/ - Créer le modèle dans
data/models/ - Créer le repository dans
data/repositories/ - Créer le BLoC/Provider dans
presentation/state_management/ - Créer l'UI dans
presentation/screens/oupresentation/widgets/
🧪 Tests
Structure des Tests
test/
├── domain/
│ ├── entities/
│ └── usecases/
├── data/
│ ├── models/
│ └── repositories/
└── presentation/
├── screens/
└── widgets/
Exemple de Test Unitaire
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
❓ Questions
Si vous avez des questions, n'hésitez pas à :
- Ouvrir une issue
- Contacter l'équipe de développement
Merci de contribuer à AfterWork ! 🚀