a0112d696e
Add the full GNU General Public License v3 text as LICENSE, declare the license in pubspec.yaml, and document it in README and AGENTS.md.
154 lines
6.0 KiB
Markdown
154 lines
6.0 KiB
Markdown
# MyIce Mobile
|
|
|
|
Application mobile Flutter pour [MyIce](https://myice.parano.ch), la plateforme de gestion du club de hockey sur glace. Elle permet aux membres de consulter les calendriers de matchs, les convocations (joueurs et staff) et les détails des événements.
|
|
|
|
## Fonctionnalités
|
|
|
|
- **Connexion via Infomaniak** — authentification OAuth via `flutter_web_auth_2` avec redirection sur le schéma personnalisé `myice://`.
|
|
- **Multi-comptes** — bascule entre plusieurs comptes/équipes, le compte sélectionné est persisté.
|
|
- **Calendrier des matchs** — liste les événements de type « Jeu » avec filtrage par tranche d'âge (`agegroup`) et sous-groupe.
|
|
- **Détail d'un match** — récapitulatif (type, lieu, horaires) et convocation : joueurs disponibles (poste, numéro, date de naissance) et personnel (rôle, nom).
|
|
- **Cache hors-ligne** — les événements et les filtres sont mis en cache par compte via `SharedPreferences` ; rafraîchissement manuel disponible.
|
|
- **Interface Material 3** en français.
|
|
|
|
## Pré-requis
|
|
|
|
- Flutter >= 3.1.0 (Dart SDK `>=3.1.0 <4.0.0`)
|
|
- Un éditeur compatible Dart ([liste des IDE](https://dart.dev/tools#ides-and-editors))
|
|
- Accès au backend MyIce (`https://myice.parano.ch`)
|
|
|
|
## Installation
|
|
|
|
```bash
|
|
git clone git@gitea.parano.ch:herel/myice_mobile.git
|
|
cd myice_mobile
|
|
flutter pub get
|
|
```
|
|
|
|
### Génération des icônes de lancement
|
|
|
|
```bash
|
|
dart run flutter_launcher_icons
|
|
```
|
|
|
|
L'icône source est `assets/icon/logo.png` (configurée dans `pubspec.yaml`).
|
|
|
|
## Exécution
|
|
|
|
```bash
|
|
flutter run # appareil par défaut
|
|
flutter run -d chrome # navigateur web
|
|
flutter run -d macos # macOS
|
|
```
|
|
|
|
## Configuration
|
|
|
|
### URL du backend
|
|
|
|
L'adresse de l'API est définie dans `lib/config/api_config.dart` :
|
|
|
|
```dart
|
|
class ApiConfig {
|
|
static const String baseUrl = 'https://myice.parano.ch';
|
|
}
|
|
```
|
|
|
|
### Schéma d'authentification
|
|
|
|
L'authentification OAuth utilise le schéma d'URL personnalisé `myice://callback`. Il est déjà configuré :
|
|
|
|
- **Android** — `android/app/src/main/AndroidManifest.xml` (activité `CallbackActivity`)
|
|
- **iOS / macOS** — `ios/Runner/Info.plist` (`CFBundleURLSchemes`)
|
|
|
|
### Endpoints API consommés
|
|
|
|
| Méthode | Route | Description |
|
|
| ------- | ------------------------------ | -------------------------------------------- |
|
|
| GET | `/login?redirect_uri=...` | Déclenche le flux OAuth Infomaniak |
|
|
| GET | `/userinfo` | Informations de l'utilisateur connecté |
|
|
| GET | `/accounts` | Liste des comptes/équipes accessibles |
|
|
| GET | `/schedule?account=` | Calendrier des événements d'un compte |
|
|
| GET | `/game/{gameId}?account=` | Détail d'un match et sa convocation |
|
|
|
|
## Architecture
|
|
|
|
Le projet suit une architecture en couches avec le pattern **Provider** pour la gestion d'état :
|
|
|
|
```
|
|
lib/
|
|
├── main.dart # Point d'entrée, MultiProvider, routage racine
|
|
├── config/
|
|
│ └── api_config.dart # Configuration de l'API (baseUrl)
|
|
├── models/ # Modèles de données (fromJson / toJson)
|
|
│ ├── account.dart
|
|
│ ├── event.dart
|
|
│ ├── event_detail.dart
|
|
│ ├── convocation.dart
|
|
│ ├── player.dart
|
|
│ ├── staff.dart
|
|
│ └── user_info.dart
|
|
├── services/ # Logique d'accès aux données
|
|
│ ├── api_service.dart # Client HTTP (Dio) + bearer token
|
|
│ ├── auth_service.dart # OAuth + stockage du token/compte
|
|
│ └── schedule_cache_service.dart # Cache des événements et filtres
|
|
├── providers/ # ChangeNotifiers (état réactif)
|
|
│ ├── auth_provider.dart
|
|
│ ├── schedule_provider.dart
|
|
│ └── event_detail_provider.dart
|
|
├── screens/ # Pages de l'application
|
|
│ ├── login_screen.dart
|
|
│ ├── schedule_screen.dart
|
|
│ └── event_detail_screen.dart
|
|
└── widgets/ # Composants UI réutilisables
|
|
├── event_card.dart
|
|
├── filter_dropdown.dart
|
|
└── loading_indicator.dart
|
|
```
|
|
|
|
### Flux de l'application
|
|
|
|
1. Au démarrage, `AuthProvider.init()` restaure le token stocké et valide la session via `/userinfo`.
|
|
2. Si authentifié → `ScheduleScreen` : charge les comptes, puis le calendrier depuis le cache (ou rafraîchit si vide).
|
|
3. L'utilisateur filtre par tranche d'âge et sous-groupe (persistés par compte).
|
|
4. Un appui sur un événement ouvre `EventDetailScreen` qui charge `/game/{id}`.
|
|
|
|
## Tests
|
|
|
|
```bash
|
|
flutter test # suite de tests widget
|
|
flutter analyze # analyse statique (lints flutter_lints)
|
|
```
|
|
|
|
La configuration des lints se trouve dans `analysis_options.yaml`.
|
|
|
|
## Build de production
|
|
|
|
```bash
|
|
flutter build apk --release # Android
|
|
flutter build ios --release # iOS
|
|
flutter build macos --release # macOS
|
|
flutter build web --release # Web
|
|
```
|
|
|
|
## Dépendances principales
|
|
|
|
| Package | Rôle |
|
|
| ------------------------- | ------------------------------------------- |
|
|
| `dio` | Client HTTP |
|
|
| `provider` | Gestion d'état réactive |
|
|
| `shared_preferences` | Stockage local (token, cache, filtres) |
|
|
| `flutter_web_auth_2` | Flux d'authentification OAuth (navigateur) |
|
|
| `intl` | Internationalisation |
|
|
| `flutter_launcher_icons` | Génération des icônes de lancement (dev) |
|
|
|
|
## Contribuer
|
|
|
|
1. Créer une branche depuis `main`.
|
|
2. Respecter les conventions de code (vérifier avec `flutter analyze`).
|
|
3. S'assurer que `flutter test` passe.
|
|
4. Ouvrir une merge request sur [Gitea](https://gitea.parano.ch/herel/myice_mobile).
|
|
|
|
## Licence
|
|
|
|
Ce projet est distribué sous licence [GNU General Public License v3.0 ou ultérieure](LICENSE).
|