Testing fixes (#1636)

* fix: allow dismiss wod data card on click outside

* fix: save activities list in stateful variable so page doesn't reload when text field is selected
This commit is contained in:
ggurdin 2025-01-29 15:57:54 -05:00 committed by GitHub
parent dc01bbca27
commit 4f2475bc5e
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -34,31 +34,58 @@ class ActivityListView extends StatefulWidget {
}
class ActivityListViewState extends State<ActivityListView> {
bool get showBookmarkedActivities => widget.activityPlanRequest == null;
List<ActivityPlanModel>? _activities;
List<ActivityPlanModel> get _bookmarkedActivities =>
BookmarkedActivitiesRepo.get();
Future<List<ActivityPlanModel>> get savedActivities =>
Future.value(BookmarkedActivitiesRepo.get());
Future<List<ActivityPlanModel>> get activities async =>
showBookmarkedActivities
? await savedActivities
: (await ActivityPlanGenerationRepo.get(widget.activityPlanRequest!))
.activityPlans;
bool _isLoading = true;
Object? _error;
@override
void dispose() {
super.dispose();
void initState() {
super.initState();
_loadActivities();
}
Future<void> _loadActivities() async {
setState(() {
_isLoading = true;
_error = null;
});
try {
if (widget.activityPlanRequest != null) {
final resp = await ActivityPlanGenerationRepo.get(
widget.activityPlanRequest!,
);
_activities = resp.activityPlans;
}
} catch (e, s) {
_error = e;
ErrorHandler.logError(
e: e,
s: s,
data: {
'room': widget.room,
'activityPlanRequest': widget.activityPlanRequest,
},
);
} finally {
setState(() {
_isLoading = false;
});
}
}
Future<void> _onEdit(int index, ActivityPlanModel updatedActivity) async {
// in this case we're editing an activity plan that was generated recently
// via the repo and should be updated in the cached response
if (widget.activityPlanRequest != null) {
final activities = await this.activities;
activities[index] = updatedActivity;
if (widget.activityPlanRequest != null && _activities != null) {
final activities = _activities;
activities?[index] = updatedActivity;
ActivityPlanGenerationRepo.set(
widget.activityPlanRequest!,
ActivityPlanResponse(activityPlans: activities),
ActivityPlanResponse(activityPlans: _activities!),
);
}
@ -68,7 +95,7 @@ class ActivityListViewState extends State<ActivityListView> {
Future<void> _onLaunch(int index) => showFutureLoadingDialog(
context: context,
future: () async {
final activity = (await activities)[index];
final activity = _activities![index];
final eventId = await widget.room?.pangeaSendTextEvent(
activity.markdown,
@ -90,65 +117,52 @@ class ActivityListViewState extends State<ActivityListView> {
@override
Widget build(BuildContext context) {
final l10n = L10n.of(context);
return FutureBuilder<List<ActivityPlanModel>>(
future: activities,
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.waiting) {
return const Center(child: CircularProgressIndicator());
} else if (snapshot.hasError) {
// debugger(when: kDebugMode);
ErrorHandler.logError(
e: snapshot.error,
s: snapshot.stackTrace,
data: {
'room': widget.room,
'activityPlanRequest': widget.activityPlanRequest,
'snapshot.data': snapshot.data,
'snapshot.error': snapshot.error,
},
);
return Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(l10n.oopsSomethingWentWrong),
const SizedBox(height: 16),
ElevatedButton(
onPressed: () {
setState(() {});
},
child: Text(l10n.tryAgain),
),
],
if (_isLoading) {
return const Center(child: CircularProgressIndicator());
} else if (_error != null) {
return Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(l10n.oopsSomethingWentWrong),
const SizedBox(height: 16),
ElevatedButton(
onPressed: _loadActivities,
child: Text(l10n.tryAgain),
),
],
),
);
} else if (widget.activityPlanRequest != null &&
(_activities == null || _activities!.isEmpty)) {
return Center(child: Text(l10n.noDataFound));
} else if (widget.activityPlanRequest == null &&
(_bookmarkedActivities.isEmpty)) {
return Center(
child: Container(
constraints: const BoxConstraints(maxWidth: 200),
child: Text(
l10n.noBookmarkedActivities,
textAlign: TextAlign.center,
),
),
);
} else {
return ListView.builder(
padding: const EdgeInsets.all(16),
itemCount: widget.activityPlanRequest == null
? _bookmarkedActivities.length
: _activities!.length,
itemBuilder: (context, index) {
return ActivityPlanCard(
activity: widget.activityPlanRequest == null
? _bookmarkedActivities[index]
: _activities![index],
onLaunch: () => _onLaunch(index),
onEdit: (updatedActivity) => _onEdit(index, updatedActivity),
);
} else if (!snapshot.hasData || snapshot.data!.isEmpty) {
if (showBookmarkedActivities) {
return Center(
child: Container(
constraints: const BoxConstraints(maxWidth: 200),
child: Text(
l10n.noBookmarkedActivities,
textAlign: TextAlign.center,
),
),
);
}
return Center(child: Text(l10n.noDataFound));
} else {
return ListView.builder(
padding: const EdgeInsets.all(16),
itemCount: snapshot.data!.length,
itemBuilder: (context, index) {
return ActivityPlanCard(
activity: snapshot.data![index],
onLaunch: () => _onLaunch(index),
onEdit: (updatedActivity) => _onEdit(index, updatedActivity),
);
},
);
}
},
);
},
);
}
}
}