fix(chat): Correction race condition + Implémentation TODOs
## 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
This commit is contained in:
365
CONTRIBUTING.md
Normal file
365
CONTRIBUTING.md
Normal file
@@ -0,0 +1,365 @@
|
||||
# 🤝 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 ! 🚀**
|
||||
|
||||
Reference in New Issue
Block a user