1+ import "package:fast_immutable_collections/fast_immutable_collections.dart" ;
12import "package:flutter/material.dart" ;
2- import "package:flutter_riverpod/flutter_riverpod.dart" ;
3+ import "package:flutter_hooks/flutter_hooks.dart" ;
4+ import "package:hooks_riverpod/hooks_riverpod.dart" ;
35
46import "../../../../../config/ui_config.dart" ;
57import "../../../../../gen/assets.gen.dart" ;
68import "../../../../../utils/context_extensions.dart" ;
9+ import "../../tabs/accessibility_dialog/business/active_modes_cache.dart" ;
710import "../../tabs/accessibility_dialog/data/active_accessibility_modes_repository.dart" ;
811import "../../tabs/accessibility_dialog/data/modes.dart" ;
912import "accessibility_information_card.dart" ;
@@ -28,7 +31,7 @@ typedef AccessibilityInformationOptionalCommentsInput = ({
2831 String ? commentForHighSensorySensitivity,
2932});
3033
31- class AccessibilityInformationCardsList extends ConsumerWidget {
34+ class AccessibilityInformationCardsList extends HookConsumerWidget {
3235 const AccessibilityInformationCardsList ({
3336 super .key,
3437 required this .prefix,
@@ -47,108 +50,126 @@ class AccessibilityInformationCardsList extends ConsumerWidget {
4750 @override
4851 Widget build (BuildContext context, WidgetRef ref) {
4952 final currentModesAsync = ref.watch (activeAccessibilityModesRepositoryProvider);
53+ final cache = ref.watch (activeModesCacheProvider);
54+
55+ useEffect (() {
56+ final sub = ref.listenManual <AsyncValue <ISet <ModeWithKey >>>(activeAccessibilityModesRepositoryProvider, (
57+ prev,
58+ next,
59+ ) {
60+ next.whenData ((modes) {
61+ ref.read (activeModesCacheProvider.notifier).set (modes);
62+ });
63+ });
64+
65+ return sub.close;
66+ }, const []);
67+
68+ Widget buildCards (ISet <ModeWithKey > modesToRender) {
69+ if (modesToRender.isEmpty) return const SizedBox .shrink ();
70+
71+ final cards = {
72+ // Card for blind accessibility
73+ const Blind (): AccessibilityInformationCard (
74+ icon: Assets .svg.digitalGuide.accessibilityAlerts.blindProfile,
75+ color: DigitalGuideConfig .accessibilityLevelColors[accLevels.accessibilityLevelForBlind],
76+ text:
77+ accComments? .commentForBlind ??
78+ context.localize.accessibility_card_information (
79+ prefix,
80+ accessibilityLevelType (accLevels.accessibilityLevelForBlind.toString ()),
81+ context.localize.people_blind,
82+ ),
83+ ),
84+
85+ // Card for visually impaired
86+ const LowVision (): AccessibilityInformationCard (
87+ icon: Assets .svg.digitalGuide.accessibilityAlerts.visuallyImpaired,
88+ color: DigitalGuideConfig .accessibilityLevelColors[accLevels.accessibilityLevelForVisuallyImpaired],
89+ text:
90+ accComments? .commentForVisuallyImpaired ??
91+ context.localize.accessibility_card_information (
92+ prefix,
93+ accessibilityLevelType (accLevels.accessibilityLevelForVisuallyImpaired.toString ()),
94+ context.localize.people_visually_impaired,
95+ ),
96+ ),
97+
98+ // Card for motor disabilities
99+ const MotorImpairment (): AccessibilityInformationCard (
100+ icon: Assets .svg.digitalGuide.accessibilityAlerts.movementDysfunction,
101+ color: DigitalGuideConfig .accessibilityLevelColors[accLevels.accessibilityLevelForMotorDisability],
102+ text:
103+ accComments? .commentForMotorDisability ??
104+ context.localize.accessibility_card_information (
105+ prefix,
106+ accessibilityLevelType (accLevels.accessibilityLevelForMotorDisability.toString ()),
107+ context.localize.people_with_motor_disability,
108+ ),
109+ ),
110+
111+ // Card for cognitive difficulties
112+ const CognitiveImpairment (): AccessibilityInformationCard (
113+ icon: Assets .svg.digitalGuide.accessibilityAlerts.cognitiveDifficulties,
114+ color: DigitalGuideConfig .accessibilityLevelColors[accLevels.accessibilityLevelForCognitiveDifficulties],
115+ text:
116+ accComments? .commentForCognitiveDifficulties ??
117+ context.localize.accessibility_card_information (
118+ prefix,
119+ accessibilityLevelType (accLevels.accessibilityLevelForCognitiveDifficulties.toString ()),
120+ context.localize.people_with_cognitive_difficulties,
121+ ),
122+ ),
123+
124+ // Card for hard of hearing
125+ const HearingImpairment (): AccessibilityInformationCard (
126+ icon: Assets .svg.digitalGuide.accessibilityAlerts.hearingDysfunction,
127+ color: DigitalGuideConfig .accessibilityLevelColors[accLevels.accessibilityLevelForHardOfHearing],
128+ text:
129+ accComments? .commentForHardOfHearing ??
130+ context.localize.accessibility_card_information (
131+ prefix,
132+ accessibilityLevelType (accLevels.accessibilityLevelForHardOfHearing.toString ()),
133+ context.localize.people_with_hard_of_hearing,
134+ ),
135+ ),
136+
137+ // Card for high sensory sensitivity
138+ const SensorySensitivity (): AccessibilityInformationCard (
139+ icon: Assets .svg.digitalGuide.accessibilityAlerts.sensorySensitivity,
140+ color: DigitalGuideConfig .accessibilityLevelColors[accLevels.accessibilityLevelForHighSensorySensitivity],
141+ text:
142+ accComments? .commentForHighSensorySensitivity ??
143+ context.localize.accessibility_card_information (
144+ prefix,
145+ accessibilityLevelType (accLevels.accessibilityLevelForHighSensorySensitivity.toString ()),
146+ context.localize.people_with_high_sensory_sensitivity,
147+ ),
148+ ),
149+ };
150+
151+ final widgets = modesToRender
152+ .map ((m) => cards[m])
153+ .whereType <AccessibilityInformationCard >()
154+ .toList (growable: false );
155+
156+ return Padding (
157+ padding: padding,
158+ child: Column (
159+ children: [
160+ for (var i = 0 ; i < widgets.length; i++ ) ...[
161+ widgets[i],
162+ if (i != widgets.length - 1 ) const SizedBox (height: DigitalGuideConfig .heightSmall),
163+ ],
164+ ],
165+ ),
166+ );
167+ }
50168
51169 return currentModesAsync.when (
52- loading: () => const SizedBox . shrink ( ),
170+ loading: () => buildCards (cache ),
53171 error: (error, stack) => Center (child: Text ("Error: $error " )),
54- data: (currentModes) {
55- if (currentModes.isEmpty) {
56- return const SizedBox .shrink ();
57- }
58-
59- final cards = {
60- // Card for blind accessibility
61- const Blind (): AccessibilityInformationCard (
62- icon: Assets .svg.digitalGuide.accessibilityAlerts.blindProfile,
63- color: DigitalGuideConfig .accessibilityLevelColors[accLevels.accessibilityLevelForBlind],
64- text:
65- accComments? .commentForBlind ??
66- context.localize.accessibility_card_information (
67- prefix,
68- accessibilityLevelType (accLevels.accessibilityLevelForBlind.toString ()),
69- context.localize.people_blind,
70- ),
71- ),
72-
73- // Card for visually impaired
74- const LowVision (): AccessibilityInformationCard (
75- icon: Assets .svg.digitalGuide.accessibilityAlerts.visuallyImpaired,
76- color: DigitalGuideConfig .accessibilityLevelColors[accLevels.accessibilityLevelForVisuallyImpaired],
77- text:
78- accComments? .commentForVisuallyImpaired ??
79- context.localize.accessibility_card_information (
80- prefix,
81- accessibilityLevelType (accLevels.accessibilityLevelForVisuallyImpaired.toString ()),
82- context.localize.people_visually_impaired,
83- ),
84- ),
85-
86- // Card for motor disabilities
87- const MotorImpairment (): AccessibilityInformationCard (
88- icon: Assets .svg.digitalGuide.accessibilityAlerts.movementDysfunction,
89- color: DigitalGuideConfig .accessibilityLevelColors[accLevels.accessibilityLevelForMotorDisability],
90- text:
91- accComments? .commentForMotorDisability ??
92- context.localize.accessibility_card_information (
93- prefix,
94- accessibilityLevelType (accLevels.accessibilityLevelForMotorDisability.toString ()),
95- context.localize.people_with_motor_disability,
96- ),
97- ),
98-
99- // Card for cognitive difficulties
100- const CognitiveImpairment (): AccessibilityInformationCard (
101- icon: Assets .svg.digitalGuide.accessibilityAlerts.cognitiveDifficulties,
102- color: DigitalGuideConfig .accessibilityLevelColors[accLevels.accessibilityLevelForCognitiveDifficulties],
103- text:
104- accComments? .commentForCognitiveDifficulties ??
105- context.localize.accessibility_card_information (
106- prefix,
107- accessibilityLevelType (accLevels.accessibilityLevelForCognitiveDifficulties.toString ()),
108- context.localize.people_with_cognitive_difficulties,
109- ),
110- ),
111-
112- // Card for hard of hearing
113- const HearingImpairment (): AccessibilityInformationCard (
114- icon: Assets .svg.digitalGuide.accessibilityAlerts.hearingDysfunction,
115- color: DigitalGuideConfig .accessibilityLevelColors[accLevels.accessibilityLevelForHardOfHearing],
116- text:
117- accComments? .commentForHardOfHearing ??
118- context.localize.accessibility_card_information (
119- prefix,
120- accessibilityLevelType (accLevels.accessibilityLevelForHardOfHearing.toString ()),
121- context.localize.people_with_hard_of_hearing,
122- ),
123- ),
124-
125- // Card for high sensory sensitivity
126- const SensorySensitivity (): AccessibilityInformationCard (
127- icon: Assets .svg.digitalGuide.accessibilityAlerts.sensorySensitivity,
128- color: DigitalGuideConfig .accessibilityLevelColors[accLevels.accessibilityLevelForHighSensorySensitivity],
129- text:
130- accComments? .commentForHighSensorySensitivity ??
131- context.localize.accessibility_card_information (
132- prefix,
133- accessibilityLevelType (accLevels.accessibilityLevelForHighSensorySensitivity.toString ()),
134- context.localize.people_with_high_sensory_sensitivity,
135- ),
136- ),
137- };
138-
139- final widgets = currentModes.map ((mode) => cards[mode]).toList ();
140-
141- return Padding (
142- padding: padding,
143- child: ListView .separated (
144- physics: const NeverScrollableScrollPhysics (),
145- itemCount: widgets.length,
146- itemBuilder: (context, index) => widgets[index],
147- separatorBuilder: (context, index) => const SizedBox (height: DigitalGuideConfig .heightSmall),
148- shrinkWrap: true ,
149- ),
150- );
151- },
172+ data: (modes) => modes.isEmpty ? const SizedBox .shrink () : buildCards (modes),
152173 );
153174 }
154175}
0 commit comments