feat: Implement account management features

- Added ExpenseDetailDialog for displaying expense details and actions.
- Created ExpensesTab to list expenses for a group.
- Developed GroupExpensesPage to manage group expenses with tabs for expenses, balances, and settlements.
- Introduced SettlementsTab to show optimized repayment plans.
- Refactored create_trip_content.dart to remove CountBloc and related logic.
- Added Account model to manage user accounts and group members.
- Replaced CountRepository with AccountRepository for account-related operations.
- Removed CountService and CountRepository as part of the refactor.
- Updated main.dart and home.dart to integrate new account management components.
This commit is contained in:
Dayron
2025-10-21 00:42:36 +02:00
parent a3ced0e812
commit c69618cbd9
21 changed files with 182 additions and 747 deletions

View File

@@ -3,9 +3,9 @@ import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:image_picker/image_picker.dart';
import 'package:intl/intl.dart';
import '../../blocs/count/count_bloc.dart';
import '../../blocs/count/count_event.dart';
import '../../blocs/count/count_state.dart';
import '../../blocs/account/account_bloc.dart';
import '../../blocs/account/account_event.dart';
import '../../blocs/account/account_state.dart';
import '../../blocs/user/user_state.dart' as user_state;
import '../../data/models/group.dart';
import '../../data/models/expense.dart';
@@ -148,7 +148,7 @@ class _AddExpenseDialogState extends State<AddExpenseDialog> {
try {
// Convertir en EUR
final amountInEur = await context.read<CountBloc>().state is ExpensesLoaded
final amountInEur = context.read<CountBloc>().state is ExpensesLoaded
? (context.read<CountBloc>().state as ExpensesLoaded)
.exchangeRates[_selectedCurrency]! * amount
: amount;
@@ -435,7 +435,7 @@ class _AddExpenseDialogState extends State<AddExpenseDialog> {
});
},
);
}).toList(),
}),
],
),
),

View File

@@ -1,8 +1,8 @@
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:intl/intl.dart';
import '../../blocs/count/count_bloc.dart';
import '../../blocs/count/count_event.dart';
import '../../blocs/account/account_bloc.dart';
import '../../blocs/account/account_event.dart';
import '../../blocs/user/user_bloc.dart';
import '../../blocs/user/user_state.dart' as user_state;
import '../../data/models/expense.dart';
@@ -67,7 +67,7 @@ class ExpenseDetailDialog extends StatelessWidget {
width: 80,
height: 80,
decoration: BoxDecoration(
color: Colors.blue.withOpacity(0.1),
color: Colors.blue.withValues(alpha: 0.1),
shape: BoxShape.circle,
),
child: Icon(

View File

@@ -1,8 +1,8 @@
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import '../../blocs/count/count_bloc.dart';
import '../../blocs/count/count_event.dart';
import '../../blocs/count/count_state.dart';
import '../../blocs/account/account_bloc.dart';
import '../../blocs/account/account_event.dart';
import '../../blocs/account/account_state.dart';
import '../../blocs/user/user_bloc.dart';
import '../../blocs/user/user_state.dart' as user_state;
import '../../data/models/group.dart';

View File

@@ -9,8 +9,6 @@ import '../../blocs/trip/trip_event.dart';
import '../../blocs/trip/trip_state.dart';
import '../../blocs/group/group_bloc.dart';
import '../../blocs/group/group_event.dart';
import '../../blocs/count/count_bloc.dart';
import '../../blocs/count/count_event.dart';
import '../../data/models/group.dart';
import '../../data/models/group_member.dart';
import '../../services/user_service.dart';
@@ -572,7 +570,7 @@ class _CreateTripContentState extends State<CreateTripContent> {
final group = Group(
id: '', // Sera généré par Firestore
name: _titleController.text.trim(),
tripId: tripId,
tripId: tripId, // ✅ ID du voyage récupéré
createdBy: currentUser.id,
);
@@ -591,15 +589,11 @@ class _CreateTripContentState extends State<CreateTripContent> {
)),
];
// Créer le groupe
context.read<GroupBloc>().add(CreateGroupWithMembers(
group: group,
members: groupMembers,
));
// ✅ AJOUT : Attendre un court instant pour que le groupe soit créé
await Future.delayed(const Duration(milliseconds: 500));
if (mounted) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(