startPayment method

Future<void> startPayment({
  1. required BuildContext context,
  2. required String customerEmail,
  3. required String customerName,
  4. required double amount,
  5. required String publicKey,
  6. required dynamic onSuccess(
    1. String message
    ),
  7. required dynamic onError(
    1. String reason
    ),
  8. required VoidCallback onClose,
  9. required String currency,
  10. String narration = "",
  11. required List<String> channels,
})

Implementation

Future<void> startPayment({
  required BuildContext context,
  required String customerEmail,
  required String customerName,
  required double amount,
  required String publicKey,
  required Function(String message) onSuccess,
  required Function(String reason) onError,
  required VoidCallback onClose,
  required String currency,
  String narration = "",
  required List<String> channels,
}) async {
  final BaseViewModel baseViewModel = Get.find<BaseViewModel>();

  baseViewModel.setError('');

  final args = {
    'context': context,
    'amount': amount,
    'customerEmail': customerEmail,
    'customerName': customerName,
    'narration': narration,
    'currency': currency,
    'publicKey': publicKey,
    'onSuccess': onSuccess,
    'onError': onError,
    'onClose': () {
      onClose.call();
      Navigator.of(context).popUntil((route) => route.isFirst);
    },
    'channels': channels,
  };

  // Runtime check: require Android API 24+ (Android 7.0) when running on Android.
  if (Platform.isAndroid) {
    try {
      final deviceInfo = DeviceInfoPlugin();
      final androidInfo = await deviceInfo.androidInfo;
      final sdkInt = androidInfo.version.sdkInt;
      if (sdkInt < 24) {
        // Report error back to caller and abort start
        onError(
          'This plugin requires Android 7.0 (API 24) or later. Detected SDK: $sdkInt',
        );
        return;
      }
    } catch (e) {
      // If we cannot determine SDK, fail-safe: allow the flow but log.
      debugPrint('Warning: unable to determine Android SDK version: $e');
    }
  }

  if (Get.isRegistered<PaymentArgs>()) {
    Get.delete<PaymentArgs>(force: true);
  }
  Get.put<PaymentArgs>(PaymentArgs.fromMap(args), permanent: true);

  bool isMobileMoney =
      channels.length == 1 && channels.first == 'mobile_money';

  final routeKey =
      isMobileMoney
          ? (currency == 'XOF' ? 'mobileMoneyXOF' : 'mobileMoneyOther')
          : 'other';

  switch (routeKey) {
    case 'mobileMoneyXOF':
      if (context.mounted) {
        Navigator.of(context).push(
          MaterialPageRoute(
            builder:
                (context) => HostNavigator(initialRoute: mobileNetworksRoute),
          ),
        );
      }
      break;
    case 'mobileMoneyOther':
      if (context.mounted) {
        Navigator.of(
          context,
        ).push(MaterialPageRoute(builder: (context) => MobileMoneyUi()));
      }
      break;
    case 'other':
      if (context.mounted) {
        Navigator.of(context).push(
          MaterialPageRoute(
            builder:
                (context) =>
                    HostNavigator(initialRoute: selectPaymentMenthodRoute),
          ),
        );
      }
      break;
  }
}