diff --git a/lib/pangea/activity_generator/activity_generator.dart b/lib/pangea/activity_generator/activity_generator.dart index 41c9b7097..441b7344f 100644 --- a/lib/pangea/activity_generator/activity_generator.dart +++ b/lib/pangea/activity_generator/activity_generator.dart @@ -50,6 +50,10 @@ class ActivityGeneratorState extends State { String? filename; + List? topicItems; + List? modeItems; + List? objectiveItems; + @override void initState() { super.initState(); @@ -60,7 +64,9 @@ class ActivityGeneratorState extends State { MatrixState.pangeaController.languageController.userL2?.langCode; selectedCefrLevel = LanguageLevelTypeEnum.a1; selectedNumberOfParticipants = 3; - _setModeImageURL(); + _setMode(); + _setTopic(); + _setObjective(); } @override @@ -88,15 +94,6 @@ class ActivityGeneratorState extends State { numberOfParticipants: selectedNumberOfParticipants!, ); - Future> get topicItems => - TopicListRepo.get(req); - - Future> get modeItems => - ActivityModeListRepo.get(req); - - Future> get objectiveItems => - LearningObjectiveListRepo.get(req); - Room? get room => Matrix.of(context).client.getRoomById(widget.roomID); String? validateNotNull(String? value) { @@ -106,31 +103,33 @@ class ActivityGeneratorState extends State { return null; } - Future _randomTopic() async { - final topics = await topicItems; - return (topics..shuffle()).first.name; - } + String? get _randomTopic => (topicItems?..shuffle())?.first.name; - Future _randomObjective() async { - final objectives = await objectiveItems; - return (objectives..shuffle()).first.name; - } + String? get _randomObjective => (objectiveItems?..shuffle())?.first.name; - Future _randomMode() async { - final modes = await modeItems; - return (modes..shuffle()).first.name; - } + String? get _randomMode => (modeItems?..shuffle())?.first.name; - void randomizeSelections() async { - final selectedTopic = await _randomTopic(); - final selectedObjective = await _randomObjective(); - final selectedMode = await _randomMode(); + bool get randomizeEnabled => + topicItems != null && objectiveItems != null && modeItems != null; - setState(() { - topicController.text = selectedTopic; - objectiveController.text = selectedObjective; - modeController.text = selectedMode; - }); + void randomizeSelections() { + final selectedTopic = _randomTopic; + final selectedObjective = _randomObjective; + final selectedMode = _randomMode; + + if (selectedTopic == null || + selectedObjective == null || + selectedMode == null) { + return; + } + + if (mounted) { + setState(() { + topicController.text = selectedTopic; + objectiveController.text = selectedObjective; + modeController.text = selectedMode; + }); + } } void clearSelections() async { @@ -164,15 +163,45 @@ class ActivityGeneratorState extends State { setState(() => selectedCefrLevel = value); } - Future get _selectedMode async { - final modes = await modeItems; - return modes.firstWhereOrNull( + ActivitySettingResponseSchema? get _selectedMode { + return modeItems?.firstWhereOrNull( (element) => element.name.toLowerCase() == planRequest.mode.toLowerCase(), ); } + Future _setTopic() async { + final topic = await TopicListRepo.get(req); + + if (mounted) { + setState(() { + topicItems = topic; + }); + } + } + + Future _setMode() async { + final mode = await ActivityModeListRepo.get(req); + + if (mounted) { + setState(() { + modeItems = mode; + }); + _setModeImageURL(); + } + } + + Future _setObjective() async { + final objective = await LearningObjectiveListRepo.get(req); + + if (mounted) { + setState(() { + objectiveItems = objective; + }); + } + } + Future _setModeImageURL() async { - final mode = await _selectedMode; + final mode = _selectedMode; if (mode == null) return; final modeName = diff --git a/lib/pangea/activity_generator/activity_generator_view.dart b/lib/pangea/activity_generator/activity_generator_view.dart index 1c7e5da00..6a7800f36 100644 --- a/lib/pangea/activity_generator/activity_generator_view.dart +++ b/lib/pangea/activity_generator/activity_generator_view.dart @@ -254,7 +254,9 @@ class ActivityGeneratorView extends StatelessWidget { child: Padding( padding: const EdgeInsets.only(left: 8.0), child: ElevatedButton( - onPressed: controller.randomizeSelections, + onPressed: controller.randomizeEnabled + ? controller.randomizeSelections + : null, child: Row( mainAxisAlignment: MainAxisAlignment.center, children: [ diff --git a/lib/pangea/activity_planner/suggestion_form_field.dart b/lib/pangea/activity_planner/suggestion_form_field.dart index a460235bf..2b76823fe 100644 --- a/lib/pangea/activity_planner/suggestion_form_field.dart +++ b/lib/pangea/activity_planner/suggestion_form_field.dart @@ -3,7 +3,7 @@ import 'package:flutter/material.dart'; import 'package:fluffychat/pangea/activity_generator/list_request_schema.dart'; class SuggestionFormField extends StatelessWidget { - final Future> suggestions; + final List? suggestions; final String? Function(String?)? validator; final int? maxLength; final String label; @@ -12,7 +12,7 @@ class SuggestionFormField extends StatelessWidget { const SuggestionFormField({ super.key, - required this.suggestions, + this.suggestions, required this.placeholder, this.validator, this.maxLength, @@ -24,8 +24,8 @@ class SuggestionFormField extends StatelessWidget { Widget build(BuildContext context) { return Autocomplete( initialValue: TextEditingValue(text: controller.text), - optionsBuilder: (TextEditingValue textEditingValue) async { - return (await suggestions) + optionsBuilder: (TextEditingValue textEditingValue) { + return (suggestions ?? []) .where((ActivitySettingResponseSchema option) { return option.name .toLowerCase()