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:
dahoud
2026-01-10 10:43:17 +00:00
parent 06031b01f2
commit 92612abbd7
321 changed files with 43137 additions and 4285 deletions

365
CONTRIBUTING.md Normal file
View 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 ! 🚀**