import 'dart:convert'; import 'package:flutter/material.dart'; import 'package:flutter_contacts/contact.dart'; // import 'package:flutter_contacts/contact.dart'; import 'package:fluttertoast/fluttertoast.dart'; import 'package:get/get.dart'; import 'package:uco_mobile_poc/app/core/config/server_response.dart'; import 'package:uco_mobile_poc/app/core/constants/app_contants.dart'; import 'package:uco_mobile_poc/app/core/constants/translation_keys.dart'; import 'package:uco_mobile_poc/app/core/data/repositories/app_repositories.dart'; import 'package:uco_mobile_poc/app/core/enums/request_constants.dart'; import 'package:uco_mobile_poc/app/core/utils/SessionCache.dart'; import 'package:uco_mobile_poc/app/core/utils/app_utils.dart'; import 'package:uco_mobile_poc/app/core/utils/logs_utils.dart'; import 'package:uco_mobile_poc/app/custom_widgets/Fields/field_validations.dart'; import 'package:uco_mobile_poc/app/custom_widgets/Fields/input_field.dart'; import 'package:uco_mobile_poc/app/custom_widgets/custom_dropdown.dart'; import 'package:uco_mobile_poc/app/custom_widgets/custom_toasty.dart'; import 'package:uco_mobile_poc/app/models/AccountInquiryResponseModel.dart'; import 'package:uco_mobile_poc/app/models/DepositAccountResponse.dart'; import 'package:uco_mobile_poc/app/models/ExchangeRate.dart'; import 'package:uco_mobile_poc/app/models/SendTransactionStep1ResponseModel.dart'; import 'package:uco_mobile_poc/app/models/TransactionPinRequestModel.dart'; import 'package:uco_mobile_poc/app/models/TransactionSubmitRequestModel.dart'; import 'package:uco_mobile_poc/app/modules/qr_setting/controllers/qr_setting_controller.dart'; import 'package:uco_mobile_poc/app/modules/qr_setting/views/qr_scan_screen.dart'; import 'package:uco_mobile_poc/app/res/app_colors.dart'; import 'package:uco_mobile_poc/app/routes/app_pages.dart'; class USendController extends GetxController { TextEditingController pinPutController = TextEditingController(); TextEditingController referenceCodeController = TextEditingController(); final AppRepositories repository = Get.find(); BuildContext context = Get.context as BuildContext; String OPTION_PHONE = "01"; String OPTION_EMAIL = "02"; //drop down RxList allDepositAccounts = RxList.empty(); Rx selectedDepositAccount = DepositAccount.empty().obs; RxList allRecipientDetailOptions = RxList.empty(); Rx selectedRecipientDetailOption = DropDown.empty().obs; RxList allCurrencieList = RxList.empty(); DropDown selectedCurrency = DropDown.empty(); RxString currencySymbol = "".obs; Contact? selectedContact; ExchangeRate? selectedExchangeRate; String receiverAccountNumber = ""; String receiverAccountTitle = ""; // fields late InputField depositAccountField; late InputField selectRecipientDetailField; late InputField selectCurrencyField; late InputField identityPhoneNumberField; late InputField identityEmailField; late InputField recipientCardNameField; late InputField sendingAmountField; late InputField exchangeRateField; late InputField messageField; late InputField userTransactionPinField; late InputField referenceCodeField; @override void onInit() { super.onInit(); for (int i = 0; i < SessionCache.instance.depositAccountList.length; i++) { DepositAccount depositAccount = SessionCache.instance.depositAccountList.elementAt(i); allDepositAccounts.add(DropDown(i.toString(), "${depositAccount.mbmBkmstitle} - ${depositAccount.mbmBkmsnumber}", depositAccount)); } selectedDepositAccount.value = allDepositAccounts.first.data; allRecipientDetailOptions.value = [ DropDown(OPTION_PHONE, TranslationKeys.makeTranslation(TranslationKeys.textPhoneNumber)), DropDown(OPTION_EMAIL, TranslationKeys.makeTranslation(TranslationKeys.textEmail)), ]; for (int i = 0; i < SessionCache.instance.exchangeRateList.length; i++) { ExchangeRate exchangeRate = SessionCache.instance.exchangeRateList.elementAt(i); allCurrencieList.add(DropDown(exchangeRate.pcrCurrcode, exchangeRate.pcrCurrdesc, exchangeRate)); } } @override Future onReady() async { super.onReady(); disposeAllResources(); updateSelectedDeposit(allDepositAccounts.elementAt(0)); Future.delayed(Duration.zero).then((value) { depositAccountField.setText((allDepositAccounts.first.label)); }); } void disposeAllResources() { depositAccountField.clear(); selectRecipientDetailField.clear(); selectCurrencyField.clear(); identityPhoneNumberField.clear(); identityEmailField.clear(); recipientCardNameField.clear(); sendingAmountField.clear(); exchangeRateField.clear(); messageField.clear(); userTransactionPinField.clear(); referenceCodeField.clear(); referenceCodeController.clear(); } void updateSelectedDeposit(DropDown item) { selectedDepositAccount.value = item.data as DepositAccount; } void updateSelectedCurrency(/*DropDown? item*/ AccountInquiryResponseModel model) { print("************************model>> $model"); for (int i = 0; i < SessionCache.instance.exchangeRateList.length; i++) { print("************************elementAt(i).pcrCurrcode>> ${SessionCache.instance.exchangeRateList.elementAt(i).pcrCurrcode}"); if (SessionCache.instance.exchangeRateList.elementAt(i).pcrCurrcode == model.pcrCurrcode) { currencySymbol.value = SessionCache.instance.exchangeRateList.elementAt(i).pcrCurrshort; selectedExchangeRate = SessionCache.instance.exchangeRateList.elementAt(i); exchangeRateField.setText(selectedExchangeRate!.perEratrateact.toString()); break; } } } void updateRecipientDetail(DropDown? item) { selectedRecipientDetailOption.value = item!; } Future selectContact() async { dynamic result = await Get.toNamed(Routes.CONTACTS_SCREEN); if ((result != null && result[AppConstants.SELECTED_CONTACT] != null)) { selectedContact = result[AppConstants.SELECTED_CONTACT]; identityPhoneNumberField.setText(AppUtils.formatPhoneNumber(selectedContact!.phones.first.number) /*"${selectedContact!.displayName} (${AppUtils.formatPhoneNumber(selectedContact!.phones.first.number + ")")}"*/); } } bool validate() { bool isValid = FieldValidation.validateAll([ depositAccountField, selectRecipientDetailField, recipientCardNameField, sendingAmountField, exchangeRateField, userTransactionPinField, referenceCodeField, ]); if (selectedRecipientDetailOption.value.id == OPTION_PHONE) { isValid = FieldValidation.validateAll([identityPhoneNumberField]); } else if (selectedRecipientDetailOption.value.id == OPTION_EMAIL) { isValid = FieldValidation.validateAll([identityEmailField]); } dp("Validate value", isValid); if (pinPutController.text.isEmpty) { return false; } if (referenceCodeController.text.isEmpty) { return false; } return isValid; } Future sendTransaction({navigate = true}) async { if (!validate()) { Toasty.error("Please input and then proceed"); return; } TransactionSubmitRequestModel transactionSubmitRequestModel = TransactionSubmitRequestModel( porOrgacode: RequestConstants.porOrgacode, pctCstycode: RequestConstants.pctCstycode, channelCode: RequestConstants.channelCode, cmpCustcode: SessionCache.instance.userInfo.cmpCustcode, drMbmBkmsnumber: selectedDepositAccount.value.mbmBkmsnumber, drMbmBkmstitle: selectedDepositAccount.value.mbmBkmstitle, drPcrCurrcode: selectedDepositAccount.value.pcrCurrcode, drPcrCurrdesc: selectedDepositAccount.value.pcrCurrdesc, drPcrCurrshort: selectedDepositAccount.value.pcrCurrshort, crMbmBkmsnumber: receiverAccountNumber, crMbmBkmstitle: receiverAccountTitle, crPcrCurrcode: selectedExchangeRate!.pcrCurrcode, crPcrCurrdesc: selectedExchangeRate!.pcrCurrdesc, crPcrCurrshort: selectedExchangeRate!.pcrCurrshort, sgtGntrnarration: "", dmpProdCode: selectedDepositAccount.value.dmpProdcode, transType: "DR", notificationId: "", transMode: "Online", sgtGntramtfc: double.parse(sendingAmountField.getCustomText().isEmpty ? "0.0" : sendingAmountField.getCustomText()), otdTrancomment: messageField.getCustomText(), isOtpRequired: false, cmpRefcode: referenceCodeField.getCustomText(), ); TransactionPinRequestModel transactionPinRequestModel = TransactionPinRequestModel( porOrgacode: RequestConstants.porOrgacode, pctCstycode: RequestConstants.pctCstycode, channelCode: RequestConstants.channelCode, cmpCustcode: SessionCache.instance.userInfo.cmpCustcode, email: SessionCache.instance.userInfo.cmpUserId, pinType: "TRAN", transPincode: userTransactionPinField.getCustomText(), isOtpRequired: false, ); ServerResponse response = await repository.sendTransactionStep1(transactionPinRequestModel); if (response.isError) { Toasty.error(response.errorMsg); return; } SendTransactionStep1ResponseModel step1responseModel = SendTransactionStep1ResponseModel.fromMap(response.response); transactionSubmitRequestModel.notificationId = step1responseModel.notificationId.toString(); if (navigate) { Get.toNamed(Routes.U_SEND_OTP, arguments: { AppConstants.SEND_TRANS_STEP1_DATA: transactionSubmitRequestModel, AppConstants.EXCHANGE_RATE: exchangeRateField.getCustomText(), } ); } else { Fluttertoast.showToast( msg: "OTP successfully send to your email address", ); } } void clearTransaction() { selectRecipientDetailField.clear(); identityPhoneNumberField.clear(); identityEmailField.clear(); recipientCardNameField.clear(); sendingAmountField.clear(); exchangeRateField.clear(); messageField.clear(); userTransactionPinField.clear(); pinPutController.clear(); referenceCodeField.clear(); referenceCodeController.clear(); } Future verifyAccountAgainstIt() async { String valua = selectedRecipientDetailOption.value.id == OPTION_PHONE ? identityPhoneNumberField.getCustomText() : (selectedRecipientDetailOption.value.id == OPTION_EMAIL ? identityEmailField.getCustomText() : ""); bool isValid = true; if (selectedRecipientDetailOption.value.id == OPTION_PHONE) { isValid = FieldValidation.validateAll([identityPhoneNumberField]); } else if (selectedRecipientDetailOption.value.id == OPTION_EMAIL) { isValid = FieldValidation.validateAll([identityEmailField]); } if (!isValid) { Toasty.error("Please input and then proceed"); return; } ServerResponse response = await repository.fetchAccountInquiry(selectedRecipientDetailOption.value.id, valua); if (response.isError) { if (selectedRecipientDetailOption.value.id == OPTION_PHONE) { identityPhoneNumberField.setError(response.errorMsg); } else { identityEmailField.setError(response.errorMsg); } Toasty.error(response.errorMsg); return; } List responseData = response.response ?? []; List accountInquiryList; accountInquiryList = AccountInquiryResponseModel.fromList(responseData); accountsDialog(accountInquiryList); AccountInquiryResponseModel transactionSubmitRequestModel = AccountInquiryResponseModel.fromMap(((response.response ?? {}) as Map).map((key, value) => MapEntry(key.toString(), value))); } void scanQr() async { Get.put(QrSettingController()); var scanResult = await Get.to(() => const QrScanScreen()); var resultJson = jsonDecode(scanResult); var accNumber = resultJson["phoneNumber"]; dp("Phone", accNumber); identityPhoneNumberField.setText(accNumber); verifyAccountAgainstIt(); } /// Accounts Dialogs...........u-send void accountsDialog(List accountInquiryList) { if (accountInquiryList.length == 1) { receiverAccountTitle = accountInquiryList.first.mbmBkmstitle; receiverAccountNumber = accountInquiryList.first.mbmBkmsnumber; recipientCardNameField.setText(receiverAccountTitle); updateSelectedCurrency(accountInquiryList.first); return; } Get.dialog( responsiveWidget( Dialog( backgroundColor: Colors.transparent, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10)), child: Container( decoration: const BoxDecoration( color: Colors.white, borderRadius: BorderRadius.all(Radius.circular(10.0)), ), child: SingleChildScrollView( child: Padding( padding: const EdgeInsets.all(10), child: ListView( physics: const NeverScrollableScrollPhysics(), shrinkWrap: true, children: [ Column( mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center, children: [ Text(TranslationKeys.makeTranslation(TranslationKeys.textSelectAccount), style: Theme.of(context).textTheme.titleMedium), const SizedBox(height: 20), ListView.separated( shrinkWrap: true, itemBuilder: (context, index) { return GestureDetector( onTap: () { receiverAccountTitle = accountInquiryList[index].mbmBkmstitle; receiverAccountNumber = accountInquiryList[index].mbmBkmsnumber; recipientCardNameField.setText(receiverAccountTitle); updateSelectedCurrency(accountInquiryList[index]); Get.back(); }, child: Column(children: [ Container( height: 40, width: double.infinity, decoration: const BoxDecoration( color: AppColors.colorGrey100, borderRadius: BorderRadius.all(Radius.circular(8.0)), ), child: Padding( padding: const EdgeInsets.all(8.0), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text("${accountInquiryList[index].mbmBkmstitle} (${accountInquiryList[index].pcrCurrshort})", style: Theme.of(context).textTheme.titleSmall), Text(accountInquiryList[index].mbmBkmsnumber, style: Theme.of(context).textTheme.titleSmall), ], ), ), ), ]), ); }, separatorBuilder: (BuildContext context, int index) { return const Padding(padding: EdgeInsets.symmetric(vertical: 5)); }, itemCount: accountInquiryList.length), ], ), ], ), ), ), ), ), ), barrierDismissible: false, ); } }