1+ import 'package:bb_mobile/core/widgets/snackbar_utils.dart' ;
12import 'package:bb_mobile/features/announcements/domain/entities/announcement.dart' ;
23import 'package:bb_mobile/features/announcements/presentation/announcements_cubit.dart' ;
4+ import 'package:bb_mobile/features/announcements/presentation/announcements_failure_l10n.dart' ;
5+ import 'package:bb_mobile/features/announcements/ui/announcement_navigation.dart' ;
36import 'package:bb_mobile/features/announcements/ui/widgets/announcement_card.dart' ;
47import 'package:bb_mobile/features/announcements/ui/widgets/announcement_dismiss_dialog.dart' ;
58import 'package:bull_ui/bull_ui.dart' ;
@@ -16,26 +19,41 @@ class AnnouncementCarousel extends StatelessWidget {
1619
1720 @override
1821 Widget build (BuildContext context) {
19- // Narrow rebuild: only when the visible set changes.
20- return BlocSelector <
21- AnnouncementsCubit ,
22- AnnouncementsState ,
23- List <Announcement >
24- >(
25- selector: (state) => state.announcements,
26- builder: (context, announcements) {
27- return AnimatedSize (
28- duration: const Duration (milliseconds: 200 ),
29- curve: Curves .easeInOut,
30- alignment: Alignment .topCenter,
31- child: announcements.isEmpty
32- ? const SizedBox (width: double .infinity)
33- : Padding (
34- padding: const EdgeInsets .only (left: 13 , right: 13 , top: 13 ),
35- child: _CarouselBody (announcements: announcements),
36- ),
37- );
38- },
22+ return BlocListener <AnnouncementsCubit , AnnouncementsState >(
23+ // Surface a dismissal/refresh failure (the card otherwise just stays).
24+ // Fires only when a new failure appears, not on every rebuild.
25+ listenWhen: (previous, current) =>
26+ current.failure != null && previous.failure != current.failure,
27+ listener: (context, state) => SnackBarUtils .showSnackBar (
28+ context,
29+ state.failure! .toTranslated (context),
30+ ),
31+ // Narrow rebuild: only when the visible set changes.
32+ child:
33+ BlocSelector <
34+ AnnouncementsCubit ,
35+ AnnouncementsState ,
36+ List <Announcement >
37+ >(
38+ selector: (state) => state.announcements,
39+ builder: (context, announcements) {
40+ return AnimatedSize (
41+ duration: const Duration (milliseconds: 200 ),
42+ curve: Curves .easeInOut,
43+ alignment: Alignment .topCenter,
44+ child: announcements.isEmpty
45+ ? const SizedBox (width: double .infinity)
46+ : Padding (
47+ padding: const EdgeInsets .only (
48+ left: 13 ,
49+ right: 13 ,
50+ top: 13 ,
51+ ),
52+ child: _CarouselBody (announcements: announcements),
53+ ),
54+ );
55+ },
56+ ),
3957 );
4058 }
4159}
@@ -72,8 +90,8 @@ class _CarouselBodyState extends State<_CarouselBody> {
7290
7391 void _onTap (Announcement announcement) {
7492 switch (announcement.action) {
75- case NavigateAction (: final routeName ):
76- context.pushNamed (routeName );
93+ case NavigateAction ():
94+ context.pushNamed (announcement.route.name );
7795 }
7896 }
7997
0 commit comments