From b1b8efdd7d41425efffe18d3b5a2184a3712d7f5 Mon Sep 17 00:00:00 2001 From: Hamza-Ayed Date: Tue, 18 Nov 2025 10:38:11 +0300 Subject: [PATCH] 25-11-18/1 --- android/app/build.gradle | 6 +- lib/constant/links.dart | 3 +- .../auth/captin/invit_controller.dart | 10 +- .../auth/captin/login_captin_controller.dart | 6 +- .../auth/captin/phone_helper_controller.dart | 6 +- .../functions/location_controller.dart | 2 + lib/controller/functions/package_info.dart | 2 +- .../home/captin/duration_controller .dart | 2 +- .../home/captin/home_captain_controller.dart | 60 ++++++---- .../home/captin/map_driver_controller.dart | 113 +++++++++--------- .../home/navigation/navigation_view.dart | 2 +- lib/controller/local/translations.dart | 10 ++ lib/views/auth/captin/otp_page.dart | 14 ++- .../home/Captin/home_captain/home_captin.dart | 101 +++++++++++++--- .../widget/left_menu_map_captain.dart | 2 +- .../passenger_info_window.dart | 9 +- .../orderCaptin/order_request_page.dart | 1 + .../orderCaptin/order_speed_request.dart | 60 +++++----- lib/views/home/my_wallet/points_captain.dart | 84 ++++++------- 19 files changed, 294 insertions(+), 199 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index 471c5cb..7f19805 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -42,10 +42,10 @@ android { // Merged the two defaultConfig sections into one. This is the correct way. defaultConfig { applicationId = "com.intaleq_driver" - minSdk = 29 + minSdk = 23 targetSdk = 36 - versionCode = 29 - versionName = '1.0.29' // I've used the higher version name + versionCode = 36 + versionName = '1.0.36' // I've used the higher version name multiDexEnabled = true ndk { diff --git a/lib/constant/links.dart b/lib/constant/links.dart index 4fdeb25..85ed619 100755 --- a/lib/constant/links.dart +++ b/lib/constant/links.dart @@ -76,7 +76,8 @@ class AppLink { static String updatePassengersWallet = "$wallet/update.php"; static String getWalletByDriver = "$walletDriver/getWalletByDriver.php"; - static String driverStatistic = "$walletDriver/driverStatistic.php"; + static String driverStatistic = + "$endPoint/ride/driverWallet/driverStatistic.php"; static String getDriverDetails = "$seferCairoServer/ride/driverWallet/getDriverDetails.php"; static String getDriverWeekPaymentMove = diff --git a/lib/controller/auth/captin/invit_controller.dart b/lib/controller/auth/captin/invit_controller.dart index a904a0a..ab16045 100755 --- a/lib/controller/auth/captin/invit_controller.dart +++ b/lib/controller/auth/captin/invit_controller.dart @@ -316,14 +316,12 @@ Download the Intaleq app now and enjoy your ride! /// Formats a phone number to the standard Syrian international format (+963...). String _formatSyrianPhoneNumber(String input) { String digitsOnly = input.replaceAll(RegExp(r'\D'), ''); - if (digitsOnly.startsWith('963')) { - return '+$digitsOnly'; - } + if (digitsOnly.startsWith('09') && digitsOnly.length == 10) { - return '+963${digitsOnly.substring(1)}'; + return '963${digitsOnly.substring(1)}'; } if (digitsOnly.length == 9 && digitsOnly.startsWith('9')) { - return '+963$digitsOnly'; + return '963$digitsOnly'; } return input; // Fallback for unrecognized formats } @@ -386,7 +384,7 @@ Download the Intaleq app now and enjoy your ride! }); if (response != 'failure') { - var d = jsonDecode(response); + var d = (response); mySnackbarSuccess('Invite sent successfully'.tr); String message = '${'*Intaleq APP CODE*'.tr}\n\n' '${"Use this code in registration".tr}\n\n' diff --git a/lib/controller/auth/captin/login_captin_controller.dart b/lib/controller/auth/captin/login_captin_controller.dart index c93fa0e..3d65d9f 100755 --- a/lib/controller/auth/captin/login_captin_controller.dart +++ b/lib/controller/auth/captin/login_captin_controller.dart @@ -150,7 +150,7 @@ class LoginDriverController extends GetxController { // Log.print('response.request: ${response1.request}'); // Log.print('response.body: ${response1.body}'); // print(payload); - Log.print('payment["jwt"]: ${jsonDecode(response1.body)['jwt']}'); + // Log.print('payment["jwt"]: ${jsonDecode(response1.body)['jwt']}'); await box.write(BoxName.hmac, jsonDecode(response1.body)['hmac']); return jsonDecode(response1.body)['jwt'].toString(); } @@ -199,7 +199,7 @@ class LoginDriverController extends GetxController { 'password': box.read(BoxName.emailDriver), 'aud': '${AK.allowed}$dev', }; - print(payload); + // print(payload); var response1 = await http.post( Uri.parse(AppLink.loginJwtDriver), body: payload, @@ -263,7 +263,7 @@ class LoginDriverController extends GetxController { // 'email': email ?? 'yet', 'id': driverID, }); - Log.print('res: ${res}'); + // Log.print('res: ${res}'); if (res == 'failure') { await isPhoneVerified(); isloading = false; // <--- أضفت هذا أيضاً diff --git a/lib/controller/auth/captin/phone_helper_controller.dart b/lib/controller/auth/captin/phone_helper_controller.dart index 0942189..357fff5 100644 --- a/lib/controller/auth/captin/phone_helper_controller.dart +++ b/lib/controller/auth/captin/phone_helper_controller.dart @@ -47,11 +47,13 @@ class PhoneAuthHelper { } /// Verifies the OTP and logs the user in. - static Future verifyOtp(String phoneNumber, String otp) async { + static Future verifyOtp(String phoneNumber) async { try { final response = await CRUD().post( link: _verifyOtpUrl, - payload: {'phone_number': phoneNumber, 'otp': otp}, + payload: { + 'phone_number': phoneNumber, + }, ); if (response != 'failure') { diff --git a/lib/controller/functions/location_controller.dart b/lib/controller/functions/location_controller.dart index dfa2b5c..c16a616 100755 --- a/lib/controller/functions/location_controller.dart +++ b/lib/controller/functions/location_controller.dart @@ -386,6 +386,7 @@ class LocationController extends GetxController { final String driverId = (box.read(BoxName.driverID) ?? '').toString().trim(); if (driverId.isEmpty) return; // لا ترسل بدون DriverID + final String deviceTimestamp = DateTime.now().toIso8601String(); // ✅ كل شيء Strings فقط final Map payload = { @@ -398,6 +399,7 @@ class LocationController extends GetxController { 'distance': safeDistKm.toStringAsFixed(2), 'status': driverStatus, 'carType': (box.read(BoxName.carType) ?? 'default').toString(), + 'device_timestamp': deviceTimestamp, }; try { diff --git a/lib/controller/functions/package_info.dart b/lib/controller/functions/package_info.dart index a09c091..6c313da 100755 --- a/lib/controller/functions/package_info.dart +++ b/lib/controller/functions/package_info.dart @@ -199,7 +199,7 @@ class DeviceHelper { // Generate and return the encrypted fingerprint final String fingerprint = '${deviceId}_${deviceModel}_$osVersion'; - Log.print('fingerprint: ${fingerprint}'); + // Log.print('fingerprint: ${fingerprint}'); // print(EncryptionHelper.instance.encryptData(fingerprint)); return (fingerprint); } catch (e) { diff --git a/lib/controller/home/captin/duration_controller .dart b/lib/controller/home/captin/duration_controller .dart index 3945a41..2807572 100755 --- a/lib/controller/home/captin/duration_controller .dart +++ b/lib/controller/home/captin/duration_controller .dart @@ -35,7 +35,7 @@ class DurationController extends GetxController { getStaticDriver() async { isLoading = true; update(); - var res = await CRUD().get( + var res = await CRUD().getWallet( link: AppLink.driverStatistic, payload: {'driverID': box.read(BoxName.driverID)}); if (res == 'failure') { diff --git a/lib/controller/home/captin/home_captain_controller.dart b/lib/controller/home/captin/home_captain_controller.dart index 389f4a5..89dff0b 100755 --- a/lib/controller/home/captin/home_captain_controller.dart +++ b/lib/controller/home/captin/home_captain_controller.dart @@ -3,7 +3,11 @@ import 'dart:convert'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:get/get.dart'; +// import 'package:google_maps_flutter/google_maps_flutter.dart'; +// import 'package:flutter_map/flutter_map.dart'; import 'package:google_maps_flutter/google_maps_flutter.dart'; +// import 'package:latlong2/latlong.dart' +// as latlng; // هذا مهم جداً للتعامل مع إحداثيات OSM import 'package:sefer_driver/constant/box_name.dart'; import 'package:sefer_driver/controller/home/captin/map_driver_controller.dart'; import 'dart:async'; @@ -54,7 +58,9 @@ class HomeCaptainController extends GetxController { bool mapTrafficON = false; double widthMapTypeAndTraffic = 50; // Inject the LocationController class - final locationController = Get.put(LocationController()); + // final locationController = Get.put(LocationController()); + // الكود الصحيح + final locationController = Get.find(); // final locationBackController = Get.put(LocationBackgroundController()); String formatDuration(Duration duration) { String twoDigits(int n) => n.toString().padLeft(2, "0"); @@ -181,31 +187,24 @@ class HomeCaptainController extends GetxController { } // late GoogleMapController mapHomeCaptainController; - // void onMapCreated(GoogleMapController controller) { - // mapHomeCaptainController = controller; - // controller.getVisibleRegion(); - // // Animate camera to user location (optional) - // controller.animateCamera( - // CameraUpdate.newLatLng(Get.find().myLocation), - // ); - // } - GoogleMapController? mapHomeCaptainController; // Nullable controller - + GoogleMapController? mapHomeCaptainController; void onMapCreated(GoogleMapController controller) { mapHomeCaptainController = controller; - - // Optional: Check if the controller is still null (just for safety) - if (mapHomeCaptainController != null) { - // Get the visible region - controller.getVisibleRegion(); - - // Animate camera to user location (optional) - controller.animateCamera( - CameraUpdate.newLatLng(Get.find().myLocation), - ); - } else {} + controller.getVisibleRegion(); + // Animate camera to user location (optional) + controller.animateCamera( + CameraUpdate.newLatLng(Get.find().myLocation), + ); } + // قم بإنشائه مباشرة + // final MapController mapController = MapController(); + // bool isMapReady = false; + // void onMapReady() { + // isMapReady = true; + // print("Map is ready to be moved!"); + // } + void savePeriod(Duration period) { final periods = box.read>(BoxName.periods) ?? []; periods.add(period.inSeconds); @@ -279,10 +278,25 @@ class HomeCaptainController extends GetxController { getAllPayment(); startPeriodicExecution(); getCaptainWalletFromBuyPoints(); - onMapCreated(mapHomeCaptainController!); + // onMapCreated(mapHomeCaptainController!); // totalPoints = Get.find().totalPoints.toString(); getRefusedOrderByCaptain(); box.write(BoxName.statusDriverLocation, 'off'); + locationController.addListener(() { + // فقط إذا كان السائق "متصل" والخريطة جاهزة + if (isActive && mapHomeCaptainController != null) { + mapHomeCaptainController!.animateCamera( + CameraUpdate.newCameraPosition( + CameraPosition( + target: locationController.myLocation, // الموقع الجديد + zoom: 17.5, + tilt: 50.0, + bearing: locationController.heading, // اتجاه السيارة + ), + ), + ); + } + }); // LocationController().getLocation(); super.onInit(); } diff --git a/lib/controller/home/captin/map_driver_controller.dart b/lib/controller/home/captin/map_driver_controller.dart index 47b37c2..85c4fc5 100755 --- a/lib/controller/home/captin/map_driver_controller.dart +++ b/lib/controller/home/captin/map_driver_controller.dart @@ -29,7 +29,6 @@ import '../../../views/home/Captin/home_captain/home_captin.dart'; import '../../firebase/firbase_messge.dart'; import '../../firebase/notification_service.dart'; import '../../functions/crud.dart'; -import '../../functions/encrypt_decrypt.dart'; import '../../functions/location_controller.dart'; import '../../functions/tts.dart'; @@ -210,12 +209,16 @@ class MapDriverController extends GetxController { tone: 'cancel', driverList: [], category: "Cancel Trip from driver", ); - await CRUD().post( - link: "${AppLink.seferCairoServer}/ride/rides/update.php", - payload: { - "id": (rideId).toString(), // Convert to String - "status": 'CancelFromDriverAfterApply' - }); + await CRUD() + .post(link: "${AppLink.server}/ride/rides/update.php", payload: { + "id": (rideId).toString(), // Convert to String + "status": 'CancelFromDriverAfterApply' + }); + await CRUD() + .post(link: "${AppLink.rideServer}/rides/update.php", payload: { + "id": (rideId).toString(), // Convert to String + "status": 'CancelFromDriverAfterApply' + }); CRUD().postFromDialogue( link: '${AppLink.seferCairoServer}/driver_order/add.php', payload: { @@ -226,37 +229,13 @@ class MapDriverController extends GetxController { }); await CRUD().post( link: - "${AppLink.seferCairoServer}/ride/cancelRide/addCancelTripFromDriverAfterApplied.php", + "${AppLink.server}/ride/cancelRide/addCancelTripFromDriverAfterApplied.php", payload: { "order_id": (rideId).toString(), "driver_id": box.read(BoxName.driverID).toString(), "status": 'reject After Applied', "notes": (cancelTripCotroller.text).toString() }); - if (AppLink.endPoint != AppLink.seferCairoServer) { - CRUD() - .post(link: "${AppLink.endPoint}/ride/rides/update.php", payload: { - "id": (rideId).toString(), // Convert to String - "status": 'CancelFromDriverAfterApply' - }); - CRUD().postFromDialogue( - link: '${AppLink.endPoint}/driver_order/add.php', - payload: { - 'driver_id': box.read(BoxName.driverID).toString(), - // box.read(BoxName.driverID).toString(), - 'order_id': (rideId).toString(), - 'status': 'CancelFromDriverAfterApply' - }); - CRUD().post( - link: - "${AppLink.endPoint}/ride/cancelRide/addCancelTripFromDriverAfterApplied.php", - payload: { - "order_id": (rideId).toString(), - "driver_id": box.read(BoxName.driverID).toString(), - "status": 'reject After Applied', - "notes": (cancelTripCotroller.text).toString() - }); - } sql.insertData({ 'order_id': (rideId), @@ -331,13 +310,17 @@ class MapDriverController extends GetxController { box.write(BoxName.rideStatus, 'Applied'); Log.print('rideStatus from map 304 : ${box.read(BoxName.rideStatus)}'); update(); - await CRUD().post( - link: "${AppLink.seferCairoServer}/ride/rides/update.php", - payload: { - 'id': (rideId), - 'driverGoToPassengerTime': DateTime.now().toString(), - 'status': 'Applied' - }); + await CRUD() + .post(link: "${AppLink.server}/ride/rides/update.php", payload: { + 'id': (rideId), + 'driverGoToPassengerTime': DateTime.now().toString(), + 'status': 'Applied' + }); + CRUD().post(link: "${AppLink.rideServer}/ride/rides/update.php", payload: { + 'id': (rideId), + 'driverGoToPassengerTime': DateTime.now().toString(), + 'status': 'Applied' + }); NotificationService.sendNotification( target: tokenPassenger.toString(), @@ -378,12 +361,37 @@ class MapDriverController extends GetxController { var res = await CRUD().post(link: AppLink.getDriverScam, payload: { 'driverID': box.read(BoxName.driverID), }); + if (res == 'failure') { box.write(BoxName.statusDriverLocation, 'off'); return '0'; } - var d = jsonDecode(res); - return d['message'][0]['count']; + var d = (res); + Log.print('d: ${d}'); + + // 1. Check if the response status is 'failure' (API level check) + if (d['status'] == 'failure') { + // If the API status is failure, the message is a String (e.g., 'No ride scam record found') + // and there's no 'count' array to read. + return '0'; + } + + // 2. Safely access the List/Map structure for 'count' + // This assumes a successful response looks like: + // {'status': 'success', 'message': [{'count': '12'}]} + var messageData = d['message']; + + // Check if messageData is actually a List before accessing index [0] + if (messageData is List && + messageData.isNotEmpty && + messageData[0] is Map) { + return messageData[0]['count']; + } + + // Fallback if the successful data structure is unexpected + return '0'; + + // --- FIX END --- } void startRideFromStartApp() { @@ -429,6 +437,11 @@ class MapDriverController extends GetxController { 'rideTimeStart': DateTime.now().toString(), 'status': 'Begin', }); + CRUD().post(link: "${AppLink.server}/ride/rides/update.php", payload: { + 'id': (rideId), + 'rideTimeStart': DateTime.now().toString(), + 'status': 'Begin', + }); CRUD().post(link: AppLink.addDriverOrder, payload: { 'driver_id': box.read(BoxName.driverID).toString(), 'order_id': (rideId).toString(), @@ -547,18 +560,6 @@ class MapDriverController extends GetxController { 'status': 'CancelAfterWait' }); - if (AppLink.endPoint != AppLink.seferCairoServer) { - CRUD().post(link: "${AppLink.endPoint}/rides/update.php", payload: { - 'id': (rideId), - 'rideTimeStart': DateTime.now().toString(), - 'status': 'CancelAfterWait', - }); - CRUD().post(link: "${AppLink.endPoint}/rides/update.php", payload: { - 'driver_id': box.read(BoxName.driverID).toString(), - 'order_id': (rideId).toString(), - 'status': 'CancelAfterWait' - }); - } var paymentTokenWait = await generateTokenDriver(costOfWaiting5Minute.toString()); var res = await CRUD().post(link: AppLink.addDrivePayment, payload: { @@ -734,7 +735,11 @@ class MapDriverController extends GetxController { List> apiCalls = []; apiCalls.add(CRUD().post( - link: "${AppLink.seferCairoServer}/ride/rides//finish_ride_updates.php", + link: "${AppLink.rideServer}/ride/rides/finish_ride_updates.php", + payload: rideUpdatePayload, + )); + apiCalls.add(CRUD().post( + link: "${AppLink.ride}/rides/finish_ride_updates.php", payload: rideUpdatePayload, )); diff --git a/lib/controller/home/navigation/navigation_view.dart b/lib/controller/home/navigation/navigation_view.dart index 9d98b46..add2660 100644 --- a/lib/controller/home/navigation/navigation_view.dart +++ b/lib/controller/home/navigation/navigation_view.dart @@ -37,7 +37,7 @@ class NavigationView extends StatelessWidget { myLocationEnabled: false, myLocationButtonEnabled: false, compassEnabled: false, - zoomControlsEnabled: false, + zoomControlsEnabled: false, buildingsEnabled: false, // تعديل الـ padding لإعطاء مساحة للعناصر العلوية والسفلية // مساحة أكبر في الأعلى للبحث + النتائج، ومساحة أكبر بالأسفل للملاحة padding: EdgeInsets.only( diff --git a/lib/controller/local/translations.dart b/lib/controller/local/translations.dart index 2a057c3..3991d5f 100755 --- a/lib/controller/local/translations.dart +++ b/lib/controller/local/translations.dart @@ -50,7 +50,17 @@ class MyTranslation extends Translations { "message From Driver": "رسالة من السائق", "Trip is Begin": "بدأت الرحلة", 'Rides': 'الرحلات', + "Invalid customer MSISDN": "رقم هاتف العميل غير صالح", 'Your Activity': 'نشاطك', + "Customer MSISDN doesn’t have customer wallet": + "رقم هاتف العميل لا يحتوي على محفظة عميل", + 'Please enter the number without the leading 0': + 'يرجى إدخال الرقم بدون الصفر الأولي', + 'witout zero': 'بدون صفر', + 'You Can Cancel the Trip and get Cost From ': + 'يمكنك إلغاء الرحلة واسترداد التكلفة من ', + 'Please enter your phone number': 'يرجى إدخال رقم هاتفك', + 'Phone number seems too short': 'يبدو أن رقم الهاتف قصير جدًا', 'You have upload Criminal documents': 'لقد قمت بتحميل وثائق جنائية', 'Close': 'إغلاق', "Cancel Trip from driver": "إلغاء الرحلة من السائق", diff --git a/lib/views/auth/captin/otp_page.dart b/lib/views/auth/captin/otp_page.dart index 723144c..6602211 100644 --- a/lib/views/auth/captin/otp_page.dart +++ b/lib/views/auth/captin/otp_page.dart @@ -306,7 +306,8 @@ class _PhoneNumberScreenState extends State { final rawPhone = _phoneController.text.trim().replaceFirst('+', ''); final success = await PhoneAuthHelper.sendOtp(rawPhone); if (success && mounted) { - Get.to(() => OtpVerificationScreen(phoneNumber: rawPhone)); + // Get.to(() => OtpVerificationScreen(phoneNumber: rawPhone)); + await PhoneAuthHelper.verifyOtp(rawPhone); } if (mounted) setState(() => _isLoading = false); } @@ -336,6 +337,7 @@ class _PhoneNumberScreenState extends State { dropdownTextStyle: const TextStyle(color: Colors.black87), decoration: InputDecoration( labelText: 'Phone Number'.tr, + hintText: 'witout zero'.tr, labelStyle: const TextStyle(color: Colors.black54), enabledBorder: OutlineInputBorder( borderRadius: BorderRadius.circular(12), @@ -353,10 +355,14 @@ class _PhoneNumberScreenState extends State { }, validator: (phone) { if (phone == null || phone.number.isEmpty) { - return 'Please enter your phone number'; + return 'Please enter your phone number'.tr; + } + // Check if the national number part starts with '0' + if (phone.number.startsWith('0')) { + return 'Please enter the number without the leading 0'.tr; } if (phone.completeNumber.length < 10) { - return 'Phone number seems too short'; + return 'Phone number seems too short'.tr; } return null; }, @@ -405,7 +411,7 @@ class _OtpVerificationScreenState extends State { void _submit() async { if (_formKey.currentState!.validate()) { setState(() => _isLoading = true); - await PhoneAuthHelper.verifyOtp(widget.phoneNumber, _otpController.text); + await PhoneAuthHelper.verifyOtp(widget.phoneNumber); if (mounted) setState(() => _isLoading = false); } } diff --git a/lib/views/home/Captin/home_captain/home_captin.dart b/lib/views/home/Captin/home_captain/home_captin.dart index 0af0038..27b0b2b 100755 --- a/lib/views/home/Captin/home_captain/home_captin.dart +++ b/lib/views/home/Captin/home_captain/home_captin.dart @@ -2,7 +2,10 @@ import 'dart:io'; import 'dart:ui'; import 'package:bubble_head/bubble.dart'; +// import 'package:google_maps_flutter/google_maps_flutter.dart'; +// import 'package:flutter_map/flutter_map.dart'; import 'package:google_maps_flutter/google_maps_flutter.dart'; +// import 'package:latlong2/latlong.dart' as latlng; // لإحداثيات العرض import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:get/get.dart'; @@ -32,14 +35,15 @@ import 'widget/left_menu_map_captain.dart'; class HomeCaptain extends StatelessWidget { HomeCaptain({super.key}); - final LocationController locationController = Get.put(LocationController()); + final LocationController locationController = + Get.put(LocationController(), permanent: true); final HomeCaptainController homeCaptainController = Get.put(HomeCaptainController()); @override Widget build(BuildContext context) { // Initial calls remain the same. - Get.put(HomeCaptainController()); + // Get.put(HomeCaptainController()); WidgetsBinding.instance.addPostFrameCallback((_) async { closeOverlayIfFound(); checkForUpdate(context); @@ -201,21 +205,19 @@ class _MapView extends StatelessWidget { // هذا الـ Builder يستمع إلى تحديثات الموقع return GetBuilder( builder: (locationController) { - // --- هذا هو الكود الجديد --- - // نقوم بتحريك الكاميرا يدوياً عند كل تحديث للموقع - if (homeController.mapHomeCaptainController != null && - homeController.isActive) { - homeController.mapHomeCaptainController!.animateCamera( - CameraUpdate.newCameraPosition( - CameraPosition( - target: locationController.myLocation, // الموقع الجديد - zoom: 17.5, // تقريب لمتابعة السائق - tilt: 50.0, // زاوية رؤية 3D - bearing: locationController.heading, // اتجاه السيارة - ), - ), - ); - } + // if (homeController.mapHomeCaptainController != null && + // homeController.isActive) { + // homeController.mapHomeCaptainController!.animateCamera( + // CameraUpdate.newCameraPosition( + // CameraPosition( + // target: locationController.myLocation, // الموقع الجديد + // zoom: 17.5, // تقريب لمتابعة السائق + // tilt: 50.0, // زاوية رؤية 3D + // bearing: locationController.heading, // اتجاه السيارة + // ), + // ), + // ); + // } // --- نهاية الكود الجديد --- // إرجاع الخريطة @@ -248,6 +250,71 @@ class _MapView extends StatelessWidget { compassEnabled: false, zoomControlsEnabled: false, ); + // --- الكود الجديد --- + +// // تحويل الإحداثيات من جوجل (إذا كنت لا تزال تستخدمها) إلى latlong2 +// final latlng.LatLng currentCarPosition = latlng.LatLng( +// locationController.myLocation.latitude, +// locationController.myLocation.longitude); + +// return FlutterMap( +// // 1. تمرير الـ Controller الذي أنشأناه في الخطوة 2 +// mapController: homeController.mapController, + +// options: MapOptions( +// // 2. هذا بديل initialCameraPosition +// initialCenter: currentCarPosition, +// initialZoom: 15, +// // هذا بديل padding +// // (ملاحظة: flutter_map لا يدعم padding مباشرة، قد تحتاج لتعديل الواجهة +// // أو استخدام خاصية nonRotatedChildren لبدائل أخرى) + +// // هذا بديل minMaxZoomPreference +// minZoom: 12, +// maxZoom: 16, onMapReady: homeController.onMapReady, +// ), + +// // 3. الخرائط في flutter_map عبارة عن "طبقات" (Layers) +// children: [ +// // --- الطبقة الأولى: الخريطة الأساسية (OSM) --- +// TileLayer( +// urlTemplate: 'https://tile.openstreetmap.org/{z}/{x}/{y}.png', +// userAgentPackageName: +// 'com.your.app.name', // هام: ضع اسم تطبيقك هنا +// ), + +// // --- (اختياري) طبقة القمر الصناعي بناءً على MapType --- +// if (controller.mapType) // إذا كنت لا تزال تستخدم mapType +// // TileLayer( +// // // ملاحظة: هذا الرابط يحتاج مفتاح API من MapTiler أو مزود آخر +// // urlTemplate: +// // 'https://api.maptiler.com/maps/satellite/{z}/{x}/{y}.jpg?key=YOUR_API_KEY', +// // userAgentPackageName: 'com.your.app.name', +// // ), + +// // --- الطبقة الثانية: أيقونة السيارة (Marker) --- +// MarkerLayer( +// markers: [ +// Marker( +// point: currentCarPosition, // الإحداثيات +// width: 80, +// height: 80, +// child: Transform.rotate( +// // 4. هذا بديل rotation +// angle: locationController.heading * +// (3.1415926535 / 180), // تحويل من درجات إلى راديان +// // 5. هذا بديل carIcon (أصبح أسهل!) +// child: Image.asset( +// 'assets/images/car.png', // نفس المسار الذي استخدمته من قبل +// width: 30, // الحجم الذي حددته في addCustomCarIcon +// height: 35, +// ), +// ), +// ), +// ], +// ), +// ], +// ); }, ); }, diff --git a/lib/views/home/Captin/home_captain/widget/left_menu_map_captain.dart b/lib/views/home/Captin/home_captain/widget/left_menu_map_captain.dart index c002e8a..2c23685 100755 --- a/lib/views/home/Captin/home_captain/widget/left_menu_map_captain.dart +++ b/lib/views/home/Captin/home_captain/widget/left_menu_map_captain.dart @@ -215,7 +215,7 @@ Future checkForPendingOrderFromServer() async { try { // You need to create this CRUD method - var response = await CRUD().get( + var response = await CRUD().post( link: AppLink.getArgumentAfterAppliedFromBackground, payload: {'driver_id': driverId}, ); diff --git a/lib/views/home/Captin/mapDriverWidgets/passenger_info_window.dart b/lib/views/home/Captin/mapDriverWidgets/passenger_info_window.dart index b35fe7a..400a7aa 100755 --- a/lib/views/home/Captin/mapDriverWidgets/passenger_info_window.dart +++ b/lib/views/home/Captin/mapDriverWidgets/passenger_info_window.dart @@ -249,16 +249,9 @@ class PassengerInfoWindow extends StatelessWidget { return MyElevatedButton( title: 'You Can Cancel the Trip and get Cost From '.tr + AppInformation.appName.tr, - kolor: AppColor.deepPurpleAccent, + kolor: AppColor.gold, onPressed: () { MyDialog().getDialog('Are you sure to cancel?'.tr, '', () async { - // fcm.sendNotificationToDriverMAP( - // 'Driver Cancelled Your Trip', - // 'You will need to pay the cost to the driver, or it will be deducted from your next trip' - // .tr, - // controller.tokenPassenger, - // [], - // 'cancel.wav'); NotificationService.sendNotification( target: controller.tokenPassenger.toString(), title: 'Driver Cancelled Your Trip'.tr, diff --git a/lib/views/home/Captin/orderCaptin/order_request_page.dart b/lib/views/home/Captin/orderCaptin/order_request_page.dart index 007159c..4708b9c 100755 --- a/lib/views/home/Captin/orderCaptin/order_request_page.dart +++ b/lib/views/home/Captin/orderCaptin/order_request_page.dart @@ -276,6 +276,7 @@ class _OrderRequestPageState extends State { .tr, '', () { Get.back(); + // Get.back(); }); } else { await CRUD().postFromDialogue( diff --git a/lib/views/home/Captin/orderCaptin/order_speed_request.dart b/lib/views/home/Captin/orderCaptin/order_speed_request.dart index a596e32..f12fd6b 100755 --- a/lib/views/home/Captin/orderCaptin/order_speed_request.dart +++ b/lib/views/home/Captin/orderCaptin/order_speed_request.dart @@ -356,27 +356,26 @@ class OrderSpeedRequest extends StatelessWidget { Get.put(HomeCaptainController()).changeRideId(); box.write(BoxName.statusDriverLocation, 'on'); var res = await CRUD().post( - link: AppLink.updateStausFromSpeed, - payload: { - 'id': rideId, - 'rideTimeStart': - DateTime.now().toString(), - 'status': 'Apply', - 'driver_id': box.read(BoxName.driverID), - }); - if (AppLink.endPoint != - AppLink.seferCairoServer) { - CRUD().post( - link: - "${AppLink.rideServer}/rides/updateStausFromSpeed.php", - payload: { - 'id': rideId, - 'rideTimeStart': - DateTime.now().toString(), - 'status': 'Apply', - 'driver_id': box.read(BoxName.driverID), - }); - } + link: AppLink.updateStausFromSpeed, + payload: { + 'id': rideId, + 'rideTimeStart': DateTime.now().toString(), + 'status': 'Apply', + 'driver_id': box.read(BoxName.driverID), + }, + ); + + CRUD().post( + link: + "${AppLink.server}/ride/rides/updateStausFromSpeed.php", + payload: { + 'id': rideId, + 'rideTimeStart': DateTime.now().toString(), + 'status': 'Apply', + 'driver_id': box.read(BoxName.driverID), + }, + ); + if (res != "failure") { box.write(BoxName.statusDriverLocation, 'on'); controller.changeApplied(); @@ -419,17 +418,14 @@ class OrderSpeedRequest extends StatelessWidget { 'status': 'Apply' }); - if (AppLink.endPoint != - AppLink.seferCairoServer) { - CRUD().post( - link: - "${AppLink.rideServer}/driver_order/add.php", - payload: { - 'driver_id': _getData(6), - 'order_id': rideId, - 'status': 'Apply' - }); - } + CRUD().post( + link: + "${AppLink.rideServer}/driver_order/add.php", + payload: { + 'driver_id': _getData(6), + 'order_id': rideId, + 'status': 'Apply' + }); Get.back(); // Go back from order request screen box.write(BoxName.rideArguments, { diff --git a/lib/views/home/my_wallet/points_captain.dart b/lib/views/home/my_wallet/points_captain.dart index eccce8c..0a5f24e 100755 --- a/lib/views/home/my_wallet/points_captain.dart +++ b/lib/views/home/my_wallet/points_captain.dart @@ -66,48 +66,48 @@ class PointsCaptain extends StatelessWidget { color: AppColor.blueColor, size: 70), ], )), - // GestureDetector( - // onTap: () async { - // Get.back(); - // Get.defaultDialog( - // barrierDismissible: false, - // title: 'Insert Wallet phone number'.tr, - // content: Form( - // key: paymentController.formKey, - // child: MyTextForm( - // controller: - // paymentController.walletphoneController, - // label: 'Insert Wallet phone number'.tr, - // hint: '963941234567', - // type: TextInputType.phone)), - // confirm: MyElevatedButton( - // title: 'OK'.tr, - // onPressed: () async { - // Get.back(); - // if (paymentController.formKey.currentState! - // .validate()) { - // box.write( - // BoxName.phoneWallet, - // paymentController - // .walletphoneController.text); - // await payWithMTNWallet( - // context, pricePoint.toString(), 'SYP'); - // } - // })); - // }, - // child: Row( - // mainAxisAlignment: MainAxisAlignment.spaceBetween, - // children: [ - // Text('Pay by MTN Wallet'.tr), - // const SizedBox(width: 10), - // Image.asset( - // 'assets/images/cashMTN.png', - // width: 70, - // height: 70, - // fit: BoxFit.fill, - // ), - // ], - // )), + GestureDetector( + onTap: () async { + Get.back(); + Get.defaultDialog( + barrierDismissible: false, + title: 'Insert Wallet phone number'.tr, + content: Form( + key: paymentController.formKey, + child: MyTextForm( + controller: + paymentController.walletphoneController, + label: 'Insert Wallet phone number'.tr, + hint: '963941234567', + type: TextInputType.phone)), + confirm: MyElevatedButton( + title: 'OK'.tr, + onPressed: () async { + Get.back(); + if (paymentController.formKey.currentState! + .validate()) { + box.write( + BoxName.phoneWallet, + paymentController + .walletphoneController.text); + await payWithMTNWallet( + context, pricePoint.toString(), 'SYP'); + } + })); + }, + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text('Pay by MTN Wallet'.tr), + const SizedBox(width: 10), + Image.asset( + 'assets/images/cashMTN.png', + width: 70, + height: 70, + fit: BoxFit.fill, + ), + ], + )), GestureDetector( onTap: () async {