25-3/18/1
This commit is contained in:
1
lib/constant/api_key.dart
Normal file → Executable file
1
lib/constant/api_key.dart
Normal file → Executable file
@@ -6,6 +6,7 @@ import 'char_map.dart';
|
||||
class AK {
|
||||
static final String sss_pass = X.r(X.r(X.r(Env.sss_pass, cn), cC), cs);
|
||||
static final String allowed = Env.allowed;
|
||||
static final String allowedWallet = Env.allowedWallet;
|
||||
static final String passnpassenger = X
|
||||
.r(X.r(X.r(Env.passnpassenger, cn), cC), cs)
|
||||
.toString()
|
||||
|
||||
0
lib/constant/box_name.dart
Normal file → Executable file
0
lib/constant/box_name.dart
Normal file → Executable file
0
lib/constant/char_map.dart
Normal file → Executable file
0
lib/constant/char_map.dart
Normal file → Executable file
0
lib/constant/colors.dart
Normal file → Executable file
0
lib/constant/colors.dart
Normal file → Executable file
0
lib/constant/credential.dart
Normal file → Executable file
0
lib/constant/credential.dart
Normal file → Executable file
0
lib/constant/info.dart
Normal file → Executable file
0
lib/constant/info.dart
Normal file → Executable file
21
lib/constant/links.dart
Normal file → Executable file
21
lib/constant/links.dart
Normal file → Executable file
@@ -15,7 +15,7 @@ class AppLink {
|
||||
// static final String seferAlexandriaServer = Env.seferAlexandriaServer;
|
||||
// static final String seferCairoServer = Env.seferCairoServer;
|
||||
// static final String seferCairoServer =
|
||||
// 'https://server.sefer.live/sefer.click/sefer';
|
||||
// 'https://server.sefer.click/sefer.click/sefer';
|
||||
// static final String seferGizaServer = Env.seferCairoServer;
|
||||
// static final String seferAlexandriaServer = Env.seferCairoServer;
|
||||
// static final String seferPaymentServer = '${Env.seferCairoServer}/ride';
|
||||
@@ -24,18 +24,19 @@ class AppLink {
|
||||
// static final String seferGizaServer = Env.seferGizaServer;
|
||||
static final String endPoint =
|
||||
box.read(BoxName.serverChosen) ?? box.read(BoxName.basicLink);
|
||||
// 'https://server.sefer.live/sefer.click/sefer';
|
||||
// 'https://server.sefer.click/sefer.click/sefer';
|
||||
static final String server = endPoint;
|
||||
static String seferCairoServer = endPoint;
|
||||
static String seferGizaServer = box.read('Giza');
|
||||
static String seferAlexandriaServer = box.read('Alexandria');
|
||||
// static final String server = Env.serverPHP;
|
||||
|
||||
static String loginJwtDriver = "$server/loginJwtDriver.php";
|
||||
static String loginJwtDriver =
|
||||
"https://server.sefer.click/sefer.click/sefer/loginJwtDriver.php";
|
||||
static String loginJwtWalletDriver =
|
||||
"$seferPaymentServer/loginJwtWalletDriver.php";
|
||||
static String loginFirstTimeDriver =
|
||||
"https://server.sefer.live/sefer.click/sefer/loginFirstTimeDriver.php";
|
||||
"https://server.sefer.click/sefer.click/sefer/loginFirstTimeDriver.php";
|
||||
|
||||
static String googleMapsLink = 'https://maps.googleapis.com/maps/api/';
|
||||
static String llama = 'https://api.llama-api.com/chat/completions';
|
||||
@@ -104,7 +105,7 @@ class AppLink {
|
||||
static String getapiKey = Env.getapiKey;
|
||||
|
||||
static String getapiKeySefer =
|
||||
"https://api.sefer.live/sefer/ride/apiKey/get.php";
|
||||
"https://api.sefer.click/sefer/ride/apiKey/get.php";
|
||||
static String getRideStatusBegin = "$ride/rides/getRideStatusBegin.php";
|
||||
static String getRideStatusFromStartApp =
|
||||
"$ride/rides/getRideStatusFromStartApp.php";
|
||||
@@ -225,16 +226,16 @@ class AppLink {
|
||||
static String addRateToDriver = "$ride/rate/addRateToDriver.php";
|
||||
static String addRateApp = "$ride/rate/add_rate_app.php";
|
||||
static String sendEmailRateingApp =
|
||||
"https://api.sefer.live/sefer/ride/rate/sendEmailRateingApp.php";
|
||||
"https://api.sefer.click/sefer/ride/rate/sendEmailRateingApp.php";
|
||||
static String getDriverRate = "$ride/rate/getDriverRate.php";
|
||||
static String getPassengerRate = "$ride/rate/getPassengerRate.php";
|
||||
|
||||
////////////////emails ============//
|
||||
static String sendEmailToPassengerForTripDetails =
|
||||
"https://api.sefer.live/sefer/ride/rides/emailToPassengerTripDetail.php";
|
||||
"https://api.sefer.click/sefer/ride/rides/emailToPassengerTripDetail.php";
|
||||
static String sendEmailToDrivertransaction =
|
||||
"https://api.sefer.live/sefer/Admin/sendEmailToDrivertransaction.php";
|
||||
// "https://api.sefer.live/sefer/Admin/sendEmailToDrivertransaction.php";
|
||||
"https://api.sefer.click/sefer/Admin/sendEmailToDrivertransaction.php";
|
||||
// "https://api.sefer.click/sefer/Admin/sendEmailToDrivertransaction.php";
|
||||
// ===========================================
|
||||
static String pathImage = "$server/upload/types/";
|
||||
static String uploadImage = "$server/uploadImage.php";
|
||||
@@ -252,7 +253,7 @@ class AppLink {
|
||||
static String getCarsLocationByPassenger = "$location/get.php";
|
||||
static String addpassengerLocation = "$location/addpassengerLocation.php";
|
||||
static String getLocationAreaLinks =
|
||||
"https://server.sefer.live/sefer.click/sefer/ride/location/get_location_area_links.php";
|
||||
"https://server.sefer.click/sefer.click/sefer/ride/location/get_location_area_links.php";
|
||||
static String getLatestLocationPassenger =
|
||||
"$location/getLatestLocationPassenger.php";
|
||||
static String getFemalDriverLocationByPassenger =
|
||||
|
||||
0
lib/constant/notification.dart
Normal file → Executable file
0
lib/constant/notification.dart
Normal file → Executable file
0
lib/constant/style.dart
Normal file → Executable file
0
lib/constant/style.dart
Normal file → Executable file
0
lib/constant/table_names.dart
Normal file → Executable file
0
lib/constant/table_names.dart
Normal file → Executable file
0
lib/controller/auth/apple_sigin.dart
Normal file → Executable file
0
lib/controller/auth/apple_sigin.dart
Normal file → Executable file
0
lib/controller/auth/captin/history_captain.dart
Normal file → Executable file
0
lib/controller/auth/captin/history_captain.dart
Normal file → Executable file
185
lib/controller/auth/captin/invit_controller.dart
Normal file → Executable file
185
lib/controller/auth/captin/invit_controller.dart
Normal file → Executable file
@@ -1,5 +1,6 @@
|
||||
import 'dart:convert';
|
||||
|
||||
import 'package:local_auth/local_auth.dart';
|
||||
import 'package:sefer_driver/constant/box_name.dart';
|
||||
import 'package:sefer_driver/constant/links.dart';
|
||||
import 'package:sefer_driver/controller/firebase/local_notification.dart';
|
||||
@@ -153,55 +154,79 @@ Download the Tripz app now and enjoy your ride!
|
||||
: 'You deserve the gift'.tr,
|
||||
'${EncryptionHelper.instance.decryptData(driverInvitationData[index]['invitorName'])} ${(driverInvitationData[index]['countOfInvitDriver'])} / 100 ${'Trip'.tr}',
|
||||
() async {
|
||||
bool isAvailable = await LocalAuthentication().isDeviceSupported();
|
||||
if (int.parse((driverInvitationData[index]['countOfInvitDriver'])) <
|
||||
100) {
|
||||
Get.back();
|
||||
} else {
|
||||
//claim your gift
|
||||
if ((driverInvitationData[index]['isGiftToken']).toString() == '0') {
|
||||
Get.back();
|
||||
await CRUD().post(link: AppLink.updateInviteDriver, payload: {
|
||||
'id': EncryptionHelper.instance
|
||||
.encryptData(driverInvitationData[index]['id'])
|
||||
});
|
||||
await Get.find<CaptainWalletController>().addDriverPayment(
|
||||
'paymentMethod',
|
||||
EncryptionHelper.instance.encryptData('500'),
|
||||
'',
|
||||
);
|
||||
// add for invitor too
|
||||
await Get.find<CaptainWalletController>().addDriverWalletToInvitor(
|
||||
'paymentMethod',
|
||||
EncryptionHelper.instance
|
||||
.encryptData(driverInvitationData[index]['driverInviterId']),
|
||||
EncryptionHelper.instance.encryptData('500'),
|
||||
);
|
||||
await Get.find<CaptainWalletController>().addSeferWallet(
|
||||
'giftInvitation',
|
||||
EncryptionHelper.instance.encryptData('-1000'));
|
||||
NotificationCaptainController().addNotificationCaptain(
|
||||
driverInvitationData[index]['driverInviterId'].toString(),
|
||||
"You have got a gift for invitation".tr,
|
||||
'${"You have 500".tr} ${'LE'}',
|
||||
false);
|
||||
NotificationController().showNotification(
|
||||
"You have got a gift for invitation".tr,
|
||||
'${"You have 500".tr} ${'LE'}',
|
||||
'tone1',
|
||||
'');
|
||||
} else
|
||||
//claim your gift
|
||||
|
||||
if (isAvailable) {
|
||||
// Authenticate the user
|
||||
bool didAuthenticate = await LocalAuthentication().authenticate(
|
||||
localizedReason: 'Use Touch ID or Face ID to confirm payment',
|
||||
options: AuthenticationOptions(
|
||||
biometricOnly: true,
|
||||
sensitiveTransaction: true,
|
||||
));
|
||||
if (didAuthenticate) {
|
||||
if ((driverInvitationData[index]['isGiftToken']).toString() ==
|
||||
'0') {
|
||||
Get.back();
|
||||
await CRUD().post(link: AppLink.updateInviteDriver, payload: {
|
||||
'id': EncryptionHelper.instance
|
||||
.encryptData(driverInvitationData[index]['id'])
|
||||
});
|
||||
await Get.find<CaptainWalletController>().addDriverPayment(
|
||||
'paymentMethod',
|
||||
('500'),
|
||||
'',
|
||||
);
|
||||
// add for invitor too
|
||||
await Get.find<CaptainWalletController>()
|
||||
.addDriverWalletToInvitor(
|
||||
'paymentMethod',
|
||||
EncryptionHelper.instance.encryptData(
|
||||
driverInvitationData[index]['driverInviterId']),
|
||||
('500'),
|
||||
);
|
||||
await Get.find<CaptainWalletController>()
|
||||
.addSeferWallet('giftInvitation', ('-1000'));
|
||||
NotificationCaptainController().addNotificationCaptain(
|
||||
driverInvitationData[index]['driverInviterId'].toString(),
|
||||
"You have got a gift for invitation".tr,
|
||||
'${"You have 500".tr} ${'LE'}',
|
||||
false);
|
||||
NotificationController().showNotification(
|
||||
"You have got a gift for invitation".tr,
|
||||
'${"You have 500".tr} ${'LE'}',
|
||||
'tone1',
|
||||
'');
|
||||
} else {
|
||||
Get.back();
|
||||
MyDialog().getDialog("You have got a gift".tr,
|
||||
"Share the app with another new driver".tr, () {
|
||||
Get.back();
|
||||
});
|
||||
}
|
||||
} else {
|
||||
Get.back();
|
||||
MyDialog().getDialog("You have got a gift".tr,
|
||||
"Share the app with another new driver".tr, () {
|
||||
// Authentication failed, handle accordingly
|
||||
MyDialog().getDialog('Authentication failed'.tr, ''.tr, () {
|
||||
Get.back();
|
||||
});
|
||||
}
|
||||
} else {
|
||||
MyDialog().getDialog('Biometric Authentication'.tr,
|
||||
'You should use Touch ID or Face ID to confirm payment'.tr, () {
|
||||
Get.back();
|
||||
});
|
||||
}
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
void onSelectPassengerInvitation(int index) async {
|
||||
bool isAvailable = await LocalAuthentication().isDeviceSupported();
|
||||
MyDialog().getDialog(
|
||||
int.parse(driverInvitationDataToPassengers[index]['countOfInvitDriver']
|
||||
.toString()) <
|
||||
@@ -215,43 +240,61 @@ Download the Tripz app now and enjoy your ride!
|
||||
.toString()) <
|
||||
3) {
|
||||
Get.back();
|
||||
} else {
|
||||
// Claim the gift if 100 trips are completed
|
||||
if (driverInvitationDataToPassengers[index]['isGiftToken']
|
||||
.toString() ==
|
||||
'0') {
|
||||
Get.back();
|
||||
// Add wallet to the inviter
|
||||
await Get.find<CaptainWalletController>()
|
||||
.addDriverWallet('paymentMethod', '50', '50');
|
||||
// add for invitor too
|
||||
await Get.find<CaptainWalletController>().addDriverWalletToInvitor(
|
||||
'paymentMethod',
|
||||
driverInvitationData[index]['driverInviterId'],
|
||||
'50');
|
||||
// Update invitation as claimed
|
||||
await CRUD().post(
|
||||
link: AppLink.updatePassengerGift,
|
||||
payload: {'id': driverInvitationDataToPassengers[index]['id']},
|
||||
);
|
||||
// Notify the inviter
|
||||
NotificationCaptainController().addNotificationCaptain(
|
||||
driverInvitationDataToPassengers[index]['passengerInviterId']
|
||||
.toString(),
|
||||
"You have got a gift for invitation".tr,
|
||||
'${"You have 50".tr} ${'LE'}',
|
||||
false,
|
||||
);
|
||||
} else if (isAvailable) {
|
||||
// Authenticate the user
|
||||
bool didAuthenticate = await LocalAuthentication().authenticate(
|
||||
localizedReason: 'Use Touch ID or Face ID to confirm payment',
|
||||
options: AuthenticationOptions(
|
||||
biometricOnly: true,
|
||||
sensitiveTransaction: true,
|
||||
));
|
||||
if (didAuthenticate) {
|
||||
// Claim the gift if 100 trips are completed
|
||||
if (driverInvitationDataToPassengers[index]['isGiftToken']
|
||||
.toString() ==
|
||||
'0') {
|
||||
Get.back();
|
||||
// Add wallet to the inviter
|
||||
await Get.find<CaptainWalletController>()
|
||||
.addDriverWallet('paymentMethod', '50', '50');
|
||||
// add for invitor too
|
||||
await Get.find<CaptainWalletController>()
|
||||
.addDriverWalletToInvitor('paymentMethod',
|
||||
driverInvitationData[index]['driverInviterId'], '50');
|
||||
// Update invitation as claimed
|
||||
await CRUD().post(
|
||||
link: AppLink.updatePassengerGift,
|
||||
payload: {'id': driverInvitationDataToPassengers[index]['id']},
|
||||
);
|
||||
// Notify the inviter
|
||||
NotificationCaptainController().addNotificationCaptain(
|
||||
driverInvitationDataToPassengers[index]['passengerInviterId']
|
||||
.toString(),
|
||||
"You have got a gift for invitation".tr,
|
||||
'${"You have 50".tr} ${'LE'}',
|
||||
false,
|
||||
);
|
||||
} else {
|
||||
Get.back();
|
||||
MyDialog().getDialog(
|
||||
"You have got a gift".tr,
|
||||
"Share the app with another new passenger".tr,
|
||||
() {
|
||||
Get.back();
|
||||
},
|
||||
);
|
||||
}
|
||||
} else {
|
||||
Get.back();
|
||||
MyDialog().getDialog(
|
||||
"You have got a gift".tr,
|
||||
"Share the app with another new passenger".tr,
|
||||
() {
|
||||
Get.back();
|
||||
},
|
||||
);
|
||||
// Authentication failed, handle accordingly
|
||||
MyDialog().getDialog('Authentication failed'.tr, ''.tr, () {
|
||||
Get.back();
|
||||
});
|
||||
}
|
||||
} else {
|
||||
MyDialog().getDialog('Biometric Authentication'.tr,
|
||||
'You should use Touch ID or Face ID to confirm payment'.tr, () {
|
||||
Get.back();
|
||||
});
|
||||
}
|
||||
},
|
||||
);
|
||||
|
||||
55
lib/controller/auth/captin/login_captin_controller.dart
Normal file → Executable file
55
lib/controller/auth/captin/login_captin_controller.dart
Normal file → Executable file
@@ -102,18 +102,23 @@ class LoginDriverController extends GetxController {
|
||||
} else {
|
||||
await SecurityChecks.isDeviceRootedFromNative(Get.context!);
|
||||
}
|
||||
String fingerPrint = await getDeviceFingerprint();
|
||||
String fingerPrint = await DeviceHelper.getDeviceFingerprint();
|
||||
dev = Platform.isAndroid ? 'android' : 'ios';
|
||||
var payload = {
|
||||
'id': box.read(BoxName.passengerID),
|
||||
'id': box.read(BoxName.driverID),
|
||||
'password': AK.passnpassenger,
|
||||
'aud': '${AK.allowed}$dev',
|
||||
'aud': '${AK.allowedWallet}$dev',
|
||||
'fingerPrint': fingerPrint
|
||||
};
|
||||
var response1 = await http.post(
|
||||
Uri.parse(AppLink.loginJwtWalletDriver),
|
||||
body: payload,
|
||||
);
|
||||
Log.print('response.request: ${response1.request}');
|
||||
Log.print('response.body: ${response1.body}');
|
||||
print(payload);
|
||||
Log.print(
|
||||
'jsonDecode(response1.body)["jwt"]: ${jsonDecode(response1.body)['jwt']}');
|
||||
|
||||
return jsonDecode(response1.body)['jwt'].toString();
|
||||
}
|
||||
@@ -155,6 +160,7 @@ class LoginDriverController extends GetxController {
|
||||
} else {}
|
||||
} else {
|
||||
await EncryptionHelper.initialize();
|
||||
|
||||
var emailDecrypted = (box.read(BoxName.emailDriver));
|
||||
var pass = passwordController.text.isEmpty
|
||||
? '$emailDecrypted${box.read(BoxName.driverID)}'
|
||||
@@ -246,7 +252,10 @@ class LoginDriverController extends GetxController {
|
||||
if (jsonDecoeded.isNotEmpty) {
|
||||
if (jsonDecoeded['status'] == 'success' &&
|
||||
jsonDecoeded['data'][0]['is_verified'].toString() == '1') {
|
||||
box.write(BoxName.emailDriver, (jsonDecoeded['data'][0]['email']));
|
||||
box.write(
|
||||
BoxName.emailDriver,
|
||||
EncryptionHelper.instance
|
||||
.decryptData(jsonDecoeded['data'][0]['email']));
|
||||
box.write(BoxName.firstTimeLoadKey, 'false');
|
||||
box.write(BoxName.driverID, (jsonDecoeded['data'][0]['id']));
|
||||
box.write(BoxName.isTest, '1');
|
||||
@@ -302,11 +311,12 @@ class LoginDriverController extends GetxController {
|
||||
link: AppLink.getDriverToken,
|
||||
payload: {'captain_id': (box.read(BoxName.driverID)).toString()});
|
||||
|
||||
String? fingerPrint = await DeviceHelper.getDeviceFingerprint();
|
||||
await storage.write(key: BoxName.fingerPrint, value: fingerPrint);
|
||||
|
||||
if (token != 'failure') {
|
||||
if (EncryptionHelper.instance
|
||||
.decryptData(jsonDecode(token)['data'][0]['token']) !=
|
||||
EncryptionHelper.instance
|
||||
.decryptData(box.read(BoxName.tokenDriver))) {
|
||||
if ((jsonDecode(token)['data'][0]['token']) !=
|
||||
(box.read(BoxName.tokenDriver))) {
|
||||
Get.put(FirebaseMessagesController()).sendNotificationToDriverMAP(
|
||||
'token change'.tr,
|
||||
'change device'.tr,
|
||||
@@ -315,7 +325,7 @@ class LoginDriverController extends GetxController {
|
||||
.toString(),
|
||||
[],
|
||||
'promo.wav');
|
||||
Get.defaultDialog(
|
||||
await Get.defaultDialog(
|
||||
title: 'you will use this device?'.tr,
|
||||
middleText: '',
|
||||
confirm: MyElevatedButton(
|
||||
@@ -324,7 +334,8 @@ class LoginDriverController extends GetxController {
|
||||
await CRUD()
|
||||
.post(link: AppLink.addTokensDriver, payload: {
|
||||
'token': (box.read(BoxName.tokenDriver)),
|
||||
'captain_id': (box.read(BoxName.driverID)).toString()
|
||||
'captain_id': (box.read(BoxName.driverID)).toString(),
|
||||
'fingerPrint': (fingerPrint).toString()
|
||||
});
|
||||
await CRUD().post(
|
||||
link:
|
||||
@@ -332,7 +343,8 @@ class LoginDriverController extends GetxController {
|
||||
payload: {
|
||||
'token': (box.read(BoxName.tokenDriver)),
|
||||
'captain_id':
|
||||
(box.read(BoxName.driverID)).toString()
|
||||
(box.read(BoxName.driverID)).toString(),
|
||||
'fingerPrint': (fingerPrint).toString()
|
||||
});
|
||||
// await CRUD().post(
|
||||
// link:
|
||||
@@ -372,8 +384,7 @@ class LoginDriverController extends GetxController {
|
||||
'email': EncryptionHelper.instance.encryptData(email),
|
||||
'password': password,
|
||||
});
|
||||
box.write(BoxName.emailDriver,
|
||||
EncryptionHelper.instance.decryptData(email).toString());
|
||||
box.write(BoxName.emailDriver, (email).toString());
|
||||
print(res);
|
||||
if (res == 'failure') {
|
||||
//Failure
|
||||
@@ -439,15 +450,16 @@ class LoginDriverController extends GetxController {
|
||||
}
|
||||
updateAppTester(AppInformation.appName);
|
||||
|
||||
var fingerPrint = DeviceHelper.getDeviceFingerprint().toString();
|
||||
await storage.write(key: BoxName.fingerPrint, value: fingerPrint);
|
||||
|
||||
var token = await CRUD().get(
|
||||
link: AppLink.getDriverToken,
|
||||
payload: {'captain_id': box.read(BoxName.driverID).toString()});
|
||||
|
||||
if (token != 'failure') {
|
||||
if (EncryptionHelper.instance
|
||||
.decryptData(jsonDecode(token)['data'][0]['token']) !=
|
||||
EncryptionHelper.instance
|
||||
.decryptData(box.read(BoxName.tokenDriver))) {
|
||||
if ((jsonDecode(token)['data'][0]['token']) !=
|
||||
(box.read(BoxName.tokenDriver))) {
|
||||
Get.put(FirebaseMessagesController()).sendNotificationToDriverMAP(
|
||||
'token change'.tr,
|
||||
'change device'.tr,
|
||||
@@ -465,7 +477,8 @@ class LoginDriverController extends GetxController {
|
||||
await CRUD()
|
||||
.post(link: AppLink.addTokensDriver, payload: {
|
||||
'token': box.read(BoxName.tokenDriver),
|
||||
'captain_id': box.read(BoxName.driverID).toString()
|
||||
'captain_id': box.read(BoxName.driverID).toString(),
|
||||
'fingerPrint': (fingerPrint).toString()
|
||||
});
|
||||
await CRUD().post(
|
||||
link:
|
||||
@@ -473,7 +486,8 @@ class LoginDriverController extends GetxController {
|
||||
payload: {
|
||||
'token': box.read(BoxName.tokenDriver),
|
||||
'captain_id':
|
||||
box.read(BoxName.driverID).toString()
|
||||
box.read(BoxName.driverID).toString(),
|
||||
'fingerPrint': (fingerPrint).toString()
|
||||
});
|
||||
await CRUD().post(
|
||||
link:
|
||||
@@ -481,7 +495,8 @@ class LoginDriverController extends GetxController {
|
||||
payload: {
|
||||
'token': box.read(BoxName.tokenDriver),
|
||||
'captain_id':
|
||||
box.read(BoxName.driverID).toString()
|
||||
box.read(BoxName.driverID).toString(),
|
||||
'fingerPrint': (fingerPrint).toString()
|
||||
});
|
||||
Get.back();
|
||||
}));
|
||||
|
||||
0
lib/controller/auth/captin/ml_google_doc.dart
Normal file → Executable file
0
lib/controller/auth/captin/ml_google_doc.dart
Normal file → Executable file
0
lib/controller/auth/captin/register_captin_controller.dart
Normal file → Executable file
0
lib/controller/auth/captin/register_captin_controller.dart
Normal file → Executable file
0
lib/controller/auth/facebook_login.dart
Normal file → Executable file
0
lib/controller/auth/facebook_login.dart
Normal file → Executable file
0
lib/controller/auth/google_sign.dart
Normal file → Executable file
0
lib/controller/auth/google_sign.dart
Normal file → Executable file
0
lib/controller/auth/login_controller.dart
Normal file → Executable file
0
lib/controller/auth/login_controller.dart
Normal file → Executable file
0
lib/controller/auth/onboarding_controller.dart
Normal file → Executable file
0
lib/controller/auth/onboarding_controller.dart
Normal file → Executable file
0
lib/controller/auth/register_controller.dart
Normal file → Executable file
0
lib/controller/auth/register_controller.dart
Normal file → Executable file
0
lib/controller/auth/tokens_controller.dart
Normal file → Executable file
0
lib/controller/auth/tokens_controller.dart
Normal file → Executable file
0
lib/controller/auth/verify_email_controller.dart
Normal file → Executable file
0
lib/controller/auth/verify_email_controller.dart
Normal file → Executable file
0
lib/controller/firebase/access_token.dart
Normal file → Executable file
0
lib/controller/firebase/access_token.dart
Normal file → Executable file
0
lib/controller/firebase/bring_app_foreground.dart
Normal file → Executable file
0
lib/controller/firebase/bring_app_foreground.dart
Normal file → Executable file
0
lib/controller/firebase/firbase_messge.dart
Normal file → Executable file
0
lib/controller/firebase/firbase_messge.dart
Normal file → Executable file
0
lib/controller/firebase/local_notification.dart
Normal file → Executable file
0
lib/controller/firebase/local_notification.dart
Normal file → Executable file
0
lib/controller/firebase/order_lay.dart
Normal file → Executable file
0
lib/controller/firebase/order_lay.dart
Normal file → Executable file
0
lib/controller/functions/add_error.dart
Normal file → Executable file
0
lib/controller/functions/add_error.dart
Normal file → Executable file
0
lib/controller/functions/audio_controller.dart
Normal file → Executable file
0
lib/controller/functions/audio_controller.dart
Normal file → Executable file
0
lib/controller/functions/call_controller.dart
Normal file → Executable file
0
lib/controller/functions/call_controller.dart
Normal file → Executable file
0
lib/controller/functions/camer_controller.dart
Normal file → Executable file
0
lib/controller/functions/camer_controller.dart
Normal file → Executable file
73
lib/controller/functions/crud.dart
Normal file → Executable file
73
lib/controller/functions/crud.dart
Normal file → Executable file
@@ -9,7 +9,6 @@ import 'package:sefer_driver/main.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:http/http.dart' as http;
|
||||
import 'package:sefer_driver/env/env.dart';
|
||||
import 'package:sefer_driver/views/widgets/error_snakbar.dart';
|
||||
|
||||
import '../../constant/api_key.dart';
|
||||
import '../../constant/char_map.dart';
|
||||
@@ -27,7 +26,7 @@ class CRUD {
|
||||
.r(X.r(X.r(box.read(BoxName.jwt), cn), cC), cs)
|
||||
.toString()
|
||||
.split(AppInformation.addd)[0]);
|
||||
Log.print('isTokenExpired: ${isTokenExpired}');
|
||||
// Log.print('isTokenExpired: ${isTokenExpired}');
|
||||
|
||||
if (isTokenExpired) {
|
||||
await LoginDriverController().getJWT();
|
||||
@@ -45,9 +44,9 @@ class CRUD {
|
||||
'Bearer ${X.r(X.r(X.r(box.read(BoxName.jwt), cn), cC), cs).toString().split(AppInformation.addd)[0]}'
|
||||
},
|
||||
);
|
||||
print(response.request);
|
||||
print(response.body);
|
||||
print(payload);
|
||||
// print(response.request);
|
||||
// Log.print('response.body: ${response.body}');
|
||||
// print(payload);
|
||||
if (response.statusCode == 200) {
|
||||
var jsonData = jsonDecode(response.body);
|
||||
if (jsonData['status'] == 'success') {
|
||||
@@ -93,6 +92,10 @@ class CRUD {
|
||||
'Authorization': 'Bearer $s'
|
||||
},
|
||||
);
|
||||
// print(response.request);
|
||||
// Log.print('response.request: ${response.request}');
|
||||
// Log.print('response.body: ${response.body}');
|
||||
// print(payload);
|
||||
if (response.statusCode == 200) {
|
||||
var jsonData = jsonDecode(response.body);
|
||||
if (jsonData['status'] == 'success') {
|
||||
@@ -121,6 +124,58 @@ class CRUD {
|
||||
}
|
||||
}
|
||||
|
||||
Future<dynamic> postWallet(
|
||||
{required String link, Map<String, dynamic>? payload}) async {
|
||||
var s = await LoginDriverController().getJwtWallet();
|
||||
var url = Uri.parse(link);
|
||||
try {
|
||||
await LoginDriverController().getJWT();
|
||||
|
||||
var response = await http.post(
|
||||
url,
|
||||
body: payload,
|
||||
headers: {
|
||||
"Content-Type": "application/x-www-form-urlencoded",
|
||||
'Authorization': 'Bearer $s'
|
||||
},
|
||||
);
|
||||
// print(response.request);
|
||||
// Log.print('response.body: ${response.body}');
|
||||
// print(payload);
|
||||
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 - JSON decoding');
|
||||
return 'failure';
|
||||
}
|
||||
} else if (response.statusCode == 401) {
|
||||
// Specifically handle 401 Unauthorized
|
||||
var jsonData = jsonDecode(response.body);
|
||||
|
||||
if (jsonData['error'] == 'Token expired') {
|
||||
return 'token_expired'; // Return a specific value for token expiration
|
||||
} else {
|
||||
// Other 401 errors
|
||||
addError('Unauthorized: ${jsonData['error']}', 'crud().post - 401');
|
||||
return 'failure';
|
||||
}
|
||||
} else {
|
||||
addError('Non-200 response code: ${response.statusCode}',
|
||||
'crud().post - Other');
|
||||
return 'failure';
|
||||
}
|
||||
} catch (e) {
|
||||
addError('HTTP request error: $e', 'crud().post - HTTP');
|
||||
return 'failure';
|
||||
}
|
||||
}
|
||||
|
||||
Future<dynamic> post(
|
||||
{required String link, Map<String, dynamic>? payload}) async {
|
||||
var url = Uri.parse(link);
|
||||
@@ -142,9 +197,9 @@ class CRUD {
|
||||
// 'Authorization': 'Bearer ${box.read(BoxName.jwt)}'
|
||||
},
|
||||
);
|
||||
print(response.request);
|
||||
print(response.body);
|
||||
print(payload);
|
||||
// print(response.request);
|
||||
// Log.print('response.body: ${response.body}');
|
||||
// print(payload);
|
||||
if (response.statusCode == 200) {
|
||||
try {
|
||||
var jsonData = jsonDecode(response.body);
|
||||
@@ -154,7 +209,7 @@ class CRUD {
|
||||
return jsonData['status'];
|
||||
}
|
||||
} catch (e) {
|
||||
addError(e.toString(), 'crud().post - JSON decoding');
|
||||
addError(e.toString(), url);
|
||||
return 'failure';
|
||||
}
|
||||
} else if (response.statusCode == 401) {
|
||||
|
||||
0
lib/controller/functions/custom_pant.dart
Normal file → Executable file
0
lib/controller/functions/custom_pant.dart
Normal file → Executable file
0
lib/controller/functions/device_info.dart
Normal file → Executable file
0
lib/controller/functions/device_info.dart
Normal file → Executable file
0
lib/controller/functions/digit_obsecur_formate.dart
Normal file → Executable file
0
lib/controller/functions/digit_obsecur_formate.dart
Normal file → Executable file
0
lib/controller/functions/document_scanner.dart
Normal file → Executable file
0
lib/controller/functions/document_scanner.dart
Normal file → Executable file
0
lib/controller/functions/encrypt.dart
Normal file → Executable file
0
lib/controller/functions/encrypt.dart
Normal file → Executable file
0
lib/controller/functions/encrypt_decrypt.dart
Normal file → Executable file
0
lib/controller/functions/encrypt_decrypt.dart
Normal file → Executable file
0
lib/controller/functions/face_detect.dart
Normal file → Executable file
0
lib/controller/functions/face_detect.dart
Normal file → Executable file
0
lib/controller/functions/gemeni.dart
Normal file → Executable file
0
lib/controller/functions/gemeni.dart
Normal file → Executable file
0
lib/controller/functions/geolocation.dart
Normal file → Executable file
0
lib/controller/functions/geolocation.dart
Normal file → Executable file
0
lib/controller/functions/launch.dart
Normal file → Executable file
0
lib/controller/functions/launch.dart
Normal file → Executable file
0
lib/controller/functions/llama_ai.dart
Normal file → Executable file
0
lib/controller/functions/llama_ai.dart
Normal file → Executable file
0
lib/controller/functions/location_background_controller.dart
Normal file → Executable file
0
lib/controller/functions/location_background_controller.dart
Normal file → Executable file
89
lib/controller/functions/location_controller.dart
Normal file → Executable file
89
lib/controller/functions/location_controller.dart
Normal file → Executable file
@@ -170,7 +170,7 @@ class LocationController extends GetxController {
|
||||
|
||||
Future<void> getLocation() async {
|
||||
if (location == null) {
|
||||
location = Location(); // Ensure location is initialized
|
||||
location = Location(); // تأكد من أن `Location` مهيأ
|
||||
}
|
||||
|
||||
bool serviceEnabled;
|
||||
@@ -192,27 +192,80 @@ class LocationController extends GetxController {
|
||||
}
|
||||
}
|
||||
|
||||
LocationData _locationData = await location.getLocation();
|
||||
if (_locationData.latitude != null && _locationData.longitude != null) {
|
||||
myLocation = LatLng(_locationData.latitude!, _locationData.longitude!);
|
||||
} else {
|
||||
myLocation = LatLng(0, 0); // Default value
|
||||
}
|
||||
/// **تجنب استدعاء `getLocation()` مباشرة على الـ Main Thread**
|
||||
Future.delayed(Duration(milliseconds: 500), () async {
|
||||
try {
|
||||
LocationData _locationData = await location.getLocation();
|
||||
if (_locationData.latitude != null && _locationData.longitude != null) {
|
||||
myLocation =
|
||||
LatLng(_locationData.latitude!, _locationData.longitude!);
|
||||
} else {
|
||||
myLocation = LatLng(0, 0); // Default value
|
||||
}
|
||||
|
||||
speed = _locationData.speed ?? 0;
|
||||
heading = _locationData.heading ?? 0;
|
||||
speed = _locationData.speed ?? 0;
|
||||
heading = _locationData.heading ?? 0;
|
||||
|
||||
if (Get.find<HomeCaptainController>().rideId == 'rideId') {
|
||||
if (previousTime > 0) {
|
||||
double distance = calculateDistanceInKmPerHour(
|
||||
previousTime, _locationData.time, speed);
|
||||
totalDistance += distance;
|
||||
if (Get.find<HomeCaptainController>().rideId == 'rideId') {
|
||||
if (previousTime > 0) {
|
||||
double distance = calculateDistanceInKmPerHour(
|
||||
previousTime, _locationData.time, speed);
|
||||
totalDistance += distance;
|
||||
}
|
||||
previousTime = _locationData.time ?? 0;
|
||||
}
|
||||
|
||||
update();
|
||||
} catch (e) {
|
||||
print("Error getting location: $e");
|
||||
}
|
||||
previousTime = _locationData.time ?? 0;
|
||||
}
|
||||
|
||||
update();
|
||||
});
|
||||
}
|
||||
// Future<void> getLocation() async {
|
||||
// if (location == null) {
|
||||
// location = Location(); // Ensure location is initialized
|
||||
// }
|
||||
|
||||
// bool serviceEnabled;
|
||||
// PermissionStatus permissionGranted;
|
||||
|
||||
// serviceEnabled = await location.serviceEnabled();
|
||||
// if (!serviceEnabled) {
|
||||
// serviceEnabled = await location.requestService();
|
||||
// if (!serviceEnabled) {
|
||||
// return;
|
||||
// }
|
||||
// }
|
||||
|
||||
// permissionGranted = await location.hasPermission();
|
||||
// if (permissionGranted == PermissionStatus.denied) {
|
||||
// permissionGranted = await location.requestPermission();
|
||||
// if (permissionGranted != PermissionStatus.granted) {
|
||||
// return;
|
||||
// }
|
||||
// }
|
||||
|
||||
// LocationData _locationData = await location.getLocation();
|
||||
// if (_locationData.latitude != null && _locationData.longitude != null) {
|
||||
// myLocation = LatLng(_locationData.latitude!, _locationData.longitude!);
|
||||
// } else {
|
||||
// myLocation = LatLng(0, 0); // Default value
|
||||
// }
|
||||
|
||||
// speed = _locationData.speed ?? 0;
|
||||
// heading = _locationData.heading ?? 0;
|
||||
|
||||
// if (Get.find<HomeCaptainController>().rideId == 'rideId') {
|
||||
// if (previousTime > 0) {
|
||||
// double distance = calculateDistanceInKmPerHour(
|
||||
// previousTime, _locationData.time, speed);
|
||||
// totalDistance += distance;
|
||||
// }
|
||||
// previousTime = _locationData.time ?? 0;
|
||||
// }
|
||||
|
||||
// update();
|
||||
// }
|
||||
|
||||
double calculateDistanceInKmPerHour(
|
||||
double? startTime, double? endTime, double speedInMetersPerSecond) {
|
||||
|
||||
0
lib/controller/functions/location_permission.dart
Normal file → Executable file
0
lib/controller/functions/location_permission.dart
Normal file → Executable file
0
lib/controller/functions/log_out.dart
Normal file → Executable file
0
lib/controller/functions/log_out.dart
Normal file → Executable file
0
lib/controller/functions/ocr_controller.dart
Normal file → Executable file
0
lib/controller/functions/ocr_controller.dart
Normal file → Executable file
0
lib/controller/functions/overlay_permisssion.dart
Normal file → Executable file
0
lib/controller/functions/overlay_permisssion.dart
Normal file → Executable file
52
lib/controller/functions/package_info.dart
Normal file → Executable file
52
lib/controller/functions/package_info.dart
Normal file → Executable file
@@ -164,23 +164,45 @@ void showUpdateDialog(BuildContext context) {
|
||||
);
|
||||
}
|
||||
|
||||
getDeviceFingerprint() async {
|
||||
final deviceInfo = await DeviceInfoPlugin().deviceInfo;
|
||||
var deviceData;
|
||||
class DeviceHelper {
|
||||
static Future<String> getDeviceFingerprint() async {
|
||||
final DeviceInfoPlugin deviceInfoPlugin = DeviceInfoPlugin();
|
||||
var deviceData;
|
||||
|
||||
if (Platform.isAndroid) {
|
||||
deviceData = deviceInfo.data;
|
||||
} else if (Platform.isIOS) {
|
||||
deviceData = deviceInfo.data;
|
||||
try {
|
||||
if (Platform.isAndroid) {
|
||||
// Fetch Android-specific device information
|
||||
AndroidDeviceInfo androidInfo = await deviceInfoPlugin.androidInfo;
|
||||
deviceData = androidInfo.toMap(); // Convert to a map for easier access
|
||||
// Log.print('deviceData: ${jsonEncode(deviceData)}');
|
||||
} else if (Platform.isIOS) {
|
||||
// Fetch iOS-specific device information
|
||||
IosDeviceInfo iosInfo = await deviceInfoPlugin.iosInfo;
|
||||
deviceData = iosInfo.toMap(); // Convert to a map for easier access
|
||||
} else {
|
||||
throw UnsupportedError('Unsupported platform');
|
||||
}
|
||||
|
||||
// Extract relevant device information
|
||||
final String deviceId = Platform.isAndroid
|
||||
? deviceData['androidId'] ?? deviceData['serialNumber'] ?? 'unknown'
|
||||
: deviceData['identifierForVendor'] ?? 'unknown';
|
||||
|
||||
final String deviceModel = deviceData['model'] ?? 'unknown';
|
||||
final String osVersion = Platform.isAndroid
|
||||
? deviceData['version']['release'] ?? 'unknown'
|
||||
: deviceData['systemVersion'] ?? 'unknown';
|
||||
|
||||
// Log the extracted information
|
||||
|
||||
// Generate and return the encrypted fingerprint
|
||||
final String fingerprint = '${deviceId}_${deviceModel}_$osVersion';
|
||||
print(EncryptionHelper.instance.encryptData(fingerprint));
|
||||
return EncryptionHelper.instance.encryptData(fingerprint);
|
||||
} catch (e) {
|
||||
throw Exception('Failed to generate device fingerprint');
|
||||
}
|
||||
}
|
||||
|
||||
final String deviceId =
|
||||
deviceData['androidId'] ?? deviceData['identifierForVendor'];
|
||||
final String deviceModel = deviceData['model'];
|
||||
final String osVersion = deviceData['systemVersion'];
|
||||
|
||||
return EncryptionHelper.instance
|
||||
.encryptData('${deviceId}_${deviceModel}_$osVersion');
|
||||
}
|
||||
|
||||
class SecurityHelper {
|
||||
|
||||
0
lib/controller/functions/remove_account.dart
Normal file → Executable file
0
lib/controller/functions/remove_account.dart
Normal file → Executable file
0
lib/controller/functions/scan_id_card.dart
Normal file → Executable file
0
lib/controller/functions/scan_id_card.dart
Normal file → Executable file
6
lib/controller/functions/secure_storage.dart
Normal file → Executable file
6
lib/controller/functions/secure_storage.dart
Normal file → Executable file
@@ -72,11 +72,7 @@ class AppInitializer {
|
||||
await CRUD().get(link: AppLink.getLocationAreaLinks, payload: {});
|
||||
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.instance.decryptData(links[0]['server_link']));
|
||||
|
||||
0
lib/controller/functions/security_checks.dart
Normal file → Executable file
0
lib/controller/functions/security_checks.dart
Normal file → Executable file
0
lib/controller/functions/sms_egypt_controller.dart
Normal file → Executable file
0
lib/controller/functions/sms_egypt_controller.dart
Normal file → Executable file
0
lib/controller/functions/toast.dart
Normal file → Executable file
0
lib/controller/functions/toast.dart
Normal file → Executable file
0
lib/controller/functions/tts.dart
Normal file → Executable file
0
lib/controller/functions/tts.dart
Normal file → Executable file
0
lib/controller/functions/twilio_service.dart
Normal file → Executable file
0
lib/controller/functions/twilio_service.dart
Normal file → Executable file
0
lib/controller/functions/upload_image.dart
Normal file → Executable file
0
lib/controller/functions/upload_image.dart
Normal file → Executable file
0
lib/controller/functions/vibrate.dart
Normal file → Executable file
0
lib/controller/functions/vibrate.dart
Normal file → Executable file
0
lib/controller/home/captin/contact_us_controller.dart
Normal file → Executable file
0
lib/controller/home/captin/contact_us_controller.dart
Normal file → Executable file
0
lib/controller/home/captin/duration_controller .dart
Normal file → Executable file
0
lib/controller/home/captin/duration_controller .dart
Normal file → Executable file
0
lib/controller/home/captin/help/assurance_controller.dart
Normal file → Executable file
0
lib/controller/home/captin/help/assurance_controller.dart
Normal file → Executable file
0
lib/controller/home/captin/help/help_controller.dart
Normal file → Executable file
0
lib/controller/home/captin/help/help_controller.dart
Normal file → Executable file
0
lib/controller/home/captin/help/maintain_center_controller.dart
Normal file → Executable file
0
lib/controller/home/captin/help/maintain_center_controller.dart
Normal file → Executable file
0
lib/controller/home/captin/help/video_controller.dart
Normal file → Executable file
0
lib/controller/home/captin/help/video_controller.dart
Normal file → Executable file
20
lib/controller/home/captin/home_captain_controller.dart
Normal file → Executable file
20
lib/controller/home/captin/home_captain_controller.dart
Normal file → Executable file
@@ -323,21 +323,33 @@ class HomeCaptainController extends GetxController {
|
||||
// }
|
||||
|
||||
addToken() async {
|
||||
String? fingerPrint = await storage.read(key: BoxName.fingerPrint);
|
||||
await CRUD().post(link: AppLink.addTokensDriver, payload: {
|
||||
'token': box.read(BoxName.tokenDriver),
|
||||
'captain_id': box.read(BoxName.driverID).toString()
|
||||
'token': (box.read(BoxName.tokenDriver)),
|
||||
'captain_id': (box.read(BoxName.driverID)).toString(),
|
||||
'fingerPrint': (fingerPrint).toString()
|
||||
});
|
||||
|
||||
await CRUD().post(
|
||||
link: "${AppLink.seferAlexandriaServer}/ride/firebase/addDriver.php",
|
||||
payload: {
|
||||
'token': box.read(BoxName.tokenDriver),
|
||||
'captain_id': box.read(BoxName.driverID).toString()
|
||||
'captain_id': box.read(BoxName.driverID).toString(),
|
||||
'fingerPrint': (fingerPrint).toString()
|
||||
});
|
||||
await CRUD().post(
|
||||
link: "${AppLink.seferGizaServer}/ride/firebase/addDriver.php",
|
||||
payload: {
|
||||
'token': box.read(BoxName.tokenDriver),
|
||||
'captain_id': box.read(BoxName.driverID).toString()
|
||||
'captain_id': box.read(BoxName.driverID).toString(),
|
||||
'fingerPrint': (fingerPrint).toString()
|
||||
});
|
||||
await CRUD().post(
|
||||
link: "${AppLink.seferPaymentServer}/ride/firebase/addDriver.php",
|
||||
payload: {
|
||||
'token': box.read(BoxName.tokenDriver),
|
||||
'captain_id': box.read(BoxName.driverID).toString(),
|
||||
'fingerPrint': (fingerPrint).toString()
|
||||
});
|
||||
MapDriverController().driverCallPassenger();
|
||||
// box.write(BoxName.statusDriverLocation, 'off');
|
||||
|
||||
0
lib/controller/home/captin/map_driver_controller.dart
Normal file → Executable file
0
lib/controller/home/captin/map_driver_controller.dart
Normal file → Executable file
0
lib/controller/home/captin/order_request_controller.dart
Normal file → Executable file
0
lib/controller/home/captin/order_request_controller.dart
Normal file → Executable file
0
lib/controller/home/menu_controller.dart
Normal file → Executable file
0
lib/controller/home/menu_controller.dart
Normal file → Executable file
36
lib/controller/home/payment/captain_wallet_controller.dart
Normal file → Executable file
36
lib/controller/home/payment/captain_wallet_controller.dart
Normal file → Executable file
@@ -1,5 +1,6 @@
|
||||
import 'dart:convert';
|
||||
|
||||
import 'package:local_auth/local_auth.dart';
|
||||
import 'package:sefer_driver/constant/style.dart';
|
||||
import 'package:sefer_driver/controller/firebase/firbase_messge.dart';
|
||||
import 'package:sefer_driver/controller/firebase/local_notification.dart';
|
||||
@@ -12,6 +13,8 @@ import 'package:sefer_driver/constant/links.dart';
|
||||
import 'package:sefer_driver/controller/functions/crud.dart';
|
||||
import 'package:sefer_driver/main.dart';
|
||||
|
||||
import '../../../views/widgets/mydialoug.dart';
|
||||
|
||||
class CaptainWalletController extends GetxController {
|
||||
bool isLoading = false;
|
||||
final formKeyTransfer = GlobalKey<FormState>();
|
||||
@@ -40,7 +43,7 @@ class CaptainWalletController extends GetxController {
|
||||
await generateToken((pointFromBudget * -1).toString());
|
||||
var paymentID = await getPaymentId(
|
||||
'fromBudgetToPoints', (pointFromBudget * -1).toString());
|
||||
await CRUD().post(link: AppLink.addDrivePayment, payload: {
|
||||
await CRUD().postWallet(link: AppLink.addDrivePayment, payload: {
|
||||
'amount': (pointFromBudget * -1).toString(),
|
||||
'rideId': paymentID.toString(),
|
||||
'payment_method': 'myBudget',
|
||||
@@ -79,7 +82,7 @@ class CaptainWalletController extends GetxController {
|
||||
//get new driver details
|
||||
isNewTransfer = true;
|
||||
update();
|
||||
var res = await CRUD().get(
|
||||
var res = await CRUD().getWallet(
|
||||
link: AppLink.getDriverDetails,
|
||||
payload: {'driver_phone': '+2${newDriverPhoneController.text}'});
|
||||
isNewTransfer = false;
|
||||
@@ -100,7 +103,7 @@ class CaptainWalletController extends GetxController {
|
||||
Future getCaptainWalletFromRide() async {
|
||||
isLoading = true;
|
||||
update();
|
||||
var res = await CRUD().get(
|
||||
var res = await CRUD().getWallet(
|
||||
link: AppLink.getAllPaymentFromRide,
|
||||
payload: {'driverID': box.read(BoxName.driverID).toString()},
|
||||
);
|
||||
@@ -109,7 +112,7 @@ class CaptainWalletController extends GetxController {
|
||||
walletDate = jsonDecode(res);
|
||||
totalAmount = walletDate['message'][0]['total_amount'] ?? '0';
|
||||
update();
|
||||
var res1 = await CRUD().get(
|
||||
var res1 = await CRUD().getWallet(
|
||||
link: AppLink.getAllPaymentVisa,
|
||||
payload: {'driverID': box.read(BoxName.driverID).toString()});
|
||||
walletDateVisa = jsonDecode(res1);
|
||||
@@ -126,7 +129,7 @@ class CaptainWalletController extends GetxController {
|
||||
// isLoading = true;
|
||||
update();
|
||||
|
||||
var res = await CRUD().get(
|
||||
var res = await CRUD().getWallet(
|
||||
link: AppLink.getDriverPaymentPoints,
|
||||
payload: {'driverID': box.read(BoxName.driverID).toString()},
|
||||
);
|
||||
@@ -147,7 +150,8 @@ class CaptainWalletController extends GetxController {
|
||||
|
||||
String paymentToken = '';
|
||||
Future<String> generateToken(String amount) async {
|
||||
var res = await CRUD().post(link: AppLink.addPaymentTokenDriver, payload: {
|
||||
var res =
|
||||
await CRUD().postWallet(link: AppLink.addPaymentTokenDriver, payload: {
|
||||
'driverID': box.read(BoxName.driverID).toString(),
|
||||
'amount': amount.toString(),
|
||||
});
|
||||
@@ -158,7 +162,8 @@ class CaptainWalletController extends GetxController {
|
||||
// late String paymentID;
|
||||
Future<String> getPaymentId(String paymentMethod, amount) async {
|
||||
// paymentToken = await generateToken(amount);
|
||||
var res = await CRUD().post(link: AppLink.addDriverPaymentPoints, payload: {
|
||||
var res =
|
||||
await CRUD().postWallet(link: AppLink.addDriverPaymentPoints, payload: {
|
||||
'driverID': box.read(BoxName.driverID).toString(),
|
||||
'amount': amount.toString(),
|
||||
'payment_method': paymentMethod.toString(),
|
||||
@@ -171,7 +176,7 @@ class CaptainWalletController extends GetxController {
|
||||
Future addDriverWallet(String paymentMethod, point, count) async {
|
||||
paymentToken = await generateToken(count);
|
||||
var paymentID = await getPaymentId(paymentMethod, point);
|
||||
await CRUD().post(link: AppLink.addDriversWalletPoints, payload: {
|
||||
await CRUD().postWallet(link: AppLink.addDriversWalletPoints, payload: {
|
||||
'driverID': box.read(BoxName.driverID).toString(),
|
||||
'paymentID': paymentID.toString(),
|
||||
'amount': point,
|
||||
@@ -183,7 +188,7 @@ class CaptainWalletController extends GetxController {
|
||||
Future addDriverPayment(String paymentMethod, point, wayPay) async {
|
||||
paymentToken = await generateToken(point);
|
||||
var paymentID = await getPaymentId(paymentMethod, point.toString());
|
||||
await CRUD().post(link: AppLink.addDrivePayment, payload: {
|
||||
await CRUD().postWallet(link: AppLink.addDrivePayment, payload: {
|
||||
'amount': point.toString(),
|
||||
'rideId': paymentID.toString(),
|
||||
'payment_method': paymentMethod,
|
||||
@@ -195,7 +200,7 @@ class CaptainWalletController extends GetxController {
|
||||
|
||||
Future addDriverWalletFromPromo(String paymentMethod, point) async {
|
||||
var resPromotion =
|
||||
await CRUD().post(link: AppLink.addpromotionDriver, payload: {
|
||||
await CRUD().postWallet(link: AppLink.addpromotionDriver, payload: {
|
||||
'driver_id': box.read(BoxName.driverID).toString(),
|
||||
'payment_amount': point,
|
||||
'timePromo': paymentMethod,
|
||||
@@ -203,7 +208,8 @@ class CaptainWalletController extends GetxController {
|
||||
if (resPromotion != 'failure') {
|
||||
paymentToken = await generateToken(point);
|
||||
var paymentID = await getPaymentId(paymentMethod, point.toString());
|
||||
var res = await CRUD().post(link: AppLink.addDrivePayment, payload: {
|
||||
var res =
|
||||
await CRUD().postWallet(link: AppLink.addDrivePayment, payload: {
|
||||
'amount': point,
|
||||
'rideId': paymentID.toString(),
|
||||
'payment_method': paymentMethod.toString(),
|
||||
@@ -231,7 +237,7 @@ class CaptainWalletController extends GetxController {
|
||||
Future addDriverWalletToInvitor(String paymentMethod, driverID, point) async {
|
||||
paymentToken = await generateToken(point);
|
||||
var paymentID = await getPaymentId(paymentMethod, point.toString());
|
||||
await CRUD().post(link: AppLink.addDrivePayment, payload: {
|
||||
await CRUD().postWallet(link: AppLink.addDrivePayment, payload: {
|
||||
'driverID': driverID,
|
||||
'amount': point,
|
||||
'token': paymentToken,
|
||||
@@ -244,7 +250,7 @@ class CaptainWalletController extends GetxController {
|
||||
|
||||
Future addSeferWallet(String paymentMethod, String point) async {
|
||||
var seferToken = await generateToken(point.toString());
|
||||
await CRUD().post(link: AppLink.addSeferWallet, payload: {
|
||||
await CRUD().postWallet(link: AppLink.addSeferWallet, payload: {
|
||||
'amount': point.toString(),
|
||||
'paymentMethod': paymentMethod,
|
||||
'passengerId': 'driver',
|
||||
@@ -259,7 +265,7 @@ class CaptainWalletController extends GetxController {
|
||||
paymentToken = await generateToken(
|
||||
(int.parse(amountFromBudgetController.text) * -1).toString());
|
||||
|
||||
await CRUD().post(link: AppLink.addDrivePayment, payload: {
|
||||
await CRUD().postWallet(link: AppLink.addDrivePayment, payload: {
|
||||
'amount': (int.parse(amountFromBudgetController.text) * -1).toString(),
|
||||
'rideId': paymentID.toString(),
|
||||
'payment_method': paymentMethod1,
|
||||
@@ -272,7 +278,7 @@ class CaptainWalletController extends GetxController {
|
||||
(int.parse(amountFromBudgetController.text) - 5).toString());
|
||||
paymentToken = await generateToken(amountFromBudgetController.text);
|
||||
var res1 =
|
||||
await CRUD().post(link: AppLink.addDriversWalletPoints, payload: {
|
||||
await CRUD().postWallet(link: AppLink.addDriversWalletPoints, payload: {
|
||||
'driverID': amountToNewDriverMap[0]['id'].toString(),
|
||||
'paymentID': paymentID.toString(),
|
||||
'amount': ((int.parse(amountFromBudgetController.text) - 5))
|
||||
|
||||
0
lib/controller/home/payment/credit_card_Controller.dart
Normal file → Executable file
0
lib/controller/home/payment/credit_card_Controller.dart
Normal file → Executable file
282
lib/controller/home/payment/paymob_payout.dart
Normal file → Executable file
282
lib/controller/home/payment/paymob_payout.dart
Normal file → Executable file
@@ -1,10 +1,9 @@
|
||||
import 'dart:convert';
|
||||
|
||||
import 'package:local_auth/local_auth.dart';
|
||||
import 'package:sefer_driver/constant/api_key.dart';
|
||||
import 'package:sefer_driver/constant/box_name.dart';
|
||||
import 'package:sefer_driver/constant/colors.dart';
|
||||
import 'package:sefer_driver/main.dart';
|
||||
import 'package:sefer_driver/print.dart';
|
||||
import 'package:sefer_driver/views/widgets/error_snakbar.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:http/http.dart' as http;
|
||||
@@ -12,6 +11,7 @@ import 'package:secure_string_operations/secure_string_operations.dart';
|
||||
|
||||
import '../../../constant/char_map.dart';
|
||||
import '../../../constant/links.dart';
|
||||
import '../../../views/widgets/mydialoug.dart';
|
||||
import '../../functions/crud.dart';
|
||||
import 'captain_wallet_controller.dart';
|
||||
|
||||
@@ -52,56 +52,78 @@ class PaymobPayout extends GetxController {
|
||||
int payOutFee = 5;
|
||||
payToDriverWallet(
|
||||
String token, String amount, String issuer, String msisdn) async {
|
||||
var headers = {
|
||||
'Authorization': 'Bearer $token',
|
||||
'Content-Type': 'application/json',
|
||||
};
|
||||
var body = json.encode({
|
||||
"amount": amount, //"10.00",
|
||||
"issuer": issuer, //"vodafone",
|
||||
"msisdn": msisdn, // "01023456789"
|
||||
});
|
||||
var res = await http.post(
|
||||
Uri.parse('https://payouts.paymobsolutions.com/api/secure/disburse/'),
|
||||
headers: headers,
|
||||
body: body,
|
||||
);
|
||||
var dec = jsonDecode(res.body);
|
||||
if (dec['disbursement_status'] == 'successful') {
|
||||
var paymentToken = await Get.find<CaptainWalletController>()
|
||||
.generateToken(
|
||||
((-1) * (double.parse(dec['amount'].toString())) - payOutFee)
|
||||
.toStringAsFixed(0));
|
||||
await CRUD().post(link: AppLink.addDrivePayment, payload: {
|
||||
'rideId': DateTime.now().toIso8601String(),
|
||||
'amount': ((-1) * (double.parse(dec['amount'].toString())) - payOutFee)
|
||||
.toStringAsFixed(0),
|
||||
'payment_method': 'payout',
|
||||
'passengerID': 'myself',
|
||||
'token': paymentToken,
|
||||
'driverID': box.read(BoxName.driverID).toString(),
|
||||
bool isAvailable = await LocalAuthentication().isDeviceSupported();
|
||||
if (isAvailable) {
|
||||
// Authenticate the user
|
||||
bool didAuthenticate = await LocalAuthentication().authenticate(
|
||||
localizedReason: 'Use Touch ID or Face ID to confirm payment',
|
||||
options: AuthenticationOptions(
|
||||
biometricOnly: true,
|
||||
sensitiveTransaction: true,
|
||||
));
|
||||
if (didAuthenticate) {
|
||||
var headers = {
|
||||
'Authorization': 'Bearer $token',
|
||||
'Content-Type': 'application/json',
|
||||
};
|
||||
var body = json.encode({
|
||||
"amount": amount, //"10.00",
|
||||
"issuer": issuer, //"vodafone",
|
||||
"msisdn": msisdn, // "01023456789"
|
||||
});
|
||||
var res = await http.post(
|
||||
Uri.parse('https://payouts.paymobsolutions.com/api/secure/disburse/'),
|
||||
headers: headers,
|
||||
body: body,
|
||||
);
|
||||
var dec = jsonDecode(res.body);
|
||||
if (dec['disbursement_status'] == 'successful') {
|
||||
var paymentToken = await Get.find<CaptainWalletController>()
|
||||
.generateToken(
|
||||
((-1) * (double.parse(dec['amount'].toString())) - payOutFee)
|
||||
.toStringAsFixed(0));
|
||||
await CRUD().postWallet(link: AppLink.addDrivePayment, payload: {
|
||||
'rideId': DateTime.now().toIso8601String(),
|
||||
'amount':
|
||||
((-1) * (double.parse(dec['amount'].toString())) - payOutFee)
|
||||
.toStringAsFixed(0),
|
||||
'payment_method': 'payout',
|
||||
'passengerID': 'myself',
|
||||
'token': paymentToken,
|
||||
'driverID': box.read(BoxName.driverID).toString(),
|
||||
});
|
||||
await Get.find<CaptainWalletController>()
|
||||
.addSeferWallet('payout fee myself', payOutFee.toString());
|
||||
await updatePaymentToPaid(box.read(BoxName.driverID).toString());
|
||||
await sendEmail(
|
||||
box.read(BoxName.driverID).toString(),
|
||||
amount,
|
||||
box.read(BoxName.phoneDriver).toString(),
|
||||
box.read(BoxName.nameDriver).toString(),
|
||||
'Wallet',
|
||||
box.read(BoxName.emailDriver).toString());
|
||||
|
||||
mySnackbarSuccess('${'Transaction successful'.tr} ${dec['amount']}');
|
||||
|
||||
Get.find<CaptainWalletController>().refreshCaptainWallet();
|
||||
} else if (dec['disbursement_status'] == 'failed') {
|
||||
mySnackeBarError('Transaction failed'.tr);
|
||||
}
|
||||
} else {
|
||||
MyDialog().getDialog('Authentication failed'.tr, ''.tr, () {
|
||||
Get.back();
|
||||
});
|
||||
}
|
||||
} else {
|
||||
MyDialog().getDialog('Biometric Authentication'.tr,
|
||||
'You should use Touch ID or Face ID to confirm payment'.tr, () {
|
||||
Get.back();
|
||||
});
|
||||
await Get.find<CaptainWalletController>()
|
||||
.addSeferWallet('payout fee myself', payOutFee.toString());
|
||||
await updatePaymentToPaid(box.read(BoxName.driverID).toString());
|
||||
await sendEmail(
|
||||
box.read(BoxName.driverID).toString(),
|
||||
amount,
|
||||
box.read(BoxName.phoneDriver).toString(),
|
||||
box.read(BoxName.nameDriver).toString(),
|
||||
'Wallet',
|
||||
box.read(BoxName.emailDriver).toString());
|
||||
|
||||
mySnackbarSuccess('${'Transaction successful'.tr} ${dec['amount']}');
|
||||
|
||||
Get.find<CaptainWalletController>().refreshCaptainWallet();
|
||||
} else if (dec['disbursement_status'] == 'failed') {
|
||||
mySnackeBarError('Transaction failed'.tr);
|
||||
}
|
||||
}
|
||||
|
||||
Future updatePaymentToPaid(String driverID) async {
|
||||
await CRUD().post(link: AppLink.updatePaymetToPaid, payload: {
|
||||
await CRUD().postWallet(link: AppLink.updatePaymetToPaid, payload: {
|
||||
'driverID': driverID.toString(),
|
||||
});
|
||||
}
|
||||
@@ -129,66 +151,130 @@ class PaymobPayout extends GetxController {
|
||||
|
||||
payToDriverBankAccount(String token, String amount, String bankCardNumber,
|
||||
String bankCode) async {
|
||||
var headers = {
|
||||
'Authorization': 'Bearer $token',
|
||||
'Content-Type': 'application/json',
|
||||
};
|
||||
var body = {
|
||||
"issuer": "bank_card",
|
||||
"amount": amount, //9.0,
|
||||
"full_name":
|
||||
'${box.read(BoxName.nameDriver)} ${box.read(BoxName.lastNameDriver)}',
|
||||
"bank_card_number": bankCardNumber, //"1111-2222-3333-4444",
|
||||
"bank_code": bankCode, //"CIB",
|
||||
"bank_transaction_type": "cash_transfer"
|
||||
};
|
||||
var res = await http.post(
|
||||
Uri.parse('https://payouts.paymobsolutions.com/api/secure/disburse/'),
|
||||
headers: headers,
|
||||
body: body,
|
||||
);
|
||||
var dec = jsonDecode(res.body);
|
||||
if (dec['disbursement_status'] == 'successful') {
|
||||
var paymentToken = await Get.find<CaptainWalletController>()
|
||||
.generateToken(
|
||||
((-1) * (double.parse(dec['amount'].toString())) - payOutFee)
|
||||
.toStringAsFixed(0));
|
||||
await CRUD().post(link: AppLink.addDrivePayment, payload: {
|
||||
'rideId': DateTime.now().toIso8601String(),
|
||||
'amount': ((-1) * (double.parse(dec['amount'].toString())) - payOutFee)
|
||||
.toStringAsFixed(0),
|
||||
'payment_method': 'payout',
|
||||
'passengerID': 'myself',
|
||||
'token': paymentToken,
|
||||
'driverID': box.read(BoxName.driverID).toString(),
|
||||
});
|
||||
await Get.find<CaptainWalletController>()
|
||||
.addSeferWallet('payout fee myself', payOutFee.toString());
|
||||
await updatePaymentToPaid(box.read(BoxName.driverID).toString());
|
||||
await sendEmail(
|
||||
box.read(BoxName.driverID).toString(),
|
||||
amount,
|
||||
box.read(BoxName.phoneDriver).toString(),
|
||||
box.read(BoxName.nameDriver).toString(),
|
||||
'Wallet',
|
||||
box.read(BoxName.emailDriver).toString());
|
||||
bool isAvailable = await LocalAuthentication().isDeviceSupported();
|
||||
if (isAvailable) {
|
||||
// Authenticate the user
|
||||
bool didAuthenticate = await LocalAuthentication().authenticate(
|
||||
localizedReason: 'Use Touch ID or Face ID to confirm payment',
|
||||
options: AuthenticationOptions(
|
||||
biometricOnly: true,
|
||||
sensitiveTransaction: true,
|
||||
));
|
||||
if (didAuthenticate) {
|
||||
var headers = {
|
||||
'Authorization': 'Bearer $token',
|
||||
'Content-Type': 'application/json',
|
||||
};
|
||||
var body = {
|
||||
"issuer": "bank_card",
|
||||
"amount": amount, //9.0,
|
||||
"full_name":
|
||||
'${box.read(BoxName.nameDriver)} ${box.read(BoxName.lastNameDriver)}',
|
||||
"bank_card_number": bankCardNumber, //"1111-2222-3333-4444",
|
||||
"bank_code": bankCode, //"CIB",
|
||||
"bank_transaction_type": "cash_transfer"
|
||||
};
|
||||
var res = await http.post(
|
||||
Uri.parse('https://payouts.paymobsolutions.com/api/secure/disburse/'),
|
||||
headers: headers,
|
||||
body: body,
|
||||
);
|
||||
var dec = jsonDecode(res.body);
|
||||
if (dec['disbursement_status'] == 'successful') {
|
||||
var paymentToken = await Get.find<CaptainWalletController>()
|
||||
.generateToken(
|
||||
((-1) * (double.parse(dec['amount'].toString())) - payOutFee)
|
||||
.toStringAsFixed(0));
|
||||
await CRUD().postWallet(link: AppLink.addDrivePayment, payload: {
|
||||
'rideId': DateTime.now().toIso8601String(),
|
||||
'amount':
|
||||
((-1) * (double.parse(dec['amount'].toString())) - payOutFee)
|
||||
.toStringAsFixed(0),
|
||||
'payment_method': 'payout',
|
||||
'passengerID': 'myself',
|
||||
'token': paymentToken,
|
||||
'driverID': box.read(BoxName.driverID).toString(),
|
||||
});
|
||||
await Get.find<CaptainWalletController>()
|
||||
.addSeferWallet('payout fee myself', payOutFee.toString());
|
||||
await updatePaymentToPaid(box.read(BoxName.driverID).toString());
|
||||
await sendEmail(
|
||||
box.read(BoxName.driverID).toString(),
|
||||
amount,
|
||||
box.read(BoxName.phoneDriver).toString(),
|
||||
box.read(BoxName.nameDriver).toString(),
|
||||
'Wallet',
|
||||
box.read(BoxName.emailDriver).toString());
|
||||
|
||||
mySnackbarSuccess('${'Transaction successful'.tr} ${dec['amount']}');
|
||||
Get.find<CaptainWalletController>().refreshCaptainWallet();
|
||||
} else if (dec['disbursement_status'] == 'failed') {
|
||||
mySnackeBarError('Transaction failed'.tr);
|
||||
mySnackbarSuccess('${'Transaction successful'.tr} ${dec['amount']}');
|
||||
Get.find<CaptainWalletController>().refreshCaptainWallet();
|
||||
} else if (dec['disbursement_status'] == 'failed') {
|
||||
mySnackeBarError('Transaction failed'.tr);
|
||||
}
|
||||
} else {
|
||||
MyDialog().getDialog('Authentication failed'.tr, ''.tr, () {
|
||||
Get.back();
|
||||
});
|
||||
}
|
||||
} else {
|
||||
MyDialog().getDialog('Biometric Authentication'.tr,
|
||||
'You should use Touch ID or Face ID to confirm payment'.tr, () {
|
||||
Get.back();
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
Future payToWalletDriverAll(
|
||||
String amount, String issuer, String msisdn) async {
|
||||
String token = await getToken();
|
||||
await payToDriverWallet(token, amount, issuer, msisdn);
|
||||
bool isAvailable = await LocalAuthentication().isDeviceSupported();
|
||||
if (isAvailable) {
|
||||
// Authenticate the user
|
||||
bool didAuthenticate = await LocalAuthentication().authenticate(
|
||||
localizedReason: 'Use Touch ID or Face ID to confirm payment',
|
||||
options: AuthenticationOptions(
|
||||
biometricOnly: true,
|
||||
sensitiveTransaction: true,
|
||||
));
|
||||
if (didAuthenticate) {
|
||||
String token = await getToken();
|
||||
await payToDriverWallet(token, amount, issuer, msisdn);
|
||||
} else {
|
||||
MyDialog().getDialog('Authentication failed'.tr, ''.tr, () {
|
||||
Get.back();
|
||||
});
|
||||
}
|
||||
} else {
|
||||
MyDialog().getDialog('Biometric Authentication'.tr,
|
||||
'You should use Touch ID or Face ID to confirm payment'.tr, () {
|
||||
Get.back();
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
Future payToBankDriverAll(
|
||||
String amount, String bankCardNumber, String bankCode) async {
|
||||
String token = await getToken();
|
||||
await payToDriverBankAccount(token, amount, bankCardNumber, bankCode);
|
||||
bool isAvailable = await LocalAuthentication().isDeviceSupported();
|
||||
if (isAvailable) {
|
||||
// Authenticate the user
|
||||
bool didAuthenticate = await LocalAuthentication().authenticate(
|
||||
localizedReason: 'Use Touch ID or Face ID to confirm payment',
|
||||
options: AuthenticationOptions(
|
||||
biometricOnly: true,
|
||||
sensitiveTransaction: true,
|
||||
));
|
||||
if (didAuthenticate) {
|
||||
String token = await getToken();
|
||||
await payToDriverBankAccount(token, amount, bankCardNumber, bankCode);
|
||||
} else {
|
||||
MyDialog().getDialog('Authentication failed'.tr, ''.tr, () {
|
||||
Get.back();
|
||||
});
|
||||
}
|
||||
} else {
|
||||
MyDialog().getDialog('Biometric Authentication'.tr,
|
||||
'You should use Touch ID or Face ID to confirm payment'.tr, () {
|
||||
Get.back();
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
0
lib/controller/home/points_for_rider_controller.dart
Normal file → Executable file
0
lib/controller/home/points_for_rider_controller.dart
Normal file → Executable file
0
lib/controller/home/profile/feed_back_controller.dart
Normal file → Executable file
0
lib/controller/home/profile/feed_back_controller.dart
Normal file → Executable file
0
lib/controller/home/profile/order_history_controller.dart
Normal file → Executable file
0
lib/controller/home/profile/order_history_controller.dart
Normal file → Executable file
0
lib/controller/home/profile/promos_controller.dart
Normal file → Executable file
0
lib/controller/home/profile/promos_controller.dart
Normal file → Executable file
0
lib/controller/home/splash_screen_controlle.dart
Normal file → Executable file
0
lib/controller/home/splash_screen_controlle.dart
Normal file → Executable file
0
lib/controller/local/local_controller.dart
Normal file → Executable file
0
lib/controller/local/local_controller.dart
Normal file → Executable file
0
lib/controller/local/translations.dart
Normal file → Executable file
0
lib/controller/local/translations.dart
Normal file → Executable file
0
lib/controller/notification/notification_captain_controller.dart
Normal file → Executable file
0
lib/controller/notification/notification_captain_controller.dart
Normal file → Executable file
0
lib/controller/notification/passenger_notification_controller.dart
Normal file → Executable file
0
lib/controller/notification/passenger_notification_controller.dart
Normal file → Executable file
0
lib/controller/notification/ride_available_controller.dart
Normal file → Executable file
0
lib/controller/notification/ride_available_controller.dart
Normal file → Executable file
218
lib/controller/packages/lingo/lingo_hunter.dart
Normal file
218
lib/controller/packages/lingo/lingo_hunter.dart
Normal file
@@ -0,0 +1,218 @@
|
||||
import 'dart:io';
|
||||
import 'dart:convert';
|
||||
|
||||
abstract class LingoHunter {
|
||||
/// Extracts translatable strings...
|
||||
static Future<void> extractAndCreateTranslationFiles({
|
||||
required String baseLang,
|
||||
required List<String> langs,
|
||||
String? projectDirectory,
|
||||
String? outputDirectory,
|
||||
bool translateBaseLang = true,
|
||||
List<RegExp>? additionalRegExps,
|
||||
bool overrideRegExps = false,
|
||||
List<String> fileExtensions = const ['.dart'],
|
||||
}) async {
|
||||
// 1. Find project root (improved logic)
|
||||
String projectRoot;
|
||||
if (projectDirectory != null) {
|
||||
// Use provided directory, but check if it's valid
|
||||
if (!await Directory(projectDirectory).exists()) {
|
||||
throw ArgumentError(
|
||||
"The provided projectDirectory '$projectDirectory' does not exist.");
|
||||
}
|
||||
projectRoot = projectDirectory;
|
||||
} else {
|
||||
projectRoot = await _findProjectRoot(); // Use the corrected function
|
||||
}
|
||||
|
||||
// 2. Use the project root as output directory if not specified
|
||||
final String outputDir = outputDirectory ?? projectRoot;
|
||||
|
||||
// 3. Output Directory Verification (Create if necessary)
|
||||
final Directory outputDirObj = Directory(outputDir);
|
||||
if (!await outputDirObj.exists()) {
|
||||
try {
|
||||
await outputDirObj.create(recursive: true);
|
||||
} catch (e) {
|
||||
throw Exception(
|
||||
"Failed to create output directory: $outputDir. Error: $e");
|
||||
}
|
||||
}
|
||||
|
||||
print("Project root directory: $projectRoot");
|
||||
print("Output directory: $outputDir");
|
||||
|
||||
// 4. Extract translatable strings
|
||||
final Set<String> strings = await extractStringsFromFlutterProject(
|
||||
directory: projectRoot, // Use the validated projectRoot
|
||||
additionalRegExps: additionalRegExps,
|
||||
overrideRegExps: overrideRegExps,
|
||||
fileExtensions: fileExtensions,
|
||||
);
|
||||
|
||||
// 5. Generate translation files
|
||||
await _createTranslationFiles(
|
||||
strings: strings,
|
||||
outputDirectory: outputDir,
|
||||
baseLang: baseLang,
|
||||
langs: langs,
|
||||
translateBaseLang: translateBaseLang,
|
||||
);
|
||||
|
||||
print("Successfully extracted strings and generated translation files.");
|
||||
}
|
||||
|
||||
/// Finds the project's root directory (corrected)
|
||||
static Future<String> _findProjectRoot() async {
|
||||
Directory current = Directory.current;
|
||||
int maxIterations = 10; // Prevent infinite loop
|
||||
int count = 0;
|
||||
|
||||
while (count < maxIterations) {
|
||||
if (await File('${current.path}/pubspec.yaml').exists()) {
|
||||
return current.path; // Return the directory *containing* pubspec.yaml
|
||||
}
|
||||
|
||||
if (current.path == current.parent.path) {
|
||||
break; // Reached root, stop searching
|
||||
}
|
||||
|
||||
current = current.parent;
|
||||
count++;
|
||||
}
|
||||
|
||||
// If `pubspec.yaml` was not found, throw an exception
|
||||
throw Exception(
|
||||
"`pubspec.yaml` not found in the current directory or its parents.");
|
||||
}
|
||||
|
||||
/// Extracts translatable strings (no changes needed here)
|
||||
static Future<Set<String>> extractStringsFromFlutterProject({
|
||||
required String directory,
|
||||
List<RegExp>? additionalRegExps,
|
||||
bool overrideRegExps = false,
|
||||
List<String> fileExtensions = const ['.dart'],
|
||||
}) async {
|
||||
// ... (rest of the function remains the same) ...
|
||||
final List<RegExp> defaultPatterns = [
|
||||
RegExp(r'"([^"]+)"\.tr\(\)'), // "string".tr()
|
||||
RegExp(r"'([^']+)'\.tr\(\)"), // 'string'.tr()
|
||||
RegExp(r'"([^"]+)"\.tr'), // "string".tr
|
||||
RegExp(r"'([^']+)'\.tr"), // 'string'.tr
|
||||
RegExp(r'"([^"]+)"\.tr\(\w+\)'), // "string".tr(context)
|
||||
RegExp(r"'([^']+)'\.tr\(\w+\)"), // 'string'.tr(context)
|
||||
RegExp(r'context\.tr\("([^"]+)"\)'), // context.tr("string")
|
||||
RegExp(r"context\.tr\('([^']+)'\)"), // context.tr('string')
|
||||
RegExp(r'tr\(\w+, "([^"]+)"\)'), // tr(context, "string")
|
||||
RegExp(r"tr\(\w+, '([^']+)'\)"), // tr(context, 'string')
|
||||
RegExp(r'tr\("([^"]+)"\)'), // tr("string")
|
||||
RegExp(r"tr\('([^']+)'\)"), // tr('string')
|
||||
RegExp(r'"([^"]+)"\.tr\(args: \[.*?\]\)'), // "string".tr(args: [])
|
||||
RegExp(r'"([^"]+)"\.plural\(\d+\)'), // "string".plural(3)
|
||||
//Intl Package Patterns
|
||||
RegExp(r'AppLocalizations\.of\(context\)!\.translate\("([^"]+)"\)'),
|
||||
];
|
||||
|
||||
// Determine the patterns to use
|
||||
List<RegExp> patterns;
|
||||
if (overrideRegExps && additionalRegExps != null) {
|
||||
patterns = additionalRegExps;
|
||||
} else {
|
||||
patterns = [...defaultPatterns];
|
||||
if (additionalRegExps != null) {
|
||||
patterns.addAll(additionalRegExps);
|
||||
}
|
||||
}
|
||||
|
||||
final Set<String> strings = {};
|
||||
final Directory projectDirObj = Directory(directory);
|
||||
|
||||
// Check if the directory exists *before* listing
|
||||
if (!await projectDirObj.exists()) {
|
||||
throw ArgumentError("The directory '$directory' does not exist.");
|
||||
}
|
||||
|
||||
final List<FileSystemEntity> entities =
|
||||
await projectDirObj.list(recursive: true).toList();
|
||||
|
||||
// Filter files by the specified extensions
|
||||
final List<File> filteredFiles = entities
|
||||
.whereType<File>()
|
||||
.where((file) => fileExtensions.any((ext) => file.path.endsWith(ext)))
|
||||
.toList();
|
||||
|
||||
// Extract strings from files
|
||||
for (final File file in filteredFiles) {
|
||||
final String content = await file.readAsString();
|
||||
|
||||
for (final RegExp pattern in patterns) {
|
||||
final Iterable<RegExpMatch> matches = pattern.allMatches(content);
|
||||
|
||||
for (final RegExpMatch match in matches) {
|
||||
if (match.groupCount >= 1 && match.group(1) != null) {
|
||||
strings.add(match.group(1)!);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return strings;
|
||||
}
|
||||
|
||||
/// Creates translation files (no changes needed)
|
||||
static Future<void> _createTranslationFiles({
|
||||
required Set<String> strings,
|
||||
required String outputDirectory,
|
||||
required String baseLang,
|
||||
required List<String> langs,
|
||||
bool translateBaseLang = true,
|
||||
}) async {
|
||||
// ... (rest of the function remains the same) ...
|
||||
final Directory outputDir = Directory(outputDirectory);
|
||||
if (!await outputDir.exists()) {
|
||||
await outputDir.create(recursive: true);
|
||||
}
|
||||
|
||||
// Always create the base language file, even if `translateBaseLang` is false
|
||||
final String baseFilePath = '$outputDirectory/translations_$baseLang.json';
|
||||
final Map<String, String> baseStrings = {
|
||||
for (final string in strings) string: translateBaseLang ? string : ""
|
||||
};
|
||||
await _writeTranslationFile(baseFilePath, baseStrings);
|
||||
|
||||
for (final String lang in langs) {
|
||||
final String langFilePath = '$outputDirectory/translations_$lang.json';
|
||||
final Map<String, String> langStrings = {
|
||||
for (final string in strings) string: ""
|
||||
};
|
||||
await _writeTranslationFile(langFilePath, langStrings);
|
||||
}
|
||||
}
|
||||
|
||||
/// Writes a translation file (no changes needed)
|
||||
static Future<void> _writeTranslationFile(
|
||||
String filePath, Map<String, String> strings) async {
|
||||
// ... (rest of the function remains the same) ...
|
||||
final File file = File(filePath);
|
||||
final StringBuffer content = StringBuffer();
|
||||
content.writeln('{');
|
||||
|
||||
int index = 0;
|
||||
for (final MapEntry<String, String> entry in strings.entries) {
|
||||
final String comma = (index < strings.length - 1) ? ',' : '';
|
||||
final String key =
|
||||
jsonEncode(entry.key).substring(1, jsonEncode(entry.key).length - 1);
|
||||
final String value = entry.value.isEmpty
|
||||
? ""
|
||||
: jsonEncode(entry.value)
|
||||
.substring(1, jsonEncode(entry.value).length - 1);
|
||||
|
||||
content.writeln(' "$key": "$value"$comma');
|
||||
index++;
|
||||
}
|
||||
|
||||
content.writeln('}');
|
||||
await file.writeAsString(content.toString());
|
||||
}
|
||||
}
|
||||
0
lib/controller/payment/driver_payment_controller.dart
Normal file → Executable file
0
lib/controller/payment/driver_payment_controller.dart
Normal file → Executable file
158
lib/controller/payment/payment_controller.dart
Normal file → Executable file
158
lib/controller/payment/payment_controller.dart
Normal file → Executable file
@@ -56,7 +56,7 @@ class PaymentController extends GetxController {
|
||||
isLoading = true;
|
||||
update();
|
||||
|
||||
await CRUD().get(
|
||||
await CRUD().getWallet(
|
||||
link: AppLink.getWalletByPassenger,
|
||||
payload: {'passenger_id': box.read(BoxName.passengerID)}).then((value) {
|
||||
box.write(BoxName.passengerWalletTotal,
|
||||
@@ -71,7 +71,7 @@ class PaymentController extends GetxController {
|
||||
update();
|
||||
// double sallaryAccountNowBeforeAdding =
|
||||
// double.parse(box.read(BoxName.passengerWalletTotal).toString());
|
||||
await CRUD().post(link: AppLink.addPassengersWallet, payload: {
|
||||
await CRUD().postWallet(link: AppLink.addPassengersWallet, payload: {
|
||||
'passenger_id': box.read(BoxName.passengerID).toString(),
|
||||
'balance': selectedAmount.toString()
|
||||
}).then((value) {
|
||||
@@ -440,8 +440,11 @@ class PaymentController extends GetxController {
|
||||
if (isAvailable) {
|
||||
// Authenticate the user
|
||||
bool didAuthenticate = await LocalAuthentication().authenticate(
|
||||
localizedReason: 'Use Touch ID or Face ID to confirm payment',
|
||||
);
|
||||
localizedReason: 'Use Touch ID or Face ID to confirm payment',
|
||||
options: AuthenticationOptions(
|
||||
biometricOnly: true,
|
||||
sensitiveTransaction: true,
|
||||
));
|
||||
if (didAuthenticate) {
|
||||
final PaymobResponse? response = await PaymobPayment.instance.pay(
|
||||
context: context,
|
||||
@@ -490,73 +493,84 @@ class PaymentController extends GetxController {
|
||||
);
|
||||
}
|
||||
} else {
|
||||
Get.snackbar("Authentication Failed",
|
||||
"Please enable Face ID or Fingerprint in your settings.");
|
||||
|
||||
// Authentication failed, handle accordingly
|
||||
}
|
||||
} else {
|
||||
final PaymobResponse? response = await PaymobPayment.instance.pay(
|
||||
context: context,
|
||||
currency: currency, //"EGP",
|
||||
amountInCents: newAmount, // 19.00 EGP
|
||||
billingData: PaymobBillingData(),
|
||||
onPayment: (PaymobResponse response) {},
|
||||
);
|
||||
|
||||
if (response!.responseCode == 'APPROVED') {
|
||||
Get.defaultDialog(
|
||||
barrierDismissible: false,
|
||||
title: 'Payment Successful'.tr,
|
||||
titleStyle: AppStyle.title,
|
||||
// backgroundColor: AppColor.greenColor,
|
||||
content: Text(
|
||||
'The payment was approved.'.tr,
|
||||
style: AppStyle.title,
|
||||
),
|
||||
confirm: MyElevatedButton(
|
||||
kolor: AppColor.greenColor,
|
||||
title: 'OK'.tr,
|
||||
onPressed: () async {
|
||||
Get.back();
|
||||
method();
|
||||
},
|
||||
),
|
||||
);
|
||||
} else {
|
||||
Get.defaultDialog(
|
||||
barrierDismissible: false,
|
||||
// backgroundColor: AppColor.redColor,
|
||||
title: 'Payment Failed'.tr,
|
||||
content: Column(
|
||||
children: [
|
||||
IconButton(
|
||||
onPressed: () {
|
||||
Get.find<TextToSpeechController>().speakText(
|
||||
'The payment was not approved. Please try again.'.tr,
|
||||
);
|
||||
},
|
||||
icon: const Icon(Icons.headphones),
|
||||
),
|
||||
Text(
|
||||
'The payment was not approved. Please try again.'.tr,
|
||||
textAlign: TextAlign.center,
|
||||
style: AppStyle.title,
|
||||
),
|
||||
Text(
|
||||
'${'The reason is'.tr} ${response.message!.tr}',
|
||||
textAlign: TextAlign.center,
|
||||
style: AppStyle.title.copyWith(color: AppColor.redColor),
|
||||
),
|
||||
],
|
||||
),
|
||||
confirm: MyElevatedButton(
|
||||
title: 'OK'.tr,
|
||||
kolor: AppColor.redColor,
|
||||
onPressed: () async {
|
||||
Get.back();
|
||||
},
|
||||
),
|
||||
);
|
||||
}
|
||||
MyDialog().getDialog('Biometric Authentication'.tr,
|
||||
'You should use Touch ID or Face ID to confirm payment'.tr, () {
|
||||
Get.back();
|
||||
});
|
||||
// Authentication failed, handle accordingly
|
||||
}
|
||||
// else {
|
||||
// final PaymobResponse? response = await PaymobPayment.instance.pay(
|
||||
// context: context,
|
||||
// currency: currency, //"EGP",
|
||||
// amountInCents: newAmount, // 19.00 EGP
|
||||
// billingData: PaymobBillingData(),
|
||||
// onPayment: (PaymobResponse response) {},
|
||||
// );
|
||||
|
||||
// if (response!.responseCode == 'APPROVED') {
|
||||
// Get.defaultDialog(
|
||||
// barrierDismissible: false,
|
||||
// title: 'Payment Successful'.tr,
|
||||
// titleStyle: AppStyle.title,
|
||||
// // backgroundColor: AppColor.greenColor,
|
||||
// content: Text(
|
||||
// 'The payment was approved.'.tr,
|
||||
// style: AppStyle.title,
|
||||
// ),
|
||||
// confirm: MyElevatedButton(
|
||||
// kolor: AppColor.greenColor,
|
||||
// title: 'OK'.tr,
|
||||
// onPressed: () async {
|
||||
// Get.back();
|
||||
// method();
|
||||
// },
|
||||
// ),
|
||||
// );
|
||||
// } else {
|
||||
// Get.defaultDialog(
|
||||
// barrierDismissible: false,
|
||||
// // backgroundColor: AppColor.redColor,
|
||||
// title: 'Payment Failed'.tr,
|
||||
// content: Column(
|
||||
// children: [
|
||||
// IconButton(
|
||||
// onPressed: () {
|
||||
// Get.find<TextToSpeechController>().speakText(
|
||||
// 'The payment was not approved. Please try again.'.tr,
|
||||
// );
|
||||
// },
|
||||
// icon: const Icon(Icons.headphones),
|
||||
// ),
|
||||
// Text(
|
||||
// 'The payment was not approved. Please try again.'.tr,
|
||||
// textAlign: TextAlign.center,
|
||||
// style: AppStyle.title,
|
||||
// ),
|
||||
// Text(
|
||||
// '${'The reason is'.tr} ${response.message!.tr}',
|
||||
// textAlign: TextAlign.center,
|
||||
// style: AppStyle.title.copyWith(color: AppColor.redColor),
|
||||
// ),
|
||||
// ],
|
||||
// ),
|
||||
// confirm: MyElevatedButton(
|
||||
// title: 'OK'.tr,
|
||||
// kolor: AppColor.redColor,
|
||||
// onPressed: () async {
|
||||
// Get.back();
|
||||
// },
|
||||
// ),
|
||||
// );
|
||||
// }
|
||||
|
||||
// }
|
||||
} catch (e) {
|
||||
Get.defaultDialog(
|
||||
title: 'Error'.tr,
|
||||
@@ -577,11 +591,11 @@ class PaymentController extends GetxController {
|
||||
if (isAvailable) {
|
||||
// Authenticate the user
|
||||
bool didAuthenticate = await LocalAuthentication().authenticate(
|
||||
localizedReason: 'Use Touch ID or Face ID to confirm payment',
|
||||
options: const AuthenticationOptions(
|
||||
biometricOnly: true, // Only biometrics (no fallback to PIN/pattern)
|
||||
),
|
||||
);
|
||||
localizedReason: 'Use Touch ID or Face ID to confirm payment',
|
||||
options: AuthenticationOptions(
|
||||
biometricOnly: true,
|
||||
sensitiveTransaction: true,
|
||||
));
|
||||
if (didAuthenticate) {
|
||||
final PaymobResponseWallet? response =
|
||||
await PaymobPaymentWallet.instance.pay(
|
||||
|
||||
0
lib/controller/payment/paymob.dart
Normal file → Executable file
0
lib/controller/payment/paymob.dart
Normal file → Executable file
0
lib/controller/payment/paymob/paymob_response.dart
Normal file → Executable file
0
lib/controller/payment/paymob/paymob_response.dart
Normal file → Executable file
0
lib/controller/payment/paymob/paymob_wallet.dart
Normal file → Executable file
0
lib/controller/payment/paymob/paymob_wallet.dart
Normal file → Executable file
0
lib/controller/payment/stripe.dart
Normal file → Executable file
0
lib/controller/payment/stripe.dart
Normal file → Executable file
0
lib/controller/profile/captain_profile_controller.dart
Normal file → Executable file
0
lib/controller/profile/captain_profile_controller.dart
Normal file → Executable file
0
lib/controller/profile/profile_controller.dart
Normal file → Executable file
0
lib/controller/profile/profile_controller.dart
Normal file → Executable file
0
lib/controller/profile/setting_controller.dart
Normal file → Executable file
0
lib/controller/profile/setting_controller.dart
Normal file → Executable file
0
lib/controller/rate/rate_app_controller.dart
Normal file → Executable file
0
lib/controller/rate/rate_app_controller.dart
Normal file → Executable file
0
lib/controller/rate/rate_conroller.dart
Normal file → Executable file
0
lib/controller/rate/rate_conroller.dart
Normal file → Executable file
0
lib/controller/themes/themes.dart
Normal file → Executable file
0
lib/controller/themes/themes.dart
Normal file → Executable file
0
lib/env.zip
Normal file → Executable file
0
lib/env.zip
Normal file → Executable file
0
lib/firebase_options.dart
Normal file → Executable file
0
lib/firebase_options.dart
Normal file → Executable file
0
lib/main.dart
Normal file → Executable file
0
lib/main.dart
Normal file → Executable file
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user