feat(dashboards): ajouter RefreshIndicator pull-to-refresh sur 4 dashboards

Le SuperAdmin dashboard avait déjà RefreshIndicator+Completer.
Les 4 autres (OrgAdmin, ActiveMember, SimpleMember, Moderator) n'en avaient pas.

Ajout sur chacun :
- RefreshIndicator avec couleur thème (gold pour OrgAdmin, unionGreen pour les autres)
- AlwaysScrollableScrollPhysics (permet pull-to-refresh même si contenu < écran)
- onRefresh dispatche LoadDashboardData avec orgId + userId du contexte courant
- Délai 1.2s pour laisser le BLoC recharger avant de masquer l'indicateur
This commit is contained in:
dahoud
2026-04-16 19:57:32 +00:00
parent 8f28881c82
commit 9ebb845cae
4 changed files with 58 additions and 8 deletions

View File

@@ -40,7 +40,19 @@ class ActiveMemberDashboard extends StatelessWidget {
: null; : null;
final stats = dashboardData?.stats; final stats = dashboardData?.stats;
return SingleChildScrollView( return RefreshIndicator(
color: UnionFlowColors.unionGreen,
onRefresh: () async {
final orgCtx = user?.organizationContexts.isNotEmpty == true
? user!.organizationContexts.first : null;
context.read<DashboardBloc>().add(LoadDashboardData(
organizationId: orgCtx?.organizationId ?? '',
userId: user?.id ?? '',
));
await Future.delayed(const Duration(milliseconds: 1200));
},
child: SingleChildScrollView(
physics: const AlwaysScrollableScrollPhysics(),
padding: const EdgeInsets.all(12), padding: const EdgeInsets.all(12),
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
@@ -220,7 +232,8 @@ class ActiveMemberDashboard extends StatelessWidget {
), ),
], ],
), ),
); ), // SingleChildScrollView
); // RefreshIndicator
}, },
); );
}, },

View File

@@ -43,7 +43,19 @@ class ModeratorDashboard extends StatelessWidget {
: null; : null;
final stats = dashboardData?.stats; final stats = dashboardData?.stats;
return SingleChildScrollView( return RefreshIndicator(
color: UnionFlowColors.unionGreen,
onRefresh: () async {
final orgCtx = user?.organizationContexts.isNotEmpty == true
? user!.organizationContexts.first : null;
context.read<DashboardBloc>().add(LoadDashboardData(
organizationId: orgCtx?.organizationId ?? '',
userId: user?.id ?? '',
));
await Future.delayed(const Duration(milliseconds: 1200));
},
child: SingleChildScrollView(
physics: const AlwaysScrollableScrollPhysics(),
padding: const EdgeInsets.all(12), padding: const EdgeInsets.all(12),
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
@@ -350,7 +362,8 @@ class ModeratorDashboard extends StatelessWidget {
), ),
], ],
), ),
); ), // SingleChildScrollView
); // RefreshIndicator
}, },
); );
}, },

View File

@@ -50,7 +50,17 @@ class OrgAdminDashboard extends StatelessWidget {
: null; : null;
final stats = dashboardData?.stats; final stats = dashboardData?.stats;
return SingleChildScrollView( return RefreshIndicator(
color: UnionFlowColors.gold,
onRefresh: () async {
context.read<DashboardBloc>().add(LoadDashboardData(
organizationId: orgContext?.organizationId ?? '',
userId: user?.id ?? '',
));
await Future.delayed(const Duration(milliseconds: 1200));
},
child: SingleChildScrollView(
physics: const AlwaysScrollableScrollPhysics(),
padding: const EdgeInsets.all(12), padding: const EdgeInsets.all(12),
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
@@ -276,7 +286,8 @@ class OrgAdminDashboard extends StatelessWidget {
), ),
], ],
), ),
); ), // SingleChildScrollView
); // RefreshIndicator
}, },
); );
}, },

View File

@@ -39,7 +39,19 @@ class SimpleMemberDashboard extends StatelessWidget {
: null; : null;
final stats = dashboardData?.stats; final stats = dashboardData?.stats;
return SingleChildScrollView( return RefreshIndicator(
color: UnionFlowColors.unionGreen,
onRefresh: () async {
final orgCtx = user?.organizationContexts.isNotEmpty == true
? user!.organizationContexts.first : null;
context.read<DashboardBloc>().add(LoadDashboardData(
organizationId: orgCtx?.organizationId ?? '',
userId: user?.id ?? '',
));
await Future.delayed(const Duration(milliseconds: 1200));
},
child: SingleChildScrollView(
physics: const AlwaysScrollableScrollPhysics(),
padding: const EdgeInsets.all(12), padding: const EdgeInsets.all(12),
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
@@ -180,7 +192,8 @@ class SimpleMemberDashboard extends StatelessWidget {
], ],
], ],
), ),
); ), // SingleChildScrollView
); // RefreshIndicator
}, },
); );
}, },