Fixes & Updates - 2026-06-01: Integrate Back-End v3 updates, fix call/connection issues across apps
This commit is contained in:
@@ -54,8 +54,11 @@ class LocationController extends GetxController with WidgetsBindingObserver {
|
||||
late final HomeCaptainController _homeCtrl;
|
||||
late final CaptainWalletController _walletCtrl;
|
||||
|
||||
LatLng myLocation = const LatLng(0, 0);
|
||||
double heading = 0.0;
|
||||
LatLng myLocation = LatLng(
|
||||
box.read('last_lat') ?? 0.0,
|
||||
box.read('last_lng') ?? 0.0,
|
||||
);
|
||||
double heading = box.read('last_heading') ?? 0.0;
|
||||
double speed = 0.0;
|
||||
double totalDistance = 0.0;
|
||||
bool _isReady = false;
|
||||
@@ -379,7 +382,23 @@ class LocationController extends GetxController with WidgetsBindingObserver {
|
||||
Log.print("Overlay check error: $e");
|
||||
}
|
||||
|
||||
if (Get.currentRoute != '/OrderRequestPage') {
|
||||
// 🔥 [Fix Active-Ride Guard] منع فتح صفحة الطلبات أثناء وجود السائق في رحلة نشطة
|
||||
// هذا يمنع socket event جديد من تعطيل رحلة جارية
|
||||
String? currentRideStatus = box.read(BoxName.rideStatus);
|
||||
bool hasActiveRide = (currentRideStatus == 'Begin' ||
|
||||
currentRideStatus == 'Apply' ||
|
||||
currentRideStatus == 'Arrived');
|
||||
String currentRoute = Get.currentRoute;
|
||||
bool isOnMapPage = currentRoute.contains('MapPage') ||
|
||||
currentRoute.contains('PassengerLocation');
|
||||
|
||||
if (hasActiveRide || isOnMapPage) {
|
||||
Log.print(
|
||||
"⛔ [LocationController] Ignoring new ride request — driver has active ride ($currentRideStatus) or is on map page ($currentRoute).");
|
||||
return;
|
||||
}
|
||||
|
||||
if (currentRoute != '/OrderRequestPage') {
|
||||
Log.print("🚀 Socket: Navigating to OrderRequestPage...");
|
||||
Get.toNamed('/OrderRequestPage', arguments: {
|
||||
'myListString': jsonEncode(driverList),
|
||||
@@ -398,6 +417,10 @@ class LocationController extends GetxController with WidgetsBindingObserver {
|
||||
void _startHeartbeat() {
|
||||
_socketHeartbeat?.cancel();
|
||||
_socketHeartbeat = Timer.periodic(const Duration(seconds: 25), (timer) {
|
||||
// [Fix 6] تخطي الإرسال إذا كان stream الموقع نشطاً.
|
||||
// الـ _locSub يرسل update_location عند كل تحرك (كل 5-10 ثوانٍ) تلقائياً.
|
||||
// الـ heartbeat يكون مفيداً فقط عندما يتوقف الـ stream (الجهاز ثابت أو أوقف الخدمة).
|
||||
if (_locSub != null) return;
|
||||
if (socket != null && isSocketConnected && myLocation.latitude != 0) {
|
||||
emitLocationToSocket(myLocation, heading, speed);
|
||||
}
|
||||
@@ -491,6 +514,10 @@ class LocationController extends GetxController with WidgetsBindingObserver {
|
||||
speed = loc.speed ?? 0.0;
|
||||
heading = loc.heading ?? 0.0;
|
||||
|
||||
box.write('last_lat', pos.latitude);
|
||||
box.write('last_lng', pos.longitude);
|
||||
box.write('last_heading', heading);
|
||||
|
||||
if (_lastPosForDistance != null) {
|
||||
final d = _calculateDistance(_lastPosForDistance!, pos);
|
||||
if (d > 5.0) totalDistance += d;
|
||||
@@ -499,10 +526,25 @@ class LocationController extends GetxController with WidgetsBindingObserver {
|
||||
|
||||
update();
|
||||
emitLocationToSocket(pos, heading, speed);
|
||||
|
||||
if (Get.isRegistered<HomeCaptainController>()) {
|
||||
final homeCtrl = Get.find<HomeCaptainController>();
|
||||
if (homeCtrl.isActive &&
|
||||
homeCtrl.mapHomeCaptainController != null &&
|
||||
homeCtrl.isHomeMapActive &&
|
||||
homeCtrl.isMapReadyForCommands) {
|
||||
homeCtrl.mapHomeCaptainController?.animateCamera(
|
||||
CameraUpdate.newLatLngZoom(pos, 17.5),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
await _saveBehaviorIfMoved(pos, now, currentSpeed: speed);
|
||||
}, onError: (e) => Log.print('❌ Location Stream Error: $e'));
|
||||
}
|
||||
|
||||
Timer? _socketWatchdogTimer;
|
||||
|
||||
Future<void> stopLocationUpdates() async {
|
||||
Log.print("🛑 Stopping Location Updates...");
|
||||
|
||||
@@ -511,11 +553,11 @@ class LocationController extends GetxController with WidgetsBindingObserver {
|
||||
_recordTimer?.cancel();
|
||||
_uploadBatchTimer?.cancel();
|
||||
_socketHeartbeat?.cancel();
|
||||
_socketWatchdogTimer?.cancel();
|
||||
|
||||
if (socket != null) {
|
||||
socket!.clearListeners();
|
||||
socket!
|
||||
.dispose(); // استخدام dispose بدلاً من disconnect لضمان تحرير الموارد على iOS
|
||||
socket!.dispose();
|
||||
}
|
||||
|
||||
if (!Platform.isIOS) {
|
||||
@@ -534,6 +576,7 @@ class LocationController extends GetxController with WidgetsBindingObserver {
|
||||
void _startBatchTimers() {
|
||||
_recordTimer?.cancel();
|
||||
_uploadBatchTimer?.cancel();
|
||||
_socketWatchdogTimer?.cancel();
|
||||
|
||||
final recDur =
|
||||
_isPowerSavingMode ? recordIntervalPowerSave : recordIntervalNormal;
|
||||
@@ -544,6 +587,14 @@ class LocationController extends GetxController with WidgetsBindingObserver {
|
||||
_recordTimer =
|
||||
Timer.periodic(recDur, (_) => _recordCurrentLocationToBuffer());
|
||||
_uploadBatchTimer = Timer.periodic(upDur, (_) => _flushBufferToServer());
|
||||
|
||||
// محاولة إعادة الاتصال بالسوكيت إذا انقطع كل 3 ثواني
|
||||
_socketWatchdogTimer = Timer.periodic(const Duration(seconds: 3), (_) {
|
||||
if (!isSocketConnected && !_isInitializingSocket) {
|
||||
Log.print("🔄 Socket Watchdog: Attempting to reconnect socket...");
|
||||
initSocket();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
void _recordCurrentLocationToBuffer() {
|
||||
@@ -736,7 +787,30 @@ class LocationController extends GetxController with WidgetsBindingObserver {
|
||||
Future<LocationData?> getLocation() async {
|
||||
try {
|
||||
if (await _ensureServiceAndPermission()) {
|
||||
return await location.getLocation();
|
||||
final locData = await location.getLocation();
|
||||
if (locData != null && locData.latitude != null && locData.longitude != null) {
|
||||
myLocation = LatLng(locData.latitude!, locData.longitude!);
|
||||
heading = locData.heading ?? 0.0;
|
||||
speed = locData.speed ?? 0.0;
|
||||
|
||||
box.write('last_lat', myLocation.latitude);
|
||||
box.write('last_lng', myLocation.longitude);
|
||||
box.write('last_heading', heading);
|
||||
|
||||
update();
|
||||
|
||||
if (Get.isRegistered<HomeCaptainController>()) {
|
||||
final homeCtrl = Get.find<HomeCaptainController>();
|
||||
if (homeCtrl.mapHomeCaptainController != null &&
|
||||
homeCtrl.isMapReadyForCommands) {
|
||||
Log.print("📍 [LocationController] Animating camera to single location update");
|
||||
homeCtrl.mapHomeCaptainController?.animateCamera(
|
||||
CameraUpdate.newLatLngZoom(myLocation, 17.5),
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
return locData;
|
||||
}
|
||||
} catch (e) {
|
||||
Log.print('❌ FAILED to get single location: $e');
|
||||
|
||||
Reference in New Issue
Block a user