diff --git a/.env b/.env
index 4adb03f..29cbfd6 100644
--- a/.env
+++ b/.env
@@ -27,4 +27,6 @@ usernamePayMob=37319104052XrXlBl
passwordPayMob='g@nkD2#99!hD_.wXrXlBl'
integrationIdPayMob=0552355XrXlBl
payMobApikey='MDrGqKEWS1rVqHvEPDvPjJ7vZDBExrO7S3BEBgrlfUwTA3i5RnP5ZnvoL3M2S9rEBgrlNTdexH5pTPf7NJrvy1reZJv1Tn7zf7vTIDywjHg1C7Ley38HTDyNA3v7TPfdxJrax1rwPmPtMJyzqKEYZeghq3MuLUrFH3A1AgHcH15CZ9UaZTLOxnw0BTdzHHrBArisZerUMUUzZ1BnBeEijHvNjYLnS1BUICMhSmPhA15ifHyVqKEMHWyKLbyuIPvcH9UeL3vZyDf=XrXlBl'
-integrationIdPayMobWallet=0552352XrXlBl
\ No newline at end of file
+integrationIdPayMobWallet=0552352XrXlBl
+Ocp-Apim-Subscription-Key=21010e54b50f41a4904708c526e102df
+smsPasswordEgypt="E)Pu=an/@Z"
\ No newline at end of file
diff --git a/assets/images/logo.png b/assets/images/logo.png
index f973fc6..8ea9f60 100644
Binary files a/assets/images/logo.png and b/assets/images/logo.png differ
diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist
index 44fdb75..a5f5c2a 100644
--- a/ios/Runner/Info.plist
+++ b/ios/Runner/Info.plist
@@ -21,7 +21,7 @@
CFBundlePackageType
APPL
CFBundleShortVersionString
- 23
+ 24
CFBundleSignature
????
CFBundleURLTypes
@@ -36,7 +36,7 @@
CFBundleVersion
- 2.0.1
+ 2.0.12
FirebaseAppDelegateProxyEnabled
NO
GMSApiKey
diff --git a/lib/constant/api_key.dart b/lib/constant/api_key.dart
index 52dd51b..e07f9d8 100644
--- a/lib/constant/api_key.dart
+++ b/lib/constant/api_key.dart
@@ -52,4 +52,6 @@ class AK {
a.r(a.r(a.r(Env.payMobApikey, cn), cC), cs);
static final String integrationIdPayMobWallet =
a.r(a.r(a.r(Env.integrationIdPayMobWallet, cn), cC), cs);
+ static final String smsPassword =
+ a.r(a.r(a.r(Env.integrationIdPayMobWallet, cn), cC), cs);
}
diff --git a/lib/constant/box_name.dart b/lib/constant/box_name.dart
index a821afc..4c598a4 100644
--- a/lib/constant/box_name.dart
+++ b/lib/constant/box_name.dart
@@ -9,6 +9,7 @@ class BoxName {
static const String statusDriverLocation = "statusDriverLocation";
static const String password = "password";
static const String arrivalTime = "arrivalTime";
+ static const String locationPermission = "locationPermission";
static const String passwordDriver = "passwordDriver";
static const String agreeTerms = "agreeTerms";
static const String addWork = 'addWork';
diff --git a/lib/constant/links.dart b/lib/constant/links.dart
index a277cc4..f5ae72e 100644
--- a/lib/constant/links.dart
+++ b/lib/constant/links.dart
@@ -208,4 +208,12 @@ class AppLink {
static String getRidesPerMonth =
"$server/Admin/AdminRide/getRidesPerMonth.php";
static String getRidesDetails = "$server/Admin/AdminRide/get.php";
+
+//////////Sms egypt///////////
+ static String sendSms = "https://sms.kazumi.me/api/sms/send-sms";
+ static String senddlr = "https://sms.kazumi.me/api/sms/send-dlr";
+ static String sendvalidity = "https://sms.kazumi.me/api/sms/send-validity";
+ static String sendmany = "https://sms.kazumi.me/api/sms/send-many";
+ static String checkCredit = "https://sms.kazumi.me/api/sms/check-credit";
+ static String checkStatus = "https://sms.kazumi.me/api/sms/check-status";
}
diff --git a/lib/controller/admin/captain_admin_controller.dart b/lib/controller/admin/captain_admin_controller.dart
deleted file mode 100644
index f73327f..0000000
--- a/lib/controller/admin/captain_admin_controller.dart
+++ /dev/null
@@ -1,109 +0,0 @@
-import 'dart:convert';
-
-import 'package:flutter/material.dart';
-import 'package:get/get.dart';
-import 'package:local_auth/local_auth.dart';
-
-import '../../constant/colors.dart';
-import '../../constant/links.dart';
-import '../functions/crud.dart';
-
-class CaptainAdminController extends GetxController {
- bool isLoading = false;
- Map captainData = {};
- Map captain = {};
- final captainController = TextEditingController();
- final captainPrizeController = TextEditingController();
- final titleNotify = TextEditingController();
- final bodyNotify = TextEditingController();
- final formCaptainKey = GlobalKey();
- final formCaptainPrizeKey = GlobalKey();
-
- Future getCaptainCount() async {
- isLoading = true;
- update();
- var res = await CRUD().get(link: AppLink.getCaptainDetails, payload: {});
- var d = jsonDecode(res);
- if (d['status'] == 'success') {
- captainData = d;
- print(captainData);
- }
-
- isLoading = false;
- update();
- }
-
- Future addCaptainPrizeToWallet() async {
- String? paymentId;
- //todo link to add wallet to captain
- for (var i = 0; i < captainData['message'].length; i++) {
- await CRUD().post(link: AppLink.addDriverPaymentPoints, payload: {
- 'driverID': captainData['message'][i]['id'],
- 'amount': captainPrizeController.text,
- 'paymentMethod': 'Prize',
- }).then((value) {
- paymentId = value['message'].toString();
- });
- await CRUD().post(link: AppLink.addPassengersWallet, payload: {
- 'driverID': captainData['message'][i]['id'],
- 'amount': captainPrizeController.text,
- 'paymentMethod': 'Prize',
- 'paymentID': paymentId.toString(),
- });
- }
-
- Get.back();
- }
-
- void addCaptainsPrizeToWalletSecure() async {
- try {
- // Check if local authentication is available
- 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',
- );
- if (didAuthenticate) {
- // User authenticated successfully, proceed with payment
- await addCaptainPrizeToWallet();
- Get.snackbar('Prize Added', '', backgroundColor: AppColor.greenColor);
- } else {
- // Authentication failed, handle accordingly
- Get.snackbar('Authentication failed', '',
- backgroundColor: AppColor.redColor);
- // print(
- // 'Authentication failed');
- }
- } else {
- // Local authentication not available, proceed with payment without authentication
- await addCaptainPrizeToWallet();
- Get.snackbar('Prize Added', '', backgroundColor: AppColor.greenColor);
- }
- } catch (e) {
- rethrow;
- }
- }
-
- Future getCaptains() async {
- var res = await CRUD()
- .get(link: AppLink.getCaptainDetailsByEmailOrIDOrPhone, payload: {
- 'driver_id': captainController.text,
- 'driverEmail': captainController.text,
- 'driverPhone': captainController.text,
- });
- var d = jsonDecode(res);
- // print(d['message']);
- if (d['status'] == 'success') {
- captain = d;
- }
- // print(passengers);
- update();
- }
-
- @override
- void onInit() {
- getCaptainCount();
- super.onInit();
- }
-}
diff --git a/lib/controller/admin/passenger_admin_controller.dart b/lib/controller/admin/passenger_admin_controller.dart
deleted file mode 100644
index ce16916..0000000
--- a/lib/controller/admin/passenger_admin_controller.dart
+++ /dev/null
@@ -1,110 +0,0 @@
-import 'dart:convert';
-
-import 'package:flutter/material.dart';
-import 'package:get/get.dart';
-import 'package:local_auth/local_auth.dart';
-import 'package:SEFER/constant/colors.dart';
-import 'package:SEFER/constant/links.dart';
-import 'package:SEFER/controller/functions/crud.dart';
-
-class PassengerAdminController extends GetxController {
- bool isLoading = false;
- Map passengersData = {};
- Map passengers = {};
- double height = 150;
- final formPassKey = GlobalKey();
- final formPrizeKey = GlobalKey();
- final titleNotify = TextEditingController();
- final bodyNotify = TextEditingController();
- final passengerController = TextEditingController();
- final passengerPrizeController = TextEditingController();
-
- Future getPassengerCount() async {
- isLoading = true;
- update();
- var res = await CRUD().get(link: AppLink.getPassengerDetails, payload: {});
- var d = jsonDecode(res);
- if (d['status'] == 'success') {
- passengersData = d;
- }
-
- isLoading = false;
- update();
- }
-
- Future addPassengerPrizeToWallet() async {
- for (var i = 0; i < passengersData['message'].length; i++) {
- await CRUD().post(link: AppLink.addPassengersWallet, payload: {
- 'passenger_id': passengersData['message'][i]['id'],
- 'balance': passengerPrizeController.text,
- });
- }
-
- Get.back();
- }
-
- void addPassengerPrizeToWalletSecure() async {
- try {
- // Check if local authentication is available
- 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',
- );
- if (didAuthenticate) {
- // User authenticated successfully, proceed with payment
- await addPassengerPrizeToWallet();
- Get.snackbar('Prize Added', '', backgroundColor: AppColor.greenColor);
- } else {
- // Authentication failed, handle accordingly
- Get.snackbar('Authentication failed', '',
- backgroundColor: AppColor.redColor);
- // print(
- // 'Authentication failed');
- }
- } else {
- // Local authentication not available, proceed with payment without authentication
- await addPassengerPrizeToWallet();
- Get.snackbar('Prize Added', '', backgroundColor: AppColor.greenColor);
- }
- } catch (e) {
- rethrow;
- }
- }
-
- Future getPassengers() async {
- var res = await CRUD().get(link: AppLink.getPassengerbyEmail, payload: {
- 'passengerEmail': passengerController.text,
- 'passengerId': passengerController.text,
- 'passengerphone': passengerController.text,
- });
- var d = jsonDecode(res);
- // print(d['message']);
- if (d['status'] == 'success') {
- passengers = d;
- }
- // print(passengers);
- update();
- }
-
- changeHeight() {
- if (passengers.isEmpty) {
- height = 0;
- update();
- }
- height = 150;
- update();
- }
-
- void clearPlaces() {
- passengers = {};
- update();
- }
-
- @override
- void onInit() {
- getPassengerCount();
- super.onInit();
- }
-}
diff --git a/lib/controller/admin/ride_admin_controller.dart b/lib/controller/admin/ride_admin_controller.dart
deleted file mode 100644
index 9397b79..0000000
--- a/lib/controller/admin/ride_admin_controller.dart
+++ /dev/null
@@ -1,73 +0,0 @@
-import 'dart:convert';
-
-import 'package:fl_chart/fl_chart.dart';
-import 'package:get/get.dart';
-import 'package:SEFER/constant/links.dart';
-import 'package:SEFER/controller/functions/crud.dart';
-
-import '../../models/model/admin/monthly_ride.dart';
-
-class RideAdminController extends GetxController {
- bool isLoading = false;
- late List rideData;
- late Map jsonResponse;
- List ridesDetails = [];
- var chartData;
- // late List chartDatasync;
- Future getRidesAdminDash() async {
- isLoading = true;
- update();
- var res = await CRUD().get(link: AppLink.getRidesPerMonth, payload: {});
- jsonResponse = jsonDecode(res);
- rideData = (jsonResponse['message'] as List)
- .map((item) => MonthlyDataModel.fromJson(item))
- .toList();
-
- chartData = rideData
- .map((data) => FlSpot(data.day.toDouble(), data.ridesCount.toDouble()))
- .toList();
-
- // chartDatasync = (jsonResponse['message'] as List)
- // .map((item) => ChartDataS(
- // item['year'],
- // item['month'],
- // item['day'],
- // item['rides_count'],
- // ))
- // .toList();
- isLoading = false;
- update();
- }
-
- Future getRidesDetails() async {
- // isLoading = true;
- // update();
- var res = await CRUD().get(link: AppLink.getRidesDetails, payload: {});
-
- var d = jsonDecode(res);
- ridesDetails = d['message'];
-
- // isLoading = false;
- // update();
- }
-
- @override
- void onInit() async {
- List initializationTasks = [
- getRidesAdminDash(),
- getRidesDetails(),
- ];
- // cameras = await availableCameras();
- await Future.wait(initializationTasks);
- super.onInit();
- }
-}
-
-// class ChartDataS {
-// ChartDataS(this.year, this.month, this.day, this.ridesCount);
-
-// final int year;
-// final int month;
-// final int day;
-// final int ridesCount;
-// }
diff --git a/lib/controller/admin/wallet_admin_controller.dart b/lib/controller/admin/wallet_admin_controller.dart
deleted file mode 100644
index 1f8a534..0000000
--- a/lib/controller/admin/wallet_admin_controller.dart
+++ /dev/null
@@ -1,20 +0,0 @@
-import 'dart:convert';
-
-import 'package:get/get.dart';
-
-import '../../constant/links.dart';
-import '../functions/crud.dart';
-
-class WalletAdminController extends GetxController {
- bool isLoading = false;
-
- late Map jsonResponse;
- List walletDetails = [];
-
- Future getWalletAdminDash() async {
- isLoading = true;
- update();
- var res = await CRUD().get(link: AppLink.getRidesPerMonth, payload: {});
- jsonResponse = jsonDecode(res);
- }
-}
diff --git a/lib/controller/auth/captin/login_captin_controller.dart b/lib/controller/auth/captin/login_captin_controller.dart
index 23ffbcf..c6622bb 100644
--- a/lib/controller/auth/captin/login_captin_controller.dart
+++ b/lib/controller/auth/captin/login_captin_controller.dart
@@ -11,6 +11,7 @@ import 'package:SEFER/controller/functions/secure_storage.dart';
import 'package:SEFER/main.dart';
import 'package:SEFER/views/auth/captin/verify_email_captain.dart';
import 'package:SEFER/views/home/Captin/home_captain/home_captin.dart';
+import 'package:location/location.dart';
class LoginCaptinController extends GetxController {
final formKey = GlobalKey();
@@ -20,7 +21,7 @@ class LoginCaptinController extends GetxController {
bool isAgreeTerms = false;
bool isloading = false;
final FlutterSecureStorage _storage = const FlutterSecureStorage();
-
+ final location = Location();
void changeAgreeTerm() {
isAgreeTerms = !isAgreeTerms;
print(isAgreeTerms);
@@ -37,6 +38,38 @@ class LoginCaptinController extends GetxController {
update();
}
+ Future getLocationPermission() async {
+ bool serviceEnabled;
+ PermissionStatus permissionGranted;
+
+ // Check if location services are enabled
+ serviceEnabled = await location.serviceEnabled();
+ if (!serviceEnabled) {
+ serviceEnabled = await location.requestService();
+ if (!serviceEnabled) {
+ // Location services are still not enabled, handle the error
+ return;
+ }
+ }
+
+ // Check if the app has permission to access location
+ permissionGranted = await location.hasPermission();
+ if (permissionGranted == PermissionStatus.denied) {
+ permissionGranted = await location.requestPermission();
+ if (permissionGranted != PermissionStatus.granted) {
+ // Location permission is still not granted, handle the error
+ permissionGranted = await location.requestPermission();
+ return;
+ }
+ }
+ print('permisson is ${permissionGranted.toString()}');
+ if ('PermissionStatus.granted' == permissionGranted.toString()) {
+ box.write(BoxName.locationPermission, 'true');
+ update();
+ }
+ update();
+ }
+
void login() async {
isloading = true;
update();
@@ -46,7 +79,8 @@ class LoginCaptinController extends GetxController {
'password': passwordController.text
});
print(res);
- if (res == 'Failure') {
+ if (res == 'failure') {
+ //Failure
isloading = false;
update();
Get.snackbar('Failure', '', backgroundColor: Colors.red);
diff --git a/lib/controller/auth/login_controller.dart b/lib/controller/auth/login_controller.dart
index 650926d..9413c20 100644
--- a/lib/controller/auth/login_controller.dart
+++ b/lib/controller/auth/login_controller.dart
@@ -12,7 +12,6 @@ import 'package:SEFER/controller/functions/secure_storage.dart';
import 'package:SEFER/main.dart';
import 'package:SEFER/views/auth/verify_email_page.dart';
-import '../../views/admin/admin_home_page.dart';
import '../functions/device_info.dart';
class LoginController extends GetxController {
@@ -43,38 +42,6 @@ class LoginController extends GetxController {
update();
}
- void adminDashboardOpen() async {
- if (formKeyAdmin.currentState!.validate()) {
- await DeviceInfoPlus.getDeviceInfo();
- if (Platform.isAndroid) {
- // print(DeviceInfoPlus.deviceDataList['serialNumber']);
- // var res = await CRUD().get(link: AppLink.getAdminUser, payload: {
- // // 'device_number': DeviceInfoPlus.deviceData['serialNumber'].toString(),
- // });
- // var d = jsonDecode(res);
- // // print(d);
- // // if (DeviceInfoPlus.deviceData['serialNumber'] ==
- // d['message']['device_number']) {
- Get.back();
- Get.to(() => const AdminHomePage());
- // }
- }
- if (Platform.isIOS) {
- // print(DeviceInfoPlus.deviceData['identifierForVendor']);
- // var res = await CRUD().get(link: AppLink.getAdminUser, payload: {
- // 'device_number': DeviceInfoPlus.deviceData['identifierForVendor'].toString(),
- // });
- // var d = jsonDecode(res);
- // print(d);
- // if (DeviceInfoPlus.deviceData['serialNumber'] ==
- // d['message']['device_number']) {
- Get.back();
- Get.to(() => const AdminHomePage());
- // }
- }
- }
- }
-
void login() async {
isloading = true;
update();
@@ -85,7 +52,8 @@ class LoginController extends GetxController {
});
isloading = false;
update();
- if (res == 'Failure') {
+ if (res == 'failure') {
+ //Failure
Get.snackbar('Failure', '', backgroundColor: Colors.red);
} else {
// print(res);
@@ -95,10 +63,10 @@ class LoginController extends GetxController {
if (jsonDecoeded['status'] == 'success') {
print(jsonDecoeded['data'][0]['verified']);
if (jsonDecoeded['data'][0]['verified'] == 1) {
- box.write(BoxName.passengerID, jsonDecoeded['data'][0]['id']);
- box.write(BoxName.email, jsonDecoeded['data'][0]['email']);
+ box.write(BoxName.driverID, jsonDecoeded['data'][0]['id']);
+ box.write(BoxName.emailDriver, jsonDecoeded['data'][0]['email']);
box.write(
- BoxName.name,
+ BoxName.nameDriver,
jsonDecoeded['data'][0]['first_name'] +
' ' +
jsonDecoeded['data'][0]['last_name']);
diff --git a/lib/controller/firebase/firbase_messge.dart b/lib/controller/firebase/firbase_messge.dart
index 5e38427..59e384f 100644
--- a/lib/controller/firebase/firbase_messge.dart
+++ b/lib/controller/firebase/firbase_messge.dart
@@ -11,7 +11,6 @@ import 'package:SEFER/views/widgets/elevated_btn.dart';
import '../../constant/api_key.dart';
import '../../constant/box_name.dart';
import '../../constant/colors.dart';
-import '../../constant/links.dart';
import '../../constant/style.dart';
import '../../main.dart';
import '../../views/home/Captin/home_captain/home_captin.dart';
@@ -63,32 +62,6 @@ class FirebaseMessagesController extends GetxController {
}
}
- Future getTokens() async {
- String? basicAuthCredentials =
- await storage.read(key: BoxName.basicAuthCredentials);
- var res = await http.post(
- Uri.parse(AppLink.getTokens),
- headers: {
- 'Authorization':
- 'Basic ${base64Encode(utf8.encode(AK.basicAuthCredentials))}',
- },
- body: {},
- );
- // print(res.body);
- var jsonResponse = jsonDecode(res.body);
- // print(jsonResponse);
- if (jsonResponse['status'] == 'success') {
- dataTokens = jsonResponse['data'];
- for (var i = 0; i < dataTokens.length; i++) {
- tokens.add(jsonResponse['data'][i]['token']);
- }
- box.write(BoxName.tokens, tokens);
- print(box.read(BoxName.tokens));
- } else {
- Get.defaultDialog(title: "Warning", middleText: "Server Error");
- }
- }
-
Future getToken() async {
fcmToken.getToken().then((token) {
if (box.read(BoxName.email) == null) {
@@ -108,6 +81,20 @@ class FirebaseMessagesController extends GetxController {
fireBaseTitles(message);
}
});
+ FirebaseMessaging.onBackgroundMessage((RemoteMessage message) async {
+ // Handle background message
+ if (message.data.isNotEmpty && message.notification != null) {
+ print(message.notification?.title);
+ fireBaseTitles(message);
+ }
+ });
+
+ FirebaseMessaging.onMessageOpenedApp.listen((RemoteMessage message) {
+ if (message.data.isNotEmpty && message.notification != null) {
+ print(message.notification?.title);
+ fireBaseTitles(message);
+ }
+ });
}
void fireBaseTitles(RemoteMessage message) {
diff --git a/lib/controller/functions/crud.dart b/lib/controller/functions/crud.dart
index 6e28b58..a8f1824 100644
--- a/lib/controller/functions/crud.dart
+++ b/lib/controller/functions/crud.dart
@@ -28,9 +28,9 @@ class CRUD {
'Basic ${base64Encode(utf8.encode(AK.basicAuthCredentials.toString()))}',
},
);
- print("-----request----" + response.request.toString());
+ // print("-----request----" + response.request.toString());
// print("-----headers-----" + response.headers.toString());
- print("-----payload-----" + payload.toString());
+ // print("-----payload-----" + payload.toString());
// if (response.statusCode == 200) {
// print(response.body);
var jsonData = jsonDecode(response.body);
@@ -104,40 +104,79 @@ class CRUD {
Future allMethodForAI(String prompt, linkPHP, imagePath) async {
await ImageController().choosImage(linkPHP, imagePath);
Future.delayed(const Duration(seconds: 2));
- String extracted =
+ var extractedString =
await arabicTextExtractByVisionAndAI(imagePath: imagePath);
+ // print('extractedString');
+ var json = jsonDecode(extractedString);
+ // print(extractedString);
+ // print(json);
+ var textValues = getAllTextValuesWithLineNumbers(json);
+ // List textValues = getAllTextValues(json);
- Map extractedData = extractText(extracted);
- print(extractedData);
- // await AI().geminiAiExtraction(prompt, extractedData);
+ print('extractedData');
+ print(textValues);
+ await AI().geminiAiExtraction(prompt, textValues);
}
- Map extractText(String jsonData) {
- Map data = jsonDecode(jsonData);
- List> textLines = [];
+ Map>> getAllTextValuesWithLineNumbers(
+ Map json) {
+ Map>> output = {};
+ int lineNumber = 1;
- for (var region in data['regions']) {
- List lineTexts = [];
- for (var line in region['lines']) {
- String lineText = "";
- for (var word in line['words']) {
- lineText += word['text'] + " ";
+ if (json.containsKey('regions')) {
+ List regions = json['regions'];
+ for (Map region in regions) {
+ if (region.containsKey('lines')) {
+ List lines = region['lines'];
+ List