25-1/28/1

This commit is contained in:
Hamza-Ayed
2025-01-28 01:03:39 +03:00
parent 63681f104c
commit f217b5a34f
102 changed files with 7253 additions and 3945 deletions

View File

@@ -2,6 +2,7 @@ import 'dart:io';
import 'package:SEFER/constant/box_name.dart';
import 'package:SEFER/controller/auth/login_controller.dart';
import 'package:SEFER/controller/functions/encrypt_decrypt.dart';
import 'package:SEFER/main.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
@@ -164,9 +165,11 @@ class GoogleSignInHelper {
static Future<void> _handleSignUp(GoogleSignInAccount user) async {
// Store driver information
box.write(BoxName.passengerID, user.id);
box.write(BoxName.email, user.email);
box.write(BoxName.name, user.displayName);
box.write(BoxName.passengerPhotoUrl, user.photoUrl);
box.write(BoxName.email, encryptionHelper.encryptData(user.email));
box.write(BoxName.name,
encryptionHelper.encryptData(user.displayName.toString()));
box.write(BoxName.passengerPhotoUrl,
encryptionHelper.encryptData(user.photoUrl.toString()));
// Perform any additional sign-up tasks or API calls here
// For example, you can send the user data to your server for registration

View File

@@ -6,6 +6,7 @@ import 'package:SEFER/controller/firebase/firbase_messge.dart';
import 'package:SEFER/controller/functions/add_error.dart';
import 'package:SEFER/views/auth/login_page.dart';
import 'package:SEFER/views/auth/sms_verfy_page.dart';
import 'package:SEFER/views/widgets/mydialoug.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:SEFER/constant/box_name.dart';
@@ -16,6 +17,7 @@ import 'package:SEFER/views/home/map_page_passenger.dart';
import 'package:location/location.dart';
import '../../print.dart';
import '../functions/encrypt_decrypt.dart';
import '../functions/package_info.dart';
class LoginController extends GetxController {
@@ -106,41 +108,56 @@ class LoginController extends GetxController {
box.write(BoxName.validity, d['validity']);
box.write(BoxName.isInstall, d['isInstall'] ?? 'none');
box.write(BoxName.isGiftToken, d['isGiftToken'] ?? 'none');
box.write(BoxName.inviteCode, d['inviteCode'] ?? 'none');
box.write(
BoxName.inviteCode,
encryptionHelper.decryptData(d['inviteCode'].toString()) ??
'none');
var token = await CRUD().get(link: AppLink.getTokens, payload: {
'passengerID': box.read(BoxName.passengerID).toString()
});
if (token != 'failure') {
if (jsonDecode(token)['data'][0]['token'] !=
if (encryptionHelper.decryptData(
jsonDecode(token)['data'][0]['token'].toString()) !=
box.read(BoxName.tokenFCM)) {
Get.put(FirebaseMessagesController()).sendNotificationToDriverMAP(
'token change'.tr,
'change device'.tr,
jsonDecode(token)['data'][0]['token'].toString(),
[],
'cancel.wav',
);
MyDialog().getDialog('change device'.tr, 'token change'.tr,
() async {
List<Future> updatetoken = [
CRUD().post(
link: "${AppLink.server}/ride/firebase/add.php",
payload: {
'token': box.read(BoxName.tokenFCM),
'passengerID': box.read(BoxName.passengerID).toString()
}),
CRUD().post(
link:
"${AppLink.seferAlexandriaServer}/ride/firebase/add.php",
payload: {
'token': box.read(BoxName.tokenFCM),
'passengerID': box.read(BoxName.passengerID).toString()
}),
CRUD().post(
link: "${AppLink.seferGizaServer}/ride/firebase/add.php",
payload: {
'token': box.read(BoxName.tokenFCM),
'passengerID': box.read(BoxName.passengerID).toString()
}),
];
// cameras = await availableCameras();
await Future.wait(updatetoken);
Get.put(FirebaseMessagesController())
.sendNotificationToDriverMAP(
'token change'.tr,
'change device'.tr,
encryptionHelper.decryptData(
jsonDecode(token)['data'][0]['token'].toString()),
[],
'cancel.wav',
);
});
Future.delayed(const Duration(seconds: 1));
await CRUD().post(
link: "${AppLink.server}/ride/firebase/add.php",
payload: {
'token': box.read(BoxName.tokenFCM),
'passengerID': box.read(BoxName.passengerID).toString()
});
CRUD().post(
link:
"${AppLink.seferAlexandriaServer}/ride/firebase/add.php",
payload: {
'token': box.read(BoxName.tokenFCM),
'passengerID': box.read(BoxName.passengerID).toString()
});
CRUD().post(
link: "${AppLink.seferGizaServer}/ride/firebase/add.php",
payload: {
'token': box.read(BoxName.tokenFCM),
'passengerID': box.read(BoxName.passengerID).toString()
});
Get.defaultDialog(
title: 'Device Change Detected'.tr,
middleText:
@@ -158,11 +175,14 @@ class LoginController extends GetxController {
}
} // Logging to check if inviteCode is written correctly
if (box.read(BoxName.inviteCode).toString() != 'none' &&
if (d['inviteCode'] != 'none' &&
d['inviteCode'] != null &&
// box.read(BoxName.inviteCode).toString() != 'none' &&
box.read(BoxName.isInstall).toString() != '1') {
await CRUD()
.post(link: AppLink.updatePassengersInvitation, payload: {
"inviteCode": box.read(BoxName.inviteCode).toString(),
"inviteCode": encryptionHelper
.encryptData(box.read(BoxName.inviteCode).toString()),
"passengerID": box.read(BoxName.passengerID).toString(),
});
Get.defaultDialog(
@@ -174,7 +194,7 @@ class LoginController extends GetxController {
try {
CRUD().post(link: AppLink.addPassengersPromo, payload: {
"promoCode":
'S-${box.read(BoxName.name).toString().split(' ')[0]}',
'S-${encryptionHelper.decryptData(box.read(BoxName.name)).toString().split(' ')[0]}',
"amount": '25',
"passengerID": box.read(BoxName.passengerID).toString(),
"description": 'promo first'

View File

@@ -5,7 +5,7 @@ import 'dart:math';
import 'package:SEFER/constant/colors.dart';
import 'package:SEFER/controller/auth/login_controller.dart';
import 'package:SEFER/controller/functions/add_error.dart';
import 'package:SEFER/controller/local/phone_intel/phone_number.dart';
import 'package:SEFER/controller/functions/encrypt_decrypt.dart';
import 'package:SEFER/views/home/map_page_passenger.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
@@ -143,7 +143,7 @@ class RegisterController extends GetxController {
var responseChecker = await CRUD().post(
link: AppLink.checkPhoneNumberISVerfiedPassenger,
payload: {
'phone_number': phoneNumber,
'phone_number': encryptionHelper.encryptData(phoneNumber),
'email': box.read(BoxName.email),
},
);
@@ -156,7 +156,8 @@ class RegisterController extends GetxController {
Get.snackbar('Phone number is verified before'.tr, '',
backgroundColor: AppColor.greenColor);
box.write(BoxName.isVerified, '1');
box.write(BoxName.phone, phoneNumber);
box.write(
BoxName.phone, encryptionHelper.encryptData(phoneNumber));
Get.offAll(const MapPagePassenger());
} else {
await sendOtp(phoneNumber, randomNumber, isEgyptianNumber,
@@ -192,29 +193,34 @@ class RegisterController extends GetxController {
// Trim any leading or trailing whitespace from the phone number
phoneNumber = phoneNumber.trim();
var dd = await CRUD().post(link: AppLink.sendVerifyOtpMessage, payload: {
'phone_number': phoneNumber,
'token': otp.toString(),
'phone_number': encryptionHelper.encryptData(phoneNumber),
'token': encryptionHelper.encryptData(otp.toString()),
});
Log.print('dd: ${dd}');
if (isEgyptian) {
await CRUD().post(link: AppLink.updatePhoneInvalidSMSPassenger, payload: {
"phone_number": Get.find<RegisterController>().phoneController.text
"phone_number": encryptionHelper
.encryptData(Get.find<RegisterController>().phoneController.text)
});
box.write(BoxName.phoneDriver, phoneController.text);
var nameParts = box.read(BoxName.name).toString().split(' ');
box.write(
BoxName.phone, encryptionHelper.encryptData(phoneController.text));
var nameParts = encryptionHelper
.decryptData(box.read(BoxName.name))
.toString()
.split(' ');
var firstName = nameParts.isNotEmpty ? nameParts[0] : 'unknown';
var lastName = nameParts.length > 1 ? nameParts[1] : 'unknown';
var payload = {
'id': box.read(BoxName.passengerID),
'phone': phoneController.text,
'phone': encryptionHelper.decryptData(phoneController.text),
'email': box.read(BoxName.email),
'password': 'unknown',
'gender': 'unknown',
'password': encryptionHelper.encryptData('unknown'),
'gender': encryptionHelper.encryptData('unknown'),
'birthdate': '2002-01-01',
'site': box.read(BoxName.passengerPhotoUrl) ?? 'unknown',
'first_name': firstName,
'last_name': lastName,
'first_name': encryptionHelper.encryptData(firstName),
'last_name': encryptionHelper.encryptData(lastName),
};
var res1 = await CRUD().post(
@@ -223,18 +229,24 @@ class RegisterController extends GetxController {
);
if (res1 != 'failure') {
await CRUD().post(
link: '${AppLink.seferAlexandriaServer}/auth/signup.php',
payload: payload,
);
await CRUD().post(
link: '${AppLink.seferGizaServer}/auth/signup.php',
payload: payload,
);
if (AppLink.seferAlexandriaServer != AppLink.seferCairoServer) {
List<Future> signUp = [
CRUD().post(
link: '${AppLink.seferAlexandriaServer}/auth/signup.php',
payload: payload,
),
CRUD().post(
link: '${AppLink.seferGizaServer}/auth/signup.php',
payload: payload,
)
];
await Future.wait(signUp);
}
box.write(BoxName.isVerified, '1');
box.write(BoxName.isFirstTime, '0');
box.write(BoxName.phone, phoneController.text);
box.write(
BoxName.phone, encryptionHelper.encryptData(phoneController.text));
Get.put(LoginController()).loginUsingCredentials(
box.read(BoxName.passengerID).toString(),
@@ -257,19 +269,23 @@ class RegisterController extends GetxController {
try {
if (formKey3.currentState!.validate()) {
var res = await CRUD().post(link: AppLink.verifyOtpMessage, payload: {
'phone_number': phoneController.text,
'token': verifyCode.text.toString(),
'phone_number': encryptionHelper.encryptData(phoneController.text),
'token': encryptionHelper.encryptData(verifyCode.text.toString()),
});
if (res != 'failure') {
box.write(BoxName.phoneDriver, phoneController.text);
var nameParts = box.read(BoxName.name).toString().split(' ');
box.write(BoxName.phone,
encryptionHelper.encryptData(phoneController.text));
var nameParts = encryptionHelper
.decryptData(box.read(BoxName.name))
.toString()
.split(' ');
var firstName = nameParts.isNotEmpty ? nameParts[0] : 'unknown';
var lastName = nameParts.length > 1 ? nameParts[1] : 'unknown';
var payload = {
'id': box.read(BoxName.passengerID),
'phone': phoneController.text,
'phone': encryptionHelper.decryptData(phoneController.text),
'email': box.read(BoxName.email),
'password': 'unknown',
'gender': 'unknown',
@@ -285,18 +301,24 @@ class RegisterController extends GetxController {
);
if (res1 != 'failure') {
await CRUD().post(
link: '${AppLink.seferAlexandriaServer}/auth/signup.php',
payload: payload,
);
await CRUD().post(
link: '${AppLink.seferGizaServer}/auth/signup.php',
payload: payload,
);
if (AppLink.seferAlexandriaServer != AppLink.seferCairoServer) {
List<Future> signUp = [
CRUD().post(
link: '${AppLink.seferAlexandriaServer}/auth/signup.php',
payload: payload,
),
CRUD().post(
link: '${AppLink.seferGizaServer}/auth/signup.php',
payload: payload,
)
];
await Future.wait(signUp);
}
box.write(BoxName.isVerified, '1');
box.write(BoxName.isFirstTime, '0');
box.write(BoxName.phone, phoneController.text);
box.write(BoxName.phone,
encryptionHelper.decryptData(phoneController.text));
Get.put(LoginController()).loginUsingCredentials(
box.read(BoxName.passengerID).toString(),

View File

@@ -6,6 +6,7 @@ import 'package:http/http.dart' as http;
import '../../constant/box_name.dart';
import '../../constant/links.dart';
import '../../main.dart';
import '../functions/encrypt_decrypt.dart';
class TokenController extends GetxController {
bool isloading = false;
@@ -22,7 +23,8 @@ class TokenController extends GetxController {
'Basic ${base64Encode(utf8.encode(basicAuthCredentials.toString()))}',
},
body: {
'token': box.read(BoxName.tokenFCM.toString()),
'token':
encryptionHelper.decryptData(box.read(BoxName.tokenFCM.toString())),
'passengerID': box.read(BoxName.passengerID).toString()
},
);

View File

@@ -1,5 +1,6 @@
import 'dart:convert';
import 'dart:io';
import 'package:SEFER/controller/functions/encrypt_decrypt.dart';
import 'package:firebase_messaging/firebase_messaging.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
@@ -93,7 +94,8 @@ class FirebaseMessagesController extends GetxController {
Future getToken() async {
fcmToken.getToken().then((token) {
box.write(BoxName.tokenFCM, token);
box.write(
BoxName.tokenFCM, encryptionHelper.encryptData(token.toString()));
});
FirebaseMessaging.onMessage.listen((RemoteMessage message) {
@@ -166,7 +168,8 @@ class FirebaseMessagesController extends GetxController {
'token change'.tr, 'token change'.tr, 'cancel');
}
GoogleSignInHelper.signOut();
} else if (message.notification!.title! == 'Driver Is Going To Passenger'.tr) {
} else if (message.notification!.title! ==
'Driver Is Going To Passenger'.tr) {
Get.find<MapPassengerController>().isDriverInPassengerWay = true;
Get.find<MapPassengerController>().update();
if (Platform.isAndroid) {

View File

@@ -30,7 +30,9 @@ class CRUD {
'Basic ${base64Encode(utf8.encode(AK.basicAuthCredentials.toString()))}',
},
);
// Log.print('req: ${response.request}');
// Log.print('response: ${response.body}');
// Log.print('payload: ${payload}');
// if (response.statusCode == 200) {
var jsonData = jsonDecode(response.body);
if (jsonData['status'] == 'success') {
@@ -40,6 +42,46 @@ class CRUD {
return jsonData['status'];
}
Future<dynamic> post({
required String link,
Map<String, dynamic>? payload,
}) async {
var url = Uri.parse(link);
try {
var response = await http.post(
url,
body: payload,
headers: {
"Content-Type": "application/x-www-form-urlencoded",
'Authorization':
'Basic ${base64Encode(utf8.encode(AK.basicAuthCredentials))}',
},
);
if (response.statusCode == 200) {
try {
var jsonData = jsonDecode(response.body);
if (jsonData['status'] == 'success') {
return jsonData;
} else {
return jsonData['status'];
}
} catch (e) {
addError(e.toString(), 'crud().post');
return 'failure'; // Return a recognizable failure string for JSON errors
}
} else {
addError(
'Non-200 response code: ${response.statusCode}', 'crud().post');
return 'failure'; // Handle unexpected status codes as failures
}
} catch (e) {
addError('HTTP request error: $e', 'crud().post');
return 'failure'; // Handle HTTP request errors as failures
}
}
Future<dynamic> getTokenParent({
required String link,
Map<String, dynamic>? payload,
@@ -298,45 +340,6 @@ class CRUD {
// return response.statusCode;
// }
// }
Future<dynamic> post({
required String link,
Map<String, dynamic>? payload,
}) async {
var url = Uri.parse(link);
try {
var response = await http.post(
url,
body: payload,
headers: {
"Content-Type": "application/x-www-form-urlencoded",
'Authorization':
'Basic ${base64Encode(utf8.encode(AK.basicAuthCredentials))}',
},
);
if (response.statusCode == 200) {
try {
var jsonData = jsonDecode(response.body);
if (jsonData['status'] == 'success') {
return jsonData;
} else {
return jsonData['status'];
}
} catch (e) {
addError(e.toString(), 'crud().post');
return 'failure'; // Return a recognizable failure string for JSON errors
}
} else {
addError(
'Non-200 response code: ${response.statusCode}', 'crud().post');
return 'failure'; // Handle unexpected status codes as failures
}
} catch (e) {
addError('HTTP request error: $e', 'crud().post');
return 'failure'; // Handle HTTP request errors as failures
}
}
Future<dynamic> postPayMob({
required String link,

View File

@@ -0,0 +1,52 @@
import 'package:encrypt/encrypt.dart' as encrypt;
import 'package:flutter/foundation.dart';
import '../../env/env.dart';
var secretKey = Env.keyOfApp
.toString()
.split('XrXlBl')[0]; // Must be 16 characters for AES-128
String initializationVector = Env.initializationVector; // Must be 16 characters
final encryptionHelper = EncryptionHelper(
secretKey: secretKey,
initializationVector: initializationVector,
);
class EncryptionHelper {
final encrypt.Key key;
final encrypt.IV iv;
EncryptionHelper(
{required String secretKey, required String initializationVector})
: key = encrypt.Key.fromUtf8(secretKey),
iv = encrypt.IV.fromUtf8(initializationVector);
// Initialize the helper
/// Encrypts the given plain text
String encryptData(String plainText) {
try {
final encrypter = encrypt.Encrypter(encrypt.AES(key,
mode: encrypt.AESMode.cbc)); // Explicitly use CBC mode
final encrypted = encrypter.encrypt(plainText, iv: iv);
return encrypted.base64;
} catch (e) {
debugPrint('Encryption Error: $e');
return '';
}
}
/// Decrypts the given encrypted text
String decryptData(String encryptedText) {
try {
final encrypter = encrypt.Encrypter(encrypt.AES(key,
mode: encrypt.AESMode.cbc)); // Explicitly use CBC mode
final encrypted = encrypt.Encrypted.fromBase64(encryptedText);
final decrypted = encrypter.decrypt(encrypted, iv: iv);
return decrypted;
} catch (e) {
debugPrint('Decryption Error: $e');
return '';
}
}
}

View File

@@ -1,64 +0,0 @@
// import 'dart:async';
// import 'package:background_location/background_location.dart';
// import 'package:get/get.dart';
// import 'package:permission_handler/permission_handler.dart';
// class LocationBackgroundController extends GetxController {
// @override
// void onInit() {
// super.onInit();
// requestLocationPermission();
// configureBackgroundLocation();
// }
// Future<void> requestLocationPermission() async {
// var status = await Permission.locationAlways.status;
// if (!status.isGranted) {
// await Permission.locationAlways.request();
// }
// }
// Future<void> configureBackgroundLocation() async {
// await BackgroundLocation.setAndroidNotification(
// title: "Background Location",
// message: "Tracking location...",
// icon: "@mipmap/ic_launcher",
// );
// BackgroundLocation.setAndroidConfiguration(1000);
// BackgroundLocation.startLocationService();
// BackgroundLocation.getLocationUpdates((location) {
// // Handle location updates here
// });
// }
// startBackLocation() async {
// Timer.periodic(const Duration(seconds: 5), (timer) {
// getBackgroundLocation();
// });
// }
// getBackgroundLocation() async {
// var status = await Permission.locationAlways.status;
// if (status.isGranted) {
// await BackgroundLocation.startLocationService(
// distanceFilter: 20, forceAndroidLocationManager: true);
// BackgroundLocation.setAndroidConfiguration(
// Duration.microsecondsPerSecond); // Set interval to 5 seconds
// BackgroundLocation.getLocationUpdates((location1) {
// Latitude: ${location1.latitude.toString()}
// Longitude: ${location1.longitude.toString()}
// Altitude: ${location1.altitude.toString()}
// Accuracy: ${location1.accuracy.toString()}
// Bearing: ${location1.bearing.toString()}
// Speed: ${location1.speed.toString()}
// ''');
// });
// } else {
// await Permission.locationAlways.request();
// }
// }
// }

View File

@@ -1,10 +1,13 @@
import 'dart:convert';
import 'package:SEFER/constant/box_name.dart';
import 'package:flutter_secure_storage/flutter_secure_storage.dart';
import '../../constant/links.dart';
import '../../main.dart';
import '../../print.dart';
import 'crud.dart';
import 'encrypt_decrypt.dart';
class SecureStorage {
final FlutterSecureStorage _storage = const FlutterSecureStorage();
@@ -28,31 +31,47 @@ const List<String> keysToFetch = [
];
class AppInitializer {
// final FlutterSecureStorage _storage = const FlutterSecureStorage();
List<Map<String, dynamic>> links = [];
Future<void> initializeApp() async {
// Check if app is running for the first time
// Loop through the keys and fetch their values
for (String key in keysToFetch) {
try {
String? value = await getKey(key); // Fetch from server
if (value != null) {
await box.write(key, value); // Save securely
}
} catch (e) {}
}
await getKey();
await getAIKey('FCM_PRIVATE_KEY');
}
Future<String?> getKey(String key) async {
getAIKey(String key) async {
var res =
await CRUD().get(link: AppLink.getapiKey, payload: {"keyName": key});
if (res != 'failure') {
try {
var data = jsonDecode(res)['message'];
return data[key]?.toString();
} catch (e) {}
var d = jsonDecode(res)['message'];
storage.write(key: 'FCM_PRIVATE_KEY', value: d[key].toString());
// return d[key].toString();
} else {}
}
Future<void> getKey() async {
try {
var res =
await CRUD().get(link: AppLink.getLocationAreaLinks, payload: {});
// Log.print('res: ${res}');
if (res != 'failure') {
links = List<Map<String, dynamic>>.from(jsonDecode(res)['message']);
await box.remove(BoxName.locationName);
await box.remove(BoxName.basicLink);
await box.remove(links[4]['name']);
await box.remove(links[1]['name']);
await box.remove(links[2]['name']);
await box.write(BoxName.locationName, links);
await box.write(BoxName.basicLink,
encryptionHelper.decryptData(links[0]['server_link']));
await box.write(links[2]['name'],
encryptionHelper.decryptData(links[2]['server_link']));
await box.write(links[1]['name'],
encryptionHelper.decryptData(links[1]['server_link']));
await box.write(BoxName.paymentLink,
encryptionHelper.decryptData(links[4]['server_link']));
}
} catch (e) {
print('Error fetching or decoding location data: $e');
}
return null;
}
}

View File

@@ -5,6 +5,7 @@ import 'dart:math' as math;
import 'dart:ui';
import 'package:SEFER/constant/univeries_polygon.dart';
import 'package:SEFER/controller/firebase/local_notification.dart';
import 'package:SEFER/controller/functions/encrypt_decrypt.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter_confetti/flutter_confetti.dart';
import 'package:vector_math/vector_math.dart' show radians, degrees;
@@ -542,12 +543,12 @@ class MapPassengerController extends GetxController {
void sendSMS(String to) async {
// Get the driver's phone number.
String driverPhone =
dataCarsLocationByPassenger['message'][carsOrder]['phone'].toString();
String driverPhone = encryptionHelper.decryptData(
dataCarsLocationByPassenger['message'][carsOrder]['phone'].toString());
// Format the message.
String message =
'Hi! This is ${box.read(BoxName.name)}.\n I am using ${box.read(AppInformation.appName)} to ride with $passengerName as the driver. $passengerName \nis driving a $model\n with license plate $licensePlate.\n I am currently located at $passengerLocation.\n If you need to reach me, please contact the driver directly at\n\n $driverPhone.';
'Hi! This is ${encryptionHelper.decryptData(box.read(BoxName.name).toString().split(' ')[0]).toString()}.\n I am using ${box.read(AppInformation.appName)} to ride with $passengerName as the driver. $passengerName \nis driving a $model\n with license plate $licensePlate.\n I am currently located at $passengerLocation.\n If you need to reach me, please contact the driver directly at\n\n $driverPhone.';
// Launch the URL to send the SMS.
launchCommunication('sms', to, message);
@@ -559,7 +560,7 @@ class MapPassengerController extends GetxController {
// Format the message.
String message =
'${'${'Hi! This is'.tr} ${box.read(BoxName.name)}.\n${' I am using'.tr}'} ${AppInformation.appName}${' to ride with'.tr} $passengerName${' as the driver.'.tr} $passengerName \n${'is driving a '.tr}$model\n${' with license plate '.tr}$licensePlate.\n${' I am currently located at '.tr} https://www.google.com/maps/place/${passengerLocation.latitude},${passengerLocation.longitude}.\n${' If you need to reach me, please contact the driver directly at'.tr}\n\n $driverPhone.';
'${'${'Hi! This is'.tr} ${encryptionHelper.decryptData(box.read(BoxName.name).toString().split(' ')[0]).toString()}.\n${' I am using'.tr}'} ${AppInformation.appName}${' to ride with'.tr} $passengerName${' as the driver.'.tr} $passengerName \n${'is driving a '.tr}$model\n${' with license plate '.tr}$licensePlate.\n${' I am currently located at '.tr} https://www.google.com/maps/place/${passengerLocation.latitude},${passengerLocation.longitude}.\n${' If you need to reach me, please contact the driver directly at'.tr}\n\n $driverPhone.';
// Launch the URL to send the WhatsApp message.
launchCommunication('whatsapp', to, message);
@@ -1958,7 +1959,7 @@ class MapPassengerController extends GetxController {
FirebaseMessagesController().sendNotificationToDriverMAP(
'Order'.tr,
endNameAddress,
driverData['token'].toString(),
encryptionHelper.decryptData(driverData['token'].toString()),
body,
'order.wav');
}
@@ -1979,13 +1980,15 @@ class MapPassengerController extends GetxController {
distance.toStringAsFixed(2),
driverData['driver_id'].toString(),
box.read(BoxName.passengerID).toString(),
box.read(BoxName.name).toString(),
box.read(BoxName.tokenFCM).toString(),
box.read(BoxName.phone).toString(),
encryptionHelper
.decryptData(box.read(BoxName.name).toString().split(' ')[0])
.toString(),
encryptionHelper.decryptData(box.read(BoxName.tokenFCM).toString()),
encryptionHelper.decryptData(box.read(BoxName.phone).toString()),
durationToPassenger.toStringAsFixed(0) ?? '120',
distanceByPassenger.toString() ?? '2000',
paymentController.isWalletChecked.toString(),
driverData['token'].toString(),
encryptionHelper.decryptData(driverData['token'].toString()),
durationToPassenger.toString(),
rideId.toString(),
rideTimerBegin.toString(),
@@ -2183,16 +2186,19 @@ class MapPassengerController extends GetxController {
var response = jsonDecode(res);
Log.print('getUpdatedRideForDriverApply: $response');
driverId = response['data']['driver_id'];
driverPhone = response['data']['phone'];
driverPhone = encryptionHelper.decryptData(response['data']['phone']);
driverCarMake = response['data']['make'];
model = response['data']['model'];
colorHex = response['data']['color_hex'];
carColor = response['data']['color'];
make = response['data']['make'];
licensePlate = response['data']['car_plate'];
passengerName = response['data']['passengerName'];
driverName = response['data']['driverName'].toString();
driverToken = response['data']['token'];
licensePlate =
encryptionHelper.decryptData(response['data']['car_plate']);
passengerName =
encryptionHelper.decryptData(response['data']['passengerName']);
driverName = encryptionHelper
.decryptData(response['data']['driverName'].toString());
driverToken = encryptionHelper.decryptData(response['data']['token']);
// Log.print('driverToken updated: $driverToken');
carYear = response['data']['year'];
driverRate = response['data']['ratingDriver'].toString();
@@ -2420,31 +2426,69 @@ class MapPassengerController extends GetxController {
}
String getLocationArea(double latitude, double longitude) {
if (latitude >= 29.918901 &&
latitude <= 30.198857 &&
longitude >= 31.215009 &&
longitude <= 31.532186) {
box.write(BoxName.serverChosen, AppLink.seferCairoServer);
final locations = box.read(BoxName.locationName) ?? [];
for (final location in locations) {
final locationData = location as Map<String, dynamic>;
return 'Cairo';
} else if (latitude >= 29.904975 &&
latitude <= 30.143372 &&
longitude >= 30.787030 &&
longitude <= 31.215009) {
box.write(BoxName.serverChosen, AppLink.seferGizaServer);
return 'Giza';
} else if (latitude >= 30.396286 &&
latitude <= 31.654458 &&
longitude >= 29.041139 &&
longitude <= 32.626259) {
box.write(BoxName.serverChosen, AppLink.seferAlexandriaServer);
return 'Alexandria';
} else {
box.write(BoxName.serverChosen, AppLink.seferCairoServer);
return 'Cairo';
// Debugging: Print location data
// print('Location Data: $locationData');
// Convert string values to double
final minLatitude =
double.tryParse(locationData['min_latitude'].toString()) ?? 0.0;
final maxLatitude =
double.tryParse(locationData['max_latitude'].toString()) ?? 0.0;
final minLongitude =
double.tryParse(locationData['min_longitude'].toString()) ?? 0.0;
final maxLongitude =
double.tryParse(locationData['max_longitude'].toString()) ?? 0.0;
// Debugging: Print converted values
print(
'Converted Values: minLatitude=$minLatitude, maxLatitude=$maxLatitude, minLongitude=$minLongitude, maxLongitude=$maxLongitude');
if (latitude >= minLatitude &&
latitude <= maxLatitude &&
longitude >= minLongitude &&
longitude <= maxLongitude) {
box.write(BoxName.serverChosen,
encryptionHelper.decryptData(locationData['server_link']));
// Log.print(
// 'locationData----server_link: ${encryptionHelper.decryptData(locationData['server_link'])}');
return locationData['name'];
}
}
// Default case
box.write(BoxName.serverChosen, AppLink.seferCairoServer);
return 'Cairo';
}
// if (latitude >= 29.918901 &&
// latitude <= 30.198857 &&
// longitude >= 31.215009 &&
// longitude <= 31.532186) {
// box.write(BoxName.serverChosen, AppLink.seferCairoServer);
// return 'Cairo';
// } else if (latitude >= 29.904975 &&
// latitude <= 30.143372 &&
// longitude >= 30.787030 &&
// longitude <= 31.215009) {
// box.write(BoxName.serverChosen, AppLink.seferGizaServer);
// return 'Giza';
// } else if (latitude >= 30.396286 &&
// latitude <= 31.654458 &&
// longitude >= 29.041139 &&
// longitude <= 32.626259) {
// box.write(BoxName.serverChosen, AppLink.seferAlexandriaServer);
// return 'Alexandria';
// } else {
// box.write(BoxName.serverChosen, AppLink.seferCairoServer);
// return 'Cairo';
// }
// }
Future<bool> getCarsLocationByPassengerAndReloadMarker(
String carType, int boundIncreaseStep) async {
// if (statusRide == 'wait') {
@@ -2565,7 +2609,7 @@ class MapPassengerController extends GetxController {
_getIconForCar(json),
);
driversToken.add(json['token']);
driversToken.add(encryptionHelper.decryptData(json['token']));
}
// Add fake car markers
@@ -2845,7 +2889,7 @@ class MapPassengerController extends GetxController {
style: AppStyle.title,
),
Text(
"Send Sefer app to him".tr,
"Send SPEED app to him".tr,
style: AppStyle.title.copyWith(color: AppColor.greenColor),
)
],
@@ -2859,7 +2903,7 @@ class MapPassengerController extends GetxController {
: '+962${box.read(BoxName.sosPhonePassenger)}';
var message = '''Dear ,
🚀 I have just started an exciting trip and I would like to share the details of my journey and my current location with you in real-time! Please download the SEFER app. It will allow you to view my trip details and my latest location.
🚀 I have just started an exciting trip and I would like to share the details of my journey and my current location with you in real-time! Please download the SPEED app. It will allow you to view my trip details and my latest location.
👉 Download link:
Android [https://play.google.com/store/apps/details?id=com.mobileapp.store.ride]
@@ -2867,7 +2911,7 @@ class MapPassengerController extends GetxController {
I look forward to keeping you close during my adventure!
SEFER ,'''
SPEED ,'''
.tr;
launchCommunication('whatsapp', phone, message);
}),
@@ -2877,7 +2921,7 @@ class MapPassengerController extends GetxController {
Get.back();
}));
} else if (res1['status'] == 'success') {
var tokenParent = res1['data'][0]['token'];
var tokenParent = encryptionHelper.decryptData(res1['data'][0]['token']);
Get.snackbar("The invitation was sent successfully".tr, '',
backgroundColor: AppColor.greenColor);
FirebaseMessagesController().sendNotificationToPassengerToken(
@@ -3160,7 +3204,7 @@ class MapPassengerController extends GetxController {
} else {
isMainBottomMenuMap = !isMainBottomMenuMap;
mainBottomMenuMapHeight =
isMainBottomMenuMap == true ? Get.height * .2 : Get.height * .7;
isMainBottomMenuMap == true ? Get.height * .2 : Get.height * .6;
isWayPointSheet = false;
if (heightMenuBool == true) {
getDrawerMenu();
@@ -3646,18 +3690,6 @@ class MapPassengerController extends GetxController {
update();
}
// LatLngBounds calculateBounds(double lat, double lng, double radiusInMeters) {
// const double earthRadius = 6378137.0; // Earth's radius in meters
// double latDelta = radiusInMeters / earthRadius * (180 / pi);
// double lngDelta =
// radiusInMeters / (earthRadius * cos(pi * lat / 180)) * (180 / pi);
// return LatLngBounds(
// southwest: LatLng(lat - latDelta, lng - lngDelta),
// northeast: LatLng(lat + latDelta, lng + lngDelta),
// );
// }
LatLngBounds calculateBounds(double lat, double lng, double radiusInMeters) {
const double earthRadius = 6378137.0; // Earth's radius in meters
@@ -4018,8 +4050,14 @@ class MapPassengerController extends GetxController {
late LatLngBounds boundsData;
late String startNameAddress = '';
late String endNameAddress = '';
List<Map<String, dynamic>> stopPoints = [];
void removeStop(Map<String, dynamic> stop) {
stopPoints.remove(stop);
update(); // Trigger a rebuild of the UI
}
getDirectionMap(String origin, destination) async {
getDirectionMap(String origin, destination,
[List<String> waypoints = const []]) async {
isLoading = true;
update();
remainingTime = 25; //to make cancel every call
@@ -4039,7 +4077,10 @@ class MapPassengerController extends GetxController {
update();
var url =
('${AppLink.googleMapsLink}directions/json?&language=${box.read(BoxName.lang) ?? 'ar'}&avoid=tolls|ferries&destination=$destination&origin=$origin&key=${AK.mapAPIKEY}');
if (waypoints.isNotEmpty) {
String formattedWaypoints = waypoints.join('|');
url += '&waypoints=$formattedWaypoints';
}
var response = await CRUD().getGoogleApi(link: url, payload: {});
data = response['routes'][0]['legs'];
box.remove(BoxName.tripData);
@@ -5095,7 +5136,7 @@ class MapPassengerController extends GetxController {
await FirebaseMessagesController().sendNotificationToDriverMAP(
'OrderVIP',
rideId.toString(),
driver['token'].toString(),
encryptionHelper.decryptData(driver['token'].toString()),
[
id,
rideId,
@@ -5103,13 +5144,15 @@ class MapPassengerController extends GetxController {
passengerLocation.latitude.toString(),
startNameAddress.toString(),
passengerLocation.longitude.toString(),
box.read(BoxName.name).toString(),
encryptionHelper
.decryptData(box.read(BoxName.name).toString().split(' ')[0])
.toString(),
box.read(BoxName.passengerID).toString(),
box.read(BoxName.phone).toString(),
box.read(BoxName.email).toString(),
box.read(BoxName.passengerPhotoUrl).toString(),
box.read(BoxName.tokenFCM).toString(),
driver['token'].toString(),
encryptionHelper.decryptData(driver['token'].toString()),
],
'order.wav');
if (response['message'] == "Trip updated successfully") {

View File

@@ -4,6 +4,7 @@ import 'package:SEFER/constant/box_name.dart';
import 'package:SEFER/constant/colors.dart';
import 'package:SEFER/constant/links.dart';
import 'package:SEFER/controller/functions/crud.dart';
import 'package:SEFER/controller/functions/encrypt_decrypt.dart';
import 'package:SEFER/controller/payment/payment_controller.dart';
import 'package:flutter/material.dart';
import 'package:flutter_contacts/flutter_contacts.dart';
@@ -38,9 +39,9 @@ class InviteController extends GetxController {
Future<void> shareDriverCode() async {
if (driverCouponCode != null) {
final String shareText = '''
Join SEFER as a driver using my referral code!
Join SWIFTI as a driver using my referral code!
Use code: $driverCouponCode
Download the SEFER Driver app now and earn rewards!
Download the SWIFTI Driver app now and earn rewards!
''';
await Share.share(shareText);
}
@@ -49,9 +50,9 @@ Download the SEFER Driver app now and earn rewards!
Future<void> sharePassengerCode() async {
if (couponCode != null) {
final String shareText = '''
Get a discount on your first SEFER ride!
Get a discount on your first SWIFTI ride!
Use my referral code: $couponCode
Download the SEFER app now and enjoy your ride!
Download the SWIFTI app now and enjoy your ride!
''';
await Share.share(shareText);
}
@@ -175,12 +176,17 @@ Download the SEFER app now and enjoy your ride!
void onSelectPassengerInvitation(int index) async {
MyDialog().getDialog(
driverInvitationDataToPassengers[index]['countOfInvitDriver'] < 2
? '${'When'.tr} ${driverInvitationDataToPassengers[index]['passengerName']} ${"complete, you can claim your gift".tr} '
int.parse(driverInvitationDataToPassengers[index]['countOfInvitDriver']
.toString()) <
2
? '${'When'.tr} ${encryptionHelper.decryptData(driverInvitationDataToPassengers[index]['passengerName'].toString())} ${"complete, you can claim your gift".tr} '
: 'You deserve the gift'.tr,
'${driverInvitationDataToPassengers[index]['passengerName']} ${driverInvitationDataToPassengers[index]['countOfInvitDriver']} / 2 ${'Trip'.tr}',
'${encryptionHelper.decryptData(driverInvitationDataToPassengers[index]['passengerName'].toString())} ${driverInvitationDataToPassengers[index]['countOfInvitDriver'].toString()} / 2 ${'Trip'.tr}',
() async {
if (driverInvitationDataToPassengers[index]['countOfInvitDriver'] < 2) {
if (int.parse(driverInvitationDataToPassengers[index]
['countOfInvitDriver']
.toString()) <
2) {
Get.back();
} else {
// Claim the gift if 100 trips are completed
@@ -264,14 +270,14 @@ Download the SEFER app now and enjoy your ride!
var response =
await CRUD().post(link: AppLink.addInvitationPassenger, payload: {
"driverId": box.read(BoxName.passengerID),
"inviterPassengerPhone": '+2$phoneNumber'
"inviterPassengerPhone": encryptionHelper.encryptData('+2$phoneNumber')
});
if (response != 'failure') {
var d = response;
Get.snackbar('Success', 'Invite sent successfully'.tr);
String message = '${'*SEFER APP CODE*'.tr}\n\n'
String message = '${'*SWIFTI APP CODE*'.tr}\n\n'
'${"Use this code in registration".tr}\n'
'${"To get a gift for both".tr}\n\n'
'${"The period of this code is 1 hour".tr}\n\n'

View File

@@ -16,6 +16,7 @@ import 'package:get/get.dart';
import 'package:intl/intl.dart';
import '../functions/crud.dart';
import '../functions/encrypt_decrypt.dart';
class VipOrderController extends GetxController {
RxBool isLoading = false.obs;
@@ -286,7 +287,12 @@ class VipWaittingPage extends StatelessWidget {
? MyElevatedButton(
title: "Click here to begin your trip\n\nGood luck, "
.tr +
box.read(BoxName.name).toString(),
encryptionHelper
.decryptData(box
.read(BoxName.name)
.toString()
.split(' ')[0])
.toString(),
kolor: AppColor.greenColor,
onPressed: () {
final mapPassengerController =

File diff suppressed because it is too large Load Diff

View File

@@ -21,6 +21,7 @@ import '../../constant/links.dart';
import '../../main.dart';
import '../../print.dart';
import '../functions/crud.dart';
import '../functions/encrypt_decrypt.dart';
import '../functions/toast.dart';
import 'paymob/paymob_wallet.dart';
@@ -264,7 +265,10 @@ class PaymentController extends GetxController {
merchantDisplayName: AppInformation.appName,
billingDetails: BillingDetails(
name: box.read(BoxName.nameDriver) == null
? box.read(BoxName.name).toString()
? encryptionHelper
.decryptData(
box.read(BoxName.name).toString().split(' ')[0])
.toString()
: box.read(BoxName.nameDriver).toString(),
email: box.read(BoxName.emailDriver) == null
? box.read(BoxName.email).toString()

View File

@@ -7,6 +7,7 @@ import 'package:url_launcher/url_launcher.dart';
import '../../constant/api_key.dart';
import '../../main.dart';
import '../../print.dart';
import '../functions/encrypt_decrypt.dart';
class PaymobManager extends GetxController {
String authanticationToken1 = "";
@@ -134,10 +135,14 @@ class PaymobManager extends GetxController {
"amount_cents": amount,
"currency": currency,
"billing_data": {
"first_name": box.read(BoxName.name),
"last_name": box.read(BoxName.name),
"email": box.read(BoxName.email),
"phone_number": box.read(BoxName.phone),
"first_name": encryptionHelper
.decryptData(box.read(BoxName.name).toString().split(' ')[0])
.toString(),
"last_name": encryptionHelper
.decryptData(box.read(BoxName.name).toString().split(' ')[1])
.toString(),
"email": encryptionHelper.decryptData(box.read(BoxName.email)),
"phone_number": encryptionHelper.decryptData(box.read(BoxName.phone)),
"apartment": "NA",
"floor": "NA",
"street": "NA",

View File

@@ -4,6 +4,8 @@ import 'package:dio/dio.dart';
import 'package:flutter/material.dart';
import 'package:webview_flutter/webview_flutter.dart';
import '../../functions/encrypt_decrypt.dart';
class PaymobResponse {
bool success;
String? transactionID;
@@ -224,9 +226,13 @@ class PaymobBillingData {
Map<String, dynamic> toJson() {
return {
"email": box.read(BoxName.email) ?? box.read(BoxName.emailDriver),
"first_name": box.read(BoxName.name) ?? box.read(BoxName.nameDriver),
"last_name": box.read(BoxName.name) ?? box.read(BoxName.nameDriver),
"phone_number": box.read(BoxName.phone) ?? box.read(BoxName.phoneDriver),
"first_name": encryptionHelper
.decryptData(box.read(BoxName.name).toString().split(' ')[0])
.toString(),
"last_name": encryptionHelper
.decryptData(box.read(BoxName.name).toString().split(' ')[1])
.toString(),
"phone_number": encryptionHelper.decryptData(box.read(BoxName.phone)),
"apartment": apartment ?? "NA",
"floor": floor ?? "NA",
"building": building ?? "NA",

View File

@@ -5,6 +5,7 @@ import 'package:flutter/material.dart';
import 'package:webview_flutter/webview_flutter.dart';
import '../../../print.dart';
import '../../functions/encrypt_decrypt.dart';
class PaymobResponseWallet {
final bool success;
@@ -267,9 +268,14 @@ class PaymobBillingDataWallet {
Map<String, dynamic> toJson() {
return {
"email": box.read(BoxName.email) ?? box.read(BoxName.emailDriver),
"first_name": box.read(BoxName.name) ?? box.read(BoxName.nameDriver),
"last_name": box.read(BoxName.name) ?? box.read(BoxName.nameDriver),
"phone_number": box.read(BoxName.phoneWallet),
"first_name": encryptionHelper
.decryptData(box.read(BoxName.name).toString().split(' ')[0])
.toString(),
"last_name": encryptionHelper
.decryptData(box.read(BoxName.name).toString().split(' ')[1])
.toString(),
"phone_number":
encryptionHelper.decryptData(box.read(BoxName.phoneWallet)),
"apartment": apartment ?? "NA",
"floor": floor ?? "NA",
"building": building ?? "NA",

View File

@@ -1,6 +1,7 @@
import 'dart:convert';
import 'package:SEFER/constant/colors.dart';
import 'package:SEFER/controller/functions/encrypt_decrypt.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
@@ -73,10 +74,11 @@ class ProfileController extends GetxController {
Get.back();
await updateColumn({
'id': box.read(BoxName.passengerID),
columnName: txtController.text,
columnName: encryptionHelper.encryptData(txtController.text),
});
if (columnName == 'first_name') {
box.write(BoxName.name, txtController.text);
box.write(BoxName.name,
encryptionHelper.encryptData(txtController.text));
}
txtController.clear();