5/11/1
This commit is contained in:
2
.env
2
.env
@@ -28,3 +28,5 @@ passwordPayMob='g@nkD2#99!hD_.wXrXlBl'
|
|||||||
integrationIdPayMob=0552355XrXlBl
|
integrationIdPayMob=0552355XrXlBl
|
||||||
payMobApikey='MDrGqKEWS1rVqHvEPDvPjJ7vZDBExrO7S3BEBgrlfUwTA3i5RnP5ZnvoL3M2S9rEBgrlNTdexH5pTPf7NJrvy1reZJv1Tn7zf7vTIDywjHg1C7Ley38HTDyNA3v7TPfdxJrax1rwPmPtMJyzqKEYZeghq3MuLUrFH3A1AgHcH15CZ9UaZTLOxnw0BTdzHHrBArisZerUMUUzZ1BnBeEijHvNjYLnS1BUICMhSmPhA15ifHyVqKEMHWyKLbyuIPvcH9UeL3vZyDf=XrXlBl'
|
payMobApikey='MDrGqKEWS1rVqHvEPDvPjJ7vZDBExrO7S3BEBgrlfUwTA3i5RnP5ZnvoL3M2S9rEBgrlNTdexH5pTPf7NJrvy1reZJv1Tn7zf7vTIDywjHg1C7Ley38HTDyNA3v7TPfdxJrax1rwPmPtMJyzqKEYZeghq3MuLUrFH3A1AgHcH15CZ9UaZTLOxnw0BTdzHHrBArisZerUMUUzZ1BnBeEijHvNjYLnS1BUICMhSmPhA15ifHyVqKEMHWyKLbyuIPvcH9UeL3vZyDf=XrXlBl'
|
||||||
integrationIdPayMobWallet=0552352XrXlBl
|
integrationIdPayMobWallet=0552352XrXlBl
|
||||||
|
Ocp-Apim-Subscription-Key=21010e54b50f41a4904708c526e102df
|
||||||
|
smsPasswordEgypt="E)Pu=an/@Z"
|
||||||
Binary file not shown.
|
Before Width: | Height: | Size: 46 KiB After Width: | Height: | Size: 565 KiB |
@@ -21,7 +21,7 @@
|
|||||||
<key>CFBundlePackageType</key>
|
<key>CFBundlePackageType</key>
|
||||||
<string>APPL</string>
|
<string>APPL</string>
|
||||||
<key>CFBundleShortVersionString</key>
|
<key>CFBundleShortVersionString</key>
|
||||||
<string>23</string>
|
<string>24</string>
|
||||||
<key>CFBundleSignature</key>
|
<key>CFBundleSignature</key>
|
||||||
<string>????</string>
|
<string>????</string>
|
||||||
<key>CFBundleURLTypes</key>
|
<key>CFBundleURLTypes</key>
|
||||||
@@ -36,7 +36,7 @@
|
|||||||
</dict>
|
</dict>
|
||||||
</array>
|
</array>
|
||||||
<key>CFBundleVersion</key>
|
<key>CFBundleVersion</key>
|
||||||
<string>2.0.1</string>
|
<string>2.0.12</string>
|
||||||
<key>FirebaseAppDelegateProxyEnabled</key>
|
<key>FirebaseAppDelegateProxyEnabled</key>
|
||||||
<string>NO</string>
|
<string>NO</string>
|
||||||
<key>GMSApiKey</key>
|
<key>GMSApiKey</key>
|
||||||
|
|||||||
@@ -52,4 +52,6 @@ class AK {
|
|||||||
a.r(a.r(a.r(Env.payMobApikey, cn), cC), cs);
|
a.r(a.r(a.r(Env.payMobApikey, cn), cC), cs);
|
||||||
static final String integrationIdPayMobWallet =
|
static final String integrationIdPayMobWallet =
|
||||||
a.r(a.r(a.r(Env.integrationIdPayMobWallet, cn), cC), cs);
|
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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ class BoxName {
|
|||||||
static const String statusDriverLocation = "statusDriverLocation";
|
static const String statusDriverLocation = "statusDriverLocation";
|
||||||
static const String password = "password";
|
static const String password = "password";
|
||||||
static const String arrivalTime = "arrivalTime";
|
static const String arrivalTime = "arrivalTime";
|
||||||
|
static const String locationPermission = "locationPermission";
|
||||||
static const String passwordDriver = "passwordDriver";
|
static const String passwordDriver = "passwordDriver";
|
||||||
static const String agreeTerms = "agreeTerms";
|
static const String agreeTerms = "agreeTerms";
|
||||||
static const String addWork = 'addWork';
|
static const String addWork = 'addWork';
|
||||||
|
|||||||
@@ -208,4 +208,12 @@ class AppLink {
|
|||||||
static String getRidesPerMonth =
|
static String getRidesPerMonth =
|
||||||
"$server/Admin/AdminRide/getRidesPerMonth.php";
|
"$server/Admin/AdminRide/getRidesPerMonth.php";
|
||||||
static String getRidesDetails = "$server/Admin/AdminRide/get.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";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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<FormState>();
|
|
||||||
final formCaptainPrizeKey = GlobalKey<FormState>();
|
|
||||||
|
|
||||||
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();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -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<FormState>();
|
|
||||||
final formPrizeKey = GlobalKey<FormState>();
|
|
||||||
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();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -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<MonthlyDataModel> rideData;
|
|
||||||
late Map<String, dynamic> jsonResponse;
|
|
||||||
List<dynamic> ridesDetails = [];
|
|
||||||
var chartData;
|
|
||||||
// late List<ChartDataS> 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<Future> 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;
|
|
||||||
// }
|
|
||||||
@@ -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<String, dynamic> jsonResponse;
|
|
||||||
List<dynamic> walletDetails = [];
|
|
||||||
|
|
||||||
Future getWalletAdminDash() async {
|
|
||||||
isLoading = true;
|
|
||||||
update();
|
|
||||||
var res = await CRUD().get(link: AppLink.getRidesPerMonth, payload: {});
|
|
||||||
jsonResponse = jsonDecode(res);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -11,6 +11,7 @@ import 'package:SEFER/controller/functions/secure_storage.dart';
|
|||||||
import 'package:SEFER/main.dart';
|
import 'package:SEFER/main.dart';
|
||||||
import 'package:SEFER/views/auth/captin/verify_email_captain.dart';
|
import 'package:SEFER/views/auth/captin/verify_email_captain.dart';
|
||||||
import 'package:SEFER/views/home/Captin/home_captain/home_captin.dart';
|
import 'package:SEFER/views/home/Captin/home_captain/home_captin.dart';
|
||||||
|
import 'package:location/location.dart';
|
||||||
|
|
||||||
class LoginCaptinController extends GetxController {
|
class LoginCaptinController extends GetxController {
|
||||||
final formKey = GlobalKey<FormState>();
|
final formKey = GlobalKey<FormState>();
|
||||||
@@ -20,7 +21,7 @@ class LoginCaptinController extends GetxController {
|
|||||||
bool isAgreeTerms = false;
|
bool isAgreeTerms = false;
|
||||||
bool isloading = false;
|
bool isloading = false;
|
||||||
final FlutterSecureStorage _storage = const FlutterSecureStorage();
|
final FlutterSecureStorage _storage = const FlutterSecureStorage();
|
||||||
|
final location = Location();
|
||||||
void changeAgreeTerm() {
|
void changeAgreeTerm() {
|
||||||
isAgreeTerms = !isAgreeTerms;
|
isAgreeTerms = !isAgreeTerms;
|
||||||
print(isAgreeTerms);
|
print(isAgreeTerms);
|
||||||
@@ -37,6 +38,38 @@ class LoginCaptinController extends GetxController {
|
|||||||
update();
|
update();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Future<void> 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 {
|
void login() async {
|
||||||
isloading = true;
|
isloading = true;
|
||||||
update();
|
update();
|
||||||
@@ -46,7 +79,8 @@ class LoginCaptinController extends GetxController {
|
|||||||
'password': passwordController.text
|
'password': passwordController.text
|
||||||
});
|
});
|
||||||
print(res);
|
print(res);
|
||||||
if (res == 'Failure') {
|
if (res == 'failure') {
|
||||||
|
//Failure
|
||||||
isloading = false;
|
isloading = false;
|
||||||
update();
|
update();
|
||||||
Get.snackbar('Failure', '', backgroundColor: Colors.red);
|
Get.snackbar('Failure', '', backgroundColor: Colors.red);
|
||||||
|
|||||||
@@ -12,7 +12,6 @@ import 'package:SEFER/controller/functions/secure_storage.dart';
|
|||||||
import 'package:SEFER/main.dart';
|
import 'package:SEFER/main.dart';
|
||||||
import 'package:SEFER/views/auth/verify_email_page.dart';
|
import 'package:SEFER/views/auth/verify_email_page.dart';
|
||||||
|
|
||||||
import '../../views/admin/admin_home_page.dart';
|
|
||||||
import '../functions/device_info.dart';
|
import '../functions/device_info.dart';
|
||||||
|
|
||||||
class LoginController extends GetxController {
|
class LoginController extends GetxController {
|
||||||
@@ -43,38 +42,6 @@ class LoginController extends GetxController {
|
|||||||
update();
|
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 {
|
void login() async {
|
||||||
isloading = true;
|
isloading = true;
|
||||||
update();
|
update();
|
||||||
@@ -85,7 +52,8 @@ class LoginController extends GetxController {
|
|||||||
});
|
});
|
||||||
isloading = false;
|
isloading = false;
|
||||||
update();
|
update();
|
||||||
if (res == 'Failure') {
|
if (res == 'failure') {
|
||||||
|
//Failure
|
||||||
Get.snackbar('Failure', '', backgroundColor: Colors.red);
|
Get.snackbar('Failure', '', backgroundColor: Colors.red);
|
||||||
} else {
|
} else {
|
||||||
// print(res);
|
// print(res);
|
||||||
@@ -95,10 +63,10 @@ class LoginController extends GetxController {
|
|||||||
if (jsonDecoeded['status'] == 'success') {
|
if (jsonDecoeded['status'] == 'success') {
|
||||||
print(jsonDecoeded['data'][0]['verified']);
|
print(jsonDecoeded['data'][0]['verified']);
|
||||||
if (jsonDecoeded['data'][0]['verified'] == 1) {
|
if (jsonDecoeded['data'][0]['verified'] == 1) {
|
||||||
box.write(BoxName.passengerID, jsonDecoeded['data'][0]['id']);
|
box.write(BoxName.driverID, jsonDecoeded['data'][0]['id']);
|
||||||
box.write(BoxName.email, jsonDecoeded['data'][0]['email']);
|
box.write(BoxName.emailDriver, jsonDecoeded['data'][0]['email']);
|
||||||
box.write(
|
box.write(
|
||||||
BoxName.name,
|
BoxName.nameDriver,
|
||||||
jsonDecoeded['data'][0]['first_name'] +
|
jsonDecoeded['data'][0]['first_name'] +
|
||||||
' ' +
|
' ' +
|
||||||
jsonDecoeded['data'][0]['last_name']);
|
jsonDecoeded['data'][0]['last_name']);
|
||||||
|
|||||||
@@ -11,7 +11,6 @@ import 'package:SEFER/views/widgets/elevated_btn.dart';
|
|||||||
import '../../constant/api_key.dart';
|
import '../../constant/api_key.dart';
|
||||||
import '../../constant/box_name.dart';
|
import '../../constant/box_name.dart';
|
||||||
import '../../constant/colors.dart';
|
import '../../constant/colors.dart';
|
||||||
import '../../constant/links.dart';
|
|
||||||
import '../../constant/style.dart';
|
import '../../constant/style.dart';
|
||||||
import '../../main.dart';
|
import '../../main.dart';
|
||||||
import '../../views/home/Captin/home_captain/home_captin.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 {
|
Future getToken() async {
|
||||||
fcmToken.getToken().then((token) {
|
fcmToken.getToken().then((token) {
|
||||||
if (box.read(BoxName.email) == null) {
|
if (box.read(BoxName.email) == null) {
|
||||||
@@ -108,6 +81,20 @@ class FirebaseMessagesController extends GetxController {
|
|||||||
fireBaseTitles(message);
|
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) {
|
void fireBaseTitles(RemoteMessage message) {
|
||||||
|
|||||||
@@ -28,9 +28,9 @@ class CRUD {
|
|||||||
'Basic ${base64Encode(utf8.encode(AK.basicAuthCredentials.toString()))}',
|
'Basic ${base64Encode(utf8.encode(AK.basicAuthCredentials.toString()))}',
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
print("-----request----" + response.request.toString());
|
// print("-----request----" + response.request.toString());
|
||||||
// print("-----headers-----" + response.headers.toString());
|
// print("-----headers-----" + response.headers.toString());
|
||||||
print("-----payload-----" + payload.toString());
|
// print("-----payload-----" + payload.toString());
|
||||||
// if (response.statusCode == 200) {
|
// if (response.statusCode == 200) {
|
||||||
// print(response.body);
|
// print(response.body);
|
||||||
var jsonData = jsonDecode(response.body);
|
var jsonData = jsonDecode(response.body);
|
||||||
@@ -104,40 +104,79 @@ class CRUD {
|
|||||||
Future allMethodForAI(String prompt, linkPHP, imagePath) async {
|
Future allMethodForAI(String prompt, linkPHP, imagePath) async {
|
||||||
await ImageController().choosImage(linkPHP, imagePath);
|
await ImageController().choosImage(linkPHP, imagePath);
|
||||||
Future.delayed(const Duration(seconds: 2));
|
Future.delayed(const Duration(seconds: 2));
|
||||||
String extracted =
|
var extractedString =
|
||||||
await arabicTextExtractByVisionAndAI(imagePath: imagePath);
|
await arabicTextExtractByVisionAndAI(imagePath: imagePath);
|
||||||
|
// print('extractedString');
|
||||||
|
var json = jsonDecode(extractedString);
|
||||||
|
// print(extractedString);
|
||||||
|
// print(json);
|
||||||
|
var textValues = getAllTextValuesWithLineNumbers(json);
|
||||||
|
// List<String> textValues = getAllTextValues(json);
|
||||||
|
|
||||||
Map<String, dynamic> extractedData = extractText(extracted);
|
print('extractedData');
|
||||||
print(extractedData);
|
print(textValues);
|
||||||
// await AI().geminiAiExtraction(prompt, extractedData);
|
await AI().geminiAiExtraction(prompt, textValues);
|
||||||
}
|
}
|
||||||
|
|
||||||
Map<String, dynamic> extractText(String jsonData) {
|
Map<String, List<Map<String, String>>> getAllTextValuesWithLineNumbers(
|
||||||
Map<String, dynamic> data = jsonDecode(jsonData);
|
Map json) {
|
||||||
List<List<String>> textLines = [];
|
Map<String, List<Map<String, String>>> output = {};
|
||||||
|
int lineNumber = 1;
|
||||||
|
|
||||||
for (var region in data['regions']) {
|
if (json.containsKey('regions')) {
|
||||||
List<String> lineTexts = [];
|
List<dynamic> regions = json['regions'];
|
||||||
for (var line in region['lines']) {
|
for (Map<String, dynamic> region in regions) {
|
||||||
|
if (region.containsKey('lines')) {
|
||||||
|
List<dynamic> lines = region['lines'];
|
||||||
|
List<Map<String, String>> linesWithText = [];
|
||||||
|
for (Map<String, dynamic> line in lines) {
|
||||||
|
if (line.containsKey('words')) {
|
||||||
|
List<dynamic> words = line['words'];
|
||||||
String lineText = "";
|
String lineText = "";
|
||||||
for (var word in line['words']) {
|
for (Map<String, dynamic> word in words) {
|
||||||
|
if (word.containsKey('text')) {
|
||||||
lineText += word['text'] + " ";
|
lineText += word['text'] + " ";
|
||||||
}
|
}
|
||||||
|
}
|
||||||
lineText = lineText.trim();
|
lineText = lineText.trim();
|
||||||
lineTexts.add(lineText);
|
linesWithText.add(
|
||||||
|
{"line_number": lineNumber.toString(), "text": lineText});
|
||||||
|
lineNumber++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
output["region_${region.hashCode}"] = linesWithText;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
textLines.add(lineTexts);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// You can choose between returning a new JSON or a List based on your needs
|
return output;
|
||||||
|
|
||||||
// Option 1: Return a new JSON with "textLines" key
|
|
||||||
return {"textLines": textLines};
|
|
||||||
|
|
||||||
// Option 2: Return a List of List<String> (lines with words)
|
|
||||||
// return textLines;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// List<String> getAllTextValues(Map json) {
|
||||||
|
// List<String> textValues = [];
|
||||||
|
|
||||||
|
// if (json.containsKey('regions')) {
|
||||||
|
// List<dynamic> regions = json['regions'];
|
||||||
|
// for (Map<String, dynamic> region in regions) {
|
||||||
|
// if (region.containsKey('lines')) {
|
||||||
|
// List<dynamic> lines = region['lines'];
|
||||||
|
// for (Map<String, dynamic> line in lines) {
|
||||||
|
// if (line.containsKey('words')) {
|
||||||
|
// List<dynamic> words = line['words'];
|
||||||
|
// for (Map<String, dynamic> word in words) {
|
||||||
|
// if (word.containsKey('text')) {
|
||||||
|
// textValues.add(word['text']);
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
// return textValues;
|
||||||
|
// }
|
||||||
|
|
||||||
Future<dynamic> arabicTextExtractByVisionAndAI({
|
Future<dynamic> arabicTextExtractByVisionAndAI({
|
||||||
required String imagePath,
|
required String imagePath,
|
||||||
}) async {
|
}) async {
|
||||||
@@ -145,27 +184,27 @@ class CRUD {
|
|||||||
'Content-Type': 'application/json',
|
'Content-Type': 'application/json',
|
||||||
'Ocp-Apim-Subscription-Key': '21010e54b50f41a4904708c526e102df'
|
'Ocp-Apim-Subscription-Key': '21010e54b50f41a4904708c526e102df'
|
||||||
};
|
};
|
||||||
var url = Uri.parse(
|
// var url = Uri.parse(
|
||||||
'https://ocrhamza.cognitiveservices.azure.com/vision/v2.1/ocr?language=ar',
|
// 'https://ocrhamza.cognitiveservices.azure.com/vision/v2.1/ocr?language=ar',
|
||||||
);
|
// );
|
||||||
String imagePathFull =
|
String imagePathFull =
|
||||||
'${AppLink.server}card_image/$imagePath-${box.read(BoxName.driverID) ?? box.read(BoxName.passengerID)}.jpg';
|
'${AppLink.server}card_image/$imagePath-${box.read(BoxName.driverID)}.jpg';
|
||||||
|
|
||||||
// print('imagePath=$imagePathFull');
|
var request = http.Request(
|
||||||
var requestBody = {"url": imagePathFull};
|
'POST',
|
||||||
var response = await http.post(
|
Uri.parse(
|
||||||
url,
|
'https://ocrhamza.cognitiveservices.azure.com/vision/v2.1/ocr?language=ar'));
|
||||||
body: jsonEncode(requestBody), // Encode the JSON object to a string
|
request.body = json.encode({"url": imagePathFull});
|
||||||
headers: headers,
|
request.headers.addAll(headers);
|
||||||
);
|
|
||||||
|
http.StreamedResponse response = await request.send();
|
||||||
|
|
||||||
if (response.statusCode == 200) {
|
if (response.statusCode == 200) {
|
||||||
var responseBody = jsonDecode(response.body);
|
// print(await response.stream.bytesToString());
|
||||||
print(responseBody);
|
return await response.stream.bytesToString();
|
||||||
print('imagePath=$imagePathFull');
|
} else {
|
||||||
return responseBody.toString();
|
print(response.reasonPhrase);
|
||||||
}
|
}
|
||||||
return response.statusCode;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<dynamic> getChatGPT({
|
Future<dynamic> getChatGPT({
|
||||||
|
|||||||
@@ -171,7 +171,7 @@ class AI extends GetxController {
|
|||||||
// },
|
// },
|
||||||
{
|
{
|
||||||
'text':
|
'text':
|
||||||
"Extract the desired information from the following passage as json decoded like $prompt just in this:\n\n$payload"
|
"Extract the desired information from the following passage as json decoded like $prompt .and look for this instruction first name in line 3or 2 ,fullname in line 4 from it written left to right but you modify it rtl,address in line 5 it written left to right but you modify it rtl and 6,dob,nationalid in the last line as just in this:\n\n$payload"
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
@@ -196,7 +196,7 @@ class AI extends GetxController {
|
|||||||
},
|
},
|
||||||
]
|
]
|
||||||
});
|
});
|
||||||
print(requestBody);
|
// print(requestBody);
|
||||||
|
|
||||||
final response = await http.post(
|
final response = await http.post(
|
||||||
Uri.parse(
|
Uri.parse(
|
||||||
|
|||||||
@@ -81,7 +81,7 @@ class LocationController extends GetxController {
|
|||||||
// )));
|
// )));
|
||||||
// }
|
// }
|
||||||
Get.find<HomeCaptainController>()
|
Get.find<HomeCaptainController>()
|
||||||
.mapHomeCaptainController
|
.mapHomeCaptainController!
|
||||||
.animateCamera(CameraUpdate.newLatLng(LatLng(
|
.animateCamera(CameraUpdate.newLatLng(LatLng(
|
||||||
Get.find<LocationController>().myLocation.latitude,
|
Get.find<LocationController>().myLocation.latitude,
|
||||||
Get.find<LocationController>().myLocation.longitude,
|
Get.find<LocationController>().myLocation.longitude,
|
||||||
|
|||||||
80
lib/controller/functions/sms_egypt.dart
Normal file
80
lib/controller/functions/sms_egypt.dart
Normal file
@@ -0,0 +1,80 @@
|
|||||||
|
import 'package:SEFER/constant/api_key.dart';
|
||||||
|
import 'package:SEFER/constant/box_name.dart';
|
||||||
|
import 'package:SEFER/constant/info.dart';
|
||||||
|
import 'package:SEFER/constant/links.dart';
|
||||||
|
import 'package:SEFER/main.dart';
|
||||||
|
import 'package:SEFER/views/widgets/elevated_btn.dart';
|
||||||
|
import 'package:get/get.dart';
|
||||||
|
import 'package:http/http.dart' as http;
|
||||||
|
|
||||||
|
class SmsEgypt extends GetxController {
|
||||||
|
var headers = {'Content-Type': 'application/json'};
|
||||||
|
|
||||||
|
Future sendSmsEgypt(String phone, otp) async {
|
||||||
|
var res = await http.post(
|
||||||
|
Uri.parse(AppLink.sendSms),
|
||||||
|
body: {
|
||||||
|
"username": AppInformation.appName,
|
||||||
|
"password": AK.smsPassword,
|
||||||
|
"message": "${AppInformation.appName} app code is $otp\ncopy it to app",
|
||||||
|
"language": box.read(BoxName.lang) == 'en' ? "e" : 'r',
|
||||||
|
"sender": "Kazumi", // todo add sefer sender name
|
||||||
|
"receiver": "2$phone"
|
||||||
|
},
|
||||||
|
headers: headers,
|
||||||
|
);
|
||||||
|
if (res.statusCode == 200) {
|
||||||
|
Get.defaultDialog(
|
||||||
|
title: 'You will recieve code in sms message'.tr,
|
||||||
|
middleText: '',
|
||||||
|
confirm: MyElevatedButton(
|
||||||
|
title: 'OK'.tr,
|
||||||
|
onPressed: () {
|
||||||
|
Get.back();
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Future checkCredit(String phone, otp) async {
|
||||||
|
var res = await http.post(
|
||||||
|
Uri.parse(AppLink.checkCredit),
|
||||||
|
body: {
|
||||||
|
"username": AppInformation.appName,
|
||||||
|
"password": AK.smsPassword,
|
||||||
|
},
|
||||||
|
headers: headers,
|
||||||
|
);
|
||||||
|
print(res);
|
||||||
|
}
|
||||||
|
|
||||||
|
Future sendSmsWithValidaty(String phone, otp) async {
|
||||||
|
var res = await http.post(
|
||||||
|
Uri.parse(AppLink.checkCredit),
|
||||||
|
body: {
|
||||||
|
"username": AppInformation.appName,
|
||||||
|
"password": AK.smsPassword,
|
||||||
|
"message": "This is an example SMS message.",
|
||||||
|
"language": box.read(BoxName.lang) == 'en' ? "e" : 'r',
|
||||||
|
"sender": "Kazumi", // todo add sefer sender name
|
||||||
|
"receiver": "2$phone",
|
||||||
|
"validity": "10",
|
||||||
|
"StartTime": DateTime.now().toString() // "1/1/2024 10:00:00"
|
||||||
|
},
|
||||||
|
headers: headers,
|
||||||
|
);
|
||||||
|
print(res);
|
||||||
|
}
|
||||||
|
|
||||||
|
Future sendSmsStatus(String smsid) async {
|
||||||
|
var res = await http.post(
|
||||||
|
Uri.parse(AppLink.checkCredit),
|
||||||
|
body: {
|
||||||
|
"username": AppInformation.appName,
|
||||||
|
"password": AK.smsPassword,
|
||||||
|
"smsid": smsid //"00b77dfc-5b8f-474d-9def-9f0158b70f98"
|
||||||
|
},
|
||||||
|
headers: headers,
|
||||||
|
);
|
||||||
|
print(res);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -7,7 +7,7 @@ import 'package:http/http.dart' as http;
|
|||||||
import 'package:image_cropper/image_cropper.dart';
|
import 'package:image_cropper/image_cropper.dart';
|
||||||
import 'package:image_picker/image_picker.dart';
|
import 'package:image_picker/image_picker.dart';
|
||||||
import 'package:path/path.dart';
|
import 'package:path/path.dart';
|
||||||
|
import 'package:image/image.dart' as image_package;
|
||||||
import '../../constant/box_name.dart';
|
import '../../constant/box_name.dart';
|
||||||
import '../../constant/colors.dart';
|
import '../../constant/colors.dart';
|
||||||
import '../../main.dart';
|
import '../../main.dart';
|
||||||
@@ -21,6 +21,7 @@ class ImageController extends GetxController {
|
|||||||
choosImage(String link, String imageType) async {
|
choosImage(String link, String imageType) async {
|
||||||
final pickedImage = await picker.pickImage(source: ImageSource.gallery);
|
final pickedImage = await picker.pickImage(source: ImageSource.gallery);
|
||||||
image = File(pickedImage!.path);
|
image = File(pickedImage!.path);
|
||||||
|
|
||||||
croppedFile = await ImageCropper().cropImage(
|
croppedFile = await ImageCropper().cropImage(
|
||||||
sourcePath: image!.path,
|
sourcePath: image!.path,
|
||||||
aspectRatioPresets: [
|
aspectRatioPresets: [
|
||||||
|
|||||||
@@ -164,7 +164,17 @@ class HomeCaptainController extends GetxController {
|
|||||||
update();
|
update();
|
||||||
}
|
}
|
||||||
|
|
||||||
late GoogleMapController mapHomeCaptainController;
|
// late GoogleMapController mapHomeCaptainController;
|
||||||
|
// void onMapCreated(GoogleMapController controller) {
|
||||||
|
// mapHomeCaptainController = controller;
|
||||||
|
// controller.getVisibleRegion();
|
||||||
|
// // Animate camera to user location (optional)
|
||||||
|
// controller.animateCamera(
|
||||||
|
// CameraUpdate.newLatLng(Get.find<LocationController>().myLocation),
|
||||||
|
// );
|
||||||
|
// }
|
||||||
|
GoogleMapController? mapHomeCaptainController; // Initialize to null
|
||||||
|
|
||||||
void onMapCreated(GoogleMapController controller) {
|
void onMapCreated(GoogleMapController controller) {
|
||||||
mapHomeCaptainController = controller;
|
mapHomeCaptainController = controller;
|
||||||
controller.getVisibleRegion();
|
controller.getVisibleRegion();
|
||||||
@@ -221,7 +231,7 @@ class HomeCaptainController extends GetxController {
|
|||||||
getCountRideToday();
|
getCountRideToday();
|
||||||
getAllPayment();
|
getAllPayment();
|
||||||
startPeriodicExecution();
|
startPeriodicExecution();
|
||||||
onMapCreated(mapHomeCaptainController);
|
onMapCreated(mapHomeCaptainController!);
|
||||||
totalPoints = Get.find<CaptainWalletController>().totalPoints;
|
totalPoints = Get.find<CaptainWalletController>().totalPoints;
|
||||||
getRefusedOrderByCaptain();
|
getRefusedOrderByCaptain();
|
||||||
// LocationController().getLocation();
|
// LocationController().getLocation();
|
||||||
|
|||||||
@@ -44,18 +44,14 @@ class CaptainWalletController extends GetxController {
|
|||||||
payload: {'driverID': box.read(BoxName.driverID)},
|
payload: {'driverID': box.read(BoxName.driverID)},
|
||||||
);
|
);
|
||||||
walletDate = jsonDecode(res);
|
walletDate = jsonDecode(res);
|
||||||
totalAmount = walletDate['message'][0]['total_amount'].toString() == null
|
totalAmount = walletDate['message'][0]['total_amount'] ?? '0';
|
||||||
? '0'
|
|
||||||
: walletDate['message'][0]['total_amount'];
|
|
||||||
print(totalAmount);
|
print(totalAmount);
|
||||||
|
|
||||||
var res1 = await CRUD().get(
|
var res1 = await CRUD().get(
|
||||||
link: AppLink.getAllPaymentVisa,
|
link: AppLink.getAllPaymentVisa,
|
||||||
payload: {'driverID': box.read(BoxName.driverID)});
|
payload: {'driverID': box.read(BoxName.driverID)});
|
||||||
walletDateVisa = jsonDecode(res1);
|
walletDateVisa = jsonDecode(res1);
|
||||||
totalAmountVisa = walletDateVisa['message'][0]['diff'].toString() == null
|
totalAmountVisa = walletDateVisa['message'][0]['diff'] ?? '0';
|
||||||
? '0'
|
|
||||||
: walletDateVisa['message'][0]['diff'];
|
|
||||||
print(totalAmountVisa);
|
print(totalAmountVisa);
|
||||||
isLoading = false;
|
isLoading = false;
|
||||||
update();
|
update();
|
||||||
|
|||||||
@@ -47,7 +47,7 @@ class SplashScreenController extends GetxController
|
|||||||
Timer(const Duration(seconds: 4), () {
|
Timer(const Duration(seconds: 4), () {
|
||||||
box.read(BoxName.onBoarding) == null
|
box.read(BoxName.onBoarding) == null
|
||||||
? Get.off(() => OnBoardingPage())
|
? Get.off(() => OnBoardingPage())
|
||||||
: box.read(BoxName.dobDriver) != null
|
: box.read(BoxName.emailDriver) != null
|
||||||
? Get.off(() => HomeCaptain())
|
? Get.off(() => HomeCaptain())
|
||||||
: Get.off(() => LoginCaptin());
|
: Get.off(() => LoginCaptin());
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
|
import 'dart:convert';
|
||||||
import 'dart:io';
|
import 'dart:io';
|
||||||
|
|
||||||
import 'package:SEFER/controller/payment/paymob/paymob_response.dart';
|
import 'package:SEFER/controller/payment/paymob/paymob_response.dart';
|
||||||
import 'package:SEFER/views/widgets/elevated_btn.dart';
|
|
||||||
import 'package:firebase_core/firebase_core.dart';
|
import 'package:firebase_core/firebase_core.dart';
|
||||||
import 'package:firebase_messaging/firebase_messaging.dart';
|
import 'package:firebase_messaging/firebase_messaging.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
@@ -12,7 +12,6 @@ import 'package:get_storage/get_storage.dart';
|
|||||||
import 'package:flutter/services.dart';
|
import 'package:flutter/services.dart';
|
||||||
import 'package:wakelock_plus/wakelock_plus.dart';
|
import 'package:wakelock_plus/wakelock_plus.dart';
|
||||||
import 'constant/api_key.dart';
|
import 'constant/api_key.dart';
|
||||||
import 'constant/box_name.dart';
|
|
||||||
import 'constant/credential.dart';
|
import 'constant/credential.dart';
|
||||||
import 'constant/info.dart';
|
import 'constant/info.dart';
|
||||||
import 'controller/firebase/firbase_messge.dart';
|
import 'controller/firebase/firbase_messge.dart';
|
||||||
@@ -25,6 +24,7 @@ import 'controller/payment/paymob/paymob_wallet.dart';
|
|||||||
import 'firebase_options.dart';
|
import 'firebase_options.dart';
|
||||||
import 'models/db_sql.dart';
|
import 'models/db_sql.dart';
|
||||||
import 'splash_screen_page.dart';
|
import 'splash_screen_page.dart';
|
||||||
|
import 'views/home/Captin/orderCaptin/order_request_page.dart';
|
||||||
|
|
||||||
final box = GetStorage();
|
final box = GetStorage();
|
||||||
const storage = FlutterSecureStorage();
|
const storage = FlutterSecureStorage();
|
||||||
@@ -36,9 +36,25 @@ DbSql sql = DbSql.instance;
|
|||||||
@pragma('vm:entry-point')
|
@pragma('vm:entry-point')
|
||||||
Future<void> backgroundMessageHandler(RemoteMessage message) async {
|
Future<void> backgroundMessageHandler(RemoteMessage message) async {
|
||||||
await Firebase.initializeApp();
|
await Firebase.initializeApp();
|
||||||
print('===========back===${message.notification?.title}');
|
if (message.data.isNotEmpty && message.notification != null) {
|
||||||
|
print(message.notification?.title);
|
||||||
FirebaseMessagesController().fireBaseTitles(message);
|
FirebaseMessagesController().fireBaseTitles(message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<void> handleBackgroundNotificationClick(RemoteMessage message) async {
|
||||||
|
// Perform any necessary setup or initialization
|
||||||
|
await Firebase.initializeApp();
|
||||||
|
|
||||||
|
var myListString = message.data['DriverList'];
|
||||||
|
var myList = jsonDecode(myListString) as List<dynamic>;
|
||||||
|
|
||||||
|
Get.to(() => OrderRequestPage(), arguments: {
|
||||||
|
'myListString': myListString,
|
||||||
|
'DriverList': myList,
|
||||||
|
// 'PolylineJson': myPoints,
|
||||||
|
'body': message.notification?.body,
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
void main() async {
|
void main() async {
|
||||||
@@ -130,6 +146,12 @@ class MyApp extends StatelessWidget {
|
|||||||
key: UniqueKey(),
|
key: UniqueKey(),
|
||||||
// routes: {'/':const HomePage()},
|
// routes: {'/':const HomePage()},
|
||||||
// home: LoginCaptin());
|
// home: LoginCaptin());
|
||||||
|
getPages: [
|
||||||
|
GetPage(name: '/', page: () => SplashScreen()),
|
||||||
|
GetPage(
|
||||||
|
name: '/OrderRequestPage/:id', page: () => OrderRequestPage()),
|
||||||
|
],
|
||||||
|
initialRoute: '/',
|
||||||
home: SplashScreen());
|
home: SplashScreen());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,7 +6,6 @@ import 'package:SEFER/constant/info.dart';
|
|||||||
import 'package:SEFER/constant/style.dart';
|
import 'package:SEFER/constant/style.dart';
|
||||||
import 'package:SEFER/views/widgets/my_scafold.dart';
|
import 'package:SEFER/views/widgets/my_scafold.dart';
|
||||||
import 'package:SEFER/views/widgets/mycircular.dart';
|
import 'package:SEFER/views/widgets/mycircular.dart';
|
||||||
import 'package:flutter/animation.dart';
|
|
||||||
import '../../controller/home/captin/duration_controller .dart';
|
import '../../controller/home/captin/duration_controller .dart';
|
||||||
|
|
||||||
class RideCalculateDriver extends StatelessWidget {
|
class RideCalculateDriver extends StatelessWidget {
|
||||||
|
|||||||
@@ -1,111 +0,0 @@
|
|||||||
import 'package:flutter/material.dart';
|
|
||||||
import 'package:get/get.dart';
|
|
||||||
import 'package:get/get_rx/src/rx_typedefs/rx_typedefs.dart';
|
|
||||||
import 'package:SEFER/constant/box_name.dart';
|
|
||||||
import 'package:SEFER/constant/links.dart';
|
|
||||||
import 'package:SEFER/constant/style.dart';
|
|
||||||
import 'package:SEFER/controller/functions/crud.dart';
|
|
||||||
import 'package:SEFER/main.dart';
|
|
||||||
import 'package:SEFER/views/admin/rides/rides.dart';
|
|
||||||
import 'package:SEFER/views/admin/static/static.dart';
|
|
||||||
import 'package:SEFER/views/admin/wallet/wallet.dart';
|
|
||||||
import 'package:SEFER/views/widgets/my_scafold.dart';
|
|
||||||
|
|
||||||
import '../../controller/auth/captin/ml_google_doc.dart';
|
|
||||||
import '../../controller/functions/device_info.dart';
|
|
||||||
import '../../controller/functions/gemeni.dart';
|
|
||||||
import 'captain/captain.dart';
|
|
||||||
import 'passenger/passenger.dart';
|
|
||||||
|
|
||||||
class AdminHomePage extends StatelessWidget {
|
|
||||||
const AdminHomePage({super.key});
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
return MyScafolld(
|
|
||||||
title: 'Admin Home Page',
|
|
||||||
body: [
|
|
||||||
Padding(
|
|
||||||
padding: const EdgeInsets.all(8.0),
|
|
||||||
child: Wrap(
|
|
||||||
crossAxisAlignment: WrapCrossAlignment.center,
|
|
||||||
alignment: WrapAlignment.center,
|
|
||||||
children: [
|
|
||||||
AdminWidgetsDashBoard(
|
|
||||||
title: 'Passengers',
|
|
||||||
onPressed: () => Get.to(() => Passengrs(),
|
|
||||||
transition: Transition.topLevel)),
|
|
||||||
AdminWidgetsDashBoard(
|
|
||||||
title: 'Captains',
|
|
||||||
onPressed: () =>
|
|
||||||
Get.to(() => Captain(), transition: Transition.size)),
|
|
||||||
AdminWidgetsDashBoard(
|
|
||||||
title: 'Wallet',
|
|
||||||
onPressed: () =>
|
|
||||||
Get.to(() => Wallet(), transition: Transition.fade)),
|
|
||||||
AdminWidgetsDashBoard(
|
|
||||||
title: 'Rides',
|
|
||||||
onPressed: () =>
|
|
||||||
Get.to(() => Rides(), transition: Transition.downToUp)),
|
|
||||||
AdminWidgetsDashBoard(
|
|
||||||
title: 'Static',
|
|
||||||
onPressed: () => Get.to(() => StaticDash())),
|
|
||||||
AdminWidgetsDashBoard(
|
|
||||||
title: 'Gemeni', onPressed: () => AI().generateContent()),
|
|
||||||
AdminWidgetsDashBoard(
|
|
||||||
title: 'CarLicenseJordan',
|
|
||||||
onPressed: () => AI().carLicenseJordan()),
|
|
||||||
AdminWidgetsDashBoard(
|
|
||||||
title: 'JordanID', onPressed: () => AI().jordanID()),
|
|
||||||
AdminWidgetsDashBoard(
|
|
||||||
title: 'Llama',
|
|
||||||
onPressed: () =>
|
|
||||||
CarRegistrationRecognizerController().scanText()),
|
|
||||||
AdminWidgetsDashBoard(
|
|
||||||
title: 'Add device to be Admin',
|
|
||||||
onPressed: () async {
|
|
||||||
// Map device = DeviceInfoPlus.deviceData;
|
|
||||||
// print(device);
|
|
||||||
await CRUD().post(link: AppLink.addAdminUser, payload: {
|
|
||||||
// 'deviceNumber': device['serialNumber'].toString(),
|
|
||||||
'name': 'b',
|
|
||||||
});
|
|
||||||
}),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
)
|
|
||||||
],
|
|
||||||
isleading: false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class AdminWidgetsDashBoard extends StatelessWidget {
|
|
||||||
const AdminWidgetsDashBoard({
|
|
||||||
super.key,
|
|
||||||
required this.title,
|
|
||||||
required this.onPressed,
|
|
||||||
});
|
|
||||||
final String title;
|
|
||||||
final Callback onPressed;
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
return Padding(
|
|
||||||
padding: const EdgeInsets.all(8.0),
|
|
||||||
child: InkWell(
|
|
||||||
onTap: onPressed,
|
|
||||||
child: Container(
|
|
||||||
decoration: AppStyle.boxDecoration,
|
|
||||||
height: 100,
|
|
||||||
width: Get.width * .4,
|
|
||||||
child: Center(
|
|
||||||
child: Text(
|
|
||||||
title.tr,
|
|
||||||
style: AppStyle.title,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,223 +0,0 @@
|
|||||||
import 'package:flutter/material.dart';
|
|
||||||
import 'package:get/get.dart';
|
|
||||||
import 'package:SEFER/views/admin/captain/captain_details.dart';
|
|
||||||
import 'package:SEFER/views/widgets/my_scafold.dart';
|
|
||||||
|
|
||||||
import '../../../constant/colors.dart';
|
|
||||||
import '../../../constant/style.dart';
|
|
||||||
import '../../../controller/admin/captain_admin_controller.dart';
|
|
||||||
import '../../widgets/elevated_btn.dart';
|
|
||||||
import '../../widgets/my_textField.dart';
|
|
||||||
import '../../widgets/mycircular.dart';
|
|
||||||
import 'form_captain.dart';
|
|
||||||
|
|
||||||
class Captain extends StatelessWidget {
|
|
||||||
Captain({super.key});
|
|
||||||
final CaptainAdminController captainAdminController =
|
|
||||||
Get.put(CaptainAdminController());
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
return MyScafolld(
|
|
||||||
title: 'Captain'.tr,
|
|
||||||
body: [
|
|
||||||
GetBuilder<CaptainAdminController>(
|
|
||||||
builder: (captainAdminController) => Column(
|
|
||||||
children: [
|
|
||||||
captainAdminController.isLoading
|
|
||||||
? const MyCircularProgressIndicator()
|
|
||||||
: Column(
|
|
||||||
children: [
|
|
||||||
Padding(
|
|
||||||
padding: const EdgeInsets.all(5),
|
|
||||||
child: Column(
|
|
||||||
mainAxisAlignment: MainAxisAlignment.center,
|
|
||||||
children: [
|
|
||||||
captainAdmin(
|
|
||||||
captainAdminController,
|
|
||||||
'Captains Count',
|
|
||||||
'countPassenger',
|
|
||||||
),
|
|
||||||
MyElevatedButton(
|
|
||||||
title: 'Add Prize to Gold Captains',
|
|
||||||
onPressed: () {
|
|
||||||
var date = DateTime.now();
|
|
||||||
var day = date.weekday;
|
|
||||||
|
|
||||||
if (day == 6) {
|
|
||||||
// Saturday is 6
|
|
||||||
// print(day);
|
|
||||||
Get.defaultDialog(
|
|
||||||
title:
|
|
||||||
'Add Prize to Gold Captains',
|
|
||||||
titleStyle: AppStyle.title,
|
|
||||||
content: Column(
|
|
||||||
children: [
|
|
||||||
Text(
|
|
||||||
'Add Points to their wallet as prize'
|
|
||||||
.tr,
|
|
||||||
style: AppStyle.title,
|
|
||||||
),
|
|
||||||
Form(
|
|
||||||
key: captainAdminController
|
|
||||||
.formCaptainPrizeKey,
|
|
||||||
child: MyTextForm(
|
|
||||||
controller:
|
|
||||||
captainAdminController
|
|
||||||
.captainPrizeController,
|
|
||||||
label:
|
|
||||||
'Count of prize'
|
|
||||||
.tr,
|
|
||||||
hint: 'Count of prize'
|
|
||||||
.tr,
|
|
||||||
type: TextInputType
|
|
||||||
.number))
|
|
||||||
],
|
|
||||||
),
|
|
||||||
confirm: MyElevatedButton(
|
|
||||||
title: 'Add',
|
|
||||||
onPressed: () async {
|
|
||||||
if (captainAdminController
|
|
||||||
.formCaptainPrizeKey
|
|
||||||
.currentState!
|
|
||||||
.validate()) {
|
|
||||||
captainAdminController
|
|
||||||
.addCaptainsPrizeToWalletSecure();
|
|
||||||
}
|
|
||||||
},
|
|
||||||
),
|
|
||||||
);
|
|
||||||
} else {
|
|
||||||
Get.defaultDialog(
|
|
||||||
title:
|
|
||||||
'This day is not allowed',
|
|
||||||
titleStyle: AppStyle.title,
|
|
||||||
middleText:
|
|
||||||
'Saturday only Allowed day',
|
|
||||||
middleTextStyle: AppStyle.title,
|
|
||||||
confirm: MyElevatedButton(
|
|
||||||
title: 'Ok'.tr,
|
|
||||||
onPressed: () {
|
|
||||||
Get.back();
|
|
||||||
}));
|
|
||||||
}
|
|
||||||
})
|
|
||||||
],
|
|
||||||
),
|
|
||||||
),
|
|
||||||
const SizedBox(
|
|
||||||
height: 10,
|
|
||||||
),
|
|
||||||
InkWell(
|
|
||||||
onTap: () {
|
|
||||||
//todo search
|
|
||||||
},
|
|
||||||
child: Padding(
|
|
||||||
padding: const EdgeInsets.all(3),
|
|
||||||
child: Container(
|
|
||||||
width: Get.width,
|
|
||||||
height: 110,
|
|
||||||
decoration: BoxDecoration(
|
|
||||||
border: Border.all(
|
|
||||||
width: 2,
|
|
||||||
color: AppColor.greenColor)),
|
|
||||||
child: formSearchCaptain()
|
|
||||||
// ],
|
|
||||||
// ),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
SizedBox(
|
|
||||||
height: Get.height * .5,
|
|
||||||
child: ListView.builder(
|
|
||||||
itemCount: captainAdminController
|
|
||||||
.captainData['message'].length,
|
|
||||||
itemBuilder: (context, index) {
|
|
||||||
final user = captainAdminController
|
|
||||||
.captainData['message'][index];
|
|
||||||
|
|
||||||
return InkWell(
|
|
||||||
onTap: () {
|
|
||||||
Get.to(const CaptainsDetailsPage(),
|
|
||||||
arguments: {
|
|
||||||
'data': user,
|
|
||||||
});
|
|
||||||
},
|
|
||||||
child: Padding(
|
|
||||||
padding: const EdgeInsets.all(3),
|
|
||||||
child: Container(
|
|
||||||
decoration: BoxDecoration(
|
|
||||||
border: Border.all(width: 2)),
|
|
||||||
child: ListTile(
|
|
||||||
title: Row(
|
|
||||||
mainAxisAlignment:
|
|
||||||
MainAxisAlignment
|
|
||||||
.spaceBetween,
|
|
||||||
children: [
|
|
||||||
Text(
|
|
||||||
'Name : ${user['first_name']} ${user['last_name']}',
|
|
||||||
style: AppStyle.title,
|
|
||||||
),
|
|
||||||
Text(
|
|
||||||
'Rating : ${user['ratingPassenger']}',
|
|
||||||
style: AppStyle.title,
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
subtitle: Row(
|
|
||||||
mainAxisAlignment:
|
|
||||||
MainAxisAlignment
|
|
||||||
.spaceBetween,
|
|
||||||
children: [
|
|
||||||
Text(
|
|
||||||
'Count Trip : ${user['countPassengerRide']}',
|
|
||||||
style: AppStyle.title,
|
|
||||||
),
|
|
||||||
Text(
|
|
||||||
'Count Driver Rate : ${user['countDriverRate']}',
|
|
||||||
style: AppStyle.title,
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
},
|
|
||||||
),
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
],
|
|
||||||
))
|
|
||||||
],
|
|
||||||
isleading: true,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
Container captainAdmin(CaptainAdminController captainAdminController,
|
|
||||||
String title, String jsonField) {
|
|
||||||
return Container(
|
|
||||||
height: Get.height * .1,
|
|
||||||
decoration: BoxDecoration(border: Border.all(width: 2)),
|
|
||||||
child: Padding(
|
|
||||||
padding: const EdgeInsets.all(8.0),
|
|
||||||
child: GestureDetector(
|
|
||||||
onTap: () {},
|
|
||||||
child: Column(
|
|
||||||
children: [
|
|
||||||
Text(
|
|
||||||
title.tr,
|
|
||||||
style: AppStyle.title,
|
|
||||||
),
|
|
||||||
Text(
|
|
||||||
captainAdminController.captainData['message'][0][jsonField]
|
|
||||||
.toString(),
|
|
||||||
style: AppStyle.title,
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,168 +0,0 @@
|
|||||||
import 'package:flutter/material.dart';
|
|
||||||
import 'package:get/get.dart';
|
|
||||||
import 'package:SEFER/constant/colors.dart';
|
|
||||||
import 'package:SEFER/constant/style.dart';
|
|
||||||
import 'package:SEFER/controller/firebase/firbase_messge.dart';
|
|
||||||
import 'package:SEFER/views/widgets/elevated_btn.dart';
|
|
||||||
import 'package:SEFER/views/widgets/my_scafold.dart';
|
|
||||||
import 'package:SEFER/views/widgets/my_textField.dart';
|
|
||||||
|
|
||||||
import '../../../controller/admin/captain_admin_controller.dart';
|
|
||||||
|
|
||||||
class CaptainsDetailsPage extends StatelessWidget {
|
|
||||||
const CaptainsDetailsPage({super.key});
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
final arguments = Get.arguments;
|
|
||||||
final Map<String, dynamic> data = arguments['data'];
|
|
||||||
var key = Get.find<CaptainAdminController>().formCaptainPrizeKey;
|
|
||||||
var titleNotify = Get.find<CaptainAdminController>().titleNotify;
|
|
||||||
var bodyNotify = Get.find<CaptainAdminController>().bodyNotify;
|
|
||||||
return MyScafolld(
|
|
||||||
title: data['first_name'] + ' ' + data['last_name'],
|
|
||||||
body: [
|
|
||||||
Padding(
|
|
||||||
padding: const EdgeInsets.all(8.0),
|
|
||||||
child: Column(
|
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
|
||||||
children: [
|
|
||||||
Text(
|
|
||||||
'Email is ${data['email']}',
|
|
||||||
style: AppStyle.title,
|
|
||||||
),
|
|
||||||
Row(
|
|
||||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
|
||||||
children: [
|
|
||||||
Text(
|
|
||||||
'Phone is ${data['phone']}',
|
|
||||||
style: AppStyle.title,
|
|
||||||
),
|
|
||||||
Text(
|
|
||||||
'gender is ${data['gender']}',
|
|
||||||
style: AppStyle.title,
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
Row(
|
|
||||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
|
||||||
children: [
|
|
||||||
Text(
|
|
||||||
'status is ${data['status']}',
|
|
||||||
style: AppStyle.title,
|
|
||||||
),
|
|
||||||
Text(
|
|
||||||
'birthdate is ${data['birthdate']}',
|
|
||||||
style: AppStyle.title,
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
Row(
|
|
||||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
|
||||||
children: [
|
|
||||||
Text(
|
|
||||||
'site is ${data['site']}',
|
|
||||||
style: AppStyle.title,
|
|
||||||
),
|
|
||||||
// Text(
|
|
||||||
// 'sosPhone is ${data['sosPhone']}',
|
|
||||||
// style: AppStyle.title,
|
|
||||||
// ),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
Row(
|
|
||||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
|
||||||
children: [
|
|
||||||
Text(
|
|
||||||
'Count Feedback is ${data['countFeedback']}',
|
|
||||||
style: AppStyle.title,
|
|
||||||
),
|
|
||||||
Text(
|
|
||||||
'Count Driver Rate is ${data['countDriverRate']}',
|
|
||||||
style: AppStyle.title,
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
Row(
|
|
||||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
|
||||||
children: [
|
|
||||||
Text(
|
|
||||||
'Count Cancel is ${data['countPassengerCancel']}',
|
|
||||||
style: AppStyle.title,
|
|
||||||
),
|
|
||||||
Text(
|
|
||||||
'Count Ride is ${data['countPassengerRide']}',
|
|
||||||
style: AppStyle.title,
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
Row(
|
|
||||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
|
||||||
children: [
|
|
||||||
Text(
|
|
||||||
'Rating Captain Avarage is ${data['passengerAverageRating']}',
|
|
||||||
style: AppStyle.title,
|
|
||||||
),
|
|
||||||
Text(
|
|
||||||
'Rating is ${data['ratingPassenger']}',
|
|
||||||
style: AppStyle.title,
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
Container(
|
|
||||||
decoration: BoxDecoration(
|
|
||||||
border: Border.all(width: 3, color: AppColor.yellowColor)),
|
|
||||||
child: TextButton(
|
|
||||||
onPressed: () async {
|
|
||||||
Get.defaultDialog(
|
|
||||||
title: 'Send Notification'.tr,
|
|
||||||
titleStyle: AppStyle.title,
|
|
||||||
content: Form(
|
|
||||||
key: key,
|
|
||||||
child: Column(
|
|
||||||
children: [
|
|
||||||
MyTextForm(
|
|
||||||
controller: titleNotify,
|
|
||||||
label: 'title'.tr,
|
|
||||||
hint: 'title notificaton'.tr,
|
|
||||||
type: TextInputType.name),
|
|
||||||
const SizedBox(
|
|
||||||
height: 10,
|
|
||||||
),
|
|
||||||
MyTextForm(
|
|
||||||
controller: bodyNotify,
|
|
||||||
label: 'body'.tr,
|
|
||||||
hint: 'body notificaton'.tr,
|
|
||||||
type: TextInputType.name)
|
|
||||||
],
|
|
||||||
),
|
|
||||||
),
|
|
||||||
confirm: MyElevatedButton(
|
|
||||||
title: 'Send',
|
|
||||||
onPressed: () {
|
|
||||||
print(titleNotify.text);
|
|
||||||
if (key.currentState!.validate()) {
|
|
||||||
FirebaseMessagesController()
|
|
||||||
.sendNotificationToAnyWithoutData(
|
|
||||||
titleNotify.text,
|
|
||||||
bodyNotify.text,
|
|
||||||
data['passengerToken'],
|
|
||||||
);
|
|
||||||
Get.back();
|
|
||||||
}
|
|
||||||
}));
|
|
||||||
},
|
|
||||||
child: Text(
|
|
||||||
"Send Notificaion to Captains ".tr,
|
|
||||||
style: AppStyle.title,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
)
|
|
||||||
],
|
|
||||||
),
|
|
||||||
)
|
|
||||||
],
|
|
||||||
isleading: true,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,86 +0,0 @@
|
|||||||
import 'package:flutter/material.dart';
|
|
||||||
import 'package:get/get.dart';
|
|
||||||
import 'package:SEFER/controller/admin/captain_admin_controller.dart';
|
|
||||||
import 'package:SEFER/views/admin/captain/captain_details.dart';
|
|
||||||
import 'package:SEFER/views/admin/passenger/passenger_details_page.dart';
|
|
||||||
import 'package:SEFER/views/widgets/elevated_btn.dart';
|
|
||||||
|
|
||||||
import '../../../constant/colors.dart';
|
|
||||||
import '../../../constant/style.dart';
|
|
||||||
|
|
||||||
GetBuilder<CaptainAdminController> formSearchCaptain() {
|
|
||||||
// DbSql sql = DbSql.instance;
|
|
||||||
return GetBuilder<CaptainAdminController>(
|
|
||||||
builder: (controller) => Column(
|
|
||||||
children: [
|
|
||||||
Padding(
|
|
||||||
padding: const EdgeInsets.all(16),
|
|
||||||
child: Container(
|
|
||||||
decoration:
|
|
||||||
const BoxDecoration(color: AppColor.secondaryColor),
|
|
||||||
child: TextField(
|
|
||||||
decoration: InputDecoration(
|
|
||||||
border: const OutlineInputBorder(
|
|
||||||
borderRadius: BorderRadius.only(),
|
|
||||||
gapPadding: 4,
|
|
||||||
borderSide: BorderSide(
|
|
||||||
color: AppColor.redColor,
|
|
||||||
width: 2,
|
|
||||||
)),
|
|
||||||
suffixIcon: InkWell(
|
|
||||||
onTap: () async {
|
|
||||||
if (controller.captainController.text.length > 4) {
|
|
||||||
await controller.getCaptains();
|
|
||||||
|
|
||||||
Get.defaultDialog(
|
|
||||||
title: controller.captain['message'][0]
|
|
||||||
['email'],
|
|
||||||
titleStyle: AppStyle.title,
|
|
||||||
content: Column(
|
|
||||||
mainAxisAlignment:
|
|
||||||
MainAxisAlignment.spaceBetween,
|
|
||||||
children: [
|
|
||||||
Text(
|
|
||||||
'Name is ${controller.captain['message'][0]['first_name']} ${controller.captain['message'][0]['last_name']}',
|
|
||||||
style: AppStyle.title,
|
|
||||||
),
|
|
||||||
Text(
|
|
||||||
'phone is ${controller.captain['message'][0]['phone']}',
|
|
||||||
style: AppStyle.title,
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
confirm: MyElevatedButton(
|
|
||||||
title: 'Go To Details'.tr,
|
|
||||||
onPressed: () {
|
|
||||||
Get.to(
|
|
||||||
() => const CaptainsDetailsPage(),
|
|
||||||
arguments: {
|
|
||||||
'data': controller
|
|
||||||
.captain['message'][0],
|
|
||||||
});
|
|
||||||
}));
|
|
||||||
}
|
|
||||||
},
|
|
||||||
child: const Icon(Icons.search)),
|
|
||||||
hintText: 'Search for Passenger'.tr,
|
|
||||||
hintStyle: AppStyle.title,
|
|
||||||
hintMaxLines: 1,
|
|
||||||
prefixIcon: IconButton(
|
|
||||||
onPressed: () async {
|
|
||||||
controller.captainController.clear();
|
|
||||||
// controller.clearPlaces();
|
|
||||||
},
|
|
||||||
icon: Icon(
|
|
||||||
Icons.clear,
|
|
||||||
color: Colors.red[300],
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
controller: controller.captainController,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
)
|
|
||||||
],
|
|
||||||
));
|
|
||||||
}
|
|
||||||
@@ -1,86 +0,0 @@
|
|||||||
import 'package:flutter/material.dart';
|
|
||||||
import 'package:get/get.dart';
|
|
||||||
import 'package:SEFER/views/admin/passenger/passenger_details_page.dart';
|
|
||||||
import 'package:SEFER/views/widgets/elevated_btn.dart';
|
|
||||||
|
|
||||||
import '../../../constant/colors.dart';
|
|
||||||
import '../../../constant/style.dart';
|
|
||||||
import '../../../controller/admin/passenger_admin_controller.dart';
|
|
||||||
|
|
||||||
GetBuilder<PassengerAdminController> formSearchPassengers() {
|
|
||||||
// DbSql sql = DbSql.instance;
|
|
||||||
return GetBuilder<PassengerAdminController>(
|
|
||||||
builder: (controller) => Column(
|
|
||||||
children: [
|
|
||||||
Padding(
|
|
||||||
padding: const EdgeInsets.all(16),
|
|
||||||
child: Container(
|
|
||||||
decoration:
|
|
||||||
const BoxDecoration(color: AppColor.secondaryColor),
|
|
||||||
child: TextField(
|
|
||||||
decoration: InputDecoration(
|
|
||||||
border: const OutlineInputBorder(
|
|
||||||
borderRadius: BorderRadius.only(),
|
|
||||||
gapPadding: 4,
|
|
||||||
borderSide: BorderSide(
|
|
||||||
color: AppColor.redColor,
|
|
||||||
width: 2,
|
|
||||||
)),
|
|
||||||
suffixIcon: InkWell(
|
|
||||||
onTap: () async {
|
|
||||||
if (controller.passengerController.text.length >
|
|
||||||
4) {
|
|
||||||
await controller.getPassengers();
|
|
||||||
|
|
||||||
Get.defaultDialog(
|
|
||||||
title: controller.passengers['message'][0]
|
|
||||||
['email'],
|
|
||||||
titleStyle: AppStyle.title,
|
|
||||||
content: Column(
|
|
||||||
mainAxisAlignment:
|
|
||||||
MainAxisAlignment.spaceBetween,
|
|
||||||
children: [
|
|
||||||
Text(
|
|
||||||
'Name is ${controller.passengers['message'][0]['first_name']} ${controller.passengers['message'][0]['last_name']}',
|
|
||||||
style: AppStyle.title,
|
|
||||||
),
|
|
||||||
Text(
|
|
||||||
'phone is ${controller.passengers['message'][0]['phone']}',
|
|
||||||
style: AppStyle.title,
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
confirm: MyElevatedButton(
|
|
||||||
title: 'Go To Details'.tr,
|
|
||||||
onPressed: () {
|
|
||||||
Get.to(
|
|
||||||
() => const PassengerDetailsPage(),
|
|
||||||
arguments: {
|
|
||||||
'data': controller
|
|
||||||
.passengers['message'][0],
|
|
||||||
});
|
|
||||||
}));
|
|
||||||
}
|
|
||||||
},
|
|
||||||
child: const Icon(Icons.search)),
|
|
||||||
hintText: 'Search for Passenger'.tr,
|
|
||||||
hintStyle: AppStyle.title,
|
|
||||||
hintMaxLines: 1,
|
|
||||||
prefixIcon: IconButton(
|
|
||||||
onPressed: () async {
|
|
||||||
controller.passengerController.clear();
|
|
||||||
controller.clearPlaces();
|
|
||||||
},
|
|
||||||
icon: Icon(
|
|
||||||
Icons.clear,
|
|
||||||
color: Colors.red[300],
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
controller: controller.passengerController,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
)
|
|
||||||
],
|
|
||||||
));
|
|
||||||
}
|
|
||||||
@@ -1,206 +0,0 @@
|
|||||||
import 'package:flutter/material.dart';
|
|
||||||
import 'package:get/get.dart';
|
|
||||||
import 'package:SEFER/constant/colors.dart';
|
|
||||||
import 'package:SEFER/constant/style.dart';
|
|
||||||
import 'package:SEFER/controller/admin/passenger_admin_controller.dart';
|
|
||||||
import 'package:SEFER/views/widgets/elevated_btn.dart';
|
|
||||||
import 'package:SEFER/views/widgets/my_scafold.dart';
|
|
||||||
import 'package:SEFER/views/widgets/my_textField.dart';
|
|
||||||
import 'package:SEFER/views/widgets/mycircular.dart';
|
|
||||||
|
|
||||||
import 'form_passenger.dart';
|
|
||||||
import 'passenger_details_page.dart';
|
|
||||||
|
|
||||||
class Passengrs extends StatelessWidget {
|
|
||||||
Passengrs({super.key});
|
|
||||||
final PassengerAdminController passengerAdminController =
|
|
||||||
Get.put(PassengerAdminController());
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
return MyScafolld(
|
|
||||||
title: 'Passengrs'.tr,
|
|
||||||
isleading: true,
|
|
||||||
body: [
|
|
||||||
GetBuilder<PassengerAdminController>(
|
|
||||||
builder: (passengerAdminController) => Column(
|
|
||||||
children: [
|
|
||||||
passengerAdminController.isLoading
|
|
||||||
? const MyCircularProgressIndicator()
|
|
||||||
: Column(
|
|
||||||
children: [
|
|
||||||
Padding(
|
|
||||||
padding: const EdgeInsets.all(5),
|
|
||||||
child: Column(
|
|
||||||
mainAxisAlignment: MainAxisAlignment.center,
|
|
||||||
children: [
|
|
||||||
passengerAdmin(
|
|
||||||
passengerAdminController,
|
|
||||||
'Passengers Count',
|
|
||||||
'countPassenger',
|
|
||||||
),
|
|
||||||
MyElevatedButton(
|
|
||||||
title: 'Add Prize to Gold Passengers',
|
|
||||||
onPressed: () {
|
|
||||||
var date = DateTime.now();
|
|
||||||
var day = date.weekday;
|
|
||||||
|
|
||||||
if (day == 6) {
|
|
||||||
// Saturday is 6
|
|
||||||
print(day);
|
|
||||||
Get.defaultDialog(
|
|
||||||
title:
|
|
||||||
'Add Prize to Gold Passengers',
|
|
||||||
titleStyle: AppStyle.title,
|
|
||||||
content: Column(
|
|
||||||
children: [
|
|
||||||
Text(
|
|
||||||
'Add Points to their wallet as prize'
|
|
||||||
.tr,
|
|
||||||
style: AppStyle.title,
|
|
||||||
),
|
|
||||||
Form(
|
|
||||||
key:
|
|
||||||
passengerAdminController
|
|
||||||
.formPrizeKey,
|
|
||||||
child: MyTextForm(
|
|
||||||
controller:
|
|
||||||
passengerAdminController
|
|
||||||
.passengerPrizeController,
|
|
||||||
label:
|
|
||||||
'Count of prize'
|
|
||||||
.tr,
|
|
||||||
hint: 'Count of prize'
|
|
||||||
.tr,
|
|
||||||
type: TextInputType
|
|
||||||
.number))
|
|
||||||
],
|
|
||||||
),
|
|
||||||
confirm: MyElevatedButton(
|
|
||||||
title: 'Add',
|
|
||||||
onPressed: () async {
|
|
||||||
if (passengerAdminController
|
|
||||||
.formPrizeKey
|
|
||||||
.currentState!
|
|
||||||
.validate()) {
|
|
||||||
passengerAdminController
|
|
||||||
.addPassengerPrizeToWalletSecure();
|
|
||||||
}
|
|
||||||
},
|
|
||||||
),
|
|
||||||
);
|
|
||||||
} else {
|
|
||||||
Get.defaultDialog(
|
|
||||||
title:
|
|
||||||
'This day is not allowed',
|
|
||||||
titleStyle: AppStyle.title,
|
|
||||||
middleText:
|
|
||||||
'Saturday only Allowed day',
|
|
||||||
middleTextStyle: AppStyle.title,
|
|
||||||
confirm: MyElevatedButton(
|
|
||||||
title: 'Ok'.tr,
|
|
||||||
onPressed: () {
|
|
||||||
Get.back();
|
|
||||||
}));
|
|
||||||
}
|
|
||||||
})
|
|
||||||
],
|
|
||||||
),
|
|
||||||
),
|
|
||||||
const SizedBox(
|
|
||||||
height: 10,
|
|
||||||
),
|
|
||||||
formSearchPassengers(),
|
|
||||||
SizedBox(
|
|
||||||
height: Get.height * .5,
|
|
||||||
child: ListView.builder(
|
|
||||||
itemCount: passengerAdminController
|
|
||||||
.passengersData['message'].length,
|
|
||||||
itemBuilder: (context, index) {
|
|
||||||
final user = passengerAdminController
|
|
||||||
.passengersData['message'][index];
|
|
||||||
|
|
||||||
return InkWell(
|
|
||||||
onTap: () {
|
|
||||||
Get.to(const PassengerDetailsPage(),
|
|
||||||
arguments: {
|
|
||||||
'data': user,
|
|
||||||
});
|
|
||||||
},
|
|
||||||
child: Padding(
|
|
||||||
padding: const EdgeInsets.all(3),
|
|
||||||
child: Container(
|
|
||||||
decoration: BoxDecoration(
|
|
||||||
border: Border.all(width: 2)),
|
|
||||||
child: ListTile(
|
|
||||||
title: Row(
|
|
||||||
mainAxisAlignment:
|
|
||||||
MainAxisAlignment
|
|
||||||
.spaceBetween,
|
|
||||||
children: [
|
|
||||||
Text(
|
|
||||||
'Name : ${user['first_name']} ${user['last_name']}',
|
|
||||||
style: AppStyle.title,
|
|
||||||
),
|
|
||||||
Text(
|
|
||||||
'Rating : ${user['ratingPassenger']}',
|
|
||||||
style: AppStyle.title,
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
subtitle: Row(
|
|
||||||
mainAxisAlignment:
|
|
||||||
MainAxisAlignment
|
|
||||||
.spaceBetween,
|
|
||||||
children: [
|
|
||||||
Text(
|
|
||||||
'Count Trip : ${user['countPassengerRide']}',
|
|
||||||
style: AppStyle.title,
|
|
||||||
),
|
|
||||||
Text(
|
|
||||||
'Count Driver Rate : ${user['countDriverRate']}',
|
|
||||||
style: AppStyle.title,
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
},
|
|
||||||
),
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
],
|
|
||||||
))
|
|
||||||
],
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
Container passengerAdmin(PassengerAdminController passengerAdminController,
|
|
||||||
String title, String jsonField) {
|
|
||||||
return Container(
|
|
||||||
height: Get.height * .1,
|
|
||||||
decoration: BoxDecoration(border: Border.all(width: 2)),
|
|
||||||
child: Padding(
|
|
||||||
padding: const EdgeInsets.all(8.0),
|
|
||||||
child: GestureDetector(
|
|
||||||
onTap: () {},
|
|
||||||
child: Column(
|
|
||||||
children: [
|
|
||||||
Text(
|
|
||||||
title.tr,
|
|
||||||
style: AppStyle.title,
|
|
||||||
),
|
|
||||||
Text(
|
|
||||||
passengerAdminController.passengersData['message'][0][jsonField]
|
|
||||||
.toString(),
|
|
||||||
style: AppStyle.title,
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,168 +0,0 @@
|
|||||||
import 'package:flutter/material.dart';
|
|
||||||
import 'package:get/get.dart';
|
|
||||||
import 'package:SEFER/constant/colors.dart';
|
|
||||||
import 'package:SEFER/constant/style.dart';
|
|
||||||
import 'package:SEFER/controller/firebase/firbase_messge.dart';
|
|
||||||
import 'package:SEFER/views/widgets/elevated_btn.dart';
|
|
||||||
import 'package:SEFER/views/widgets/my_scafold.dart';
|
|
||||||
import 'package:SEFER/views/widgets/my_textField.dart';
|
|
||||||
|
|
||||||
import '../../../controller/admin/passenger_admin_controller.dart';
|
|
||||||
|
|
||||||
class PassengerDetailsPage extends StatelessWidget {
|
|
||||||
const PassengerDetailsPage({super.key});
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
final arguments = Get.arguments;
|
|
||||||
final Map<String, dynamic> data = arguments['data'];
|
|
||||||
var key = Get.find<PassengerAdminController>().formPrizeKey;
|
|
||||||
var titleNotify = Get.find<PassengerAdminController>().titleNotify;
|
|
||||||
var bodyNotify = Get.find<PassengerAdminController>().bodyNotify;
|
|
||||||
return MyScafolld(
|
|
||||||
title: data['first_name'],
|
|
||||||
body: [
|
|
||||||
Padding(
|
|
||||||
padding: const EdgeInsets.all(8.0),
|
|
||||||
child: Column(
|
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
|
||||||
children: [
|
|
||||||
Text(
|
|
||||||
'Email is ${data['email']}',
|
|
||||||
style: AppStyle.title,
|
|
||||||
),
|
|
||||||
Row(
|
|
||||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
|
||||||
children: [
|
|
||||||
Text(
|
|
||||||
'Phone is ${data['phone']}',
|
|
||||||
style: AppStyle.title,
|
|
||||||
),
|
|
||||||
Text(
|
|
||||||
'gender is ${data['gender']}',
|
|
||||||
style: AppStyle.title,
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
Row(
|
|
||||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
|
||||||
children: [
|
|
||||||
Text(
|
|
||||||
'status is ${data['status']}',
|
|
||||||
style: AppStyle.title,
|
|
||||||
),
|
|
||||||
Text(
|
|
||||||
'birthdate is ${data['birthdate']}',
|
|
||||||
style: AppStyle.title,
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
Row(
|
|
||||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
|
||||||
children: [
|
|
||||||
Text(
|
|
||||||
'site is ${data['site']}',
|
|
||||||
style: AppStyle.title,
|
|
||||||
),
|
|
||||||
Text(
|
|
||||||
'sosPhone is ${data['sosPhone']}',
|
|
||||||
style: AppStyle.title,
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
Row(
|
|
||||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
|
||||||
children: [
|
|
||||||
Text(
|
|
||||||
'Count Feedback is ${data['countFeedback']}',
|
|
||||||
style: AppStyle.title,
|
|
||||||
),
|
|
||||||
Text(
|
|
||||||
'Count Driver Rate is ${data['countDriverRate']}',
|
|
||||||
style: AppStyle.title,
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
Row(
|
|
||||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
|
||||||
children: [
|
|
||||||
Text(
|
|
||||||
'Count Cancel is ${data['countPassengerCancel']}',
|
|
||||||
style: AppStyle.title,
|
|
||||||
),
|
|
||||||
Text(
|
|
||||||
'Count Ride is ${data['countPassengerRide']}',
|
|
||||||
style: AppStyle.title,
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
Row(
|
|
||||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
|
||||||
children: [
|
|
||||||
Text(
|
|
||||||
'Rating Captain Avarage is ${data['passengerAverageRating']}',
|
|
||||||
style: AppStyle.title,
|
|
||||||
),
|
|
||||||
Text(
|
|
||||||
'Rating is ${data['ratingPassenger']}',
|
|
||||||
style: AppStyle.title,
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
Container(
|
|
||||||
decoration: BoxDecoration(
|
|
||||||
border: Border.all(width: 3, color: AppColor.yellowColor)),
|
|
||||||
child: TextButton(
|
|
||||||
onPressed: () async {
|
|
||||||
Get.defaultDialog(
|
|
||||||
title: 'Send Notification'.tr,
|
|
||||||
titleStyle: AppStyle.title,
|
|
||||||
content: Form(
|
|
||||||
key: key,
|
|
||||||
child: Column(
|
|
||||||
children: [
|
|
||||||
MyTextForm(
|
|
||||||
controller: titleNotify,
|
|
||||||
label: 'title'.tr,
|
|
||||||
hint: 'title notificaton'.tr,
|
|
||||||
type: TextInputType.name),
|
|
||||||
const SizedBox(
|
|
||||||
height: 10,
|
|
||||||
),
|
|
||||||
MyTextForm(
|
|
||||||
controller: bodyNotify,
|
|
||||||
label: 'body'.tr,
|
|
||||||
hint: 'body notificaton'.tr,
|
|
||||||
type: TextInputType.name)
|
|
||||||
],
|
|
||||||
),
|
|
||||||
),
|
|
||||||
confirm: MyElevatedButton(
|
|
||||||
title: 'Send',
|
|
||||||
onPressed: () {
|
|
||||||
print(titleNotify.text);
|
|
||||||
if (key.currentState!.validate()) {
|
|
||||||
FirebaseMessagesController()
|
|
||||||
.sendNotificationToAnyWithoutData(
|
|
||||||
titleNotify.text,
|
|
||||||
bodyNotify.text,
|
|
||||||
data['passengerToken'],
|
|
||||||
);
|
|
||||||
Get.back();
|
|
||||||
}
|
|
||||||
}));
|
|
||||||
},
|
|
||||||
child: Text(
|
|
||||||
"Send Notificaion to Passenger ".tr,
|
|
||||||
style: AppStyle.title,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
)
|
|
||||||
],
|
|
||||||
),
|
|
||||||
)
|
|
||||||
],
|
|
||||||
isleading: true,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,237 +0,0 @@
|
|||||||
import 'package:fl_chart/fl_chart.dart';
|
|
||||||
import 'package:flutter/material.dart';
|
|
||||||
import 'package:get/get.dart';
|
|
||||||
import 'package:SEFER/constant/colors.dart';
|
|
||||||
import 'package:SEFER/constant/style.dart';
|
|
||||||
import 'package:SEFER/views/widgets/my_scafold.dart';
|
|
||||||
import 'package:SEFER/views/widgets/mycircular.dart';
|
|
||||||
|
|
||||||
import '../../../controller/admin/ride_admin_controller.dart';
|
|
||||||
|
|
||||||
class Rides extends StatelessWidget {
|
|
||||||
Rides({super.key});
|
|
||||||
RideAdminController rideAdminController = Get.put(RideAdminController());
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
return MyScafolld(title: 'Rides'.tr, isleading: true, body: [
|
|
||||||
GetBuilder<RideAdminController>(
|
|
||||||
builder: (rideAdminController) => rideAdminController.isLoading
|
|
||||||
? const Center(child: MyCircularProgressIndicator())
|
|
||||||
: Column(
|
|
||||||
children: [
|
|
||||||
SizedBox(
|
|
||||||
height: Get.height * .4,
|
|
||||||
child: LineChart(
|
|
||||||
duration: const Duration(milliseconds: 150),
|
|
||||||
curve: Curves.ease,
|
|
||||||
LineChartData(
|
|
||||||
lineBarsData: [
|
|
||||||
LineChartBarData(
|
|
||||||
spots: rideAdminController.chartData,
|
|
||||||
isCurved: true,
|
|
||||||
color: Colors.deepPurpleAccent, // Custom color
|
|
||||||
barWidth: 3, // Thinner line
|
|
||||||
dotData: const FlDotData(
|
|
||||||
show: true), // Show dots on each point
|
|
||||||
belowBarData: BarAreaData(
|
|
||||||
// Add gradient fill below the line
|
|
||||||
show: true,
|
|
||||||
color: AppColor.deepPurpleAccent,
|
|
||||||
),
|
|
||||||
isStrokeJoinRound: true,
|
|
||||||
shadow: const BoxShadow(
|
|
||||||
color: AppColor.yellowColor,
|
|
||||||
blurRadius: 4,
|
|
||||||
offset: Offset(2, 2),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
],
|
|
||||||
showingTooltipIndicators: const [],
|
|
||||||
titlesData: FlTitlesData(
|
|
||||||
show: true,
|
|
||||||
topTitles: AxisTitles(
|
|
||||||
axisNameWidget: Text(
|
|
||||||
'Days',
|
|
||||||
style: AppStyle.title,
|
|
||||||
),
|
|
||||||
axisNameSize: 30,
|
|
||||||
sideTitles: const SideTitles(
|
|
||||||
reservedSize: 30, showTitles: true)),
|
|
||||||
bottomTitles: AxisTitles(
|
|
||||||
axisNameWidget: Text(
|
|
||||||
'Total Trips on month'.tr,
|
|
||||||
style: AppStyle.title,
|
|
||||||
),
|
|
||||||
axisNameSize: 30,
|
|
||||||
sideTitles: const SideTitles(
|
|
||||||
reservedSize: 30, showTitles: true)),
|
|
||||||
leftTitles: AxisTitles(
|
|
||||||
axisNameWidget: Text(
|
|
||||||
'Counts of Trips on month'.tr,
|
|
||||||
style: AppStyle.title,
|
|
||||||
),
|
|
||||||
axisNameSize: 30,
|
|
||||||
sideTitles: const SideTitles(
|
|
||||||
reservedSize: 30, showTitles: true)),
|
|
||||||
),
|
|
||||||
gridData: const FlGridData(
|
|
||||||
show: true,
|
|
||||||
),
|
|
||||||
borderData: FlBorderData(
|
|
||||||
show: true,
|
|
||||||
border: const Border(
|
|
||||||
bottom: BorderSide(color: AppColor.accentColor),
|
|
||||||
left: BorderSide(color: AppColor.accentColor),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
// SizedBox(
|
|
||||||
// height: Get.height * .4,
|
|
||||||
// child: PieChart(
|
|
||||||
// PieChartData(
|
|
||||||
// sectionsSpace: 4, // Adjust spacing between sections
|
|
||||||
// centerSpaceRadius:
|
|
||||||
// 40, // Adjust radius of center space
|
|
||||||
// sections: [
|
|
||||||
// for (final rideData in rideAdminController.rideData)
|
|
||||||
// PieChartSectionData(
|
|
||||||
// value: rideData.ridesCount.toDouble(),
|
|
||||||
// title: '${rideData.day}', showTitle: true,
|
|
||||||
// titleStyle:
|
|
||||||
// AppStyle.subtitle, // Display day as title
|
|
||||||
// radius: 60, // Adjust radius of each section
|
|
||||||
// color:
|
|
||||||
// AppColor.deepPurpleAccent, // Custom color
|
|
||||||
// ),
|
|
||||||
// ],
|
|
||||||
// ),
|
|
||||||
// ),
|
|
||||||
// ),
|
|
||||||
|
|
||||||
// SizedBox(
|
|
||||||
// // height: 400,
|
|
||||||
// child: SfCartesianChart(
|
|
||||||
// legend: const Legend(
|
|
||||||
// isVisible: true,
|
|
||||||
// position: LegendPosition.bottom,
|
|
||||||
// overflowMode: LegendItemOverflowMode.wrap,
|
|
||||||
// textStyle: TextStyle(
|
|
||||||
// color: Colors.white,
|
|
||||||
// fontSize: 12,
|
|
||||||
// fontWeight: FontWeight.bold,
|
|
||||||
// ),
|
|
||||||
// ),
|
|
||||||
// borderWidth: 2,
|
|
||||||
// borderColor: AppColor.blueColor,
|
|
||||||
// plotAreaBorderColor: AppColor.deepPurpleAccent,
|
|
||||||
// enableAxisAnimation: true,
|
|
||||||
// primaryXAxis: CategoryAxis(
|
|
||||||
// borderColor: AppColor.accentColor, borderWidth: 2,
|
|
||||||
// title: AxisTitle(
|
|
||||||
// text: 'Total Trips on month'.tr,
|
|
||||||
// textStyle: AppStyle.title,
|
|
||||||
// ),
|
|
||||||
// // labelRotation: 45,
|
|
||||||
// majorGridLines: const MajorGridLines(width: 0),
|
|
||||||
// ),
|
|
||||||
// primaryYAxis: const NumericAxis(isVisible: false),
|
|
||||||
// series: <LineSeries<ChartDataS, String>>[
|
|
||||||
// LineSeries<ChartDataS, String>(
|
|
||||||
// dataSource: rideAdminController.chartDatasync,
|
|
||||||
// xValueMapper: (ChartDataS data, _) => '${data.day}',
|
|
||||||
// yValueMapper: (ChartDataS data, _) =>
|
|
||||||
// data.ridesCount,
|
|
||||||
// dataLabelSettings:
|
|
||||||
// const DataLabelSettings(isVisible: true),
|
|
||||||
// ),
|
|
||||||
// ],
|
|
||||||
// ),
|
|
||||||
// ),
|
|
||||||
|
|
||||||
const SizedBox(
|
|
||||||
height: 20,
|
|
||||||
),
|
|
||||||
Card(
|
|
||||||
elevation: 4,
|
|
||||||
color: AppColor.deepPurpleAccent,
|
|
||||||
child: Padding(
|
|
||||||
padding: const EdgeInsets.all(8.0),
|
|
||||||
child: Text(
|
|
||||||
'Total Trips on this Month is ${rideAdminController.jsonResponse['message'][0]['current_month_rides_count']}',
|
|
||||||
style: AppStyle.title,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
const SizedBox(
|
|
||||||
height: 20,
|
|
||||||
),
|
|
||||||
Card(
|
|
||||||
elevation: 4,
|
|
||||||
color: AppColor.yellowColor,
|
|
||||||
child: Padding(
|
|
||||||
padding: const EdgeInsets.all(8.0),
|
|
||||||
child: Column(
|
|
||||||
children: [
|
|
||||||
Text(
|
|
||||||
'Driver Average Duration: ${rideAdminController.ridesDetails[0]['driver_avg_duration']}',
|
|
||||||
style: AppStyle.subtitle,
|
|
||||||
),
|
|
||||||
Text(
|
|
||||||
'Number of Drivers: ${rideAdminController.ridesDetails[0]['num_Driver']}',
|
|
||||||
style: AppStyle.subtitle,
|
|
||||||
),
|
|
||||||
Text(
|
|
||||||
'Total Rides: ${rideAdminController.ridesDetails[0]['total_rides']}',
|
|
||||||
style: AppStyle.subtitle,
|
|
||||||
),
|
|
||||||
Text(
|
|
||||||
'Ongoing Rides: ${rideAdminController.ridesDetails[0]['ongoing_rides']}',
|
|
||||||
style: AppStyle.subtitle,
|
|
||||||
),
|
|
||||||
Text(
|
|
||||||
'Completed Rides: ${rideAdminController.ridesDetails[0]['completed_rides']}',
|
|
||||||
style: AppStyle.subtitle,
|
|
||||||
),
|
|
||||||
Text(
|
|
||||||
'Cancelled Rides: ${rideAdminController.ridesDetails[0]['cancelled_rides']}',
|
|
||||||
style: AppStyle.subtitle,
|
|
||||||
),
|
|
||||||
Text(
|
|
||||||
'Longest Duration: ${rideAdminController.ridesDetails[0]['longest_duration']}',
|
|
||||||
style: AppStyle.subtitle,
|
|
||||||
),
|
|
||||||
Text(
|
|
||||||
'Total Distance: ${rideAdminController.ridesDetails[0]['total_distance']} km',
|
|
||||||
style: AppStyle.subtitle,
|
|
||||||
),
|
|
||||||
Text(
|
|
||||||
'Average Distance: ${rideAdminController.ridesDetails[0]['average_distance']} km',
|
|
||||||
style: AppStyle.subtitle,
|
|
||||||
),
|
|
||||||
Text(
|
|
||||||
'Longest Distance: ${rideAdminController.ridesDetails[0]['longest_distance']} km',
|
|
||||||
style: AppStyle.subtitle,
|
|
||||||
),
|
|
||||||
Text(
|
|
||||||
'Total Driver Earnings: \$${rideAdminController.ridesDetails[0]['total_driver_earnings']}',
|
|
||||||
style: AppStyle.subtitle,
|
|
||||||
),
|
|
||||||
Text(
|
|
||||||
'Total Company Earnings: \$${rideAdminController.ridesDetails[0]['total_company_earnings']}',
|
|
||||||
style: AppStyle.subtitle,
|
|
||||||
),
|
|
||||||
Text(
|
|
||||||
'Company Percentage: ${rideAdminController.ridesDetails[0]['companyPercent']} %',
|
|
||||||
style: AppStyle.subtitle,
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
),
|
|
||||||
)
|
|
||||||
],
|
|
||||||
))
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,12 +0,0 @@
|
|||||||
import 'package:flutter/material.dart';
|
|
||||||
import 'package:get/get.dart';
|
|
||||||
import 'package:SEFER/views/widgets/my_scafold.dart';
|
|
||||||
|
|
||||||
class StaticDash extends StatelessWidget {
|
|
||||||
const StaticDash({super.key});
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
return MyScafolld(title: 'Static Dash'.tr, body: [], isleading: true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
import 'package:flutter/material.dart';
|
|
||||||
import 'package:get/get.dart';
|
|
||||||
import 'package:SEFER/views/widgets/my_scafold.dart';
|
|
||||||
|
|
||||||
import '../../../controller/admin/wallet_admin_controller.dart';
|
|
||||||
|
|
||||||
class Wallet extends StatelessWidget {
|
|
||||||
Wallet({super.key});
|
|
||||||
WalletAdminController walletAdminController =
|
|
||||||
Get.put(WalletAdminController());
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
return MyScafolld(title: 'Wallet'.tr, body: [], isleading: true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -36,7 +36,7 @@ class AiPage extends StatelessWidget {
|
|||||||
child: InkWell(
|
child: InkWell(
|
||||||
onTap: () async {
|
onTap: () async {
|
||||||
await CRUD().allMethodForAI(
|
await CRUD().allMethodForAI(
|
||||||
'name,address,dob,nationalNo,',
|
'firstName,fullName,address,dob,nationalNo,',
|
||||||
AppLink.uploadEgypt,
|
AppLink.uploadEgypt,
|
||||||
'idFront'); //egypt
|
'idFront'); //egypt
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -18,14 +18,13 @@ import '../../widgets/mycircular.dart';
|
|||||||
import 'register_captin.dart';
|
import 'register_captin.dart';
|
||||||
|
|
||||||
class LoginCaptin extends StatelessWidget {
|
class LoginCaptin extends StatelessWidget {
|
||||||
// final controller = Get.put(LoginController());
|
final controller = Get.put(LoginCaptinController());
|
||||||
|
|
||||||
LoginCaptin({super.key});
|
LoginCaptin({super.key});
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
Get.put(LoginCaptinController());
|
// Get.put(LoginCaptinController());
|
||||||
final controller = Get.put(LoginController());
|
|
||||||
return GetBuilder<LoginCaptinController>(
|
return GetBuilder<LoginCaptinController>(
|
||||||
builder: (controller) => MyScafolld(
|
builder: (controller) => MyScafolld(
|
||||||
title: 'Login Driver'.tr,
|
title: 'Login Driver'.tr,
|
||||||
@@ -35,6 +34,8 @@ class LoginCaptin extends StatelessWidget {
|
|||||||
agreedPage()
|
agreedPage()
|
||||||
else if (box.read(BoxName.countryCode) == null)
|
else if (box.read(BoxName.countryCode) == null)
|
||||||
CountryPicker()
|
CountryPicker()
|
||||||
|
else if (box.read(BoxName.locationPermission) != 'true')
|
||||||
|
locationPermissionDialog()
|
||||||
else
|
else
|
||||||
SingleChildScrollView(
|
SingleChildScrollView(
|
||||||
child: Column(
|
child: Column(
|
||||||
@@ -155,21 +156,17 @@ class LoginCaptin extends StatelessWidget {
|
|||||||
return null;
|
return null;
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
GetBuilder<LoginCaptinController>(
|
controller.isloading
|
||||||
builder: (controller) => controller
|
|
||||||
.isloading
|
|
||||||
? const MyCircularProgressIndicator()
|
? const MyCircularProgressIndicator()
|
||||||
: MyElevatedButton(
|
: MyElevatedButton(
|
||||||
onPressed: () {
|
onPressed: () {
|
||||||
if (controller
|
if (controller.formKey.currentState!
|
||||||
.formKey.currentState!
|
|
||||||
.validate()) {
|
.validate()) {
|
||||||
controller.login();
|
controller.login();
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
title: 'Submit'.tr,
|
title: 'Submit'.tr,
|
||||||
),
|
),
|
||||||
)
|
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
@@ -314,4 +311,38 @@ class LoginCaptin extends StatelessWidget {
|
|||||||
),
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
locationPermissionDialog() {
|
||||||
|
return Padding(
|
||||||
|
padding: const EdgeInsets.all(16),
|
||||||
|
child: Container(
|
||||||
|
height: Get.height * .4,
|
||||||
|
decoration: AppStyle.boxDecoration1,
|
||||||
|
child: Padding(
|
||||||
|
padding: const EdgeInsets.all(20.0),
|
||||||
|
child: Center(
|
||||||
|
child: Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.center,
|
||||||
|
mainAxisAlignment: MainAxisAlignment.spaceAround,
|
||||||
|
children: [
|
||||||
|
Text(
|
||||||
|
'We use location to get accurate and nearest passengers for you'
|
||||||
|
.tr,
|
||||||
|
textAlign: TextAlign.center,
|
||||||
|
style: AppStyle.title,
|
||||||
|
),
|
||||||
|
MyElevatedButton(
|
||||||
|
title: 'Grant Location'.tr,
|
||||||
|
onPressed: () async {
|
||||||
|
await controller.getLocationPermission();
|
||||||
|
},
|
||||||
|
kolor: AppColor.greenColor,
|
||||||
|
)
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -30,46 +30,6 @@ class LoginPage extends StatelessWidget {
|
|||||||
builder: (controller) => MyScafolld(
|
builder: (controller) => MyScafolld(
|
||||||
title: 'Login'.tr,
|
title: 'Login'.tr,
|
||||||
isleading: false,
|
isleading: false,
|
||||||
action: GestureDetector(
|
|
||||||
onLongPress: () {
|
|
||||||
Get.defaultDialog(
|
|
||||||
title: 'Admin DashBoard',
|
|
||||||
titleStyle: AppStyle.title,
|
|
||||||
content: Form(
|
|
||||||
key: controller.formKeyAdmin,
|
|
||||||
child: Column(
|
|
||||||
children: [
|
|
||||||
MyTextForm(
|
|
||||||
controller: controller.adminNameController,
|
|
||||||
label: 'Your name'.tr,
|
|
||||||
hint: 'Your name',
|
|
||||||
type: TextInputType.name),
|
|
||||||
const SizedBox(
|
|
||||||
height: 10,
|
|
||||||
),
|
|
||||||
MyTextForm(
|
|
||||||
controller: controller.adminPasswordController,
|
|
||||||
label: 'Your password'.tr,
|
|
||||||
hint: 'Your password',
|
|
||||||
type: TextInputType.emailAddress),
|
|
||||||
const SizedBox(
|
|
||||||
height: 10,
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
),
|
|
||||||
confirm: MyElevatedButton(
|
|
||||||
title: 'title'.tr,
|
|
||||||
onPressed: () {
|
|
||||||
controller.adminDashboardOpen();
|
|
||||||
},
|
|
||||||
),
|
|
||||||
);
|
|
||||||
},
|
|
||||||
child: const Icon(
|
|
||||||
Icons.dashboard,
|
|
||||||
color: AppColor.redColor,
|
|
||||||
)),
|
|
||||||
body: [
|
body: [
|
||||||
if (box.read(BoxName.agreeTerms) != 'agreed')
|
if (box.read(BoxName.agreeTerms) != 'agreed')
|
||||||
agreedPage()
|
agreedPage()
|
||||||
|
|||||||
@@ -105,7 +105,7 @@ GetBuilder<HomeCaptainController> leftMainMenuCaptainIcons() {
|
|||||||
borderRadius: BorderRadius.circular(15)),
|
borderRadius: BorderRadius.circular(15)),
|
||||||
child: IconButton(
|
child: IconButton(
|
||||||
onPressed: () {
|
onPressed: () {
|
||||||
controller.mapHomeCaptainController
|
controller.mapHomeCaptainController!
|
||||||
.animateCamera(CameraUpdate.newLatLng(LatLng(
|
.animateCamera(CameraUpdate.newLatLng(LatLng(
|
||||||
Get.find<LocationController>().myLocation.latitude,
|
Get.find<LocationController>().myLocation.latitude,
|
||||||
Get.find<LocationController>().myLocation.longitude,
|
Get.find<LocationController>().myLocation.longitude,
|
||||||
|
|||||||
@@ -309,8 +309,6 @@ class OrderSpeedRequest extends StatelessWidget {
|
|||||||
kolor: AppColor.greenColor,
|
kolor: AppColor.greenColor,
|
||||||
title: 'Accept Order'.tr,
|
title: 'Accept Order'.tr,
|
||||||
onPressed: () async {
|
onPressed: () async {
|
||||||
box.write(BoxName.statusDriverLocation, 'on');
|
|
||||||
|
|
||||||
var res = await CRUD()
|
var res = await CRUD()
|
||||||
.post(link: AppLink.updateStausFromSpeed, payload: {
|
.post(link: AppLink.updateStausFromSpeed, payload: {
|
||||||
'id': myList[16],
|
'id': myList[16],
|
||||||
@@ -337,6 +335,7 @@ class OrderSpeedRequest extends StatelessWidget {
|
|||||||
Get.back();
|
Get.back();
|
||||||
}));
|
}));
|
||||||
} else if (jsonDecode(res)['status'] == "success") {
|
} else if (jsonDecode(res)['status'] == "success") {
|
||||||
|
box.write(BoxName.statusDriverLocation, 'on');
|
||||||
List<String> bodyToPassenger = [
|
List<String> bodyToPassenger = [
|
||||||
box.read(BoxName.driverID).toString(),
|
box.read(BoxName.driverID).toString(),
|
||||||
box.read(BoxName.nameDriver).toString(),
|
box.read(BoxName.nameDriver).toString(),
|
||||||
|
|||||||
Reference in New Issue
Block a user