From 94e52d8d9f7aebe6e949f9b9df3b398c4b563096 Mon Sep 17 00:00:00 2001 From: ggurdin Date: Mon, 4 Nov 2024 13:42:26 -0500 Subject: [PATCH] added pagination to constructs list in analytics popup to speed up rendering --- .../analytics_summary/analytics_popup.dart | 93 ++++++++++++++++--- 1 file changed, 78 insertions(+), 15 deletions(-) diff --git a/lib/pangea/widgets/chat_list/analytics_summary/analytics_popup.dart b/lib/pangea/widgets/chat_list/analytics_summary/analytics_popup.dart index 5eda9c97c..f3a60c0e7 100644 --- a/lib/pangea/widgets/chat_list/analytics_summary/analytics_popup.dart +++ b/lib/pangea/widgets/chat_list/analytics_summary/analytics_popup.dart @@ -1,3 +1,5 @@ +import 'dart:math'; + import 'package:fluffychat/config/app_config.dart'; import 'package:fluffychat/pangea/enum/construct_type_enum.dart'; import 'package:fluffychat/pangea/enum/progress_indicators_enum.dart'; @@ -65,21 +67,11 @@ class AnalyticsPopup extends StatelessWidget { final category = categoriesToUses[index]; return Column( children: [ - ExpansionTile( - title: Text( - category.value.first.constructType.getDisplayCopy( - category.key, - context, - ) ?? - category.key, - ), - children: category.value.map((constructUses) { - return ConstructUsesXPTile( - indicator: indicator, - constructsModel: constructsModel, - constructUses: constructUses, - ); - }).toList(), + ConstructUsesExpansionTile( + indicator: indicator, + constructsModel: constructsModel, + category: category.key, + constructUses: category.value, ), const Divider(height: 1), ], @@ -166,3 +158,74 @@ class ConstructUsesXPTile extends StatelessWidget { ); } } + +class ConstructUsesExpansionTile extends StatefulWidget { + final ProgressIndicatorEnum indicator; + final ConstructListModel constructsModel; + final String category; + final List constructUses; + + const ConstructUsesExpansionTile({ + required this.indicator, + required this.constructsModel, + required this.category, + required this.constructUses, + super.key, + }); + + @override + ConstructUsesExpansionTileState createState() => + ConstructUsesExpansionTileState(); +} + +class ConstructUsesExpansionTileState + extends State { + int _lastLoadedIndex = 50; + int get endIndex => min(_lastLoadedIndex, widget.constructUses.length); + + @override + Widget build(BuildContext context) { + final List xpTiles = widget.constructUses + .sublist(0, endIndex) + .map((constructUses) { + return ConstructUsesXPTile( + indicator: widget.indicator, + constructsModel: widget.constructsModel, + constructUses: constructUses, + ); + }) + .cast() + .toList(); + + if (widget.constructUses.length > _lastLoadedIndex) { + xpTiles.add( + Padding( + padding: const EdgeInsets.all(10), + child: TextButton( + child: Text(L10n.of(context)!.loadMore), + onPressed: () => setState(() => _lastLoadedIndex += 50), + ), + ), + ); + } + + return ExpansionTile( + title: Text( + widget.constructsModel.type == ConstructTypeEnum.morph + ? getGrammarCopy( + category: widget.category, + lemma: widget.constructUses.first.lemma, + context: context, + ) ?? + widget.category + : widget.category, + ), + children: xpTiles, + onExpansionChanged: (expanded) { + if (expanded) { + setState(() => _lastLoadedIndex = 50); + } + }, + ); + } +}