import 'package:flutter/material.dart'; import 'package:flutter_paytabs_bridge/BaseBillingShippingInfo.dart'; import 'package:flutter_paytabs_bridge/IOSThemeConfiguration.dart'; import 'package:flutter_paytabs_bridge/PaymentSdkConfigurationDetails.dart'; import 'package:flutter_paytabs_bridge/PaymentSdkLocale.dart'; import 'package:flutter_paytabs_bridge/PaymentSdkTokeniseType.dart'; import 'package:flutter_paytabs_bridge/PaymentSdkTransactionType.dart'; import 'package:flutter_paytabs_bridge/flutter_paytabs_bridge.dart'; import 'package:hmg_patient_app_new/core/api_consts.dart'; import 'package:hmg_patient_app_new/core/app_state.dart'; import 'package:hmg_patient_app_new/core/enums.dart'; import 'package:hmg_patient_app_new/core/paytabs_config.dart'; import 'package:hmg_patient_app_new/features/paytabs/models/paytabs_transaction_response_model.dart'; import 'package:hmg_patient_app_new/theme/colors.dart'; class PayTabsViewModel extends ChangeNotifier { late PaymentSdkConfigurationDetails paymentConfiguration; final AppState appState; late PaytabsTransactionResponseModel paytabsTransactionResponseModel; PayTabsViewModel({ required this.appState, }); setPaymentConfiguration(String paymentDescription, num amount) { String cartID = DateTime.now().millisecondsSinceEpoch.toString(); paymentConfiguration = PaymentSdkConfigurationDetails( profileId: PaymentSdkDefaultConfig.profileID, serverKey: PaymentSdkDefaultConfig.serverKey, clientKey: PaymentSdkDefaultConfig.clientKey, transactionType: PaymentSdkTransactionType.SALE, cartId: cartID.substring((cartID.length - 5), cartID.length), cartDescription: paymentDescription, merchantName: PaymentSdkDefaultConfig.defaultMerchantName, locale: appState.isArabic() ? PaymentSdkLocale.AR : PaymentSdkLocale.EN, merchantApplePayIndentifier: ApiConsts.appEnvironmentType == AppEnvironmentTypeEnum.uat ? PaymentSdkDefaultConfig.defaultMerchantAppleBundleIDUAT : PaymentSdkDefaultConfig.defaultMerchantAppleBundleID, screentTitle: paymentDescription, amount: amount.toDouble(), showBillingInfo: false, forceShippingInfo: false, currencyCode: PaymentSdkDefaultConfig.defaultCurrency, merchantCountryCode: PaymentSdkDefaultConfig.defaultMerchantCountryCode, billingDetails: BillingDetails( "${appState.getAuthenticatedUser()!.firstName} ${appState.getAuthenticatedUser()!.lastName}" ?? "HMG Patient", "CustID_${appState.getAuthenticatedUser()!.patientId.toString()}@HMG.com", appState.getAuthenticatedUser()!.mobileNumber ?? "0000000000", "Riyadh", "SA", "Riyadh", "Riyadh", "12626"), shippingDetails: ShippingDetails("${appState.getAuthenticatedUser()!.firstName} ${appState.getAuthenticatedUser()!.lastName}" ?? "HMG Patient", "CustID_${appState.getAuthenticatedUser()!.patientId.toString()}@HMG.com", appState.getAuthenticatedUser()!.mobileNumber ?? "0000000000", "Riyadh", "SA", "Riyadh", "Riyadh", "12626"), alternativePaymentMethods: [], linkBillingNameWithCardHolderName: true, simplifyApplePayValidation: true); paymentConfiguration.iOSThemeConfigurations = IOSThemeConfigurations( // logoImage: "assets/images/png/hmg_logo.png", backgroundColor: "ffffff", backgroundColorDark: "ffffff", secondaryColor: "191919", secondaryColorDark: "191919", primaryColor: "ffffff", primaryColorDark: "ffffff", // primaryFont: "Poppins", titleFontColor: "2E3039", titleFontColorDark: "2E3039", // titleFont: "Poppins", primaryFontColor: "2E3039", primaryFontColorDark: "2E3039", inputFieldBackgroundColor: "ffffff", inputFieldBackgroundColorDark: "ffffff", placeholderColor: "2E3039", placeholderColorDark: "2E3039", buttonColor: "ED1C2B", buttonColorDark: "ED1C2B", // buttonFont: "Poppins", ); paymentConfiguration.tokeniseType = PaymentSdkTokeniseType.MERCHANT_MANDATORY; notifyListeners(); } startCardPayment({Function(PaytabsTransactionResponseModel)? onSuccess, Function(String)? onError}) { FlutterPaytabsBridge.startCardPayment(paymentConfiguration, (event) { final transactionDetails = event["data"] as Map?; if (event["status"] == "success") { // Cast Map to Map final data = Map.from(event["data"] as Map); paytabsTransactionResponseModel = PaytabsTransactionResponseModel.fromJson(data); if (paytabsTransactionResponseModel.isSuccess!) { onSuccess!(paytabsTransactionResponseModel); } else { // Transaction was processed but failed final reason = transactionDetails?["payResponseReturn"] ?? transactionDetails?["responseMessage"] ?? transactionDetails?["message"] ?? "Unknown error"; final responseCode = transactionDetails?["responseCode"] ?? ""; final errorMessage = responseCode.toString().isNotEmpty ? "Transaction failed (Code: $responseCode): $reason" : "Transaction failed: $reason"; onError!(errorMessage); } } else if (event["status"] == "error") { final errorMessage = event["message"] ?? "An error occurred"; debugPrint("Error occurred in transaction: $errorMessage"); debugPrint("Full error event: $event"); onError!(errorMessage); } else if (event["status"] == "event") { final eventMessage = event["message"] ?? "Event occurred"; debugPrint("Event occurred: $eventMessage"); } }); } }