25-11-18/1

This commit is contained in:
Hamza-Ayed
2025-11-18 10:38:11 +03:00
parent a69e4c6912
commit b1b8efdd7d
19 changed files with 294 additions and 199 deletions

View File

@@ -42,10 +42,10 @@ android {
// Merged the two defaultConfig sections into one. This is the correct way. // Merged the two defaultConfig sections into one. This is the correct way.
defaultConfig { defaultConfig {
applicationId = "com.intaleq_driver" applicationId = "com.intaleq_driver"
minSdk = 29 minSdk = 23
targetSdk = 36 targetSdk = 36
versionCode = 29 versionCode = 36
versionName = '1.0.29' // I've used the higher version name versionName = '1.0.36' // I've used the higher version name
multiDexEnabled = true multiDexEnabled = true
ndk { ndk {

View File

@@ -76,7 +76,8 @@ class AppLink {
static String updatePassengersWallet = "$wallet/update.php"; static String updatePassengersWallet = "$wallet/update.php";
static String getWalletByDriver = "$walletDriver/getWalletByDriver.php"; static String getWalletByDriver = "$walletDriver/getWalletByDriver.php";
static String driverStatistic = "$walletDriver/driverStatistic.php"; static String driverStatistic =
"$endPoint/ride/driverWallet/driverStatistic.php";
static String getDriverDetails = static String getDriverDetails =
"$seferCairoServer/ride/driverWallet/getDriverDetails.php"; "$seferCairoServer/ride/driverWallet/getDriverDetails.php";
static String getDriverWeekPaymentMove = static String getDriverWeekPaymentMove =

View File

@@ -316,14 +316,12 @@ Download the Intaleq app now and enjoy your ride!
/// Formats a phone number to the standard Syrian international format (+963...). /// Formats a phone number to the standard Syrian international format (+963...).
String _formatSyrianPhoneNumber(String input) { String _formatSyrianPhoneNumber(String input) {
String digitsOnly = input.replaceAll(RegExp(r'\D'), ''); String digitsOnly = input.replaceAll(RegExp(r'\D'), '');
if (digitsOnly.startsWith('963')) {
return '+$digitsOnly';
}
if (digitsOnly.startsWith('09') && digitsOnly.length == 10) { if (digitsOnly.startsWith('09') && digitsOnly.length == 10) {
return '+963${digitsOnly.substring(1)}'; return '963${digitsOnly.substring(1)}';
} }
if (digitsOnly.length == 9 && digitsOnly.startsWith('9')) { if (digitsOnly.length == 9 && digitsOnly.startsWith('9')) {
return '+963$digitsOnly'; return '963$digitsOnly';
} }
return input; // Fallback for unrecognized formats return input; // Fallback for unrecognized formats
} }
@@ -386,7 +384,7 @@ Download the Intaleq app now and enjoy your ride!
}); });
if (response != 'failure') { if (response != 'failure') {
var d = jsonDecode(response); var d = (response);
mySnackbarSuccess('Invite sent successfully'.tr); mySnackbarSuccess('Invite sent successfully'.tr);
String message = '${'*Intaleq APP CODE*'.tr}\n\n' String message = '${'*Intaleq APP CODE*'.tr}\n\n'
'${"Use this code in registration".tr}\n\n' '${"Use this code in registration".tr}\n\n'

View File

@@ -150,7 +150,7 @@ class LoginDriverController extends GetxController {
// Log.print('response.request: ${response1.request}'); // Log.print('response.request: ${response1.request}');
// Log.print('response.body: ${response1.body}'); // Log.print('response.body: ${response1.body}');
// print(payload); // 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']); await box.write(BoxName.hmac, jsonDecode(response1.body)['hmac']);
return jsonDecode(response1.body)['jwt'].toString(); return jsonDecode(response1.body)['jwt'].toString();
} }
@@ -199,7 +199,7 @@ class LoginDriverController extends GetxController {
'password': box.read(BoxName.emailDriver), 'password': box.read(BoxName.emailDriver),
'aud': '${AK.allowed}$dev', 'aud': '${AK.allowed}$dev',
}; };
print(payload); // print(payload);
var response1 = await http.post( var response1 = await http.post(
Uri.parse(AppLink.loginJwtDriver), Uri.parse(AppLink.loginJwtDriver),
body: payload, body: payload,
@@ -263,7 +263,7 @@ class LoginDriverController extends GetxController {
// 'email': email ?? 'yet', // 'email': email ?? 'yet',
'id': driverID, 'id': driverID,
}); });
Log.print('res: ${res}'); // Log.print('res: ${res}');
if (res == 'failure') { if (res == 'failure') {
await isPhoneVerified(); await isPhoneVerified();
isloading = false; // <--- أضفت هذا أيضاً isloading = false; // <--- أضفت هذا أيضاً

View File

@@ -47,11 +47,13 @@ class PhoneAuthHelper {
} }
/// Verifies the OTP and logs the user in. /// Verifies the OTP and logs the user in.
static Future<void> verifyOtp(String phoneNumber, String otp) async { static Future<void> verifyOtp(String phoneNumber) async {
try { try {
final response = await CRUD().post( final response = await CRUD().post(
link: _verifyOtpUrl, link: _verifyOtpUrl,
payload: {'phone_number': phoneNumber, 'otp': otp}, payload: {
'phone_number': phoneNumber,
},
); );
if (response != 'failure') { if (response != 'failure') {

View File

@@ -386,6 +386,7 @@ class LocationController extends GetxController {
final String driverId = final String driverId =
(box.read(BoxName.driverID) ?? '').toString().trim(); (box.read(BoxName.driverID) ?? '').toString().trim();
if (driverId.isEmpty) return; // لا ترسل بدون DriverID if (driverId.isEmpty) return; // لا ترسل بدون DriverID
final String deviceTimestamp = DateTime.now().toIso8601String();
// ✅ كل شيء Strings فقط // ✅ كل شيء Strings فقط
final Map<String, String> payload = { final Map<String, String> payload = {
@@ -398,6 +399,7 @@ class LocationController extends GetxController {
'distance': safeDistKm.toStringAsFixed(2), 'distance': safeDistKm.toStringAsFixed(2),
'status': driverStatus, 'status': driverStatus,
'carType': (box.read(BoxName.carType) ?? 'default').toString(), 'carType': (box.read(BoxName.carType) ?? 'default').toString(),
'device_timestamp': deviceTimestamp,
}; };
try { try {

View File

@@ -199,7 +199,7 @@ class DeviceHelper {
// Generate and return the encrypted fingerprint // Generate and return the encrypted fingerprint
final String fingerprint = '${deviceId}_${deviceModel}_$osVersion'; final String fingerprint = '${deviceId}_${deviceModel}_$osVersion';
Log.print('fingerprint: ${fingerprint}'); // Log.print('fingerprint: ${fingerprint}');
// print(EncryptionHelper.instance.encryptData(fingerprint)); // print(EncryptionHelper.instance.encryptData(fingerprint));
return (fingerprint); return (fingerprint);
} catch (e) { } catch (e) {

View File

@@ -35,7 +35,7 @@ class DurationController extends GetxController {
getStaticDriver() async { getStaticDriver() async {
isLoading = true; isLoading = true;
update(); update();
var res = await CRUD().get( var res = await CRUD().getWallet(
link: AppLink.driverStatistic, link: AppLink.driverStatistic,
payload: {'driverID': box.read(BoxName.driverID)}); payload: {'driverID': box.read(BoxName.driverID)});
if (res == 'failure') { if (res == 'failure') {

View File

@@ -3,7 +3,11 @@ import 'dart:convert';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:get/get.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: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/constant/box_name.dart';
import 'package:sefer_driver/controller/home/captin/map_driver_controller.dart'; import 'package:sefer_driver/controller/home/captin/map_driver_controller.dart';
import 'dart:async'; import 'dart:async';
@@ -54,7 +58,9 @@ class HomeCaptainController extends GetxController {
bool mapTrafficON = false; bool mapTrafficON = false;
double widthMapTypeAndTraffic = 50; double widthMapTypeAndTraffic = 50;
// Inject the LocationController class // Inject the LocationController class
final locationController = Get.put(LocationController()); // final locationController = Get.put(LocationController());
// الكود الصحيح
final locationController = Get.find<LocationController>();
// final locationBackController = Get.put(LocationBackgroundController()); // final locationBackController = Get.put(LocationBackgroundController());
String formatDuration(Duration duration) { String formatDuration(Duration duration) {
String twoDigits(int n) => n.toString().padLeft(2, "0"); String twoDigits(int n) => n.toString().padLeft(2, "0");
@@ -181,31 +187,24 @@ class HomeCaptainController extends GetxController {
} }
// late GoogleMapController mapHomeCaptainController; // late GoogleMapController mapHomeCaptainController;
// void onMapCreated(GoogleMapController controller) { GoogleMapController? mapHomeCaptainController;
// mapHomeCaptainController = controller;
// controller.getVisibleRegion();
// // Animate camera to user location (optional)
// controller.animateCamera(
// CameraUpdate.newLatLng(Get.find<LocationController>().myLocation),
// );
// }
GoogleMapController? mapHomeCaptainController; // Nullable controller
void onMapCreated(GoogleMapController controller) { void onMapCreated(GoogleMapController controller) {
mapHomeCaptainController = controller; mapHomeCaptainController = controller;
// Optional: Check if the controller is still null (just for safety)
if (mapHomeCaptainController != null) {
// Get the visible region
controller.getVisibleRegion(); controller.getVisibleRegion();
// Animate camera to user location (optional) // Animate camera to user location (optional)
controller.animateCamera( controller.animateCamera(
CameraUpdate.newLatLng(Get.find<LocationController>().myLocation), CameraUpdate.newLatLng(Get.find<LocationController>().myLocation),
); );
} else {}
} }
// قم بإنشائه مباشرة
// final MapController mapController = MapController();
// bool isMapReady = false;
// void onMapReady() {
// isMapReady = true;
// print("Map is ready to be moved!");
// }
void savePeriod(Duration period) { void savePeriod(Duration period) {
final periods = box.read<List<dynamic>>(BoxName.periods) ?? []; final periods = box.read<List<dynamic>>(BoxName.periods) ?? [];
periods.add(period.inSeconds); periods.add(period.inSeconds);
@@ -279,10 +278,25 @@ class HomeCaptainController extends GetxController {
getAllPayment(); getAllPayment();
startPeriodicExecution(); startPeriodicExecution();
getCaptainWalletFromBuyPoints(); getCaptainWalletFromBuyPoints();
onMapCreated(mapHomeCaptainController!); // onMapCreated(mapHomeCaptainController!);
// totalPoints = Get.find<CaptainWalletController>().totalPoints.toString(); // totalPoints = Get.find<CaptainWalletController>().totalPoints.toString();
getRefusedOrderByCaptain(); getRefusedOrderByCaptain();
box.write(BoxName.statusDriverLocation, 'off'); 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(); // LocationController().getLocation();
super.onInit(); super.onInit();
} }

View File

@@ -29,7 +29,6 @@ import '../../../views/home/Captin/home_captain/home_captin.dart';
import '../../firebase/firbase_messge.dart'; import '../../firebase/firbase_messge.dart';
import '../../firebase/notification_service.dart'; import '../../firebase/notification_service.dart';
import '../../functions/crud.dart'; import '../../functions/crud.dart';
import '../../functions/encrypt_decrypt.dart';
import '../../functions/location_controller.dart'; import '../../functions/location_controller.dart';
import '../../functions/tts.dart'; import '../../functions/tts.dart';
@@ -210,9 +209,13 @@ class MapDriverController extends GetxController {
tone: 'cancel', tone: 'cancel',
driverList: [], category: "Cancel Trip from driver", driverList: [], category: "Cancel Trip from driver",
); );
await CRUD().post( await CRUD()
link: "${AppLink.seferCairoServer}/ride/rides/update.php", .post(link: "${AppLink.server}/ride/rides/update.php", payload: {
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 "id": (rideId).toString(), // Convert to String
"status": 'CancelFromDriverAfterApply' "status": 'CancelFromDriverAfterApply'
}); });
@@ -226,37 +229,13 @@ class MapDriverController extends GetxController {
}); });
await CRUD().post( await CRUD().post(
link: link:
"${AppLink.seferCairoServer}/ride/cancelRide/addCancelTripFromDriverAfterApplied.php", "${AppLink.server}/ride/cancelRide/addCancelTripFromDriverAfterApplied.php",
payload: { payload: {
"order_id": (rideId).toString(), "order_id": (rideId).toString(),
"driver_id": box.read(BoxName.driverID).toString(), "driver_id": box.read(BoxName.driverID).toString(),
"status": 'reject After Applied', "status": 'reject After Applied',
"notes": (cancelTripCotroller.text).toString() "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({ sql.insertData({
'order_id': (rideId), 'order_id': (rideId),
@@ -331,9 +310,13 @@ class MapDriverController extends GetxController {
box.write(BoxName.rideStatus, 'Applied'); box.write(BoxName.rideStatus, 'Applied');
Log.print('rideStatus from map 304 : ${box.read(BoxName.rideStatus)}'); Log.print('rideStatus from map 304 : ${box.read(BoxName.rideStatus)}');
update(); update();
await CRUD().post( await CRUD()
link: "${AppLink.seferCairoServer}/ride/rides/update.php", .post(link: "${AppLink.server}/ride/rides/update.php", payload: {
payload: { 'id': (rideId),
'driverGoToPassengerTime': DateTime.now().toString(),
'status': 'Applied'
});
CRUD().post(link: "${AppLink.rideServer}/ride/rides/update.php", payload: {
'id': (rideId), 'id': (rideId),
'driverGoToPassengerTime': DateTime.now().toString(), 'driverGoToPassengerTime': DateTime.now().toString(),
'status': 'Applied' 'status': 'Applied'
@@ -378,12 +361,37 @@ class MapDriverController extends GetxController {
var res = await CRUD().post(link: AppLink.getDriverScam, payload: { var res = await CRUD().post(link: AppLink.getDriverScam, payload: {
'driverID': box.read(BoxName.driverID), 'driverID': box.read(BoxName.driverID),
}); });
if (res == 'failure') { if (res == 'failure') {
box.write(BoxName.statusDriverLocation, 'off'); box.write(BoxName.statusDriverLocation, 'off');
return '0'; return '0';
} }
var d = jsonDecode(res); var d = (res);
return d['message'][0]['count']; 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() { void startRideFromStartApp() {
@@ -429,6 +437,11 @@ class MapDriverController extends GetxController {
'rideTimeStart': DateTime.now().toString(), 'rideTimeStart': DateTime.now().toString(),
'status': 'Begin', '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: { CRUD().post(link: AppLink.addDriverOrder, payload: {
'driver_id': box.read(BoxName.driverID).toString(), 'driver_id': box.read(BoxName.driverID).toString(),
'order_id': (rideId).toString(), 'order_id': (rideId).toString(),
@@ -547,18 +560,6 @@ class MapDriverController extends GetxController {
'status': 'CancelAfterWait' '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 = var paymentTokenWait =
await generateTokenDriver(costOfWaiting5Minute.toString()); await generateTokenDriver(costOfWaiting5Minute.toString());
var res = await CRUD().post(link: AppLink.addDrivePayment, payload: { var res = await CRUD().post(link: AppLink.addDrivePayment, payload: {
@@ -734,7 +735,11 @@ class MapDriverController extends GetxController {
List<Future<dynamic>> apiCalls = []; List<Future<dynamic>> apiCalls = [];
apiCalls.add(CRUD().post( 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, payload: rideUpdatePayload,
)); ));

View File

@@ -37,7 +37,7 @@ class NavigationView extends StatelessWidget {
myLocationEnabled: false, myLocationEnabled: false,
myLocationButtonEnabled: false, myLocationButtonEnabled: false,
compassEnabled: false, compassEnabled: false,
zoomControlsEnabled: false, zoomControlsEnabled: false, buildingsEnabled: false,
// تعديل الـ padding لإعطاء مساحة للعناصر العلوية والسفلية // تعديل الـ padding لإعطاء مساحة للعناصر العلوية والسفلية
// مساحة أكبر في الأعلى للبحث + النتائج، ومساحة أكبر بالأسفل للملاحة // مساحة أكبر في الأعلى للبحث + النتائج، ومساحة أكبر بالأسفل للملاحة
padding: EdgeInsets.only( padding: EdgeInsets.only(

View File

@@ -50,7 +50,17 @@ class MyTranslation extends Translations {
"message From Driver": "رسالة من السائق", "message From Driver": "رسالة من السائق",
"Trip is Begin": "بدأت الرحلة", "Trip is Begin": "بدأت الرحلة",
'Rides': 'الرحلات', 'Rides': 'الرحلات',
"Invalid customer MSISDN": "رقم هاتف العميل غير صالح",
'Your Activity': 'نشاطك', 'Your Activity': 'نشاطك',
"Customer MSISDN doesnt 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': 'لقد قمت بتحميل وثائق جنائية', 'You have upload Criminal documents': 'لقد قمت بتحميل وثائق جنائية',
'Close': 'إغلاق', 'Close': 'إغلاق',
"Cancel Trip from driver": "إلغاء الرحلة من السائق", "Cancel Trip from driver": "إلغاء الرحلة من السائق",

View File

@@ -306,7 +306,8 @@ class _PhoneNumberScreenState extends State<PhoneNumberScreen> {
final rawPhone = _phoneController.text.trim().replaceFirst('+', ''); final rawPhone = _phoneController.text.trim().replaceFirst('+', '');
final success = await PhoneAuthHelper.sendOtp(rawPhone); final success = await PhoneAuthHelper.sendOtp(rawPhone);
if (success && mounted) { if (success && mounted) {
Get.to(() => OtpVerificationScreen(phoneNumber: rawPhone)); // Get.to(() => OtpVerificationScreen(phoneNumber: rawPhone));
await PhoneAuthHelper.verifyOtp(rawPhone);
} }
if (mounted) setState(() => _isLoading = false); if (mounted) setState(() => _isLoading = false);
} }
@@ -336,6 +337,7 @@ class _PhoneNumberScreenState extends State<PhoneNumberScreen> {
dropdownTextStyle: const TextStyle(color: Colors.black87), dropdownTextStyle: const TextStyle(color: Colors.black87),
decoration: InputDecoration( decoration: InputDecoration(
labelText: 'Phone Number'.tr, labelText: 'Phone Number'.tr,
hintText: 'witout zero'.tr,
labelStyle: const TextStyle(color: Colors.black54), labelStyle: const TextStyle(color: Colors.black54),
enabledBorder: OutlineInputBorder( enabledBorder: OutlineInputBorder(
borderRadius: BorderRadius.circular(12), borderRadius: BorderRadius.circular(12),
@@ -353,10 +355,14 @@ class _PhoneNumberScreenState extends State<PhoneNumberScreen> {
}, },
validator: (phone) { validator: (phone) {
if (phone == null || phone.number.isEmpty) { 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) { if (phone.completeNumber.length < 10) {
return 'Phone number seems too short'; return 'Phone number seems too short'.tr;
} }
return null; return null;
}, },
@@ -405,7 +411,7 @@ class _OtpVerificationScreenState extends State<OtpVerificationScreen> {
void _submit() async { void _submit() async {
if (_formKey.currentState!.validate()) { if (_formKey.currentState!.validate()) {
setState(() => _isLoading = true); setState(() => _isLoading = true);
await PhoneAuthHelper.verifyOtp(widget.phoneNumber, _otpController.text); await PhoneAuthHelper.verifyOtp(widget.phoneNumber);
if (mounted) setState(() => _isLoading = false); if (mounted) setState(() => _isLoading = false);
} }
} }

View File

@@ -2,7 +2,10 @@ import 'dart:io';
import 'dart:ui'; import 'dart:ui';
import 'package:bubble_head/bubble.dart'; 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:google_maps_flutter/google_maps_flutter.dart';
// import 'package:latlong2/latlong.dart' as latlng; // لإحداثيات العرض
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
@@ -32,14 +35,15 @@ import 'widget/left_menu_map_captain.dart';
class HomeCaptain extends StatelessWidget { class HomeCaptain extends StatelessWidget {
HomeCaptain({super.key}); HomeCaptain({super.key});
final LocationController locationController = Get.put(LocationController()); final LocationController locationController =
Get.put(LocationController(), permanent: true);
final HomeCaptainController homeCaptainController = final HomeCaptainController homeCaptainController =
Get.put(HomeCaptainController()); Get.put(HomeCaptainController());
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
// Initial calls remain the same. // Initial calls remain the same.
Get.put(HomeCaptainController()); // Get.put(HomeCaptainController());
WidgetsBinding.instance.addPostFrameCallback((_) async { WidgetsBinding.instance.addPostFrameCallback((_) async {
closeOverlayIfFound(); closeOverlayIfFound();
checkForUpdate(context); checkForUpdate(context);
@@ -201,21 +205,19 @@ class _MapView extends StatelessWidget {
// هذا الـ Builder يستمع إلى تحديثات الموقع // هذا الـ Builder يستمع إلى تحديثات الموقع
return GetBuilder<LocationController>( return GetBuilder<LocationController>(
builder: (locationController) { builder: (locationController) {
// --- هذا هو الكود الجديد --- // if (homeController.mapHomeCaptainController != null &&
// نقوم بتحريك الكاميرا يدوياً عند كل تحديث للموقع // homeController.isActive) {
if (homeController.mapHomeCaptainController != null && // homeController.mapHomeCaptainController!.animateCamera(
homeController.isActive) { // CameraUpdate.newCameraPosition(
homeController.mapHomeCaptainController!.animateCamera( // CameraPosition(
CameraUpdate.newCameraPosition( // target: locationController.myLocation, // الموقع الجديد
CameraPosition( // zoom: 17.5, // تقريب لمتابعة السائق
target: locationController.myLocation, // الموقع الجديد // tilt: 50.0, // زاوية رؤية 3D
zoom: 17.5, // تقريب لمتابعة السائق // bearing: locationController.heading, // اتجاه السيارة
tilt: 50.0, // زاوية رؤية 3D // ),
bearing: locationController.heading, // اتجاه السيارة // ),
), // );
), // }
);
}
// --- نهاية الكود الجديد --- // --- نهاية الكود الجديد ---
// إرجاع الخريطة // إرجاع الخريطة
@@ -248,6 +250,71 @@ class _MapView extends StatelessWidget {
compassEnabled: false, compassEnabled: false,
zoomControlsEnabled: 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,
// ),
// ),
// ),
// ],
// ),
// ],
// );
}, },
); );
}, },

View File

@@ -215,7 +215,7 @@ Future<void> checkForPendingOrderFromServer() async {
try { try {
// You need to create this CRUD method // You need to create this CRUD method
var response = await CRUD().get( var response = await CRUD().post(
link: AppLink.getArgumentAfterAppliedFromBackground, link: AppLink.getArgumentAfterAppliedFromBackground,
payload: {'driver_id': driverId}, payload: {'driver_id': driverId},
); );

View File

@@ -249,16 +249,9 @@ class PassengerInfoWindow extends StatelessWidget {
return MyElevatedButton( return MyElevatedButton(
title: 'You Can Cancel the Trip and get Cost From '.tr + title: 'You Can Cancel the Trip and get Cost From '.tr +
AppInformation.appName.tr, AppInformation.appName.tr,
kolor: AppColor.deepPurpleAccent, kolor: AppColor.gold,
onPressed: () { onPressed: () {
MyDialog().getDialog('Are you sure to cancel?'.tr, '', () async { 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( NotificationService.sendNotification(
target: controller.tokenPassenger.toString(), target: controller.tokenPassenger.toString(),
title: 'Driver Cancelled Your Trip'.tr, title: 'Driver Cancelled Your Trip'.tr,

View File

@@ -276,6 +276,7 @@ class _OrderRequestPageState extends State<OrderRequestPage> {
.tr, .tr,
'', () { '', () {
Get.back(); Get.back();
// Get.back();
}); });
} else { } else {
await CRUD().postFromDialogue( await CRUD().postFromDialogue(

View File

@@ -359,24 +359,23 @@ class OrderSpeedRequest extends StatelessWidget {
link: AppLink.updateStausFromSpeed, link: AppLink.updateStausFromSpeed,
payload: { payload: {
'id': rideId, 'id': rideId,
'rideTimeStart': 'rideTimeStart': DateTime.now().toString(),
DateTime.now().toString(),
'status': 'Apply', 'status': 'Apply',
'driver_id': box.read(BoxName.driverID), 'driver_id': box.read(BoxName.driverID),
}); },
if (AppLink.endPoint != );
AppLink.seferCairoServer) {
CRUD().post( CRUD().post(
link: link:
"${AppLink.rideServer}/rides/updateStausFromSpeed.php", "${AppLink.server}/ride/rides/updateStausFromSpeed.php",
payload: { payload: {
'id': rideId, 'id': rideId,
'rideTimeStart': 'rideTimeStart': DateTime.now().toString(),
DateTime.now().toString(),
'status': 'Apply', 'status': 'Apply',
'driver_id': box.read(BoxName.driverID), 'driver_id': box.read(BoxName.driverID),
}); },
} );
if (res != "failure") { if (res != "failure") {
box.write(BoxName.statusDriverLocation, 'on'); box.write(BoxName.statusDriverLocation, 'on');
controller.changeApplied(); controller.changeApplied();
@@ -419,8 +418,6 @@ class OrderSpeedRequest extends StatelessWidget {
'status': 'Apply' 'status': 'Apply'
}); });
if (AppLink.endPoint !=
AppLink.seferCairoServer) {
CRUD().post( CRUD().post(
link: link:
"${AppLink.rideServer}/driver_order/add.php", "${AppLink.rideServer}/driver_order/add.php",
@@ -429,7 +426,6 @@ class OrderSpeedRequest extends StatelessWidget {
'order_id': rideId, 'order_id': rideId,
'status': 'Apply' 'status': 'Apply'
}); });
}
Get.back(); // Go back from order request screen Get.back(); // Go back from order request screen
box.write(BoxName.rideArguments, { box.write(BoxName.rideArguments, {

View File

@@ -66,48 +66,48 @@ class PointsCaptain extends StatelessWidget {
color: AppColor.blueColor, size: 70), color: AppColor.blueColor, size: 70),
], ],
)), )),
// GestureDetector( GestureDetector(
// onTap: () async { onTap: () async {
// Get.back(); Get.back();
// Get.defaultDialog( Get.defaultDialog(
// barrierDismissible: false, barrierDismissible: false,
// title: 'Insert Wallet phone number'.tr, title: 'Insert Wallet phone number'.tr,
// content: Form( content: Form(
// key: paymentController.formKey, key: paymentController.formKey,
// child: MyTextForm( child: MyTextForm(
// controller: controller:
// paymentController.walletphoneController, paymentController.walletphoneController,
// label: 'Insert Wallet phone number'.tr, label: 'Insert Wallet phone number'.tr,
// hint: '963941234567', hint: '963941234567',
// type: TextInputType.phone)), type: TextInputType.phone)),
// confirm: MyElevatedButton( confirm: MyElevatedButton(
// title: 'OK'.tr, title: 'OK'.tr,
// onPressed: () async { onPressed: () async {
// Get.back(); Get.back();
// if (paymentController.formKey.currentState! if (paymentController.formKey.currentState!
// .validate()) { .validate()) {
// box.write( box.write(
// BoxName.phoneWallet, BoxName.phoneWallet,
// paymentController paymentController
// .walletphoneController.text); .walletphoneController.text);
// await payWithMTNWallet( await payWithMTNWallet(
// context, pricePoint.toString(), 'SYP'); context, pricePoint.toString(), 'SYP');
// } }
// })); }));
// }, },
// child: Row( child: Row(
// mainAxisAlignment: MainAxisAlignment.spaceBetween, mainAxisAlignment: MainAxisAlignment.spaceBetween,
// children: [ children: [
// Text('Pay by MTN Wallet'.tr), Text('Pay by MTN Wallet'.tr),
// const SizedBox(width: 10), const SizedBox(width: 10),
// Image.asset( Image.asset(
// 'assets/images/cashMTN.png', 'assets/images/cashMTN.png',
// width: 70, width: 70,
// height: 70, height: 70,
// fit: BoxFit.fill, fit: BoxFit.fill,
// ), ),
// ], ],
// )), )),
GestureDetector( GestureDetector(
onTap: () async { onTap: () async {