From 4f2475bc5e46edb1f39a7f59d54190cffbbaa22d Mon Sep 17 00:00:00 2001 From: ggurdin <46800240+ggurdin@users.noreply.github.com> Date: Wed, 29 Jan 2025 15:57:54 -0500 Subject: [PATCH] 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 --- .../activity_planner/activity_list_view.dart | 162 ++++++++++-------- 1 file changed, 88 insertions(+), 74 deletions(-) diff --git a/lib/pangea/activity_planner/activity_list_view.dart b/lib/pangea/activity_planner/activity_list_view.dart index a30b3cc7c..02709817c 100644 --- a/lib/pangea/activity_planner/activity_list_view.dart +++ b/lib/pangea/activity_planner/activity_list_view.dart @@ -34,31 +34,58 @@ class ActivityListView extends StatefulWidget { } class ActivityListViewState extends State { - bool get showBookmarkedActivities => widget.activityPlanRequest == null; + List? _activities; + List get _bookmarkedActivities => + BookmarkedActivitiesRepo.get(); - Future> get savedActivities => - Future.value(BookmarkedActivitiesRepo.get()); - - Future> 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 _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 _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 { Future _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 { @override Widget build(BuildContext context) { final l10n = L10n.of(context); - return FutureBuilder>( - 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), - ); - }, - ); - } - }, - ); + }, + ); + } } }