Files
unionflow-server-impl-quarkus/unionflow-mobile-apps/lib/features/members/presentation/pages/membres_dashboard_page.dart
2025-09-17 17:54:06 +00:00

226 lines
7.5 KiB
Dart

import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import '../../../../core/di/injection.dart';
import '../../../../shared/theme/app_theme.dart';
import '../bloc/membres_bloc.dart';
import '../bloc/membres_event.dart';
import '../bloc/membres_state.dart';
import '../widgets/dashboard/welcome_section_widget.dart';
import '../widgets/dashboard/members_kpi_section_widget.dart';
import '../widgets/dashboard/members_quick_actions_widget.dart';
import '../widgets/dashboard/members_analytics_widget.dart';
import '../widgets/dashboard/members_enhanced_list_widget.dart';
import '../widgets/dashboard/members_recent_activities_widget.dart';
import '../widgets/dashboard/members_advanced_filters_widget.dart';
import '../widgets/dashboard/members_smart_search_widget.dart';
import '../widgets/dashboard/members_notifications_widget.dart';
import 'membre_edit_page.dart';
// Import de l'architecture unifiée pour amélioration progressive
import '../../../../shared/widgets/common/unified_page_layout.dart';
// Imports des optimisations de performance
import '../../../../core/performance/performance_optimizer.dart';
import '../../../../shared/widgets/performance/optimized_list_view.dart';
class MembresDashboardPage extends StatefulWidget {
const MembresDashboardPage({super.key});
@override
State<MembresDashboardPage> createState() => _MembresDashboardPageState();
}
class _MembresDashboardPageState extends State<MembresDashboardPage> {
late MembresBloc _membresBloc;
Map<String, dynamic> _currentFilters = {};
String _currentSearchQuery = '';
@override
void initState() {
super.initState();
_membresBloc = getIt<MembresBloc>();
_loadData();
}
void _loadData() {
_membresBloc.add(const LoadMembres());
}
void _onFiltersChanged(Map<String, dynamic> filters) {
setState(() {
_currentFilters = filters;
});
// TODO: Appliquer les filtres aux données
_loadData();
}
void _onSearchChanged(String query) {
setState(() {
_currentSearchQuery = query;
});
// TODO: Appliquer la recherche
if (query.isNotEmpty) {
_membresBloc.add(SearchMembres(query));
} else {
_loadData();
}
}
void _onSuggestionSelected(Map<String, dynamic> suggestion) {
switch (suggestion['type']) {
case 'quick_filter':
_onFiltersChanged(suggestion['filter']);
break;
case 'member':
// TODO: Naviguer vers les détails du membre
break;
}
}
@override
Widget build(BuildContext context) {
return BlocProvider.value(
value: _membresBloc,
child: BlocBuilder<MembresBloc, MembresState>(
builder: (context, state) {
// Utilisation de UnifiedPageLayout pour améliorer la cohérence
// tout en conservant TOUS les widgets spécialisés existants
return UnifiedPageLayout(
title: 'Dashboard Membres',
icon: Icons.people,
actions: [
IconButton(
icon: const Icon(Icons.refresh),
onPressed: _loadData,
tooltip: 'Actualiser',
),
],
isLoading: state is MembresLoading,
errorMessage: state is MembresError ? state.message : null,
onRefresh: _loadData,
floatingActionButton: FloatingActionButton(
onPressed: _loadData,
backgroundColor: AppTheme.primaryColor,
tooltip: 'Actualiser les données',
child: const Icon(Icons.refresh, color: Colors.white),
),
body: _buildDashboard(),
);
},
),
);
}
Widget _buildDashboard() {
return SingleChildScrollView(
padding: const EdgeInsets.all(16),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
// Section d'accueil
const MembersWelcomeSectionWidget(),
const SizedBox(height: 24),
// Notifications en temps réel
const MembersNotificationsWidget(),
// Recherche intelligente
MembersSmartSearchWidget(
onSearch: _onSearchChanged,
onSuggestionSelected: _onSuggestionSelected,
recentSearches: const [], // TODO: Implémenter l'historique
),
const SizedBox(height: 16),
// Filtres avancés
MembersAdvancedFiltersWidget(
onFiltersChanged: _onFiltersChanged,
initialFilters: _currentFilters,
),
// KPI Cards
const MembersKPISectionWidget(),
const SizedBox(height: 24),
// Actions rapides
const MembersQuickActionsWidget(),
const SizedBox(height: 24),
// Graphiques et analyses
const MembersAnalyticsWidget(),
const SizedBox(height: 24),
// Activités récentes
const MembersRecentActivitiesWidget(),
const SizedBox(height: 24),
// Liste des membres améliorée
BlocBuilder<MembresBloc, MembresState>(
builder: (context, state) {
if (state is MembresLoaded) {
return MembersEnhancedListWidget(
members: state.membres,
onMemberTap: (member) {
// TODO: Naviguer vers les détails du membre
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text('Détails de ${member.nomComplet}'),
backgroundColor: AppTheme.primaryColor,
),
);
},
onMemberCall: (member) {
// TODO: Appeler le membre
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text('Appel de ${member.nomComplet}'),
backgroundColor: AppTheme.successColor,
),
);
},
onMemberMessage: (member) {
// TODO: Envoyer un message
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text('Message à ${member.nomComplet}'),
backgroundColor: AppTheme.infoColor,
),
);
},
onMemberEdit: (member) async {
final result = await Navigator.of(context).push(
MaterialPageRoute(
builder: (context) => MembreEditPage(membre: member),
),
);
if (result == true) {
// Recharger les données si le membre a été modifié
_membresBloc.add(const LoadMembres());
}
},
searchQuery: _currentSearchQuery,
filters: _currentFilters,
);
} else if (state is MembresLoading) {
return MembersEnhancedListWidget(
members: const [],
onMemberTap: (member) {},
isLoading: true,
searchQuery: '',
filters: const {},
);
} else {
return const Center(
child: Text('Erreur lors du chargement des membres'),
);
}
},
),
],
),
);
}
}