Skip to content

Commit 2ffe1fe

Browse files
committed
fix(digital-guide): cache last accesibility cards
1 parent b4034a4 commit 2ffe1fe

File tree

3 files changed

+137
-101
lines changed

3 files changed

+137
-101
lines changed

lib/features/digital_guide/presentation/digital_guide_view.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ class DigitalGuideView extends ConsumerWidget {
3737
@override
3838
Widget build(BuildContext context, WidgetRef ref) {
3939
final asyncDigitalGuideData = ref.watch(digitalGuideRepositoryProvider(ourId));
40+
4041
return asyncDigitalGuideData.when(
4142
data: (data) {
4243
return _DigitalGuideView(data.digitalGuideData, data.photoUrl, building);
Lines changed: 122 additions & 101 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
1+
import "package:fast_immutable_collections/fast_immutable_collections.dart";
12
import "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

46
import "../../../../../config/ui_config.dart";
57
import "../../../../../gen/assets.gen.dart";
68
import "../../../../../utils/context_extensions.dart";
9+
import "../../tabs/accessibility_dialog/business/active_modes_cache.dart";
710
import "../../tabs/accessibility_dialog/data/active_accessibility_modes_repository.dart";
811
import "../../tabs/accessibility_dialog/data/modes.dart";
912
import "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
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import "package:fast_immutable_collections/fast_immutable_collections.dart";
2+
import "package:riverpod_annotation/riverpod_annotation.dart";
3+
4+
import "../data/modes.dart";
5+
6+
part "active_modes_cache.g.dart";
7+
8+
@Riverpod(keepAlive: true)
9+
class ActiveModesCache extends _$ActiveModesCache {
10+
@override
11+
ISet<ModeWithKey> build() => const ISetConst({});
12+
13+
void set(ISet<ModeWithKey> modes) => state = modes;
14+
}

0 commit comments

Comments
 (0)