diff --git a/backend/loginJwtDriver.php b/backend/loginJwtDriver.php index 13d71849..56aadf0c 100644 --- a/backend/loginJwtDriver.php +++ b/backend/loginJwtDriver.php @@ -53,47 +53,81 @@ try { $stmt->execute([':id' => $id]); $driver = $stmt->fetch(); - if (!$driver || empty($driver['password'])) { + if (!$driver) { unauthorizedDriver(); } - $decPhone = !empty($driver['phone']) ? $encryptionHelper->decryptData($driver['phone']) : null; - $decNat = !empty($driver['national_number']) ? $encryptionHelper->decryptData($driver['national_number']) : null; + // ── مسار السائقين المسجلين عبر OTP (بدون password في DB) ── + if (empty($driver['password'])) { + // التحقق من هوية السائق عبر fingerprint المخزن في driverToken + if (empty($fingerprint)) { + securityLog("LoginDriver(OTP): no fingerprint sent", [ + 'driver_id' => $driver['id'], + ]); + unauthorizedDriver(); + } - if (empty($decPhone)) { - securityLog("LoginDriver failed: phone decryption returned null", [ - 'driver_id' => $driver['id'] ?? 'unknown', - ]); - unauthorizedDriver(); - } + $stmtFp = $con->prepare('SELECT fingerPrint FROM driverToken WHERE captain_id = :id LIMIT 1'); + $stmtFp->execute([':id' => $driver['id']]); + $fpRow = $stmtFp->fetch(); - // ── المحاولة الأولى: طريقة جديدة (قيم خام) ───────────── - $newParts = [ - $driver['id'], - trim($decPhone), - ]; - if (!empty($decNat)) { - $newParts[] = trim($decNat); - } - $newString = implode('|', $newParts); - $newSecret = hash_hmac('sha256', $newString, $pepper, true); + if (!$fpRow || empty($fpRow['fingerPrint'])) { + securityLog("LoginDriver(OTP): no stored fingerprint found", [ + 'driver_id' => $driver['id'], + ]); + unauthorizedDriver(); + } - if (password_verify($newSecret, $driver['password'])) { - // ✅ صح - طريقة جديدة + $fpPepper = getenv('FP_PEPPER') ?: ''; + $expectedFp = !empty($fpPepper) ? hash('sha256', $fingerprint . $fpPepper) : $fingerprint; + + if (!hash_equals($fpRow['fingerPrint'], $expectedFp)) { + securityLog("LoginDriver(OTP): fingerprint mismatch", [ + 'driver_id' => $driver['id'], + ]); + unauthorizedDriver(); + } + // ✅ تم التحقق عبر fingerprint — نتابع لتوليد JWT } else { - // ── المحاولة الثانية: طريقة قديمة (قيم مشفرة) للتوافق ─ - $oldParts = [ + // ── المسار التقليدي: التحقق عبر password + HMAC ────────── + $decPhone = !empty($driver['phone']) ? $encryptionHelper->decryptData($driver['phone']) : null; + $decNat = !empty($driver['national_number']) ? $encryptionHelper->decryptData($driver['national_number']) : null; + + if (empty($decPhone)) { + securityLog("LoginDriver failed: phone decryption returned null", [ + 'driver_id' => $driver['id'] ?? 'unknown', + ]); + unauthorizedDriver(); + } + + // ── المحاولة الأولى: طريقة جديدة (قيم خام) ───────────── + $newParts = [ $driver['id'], - $encryptionHelper->encryptData(trim($decPhone)), + trim($decPhone), ]; if (!empty($decNat)) { - $oldParts[] = $encryptionHelper->encryptData(trim($decNat)); + $newParts[] = trim($decNat); } - $oldString = implode('|', $oldParts); - $oldSecret = hash_hmac('sha256', $oldString, $pepper, true); + $newString = implode('|', $newParts); + $newSecret = hash_hmac('sha256', $newString, $pepper, true); - if (!password_verify($oldSecret, $driver['password'])) { - unauthorizedDriver(); + if (password_verify($newSecret, $driver['password'])) { + // ✅ صح - طريقة جديدة + } else { + // ── المحاولة الثانية: طريقة قديمة (قيم مشفرة) للتوافق ─ + $oldParts = [ + $driver['id'], + $encryptionHelper->encryptData(trim($decPhone)), + ]; + if (!empty($decNat)) { + $oldParts[] = $encryptionHelper->encryptData(trim($decNat)); + } + $oldString = implode('|', $oldParts); + $oldSecret = hash_hmac('sha256', $oldString, $pepper, true); + + if (!password_verify($oldSecret, $driver['password'])) { + unauthorizedDriver(); + } } } diff --git a/siro_driver/bubble-master/lib/bubble.dart b/siro_driver/bubble-master/lib/bubble.dart index aeab5264..eb5ce121 100755 --- a/siro_driver/bubble-master/lib/bubble.dart +++ b/siro_driver/bubble-master/lib/bubble.dart @@ -21,7 +21,7 @@ class Bubble { /// puts app in background and shows floaty-bubble head Future startBubbleHead({bool sendAppToBackground = true}) async { ByteData bytes = await rootBundle.load( - 'assets/images/logo1.png', + 'assets/images/logo.png', ); var buffer = bytes.buffer; var encodedImage = base64.encode(Uint8List.view(buffer)); diff --git a/siro_driver/lib/controller/auth/captin/login_captin_controller.dart b/siro_driver/lib/controller/auth/captin/login_captin_controller.dart index cfbef3cb..1e722062 100755 --- a/siro_driver/lib/controller/auth/captin/login_captin_controller.dart +++ b/siro_driver/lib/controller/auth/captin/login_captin_controller.dart @@ -55,7 +55,7 @@ class LoginDriverController extends GetxController { void togglePasswordVisibility() { isPasswordHidden = !isPasswordHidden; update([ - 'passwordVisibility' + 'passwordVisibility', ]); // Use a unique ID to only update the password field } @@ -110,8 +110,9 @@ class LoginDriverController extends GetxController { } var res = await CRUD().post( - link: AppLink.isPhoneVerified, - payload: {'phone_number': box.read(BoxName.phoneDriver)}); + link: AppLink.isPhoneVerified, + payload: {'phone_number': box.read(BoxName.phoneDriver)}, + ); if (res != 'failure') { // Get.offAll(() => SyrianCardAI()); @@ -197,13 +198,14 @@ class LoginDriverController extends GetxController { Log.print('Security check passed'); dev = Platform.isAndroid ? 'android' : 'ios'; - var fingerPrint = box.read(BoxName.deviceFingerprint)?.toString() ?? + var fingerPrint = + box.read(BoxName.deviceFingerprint)?.toString() ?? await DeviceHelper.getDeviceFingerprint(); var payload = { 'id': box.read(BoxName.driverID), 'password': AK.passnpassenger, 'aud': '${AK.allowedWallet}$dev', - 'fingerPrint': fingerPrint + 'fingerPrint': fingerPrint, }; var response1 = await http.post( Uri.parse(AppLink.loginJwtWalletDriver), @@ -296,7 +298,8 @@ class LoginDriverController extends GetxController { if (DateTime.now().isBefore(_jwtCooldownUntil)) { Log.print( - '🛑 getJWT: بـ cooldown لمدة ${jwtCooldownRemaining.inSeconds}ث — تخطّي التجديد.'); + '🛑 getJWT: بـ cooldown لمدة ${jwtCooldownRemaining.inSeconds}ث — تخطّي التجديد.', + ); return false; } @@ -310,15 +313,13 @@ class LoginDriverController extends GetxController { 'id': box.read(BoxName.driverID) ?? AK.newId, 'password': AK.passnpassenger, 'aud': '${AK.allowed}$dev', - 'fingerPrint': box.read(BoxName.deviceFingerprint) ?? + 'fingerPrint': + box.read(BoxName.deviceFingerprint) ?? await DeviceHelper.getDeviceFingerprint(), }; var response0 = await http - .post( - Uri.parse(AppLink.loginFirstTimeDriver), - body: payload, - ) + .post(Uri.parse(AppLink.loginFirstTimeDriver), body: payload) .timeout(const Duration(seconds: 30)); if (response0.statusCode == 429) { @@ -356,17 +357,14 @@ class LoginDriverController extends GetxController { var payload = { 'id': box.read(BoxName.driverID), - 'password': box.read(BoxName.emailDriver), 'aud': '${AK.allowed}$dev', - 'fingerPrint': box.read(BoxName.deviceFingerprint) ?? + 'fingerPrint': + box.read(BoxName.deviceFingerprint) ?? await DeviceHelper.getDeviceFingerprint(), }; var response1 = await http - .post( - Uri.parse(AppLink.loginJwtDriver), - body: payload, - ) + .post(Uri.parse(AppLink.loginJwtDriver), body: payload) .timeout(const Duration(seconds: 30)); if (response1.statusCode == 429) { @@ -409,7 +407,8 @@ class LoginDriverController extends GetxController { final seconds = _jwtFailures >= 6 ? 60 : (1 << _jwtFailures); _jwtCooldownUntil = DateTime.now().add(Duration(seconds: seconds)); Log.print( - '❌ getJWT فشل ($reason) — محاولة #$_jwtFailures، cooldown ${seconds}ث'); + '❌ getJWT فشل ($reason) — محاولة #$_jwtFailures، cooldown ${seconds}ث', + ); return false; } @@ -426,9 +425,7 @@ class LoginDriverController extends GetxController { Future updateInvitationCodeFromRegister() async { var res = await CRUD().post( link: AppLink.updateDriverInvitationDirectly, - payload: { - "inviterDriverPhone": box.read(BoxName.phoneDriver).toString(), - }, + payload: {"inviterDriverPhone": box.read(BoxName.phoneDriver).toString()}, ); Log.print('invite: ${res}'); @@ -440,7 +437,11 @@ class LoginDriverController extends GetxController { update(); box.write(BoxName.isInstall, '1'); NotificationController().showNotification( - "Code approved".tr, "Code approved".tr, 'tone2', ''); + "Code approved".tr, + "Code approved".tr, + 'tone2', + '', + ); try { NotificationService.sendNotification( @@ -482,7 +483,9 @@ class LoginDriverController extends GetxController { // Log.print('(BoxName.emailDriver): ${box.read(BoxName.emailDriver)}'); // await getJWT(); var res = await CRUD().get( - link: AppLink.loginFromGoogleCaptin, payload: {'driver_id': driverID}); + link: AppLink.loginFromGoogleCaptin, + payload: {'driver_id': driverID}, + ); Log.print('loginDriver: ${res}'); // ═══════════════════════════════════════════════════════════════ @@ -492,13 +495,16 @@ class LoginDriverController extends GetxController { // ═══════════════════════════════════════════════════════════════ if (res is String && _transientResults.contains(res)) { if (hasLocalVerifiedSession) { - Log.print('⚠️ loginDriver: نتيجة عارضة "$res" مع جلسة محلية صالحة — ' - 'إعادة محاولة بعد تجديد التوكن قسراً.'); + Log.print( + '⚠️ loginDriver: نتيجة عارضة "$res" مع جلسة محلية صالحة — ' + 'إعادة محاولة بعد تجديد التوكن قسراً.', + ); final refreshed = await getJWT(force: true); if (refreshed) { res = await CRUD().get( - link: AppLink.loginFromGoogleCaptin, - payload: {'driver_id': driverID}); + link: AppLink.loginFromGoogleCaptin, + payload: {'driver_id': driverID}, + ); Log.print('loginDriver(retry): $res'); } } @@ -542,14 +548,29 @@ class LoginDriverController extends GetxController { } var d = jsonDecoeded['data'][0]; if (jsonDecoeded.isNotEmpty) { - if (jsonDecoeded['status'] == 'success' && - d['is_verified'].toString() == '1') { + final driverStatus = d['status']?.toString() ?? ''; + final isAccountBlocked = + driverStatus == 'blocked' || + driverStatus == 'banned' || + driverStatus == 'disabled'; + + final isVerifiedUser = + !isAccountBlocked && + (d['is_verified'].toString() == '1' || + d['is_test'].toString() == '1' || + driverStatus == 'actives' || + driverStatus == 'active'); + + if (jsonDecoeded['status'] == 'success' && isVerifiedUser) { box.write(BoxName.emailDriver, d['email']); box.write(BoxName.firstTimeLoadKey, 'false'); box.write(BoxName.driverID, (d['id'])); - box.write(BoxName.isTest, '1'); + box.write( + BoxName.isTest, + d['is_test']?.toString() == '1' ? '1' : '0', + ); box.write(BoxName.gender, (d['gender'])); - box.write(BoxName.phoneVerified, d['is_verified'].toString()); + box.write(BoxName.phoneVerified, '1'); box.write(BoxName.phoneDriver, (d['phone'])); box.write(BoxName.is_claimed, d['is_claimed']); box.write(BoxName.isInstall, d['isInstall']); @@ -560,9 +581,10 @@ class LoginDriverController extends GetxController { box.write(BoxName.bankCodeDriver, (d['bankCode'])); box.write(BoxName.accountBankNumberDriver, (d['accountBank'])); box.write( - BoxName.nameDriver, - '${(d['first_name'])}' - ' ${(d['last_name'])}'); + BoxName.nameDriver, + '${(d['first_name'])}' + ' ${(d['last_name'])}', + ); if (((d['model']).toString().contains('دراجه') || d['make'].toString().contains('دراجه '))) { if ((d['gender']).toString() == 'Male') { @@ -591,7 +613,7 @@ class LoginDriverController extends GetxController { // await getJWT(); // Log.print('🔑 Access token obtained.'); -// add invitations + // add invitations if (box.read(BoxName.isInstall) == null || box.read(BoxName.isInstall).toString() == '0') { updateInvitationCodeFromRegister(); @@ -601,10 +623,9 @@ class LoginDriverController extends GetxController { final driverStatus = d['status'].toString(); if (driverStatus != 'yet' && driverStatus != 'pending_review') { var token = await CRUD().get( - link: AppLink.getDriverToken, - payload: { - 'captain_id': (box.read(BoxName.driverID)).toString() - }); + link: AppLink.getDriverToken, + payload: {'captain_id': (box.read(BoxName.driverID)).toString()}, + ); // print(jsonDecode(token)['data'][0]['token'].toString()); // print(box.read(BoxName.tokenDriver).toString()); // if (box.read(BoxName.emailDriver).toString() != @@ -620,7 +641,8 @@ class LoginDriverController extends GetxController { final fingerprintMismatch = serverFp.isNotEmpty && serverFp != fingerPrint.toString(); Log.print( - '🔍 [FP_COMPARE] serverFp: $serverFp | localFp: ${fingerPrint.toString()} | fingerprintMismatch: $fingerprintMismatch | tokenMismatch: $tokenMismatch | serverToken: $serverToken | storedToken: $storedToken'); + '🔍 [FP_COMPARE] serverFp: $serverFp | localFp: ${fingerPrint.toString()} | fingerprintMismatch: $fingerprintMismatch | tokenMismatch: $tokenMismatch | serverToken: $serverToken | storedToken: $storedToken', + ); if (fingerprintMismatch || tokenMismatch) { Get.defaultDialog( barrierDismissible: false, @@ -640,8 +662,9 @@ class LoginDriverController extends GetxController { phone: d['phone'].toString(), deviceToken: fingerPrint.toString(), token: token.toString(), - ptoken: - jsonDecode(token)['data'][0]['token'].toString(), + ptoken: jsonDecode( + token, + )['data'][0]['token'].toString(), ), ); }, @@ -659,7 +682,8 @@ class LoginDriverController extends GetxController { return true; } else { Get.offAll( - () => DriverVerificationScreen()); // افترض أن هذا الكلاس موجود + () => DriverVerificationScreen(), + ); // افترض أن هذا الكلاس موجود isloading = false; // <--- أضفت هذا update(); // <--- أضفت هذا return false; @@ -688,7 +712,9 @@ class LoginDriverController extends GetxController { // Log.print('(BoxName.emailDriver): ${box.read(BoxName.emailDriver)}'); var res = await CRUD().get( - link: AppLink.loginFromGoogleCaptin, payload: {'driver_id': driverID}); + link: AppLink.loginFromGoogleCaptin, + payload: {'driver_id': driverID}, + ); // print('res is $res'); // if (res == 'failure') { @@ -719,9 +745,10 @@ class LoginDriverController extends GetxController { box.write(BoxName.bankCodeDriver, (d['bankCode'])); box.write(BoxName.accountBankNumberDriver, (d['accountBank'])); box.write( - BoxName.nameDriver, - '${(d['first_name'])}' - ' ${(d['last_name'])}'); + BoxName.nameDriver, + '${(d['first_name'])}' + ' ${(d['last_name'])}', + ); if (((d['model']).toString().contains('دراجه') || d['make'].toString().contains('دراجه '))) { if ((d['gender']).toString() == 'Male') { @@ -782,7 +809,8 @@ class LoginDriverController extends GetxController { }; Log.print( - '🚀 loginUsingCredentialsWithoutGoogle Request URL: ${AppLink.loginUsingCredentialsWithoutGoogle}'); + '🚀 loginUsingCredentialsWithoutGoogle Request URL: ${AppLink.loginUsingCredentialsWithoutGoogle}', + ); Log.print('📦 loginUsingCredentialsWithoutGoogle Payload: $payload'); var response = await http.post( @@ -791,9 +819,11 @@ class LoginDriverController extends GetxController { ); Log.print( - '✅ loginUsingCredentialsWithoutGoogle Status Code: ${response.statusCode}'); + '✅ loginUsingCredentialsWithoutGoogle Status Code: ${response.statusCode}', + ); Log.print( - '📄 loginUsingCredentialsWithoutGoogle Response Body: ${response.body}'); + '📄 loginUsingCredentialsWithoutGoogle Response Body: ${response.body}', + ); if (response.statusCode == 200 || response.statusCode == 201) { var jsonDecoeded = jsonDecode(response.body); @@ -801,25 +831,32 @@ class LoginDriverController extends GetxController { var d = jsonDecoeded['data'][0]; var jwt = jsonDecoeded['jwt']; - // حفظ التوكن أولاً + // حفظ التوكن في FlutterSecureStorage فقط if (jwt != null) { - box.write(BoxName.jwt, c(jwt)); - await storage.write(key: BoxName.jwt, value: c(jwt)); + await storage.write(key: BoxName.jwt, value: jwt); } box.write(BoxName.emailDriver, (d['email'])); box.write(BoxName.driverID, (d['id'])); box.write(BoxName.isTest, '1'); box.write(BoxName.gender, (d['gender'])); - box.write(BoxName.phoneVerified, d['is_verified'].toString()); + final isVerifiedFlag = + (d['is_verified'].toString() == '1' || + d['is_test'].toString() == '1' || + d['status'].toString() == 'actives' || + d['status'].toString() == 'active') + ? '1' + : '0'; + box.write(BoxName.phoneVerified, isVerifiedFlag); box.write(BoxName.phoneDriver, (d['phone'])); box.write(BoxName.nameArabic, (d['name_arabic'])); box.write(BoxName.bankCodeDriver, (d['bankCode'])); box.write(BoxName.accountBankNumberDriver, d['accountBank']); box.write( - BoxName.nameDriver, - '${(d['first_name'])}' - ' ${(d['last_name'])}'); + BoxName.nameDriver, + '${(d['first_name'])}' + ' ${(d['last_name'])}', + ); await storage.write(key: BoxName.fingerPrint, value: fingerPrint); @@ -827,7 +864,8 @@ class LoginDriverController extends GetxController { } else { Log.print('❌ Login failed message: ${jsonDecoeded['message']}'); mySnackbarError( - (jsonDecoeded['message'] ?? 'Login failed').toString().tr); + (jsonDecoeded['message'] ?? 'Login failed').toString().tr, + ); isloading = false; update(); } @@ -852,21 +890,26 @@ class LoginDriverController extends GetxController { void loginByBoxData() async { Get.to(() => HomeCaptain()); - await CRUD().post(link: AppLink.addTokensDriver, payload: { - 'token': box.read(BoxName.tokenDriver).toString(), - 'captain_id': box.read(BoxName.driverID).toString() - }); + await CRUD().post( + link: AppLink.addTokensDriver, + payload: { + 'token': box.read(BoxName.tokenDriver).toString(), + 'captain_id': box.read(BoxName.driverID).toString(), + }, + ); CRUD().post( - link: "${AppLink.seferAlexandriaServer}/ride/firebase/addDriver.php", - payload: { - 'token': box.read(BoxName.tokenDriver), - 'captain_id': box.read(BoxName.driverID).toString() - }); + link: "${AppLink.seferAlexandriaServer}/ride/firebase/addDriver.php", + payload: { + 'token': box.read(BoxName.tokenDriver), + 'captain_id': box.read(BoxName.driverID).toString(), + }, + ); CRUD().post( - link: "${AppLink.seferGizaServer}/ride/firebase/addDriver.php", - payload: { - 'token': box.read(BoxName.tokenDriver), - 'captain_id': box.read(BoxName.driverID).toString() - }); + link: "${AppLink.seferGizaServer}/ride/firebase/addDriver.php", + payload: { + 'token': box.read(BoxName.tokenDriver), + 'captain_id': box.read(BoxName.driverID).toString(), + }, + ); } } diff --git a/siro_driver/lib/controller/auth/syria/registration_controller.dart b/siro_driver/lib/controller/auth/syria/registration_controller.dart index 2c41e64e..c5aaee83 100644 --- a/siro_driver/lib/controller/auth/syria/registration_controller.dart +++ b/siro_driver/lib/controller/auth/syria/registration_controller.dart @@ -371,8 +371,7 @@ class RegistrationController extends GetxController { final uri = Uri.parse(currentUrl); final request = http.MultipartRequest('POST', uri); - final _jwt = box.read(BoxName.jwt); - final String _token = _jwt != null ? r(_jwt).split(AppInformation.addd)[0] : ''; + final String _token = await storage.read(key: BoxName.jwt) ?? ''; String timestamp = DateTime.now().millisecondsSinceEpoch.toString(); String nonce = timestamp; @@ -581,8 +580,8 @@ class RegistrationController extends GetxController { try { // ترويسات مشتركة - final _jwt = box.read(BoxName.jwt); - final bearer = 'Bearer ${_jwt != null ? r(_jwt).split(AppInformation.addd)[0] : ''}'; + final String _jwtToken = await storage.read(key: BoxName.jwt) ?? ''; + final bearer = 'Bearer $_jwtToken'; final hmac = '${box.read(BoxName.hmac)}'; String fingerPrint = diff --git a/siro_driver/lib/controller/firebase/firbase_messge.dart b/siro_driver/lib/controller/firebase/firbase_messge.dart index e4212bff..72338521 100755 --- a/siro_driver/lib/controller/firebase/firbase_messge.dart +++ b/siro_driver/lib/controller/firebase/firbase_messge.dart @@ -233,7 +233,7 @@ class FirebaseMessagesController extends GetxController { case 'token change': case 'TOKEN_CHANGE': - box.remove(BoxName.jwt); + await storage.delete(key: BoxName.jwt); break; case 'face detect': diff --git a/siro_driver/lib/controller/functions/gemeni.dart b/siro_driver/lib/controller/functions/gemeni.dart index a0c582a2..90be9307 100755 --- a/siro_driver/lib/controller/functions/gemeni.dart +++ b/siro_driver/lib/controller/functions/gemeni.dart @@ -479,8 +479,7 @@ class AI extends GetxController { bool isLoadingVehicleFrontSy = false; bool isLoadingVehicleBackSy = false; Future sendToAI(String type, {required File imageFile}) async { - final _jwt = box.read(BoxName.jwt); - final String _token = _jwt != null ? r(_jwt).split(AppInformation.addd)[0] : ''; + final String _token = await storage.read(key: BoxName.jwt) ?? ''; final headers = { 'Authorization': 'Bearer $_token', 'X-HMAC-Auth': '${box.read(BoxName.hmac)}', diff --git a/siro_driver/lib/controller/functions/ocr_controller.dart b/siro_driver/lib/controller/functions/ocr_controller.dart index a65f45ef..5248dfab 100755 --- a/siro_driver/lib/controller/functions/ocr_controller.dart +++ b/siro_driver/lib/controller/functions/ocr_controller.dart @@ -488,7 +488,7 @@ class ScanDocumentsByApi extends GetxController { update(); final String token = - box.read(BoxName.jwt)?.toString().split(AppInformation.addd)[0] ?? ''; + await storage.read(key: BoxName.jwt) ?? ''; final String fingerPrint = box.read(BoxName.deviceFingerprint)?.toString() ?? ''; final String driverID = box.read(BoxName.driverID).toString(); diff --git a/siro_driver/lib/controller/functions/upload_image.dart b/siro_driver/lib/controller/functions/upload_image.dart index 6f1ee4c0..6e2d8012 100755 --- a/siro_driver/lib/controller/functions/upload_image.dart +++ b/siro_driver/lib/controller/functions/upload_image.dart @@ -312,8 +312,7 @@ class ImageController extends GetxController { required String filename, required String methodLabel, }) async { - final jwt = box.read(BoxName.jwt); - final String token = jwt != null ? r(jwt).split(AppInformation.addd)[0] : ''; + final String token = await storage.read(key: BoxName.jwt) ?? ''; final String fingerPrint = box.read(BoxName.deviceFingerprint)?.toString() ?? ''; final int fileSizeBytes = await file.length(); diff --git a/siro_driver/lib/controller/home/captin/home_captain_controller.dart b/siro_driver/lib/controller/home/captin/home_captain_controller.dart index 3564e267..94b28a5a 100755 --- a/siro_driver/lib/controller/home/captin/home_captain_controller.dart +++ b/siro_driver/lib/controller/home/captin/home_captain_controller.dart @@ -939,13 +939,18 @@ class HomeCaptainController extends GetxController { bool isZeroCommissionActive = false; getCountRideToday() async { - var res = await CRUD().get( + var res = await CRUD().getWallet( link: AppLink.getCountRide, payload: {'driver_id': box.read(BoxName.driverID).toString()}); - data = jsonDecode(res); - - countRideToday = data['message'][0]['count'].toString(); - update(); + if (res != 'failure' && res != 'token_expired' && res != 'rate_limited') { + try { + var dataDecoded = res is String ? jsonDecode(res) : res; + if (dataDecoded is Map && dataDecoded['status'] == 'success' && dataDecoded['message'] != null) { + countRideToday = dataDecoded['message'][0]['count'].toString(); + update(); + } + } catch (_) {} + } // Fetch Gamification Streak as well getDriverStreak(); diff --git a/siro_driver/lib/controller/home/profile/complaint_controller.dart b/siro_driver/lib/controller/home/profile/complaint_controller.dart index a322d61e..9978bb94 100644 --- a/siro_driver/lib/controller/home/profile/complaint_controller.dart +++ b/siro_driver/lib/controller/home/profile/complaint_controller.dart @@ -87,8 +87,7 @@ class ComplaintController extends GetxController { var uri = Uri.parse(AppLink.uploadAudio); var request = http.MultipartRequest('POST', uri); - final jwt = box.read(BoxName.jwt); - String token = jwt != null ? r(jwt).toString().split(Env.addd)[0] : ''; + String token = await storage.read(key: BoxName.jwt) ?? ''; final String fingerPrint = box.read(BoxName.deviceFingerprint)?.toString() ?? ''; var mimeType = lookupMimeType(audioFile.path); diff --git a/siro_driver/lib/onbording_page.dart b/siro_driver/lib/onbording_page.dart index c676aee7..9cf0f4e6 100755 --- a/siro_driver/lib/onbording_page.dart +++ b/siro_driver/lib/onbording_page.dart @@ -11,10 +11,15 @@ class CustomSliderOnBoarding extends GetView { @override Widget build(BuildContext context) { + final c = Get.isRegistered() + ? Get.find() + : Get.put(OnBoardingControllerImp()); return PageView.builder( - controller: controller.pageController, + controller: c.pageController, onPageChanged: (val) { - controller.onPageChanged(val); + if (Get.isRegistered()) { + c.onPageChanged(val); + } }, itemCount: onBoardingList.length, itemBuilder: (context, i) => OnBoardingPageContent( diff --git a/siro_driver/lib/views/home/Captin/home_captain/home_captin.dart b/siro_driver/lib/views/home/Captin/home_captain/home_captin.dart index a0ecad78..01a7fa0c 100755 --- a/siro_driver/lib/views/home/Captin/home_captain/home_captin.dart +++ b/siro_driver/lib/views/home/Captin/home_captain/home_captin.dart @@ -115,7 +115,8 @@ class HomeCaptain extends StatelessWidget { const Center( child: Padding( padding: EdgeInsets.only(bottom: 24), - child: Icon(Icons.pin_drop_rounded, size: 48, color: Colors.red), + child: Icon(Icons.pin_drop_rounded, + size: 48, color: Colors.red), ), ), Positioned( @@ -124,7 +125,8 @@ class HomeCaptain extends StatelessWidget { right: 20, child: Card( color: _Token.surfaceCard(context), - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(16)), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(16)), elevation: 10, child: Padding( padding: const EdgeInsets.all(16), @@ -133,7 +135,8 @@ class HomeCaptain extends StatelessWidget { children: [ Text( 'Move map to select destination'.tr, - style: const TextStyle(fontWeight: FontWeight.bold), + style: + const TextStyle(fontWeight: FontWeight.bold), ), const SizedBox(height: 12), Row( @@ -141,10 +144,13 @@ class HomeCaptain extends StatelessWidget { Expanded( child: TextButton( onPressed: () { - destCtrl.isSelectingDestinationOnMap = false; + destCtrl.isSelectingDestinationOnMap = + false; destCtrl.update(); }, - child: Text('Cancel'.tr, style: const TextStyle(color: Colors.grey)), + child: Text('Cancel'.tr, + style: const TextStyle( + color: Colors.grey)), ), ), const SizedBox(width: 12), @@ -152,19 +158,30 @@ class HomeCaptain extends StatelessWidget { child: ElevatedButton( style: ElevatedButton.styleFrom( backgroundColor: AppColor.primaryColor, - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10)), + shape: RoundedRectangleBorder( + borderRadius: + BorderRadius.circular(10)), ), onPressed: () async { - final pickerPos = homeCaptainController.currentCameraPosition?.target ?? - homeCaptainController.mapHomeCaptainController?.cameraPosition?.target; + final pickerPos = homeCaptainController + .currentCameraPosition?.target ?? + homeCaptainController + .mapHomeCaptainController + ?.cameraPosition + ?.target; if (pickerPos != null) { - destCtrl.isSelectingDestinationOnMap = false; + destCtrl.isSelectingDestinationOnMap = + false; destCtrl.update(); - final name = await destCtrl.reverseGeocode(pickerPos); - destCtrl.saveDestination(pickerPos, name); + final name = await destCtrl + .reverseGeocode(pickerPos); + destCtrl.saveDestination( + pickerPos, name); } }, - child: Text('Confirm Location'.tr, style: const TextStyle(color: Colors.white)), + child: Text('Confirm Location'.tr, + style: const TextStyle( + color: Colors.white)), ), ), ], @@ -206,17 +223,18 @@ class _HomeAppBar extends StatelessWidget implements PreferredSizeWidget { title: Padding( padding: const EdgeInsets.only(left: 4), child: Row( + mainAxisSize: MainAxisSize.min, children: [ _LogoBadge(), - const SizedBox(width: 10), - Expanded( + const SizedBox(width: 6), + Flexible( child: Text( AppInformation.appName.split(' ')[0].tr, style: const TextStyle( color: _Token.accent, - fontSize: 20, + fontSize: 18, fontWeight: FontWeight.w800, - letterSpacing: 0.8, + letterSpacing: 0.5, ), overflow: TextOverflow.ellipsis, ), @@ -717,7 +735,7 @@ class _FloatingControls extends StatelessWidget { onTap: () => Bubble().startBubbleHead(sendAppToBackground: true), tooltip: 'Overlay'.tr, - child: Image.asset('assets/images/logo1.png', + child: Image.asset('assets/images/logo.png', width: 26, height: 26), ), const SizedBox(height: 10),