import 'package:flutter/material.dart'; import 'package:dart_core_sdk/proj.pbgrpc.dart'; import 'package:sampleapp/globals.dart'; import 'package:sampleapp/widgets/components/reflex_alert.dart'; import 'package:sampleapp/widgets/components/reflex_button.dart'; import 'package:sampleapp/widgets/components/reflex_circular_progress.dart'; import 'package:sampleapp/widgets/components/reflex_dropdown_button_form_field.dart'; import '../../locator.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; class SelectContext extends StatefulWidget { final void Function(String projectID) onContextSelected; const SelectContext({super.key, required this.onContextSelected}); @override _SelectContextState createState() => _SelectContextState(); } class _SelectContextState extends State { final projectClient = locator.get(); List contexts = []; List projectList = []; Project? selectedProject; bool isLoading = true; @override void initState() { super.initState(); _loadContexts(); } Future _loadContexts() async { projectClient.getMyUIContext(GetMyContextRequest()).then((value) { contexts = value.myContexts; projectList = contexts.first.projects.map((idName) => Project(iD: idName.iD, name: idName.name)).toList(); projectList.sort((a, b) => a.name.compareTo(b.name)); selectedProject = projectList.isNotEmpty ? projectList.first : null; }).whenComplete(() => setState(() { isLoading = false; })); } Widget _buildContextDropdowns() { return ListView(shrinkWrap: true, children: [ ReflexDropdownButtonFormField( label: AppLocalizations.of(context)!.organization, value: contexts.isNotEmpty ? contexts[0].organisation.iD : '', items: contexts.map>((MyContext c) { return DropdownMenuItem( value: c.organisation.iD, child: Text(c.organisation.name), ); }).toList(), // On change, update the project list onChanged: (value) { setState(() { projectList = contexts.firstWhere((element) => element.organisation.iD == value).projects.map((idName) => Project(iD: idName.iD, name: idName.name)).toList(); projectList.sort((a, b) => a.name.compareTo(b.name)); selectedProject = projectList.isNotEmpty ? projectList.first : null; }); }, ), ReflexDropdownButtonFormField( label: AppLocalizations.of(context)!.project, value: projectList.isNotEmpty ? projectList[0].iD : '', items: projectList.map>((Project p) { return DropdownMenuItem( value: p.iD, child: Text(p.name), ); }).toList(), // On change, update the selected project onChanged: (value) { setState(() { selectedProject = projectList.firstWhere((element) => element.iD == value); }); }, ), ]); } bool _isButtonDisabled() { return selectedProject == null; } @override Widget build(BuildContext context) { return Scaffold( body: Padding( padding: const EdgeInsets.all(15.0), child: Column( children: [ !isLoading ? _buildContextDropdowns() : const ReflexCircularProgress(), const SizedBox(height: 20), ReflexAlert( icon: Icons.info_outline_rounded, text: AppLocalizations.of(context)!.selectContext ), const SizedBox(height: 20), Align( alignment: Alignment.centerRight, child: ReflexButton( text: AppLocalizations.of(context)!.start, onPressed: _isButtonDisabled() ? null : () { widget.onContextSelected(selectedProject!.iD); }, )) ], ))); } }