From 7595be806727ed60304acb30c766d3e1776e1fcc Mon Sep 17 00:00:00 2001 From: Hamza-Ayed Date: Mon, 22 Sep 2025 17:28:19 +0300 Subject: [PATCH] 25-09-22/1 --- .vscode/settings.json | 3 + android/app/build.gradle | 6 +- android/app/src/main/AndroidManifest.xml | 10 +- .../reports/problems/problems-report.html | 2 +- android/gradle.properties | 3 +- assets/images/cashMTN.png | Bin 0 -> 54095 bytes assets/images/syriatel.png | Bin 0 -> 6928 bytes lib/constant/links.dart | 4 + lib/controller/auth/login_controller.dart | 12 +- .../auth/token_otp_change_controller.dart | 8 + lib/controller/functions/crud.dart | 22 +- lib/controller/home/deep_link_controller.dart | 63 +++++ .../home/map_passenger_controller.dart | 256 +++++++++--------- lib/controller/local/translations.dart | 2 + .../payment/payment_controller.dart | 156 +++++++++++ lib/main.dart | 5 +- .../my_wallet/passenger_wallet_dialoge.dart | 163 ++++++----- pubspec.lock | 64 +++-- pubspec.yaml | 3 +- 19 files changed, 536 insertions(+), 246 deletions(-) create mode 100644 .vscode/settings.json create mode 100644 assets/images/cashMTN.png create mode 100644 assets/images/syriatel.png create mode 100644 lib/controller/home/deep_link_controller.dart diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..af9a6ad --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "java.configuration.updateBuildConfiguration": "disabled" +} diff --git a/android/app/build.gradle b/android/app/build.gradle index f98c0dc..1671741 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -27,7 +27,7 @@ android { externalNativeBuild { cmake { path "src/main/cpp/CMakeLists.txt" - version "3.31.5" + version "3.22.1" } } @@ -47,8 +47,8 @@ android { // For more information, see: https://flutter.dev/to/review-gradle-config. minSdk = 29 targetSdk = 36 - versionCode = 13 - versionName = '1.0.13' + versionCode = 14 + versionName = '1.0.14' multiDexEnabled = true ndk { abiFilters "armeabi-v7a", "arm64-v8a", "x86", "x86_64" diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index d7cc69f..6f3d903 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -45,14 +45,18 @@ - + - - + + + diff --git a/android/build/reports/problems/problems-report.html b/android/build/reports/problems/problems-report.html index e1e2989..b6e01b6 100644 --- a/android/build/reports/problems/problems-report.html +++ b/android/build/reports/problems/problems-report.html @@ -650,7 +650,7 @@ code + .copy-button { diff --git a/android/gradle.properties b/android/gradle.properties index e6860ca..67660bc 100644 --- a/android/gradle.properties +++ b/android/gradle.properties @@ -5,4 +5,5 @@ android.defaults.buildfeatures.buildconfig=true android.nonTransitiveRClass=true android.nonFinalResIds=true dart.obfuscation=true -android.enableR8.fullMode=true \ No newline at end of file +android.enableR8.fullMode=true +org.gradle.java.home=/Library/Java/JavaVirtualMachines/temurin-17.jdk/Contents/Home diff --git a/assets/images/cashMTN.png b/assets/images/cashMTN.png new file mode 100644 index 0000000000000000000000000000000000000000..bae958b5ef3630ffa666fedf11581439ecec2abc GIT binary patch literal 54095 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 JPDHLkV1m_3k;?!8 literal 0 HcmV?d00001 diff --git a/assets/images/syriatel.png b/assets/images/syriatel.png new file mode 100644 index 0000000000000000000000000000000000000000..2facd271544cdb52113ead0898357e5e6c51dff7 GIT binary patch literal 6928 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 WJ$FGV>7wue0000 const MapPagePassenger()); } else { Get.snackbar('Verification Failed', 'OTP is incorrect or expired'); diff --git a/lib/controller/functions/crud.dart b/lib/controller/functions/crud.dart index 2db9301..3585d7c 100644 --- a/lib/controller/functions/crud.dart +++ b/lib/controller/functions/crud.dart @@ -99,8 +99,8 @@ class CRUD { return jsonData; } else { // Log API logical errors (e.g., "Customer not found") - if (response.body == 'failure') { - return 'failure'; + if (jsonData['status'] == 'failure') { + // return 'failure'; } else { addError( 'API Logic Error: ${jsonData['status']}', @@ -122,6 +122,8 @@ class CRUD { } else if (response.statusCode == 401) { var jsonData = jsonDecode(response.body); if (jsonData['error'] == 'Token expired') { + await Get.put(LoginController()).getJWT(); + // mySnackbarSuccess('please order now'.tr); return 'token_expired'; } else { addError( @@ -161,10 +163,10 @@ class CRUD { Map? payload, }) async { String token = r(box.read(BoxName.jwt)).toString().split(Env.addd)[0]; - if (JwtDecoder.isExpired(token)) { - await Get.put(LoginController()).getJWT(); - token = r(box.read(BoxName.jwt)).toString().split(Env.addd)[0]; - } + // if (JwtDecoder.isExpired(token)) { + // await Get.put(LoginController()).getJWT(); + // token = r(box.read(BoxName.jwt)).toString().split(Env.addd)[0]; + // } final headers = { "Content-Type": "application/x-www-form-urlencoded", @@ -185,10 +187,10 @@ class CRUD { Map? payload, }) async { String token = r(box.read(BoxName.jwt)).toString().split(Env.addd)[0]; - if (JwtDecoder.isExpired(token)) { - await Get.put(LoginController()).getJWT(); - token = r(box.read(BoxName.jwt)).toString().split(Env.addd)[0]; - } + // if (JwtDecoder.isExpired(token)) { + // await Get.put(LoginController()).getJWT(); + // token = r(box.read(BoxName.jwt)).toString().split(Env.addd)[0]; + // } final headers = { "Content-Type": "application/x-www-form-urlencoded", diff --git a/lib/controller/home/deep_link_controller.dart b/lib/controller/home/deep_link_controller.dart new file mode 100644 index 0000000..56c9e2c --- /dev/null +++ b/lib/controller/home/deep_link_controller.dart @@ -0,0 +1,63 @@ +import 'dart:async'; +import 'package:app_links/app_links.dart'; +import 'package:get/get.dart'; +import 'package:google_maps_flutter/google_maps_flutter.dart'; + +class DeepLinkController extends GetxController { + // استخدم AppLinks للتعامل مع الروابط + final _appLinks = AppLinks(); + StreamSubscription? _linkSubscription; + + // متغير لتخزين الإحداثيات القادمة من الرابط + final Rx deepLinkLatLng = Rx(null); + + @override + void onInit() { + super.onInit(); + // ابدأ بالاستماع للروابط عند تشغيل التطبيق + initDeepLinks(); + } + + Future initDeepLinks() async { + // الاستماع إلى الروابط القادمة + _linkSubscription = _appLinks.uriLinkStream.listen((uri) { + print('Received deep link: $uri'); + _handleLink(uri); + }); + + // جلب الرابط الأولي الذي قد يكون فتح التطبيق + final initialUri = await _appLinks.getInitialLink(); + if (initialUri != null) { + print('Received initial deep link: $initialUri'); + _handleLink(initialUri); + } + } + + void _handleLink(Uri uri) { + // تحقق من أن الرابط يتبع النمط المتوقع (مثال: intaleq://route?lat=xx&lng=yy) + if (uri.scheme == 'intaleq' && uri.host == 'route') { + // استخراج خطوط الطول والعرض من الرابط + final latString = uri.queryParameters['lat']; + final lngString = uri.queryParameters['lng']; + + if (latString != null && lngString != null) { + final double? lat = double.tryParse(latString); + final double? lng = double.tryParse(lngString); + + if (lat != null && lng != null) { + // إذا كانت الإحداثيات صالحة، قم بتحديث المتغير + // ستستمع وحدة التحكم في الخريطة لهذا التغيير + deepLinkLatLng.value = LatLng(lat, lng); + print('Parsed LatLng from deep link: ${deepLinkLatLng.value}'); + } + } + } + } + + @override + void onClose() { + // تأكد من إلغاء الاشتراك عند إغلاق وحدة التحكم + _linkSubscription?.cancel(); + super.onClose(); + } +} diff --git a/lib/controller/home/map_passenger_controller.dart b/lib/controller/home/map_passenger_controller.dart index e359ac2..92594bf 100644 --- a/lib/controller/home/map_passenger_controller.dart +++ b/lib/controller/home/map_passenger_controller.dart @@ -6,7 +6,6 @@ import 'dart:math' as math; import 'dart:ui'; import 'dart:convert'; import 'package:device_info_plus/device_info_plus.dart'; -import 'package:flutter/services.dart'; import 'package:http/http.dart' as http; import 'package:Intaleq/constant/univeries_polygon.dart'; @@ -14,7 +13,6 @@ import 'package:Intaleq/controller/firebase/local_notification.dart'; import 'package:Intaleq/controller/functions/encrypt_decrypt.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter_confetti/flutter_confetti.dart'; -import 'package:uni_links/uni_links.dart'; import 'package:vector_math/vector_math.dart' show radians, degrees; import 'package:Intaleq/controller/functions/tts.dart'; @@ -54,14 +52,11 @@ import '../functions/launch.dart'; import '../functions/package_info.dart'; import '../functions/secure_storage.dart'; import '../payment/payment_controller.dart'; +import 'deep_link_controller.dart'; import 'device_tier.dart'; import 'vip_waitting_page.dart'; class MapPassengerController extends GetxController { - // --- START: DEEP LINKING ADDITIONS --- - StreamSubscription? _linkSubscription; - // --- END: DEEP LINKING ADDITIONS --- - bool isLoading = true; TextEditingController placeDestinationController = TextEditingController(); TextEditingController increasFeeFromPassenger = TextEditingController(); @@ -276,6 +271,11 @@ class MapPassengerController extends GetxController { late DateTime newTime = DateTime.now(); int hours = 0; int minutes = 0; + + // --- إضافة جديدة: للوصول إلى وحدة التحكم بالروابط --- + final DeepLinkController _deepLinkController = Get.find(); + // ------------------------------------------------ + void onChangedPassengerCount(int newValue) { selectedPassengerCount = newValue; update(); @@ -286,92 +286,6 @@ class MapPassengerController extends GetxController { update(); } - /// Initializes the deep link listener. - /// It checks for the initial link when the app starts and then listens for subsequent links. - Future _initUniLinks() async { - try { - // Get the initial link that opened the app - final initialLink = await getInitialUri(); - if (initialLink != null) { - handleDeepLink(initialLink); - } - } on PlatformException { - print('Failed to get initial deep link.'); - } on FormatException { - print('Invalid initial deep link format.'); - } - - // Listen for incoming links while the app is running - _linkSubscription = uriLinkStream.listen((Uri? link) { - handleDeepLink(link); - }, onError: (err) { - print('Error listening to deep links: $err'); - }); - } - - /// Parses the incoming deep link and triggers the route initiation. - void handleDeepLink(Uri? link) { - if (link == null) return; - - // Check if the link matches your app's scheme and path - // e.g., intaleq://map?lat=31.9539&lng=35.9106 - if (link.scheme == 'intaleq' && link.host == 'map') { - final latString = link.queryParameters['lat']; - final lngString = link.queryParameters['lng']; - - if (latString != null && lngString != null) { - final double? lat = double.tryParse(latString); - final double? lng = double.tryParse(lngString); - - if (lat != null && lng != null) { - final destination = LatLng(lat, lng); - print('Deep link received. Destination: $destination'); - initiateRouteFromDeepLink(destination); - } else { - print('Failed to parse lat/lng from deep link.'); - } - } - } - } - - /// Sets the destination from the deep link and updates the UI to show the map. - void initiateRouteFromDeepLink(LatLng destination) async { - // Wait for map controller to be ready - if (mapController == null) { - await Future.delayed(const Duration(seconds: 1)); - if (mapController == null) { - print("Map controller is not available to handle deep link."); - return; - } - } - - myDestination = destination; - - // Animate camera to user's current location to show the starting point - await mapController?.animateCamera(CameraUpdate.newLatLng( - LatLng(passengerLocation.latitude, passengerLocation.longitude))); - - // Ensure the main menu is visible to start the booking process - if (isMainBottomMenuMap) { - changeMainBottomMenuMap(); - } - - passengerStartLocationFromMap = true; - isPickerShown = true; - hintTextDestinationPoint = "Destination from external link".tr; - update(); - - // The user can now see the destination and proceed to get the route and price. - Get.snackbar( - "Location Received".tr, - "The destination has been set from the link.".tr, - backgroundColor: AppColor.greenColor, - colorText: Colors.white, - ); - } - - // --- END: DEEP LINKING METHODS --- - void getCurrentLocationFormString() async { currentLocationToFormPlaces = true; currentLocationString = 'Waiting for your location'.tr; @@ -3282,8 +3196,6 @@ class MapPassengerController extends GetxController { print( "--- MapPassengerController: Closing and cleaning up all resources. ---"); - _linkSubscription?.cancel(); - // 1. إلغاء المؤقتات الفردية // Using ?.cancel() is safe even if the timer is null markerReloadingTimer.cancel(); @@ -3616,6 +3528,8 @@ class MapPassengerController extends GetxController { update(); } + /// تحويل نصف قطر بالكيلومتر إلى دلتا درجات عرض + double _haversineKm(double lat1, double lon1, double lat2, double lon2) { const R = 6371.0; // km final dLat = (lat2 - lat1) * math.pi / 180.0; @@ -3629,6 +3543,29 @@ class MapPassengerController extends GetxController { return R * c; } + /// تحويل نصف قطر بالكيلومتر إلى دلتا درجات عرض + double _kmToLatDelta(double km) => km / 111.0; + + /// تحويل نصف قطر بالكيلومتر إلى دلتا درجات طول (تعتمد على خط العرض) + double _kmToLngDelta(double km, double atLat) => + km / (111.320 * math.cos(atLat * math.pi / 180.0)).abs().clamp(1e-6, 1e9); + + /// حساب درجة التطابق النصي (كل كلمة تبدأ بها الاسم = 2 نقاط، يحتويها = 1 نقطة) + double _relevanceScore(String name, String query) { + final n = name.toLowerCase(); + final parts = + query.toLowerCase().split(RegExp(r'\s+')).where((p) => p.length >= 2); + double s = 0.0; + for (final p in parts) { + if (n.startsWith(p)) { + s += 2.0; + } else if (n.contains(p)) { + s += 1.0; + } + } + return s; + } + Future getPlaces() async { final q = placeDestinationController.text.trim(); if (q.isEmpty) { @@ -3640,11 +3577,17 @@ class MapPassengerController extends GetxController { final lat = passengerLocation.latitude; final lng = passengerLocation.longitude; - const range = 2.2; - final latMin = lat - range; - final latMax = lat + range; - final lngMin = lng - range; - final lngMax = lng + range; + // نصف قطر البحث بالكيلومتر (عدّل حسب رغبتك) + const radiusKm = 200.0; + + // حساب الباوند الصحيح (درجات، وليس 2.2 درجة ثابتة) + final latDelta = _kmToLatDelta(radiusKm); + final lngDelta = _kmToLngDelta(radiusKm, lat); + + final latMin = lat - latDelta; + final latMax = lat + latDelta; + final lngMin = lng - lngDelta; + final lngMax = lng + lngDelta; try { final response = await CRUD().post( @@ -3658,43 +3601,59 @@ class MapPassengerController extends GetxController { }, ); - if (response != 'failure') { - final list = (response['message'] as List?) ?? []; - - // احسب المسافة وألصقها بكل عنصر - for (final p in list) { - final plat = double.tryParse(p['latitude']?.toString() ?? '') ?? 0.0; - final plng = double.tryParse(p['longitude']?.toString() ?? '') ?? 0.0; - p['distanceKm'] = _haversineKm(lat, lng, plat, plng); - } - - // رتّب حسب الأقرب - list.sort((a, b) { - final da = (a['distanceKm'] ?? 1e9) as double; - final db = (b['distanceKm'] ?? 1e9) as double; - final cmp = da.compareTo(db); - if (cmp != 0) return cmp; - - // تعادل؟ فضّل من يطابق الاسم - final nameA = - (a['name'] ?? a['name_ar'] ?? a['name_en'] ?? '').toString(); - final nameB = - (b['name'] ?? b['name_ar'] ?? b['name_en'] ?? '').toString(); - final qLower = q.toLowerCase(); - final hitA = nameA.toLowerCase().contains(qLower) ? 0 : 1; - final hitB = nameB.toLowerCase().contains(qLower) ? 0 : 1; - return hitA.compareTo(hitB); - }); - - placesDestination = list; - update(); + // يدعم شكلي استجابة: إما {"...","message":[...]} أو قائمة مباشرة [...] + List list; + if (response is Map && response['message'] is List) { + list = List.from(response['message'] as List); + } else if (response is List) { + list = List.from(response); } else { - print('Server error'); + print('Unexpected response shape'); + return; } + + // جهّز الحقول المحتملة للأسماء + String _bestName(Map p) { + return (p['name'] ?? p['name_ar'] ?? p['name_en'] ?? '').toString(); + } + + // احسب المسافة ودرجة التطابق والنقاط + for (final p in list) { + final plat = double.tryParse(p['latitude']?.toString() ?? '') ?? 0.0; + final plng = double.tryParse(p['longitude']?.toString() ?? '') ?? 0.0; + + final d = _haversineKm(lat, lng, plat, plng); + final rel = _relevanceScore(_bestName(p), q); + + // معادلة ترتيب ذكية: مسافة أقل + تطابق أعلى = نقاط أعلى + // تضيف +1 لضمان عدم وصول الوزن للصفر عند عدم وجود تطابق + final score = (1.0 / (1.0 + d)) * (1.0 + rel); + + p['distanceKm'] = d; + p['relevance'] = rel; + p['score'] = score; + } + + // رتّب حسب score تنازليًا، ثم المسافة تصاعديًا كحسم + list.sort((a, b) { + final sa = (a['score'] ?? 0.0) as double; + final sb = (b['score'] ?? 0.0) as double; + final cmp = sb.compareTo(sa); + if (cmp != 0) return cmp; + final da = (a['distanceKm'] ?? 1e9) as double; + final db = (b['distanceKm'] ?? 1e9) as double; + return da.compareTo(db); + }); + + // خذ أول 10–15 للعرض (اختياري)، أو اعرض الكل + placesDestination = list.take(15).toList(); + Log.print('placesDestination: $placesDestination'); + update(); } catch (e) { - print('Exception: $e'); + print('Exception in getPlaces: $e'); } - } // Future getPlaces() async { + } + // var languageCode; // // تحديد اللغة حسب الإدخال @@ -5804,16 +5763,45 @@ class MapPassengerController extends GetxController { } } + // --- دالة جديدة للاستماع ومعالجة الرابط --- + void _listenForDeepLink() { + // استمع إلى أي تغيير في الإحداثيات القادمة من الرابط + ever(_deepLinkController.deepLinkLatLng, (LatLng? latLng) { + if (latLng != null) { + print('MapPassengerController detected deep link LatLng: $latLng'); + // عندما يتم استلام إحداثيات جديدة، عينها كوجهة + myDestination = latLng; + + // قم بتشغيل المنطق الخاص بك لعرض المسار + // (تأكد من أن `passengerLocation` لديها قيمة أولاً) + if (passengerLocation != null) { + getDirectionMap( + '${passengerLocation.latitude},${passengerLocation.longitude}', + '${myDestination.latitude},${myDestination.longitude}'); + } else { + // يمكنك إظهار رسالة للمستخدم لتمكين الموقع أولاً + print( + 'Cannot process deep link route yet, passenger location is null.'); + } + + // إعادة تعيين القيمة إلى null لمنع التشغيل مرة أخرى عند إعادة بناء الواجهة + _deepLinkController.deepLinkLatLng.value = null; + } + }); + } + @override void onInit() async { super.onInit(); - +// // --- إضافة جديدة: تهيئة وحدة التحكم في الروابط العميقة --- +// Get.put(DeepLinkController(), permanent: true); +// // ---------------------------------------------------- // مرحلة 0: الضروري جداً لعرض الخريطة سريعاً mapAPIKEY = await storage.read(key: BoxName.mapAPIKEY); await initilizeGetStorage(); // إعداد سريع await _initMinimalIcons(); // start/end فقط await addToken(); // لو لازم للمصادقة - await _initUniLinks(); + _listenForDeepLink(); await getLocation(); // لتحديد الكاميرا box.write(BoxName.carType, 'yet'); box.write(BoxName.tipPercentage, '0'); diff --git a/lib/controller/local/translations.dart b/lib/controller/local/translations.dart index edefc8b..408b4cd 100644 --- a/lib/controller/local/translations.dart +++ b/lib/controller/local/translations.dart @@ -179,6 +179,8 @@ class MyTranslation extends Translations { "Contacts Loaded": "تم تحميل جهات الاتصال", "Showing": "يتم عرض", "of": "من", + 'Pay by MTN Wallet': 'الدفع عبر محفظة MTN', + 'Pay by Syriatel Wallet': 'الدفع عبر محفظة سيريتل', "Customer not found": "العميل غير موجود", "Wallet is blocked": "المحفظة محظورة", "Customer phone is not active": "هاتف العميل غير نشط", diff --git a/lib/controller/payment/payment_controller.dart b/lib/controller/payment/payment_controller.dart index aff1439..2050a06 100644 --- a/lib/controller/payment/payment_controller.dart +++ b/lib/controller/payment/payment_controller.dart @@ -819,6 +819,162 @@ class PaymentController extends GetxController { } } + Future payWithSyriaTelWallet( + BuildContext context, String amount, String currency) async { + // Show a loading indicator for better user experience + Get.dialog(const Center(child: CircularProgressIndicator()), + barrierDismissible: false); + + try { + String phone = box.read(BoxName.phoneWallet); + String driverID = box.read(BoxName.driverID).toString(); + String formattedAmount = double.parse(amount).toStringAsFixed(0); + + // --- CHANGE 1: Updated log messages for clarity --- + print("🚀 Starting Syriatel payment process"); + print( + "📦 Payload: driverID: $driverID, amount: $formattedAmount, phone: $phone"); + + // Optional: Biometric authentication + bool isAuthSupported = await LocalAuthentication().isDeviceSupported(); + if (isAuthSupported) { + bool didAuthenticate = await LocalAuthentication().authenticate( + localizedReason: 'استخدم بصمة الإصبع أو الوجه لتأكيد الدفع', + ); + if (!didAuthenticate) { + if (Get.isDialogOpen ?? false) Get.back(); + print("❌ User did not authenticate with biometrics"); + return; + } + } + + // --- CHANGE 2: Updated API link and payload for starting payment --- + // Make sure you have defined `payWithSyriatelStart` in your AppLink class + var responseData = await CRUD().postWalletMtn( + link: AppLink.payWithSyriatelStart, // Use the new Syriatel start link + payload: { + "amount": formattedAmount, + "driverId": driverID, // Key changed from 'passengerId' to 'driverId' + "phone": phone, + "lang": box.read(BoxName.lang) ?? 'ar', + }, + ); + + print("✅ Server response (start_payment.php):"); + print(responseData); + + // Robustly parse the server's JSON response + Map startRes; + if (responseData is Map) { + startRes = responseData; + } else if (responseData is String) { + try { + startRes = json.decode(responseData); + } catch (e) { + throw Exception( + "Failed to parse server response. Response: $responseData"); + } + } else { + throw Exception("Received an unexpected data type from the server."); + } + + if (startRes['status'] != 'success') { + String errorMsg = startRes['message']?.toString() ?? + "Failed to start the payment process. Please try again."; + throw Exception(errorMsg); + } + + // --- CHANGE 3: Extract `transactionID` from the response --- + // The response structure is now simpler. We only need the transaction ID. + final messageData = startRes["message"]; + final transactionID = messageData["transactionID"].toString(); + + print("📄 TransactionID: $transactionID"); + + if (Get.isDialogOpen == true) Get.back(); // Close loading indicator + + // Show the OTP input dialog + String? otp = await showDialog( + context: context, + barrierDismissible: false, + builder: (context) { + String input = ""; + return AlertDialog( + title: const Text("أدخل كود التحقق"), + content: TextField( + keyboardType: TextInputType.number, + decoration: const InputDecoration(hintText: "كود OTP"), + onChanged: (val) => input = val, + ), + actions: [ + TextButton( + child: const Text("تأكيد"), + onPressed: () => Navigator.of(context).pop(input), + ), + TextButton( + child: const Text("إلغاء"), + onPressed: () => Navigator.of(context).pop(), + ), + ], + ); + }, + ); + + if (otp == null || otp.isEmpty) { + print("❌ OTP was not entered."); + return; + } + print("🔐 OTP entered: $otp"); + + Get.dialog(const Center(child: CircularProgressIndicator()), + barrierDismissible: false); + + // --- CHANGE 4: Updated API link and payload for confirming payment --- + // Make sure you have defined `payWithSyriatelConfirm` in your AppLink class + var confirmRes = await CRUD().postWallet( + // Changed from postWalletMtn if they are different + link: + AppLink.payWithSyriatelConfirm, // Use the new Syriatel confirm link + payload: { + "transactionID": transactionID, // Use the transaction ID + "otp": otp, + // The other parameters (phone, guid, etc.) are no longer needed + }, + ); + + if (Get.isDialogOpen ?? false) Get.back(); + + print("✅ Response from confirm_payment.php:"); + Log.print('confirmRes: ${confirmRes}'); + + if (confirmRes != null && confirmRes['status'] == 'success') { + Get.defaultDialog( + title: "✅ نجاح", + content: const Text("تمت عملية الدفع وإضافة الرصيد إلى محفظتك."), + ); + } else { + // --- CHANGE 5: Simplified error message extraction --- + // The new PHP script sends the error directly in the 'message' field. + String errorMsg = + confirmRes?['message']?.toString() ?? "فشل في تأكيد الدفع"; + Get.defaultDialog( + title: "❌ فشل", + content: Text(errorMsg.tr), + ); + } + } catch (e, s) { + // --- CHANGE 6: Updated general error log message --- + print("🔥 Error during Syriatel Wallet payment:"); + print(e); + print(s); + if (Get.isDialogOpen ?? false) Get.back(); + Get.defaultDialog( + title: 'حدث خطأ', + content: Text(e.toString().replaceFirst("Exception: ", "")), + ); + } + } + @override void onInit() { timestamp = now.millisecondsSinceEpoch; diff --git a/lib/main.dart b/lib/main.dart index c5d9880..438d329 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -25,6 +25,7 @@ import 'controller/firebase/firbase_messge.dart'; import 'controller/firebase/local_notification.dart'; import 'controller/functions/encrypt_decrypt.dart'; import 'controller/functions/secure_storage.dart'; +import 'controller/home/deep_link_controller.dart'; import 'controller/local/local_controller.dart'; import 'controller/local/translations.dart'; import 'controller/payment/paymob/paymob_wallet.dart'; @@ -52,7 +53,9 @@ void main() async { WakelockPlus.enable(); await GetStorage.init(); - +// --- إضافة جديدة: تهيئة وحدة التحكم في الروابط العميقة --- + Get.put(DeepLinkController(), permanent: true); + // ---------------------------------------------------- final AppInitializer initializer = AppInitializer(); await initializer.initializeApp(); diff --git a/lib/views/home/my_wallet/passenger_wallet_dialoge.dart b/lib/views/home/my_wallet/passenger_wallet_dialoge.dart index dcd541b..a0a1f78 100644 --- a/lib/views/home/my_wallet/passenger_wallet_dialoge.dart +++ b/lib/views/home/my_wallet/passenger_wallet_dialoge.dart @@ -337,72 +337,111 @@ void showPaymentOptions(BuildContext context, PaymentController controller) { // }, // ), GestureDetector( - onTap: () async { - Get.back(); - // final formKey = GlobalKey(); - // final phoneController = TextEditingController(); + onTap: () async { + Get.back(); + Get.defaultDialog( + barrierDismissible: false, + title: 'Insert Wallet phone number'.tr, + content: Form( + key: controller.formKey, + child: MyTextForm( + controller: controller.walletphoneController, + label: 'Insert Wallet phone number'.tr, + hint: '963941234567', + type: TextInputType.phone)), + confirm: MyElevatedButton( + title: 'OK'.tr, + onPressed: () async { + Get.back(); + if (controller.formKey.currentState!.validate()) { + if (controller.selectedAmount != 0) { + controller.isLoading = true; + controller.update(); + box.write(BoxName.phoneWallet, + (controller.walletphoneController.text)); + Get.back(); + await controller.payWithMTNWallet( + context, + controller.selectedAmount.toString(), + 'SYP', + ); + await controller.getPassengerWallet(); - Get.defaultDialog( - barrierDismissible: false, - title: 'Insert Wallet phone number'.tr, - content: Form( - key: controller.formKey, - child: TextFormField( - controller: controller.walletphoneController, - keyboardType: TextInputType.phone, - decoration: InputDecoration( - labelText: 'Insert Wallet phone number'.tr, - hintText: '963941234567', - border: OutlineInputBorder(), + controller.isLoading = false; + controller.update(); + } else { + Toast.show( + context, + '⚠️ You need to choose an amount!'.tr, + AppColor.redColor, + ); + } + } + })); + }, + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + 'Pay by MTN Wallet'.tr, + style: AppStyle.title, ), - validator: (value) { - if (value == null || value.isEmpty) { - return '⚠️ Please enter phone number'.tr; - } else if (value.length != 12) { - return '⚠️ Phone number must be 12 digits'.tr; - } - return null; - }, - ), + const SizedBox(width: 10), + Image.asset( + 'assets/images/cashMTN.png', + width: 70, + height: 70, + fit: BoxFit.contain, + ), + ], ), - confirm: ElevatedButton( - child: Text('OK'.tr), - onPressed: () async { - if (controller.formKey.currentState!.validate()) { - if (controller.selectedAmount != 0) { - controller.isLoading = true; - controller.update(); - box.write(BoxName.phoneWallet, - (controller.walletphoneController.text)); - Get.back(); - await controller.payWithMTNWallet( - context, - controller.selectedAmount.toString(), - 'SYP', - ); - await controller.getPassengerWallet(); - - controller.isLoading = false; - controller.update(); - } else { - Toast.show( - context, - '⚠️ You need to choose an amount!'.tr, - AppColor.redColor, - ); - } - } - }, + )), + GestureDetector( + onTap: () async { + Get.back(); + Get.defaultDialog( + barrierDismissible: false, + title: 'Insert Wallet phone number'.tr, + content: Form( + key: controller.formKey, + child: MyTextForm( + controller: controller.walletphoneController, + label: 'Insert Wallet phone number'.tr, + hint: '963941234567', + type: TextInputType.phone)), + confirm: MyElevatedButton( + title: 'OK'.tr, + onPressed: () async { + Get.back(); + if (controller.formKey.currentState!.validate()) { + box.write(BoxName.phoneWallet, + controller.walletphoneController.text); + await controller.payWithSyriaTelWallet(context, + controller.selectedAmount.toString(), 'SYP'); + } + })); + }, + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + 'Pay by Syriatel Wallet'.tr, + style: AppStyle.title, + ), + const SizedBox(width: 10), + Image.asset( + 'assets/images/syriatel.png', + width: 70, + height: 70, + fit: BoxFit.fill, + ), + ], ), - ); - }, - child: Image.asset( - 'assets/images/mtn.png', - width: 70, - height: 70, - fit: BoxFit.contain, - ), - ) + )), ], cancelButton: CupertinoActionSheetAction( child: Text('Cancel'.tr), diff --git a/pubspec.lock b/pubspec.lock index 44d64d7..9d3d2cc 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -33,6 +33,38 @@ packages: url: "https://pub.dev" source: hosted version: "4.2.3" + app_links: + dependency: "direct main" + description: + name: app_links + sha256: "5f88447519add627fe1cbcab4fd1da3d4fed15b9baf29f28b22535c95ecee3e8" + url: "https://pub.dev" + source: hosted + version: "6.4.1" + app_links_linux: + dependency: transitive + description: + name: app_links_linux + sha256: f5f7173a78609f3dfd4c2ff2c95bd559ab43c80a87dc6a095921d96c05688c81 + url: "https://pub.dev" + source: hosted + version: "1.0.3" + app_links_platform_interface: + dependency: transitive + description: + name: app_links_platform_interface + sha256: "05f5379577c513b534a29ddea68176a4d4802c46180ee8e2e966257158772a3f" + url: "https://pub.dev" + source: hosted + version: "2.0.2" + app_links_web: + dependency: transitive + description: + name: app_links_web + sha256: af060ed76183f9e2b87510a9480e56a5352b6c249778d07bd2c95fc35632a555 + url: "https://pub.dev" + source: hosted + version: "1.0.4" archive: dependency: transitive description: @@ -992,6 +1024,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.3.2" + gtk: + dependency: transitive + description: + name: gtk + sha256: e8ce9ca4b1df106e4d72dad201d345ea1a036cc12c360f1a7d5a758f78ffa42c + url: "https://pub.dev" + source: hosted + version: "2.1.0" html: dependency: transitive description: @@ -1940,30 +1980,6 @@ packages: url: "https://pub.dev" source: hosted version: "1.4.0" - uni_links: - dependency: "direct main" - description: - name: uni_links - sha256: "051098acfc9e26a9fde03b487bef5d3d228ca8f67693480c6f33fd4fbb8e2b6e" - url: "https://pub.dev" - source: hosted - version: "0.5.1" - uni_links_platform_interface: - dependency: transitive - description: - name: uni_links_platform_interface - sha256: "929cf1a71b59e3b7c2d8a2605a9cf7e0b125b13bc858e55083d88c62722d4507" - url: "https://pub.dev" - source: hosted - version: "1.0.0" - uni_links_web: - dependency: transitive - description: - name: uni_links_web - sha256: "7539db908e25f67de2438e33cc1020b30ab94e66720b5677ba6763b25f6394df" - url: "https://pub.dev" - source: hosted - version: "0.1.0" url_launcher: dependency: "direct main" description: diff --git a/pubspec.yaml b/pubspec.yaml index a3a4edf..026725e 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -59,7 +59,7 @@ dependencies: sign_in_with_apple: ^6.1.0 firebase_auth: ^5.1.2 device_info_plus: ^11.3.0 - uni_links: ^0.5.1 + # uni_links: ^0.5.1 googleapis_auth: ^1.6.0 flutter_confetti: ^0.3.0 # intl_phone_field: ^3.1.0 @@ -77,6 +77,7 @@ dependencies: asn1lib: ^1.6.5 internet_connection_checker: ^3.0.1 connectivity_plus: ^6.1.5 + app_links: ^6.4.1 # home_widget: ^0.7.0+1 dev_dependencies: