You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
365 lines
16 KiB
Dart
365 lines
16 KiB
Dart
import 'package:flutter/material.dart';
|
|
import 'package:flutter_svg/flutter_svg.dart';
|
|
import 'package:get/get.dart';
|
|
import 'package:pin_code_fields/pin_code_fields.dart';
|
|
import 'package:uco_mobile_poc/app/core/config/server_response.dart';
|
|
import 'package:uco_mobile_poc/app/core/constants/app_assets.dart';
|
|
import 'package:uco_mobile_poc/app/core/constants/translation_keys.dart';
|
|
import 'package:uco_mobile_poc/app/core/extensions/build_context_ext.dart';
|
|
import 'package:uco_mobile_poc/app/core/utils/SessionCache.dart';
|
|
import 'package:uco_mobile_poc/app/core/utils/logs_utils.dart';
|
|
import 'package:uco_mobile_poc/app/custom_widgets/Fields/input_field.dart';
|
|
import 'package:uco_mobile_poc/app/custom_widgets/custom_button.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/DepositAccountResponse.dart';
|
|
import 'package:uco_mobile_poc/app/models/accept_receive_transaction.dart';
|
|
import 'package:uco_mobile_poc/app/res/app_colors.dart';
|
|
import 'package:uco_mobile_poc/app/routes/app_pages.dart';
|
|
|
|
import '../../../core/data/repositories/app_repositories.dart';
|
|
import '../../../models/reverse_transaction_model.dart';
|
|
import '../../../models/u_recived_responce_model.dart';
|
|
import '../../dashboard/controllers/dashboard_screen_controller.dart';
|
|
|
|
class UReceivedController extends GetxController {
|
|
final AppRepositories repository = Get.find<AppRepositories>();
|
|
BuildContext context = Get.context as BuildContext;
|
|
UReceivedResponseData? selectedTransaction;
|
|
RxList<UReceivedResponseData> uReceivedData = RxList.empty();
|
|
String className = "";
|
|
late InputField depositAccountField;
|
|
late InputField referenceCodeField;
|
|
TextEditingController pinPutController = TextEditingController();
|
|
|
|
TextEditingController referenceCodeController = TextEditingController();
|
|
|
|
late InputField userTransactionPinField;
|
|
RxList<DropDown> allDepositAccounts = RxList.empty();
|
|
|
|
Rx<DepositAccount> selectedDepositAccount = DepositAccount.empty().obs;
|
|
|
|
@override
|
|
Future<void> onReady() async {
|
|
super.onReady();
|
|
|
|
Future.delayed(Duration.zero).then((value) {
|
|
selectedDepositAccount.value = allDepositAccounts.first.data as DepositAccount;
|
|
|
|
depositAccountField.setText(allDepositAccounts.first.label);
|
|
|
|
getPendingTransition();
|
|
});
|
|
}
|
|
|
|
@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),
|
|
);
|
|
}
|
|
}
|
|
|
|
void updateSelectedDeposit(DropDown item) {
|
|
selectedDepositAccount.value = item.data as DepositAccount;
|
|
getPendingTransition();
|
|
|
|
dp("Data update", item);
|
|
}
|
|
|
|
Future<void> getPendingTransition() async {
|
|
ServerResponse response = await repository.getPendingTransition(selectedDepositAccount.value.mbmBkmsnumber);
|
|
dp("=========== u received request ", response.toString());
|
|
if (response.isError) {
|
|
Toasty.error(response.errorMsg);
|
|
return;
|
|
}
|
|
|
|
uReceivedData.assignAll(List<UReceivedResponseData>.from(((response.response ?? []) as List<dynamic>).map((x) => UReceivedResponseData.fromMap(x))));
|
|
|
|
transitionUpdate.value++;
|
|
|
|
dp("=========== u received request ", uReceivedData.toString());
|
|
}
|
|
|
|
void transactionPinDialog(BuildContext context, UReceivedController controller) {
|
|
clearController();
|
|
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: [
|
|
const SizedBox(height: 10),
|
|
Text(TranslationKeys.makeTranslation(TranslationKeys.textTransactionPin), style: Theme.of(context).textTheme.titleMedium),
|
|
const SizedBox(height: 20),
|
|
Wrap(
|
|
children: [
|
|
PinCodeTextField(
|
|
autoDisposeControllers: false,
|
|
keyboardType: TextInputType.number,
|
|
controller: controller.pinPutController,
|
|
showCursor: true,
|
|
autoDismissKeyboard: false,
|
|
enablePinAutofill: true,
|
|
length: 6,
|
|
textInputAction: TextInputAction.done,
|
|
hintCharacter: "0",
|
|
appContext: context,
|
|
hintStyle: Theme.of(context).textTheme.bodySmall!.copyWith(fontSize: 35, fontWeight: FontWeight.w600, color: AppColors.colorGrey350),
|
|
mainAxisAlignment: MainAxisAlignment.center,
|
|
cursorColor: Colors.black.withOpacity(0.8),
|
|
obscureText: false,
|
|
animationType: AnimationType.fade,
|
|
pinTheme: PinTheme(
|
|
selectedColor: AppColors.colorGrey350,
|
|
/*Colors.black.withOpacity(0.6),*/
|
|
inactiveColor: AppColors.colorGrey350,
|
|
/*Colors.black.withOpacity(0.6),*/
|
|
activeColor: AppColors.colorGrey350,
|
|
fieldOuterPadding: const EdgeInsets.all(5),
|
|
shape: PinCodeFieldShape.box,
|
|
borderRadius: BorderRadius.circular(5),
|
|
fieldHeight: 50,
|
|
inactiveFillColor: AppColors.white,
|
|
selectedFillColor: AppColors.white,
|
|
fieldWidth: 40,
|
|
activeFillColor: Colors.white,
|
|
),
|
|
animationDuration: const Duration(milliseconds: 100),
|
|
backgroundColor: Colors.transparent,
|
|
enableActiveFill: true,
|
|
onCompleted: (v) {},
|
|
onChanged: (value) {},
|
|
beforeTextPaste: (text) {
|
|
return true;
|
|
},
|
|
),
|
|
],
|
|
),
|
|
const SizedBox(height: 20),
|
|
Text(TranslationKeys.makeTranslation(TranslationKeys.textReferenceCode), style: Theme.of(context).textTheme.titleMedium),
|
|
const SizedBox(height: 20),
|
|
Wrap(
|
|
children: [
|
|
PinCodeTextField(
|
|
autoDisposeControllers: false,
|
|
keyboardType: TextInputType.number,
|
|
controller: controller.referenceCodeController,
|
|
showCursor: true,
|
|
autoDismissKeyboard: false,
|
|
enablePinAutofill: true,
|
|
length: 6,
|
|
hintCharacter: "0",
|
|
appContext: context,
|
|
hintStyle: Theme.of(context).textTheme.bodySmall!.copyWith(
|
|
fontSize: 35,
|
|
fontWeight: FontWeight.w600,
|
|
color: AppColors.colorGrey350,
|
|
),
|
|
mainAxisAlignment: MainAxisAlignment.center,
|
|
cursorColor: Colors.black.withOpacity(0.8),
|
|
obscureText: false,
|
|
animationType: AnimationType.fade,
|
|
textInputAction: TextInputAction.done,
|
|
pinTheme: PinTheme(
|
|
selectedColor: AppColors.colorGrey350,
|
|
/*Colors.black.withOpacity(0.6),*/
|
|
inactiveColor: AppColors.colorGrey350,
|
|
/*Colors.black.withOpacity(0.6),*/
|
|
activeColor: AppColors.colorGrey350,
|
|
fieldOuterPadding: const EdgeInsets.all(5),
|
|
shape: PinCodeFieldShape.box,
|
|
borderRadius: BorderRadius.circular(5),
|
|
fieldHeight: 50,
|
|
inactiveFillColor: AppColors.white,
|
|
selectedFillColor: AppColors.white,
|
|
fieldWidth: 40,
|
|
activeFillColor: Colors.white,
|
|
),
|
|
animationDuration: const Duration(milliseconds: 100),
|
|
backgroundColor: Colors.transparent,
|
|
enableActiveFill: true,
|
|
onCompleted: (v) {},
|
|
onChanged: (value) {},
|
|
beforeTextPaste: (text) {
|
|
return true;
|
|
},
|
|
),
|
|
],
|
|
),
|
|
const SizedBox(height: 20),
|
|
Padding(
|
|
padding: const EdgeInsets.only(left: 80.0, right: 80.0),
|
|
child: CustomButton(
|
|
onPressed: () async {
|
|
if (controller.pinPutController.text.length != 6) {
|
|
Toasty.error("Please input 6 digit transaction pin");
|
|
return;
|
|
}
|
|
if (controller.referenceCodeController.text.length != 6) {
|
|
Toasty.error("Please input 6 digit reference number");
|
|
return;
|
|
}
|
|
|
|
Navigator.of(context, rootNavigator: true).pop();
|
|
sendAcceptTransactionRequest(controller.pinPutController.text, controller.referenceCodeController.text);
|
|
},
|
|
buttonText: TranslationKeys.makeTranslation(TranslationKeys.textContinue),
|
|
buttonPadding: const EdgeInsets.symmetric(vertical: 10, horizontal: 20),
|
|
buttonColor: AppColors.colorButton),
|
|
),
|
|
],
|
|
),
|
|
],
|
|
),
|
|
),
|
|
),
|
|
),
|
|
),
|
|
),
|
|
barrierDismissible: false,
|
|
);
|
|
}
|
|
|
|
Future<void> acceptTransaction(UReceivedResponseData data) async {
|
|
selectedTransaction = data;
|
|
transactionPinDialog(context, this);
|
|
}
|
|
|
|
Future<void> sendAcceptTransactionRequest(String pin, String referanceCode) async {
|
|
AcceptReceiveTransactionModel request = AcceptReceiveTransactionModel(
|
|
porOrgacode: SessionCache.instance.userInfo.porOrgacode,
|
|
cmpCustcode: SessionCache.instance.userInfo.cmpCustcode,
|
|
cmpTranpin: pin,
|
|
cmpRefcode: referanceCode,
|
|
id: selectedTransaction!.id,
|
|
isAccepted: true,
|
|
);
|
|
|
|
ServerResponse response = await repository.acceptReceiveTransaction(request);
|
|
if (response.isError) {
|
|
Toasty.error(response.errorMsg);
|
|
return;
|
|
}
|
|
|
|
showCongratulationDialogOtp(context);
|
|
}
|
|
|
|
/// Reverse transaction method
|
|
Future<void> reverseTransactionRequest(String sgtSentGntrnumber, String sgtSentNodeId) async {
|
|
ReverseTransactionModel request = ReverseTransactionModel(
|
|
porOrgacode: SessionCache.instance.userInfo.porOrgacode,
|
|
nodeId: sgtSentNodeId,
|
|
sgtGntrnumber: sgtSentGntrnumber,
|
|
);
|
|
|
|
ServerResponse response = await repository.reverseTransaction(sgtSentNodeId, sgtSentGntrnumber);
|
|
if (response.isError) {
|
|
Toasty.error(response.errorMsg);
|
|
return;
|
|
}
|
|
showCongratulationDialogOtp(context);
|
|
}
|
|
|
|
void clearController() {
|
|
pinPutController.clear();
|
|
referenceCodeController.clear();
|
|
}
|
|
|
|
void showCongratulationDialogOtp(BuildContext context) {
|
|
Get.dialog(
|
|
responsiveWidget(
|
|
SizedBox(
|
|
width: context.getWidth,
|
|
child: Dialog(
|
|
backgroundColor: Colors.transparent,
|
|
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10)),
|
|
child: Container(
|
|
decoration: BoxDecoration(
|
|
color: Colors.white,
|
|
borderRadius: BorderRadius.all(Radius.circular(10.0)),
|
|
),
|
|
child: Padding(
|
|
padding: const EdgeInsets.all(20),
|
|
child: ListView(
|
|
physics: const NeverScrollableScrollPhysics(),
|
|
shrinkWrap: true,
|
|
children: [
|
|
Container(
|
|
height: 60,
|
|
width: 60,
|
|
padding: const EdgeInsets.only(bottom: 5),
|
|
decoration: const BoxDecoration(
|
|
borderRadius: BorderRadius.all(Radius.circular(50)),
|
|
),
|
|
child: SvgPicture.asset(
|
|
AppAssets.ic_congratulations,
|
|
),
|
|
),
|
|
Padding(
|
|
padding: const EdgeInsets.only(top: 10.0),
|
|
child: Text(
|
|
TranslationKeys.makeTranslation(TranslationKeys.textCongratulations),
|
|
style: Theme.of(context).textTheme.titleSmall,
|
|
textAlign: TextAlign.center,
|
|
),
|
|
),
|
|
const SizedBox(height: 20),
|
|
Text(
|
|
"Your transaction reverse successfully!",
|
|
style: Theme.of(context).textTheme.bodySmall,
|
|
textAlign: TextAlign.center,
|
|
),
|
|
const SizedBox(height: 20),
|
|
Padding(
|
|
padding: const EdgeInsets.only(left: 60.0, right: 60.0),
|
|
child: CustomButton(
|
|
onPressed: () {
|
|
onPressDone(context);
|
|
},
|
|
buttonText: TranslationKeys.makeTranslation(TranslationKeys.textContinue),
|
|
buttonPadding: const EdgeInsets.symmetric(vertical: 5, horizontal: 10),
|
|
buttonColor: AppColors.colorButton,
|
|
sideBorder: const BorderSide(color: AppColors.colorBorderSkipBtn, width: 1.0),
|
|
),
|
|
),
|
|
],
|
|
),
|
|
),
|
|
),
|
|
),
|
|
),
|
|
),
|
|
barrierDismissible: false,
|
|
);
|
|
}
|
|
|
|
void onPressDone(BuildContext context) {
|
|
Navigator.of(context, rootNavigator: true).pop();
|
|
clearController();
|
|
getPendingTransition();
|
|
transitionUpdate.value++;
|
|
}
|
|
}
|