Make objective/topic/mode nullable lists instead of async (#3698)

* Make objective/topic/mode nullable lists instead of async

* Check for mount before setting state

---------

Co-authored-by: ggurdin <46800240+ggurdin@users.noreply.github.com>
pull/2245/head
Kelrap 3 months ago committed by GitHub
parent b1d9b30b29
commit d82efa2ced
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

@ -50,6 +50,10 @@ class ActivityGeneratorState extends State<ActivityGenerator> {
String? filename; String? filename;
List<ActivitySettingResponseSchema>? topicItems;
List<ActivitySettingResponseSchema>? modeItems;
List<ActivitySettingResponseSchema>? objectiveItems;
@override @override
void initState() { void initState() {
super.initState(); super.initState();
@ -60,7 +64,9 @@ class ActivityGeneratorState extends State<ActivityGenerator> {
MatrixState.pangeaController.languageController.userL2?.langCode; MatrixState.pangeaController.languageController.userL2?.langCode;
selectedCefrLevel = LanguageLevelTypeEnum.a1; selectedCefrLevel = LanguageLevelTypeEnum.a1;
selectedNumberOfParticipants = 3; selectedNumberOfParticipants = 3;
_setModeImageURL(); _setMode();
_setTopic();
_setObjective();
} }
@override @override
@ -88,15 +94,6 @@ class ActivityGeneratorState extends State<ActivityGenerator> {
numberOfParticipants: selectedNumberOfParticipants!, numberOfParticipants: selectedNumberOfParticipants!,
); );
Future<List<ActivitySettingResponseSchema>> get topicItems =>
TopicListRepo.get(req);
Future<List<ActivitySettingResponseSchema>> get modeItems =>
ActivityModeListRepo.get(req);
Future<List<ActivitySettingResponseSchema>> get objectiveItems =>
LearningObjectiveListRepo.get(req);
Room? get room => Matrix.of(context).client.getRoomById(widget.roomID); Room? get room => Matrix.of(context).client.getRoomById(widget.roomID);
String? validateNotNull(String? value) { String? validateNotNull(String? value) {
@ -106,31 +103,33 @@ class ActivityGeneratorState extends State<ActivityGenerator> {
return null; return null;
} }
Future<String> _randomTopic() async { String? get _randomTopic => (topicItems?..shuffle())?.first.name;
final topics = await topicItems;
return (topics..shuffle()).first.name;
}
Future<String> _randomObjective() async { String? get _randomObjective => (objectiveItems?..shuffle())?.first.name;
final objectives = await objectiveItems;
return (objectives..shuffle()).first.name;
}
Future<String> _randomMode() async { String? get _randomMode => (modeItems?..shuffle())?.first.name;
final modes = await modeItems;
return (modes..shuffle()).first.name;
}
void randomizeSelections() async { bool get randomizeEnabled =>
final selectedTopic = await _randomTopic(); topicItems != null && objectiveItems != null && modeItems != null;
final selectedObjective = await _randomObjective();
final selectedMode = await _randomMode();
setState(() { void randomizeSelections() {
topicController.text = selectedTopic; final selectedTopic = _randomTopic;
objectiveController.text = selectedObjective; final selectedObjective = _randomObjective;
modeController.text = selectedMode; 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 { void clearSelections() async {
@ -164,15 +163,45 @@ class ActivityGeneratorState extends State<ActivityGenerator> {
setState(() => selectedCefrLevel = value); setState(() => selectedCefrLevel = value);
} }
Future<ActivitySettingResponseSchema?> get _selectedMode async { ActivitySettingResponseSchema? get _selectedMode {
final modes = await modeItems; return modeItems?.firstWhereOrNull(
return modes.firstWhereOrNull(
(element) => element.name.toLowerCase() == planRequest.mode.toLowerCase(), (element) => element.name.toLowerCase() == planRequest.mode.toLowerCase(),
); );
} }
Future<void> _setTopic() async {
final topic = await TopicListRepo.get(req);
if (mounted) {
setState(() {
topicItems = topic;
});
}
}
Future<void> _setMode() async {
final mode = await ActivityModeListRepo.get(req);
if (mounted) {
setState(() {
modeItems = mode;
});
_setModeImageURL();
}
}
Future<void> _setObjective() async {
final objective = await LearningObjectiveListRepo.get(req);
if (mounted) {
setState(() {
objectiveItems = objective;
});
}
}
Future<void> _setModeImageURL() async { Future<void> _setModeImageURL() async {
final mode = await _selectedMode; final mode = _selectedMode;
if (mode == null) return; if (mode == null) return;
final modeName = final modeName =

@ -254,7 +254,9 @@ class ActivityGeneratorView extends StatelessWidget {
child: Padding( child: Padding(
padding: const EdgeInsets.only(left: 8.0), padding: const EdgeInsets.only(left: 8.0),
child: ElevatedButton( child: ElevatedButton(
onPressed: controller.randomizeSelections, onPressed: controller.randomizeEnabled
? controller.randomizeSelections
: null,
child: Row( child: Row(
mainAxisAlignment: MainAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center,
children: [ children: [

@ -3,7 +3,7 @@ import 'package:flutter/material.dart';
import 'package:fluffychat/pangea/activity_generator/list_request_schema.dart'; import 'package:fluffychat/pangea/activity_generator/list_request_schema.dart';
class SuggestionFormField extends StatelessWidget { class SuggestionFormField extends StatelessWidget {
final Future<List<ActivitySettingResponseSchema>> suggestions; final List<ActivitySettingResponseSchema>? suggestions;
final String? Function(String?)? validator; final String? Function(String?)? validator;
final int? maxLength; final int? maxLength;
final String label; final String label;
@ -12,7 +12,7 @@ class SuggestionFormField extends StatelessWidget {
const SuggestionFormField({ const SuggestionFormField({
super.key, super.key,
required this.suggestions, this.suggestions,
required this.placeholder, required this.placeholder,
this.validator, this.validator,
this.maxLength, this.maxLength,
@ -24,8 +24,8 @@ class SuggestionFormField extends StatelessWidget {
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Autocomplete<String>( return Autocomplete<String>(
initialValue: TextEditingValue(text: controller.text), initialValue: TextEditingValue(text: controller.text),
optionsBuilder: (TextEditingValue textEditingValue) async { optionsBuilder: (TextEditingValue textEditingValue) {
return (await suggestions) return (suggestions ?? [])
.where((ActivitySettingResponseSchema option) { .where((ActivitySettingResponseSchema option) {
return option.name return option.name
.toLowerCase() .toLowerCase()

Loading…
Cancel
Save