feat: Consolidate group and account creation into a single method and improve error handling in trip creation

This commit is contained in:
Dayron
2025-10-23 11:39:13 +02:00
parent 7cfc5eab6b
commit 5b8d3ec45f
2 changed files with 31 additions and 61 deletions

View File

@@ -115,8 +115,7 @@ class _CreateTripContentState extends State<CreateTripContent> {
if (tripState is TripCreated) { if (tripState is TripCreated) {
// Stocker l'ID du trip et créer le groupe // Stocker l'ID du trip et créer le groupe
_createdTripId = tripState.tripId; _createdTripId = tripState.tripId;
_createGroupForTrip(_createdTripId!); _createGroupAndAccountForTrip(_createdTripId!);
_createAccountForTrip(_createdTripId!);
} else if (tripState is TripOperationSuccess) { } else if (tripState is TripOperationSuccess) {
if (mounted) { if (mounted) {
ScaffoldMessenger.of(context).showSnackBar( ScaffoldMessenger.of(context).showSnackBar(
@@ -125,6 +124,9 @@ class _CreateTripContentState extends State<CreateTripContent> {
backgroundColor: Colors.green, backgroundColor: Colors.green,
), ),
); );
setState(() {
_isLoading = false;
});
Navigator.pop(context); Navigator.pop(context);
if (isEditing) { if (isEditing) {
Navigator.pop(context); Navigator.pop(context);
@@ -579,24 +581,27 @@ class _CreateTripContentState extends State<CreateTripContent> {
return groupMembers; return groupMembers;
} }
Future<void> _createGroupForTrip(String tripId) async { Future<void> _createGroupAndAccountForTrip(String tripId) async {
final groupBloc = context.read<GroupBloc>(); final groupBloc = context.read<GroupBloc>();
final accountBloc = context.read<AccountBloc>();
try { try {
final userState = context.read<UserBloc>().state; final userState = context.read<UserBloc>().state;
if (userState is! user_state.UserLoaded) return; if (userState is! user_state.UserLoaded) {
throw Exception('Utilisateur non connecté');
}
final currentUser = userState.user; final currentUser = userState.user;
// Créer le groupe avec le tripId récupéré
final group = Group( final group = Group(
id: '', // Sera généré par Firestore id: '',
name: _titleController.text.trim(), name: _titleController.text.trim(),
tripId: tripId, tripId: tripId,
createdBy: currentUser.id, createdBy: currentUser.id,
); );
final groupMembers = await _createMembers(); final groupMembers = await _createMembers();
if (groupMembers.isEmpty) { if (groupMembers.isEmpty) {
throw Exception('Erreur lors de la création des membres du groupe'); throw Exception('Erreur lors de la création des membres du groupe');
} }
@@ -605,77 +610,43 @@ class _CreateTripContentState extends State<CreateTripContent> {
group: group, group: group,
members: groupMembers, members: groupMembers,
)); ));
if (mounted) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text('Voyage et groupe créés avec succès !'),
backgroundColor: Colors.green,
),
);
setState(() {
_isLoading = false;
});
Navigator.pop(context);
}
} catch (e) {
_errorService.logError(
'create_trip_content.dart',
'Erreur lors de la création du groupe: $e',
);
if (mounted) {
setState(() {
_isLoading = false;
});
}
}
}
Future<void> _createAccountForTrip(String tripId) async {
final accountBloc = context.read<AccountBloc>();
try {
final userState = context.read<UserBloc>().state;
if (userState is! user_state.UserLoaded) return;
final account = Account( final account = Account(
id: '', id: '',
tripId: tripId, tripId: tripId,
name: _titleController.text.trim(), name: _titleController.text.trim(),
); );
final accountsMembers = await _createMembers();
accountBloc.add(CreateAccountWithMembers( accountBloc.add(CreateAccountWithMembers(
account: account, account: account,
members: accountsMembers, members: groupMembers,
)); ));
if (mounted) { if (mounted) {
ScaffoldMessenger.of(context).showSnackBar( ScaffoldMessenger.of(context).showSnackBar(
SnackBar( SnackBar(
content: Text('Compte créé avec succès !'), content: Text('Voyage, groupe et compte créés avec succès !'),
backgroundColor: Colors.green, backgroundColor: Colors.green,
), ),
); );
setState(() { setState(() {
_isLoading = false; _isLoading = false;
}); });
Navigator.pop(context); Navigator.pop(context);
} }
} catch (e) { } catch (e) {
_errorService.logError( _errorService.logError(
'create_trip_content.dart', 'create_trip_content.dart',
'Erreur lors de la création du compte: $e', 'Erreur lors de la création du groupe et compte: $e',
); );
if (mounted) { if (mounted) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text('Erreur: $e'),
backgroundColor: Colors.red,
),
);
setState(() { setState(() {
_isLoading = false; _isLoading = false;
}); });
@@ -683,6 +654,8 @@ class _CreateTripContentState extends State<CreateTripContent> {
} }
} }
Future<void> _saveTrip(user_state.UserModel currentUser) async { Future<void> _saveTrip(user_state.UserModel currentUser) async {
if (!_formKey.currentState!.validate()) { if (!_formKey.currentState!.validate()) {
return; return;

View File

@@ -1,7 +1,5 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:travel_mate/blocs/group/group_bloc.dart';
import 'package:travel_mate/blocs/group/group_event.dart';
import 'package:travel_mate/blocs/trip/trip_bloc.dart'; import 'package:travel_mate/blocs/trip/trip_bloc.dart';
import 'package:travel_mate/blocs/trip/trip_event.dart'; import 'package:travel_mate/blocs/trip/trip_event.dart';
import 'package:travel_mate/components/home/create_trip_content.dart'; import 'package:travel_mate/components/home/create_trip_content.dart';
@@ -142,7 +140,6 @@ class _ShowTripDetailsContentState extends State<ShowTripDetailsContent> {
TextButton( TextButton(
onPressed: () { onPressed: () {
context.read<TripBloc>().add(TripDeleteRequested(tripId: widget.trip.id!)); context.read<TripBloc>().add(TripDeleteRequested(tripId: widget.trip.id!));
context.read<GroupBloc>().add(DeleteGroup(widget.trip.id!));
Navigator.pop(context); // Fermer le dialogue Navigator.pop(context); // Fermer le dialogue
Navigator.pop(context, true); // Retourner à l'écran précédent Navigator.pop(context, true); // Retourner à l'écran précédent
}, },