import 'package:flutter/material.dart'; import 'package:kmobile/api/services/yojna_service.dart'; import 'package:kmobile/di/injection.dart'; class PMJJBYScreen extends StatefulWidget { final Map? initialData; const PMJJBYScreen({super.key, this.initialData}); @override State createState() => _PMJJBYScreenState(); } class _PMJJBYScreenState extends State { final _formKey = GlobalKey(); // Controllers for all requested fields late final _aadhaarController = TextEditingController(text: widget.initialData?['aadharno']?.toString()); late final _accountNoController = TextEditingController(text: widget.initialData?['accountno']?.toString()); late final _balanceController = TextEditingController(text: widget.initialData?['availablebalance']?.toString()); late final _countryController = TextEditingController(text: widget.initialData?['country']?.toString() ?? 'IN'); late final _dobController = TextEditingController(text: widget.initialData?['customerdob']?.toString()); late final _nameController = TextEditingController(text: widget.initialData?['customername']?.toString()); late final _customerNoController = TextEditingController(text: widget.initialData?['customerno']?.toString()); late final _acctOpeningDateController = TextEditingController(text: widget.initialData?['dateofacctopening']?.toString()); late final _emailController = TextEditingController(text: widget.initialData?['emailid']?.toString()); late final _financialYearController = TextEditingController(text: widget.initialData?['financialyear']?.toString()); late final _genderController = TextEditingController(text: widget.initialData?['gender']?.toString()); late final _ifscController = TextEditingController(text: widget.initialData?['ifsccode']?.toString()); late final _marriedController = TextEditingController(text: widget.initialData?['married']?.toString()); late final _mobileController = TextEditingController(text: widget.initialData?['mobileno']?.toString()); late final _panController = TextEditingController(text: widget.initialData?['pan']?.toString()); late final _pincodeController = TextEditingController(text: widget.initialData?['pincode']?.toString()); late final _policyNumberController = TextEditingController(text: widget.initialData?['policynumber']?.toString()); late final _premiumAmountController = TextEditingController(text: widget.initialData?['premiumamount']?.toString()); late final _stateController = TextEditingController(text: widget.initialData?['state']?.toString()); // Mapping options final Map _healthStatusOptions = { '1': 'Excellent', '2': 'Good', '3': 'Bad', }; final Map _relationshipOptions = { '01': 'Self', '02': 'Wife', '03': 'Father', '04': 'Mother', '05': 'Son', '06': 'Daughter', '07': 'Brother', '08': 'Sister', '09': 'Father-in-law', '10': 'Mother-in-law', '11': 'Grandson', '12': 'Granddaughter', '13': 'Grandfather', '14': 'Grandmother', '15': 'Brother-in-law', '16': 'Sister-in-law', '17': 'Husband', '18': 'Guardian', '99': 'Others', }; final Map _minorOptions = { 'Y': 'Yes', 'N': 'No', }; final Map _ruralOptions = { 'R': 'Rural', 'U': 'Urban', 'S': 'Semi-Urban', 'M': 'Metro', }; final _healthStatusController = TextEditingController(); final _collectionChannelController = TextEditingController(); final _nomineeNameController = TextEditingController(); final _nomineeAddressController = TextEditingController(); final _nomineeRelationshipController = TextEditingController(); final _nomineeMinorController = TextEditingController(); final _ruralCategoryController = TextEditingController(); @override void initState() { super.initState(); // Initialize dropdown controllers if data exists in initialData if (widget.initialData != null) { if (widget.initialData!.containsKey('ruralcategory')) { _ruralCategoryController.text = widget.initialData!['ruralcategory'].toString(); } if (widget.initialData!.containsKey('healthstatus')) { _healthStatusController.text = widget.initialData!['healthstatus'].toString(); } if (widget.initialData!.containsKey('nomineerelationship')) { _nomineeRelationshipController.text = widget.initialData!['nomineerelationship'].toString(); } if (widget.initialData!.containsKey('nomineeminor')) { _nomineeMinorController.text = widget.initialData!['nomineeminor'].toString(); } } } @override void dispose() { _aadhaarController.dispose(); _accountNoController.dispose(); _balanceController.dispose(); _countryController.dispose(); _dobController.dispose(); _nameController.dispose(); _customerNoController.dispose(); _acctOpeningDateController.dispose(); _emailController.dispose(); _financialYearController.dispose(); _genderController.dispose(); _ifscController.dispose(); _marriedController.dispose(); _mobileController.dispose(); _panController.dispose(); _pincodeController.dispose(); _policyNumberController.dispose(); _premiumAmountController.dispose(); _stateController.dispose(); _healthStatusController.dispose(); _collectionChannelController.dispose(); _nomineeNameController.dispose(); _nomineeAddressController.dispose(); _nomineeRelationshipController.dispose(); _nomineeMinorController.dispose(); _ruralCategoryController.dispose(); super.dispose(); } bool _isFetched(String key) { return widget.initialData != null && widget.initialData!.containsKey(key) && widget.initialData![key]?.toString().isNotEmpty == true; } Future _handleRegister() async { // Show loading spinner showDialog( context: context, barrierDismissible: false, builder: (context) => const Center(child: CircularProgressIndicator()), ); try { final response = await getIt().secondvalidationPMJJBY( aadharno: _aadhaarController.text, accountno: _accountNoController.text, availablebalance: _balanceController.text, country: _countryController.text, customerdob: _dobController.text, customername: _nameController.text, customerno: _customerNoController.text, dateofacctopening: _acctOpeningDateController.text, emailid: _emailController.text, financialyear: _financialYearController.text, gender: _genderController.text, ifsccode: _ifscController.text, married: _marriedController.text, mobileno: _mobileController.text, pan: _panController.text, pincode: _pincodeController.text, policynumber: _policyNumberController.text, premiumamount: _premiumAmountController.text, state: _stateController.text, healthstatus: _healthStatusController.text, collectionchannel: _collectionChannelController.text, nomineename: _nomineeNameController.text, nomineeaddress: _nomineeAddressController.text, nomineerelationship: _nomineeRelationshipController.text, nomineeminor: _nomineeMinorController.text, ruralcategory: _ruralCategoryController.text, ); String x = response.toString(); if(x.contains('RECORD ALREADY EXISTS')){ x= "A record already exists for this request. Your submission has been registered previously."; } if (mounted) { // Close loading spinner Navigator.pop(context); // Show response dialog showDialog( context: context, barrierDismissible: false, builder: (context) => AlertDialog( title: const Text('Response'), content: SingleChildScrollView(child: Text(x)), actions: [ TextButton( onPressed: () { Navigator.of(context).popUntil((route) => route.isFirst); }, child: const Text('Close'), ), ], ), ); } } catch (e) { if (mounted) { Navigator.pop(context); // Close loading spinner ScaffoldMessenger.of(context).showSnackBar( SnackBar(content: Text('Error: ${e.toString()}')), ); } } } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: const Text('PMJJBY Registration'), ), body: SingleChildScrollView( padding: const EdgeInsets.all(16.0), child: Form( key: _formKey, child: Column( crossAxisAlignment: CrossAxisAlignment.stretch, children: [ _buildTextField(_nameController, 'Customer Name', readOnly: _isFetched('customername')), _buildTextField(_customerNoController, 'Customer No', readOnly: _isFetched('customerno')), _buildTextField(_accountNoController, 'Account No', keyboardType: TextInputType.number, readOnly: _isFetched('accountno')), _buildTextField(_balanceController, 'Available Balance', keyboardType: TextInputType.number, readOnly: _isFetched('availablebalance')), _buildTextField(_aadhaarController, 'Aadhaar No', keyboardType: TextInputType.number, readOnly: _isFetched('aadharno')), _buildTextField(_dobController, 'Customer DOB (DD/MM/YYYY)', readOnly: _isFetched('customerdob')), _buildTextField(_genderController, 'Gender', readOnly: _isFetched('gender')), _buildTextField(_marriedController, 'Married (Yes/No)', readOnly: _isFetched('married')), _buildTextField(_mobileController, 'Mobile No', keyboardType: TextInputType.phone, readOnly: _isFetched('mobileno')), _buildTextField(_emailController, 'Email ID', keyboardType: TextInputType.emailAddress, readOnly: _isFetched('emailid')), _buildTextField(_panController, 'PAN', readOnly: _isFetched('pan')), _buildTextField(_ifscController, 'IFSC Code', readOnly: _isFetched('ifsccode')), _buildTextField(_acctOpeningDateController, 'Date of Acct Opening', readOnly: _isFetched('dateofacctopening')), _buildTextField(_pincodeController, 'Pincode', keyboardType: TextInputType.number, readOnly: _isFetched('pincode')), _buildTextField(_stateController, 'State', readOnly: _isFetched('state')), _buildTextField(_countryController, 'Country', readOnly: _isFetched('country')), _buildDropdownField(_ruralCategoryController, 'Rural Category', _ruralOptions, readOnly: _isFetched('ruralcategory')), const Divider(height: 32), const Text('Policy Details', style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold)), const SizedBox(height: 16), _buildTextField(_policyNumberController, 'Policy Number', readOnly: _isFetched('policynumber')), _buildTextField(_premiumAmountController, 'Premium Amount', keyboardType: TextInputType.number, readOnly: _isFetched('premiumamount')), _buildTextField(_financialYearController, 'Financial Year', readOnly: _isFetched('financialyear')), _buildDropdownField(_healthStatusController, 'Health Status', _healthStatusOptions), _buildTextField(_collectionChannelController, 'Collection Channel'), const Divider(height: 32), const Text('Nominee Details', style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold)), const SizedBox(height: 16), _buildTextField(_nomineeNameController, 'Nominee Name'), _buildTextField(_nomineeAddressController, 'Nominee Address'), _buildDropdownField(_nomineeRelationshipController, 'Nominee Relationship', _relationshipOptions, readOnly: _isFetched('nomineerelationship')), _buildDropdownField(_nomineeMinorController, 'Nominee Minor', _minorOptions, readOnly: _isFetched('nomineeminor')), const SizedBox(height: 24), ElevatedButton( onPressed: _handleRegister, style: ElevatedButton.styleFrom( backgroundColor: Theme.of(context).colorScheme.primary, foregroundColor: Colors.white, padding: const EdgeInsets.symmetric(vertical: 16), shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(8), ), ), child: const Text( 'Register', style: TextStyle(fontSize: 16, fontWeight: FontWeight.bold), ), ), const SizedBox(height: 32), ], ), ), ), ); } Widget _buildDropdownField( TextEditingController controller, String label, Map options, {bool readOnly = false}) { // Determine current value String? currentValue = options.containsKey(controller.text) ? controller.text : null; return Padding( padding: const EdgeInsets.only(bottom: 16.0), child: DropdownButtonFormField( value: currentValue, onChanged: readOnly ? null : (newValue) { setState(() { controller.text = newValue ?? ''; }); }, decoration: InputDecoration( labelText: label, border: const OutlineInputBorder(), contentPadding: const EdgeInsets.symmetric(vertical: 16, horizontal: 12), ), items: options.entries.map((entry) { return DropdownMenuItem( value: entry.key, child: Text("${entry.key} - ${entry.value}"), ); }).toList(), ), ); } Widget _buildTextField(TextEditingController controller, String label, {TextInputType keyboardType = TextInputType.text, bool readOnly = false}) { return Padding( padding: const EdgeInsets.only(bottom: 16.0), child: TextFormField( controller: controller, readOnly: readOnly, decoration: InputDecoration( labelText: label, border: const OutlineInputBorder(), contentPadding: const EdgeInsets.symmetric(vertical: 16, horizontal: 12), ), keyboardType: keyboardType, ), ); } }