From f7fecf0ef229a08dd55463aa240dfb8002e6d8ee Mon Sep 17 00:00:00 2001 From: qguillaume Date: Fri, 19 Jun 2026 13:09:52 +0200 Subject: [PATCH] =?UTF-8?q?Lorsqu'on=20termine=20la=20session=20et=20qu'on?= =?UTF-8?q?=20a=20l'=C3=A9cran=20d'accueil=20>=20ex=C3=A9cuter=20un=20refr?= =?UTF-8?q?esh=20automatique=20pour=20prendre=20en=20compte=20cette=20dern?= =?UTF-8?q?i=C3=A8re=20sessions=20dans=20les=20star=20de=20l'=C3=A9cran=20?= =?UTF-8?q?d'accueil.=20Actuellement=20il=20faut=20refresh=20manuellement?= =?UTF-8?q?=20pour=20que=20ce=20soit=20pris=20en=20compte=20-Dans=20Armure?= =?UTF-8?q?rie=20>=20Mon=20arme=20>=20le=20nb=20de=20session=20n'est=20pas?= =?UTF-8?q?=20remont=C3=A9=20Ajouter=20un=20date=20picker=20pour=20y=20ins?= =?UTF-8?q?crire=20une=20date=20de=20l'entretien=20et=20qu'elle=20apparais?= =?UTF-8?q?se=20dans=20la=20liste=20en=20bas=20(dans=20la=20modale=20ajout?= =?UTF-8?q?er=20un=20entretien)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/data/database/database_helper.dart | 10 ++++++ lib/data/repositories/session_repository.dart | 7 ++++- lib/features/garage/weapon_detail_screen.dart | 28 ++++++++++++++++- lib/features/home/home_screen.dart | 31 +++++++++++++++++++ 4 files changed, 74 insertions(+), 2 deletions(-) diff --git a/lib/data/database/database_helper.dart b/lib/data/database/database_helper.dart index 7736a9c1..f558a84e 100644 --- a/lib/data/database/database_helper.dart +++ b/lib/data/database/database_helper.dart @@ -509,6 +509,16 @@ class DatabaseHelper { return Sqflite.firstIntValue(result) ?? 0; } + Future getSessionCountForWeapon(String weaponId) async { + final db = await database; + final result = await db.rawQuery(''' + SELECT COUNT(id) as count + FROM ${AppConstants.sessionsTable} + WHERE weapon_id = ? + ''', [weaponId]); + return Sqflite.firstIntValue(result) ?? 0; + } + Future insertMaintenance(MaintenanceEntry entry) async { final db = await database; return await db.insert( diff --git a/lib/data/repositories/session_repository.dart b/lib/data/repositories/session_repository.dart index 41172d11..ebe684bf 100644 --- a/lib/data/repositories/session_repository.dart +++ b/lib/data/repositories/session_repository.dart @@ -182,18 +182,23 @@ class SessionRepository { return await _databaseHelper.getRoundsFiredForWeapon(weaponId); } + Future getSessionCountForWeapon(String weaponId) async { + return await _databaseHelper.getSessionCountForWeapon(weaponId); + } + Future addMaintenanceEntry({ required String weaponId, required MaintenanceType type, required String description, int? roundsSinceLast, + DateTime? date, }) async { final entry = MaintenanceEntry( id: _uuid.v4(), weaponId: weaponId, type: type, description: description, - date: DateTime.now(), + date: date ?? DateTime.now(), roundsSinceLastMaintenance: roundsSinceLast, ); await _databaseHelper.insertMaintenance(entry); diff --git a/lib/features/garage/weapon_detail_screen.dart b/lib/features/garage/weapon_detail_screen.dart index 0c721100..5d042915 100644 --- a/lib/features/garage/weapon_detail_screen.dart +++ b/lib/features/garage/weapon_detail_screen.dart @@ -19,6 +19,7 @@ class _WeaponDetailScreenState extends State { late Weapon _weapon; List _maintenance = []; int _totalRounds = 0; + int _sessionCount = 0; bool _isLoading = true; @override @@ -32,10 +33,12 @@ class _WeaponDetailScreenState extends State { final repository = context.read(); final history = await repository.getMaintenanceHistory(_weapon.id); final rounds = await repository.getRoundsFiredForWeapon(_weapon.id); + final sessions = await repository.getSessionCountForWeapon(_weapon.id); if (mounted) { setState(() { _maintenance = history; _totalRounds = rounds; + _sessionCount = sessions; _isLoading = false; }); } @@ -93,7 +96,7 @@ class _WeaponDetailScreenState extends State { Expanded( child: _buildStatCard( 'Sessions', - 'N/A', + _sessionCount.toString(), Icons.history, Colors.orange, ), @@ -347,6 +350,7 @@ class _WeaponDetailScreenState extends State { void _showAddMaintenanceDialog(BuildContext context) async { final descController = TextEditingController(); MaintenanceType selectedType = MaintenanceType.cleaning; + DateTime selectedDate = DateTime.now(); final result = await showDialog( context: context, @@ -367,6 +371,27 @@ class _WeaponDetailScreenState extends State { decoration: const InputDecoration(labelText: 'Description', hintText: 'ex: Nettoyage complet après séance'), maxLines: 2, ), + const SizedBox(height: 8), + InkWell( + onTap: () async { + final picked = await showDatePicker( + context: context, + initialDate: selectedDate, + firstDate: DateTime(2000), + lastDate: DateTime.now(), + ); + if (picked != null) { + setState(() => selectedDate = picked); + } + }, + child: InputDecorator( + decoration: const InputDecoration( + labelText: 'Date', + suffixIcon: Icon(Icons.calendar_today, size: 18), + ), + child: Text(DateFormat('dd/MM/yyyy').format(selectedDate)), + ), + ), ], ), actions: [ @@ -384,6 +409,7 @@ class _WeaponDetailScreenState extends State { type: selectedType, description: descController.text, roundsSinceLast: _totalRounds, + date: selectedDate, ); _loadData(); } diff --git a/lib/features/home/home_screen.dart b/lib/features/home/home_screen.dart index 62967256..0bbca062 100644 --- a/lib/features/home/home_screen.dart +++ b/lib/features/home/home_screen.dart @@ -25,12 +25,43 @@ class _HomeScreenState extends State { List _recentSessions = []; bool _isLoading = true; + SessionProvider? _sessionProvider; + bool _wasSessionActive = false; + @override void initState() { super.initState(); _loadStats(); } + @override + void didChangeDependencies() { + super.didChangeDependencies(); + final provider = context.read(); + if (provider != _sessionProvider) { + _sessionProvider?.removeListener(_onSessionChanged); + _sessionProvider = provider; + _sessionProvider!.addListener(_onSessionChanged); + _wasSessionActive = provider.isSessionActive; + } + } + + void _onSessionChanged() { + final isActive = _sessionProvider?.isSessionActive ?? false; + // Quand une session vient de se terminer, on rafraîchit les stats + // automatiquement pour prendre en compte la dernière session. + if (_wasSessionActive && !isActive) { + _loadStats(); + } + _wasSessionActive = isActive; + } + + @override + void dispose() { + _sessionProvider?.removeListener(_onSessionChanged); + super.dispose(); + } + Future _loadStats() async { final repository = context.read(); final stats = await repository.getStatistics();