226 lines
7.5 KiB
Dart
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'),
|
|
);
|
|
}
|
|
},
|
|
),
|
|
],
|
|
),
|
|
);
|
|
}
|
|
|
|
}
|