Compare commits
2
Commits
12e70f3d7e
...
92eb7fe25d
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
92eb7fe25d | ||
|
|
1e785061ec |
@@ -67,15 +67,15 @@ $result = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
||||
|
||||
// فك تشفير الحقول الحساسة
|
||||
foreach ($result as &$row) {
|
||||
$row['phone'] = $encryptionHelper->decryptData($row['phone']);
|
||||
$row['email'] = $encryptionHelper->decryptData($row['email']);
|
||||
$row['gender'] = $encryptionHelper->decryptData($row['gender']);
|
||||
$row['birthdate'] = $encryptionHelper->decryptData($row['birthdate']);
|
||||
$row['site'] = $encryptionHelper->decryptData($row['site']);
|
||||
$row['first_name'] = $encryptionHelper->decryptData($row['first_name']);
|
||||
$row['last_name'] = $encryptionHelper->decryptData($row['last_name']);
|
||||
$row['employmentType'] = $encryptionHelper->decryptData($row['employmentType']);
|
||||
$row['maritalStatus'] = $encryptionHelper->decryptData($row['maritalStatus']);
|
||||
$row['phone'] = $encryptionHelper->decryptData($row['phone'] ?? '') ?: ($row['phone'] ?? '');
|
||||
$row['email'] = $encryptionHelper->decryptData($row['email'] ?? '') ?: ($row['email'] ?? '');
|
||||
$row['gender'] = $encryptionHelper->decryptData($row['gender'] ?? '') ?: ($row['gender'] ?? 'unknown yet');
|
||||
$row['birthdate'] = $encryptionHelper->decryptData($row['birthdate'] ?? '') ?: ($row['birthdate'] ?? 'unknown yet');
|
||||
$row['site'] = $encryptionHelper->decryptData($row['site'] ?? '') ?: ($row['site'] ?? 'unknown yet');
|
||||
$row['first_name'] = $encryptionHelper->decryptData($row['first_name'] ?? '') ?: ($row['first_name'] ?? '');
|
||||
$row['last_name'] = $encryptionHelper->decryptData($row['last_name'] ?? '') ?: ($row['last_name'] ?? '');
|
||||
$row['employmentType'] = $encryptionHelper->decryptData($row['employmentType'] ?? '') ?: ($row['employmentType'] ?? 'unknown yet');
|
||||
$row['maritalStatus'] = $encryptionHelper->decryptData($row['maritalStatus'] ?? '') ?: ($row['maritalStatus'] ?? 'unknown yet');
|
||||
}
|
||||
|
||||
$countStmt = $con->query("SELECT COUNT(*) FROM `driver`");
|
||||
|
||||
@@ -44,8 +44,9 @@ class EncryptionHelper
|
||||
}
|
||||
|
||||
// ─── فك تشفير نص (يدعم CBC والـ GCM المستقبلي) ───────────
|
||||
public function decryptData(string $cipherText): string|false
|
||||
public function decryptData(?string $cipherText): string|false
|
||||
{
|
||||
if (empty($cipherText)) return '';
|
||||
// تحقق إن كان مشفر بالنظام الجديد
|
||||
if (str_starts_with($cipherText, self::PREFIX_GCM)) {
|
||||
$raw = base64_decode(substr($cipherText, strlen(self::PREFIX_GCM)), true);
|
||||
|
||||
@@ -51,8 +51,7 @@ class AppLink {
|
||||
case 'Egypt':
|
||||
return 'https://location-egypt.siromove.com/siro/ride/location';
|
||||
case 'Jordan':
|
||||
// TODO: Change to new subdomain when fully migrated
|
||||
return 'https://location.intaleq.xyz/intaleq/ride/location';
|
||||
return 'https://jordan-siro.intaleqapp.com/loction_server/siro/ride/location';
|
||||
default:
|
||||
return 'https://location.siromove.com/siro/ride/location';
|
||||
}
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
import 'dart:io';
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:jwt_decoder/jwt_decoder.dart';
|
||||
import 'package:get/get.dart';
|
||||
@@ -17,10 +19,8 @@ import '../functions/crud.dart';
|
||||
import '../functions/encrypt_decrypt.dart';
|
||||
|
||||
class OtpHelper extends GetxController {
|
||||
static final String _sendOtpUrl =
|
||||
'${AppLink.server}/auth/otp/request.php';
|
||||
static final String _verifyOtpUrl =
|
||||
'${AppLink.server}/auth/otp/verify.php';
|
||||
static final String _sendOtpUrl = '${AppLink.server}/auth/otp/request.php';
|
||||
static final String _verifyOtpUrl = '${AppLink.server}/auth/otp/verify.php';
|
||||
static final String _checkAdminLogin =
|
||||
'${AppLink.server}/Admin/auth/login.php';
|
||||
|
||||
@@ -185,7 +185,13 @@ class OtpHelper extends GetxController {
|
||||
await box.write(BoxName.phoneVerified, true);
|
||||
await box.write('admin_password', password);
|
||||
|
||||
FirebaseMessaging.instance.subscribeToTopic('admin_alerts');
|
||||
if (Platform.isAndroid || Platform.isIOS) {
|
||||
try {
|
||||
FirebaseMessaging.instance.subscribeToTopic('admin_alerts');
|
||||
} catch (e) {
|
||||
Log.print('FCM Subscribe error: $e');
|
||||
}
|
||||
}
|
||||
|
||||
mySnackbarSuccess('تم تسجيل الدخول بنجاح');
|
||||
return true;
|
||||
@@ -241,7 +247,13 @@ class OtpHelper extends GetxController {
|
||||
String token = r(rawJwt.toString()).split(AppInformation.addd)[0];
|
||||
if (!JwtDecoder.isExpired(token)) {
|
||||
Log.print('Valid JWT found, skipping login.php (no OTP needed)');
|
||||
FirebaseMessaging.instance.subscribeToTopic('admin_alerts');
|
||||
if (Platform.isAndroid || Platform.isIOS) {
|
||||
try {
|
||||
FirebaseMessaging.instance.subscribeToTopic('admin_alerts');
|
||||
} catch (e) {
|
||||
Log.print('FCM Subscribe error: $e');
|
||||
}
|
||||
}
|
||||
Get.offAll(() => const AdminHomePage());
|
||||
return;
|
||||
}
|
||||
@@ -279,7 +291,13 @@ class OtpHelper extends GetxController {
|
||||
} else if (response['jwt'] != null) {
|
||||
box.write(BoxName.jwt, c(response['jwt']));
|
||||
}
|
||||
FirebaseMessaging.instance.subscribeToTopic('admin_alerts');
|
||||
if (Platform.isAndroid || Platform.isIOS) {
|
||||
try {
|
||||
FirebaseMessaging.instance.subscribeToTopic('admin_alerts');
|
||||
} catch (e) {
|
||||
Log.print('FCM Subscribe error: $e');
|
||||
}
|
||||
}
|
||||
try {
|
||||
if (Get.isRegistered<DashboardController>()) {
|
||||
Get.find<DashboardController>().getDashBoard();
|
||||
|
||||
@@ -137,6 +137,7 @@ class _StatCard extends StatelessWidget {
|
||||
border: Border.all(color: AppColor.divider),
|
||||
),
|
||||
child: Column(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Row(
|
||||
@@ -150,22 +151,30 @@ class _StatCard extends StatelessWidget {
|
||||
style: const TextStyle(
|
||||
fontSize: 11,
|
||||
color: AppColor.textMuted,
|
||||
fontWeight: FontWeight.w600)),
|
||||
fontWeight: FontWeight.w600),
|
||||
maxLines: 1,
|
||||
overflow: TextOverflow.ellipsis),
|
||||
),
|
||||
],
|
||||
),
|
||||
const SizedBox(height: 8),
|
||||
Text(value,
|
||||
style: const TextStyle(
|
||||
fontSize: 24,
|
||||
fontWeight: FontWeight.w700,
|
||||
color: AppColor.textPrimary)),
|
||||
const SizedBox(height: 4),
|
||||
FittedBox(
|
||||
fit: BoxFit.scaleDown,
|
||||
alignment: Alignment.centerRight,
|
||||
child: Text(value,
|
||||
style: const TextStyle(
|
||||
fontSize: 22,
|
||||
fontWeight: FontWeight.w700,
|
||||
color: AppColor.textPrimary)),
|
||||
),
|
||||
if (sub != null) ...[
|
||||
const SizedBox(height: 4),
|
||||
const SizedBox(height: 2),
|
||||
Text(sub!,
|
||||
style: TextStyle(
|
||||
fontSize: 11,
|
||||
color: subColor ?? AppColor.textSecondary)),
|
||||
fontSize: 10,
|
||||
color: subColor ?? AppColor.textSecondary),
|
||||
maxLines: 1,
|
||||
overflow: TextOverflow.ellipsis),
|
||||
],
|
||||
],
|
||||
),
|
||||
|
||||
@@ -154,15 +154,21 @@ class FirebaseMessagesController extends GetxController {
|
||||
driverToken = myList[14].toString();
|
||||
Get.put(HomeCaptainController(), permanent: true).changeRideId();
|
||||
update();
|
||||
Get.toNamed('/OrderRequestPage', arguments: {
|
||||
'myListString': myListString,
|
||||
'DriverList': myList,
|
||||
'body': body,
|
||||
'is_destination_match': message.data['is_destination_match'] ?? '0',
|
||||
// 🆕 "أرباحك أعلى" — يُرسَل فقط عند وجود فرق إيجابي حقيقي
|
||||
'driver_earnings_extra': message.data['driver_earnings_extra'],
|
||||
'driver_earnings_currency': message.data['driver_earnings_currency'],
|
||||
});
|
||||
|
||||
if (Get.currentRoute != '/OrderRequestPage') {
|
||||
Log.print("🚀 FCM: Navigating to OrderRequestPage...");
|
||||
Get.toNamed('/OrderRequestPage', arguments: {
|
||||
'myListString': myListString,
|
||||
'DriverList': myList,
|
||||
'body': body,
|
||||
'is_destination_match': message.data['is_destination_match'] ?? '0',
|
||||
// 🆕 "أرباحك أعلى" — يُرسَل فقط عند وجود فرق إيجابي حقيقي
|
||||
'driver_earnings_extra': message.data['driver_earnings_extra'],
|
||||
'driver_earnings_currency': message.data['driver_earnings_currency'],
|
||||
});
|
||||
} else {
|
||||
Log.print("⚠️ [FCM] User is already on OrderRequestPage. Skipping navigation.");
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
|
||||
@@ -232,13 +232,20 @@ Future<void> backgroundMessageHandler(RemoteMessage message) async {
|
||||
);
|
||||
|
||||
bool isAppInForeground = box.read(BoxName.isAppInForeground) ?? false;
|
||||
String? currentRideStatus = box.read(BoxName.rideStatus);
|
||||
bool hasActiveRide = (currentRideStatus == 'Begin' ||
|
||||
currentRideStatus == 'Apply' ||
|
||||
currentRideStatus == 'Arrived');
|
||||
|
||||
if (!isAppInForeground) {
|
||||
await TripOverlayPlugin.showOverlay(tripData, autoCloseSeconds: 15);
|
||||
if (!hasActiveRide) {
|
||||
if (!isAppInForeground) {
|
||||
await TripOverlayPlugin.showOverlay(tripData, autoCloseSeconds: 15);
|
||||
}
|
||||
// 🔴 الكتابة على القرص مباشرة بدلاً من الرام لضمان انتقالها للتطبيق 🔴
|
||||
await storage.write(key: 'pending_driver_list', value: myListString);
|
||||
} else {
|
||||
print("⛔ [Background FCM] Ignoring new order overlay - driver is in active ride ($currentRideStatus)");
|
||||
}
|
||||
|
||||
// 🔴 الكتابة على القرص مباشرة بدلاً من الرام لضمان انتقالها للتطبيق 🔴
|
||||
await storage.write(key: 'pending_driver_list', value: myListString);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -31,7 +31,7 @@ class AppLink {
|
||||
case 'Egypt':
|
||||
return 'https://location-egypt.siromove.com/siro/ride/location';
|
||||
case 'Jordan':
|
||||
return 'https://location.intaleq.xyz/intaleq/ride/location';
|
||||
return 'https://jordan-siro.intaleqapp.com/loction_server/siro/ride/location';
|
||||
default:
|
||||
return 'https://location.siromove.com/siro/ride/location';
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user