import 'package:collection/collection.dart'; import 'package:flutter/material.dart'; import 'package:cloud_firestore/cloud_firestore.dart'; import '../components/my_elevated_button.dart'; import '../components/text_bold.dart'; import '../constants.dart'; import '../enumerations.dart'; import '../pages/registration_complete_page.dart'; import '../services/auth/auth_service.dart'; import '../utils/helper_dialogs.dart'; class RisksFormPage extends StatefulWidget { const RisksFormPage( {super.key, required this.isRegProcess, required this.isEditMode}); final bool isRegProcess; final bool isEditMode; @override RisksFormPageState createState() => RisksFormPageState(); } class RisksFormPageState extends State { AvailabilityOption? availability; RiskTolerance? riskPreference; 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 Availability option if (data[Constants.dbFieldUsersAvailability] != null) { availability = AvailabilityOption.values.firstWhereOrNull( (x) => x.toString() == data[Constants.dbFieldUsersAvailability], ); } // Load Risk Tolerance if (data[Constants.dbFieldUsersRiskTolerance] != null) { riskPreference = RiskTolerance.values.firstWhereOrNull((x) => x.toString() == data[Constants.dbFieldUsersRiskTolerance]); } } }); } } Future _saveDataToFirebase() async { try { final userDoc = FirebaseFirestore.instance .collection(Constants.dbCollectionUsers) .doc(_authService.getCurrentUser()!.uid); await userDoc.set( { Constants.dbFieldUsersAvailability: availability.toString(), Constants.dbFieldUsersRiskTolerance: riskPreference?.toString(), }, SetOptions(merge: true), // avoid overwriting existing data ); return true; } catch (e) { _showSnackBar(e.toString()); return false; } } void _showSnackBar(String message) { showErrorSnackBar(context, message); } Future handleSubmit() async { if (availability == null) { _showSnackBar('Please select an availability option.'); return; } if (riskPreference == null) { showErrorSnackBar(context, 'Please select a willingness to take risks.'); 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( // // TODO set following registration page HERE // builder: (context) => const RegistrationCompletePage(), ), ); } else { if (widget.isEditMode == true) { // pass selectedOptions data back to caller Navigator.pop(context, { Constants.dbFieldUsersAvailability: availability, Constants.dbFieldUsersRiskTolerance: riskPreference, }); } 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: 'Availability and commitment'), const Text( 'How much time can you devote to the startup each week?', ), ...AvailabilityOption.values.map((option) { return RadioListTile( title: Text(option.displayName), value: option, groupValue: availability, onChanged: (AvailabilityOption? value) { setState(() { availability = value; }); }, ); }), const SizedBox(height: 40), const TextBold(text: 'Risk tolerance'), const Text('How do you deal with uncertainty and risk?'), ...RiskTolerance.values.map((option) { return RadioListTile( title: Text(option.displayName), value: option, groupValue: riskPreference, onChanged: (RiskTolerance? value) { setState(() { riskPreference = value; }); }, ); }), const SizedBox(height: 20), Center( child: MyElevatedButton( onPressed: handleSubmit, child: Text(widget.isRegProcess ? 'Save and continue' : 'Save'), ), ), ], ), ), ), ); } }