Resolve map problem.

This commit is contained in:
Van Leemput Dayron
2025-12-06 15:50:19 +01:00
parent ca28e0a780
commit 13933fc56c
9 changed files with 310 additions and 177 deletions

View File

@@ -26,6 +26,8 @@ import 'package:travel_mate/blocs/activity/activity_state.dart';
import 'package:travel_mate/blocs/balance/balance_bloc.dart';
import 'package:travel_mate/blocs/balance/balance_event.dart';
import 'package:travel_mate/blocs/balance/balance_state.dart';
import 'package:travel_mate/blocs/group/group_bloc.dart';
import 'package:travel_mate/blocs/group/group_event.dart';
import 'package:travel_mate/blocs/user/user_bloc.dart';
import 'package:travel_mate/blocs/user/user_state.dart' as user_state;
@@ -641,6 +643,20 @@ class _ShowTripDetailsContentState extends State<ShowTripDetailsContent> {
),
const Divider(),
],
if (!isCreator)
ListTile(
leading: Icon(Icons.exit_to_app, color: Colors.red[400]),
title: Text(
'Quitter le voyage',
style: theme.textTheme.bodyLarge?.copyWith(
color: Colors.red[400],
),
),
onTap: () {
Navigator.pop(context);
_handleLeaveTrip(currentUser);
},
),
ListTile(
leading: Icon(
Icons.share,
@@ -682,6 +698,91 @@ class _ShowTripDetailsContentState extends State<ShowTripDetailsContent> {
);
}
void _handleLeaveTrip(user_state.UserModel? currentUser) {
if (currentUser == null || _group == null) return;
// Vérifier les dettes
final balanceState = context.read<BalanceBloc>().state;
if (balanceState is GroupBalancesLoaded) {
final myBalance = balanceState.balances.firstWhere(
(b) => b.userId == currentUser.id,
orElse: () => const UserBalance(
userId: '',
userName: '',
totalPaid: 0,
totalOwed: 0,
balance: 0,
),
);
// Tolérance pour les arrondis (0.01€)
if (myBalance.balance.abs() > 0.01) {
_errorService.showError(
message:
'Vous devez régler vos dettes (ou récupérer votre argent) avant de quitter le voyage. Solde: ${myBalance.formattedBalance}',
);
return;
}
_confirmLeaveTrip(currentUser.id);
} else {
// Si les balances ne sont pas chargées, on essaie de les charger et on demande de rééssayer
context.read<BalanceBloc>().add(LoadGroupBalances(_group!.id));
_errorService.showError(
message:
'Impossible de vérifier votre solde. Veuillez réessayer dans un instant.',
);
}
}
void _confirmLeaveTrip(String userId) {
final theme = Theme.of(context);
showDialog(
context: context,
builder: (context) => AlertDialog(
backgroundColor:
theme.dialogTheme.backgroundColor ?? theme.colorScheme.surface,
title: Text(
'Quitter le voyage',
style: theme.textTheme.titleLarge?.copyWith(
color: theme.colorScheme.onSurface,
),
),
content: Text(
'Êtes-vous sûr de vouloir quitter ce voyage ? Vous ne pourrez plus voir les détails ni les dépenses.',
style: theme.textTheme.bodyMedium?.copyWith(
color: theme.colorScheme.onSurface,
),
),
actions: [
TextButton(
onPressed: () => Navigator.pop(context),
child: Text(
'Annuler',
style: TextStyle(color: theme.colorScheme.primary),
),
),
TextButton(
onPressed: () {
Navigator.pop(context); // Fermer le dialog
if (_group != null) {
context.read<GroupBloc>().add(
RemoveMemberFromGroup(_group!.id, userId),
);
// Retourner à l'écran d'accueil
Navigator.pop(context);
}
},
child: const Text('Quitter', style: TextStyle(color: Colors.red)),
),
],
),
);
}
void _confirmDeleteTrip() {
final theme = Theme.of(context);