Feat: Bouton de clôture de session (80/20) sur l'accueil et reset de l'espacement
This commit is contained in:
@@ -35,7 +35,7 @@ class _HomeScreenState extends State<HomeScreen> {
|
||||
final repository = context.read<SessionRepository>();
|
||||
final stats = await repository.getStatistics();
|
||||
final sessions = await repository.getAllSessions();
|
||||
|
||||
|
||||
if (mounted) {
|
||||
setState(() {
|
||||
_stats = stats;
|
||||
@@ -125,21 +125,100 @@ class _HomeScreenState extends State<HomeScreen> {
|
||||
final sessionProvider = context.watch<SessionProvider>();
|
||||
final isSessionActive = sessionProvider.isSessionActive;
|
||||
|
||||
return ElevatedButton.icon(
|
||||
onPressed: () => _navigateToSessionSetup(context),
|
||||
style: ElevatedButton.styleFrom(
|
||||
backgroundColor: isSessionActive ? AppTheme.secondaryColor : AppTheme.primaryColor,
|
||||
foregroundColor: Colors.white,
|
||||
padding: const EdgeInsets.symmetric(vertical: 20),
|
||||
shape: RoundedRectangleBorder(
|
||||
borderRadius: BorderRadius.circular(AppConstants.borderRadius),
|
||||
// Si aucune session n'est active, on affiche juste le bouton de départ habituel
|
||||
if (!isSessionActive) {
|
||||
return ElevatedButton.icon(
|
||||
onPressed: () => _navigateToSessionSetup(context),
|
||||
style: ElevatedButton.styleFrom(
|
||||
backgroundColor: AppTheme.primaryColor,
|
||||
foregroundColor: Colors.white,
|
||||
padding: const EdgeInsets.symmetric(vertical: 20),
|
||||
shape: RoundedRectangleBorder(
|
||||
borderRadius: BorderRadius.circular(AppConstants.borderRadius),
|
||||
),
|
||||
),
|
||||
),
|
||||
icon: Icon(isSessionActive ? Icons.play_circle_outline : Icons.add_circle_outline, size: 28),
|
||||
label: Text(
|
||||
isSessionActive ? 'Continuer la session' : 'Démarrer la session',
|
||||
style: const TextStyle(fontSize: 18, fontWeight: FontWeight.bold),
|
||||
),
|
||||
icon: const Icon(Icons.add_circle_outline, size: 28),
|
||||
label: const Text(
|
||||
'Démarrer la session',
|
||||
style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
// MODIFICATION : Alignement sur une seule ligne (80% / 20%) avec une croix pour l'annulation
|
||||
return Row(
|
||||
children: [
|
||||
// 80% de largeur pour continuer la session
|
||||
Expanded(
|
||||
flex: 8,
|
||||
child: ElevatedButton.icon(
|
||||
onPressed: () => _navigateToSessionSetup(context),
|
||||
style: ElevatedButton.styleFrom(
|
||||
backgroundColor: AppTheme.secondaryColor,
|
||||
foregroundColor: Colors.white,
|
||||
padding: const EdgeInsets.symmetric(vertical: 20),
|
||||
shape: RoundedRectangleBorder(
|
||||
borderRadius: BorderRadius.circular(AppConstants.borderRadius),
|
||||
),
|
||||
),
|
||||
icon: const Icon(Icons.play_circle_outline, size: 28),
|
||||
label: const Text(
|
||||
'Continuer la session',
|
||||
style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold),
|
||||
maxLines: 1,
|
||||
overflow: TextOverflow.ellipsis,
|
||||
),
|
||||
),
|
||||
),
|
||||
const SizedBox(width: 12),
|
||||
// 20% de largeur pour terminer/annuler la session (Bouton Croix)
|
||||
Expanded(
|
||||
flex: 2,
|
||||
child: OutlinedButton(
|
||||
onPressed: () {
|
||||
// Boite de dialogue de confirmation pour éviter les erreurs
|
||||
showDialog(
|
||||
context: context,
|
||||
builder: (BuildContext context) {
|
||||
return AlertDialog(
|
||||
title: const Text('Terminer la session ?'),
|
||||
content: const Text('Êtes-vous sûr de vouloir clôturer la session en cours ?'),
|
||||
actions: [
|
||||
TextButton(
|
||||
onPressed: () => Navigator.pop(context),
|
||||
child: const Text('ANNULER'),
|
||||
),
|
||||
TextButton(
|
||||
onPressed: () {
|
||||
Navigator.pop(context);
|
||||
// Clôture propre de la session dans le State global
|
||||
context.read<SessionProvider>().endSession();
|
||||
ScaffoldMessenger.of(context).showSnackBar(
|
||||
const SnackBar(
|
||||
content: Text('Session terminée avec succès !'),
|
||||
backgroundColor: AppTheme.successColor,
|
||||
),
|
||||
);
|
||||
},
|
||||
child: const Text('TERMINER', style: TextStyle(color: Colors.redAccent)),
|
||||
),
|
||||
],
|
||||
);
|
||||
},
|
||||
);
|
||||
},
|
||||
style: OutlinedButton.styleFrom(
|
||||
foregroundColor: Colors.redAccent,
|
||||
side: const BorderSide(color: Colors.redAccent, width: 1.5),
|
||||
padding: const EdgeInsets.symmetric(vertical: 20), // Même hauteur que le bouton continuer
|
||||
shape: RoundedRectangleBorder(
|
||||
borderRadius: BorderRadius.circular(AppConstants.borderRadius),
|
||||
),
|
||||
),
|
||||
child: const Icon(Icons.close, size: 28),
|
||||
),
|
||||
),
|
||||
],
|
||||
);
|
||||
}
|
||||
|
||||
@@ -197,17 +276,17 @@ class _HomeScreenState extends State<HomeScreen> {
|
||||
),
|
||||
child: _recentSessions.length < 2
|
||||
? const Center(
|
||||
child: Column(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: [
|
||||
Icon(Icons.show_chart, size: 40, color: Colors.grey),
|
||||
Text(
|
||||
'Pas assez de données',
|
||||
style: TextStyle(color: Colors.grey, fontSize: 12),
|
||||
),
|
||||
],
|
||||
),
|
||||
)
|
||||
child: Column(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: [
|
||||
Icon(Icons.show_chart, size: 40, color: Colors.grey),
|
||||
Text(
|
||||
'Pas assez de données',
|
||||
style: TextStyle(color: Colors.grey, fontSize: 12),
|
||||
),
|
||||
],
|
||||
),
|
||||
)
|
||||
: _buildHomeTrendChart(),
|
||||
),
|
||||
),
|
||||
@@ -276,7 +355,7 @@ class _HomeScreenState extends State<HomeScreen> {
|
||||
final sorted = List<Session>.from(_recentSessions)
|
||||
..sort((a, b) => a.createdAt.compareTo(b.createdAt));
|
||||
final display =
|
||||
sorted.length > 7 ? sorted.sublist(sorted.length - 7) : sorted;
|
||||
sorted.length > 7 ? sorted.sublist(sorted.length - 7) : sorted;
|
||||
|
||||
return LineChart(
|
||||
LineChartData(
|
||||
@@ -372,4 +451,4 @@ class _HomeScreenState extends State<HomeScreen> {
|
||||
);
|
||||
_loadStats();
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user