6/1/1
This commit is contained in:
@@ -21,7 +21,7 @@
|
|||||||
<key>CFBundlePackageType</key>
|
<key>CFBundlePackageType</key>
|
||||||
<string>APPL</string>
|
<string>APPL</string>
|
||||||
<key>CFBundleShortVersionString</key>
|
<key>CFBundleShortVersionString</key>
|
||||||
<string>30</string>
|
<string>31</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>4.0.01</string>
|
<string>4.0.02</string>
|
||||||
<key>FirebaseAppDelegateProxyEnabled</key>
|
<key>FirebaseAppDelegateProxyEnabled</key>
|
||||||
<string>NO</string>
|
<string>NO</string>
|
||||||
<key>GMSApiKey</key>
|
<key>GMSApiKey</key>
|
||||||
|
|||||||
@@ -420,7 +420,7 @@ class FirebaseMessagesController extends GetxController {
|
|||||||
// });
|
// });
|
||||||
// }
|
// }
|
||||||
// }
|
// }
|
||||||
|
//android/app/src/main/res/raw/iphone_ringtone.wav
|
||||||
void sendNotificationToPassengerToken(
|
void sendNotificationToPassengerToken(
|
||||||
String title, body, token, List<String> map) async {
|
String title, body, token, List<String> map) async {
|
||||||
try {
|
try {
|
||||||
@@ -458,6 +458,43 @@ class FirebaseMessagesController extends GetxController {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void sendNotificationToPassengerTokenCALL(
|
||||||
|
String title, body, token, List<String> map) async {
|
||||||
|
try {
|
||||||
|
final response = await http.post(
|
||||||
|
Uri.parse('https://fcm.googleapis.com/fcm/send'),
|
||||||
|
headers: <String, String>{
|
||||||
|
'Content-Type': 'application/json',
|
||||||
|
'Authorization': 'key=${AK.serverAPI}'
|
||||||
|
},
|
||||||
|
body: jsonEncode({
|
||||||
|
'notification': <String, dynamic>{
|
||||||
|
'title': title,
|
||||||
|
'body': body,
|
||||||
|
'sound': 'iphone_ringtone.wav'
|
||||||
|
},
|
||||||
|
'data': {
|
||||||
|
'passengerList': map,
|
||||||
|
},
|
||||||
|
'priority': 'high',
|
||||||
|
'to': token,
|
||||||
|
}),
|
||||||
|
);
|
||||||
|
|
||||||
|
if (response.statusCode == 200) {
|
||||||
|
// Notification sent successfully
|
||||||
|
print('Notification sent successfully');
|
||||||
|
} else {
|
||||||
|
// Handle error response
|
||||||
|
print(
|
||||||
|
'Failed to send notification. Status code: ${response.statusCode}');
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
// Handle other exceptions
|
||||||
|
print('sendNotification() error: $e');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void sendNotificationToAnyWithoutData(
|
void sendNotificationToAnyWithoutData(
|
||||||
String title, String body, String token) async {
|
String title, String body, String token) async {
|
||||||
try {
|
try {
|
||||||
|
|||||||
@@ -38,8 +38,8 @@ class CallController extends GetxController {
|
|||||||
// Set up an instance of Agora engine
|
// Set up an instance of Agora engine
|
||||||
setupVoiceSDKEngine();
|
setupVoiceSDKEngine();
|
||||||
// join();
|
// join();
|
||||||
FirebaseMessagesController().sendNotificationToPassengerToken(
|
FirebaseMessagesController().sendNotificationToPassengerTokenCALL(
|
||||||
'Call Income from Passenger',
|
'Call Income',
|
||||||
'${'You have call from driver'.tr} ${box.read(BoxName.nameDriver)}',
|
'${'You have call from driver'.tr} ${box.read(BoxName.nameDriver)}',
|
||||||
Get.find<MapDriverController>().tokenPassenger,
|
Get.find<MapDriverController>().tokenPassenger,
|
||||||
[
|
[
|
||||||
@@ -88,7 +88,7 @@ class CallController extends GetxController {
|
|||||||
onUserOffline: (RtcConnection connection, int? remoteUid,
|
onUserOffline: (RtcConnection connection, int? remoteUid,
|
||||||
UserOfflineReasonType reason) {
|
UserOfflineReasonType reason) {
|
||||||
// Get.snackbar("Remote user uid:$remoteUid left the channel", '');
|
// Get.snackbar("Remote user uid:$remoteUid left the channel", '');
|
||||||
status = 'Call left'.tr;
|
status = 'Call Left'.tr;
|
||||||
remoteUid = null;
|
remoteUid = null;
|
||||||
update();
|
update();
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -48,9 +48,9 @@ class CRUD {
|
|||||||
required String uid,
|
required String uid,
|
||||||
}) async {
|
}) async {
|
||||||
var uid = box.read(BoxName.phone) ?? box.read(BoxName.phoneDriver);
|
var uid = box.read(BoxName.phone) ?? box.read(BoxName.phoneDriver);
|
||||||
var res = await http.get(
|
var res = await http.get(Uri.parse(
|
||||||
Uri.parse(
|
// 'https://repulsive-pig-rugby-shirt.cyclic.app/token?channelName=$channelName'),
|
||||||
'https://repulsive-pig-rugby-shirt.cyclic.app/token?channelName=$channelName'),
|
'https://orca-app-b2i85.ondigitalocean.app/token?channelName=$channelName'),
|
||||||
headers: {'Authorization': 'Bearer ${AK.agoraAppCertificate}'});
|
headers: {'Authorization': 'Bearer ${AK.agoraAppCertificate}'});
|
||||||
|
|
||||||
if (res.statusCode == 200) {
|
if (res.statusCode == 200) {
|
||||||
|
|||||||
@@ -398,6 +398,15 @@ class MapDriverController extends GetxController {
|
|||||||
'passengerID': passengerId,
|
'passengerID': passengerId,
|
||||||
'driverID': box.read(BoxName.driverID).toString(),
|
'driverID': box.read(BoxName.driverID).toString(),
|
||||||
});
|
});
|
||||||
|
|
||||||
|
var res1 =
|
||||||
|
await CRUD().post(link: AppLink.addDriversWalletPoints, payload: {
|
||||||
|
'paymentID': 'rideId$rideId',
|
||||||
|
'amount': (costOfWaiting5Minute).toStringAsFixed(0),
|
||||||
|
'paymentMethod': 'wait',
|
||||||
|
'driverID': box.read(BoxName.driverID).toString(),
|
||||||
|
});
|
||||||
|
print(res1);
|
||||||
if (res != 'failure') {
|
if (res != 'failure') {
|
||||||
Get.snackbar(
|
Get.snackbar(
|
||||||
'You will get cost of your work for this trip'.tr,
|
'You will get cost of your work for this trip'.tr,
|
||||||
@@ -515,6 +524,7 @@ class MapDriverController extends GetxController {
|
|||||||
'passengerId': passengerId,
|
'passengerId': passengerId,
|
||||||
'rideId': rideId,
|
'rideId': rideId,
|
||||||
'price': price.toString(),
|
'price': price.toString(),
|
||||||
|
'walletChecked': walletChecked
|
||||||
});
|
});
|
||||||
// Get.back();
|
// Get.back();
|
||||||
// }
|
// }
|
||||||
@@ -581,15 +591,19 @@ class MapDriverController extends GetxController {
|
|||||||
? (i ~/ 60) +
|
? (i ~/ 60) +
|
||||||
(recentDistanceToDash *
|
(recentDistanceToDash *
|
||||||
Get.find<HomeCaptainController>().comfortPrice)
|
Get.find<HomeCaptainController>().comfortPrice)
|
||||||
: carType == 'Mashwari'
|
: carType == 'Delivery'
|
||||||
? (i ~/ 60) +
|
? (i ~/ 60) +
|
||||||
(recentDistanceToDash *
|
(recentDistanceToDash *
|
||||||
Get.find<HomeCaptainController>().deliveryPrice)
|
Get.find<HomeCaptainController>().deliveryPrice)
|
||||||
|
: carType == 'Rayeh Gai'
|
||||||
|
? (i ~/ 60) +
|
||||||
|
(recentDistanceToDash *
|
||||||
|
Get.find<HomeCaptainController>().speedPrice)
|
||||||
: (i ~/ 60) +
|
: (i ~/ 60) +
|
||||||
(recentDistanceToDash *
|
(recentDistanceToDash *
|
||||||
Get.find<HomeCaptainController>()
|
Get.find<HomeCaptainController>()
|
||||||
.mashwariPrice); // $1 for each minute + $4 for each km
|
.mashwariPrice); // $1 for each minute + $4 for each km
|
||||||
price = (price * .10) + price; // Add 10% tax
|
price = (price * double.parse(kazan)) + price; // Add 10% tax
|
||||||
speed = Get.find<LocationController>().speed * 3.6;
|
speed = Get.find<LocationController>().speed * 3.6;
|
||||||
progressTimerRideBegin = i / durationOfRide;
|
progressTimerRideBegin = i / durationOfRide;
|
||||||
remainingTimeTimerRideBegin = durationOfRide - i;
|
remainingTimeTimerRideBegin = durationOfRide - i;
|
||||||
|
|||||||
@@ -79,6 +79,22 @@ class OrderRequestController extends GetxController {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void getSQL() async {
|
||||||
|
DateTime today = DateTime.now();
|
||||||
|
int todayDay = today.day;
|
||||||
|
|
||||||
|
String driverId = box.read(BoxName.driverID).toString();
|
||||||
|
|
||||||
|
String customQuery = '''
|
||||||
|
SELECT *
|
||||||
|
FROM ${TableName.driverOrdersRefuse}
|
||||||
|
WHERE driver_id = '$driverId'
|
||||||
|
AND created_at LIKE '%$todayDay%'
|
||||||
|
''';
|
||||||
|
List<Map<String, dynamic>> results = await sql.getCustomQuery(customQuery);
|
||||||
|
print(results);
|
||||||
|
}
|
||||||
|
|
||||||
void startTimer(String driverID, orderID) async {
|
void startTimer(String driverID, orderID) async {
|
||||||
for (int i = 0; i <= duration; i++) {
|
for (int i = 0; i <= duration; i++) {
|
||||||
await Future.delayed(const Duration(seconds: 1));
|
await Future.delayed(const Duration(seconds: 1));
|
||||||
|
|||||||
@@ -17,6 +17,7 @@ class CaptainWalletController extends GetxController {
|
|||||||
String totalAmountVisa = '0';
|
String totalAmountVisa = '0';
|
||||||
String totalPoints = '0';
|
String totalPoints = '0';
|
||||||
final amountFromBudgetController = TextEditingController();
|
final amountFromBudgetController = TextEditingController();
|
||||||
|
final issurWallet = TextEditingController();
|
||||||
|
|
||||||
payFromBudget() async {
|
payFromBudget() async {
|
||||||
if (formKey.currentState!.validate()) {
|
if (formKey.currentState!.validate()) {
|
||||||
|
|||||||
120
lib/controller/home/payment/paymob_payout.dart
Normal file
120
lib/controller/home/payment/paymob_payout.dart
Normal file
@@ -0,0 +1,120 @@
|
|||||||
|
import 'dart:convert';
|
||||||
|
|
||||||
|
import 'package:SEFER/constant/box_name.dart';
|
||||||
|
import 'package:SEFER/constant/colors.dart';
|
||||||
|
import 'package:SEFER/main.dart';
|
||||||
|
import 'package:get/get.dart';
|
||||||
|
import 'package:http/http.dart' as http;
|
||||||
|
|
||||||
|
import '../../../constant/links.dart';
|
||||||
|
import '../../functions/crud.dart';
|
||||||
|
import 'captain_wallet_controller.dart';
|
||||||
|
|
||||||
|
class PaymobPayout extends GetxController {
|
||||||
|
bool isLoading = false;
|
||||||
|
|
||||||
|
Future<String> getToken() async {
|
||||||
|
var headers = {
|
||||||
|
'Content-Type': 'application/x-www-form-urlencoded',
|
||||||
|
// 'Cookie':
|
||||||
|
// 'csrftoken=74iZJ8XYyuTm5WRq2W4tpWX5eqoJLZVK5QhuDrChWpDtzpgGA269bbCWuEcW85t4'
|
||||||
|
};
|
||||||
|
var body = {
|
||||||
|
'grant_type': 'password',
|
||||||
|
'username': 'sefer_api_checker',
|
||||||
|
'password': '#c3pSwbUxOKpQnr5hHZAgpkSW',
|
||||||
|
'client_id': 'kmNWU5gKsL8LKVhsJFbOGTEb3YQ5sQhvBoB8pqoW',
|
||||||
|
'client_secret':
|
||||||
|
'htV6nFANLDd658ueTEuMrIqwjcXsocMXmBLAYof7FuutBcSxdTdoNqFl3EAvO6zrOgGPLdiMrofNp2V9ASVRpjoSlFjDNRzY7hfPunAJEgf2N5ZUuknN4QniaqIZvaNt'
|
||||||
|
};
|
||||||
|
var res = await http.post(
|
||||||
|
Uri.parse(
|
||||||
|
'https://stagingpayouts.paymobsolutions.com/api/secure/o/token/'),
|
||||||
|
headers: headers,
|
||||||
|
body: body,
|
||||||
|
);
|
||||||
|
String token = '';
|
||||||
|
if (res.statusCode == 200) {
|
||||||
|
var decode = jsonDecode(res.body);
|
||||||
|
token = decode['access_token'];
|
||||||
|
}
|
||||||
|
print('token = $token');
|
||||||
|
return token;
|
||||||
|
}
|
||||||
|
|
||||||
|
payToDriverWallet(
|
||||||
|
String token, String amount, String issuer, String msisdn) async {
|
||||||
|
var headers = {
|
||||||
|
'Authorization': 'Bearer $token',
|
||||||
|
'Content-Type': 'application/json',
|
||||||
|
};
|
||||||
|
var body = json.encode({
|
||||||
|
"amount": amount, //"10.00",
|
||||||
|
"issuer": issuer, //"vodafone",
|
||||||
|
"msisdn": msisdn, // "01023456789"
|
||||||
|
});
|
||||||
|
var res = await http.post(
|
||||||
|
Uri.parse(
|
||||||
|
'https://stagingpayouts.paymobsolutions.com/api/secure/disburse/'),
|
||||||
|
headers: headers,
|
||||||
|
body: body,
|
||||||
|
);
|
||||||
|
print(jsonDecode(res.body));
|
||||||
|
print('-----');
|
||||||
|
var dec = jsonDecode(res.body);
|
||||||
|
if (dec['disbursement_status'] == 'successful') {
|
||||||
|
await CRUD().post(link: AppLink.addDriverpayment, payload: {
|
||||||
|
'rideId': DateTime.now().toIso8601String(),
|
||||||
|
'amount': ((-1) * double.parse(dec['amount'])).toStringAsFixed(0),
|
||||||
|
'payment_method': 'payout',
|
||||||
|
'passengerID': 'myself',
|
||||||
|
'driverID': box.read(BoxName.driverID).toString(),
|
||||||
|
});
|
||||||
|
Get.snackbar('Transaction successful'.tr,
|
||||||
|
'${'Transaction successful'.tr} ${dec['amount']}',
|
||||||
|
backgroundColor: AppColor.greenColor);
|
||||||
|
Get.find<CaptainWalletController>().getCaptainWalletFromRide();
|
||||||
|
} else if (dec['disbursement_status'] == 'failed') {
|
||||||
|
Get.snackbar('Transaction successful'.tr, 'Transaction failed'.tr,
|
||||||
|
backgroundColor: AppColor.redColor);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
payToDriverBankAccount(String token, String amount, String bankCardNumber,
|
||||||
|
String bankCode) async {
|
||||||
|
var headers = {
|
||||||
|
'Authorization': 'Bearer $token',
|
||||||
|
'Content-Type': 'application/json',
|
||||||
|
};
|
||||||
|
var body = {
|
||||||
|
"issuer": "bank_card",
|
||||||
|
"amount": amount, //9.0,
|
||||||
|
"full_name": box.read(BoxName.nameDriver).toString(),
|
||||||
|
"bank_card_number": bankCardNumber, //"1111-2222-3333-4444",
|
||||||
|
"bank_code": bankCode, //"CIB",
|
||||||
|
"bank_transaction_type": "cash_transfer"
|
||||||
|
};
|
||||||
|
var res = await http
|
||||||
|
.post(
|
||||||
|
Uri.parse(
|
||||||
|
'https://stagingpayouts.paymobsolutions.com/api/secure/disburse/'),
|
||||||
|
headers: headers,
|
||||||
|
body: body,
|
||||||
|
)
|
||||||
|
.then((value) {
|
||||||
|
print(value);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
Future payToWalletDriverAll(
|
||||||
|
String amount, String issuer, String msisdn) async {
|
||||||
|
String token = await getToken();
|
||||||
|
await payToDriverWallet(token, amount, issuer, msisdn);
|
||||||
|
}
|
||||||
|
|
||||||
|
Future payToBankDriverAll(
|
||||||
|
String amount, String bankCardNumber, String bankCode) async {
|
||||||
|
String token = await getToken();
|
||||||
|
await payToDriverBankAccount(token, amount, bankCardNumber, bankCode);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -4,6 +4,27 @@ class MyTranslation extends Translations {
|
|||||||
@override
|
@override
|
||||||
Map<String, Map<String, String>> get keys => {
|
Map<String, Map<String, String>> get keys => {
|
||||||
"ar": {
|
"ar": {
|
||||||
|
"Transaction failed": "فشل المعاملة",
|
||||||
|
"Wallet Type": "نوع المحفظة",
|
||||||
|
"Enter your wallet number": "أدخل رقم محفظتك",
|
||||||
|
"The Amount is less than": "المبلغ أقل من",
|
||||||
|
"Cash Out": "صرف",
|
||||||
|
"Transaction successful": "تمت العملية بنجاح",
|
||||||
|
"Do you want to collect your earnings?":
|
||||||
|
"هل تريد استلام أموالك؟", // Corrected grammar
|
||||||
|
"Total wallet is ": "إجمالي المحفظة هو ",
|
||||||
|
"Remainder": "المتبقي",
|
||||||
|
"Call Page": "صفحة المكالمة",
|
||||||
|
"Call End": "إنهاء المكالمة",
|
||||||
|
"Call Left": "مكالمات متبقية",
|
||||||
|
"Rayeh Gai": "رايح جاي ",
|
||||||
|
"cost is ": " التكلفة هي ",
|
||||||
|
"Total budgets on month": "إجمالي الميزانيات لهذا الشهر",
|
||||||
|
"Counts of budgets on days": "عدد الميزانيات حسب الأيام",
|
||||||
|
"Wallet Added": "تم إضافة المحفظة",
|
||||||
|
"The price must be over than ": "يجب أن يكون السعر أكثر من ",
|
||||||
|
"Total Cost": "إجمالي التكلفة",
|
||||||
|
"This Trip Cancelled": "تم إلغاء هذه الرحلة",
|
||||||
"Total price from ": "إجمالي السعر من ",
|
"Total price from ": "إجمالي السعر من ",
|
||||||
"Wallet Add": "إضافة إلى المحفظة",
|
"Wallet Add": "إضافة إلى المحفظة",
|
||||||
"Press here": "اضغط هنا",
|
"Press here": "اضغط هنا",
|
||||||
@@ -567,7 +588,7 @@ class MyTranslation extends Translations {
|
|||||||
"Best choice for comfort car and flexible route and stops point":
|
"Best choice for comfort car and flexible route and stops point":
|
||||||
"أفضل خيار للسيارة المريحة والطريق المرن ونقطة التوقف",
|
"أفضل خيار للسيارة المريحة والطريق المرن ونقطة التوقف",
|
||||||
"Insert": "إدراج",
|
"Insert": "إدراج",
|
||||||
' Total weekly points is ': ' تفاصيل الرصيد التشغيل ',
|
' Total weekly points is ': " مجموع النقاط الأسبوعية هو ",
|
||||||
'you can buy ': 'يمكنك شراء',
|
'you can buy ': 'يمكنك شراء',
|
||||||
"Which method you will pay": 'أي طريقة الدفع تفضل',
|
"Which method you will pay": 'أي طريقة الدفع تفضل',
|
||||||
"This is for delivery or a motorcycle.":
|
"This is for delivery or a motorcycle.":
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
import 'package:SEFER/constant/colors.dart';
|
||||||
|
import 'package:SEFER/controller/firebase/firbase_messge.dart';
|
||||||
import 'package:SEFER/controller/home/captin/map_driver_controller.dart';
|
import 'package:SEFER/controller/home/captin/map_driver_controller.dart';
|
||||||
import 'package:flutter/cupertino.dart';
|
import 'package:flutter/cupertino.dart';
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart';
|
||||||
@@ -14,10 +16,11 @@ import 'package:SEFER/views/widgets/elevated_btn.dart';
|
|||||||
class RateController extends GetxController {
|
class RateController extends GetxController {
|
||||||
double selectedRateItemId = -1;
|
double selectedRateItemId = -1;
|
||||||
TextEditingController comment = TextEditingController();
|
TextEditingController comment = TextEditingController();
|
||||||
TextEditingController passenggerPayAmount = TextEditingController();
|
TextEditingController passengerPayAmount = TextEditingController();
|
||||||
String? rideId, passengerId, driverId, price;
|
String? rideId, passengerId, driverId, price;
|
||||||
late GlobalKey<FormState> formKey;
|
late GlobalKey<FormState> formKey;
|
||||||
bool ispassengerWantWalletFromDriver = false;
|
bool ispassengerWantWalletFromDriver = false;
|
||||||
|
String walletChecked = '';
|
||||||
@override
|
@override
|
||||||
void onInit() {
|
void onInit() {
|
||||||
formKey = GlobalKey<FormState>();
|
formKey = GlobalKey<FormState>();
|
||||||
@@ -25,7 +28,7 @@ class RateController extends GetxController {
|
|||||||
rideId = Get.arguments['rideId'];
|
rideId = Get.arguments['rideId'];
|
||||||
driverId = Get.arguments['driverId'];
|
driverId = Get.arguments['driverId'];
|
||||||
price = Get.arguments['price'];
|
price = Get.arguments['price'];
|
||||||
|
walletChecked = Get.arguments['walletChecked'];
|
||||||
super.onInit();
|
super.onInit();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -38,16 +41,52 @@ class RateController extends GetxController {
|
|||||||
if (formKey.currentState!.validate()) {
|
if (formKey.currentState!.validate()) {
|
||||||
var priceOfTrip =
|
var priceOfTrip =
|
||||||
double.parse(Get.find<MapDriverController>().paymentAmount);
|
double.parse(Get.find<MapDriverController>().paymentAmount);
|
||||||
double remainingFee =
|
double remainingFee = double.parse(passengerPayAmount.text) - priceOfTrip;
|
||||||
double.parse(passenggerPayAmount.text) - priceOfTrip;
|
if (remainingFee > 0) {
|
||||||
await CRUD().post(link: AppLink.addPassengersWallet, payload: {
|
await CRUD().post(link: AppLink.addPassengersWallet, payload: {
|
||||||
'passenger_id': passengerId,
|
'passenger_id': passengerId,
|
||||||
'balance': remainingFee.toString()
|
'balance': remainingFee.toString()
|
||||||
}).then((value) {
|
}).then((value) async {
|
||||||
if (value != 'failure') {
|
if (value != 'failure') {
|
||||||
Get.snackbar('Wallet Add', '');
|
Get.snackbar('Wallet Added'.tr, '',
|
||||||
|
backgroundColor: AppColor.greenColor);
|
||||||
|
|
||||||
|
await CRUD().post(link: AppLink.addDriverpayment, payload: {
|
||||||
|
'rideId': 'remain$rideId',
|
||||||
|
'amount': remainingFee.toString(),
|
||||||
|
'payment_method': 'Remainder',
|
||||||
|
'passengerID': passengerId,
|
||||||
|
'driverID': box.read(BoxName.driverID).toString(),
|
||||||
|
});
|
||||||
|
|
||||||
|
double pointsSubstraction = 0;
|
||||||
|
pointsSubstraction = remainingFee * (-1); // for eygpt /100
|
||||||
|
var res = await CRUD()
|
||||||
|
.post(link: AppLink.addDriversWalletPoints, payload: {
|
||||||
|
'paymentID': 'rideId$rideId',
|
||||||
|
'amount': (pointsSubstraction).toStringAsFixed(0),
|
||||||
|
'paymentMethod': 'Remainder',
|
||||||
|
'driverID': box.read(BoxName.driverID).toString(),
|
||||||
|
});
|
||||||
|
|
||||||
|
FirebaseMessagesController().sendNotificationToAnyWithoutData(
|
||||||
|
'Wallet Added',
|
||||||
|
'Wallet Added'.tr,
|
||||||
|
Get.find<MapDriverController>().tokenPassenger);
|
||||||
|
walletChecked == 'true';
|
||||||
|
update();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
} else {
|
||||||
|
Get.defaultDialog(
|
||||||
|
title: '${'The price must be over than '.tr}$priceOfTrip',
|
||||||
|
middleText: '',
|
||||||
|
confirm: MyElevatedButton(
|
||||||
|
title: 'Ok'.tr,
|
||||||
|
onPressed: () {
|
||||||
|
Get.back();
|
||||||
|
}));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -93,7 +93,9 @@ class RatePassenger extends StatelessWidget {
|
|||||||
],
|
],
|
||||||
)),
|
)),
|
||||||
),
|
),
|
||||||
controller.ispassengerWantWalletFromDriver
|
controller.walletChecked != 'true'
|
||||||
|
? GetBuilder<RateController>(builder: (controller) {
|
||||||
|
return controller.ispassengerWantWalletFromDriver
|
||||||
? Container(
|
? Container(
|
||||||
decoration: AppStyle.boxDecoration1,
|
decoration: AppStyle.boxDecoration1,
|
||||||
child: Padding(
|
child: Padding(
|
||||||
@@ -108,11 +110,12 @@ class RatePassenger extends StatelessWidget {
|
|||||||
key: controller.formKey,
|
key: controller.formKey,
|
||||||
child: MyTextForm(
|
child: MyTextForm(
|
||||||
controller:
|
controller:
|
||||||
controller.passenggerPayAmount,
|
controller.passengerPayAmount,
|
||||||
label: "passenger amount to me".tr,
|
label:
|
||||||
|
"passenger amount to me".tr,
|
||||||
hint: "passenger amount to me".tr,
|
hint: "passenger amount to me".tr,
|
||||||
type:
|
type: const TextInputType
|
||||||
const TextInputType.numberWithOptions(
|
.numberWithOptions(
|
||||||
decimal: true)),
|
decimal: true)),
|
||||||
),
|
),
|
||||||
MyElevatedButton(
|
MyElevatedButton(
|
||||||
@@ -142,7 +145,9 @@ class RatePassenger extends StatelessWidget {
|
|||||||
})
|
})
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
),
|
);
|
||||||
|
})
|
||||||
|
: const SizedBox(),
|
||||||
const SizedBox(
|
const SizedBox(
|
||||||
height: 20,
|
height: 20,
|
||||||
),
|
),
|
||||||
|
|||||||
@@ -237,7 +237,7 @@ class RideCalculateDriver extends StatelessWidget {
|
|||||||
),
|
),
|
||||||
bottomTitles: AxisTitles(
|
bottomTitles: AxisTitles(
|
||||||
axisNameWidget: Text(
|
axisNameWidget: Text(
|
||||||
'${"Total rides on month".tr} = ${durationController.jsonData2['message'][0]['totalCount'].toString()}'
|
'${"Total budgets on month".tr} = ${durationController.jsonData2['message'][0]['totalPrice'].toString()}'
|
||||||
.tr,
|
.tr,
|
||||||
style: AppStyle.title,
|
style: AppStyle.title,
|
||||||
),
|
),
|
||||||
@@ -246,7 +246,7 @@ class RideCalculateDriver extends StatelessWidget {
|
|||||||
reservedSize: 30, showTitles: true)),
|
reservedSize: 30, showTitles: true)),
|
||||||
leftTitles: AxisTitles(
|
leftTitles: AxisTitles(
|
||||||
axisNameWidget: Text(
|
axisNameWidget: Text(
|
||||||
'Counts of rides on days'.tr,
|
'Counts of budgets on days'.tr,
|
||||||
style: AppStyle.title,
|
style: AppStyle.title,
|
||||||
),
|
),
|
||||||
axisNameSize: 30,
|
axisNameSize: 30,
|
||||||
|
|||||||
@@ -41,7 +41,7 @@ class HomeCaptain extends StatelessWidget {
|
|||||||
style: AppStyle.title,
|
style: AppStyle.title,
|
||||||
))),
|
))),
|
||||||
IconButton(
|
IconButton(
|
||||||
// onPressed: () => box.remove(BoxName.periods),
|
// onPressed: () => Get.find<OrderRequestController>().getSQL(),
|
||||||
onPressed: () => sql.deleteAllData(TableName.driverOrdersRefuse),
|
onPressed: () => sql.deleteAllData(TableName.driverOrdersRefuse),
|
||||||
icon: const Icon(Icons.remove)),
|
icon: const Icon(Icons.remove)),
|
||||||
// GetBuilder<OrderRequestController>(
|
// GetBuilder<OrderRequestController>(
|
||||||
|
|||||||
@@ -7,23 +7,22 @@ import 'package:flutter/material.dart';
|
|||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart';
|
||||||
import 'package:SEFER/controller/home/captin/home_captain_controller.dart';
|
import 'package:SEFER/controller/home/captin/home_captain_controller.dart';
|
||||||
|
|
||||||
import '../../../../../constant/box_name.dart';
|
|
||||||
import '../../../../../controller/functions/call_controller.dart';
|
import '../../../../../controller/functions/call_controller.dart';
|
||||||
import '../../../../../main.dart';
|
|
||||||
|
|
||||||
class CallPage extends StatelessWidget {
|
class CallPage extends StatelessWidget {
|
||||||
const CallPage({super.key});
|
const CallPage({super.key});
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return MyScafolld(title: 'Call Page', isleading: true, body: [callPage()]);
|
return MyScafolld(
|
||||||
|
title: 'Call Page'.tr, isleading: true, body: [callPage()]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
GetBuilder<HomeCaptainController> callPage() {
|
GetBuilder<HomeCaptainController> callPage() {
|
||||||
CallController callController = Get.put(CallController());
|
CallController callController = Get.put(CallController());
|
||||||
Get.put(MapDriverController());
|
Get.put(MapDriverController());
|
||||||
callController.initAgoraFull();
|
// callController.join();
|
||||||
return GetBuilder<HomeCaptainController>(
|
return GetBuilder<HomeCaptainController>(
|
||||||
builder: (controller) => Positioned(
|
builder: (controller) => Positioned(
|
||||||
top: Get.height * .2,
|
top: Get.height * .2,
|
||||||
@@ -35,19 +34,6 @@ GetBuilder<HomeCaptainController> callPage() {
|
|||||||
children: [
|
children: [
|
||||||
GestureDetector(
|
GestureDetector(
|
||||||
onTap: () async {
|
onTap: () async {
|
||||||
// await callController.initAgoraFull();
|
|
||||||
// callController.join();
|
|
||||||
FirebaseMessagesController().sendNotificationToPassengerToken(
|
|
||||||
'Call Income',
|
|
||||||
'You have call from driver ${box.read(BoxName.nameDriver)}',
|
|
||||||
Get.find<MapDriverController>().tokenPassenger,
|
|
||||||
[
|
|
||||||
callController.token,
|
|
||||||
callController.channelName,
|
|
||||||
callController.uid.toString(),
|
|
||||||
callController.remoteUid.toString(),
|
|
||||||
],
|
|
||||||
);
|
|
||||||
callController.join();
|
callController.join();
|
||||||
},
|
},
|
||||||
child: Container(
|
child: Container(
|
||||||
|
|||||||
@@ -123,12 +123,12 @@ class PassengerInfoWindow extends StatelessWidget {
|
|||||||
controller.hours > 1
|
controller.hours > 1
|
||||||
? '⌚️ ${controller.hours}h ${controller.minutes}m' // Ride Duration with emoji
|
? '⌚️ ${controller.hours}h ${controller.minutes}m' // Ride Duration with emoji
|
||||||
: '⌚️ ${controller.minutes}m', // Short ride duration
|
: '⌚️ ${controller.minutes}m', // Short ride duration
|
||||||
style: AppStyle.title,
|
style: AppStyle.number,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
const SizedBox(
|
const SizedBox(
|
||||||
width: 16.0), // Add spacing between sections
|
width: 10.0), // Add spacing between sections
|
||||||
Container(
|
Container(
|
||||||
decoration: AppStyle.boxDecoration1,
|
decoration: AppStyle.boxDecoration1,
|
||||||
width: Get.width * .22,
|
width: Get.width * .22,
|
||||||
@@ -136,7 +136,7 @@ class PassengerInfoWindow extends StatelessWidget {
|
|||||||
padding: const EdgeInsets.all(4),
|
padding: const EdgeInsets.all(4),
|
||||||
child: Text(
|
child: Text(
|
||||||
' ${controller.distance} km', // Distance with emoji
|
' ${controller.distance} km', // Distance with emoji
|
||||||
style: AppStyle.title,
|
style: AppStyle.number,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
@@ -166,11 +166,11 @@ class PassengerInfoWindow extends StatelessWidget {
|
|||||||
padding: const EdgeInsets.all(4),
|
padding: const EdgeInsets.all(4),
|
||||||
child: Row(
|
child: Row(
|
||||||
children: [
|
children: [
|
||||||
Text('Total Cost is '.tr,
|
Text("cost is ".tr,
|
||||||
style: AppStyle.title),
|
style: AppStyle.title),
|
||||||
Text(
|
Text(
|
||||||
controller.totalPassenger.toString(),
|
controller.totalPassenger.toString(),
|
||||||
style: AppStyle.title,
|
style: AppStyle.number,
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
@@ -181,7 +181,7 @@ class PassengerInfoWindow extends StatelessWidget {
|
|||||||
width: Get.width * .4,
|
width: Get.width * .4,
|
||||||
child: Padding(
|
child: Padding(
|
||||||
padding: const EdgeInsets.all(4),
|
padding: const EdgeInsets.all(4),
|
||||||
child: Text(controller.carType,
|
child: Text(controller.carType.tr,
|
||||||
style: AppStyle.title),
|
style: AppStyle.title),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|||||||
@@ -99,7 +99,7 @@ class SosConnect extends StatelessWidget {
|
|||||||
} else {
|
} else {
|
||||||
launchCommunication(
|
launchCommunication(
|
||||||
'whatsapp',
|
'whatsapp',
|
||||||
'+02${box.read(BoxName.sosPhoneDriver)}', //todo add number from driver
|
'+2${box.read(BoxName.sosPhoneDriver)}', //todo add number from driver
|
||||||
"${"Hello this is Driver".tr} ${box.read(BoxName.nameDriver)}.${" My current location is:".tr} https://www.google.com/maps/place/${Get.find<LocationController>().myLocation.latitude},${Get.find<LocationController>().myLocation.longitude}${" \nand I have a trip on".tr} ${AppInformation.appName} ${"App \nwith Passenger ".tr}${mapDriverController.passengerName}");
|
"${"Hello this is Driver".tr} ${box.read(BoxName.nameDriver)}.${" My current location is:".tr} https://www.google.com/maps/place/${Get.find<LocationController>().myLocation.latitude},${Get.find<LocationController>().myLocation.longitude}${" \nand I have a trip on".tr} ${AppInformation.appName} ${"App \nwith Passenger ".tr}${mapDriverController.passengerName}");
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
import 'package:SEFER/controller/functions/tts.dart';
|
import 'package:SEFER/controller/functions/tts.dart';
|
||||||
import 'package:SEFER/controller/home/captin/map_driver_controller.dart';
|
import 'package:SEFER/controller/home/captin/map_driver_controller.dart';
|
||||||
|
import 'package:SEFER/controller/home/payment/paymob_payout.dart';
|
||||||
import 'package:SEFER/views/home/my_wallet/payment_history_driver_page.dart';
|
import 'package:SEFER/views/home/my_wallet/payment_history_driver_page.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart';
|
||||||
@@ -433,7 +434,91 @@ class CardSeferWalletDriver extends StatelessWidget {
|
|||||||
return Row(
|
return Row(
|
||||||
mainAxisAlignment: MainAxisAlignment.center,
|
mainAxisAlignment: MainAxisAlignment.center,
|
||||||
children: [
|
children: [
|
||||||
Container(
|
GetBuilder<CaptainWalletController>(builder: (captainWalletController) {
|
||||||
|
return InkWell(
|
||||||
|
onTap: () {
|
||||||
|
Get.defaultDialog(
|
||||||
|
barrierDismissible: false,
|
||||||
|
title: 'Do you want to collect your earnings?'.tr,
|
||||||
|
titleStyle: AppStyle.title,
|
||||||
|
content: Column(
|
||||||
|
children: [
|
||||||
|
Row(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.center,
|
||||||
|
children: [
|
||||||
|
Text(
|
||||||
|
'Total wallet is '.tr,
|
||||||
|
style: AppStyle.title,
|
||||||
|
),
|
||||||
|
const SizedBox(
|
||||||
|
width: 5,
|
||||||
|
),
|
||||||
|
Text(
|
||||||
|
Get.find<CaptainWalletController>().totalAmountVisa,
|
||||||
|
style: AppStyle.number,
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
const SizedBox(
|
||||||
|
height: 5,
|
||||||
|
),
|
||||||
|
Row(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.center,
|
||||||
|
children: [
|
||||||
|
Text(
|
||||||
|
'Wallet Type'.tr,
|
||||||
|
style: AppStyle.title,
|
||||||
|
),
|
||||||
|
const SizedBox(
|
||||||
|
width: 5,
|
||||||
|
),
|
||||||
|
MyDropDown(),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
Form(
|
||||||
|
key: captainWalletController.formKey,
|
||||||
|
child: MyTextForm(
|
||||||
|
controller: captainWalletController.issurWallet,
|
||||||
|
label: "Enter your wallet number".tr,
|
||||||
|
hint: "Enter your wallet number".tr,
|
||||||
|
type: TextInputType.phone,
|
||||||
|
),
|
||||||
|
)
|
||||||
|
],
|
||||||
|
),
|
||||||
|
confirm: MyElevatedButton(
|
||||||
|
title: 'Ok'.tr,
|
||||||
|
onPressed: () async {
|
||||||
|
if (captainWalletController.formKey.currentState!
|
||||||
|
.validate()) {
|
||||||
|
if (double.parse(Get.find<CaptainWalletController>()
|
||||||
|
.totalAmountVisa) >
|
||||||
|
100) {
|
||||||
|
Get.back();
|
||||||
|
await Get.put(PaymobPayout()).payToWalletDriverAll(
|
||||||
|
Get.find<CaptainWalletController>().totalAmountVisa,
|
||||||
|
captainWalletController.issurWallet.toString(),
|
||||||
|
captainWalletController.issurWallet.toString(),
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
Get.snackbar(
|
||||||
|
'${'The Amount is less than'.tr}${box.read(BoxName.countryCode) == 'Egypt' ? '100' : '20'}',
|
||||||
|
'',
|
||||||
|
backgroundColor: AppColor.yellowColor);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
kolor: AppColor.greenColor,
|
||||||
|
),
|
||||||
|
cancel: MyElevatedButton(
|
||||||
|
title: 'cancel'.tr,
|
||||||
|
onPressed: () {
|
||||||
|
Get.back();
|
||||||
|
},
|
||||||
|
kolor: AppColor.redColor,
|
||||||
|
));
|
||||||
|
},
|
||||||
|
child: Container(
|
||||||
width: Get.width * .85,
|
width: Get.width * .85,
|
||||||
height: Get.height * .25,
|
height: Get.height * .25,
|
||||||
decoration: BoxDecoration(
|
decoration: BoxDecoration(
|
||||||
@@ -464,19 +549,63 @@ class CardSeferWalletDriver extends StatelessWidget {
|
|||||||
)
|
)
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
Row(
|
Padding(
|
||||||
mainAxisAlignment: MainAxisAlignment.end,
|
padding: const EdgeInsets.all(8.0),
|
||||||
|
child: Row(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||||
children: [
|
children: [
|
||||||
Text(
|
Text(
|
||||||
box.read(BoxName.nameDriver),
|
box.read(BoxName.nameDriver),
|
||||||
style: AppStyle.title,
|
style: AppStyle.title,
|
||||||
|
),
|
||||||
|
Text(
|
||||||
|
"Cash Out".tr,
|
||||||
|
style: AppStyle.title,
|
||||||
)
|
)
|
||||||
],
|
],
|
||||||
|
),
|
||||||
)
|
)
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
);
|
||||||
|
}),
|
||||||
],
|
],
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class MyDropDown extends StatefulWidget {
|
||||||
|
@override
|
||||||
|
_MyDropDownState createState() => _MyDropDownState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _MyDropDownState extends State<MyDropDown> {
|
||||||
|
String dropdownValue = 'Itsalate';
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return DropdownButton<String>(
|
||||||
|
value: dropdownValue,
|
||||||
|
icon: const Icon(Icons.arrow_drop_down),
|
||||||
|
elevation: 16,
|
||||||
|
style: const TextStyle(color: Colors.deepPurple),
|
||||||
|
underline: Container(
|
||||||
|
height: 2,
|
||||||
|
color: Colors.deepPurpleAccent,
|
||||||
|
),
|
||||||
|
onChanged: (String? newValue) {
|
||||||
|
setState(() {
|
||||||
|
dropdownValue = newValue!;
|
||||||
|
});
|
||||||
|
},
|
||||||
|
items: <String>['Itsalate', 'We', 'Orange', 'Vodafone']
|
||||||
|
.map<DropdownMenuItem<String>>((String value) {
|
||||||
|
return DropdownMenuItem<String>(
|
||||||
|
value: value,
|
||||||
|
child: Text(value),
|
||||||
|
);
|
||||||
|
}).toList(),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import 'package:SEFER/constant/colors.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:intl/intl.dart';
|
||||||
|
|
||||||
import '../../../controller/payment/driver_payment_controller.dart';
|
import '../../../controller/payment/driver_payment_controller.dart';
|
||||||
|
|
||||||
@@ -27,12 +28,18 @@ class WeeklyPaymentPage extends StatelessWidget {
|
|||||||
child: Row(
|
child: Row(
|
||||||
mainAxisAlignment: MainAxisAlignment.center,
|
mainAxisAlignment: MainAxisAlignment.center,
|
||||||
children: [
|
children: [
|
||||||
Container(
|
Padding(
|
||||||
|
padding: const EdgeInsets.all(8.0),
|
||||||
|
child: Container(
|
||||||
decoration: AppStyle.boxDecoration1,
|
decoration: AppStyle.boxDecoration1,
|
||||||
|
child: Padding(
|
||||||
|
padding: const EdgeInsets.all(8.0),
|
||||||
child: Text(
|
child: Text(
|
||||||
controller.weeklyList[0]['totalAmount']
|
controller.weeklyList[0]['totalAmount']
|
||||||
.toString(),
|
.toString(),
|
||||||
style: AppStyle.title,
|
style: AppStyle.number,
|
||||||
|
),
|
||||||
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
Text(
|
Text(
|
||||||
@@ -57,28 +64,45 @@ class WeeklyPaymentPage extends StatelessWidget {
|
|||||||
decoration: AppStyle.boxDecoration1,
|
decoration: AppStyle.boxDecoration1,
|
||||||
child: Padding(
|
child: Padding(
|
||||||
padding: const EdgeInsets.all(4),
|
padding: const EdgeInsets.all(4),
|
||||||
child: Row(
|
child: Column(
|
||||||
mainAxisAlignment:
|
|
||||||
MainAxisAlignment.spaceBetween,
|
|
||||||
children: [
|
children: [
|
||||||
Text(
|
|
||||||
list['amount'],
|
|
||||||
style: AppStyle.title,
|
|
||||||
),
|
|
||||||
Text(
|
|
||||||
list['dateUpdated'],
|
|
||||||
style: AppStyle.title,
|
|
||||||
),
|
|
||||||
Card(
|
Card(
|
||||||
elevation: 2,
|
elevation: 2,
|
||||||
color: list['paymentMethod'] == 'visa'
|
color: list['paymentMethod'] == 'visa'
|
||||||
? AppColor.blueColor
|
? AppColor.blueColor
|
||||||
: AppColor.secondaryColor,
|
: AppColor.secondaryColor,
|
||||||
|
child: Padding(
|
||||||
|
padding: const EdgeInsets.all(8.0),
|
||||||
child: Text(
|
child: Text(
|
||||||
list['paymentMethod'],
|
list['paymentMethod'] == 'Remainder'
|
||||||
|
? 'Remainder'.tr
|
||||||
|
: list['paymentMethod'],
|
||||||
style: AppStyle.title,
|
style: AppStyle.title,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
),
|
||||||
|
Row(
|
||||||
|
mainAxisAlignment:
|
||||||
|
MainAxisAlignment.spaceBetween,
|
||||||
|
children: [
|
||||||
|
Card(
|
||||||
|
child: Padding(
|
||||||
|
padding:
|
||||||
|
const EdgeInsets.all(8.0),
|
||||||
|
child: Text(
|
||||||
|
list['amount'],
|
||||||
|
style: AppStyle.number,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Text(
|
||||||
|
DateFormat('yyyy-MM-dd hh:mm a')
|
||||||
|
.format(DateTime.parse(
|
||||||
|
list['dateUpdated'])),
|
||||||
|
style: AppStyle.number,
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|||||||
Reference in New Issue
Block a user