Files
myice_mobile/README.md
T
herel a0112d696e license: Add GPL-3.0-or-later license
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.
2026-07-09 16:49:35 +02:00

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).