import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:collection/collection.dart'; import 'package:flutter/material.dart'; import '../components/my_elevated_button.dart'; import '../components/text_bold.dart'; import '../constants.dart'; import '../enumerations.dart'; import '../forms/risks_form.dart'; import '../services/auth/auth_service.dart'; import '../utils/helper_dialogs.dart'; class UserVisionPage extends StatefulWidget { const UserVisionPage( {super.key, required this.isRegProcess, required this.isEditMode}); final bool isRegProcess; final bool isEditMode; @override UserVisionPageState createState() => UserVisionPageState(); } class UserVisionPageState extends State { Map selectedVisionOptions = { VisionOption.marketLeader: false, VisionOption.sustainableBusiness: false, VisionOption.innovativeProduct: false, VisionOption.exitStrategy: false, }; CommunicationPreference? communicationPreference; final AuthService _authService = AuthService(); @override void initState() { super.initState(); _loadDataFromFirebase(); } Future _loadDataFromFirebase() async { final userDoc = FirebaseFirestore.instance .collection(Constants.dbCollectionUsers) .doc(_authService.getCurrentUser()!.uid); final snapshot = await userDoc.get(); if (snapshot.exists) { final data = snapshot.data(); setState(() { if (data != null) { // Load Communication Preference if (data[Constants.dbFieldUsersCommunication] != null) { communicationPreference = CommunicationPreference.values .firstWhereOrNull((x) => x.toString() == data[Constants.dbFieldUsersCommunication]); } // Load Vision options if (data[Constants.dbFieldUsersVisions] != null) { for (var option in VisionOption.values) { selectedVisionOptions[option] = data[Constants.dbFieldUsersVisions] .contains(option.toString()); } } } }); } } Future _saveDataToFirebase() async { try { final userDoc = FirebaseFirestore.instance .collection(Constants.dbCollectionUsers) .doc(_authService.getCurrentUser()!.uid); await userDoc.set( { Constants.dbFieldUsersCommunication: communicationPreference?.toString(), Constants.dbFieldUsersVisions: selectedVisionOptions.entries .where((entry) => entry.value) .map((entry) => entry.key.toString()) .toList(), }, SetOptions(merge: true), // avoid overwriting existing data ); return true; } catch (e) { _showSnackBar(e.toString()); return false; } } void _showSnackBar(String message) { showErrorSnackBar(context, message); } bool isVisionSelected() { return selectedVisionOptions.containsValue(true); } Future handleSubmit() async { if (communicationPreference == null) { showErrorSnackBar(context, 'Please select a communication preference.'); return; } if (!isVisionSelected()) { _showSnackBar('Please select at least one long-term vision.'); return; } // Handle the form submission logic here bool success = await _saveDataToFirebase(); if (success) { _navigate(); } else { _showSnackBar('Failed to save data.'); } } void _navigate() { if (widget.isRegProcess) { Navigator.push( context, MaterialPageRoute( // // set following registration page HERE // this Page (UserVisionPage) is optional as of 22.06.24 // and therefore not called anymore during RegProcess // // builder: (context) => RisksFormPage( isRegProcess: widget.isRegProcess, isEditMode: false, ), ), ); } else { if (widget.isEditMode == true) { // pass selectedOptions data back to caller Navigator.pop(context, { Constants.dbFieldUsersCommunication: communicationPreference, Constants.dbFieldUsersVisions: selectedVisionOptions.entries .where((entry) => entry.value) .map((entry) => entry.key) .toList(), }); } else { Navigator.pop(context); } } } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: const Text('Personal preferences'), actions: [ if (widget.isEditMode && !widget.isRegProcess) IconButton( onPressed: handleSubmit, icon: const Icon(Icons.save), ) ], ), body: Padding( padding: const EdgeInsets.all(16.0), child: SingleChildScrollView( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ const TextBold(text: 'Communication preference'), const Text('How do you prefer to communicate in a team?'), ...CommunicationPreference.values.map((option) { return RadioListTile( title: Text(option.displayName), value: option, groupValue: communicationPreference, onChanged: (CommunicationPreference? value) { setState(() { communicationPreference = value; }); }, ); }), const SizedBox(height: 40), const TextBold(text: 'Vision and goals'), const Text('What is your long-term vision for a startup?'), ...VisionOption.values.map((option) { return CheckboxListTile( title: Text(option.displayName), value: selectedVisionOptions[option], controlAffinity: ListTileControlAffinity.platform, onChanged: (bool? value) { if (value != null) { setState(() { selectedVisionOptions[option] = value; }); } }, ); }), const SizedBox(height: 20), Center( child: MyElevatedButton( onPressed: handleSubmit, child: Text(widget.isRegProcess ? 'Save and continue' : 'Save'), ), ), ], ), ), ), ); } }