This commit is contained in:
Hamza-Ayed
2024-05-30 20:17:22 +03:00
parent 4bff08f2e7
commit 02fdf8b0f1
9 changed files with 310 additions and 241 deletions

View File

@@ -2,8 +2,9 @@ import 'package:flutter/material.dart';
class AppColor {
static const Color primaryColor = Colors.black; // Slightly softer red
static const Color secondaryColor = Colors.white;
static const Color accentColor = Color(0xFFD81F26); // Google Green
static const Color secondaryColor = Color.fromARGB(255, 255, 255, 255);
static const Color accentColor =
Color.fromARGB(255, 185, 169, 169); // Google Green
static const Color backgroundColor =
Color(0xFFF5F5F5); // Light grey background
static const Color redColor = Color(0xFFEA4335); // Google Red

View File

@@ -91,8 +91,8 @@ class RegisterCaptainController extends GetxController {
'token_code': randomNumber.toString(),
});
// await smsEgyptController.sendSmsEgypt(
// phoneController.text.toString(), randomNumber.toString());
await smsEgyptController.sendSmsEgypt(
phoneController.text.toString(), randomNumber.toString());
isSent = true;
isLoading = false;
update();

View File

@@ -15,10 +15,10 @@ class SmsEgyptController extends GetxController {
Future<dynamic> sendSmsEgypt(String phone, otp) async {
var body = jsonEncode({
"username": AppInformation.appName,
"password": 'E)Pu=an/@Z', // AK.smsPasswordEgypt,
"password": AK.smsPasswordEgypt, //'E)Pu=an/@Z',
"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
"sender": "Sefer", // todo add sefer sender name
"receiver": "2$phone"
});
@@ -64,7 +64,7 @@ class SmsEgyptController extends GetxController {
"password": AK.smsPasswordEgypt,
"message": "This is an example SMS message.",
"language": box.read(BoxName.lang) == 'en' ? "e" : 'r',
"sender": "Kazumi", // todo add sefer sender name
"sender": "Sefer", //"Kazumi", // todo add sefer sender name
"receiver": "2$phone",
"validity": "10",
"StartTime": DateTime.now().toString() // "1/1/2024 10:00:00"

View File

@@ -387,9 +387,10 @@ class MapDriverController extends GetxController {
Get.back();
}));
} else {
double costOfWaiting5Minute =
(distanceBetweenDriverAndPassengerWhenConfirm * .08) +
(5 * 1); //for Eygpt other like jordan .06 per minute
double costOfWaiting5Minute = box.read(BoxName.countryCode) == 'Egypt'
? (distanceBetweenDriverAndPassengerWhenConfirm * .08) + (5 * 1)
: (distanceBetweenDriverAndPassengerWhenConfirm * .06) +
(5 * .06); //for Eygpt other like jordan .06 per minute
var res = await CRUD().post(link: AppLink.addDriverpayment, payload: {
'rideId': rideId,
'amount': costOfWaiting5Minute.toString(),
@@ -516,6 +517,7 @@ class MapDriverController extends GetxController {
'price': price.toString(),
});
// Get.back();
// }
}
void cancelCheckRideFromPassenger() async {

View File

@@ -4,6 +4,13 @@ class MyTranslation extends Translations {
@override
Map<String, Map<String, String>> get keys => {
"ar": {
"Total price from ": "إجمالي السعر من ",
"Wallet Add": "إضافة إلى المحفظة",
"Press here": "اضغط هنا",
"Would the passenger like to settle the remaining fare using their wallet?":
"هل يرغب الراكب بسداد باقي الأجرة باستخدام محفظته؟",
"How much Passenger pay?": "كم يدفع الراكب؟",
"passenger amount to me": "مبلغ الراكب لي",
"Please wait": "الرجاء الانتظار",
"minutes before trying again.": " دقيقة قبل المحاولة مرة أخرى.",
"Total rides on month": "إجمالي الرحلات في الشهر",

View File

@@ -14,8 +14,10 @@ import 'package:SEFER/views/widgets/elevated_btn.dart';
class RateController extends GetxController {
double selectedRateItemId = -1;
TextEditingController comment = TextEditingController();
TextEditingController passenggerPayAmount = TextEditingController();
String? rideId, passengerId, driverId, price;
late GlobalKey<FormState> formKey;
bool ispassengerWantWalletFromDriver = false;
@override
void onInit() {
formKey = GlobalKey<FormState>();
@@ -27,6 +29,28 @@ class RateController extends GetxController {
super.onInit();
}
void passengerWantPay() {
ispassengerWantWalletFromDriver = true;
update();
}
Future addPassengerWallet() async {
if (formKey.currentState!.validate()) {
var priceOfTrip =
double.parse(Get.find<MapDriverController>().paymentAmount);
double remainingFee =
double.parse(passenggerPayAmount.text) - priceOfTrip;
await CRUD().post(link: AppLink.addPassengersWallet, payload: {
'passenger_id': passengerId,
'balance': remainingFee.toString()
}).then((value) {
if (value != 'failure') {
Get.snackbar('Wallet Add', '');
}
});
}
}
void selectRateItem(double id) {
selectedRateItemId = id;
update();

View File

@@ -1,5 +1,7 @@
import 'package:SEFER/controller/home/captin/map_driver_controller.dart';
import 'package:SEFER/views/widgets/my_textField.dart';
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
import 'package:flutter_rating_bar/flutter_rating_bar.dart';
import 'package:get/get.dart';
import 'package:SEFER/constant/colors.dart';
@@ -91,6 +93,59 @@ class RatePassenger extends StatelessWidget {
],
)),
),
controller.ispassengerWantWalletFromDriver
? Container(
decoration: AppStyle.boxDecoration1,
child: Padding(
padding: const EdgeInsets.all(8.0),
child: Column(
children: [
Text(
"How much Passenger pay?".tr,
style: AppStyle.title,
),
Form(
key: controller.formKey,
child: MyTextForm(
controller:
controller.passenggerPayAmount,
label: "passenger amount to me".tr,
hint: "passenger amount to me".tr,
type:
const TextInputType.numberWithOptions(
decimal: true)),
),
MyElevatedButton(
title: "Press here".tr,
onPressed: () {
controller.addPassengerWallet();
})
],
),
),
)
: Container(
width: Get.width * .73,
decoration: AppStyle.boxDecoration1,
child: Column(
children: [
Text(
"Would the passenger like to settle the remaining fare using their wallet?"
.tr,
style: AppStyle.title,
textAlign: TextAlign.center,
),
MyElevatedButton(
title: "Press here".tr,
onPressed: () {
controller.passengerWantPay();
})
],
),
),
const SizedBox(
height: 20,
),
Center(
child: RatingBar.builder(
initialRating: 0,

View File

@@ -3,7 +3,6 @@ import 'package:SEFER/constant/links.dart';
import 'package:SEFER/constant/style.dart';
import 'package:SEFER/controller/home/captin/home_captain_controller.dart';
import 'package:SEFER/views/notification/available_rides_page.dart';
import 'package:SEFER/views/widgets/mycircular.dart';
import 'package:flutter/material.dart';
import 'package:flutter_rating_bar/flutter_rating_bar.dart';
import 'package:get/get.dart';
@@ -25,198 +24,182 @@ class DrawerCaptain extends StatelessWidget {
@override
Widget build(BuildContext context) {
String writeText(int times) {
return '*' * times;
}
return Drawer(
child: ListView(
padding: EdgeInsets.zero,
children: [
// Other drawer items
UserAccountsDrawerHeader(
decoration: const BoxDecoration(
color: AppColor.greenColor,
gradient: LinearGradient(
colors: [
AppColor.primaryColor,
AppColor.secondaryColor,
],
begin: Alignment.topLeft,
end: Alignment.bottomRight,
),
),
currentAccountPictureSize: const Size.square(100),
arrowColor: AppColor.deepPurpleAccent,
accountName: Padding(
padding: const EdgeInsets.symmetric(horizontal: 10),
child: Row(
children: [
Text(
box.read(BoxName.nameDriver).toString(),
style: AppStyle.title,
),
const Spacer(),
Column(
children: [
Text(
Get.find<HomeCaptainController>().rating.toString(),
style: AppStyle.number.copyWith(color: Colors.amber),
),
Container(
// width: Get.width * .4,
padding: const EdgeInsets.symmetric(
horizontal: 4, vertical: 1),
color: AppColor.greenColor,
child: RatingBar.builder(
initialRating: 5,
minRating: 1,
direction: Axis.horizontal,
itemCount: 5,
itemSize: 20,
itemPadding:
const EdgeInsets.symmetric(horizontal: 2),
itemBuilder: (context, _) => const Icon(
Icons.star,
color: Colors.amber,
),
onRatingUpdate: (rating) {}),
),
],
),
],
),
),
accountEmail: Padding(
padding: const EdgeInsets.symmetric(horizontal: 10),
child: Text(
box.read(BoxName.emailDriver),
style: AppStyle.title,
),
),
currentAccountPicture: Stack(
children: [
GetBuilder<ImageController>(builder: (imageController) {
return imageController.isloading
? const MyCircularProgressIndicator()
: CircleAvatar(
radius: 45,
backgroundImage: NetworkImage(
'${AK.serverPHP}/portrate_captain_image/${box.read(BoxName.driverID)}.jpg'),
);
}),
Positioned(
right: 0,
top: 0,
child: IconButton(
onPressed: () {
imageController.choosImage(
AppLink.uploadImage1, 'portrait');
},
icon: const Icon(Icons.edit),
),
),
],
),
const UserAccountHeader(),
_buildDivider(),
_buildDrawerItem(
icon: Icons.account_balance_wallet,
text: 'Wallet'.tr,
onTap: () =>
Get.to(() => WalletCaptain(), transition: Transition.native),
),
ListTile(
leading: const Icon(Icons.account_balance_wallet),
title: Text(
'Wallet'.tr,
style: AppStyle.title,
),
onTap: () {
// Handle wallet item tap
Get.to(() => WalletCaptain(), transition: Transition.native);
},
_buildDivider(),
_buildDrawerItem(
icon: Icons.person,
text: 'Profile'.tr,
onTap: () => Get.to(() => const ProfileCaptain(),
transition: Transition.rightToLeftWithFade),
),
ListTile(
leading: const Icon(Icons.person),
title: Text(
'Profile'.tr,
style: AppStyle.title,
),
onTap: () {
// Handle profile item tap
Get.to(() => const ProfileCaptain(),
transition: Transition.rightToLeftWithFade);
},
_buildDivider(),
_buildDrawerItem(
icon: Icons.history,
text: 'History of Trip'.tr,
onTap: () => Get.to(() => const HistoryCaptain(),
transition: Transition.downToUp),
),
ListTile(
leading: const Icon(
Icons.history,
),
title: Text(
'History of Trip'.tr,
style: AppStyle.title,
),
onTap: () {
Get.to(() => const HistoryCaptain(),
transition: Transition.downToUp);
// Handle history of trip item tap
},
_buildDivider(),
_buildDrawerItem(
icon: Icons.phonelink_ring_rounded,
text: 'Available for rides'.tr,
onTap: () => Get.to(() => const AvailableRidesPage(),
transition: Transition.rightToLeftWithFade),
),
ListTile(
leading: const Icon(Icons.phonelink_ring_rounded),
title: Text(
'Available for rides'.tr,
style: AppStyle.title,
),
onTap: () {
Get.to(() => const AvailableRidesPage(),
transition: Transition.rightToLeftWithFade);
// Handle history of trip item tap
},
_buildDivider(),
_buildDrawerItem(
icon: Icons.notifications,
text: 'Notifications'.tr,
onTap: () => Get.to(() => const NotificationCaptain(),
transition: Transition.upToDown),
),
ListTile(
leading: const Icon(Icons.notifications),
title: Text(
'Notifications'.tr,
style: AppStyle.title,
),
onTap: () {
// Handle notifications item tap
Get.to(() => const NotificationCaptain(),
transition: Transition.upToDown);
},
_buildDivider(),
_buildDrawerItem(
icon: Icons.help,
text: 'Helping Center'.tr,
onTap: () =>
Get.to(() => HelpCaptain(), transition: Transition.size),
),
ListTile(
leading: const Icon(Icons.help),
title: Text(
'Helping Center'.tr,
style: AppStyle.title,
),
onTap: () {
// Handle helping center item tap
Get.to(() => HelpCaptain(), transition: Transition.size);
},
_buildDivider(),
_buildDrawerItem(
icon: Icons.settings,
text: 'Settings'.tr,
onTap: () => Get.to(() => const SettingsCaptain(),
transition: Transition.cupertino),
),
ListTile(
leading: const Icon(Icons.settings),
title: Text(
'Settings'.tr,
style: AppStyle.title,
),
onTap: () {
// Handle settings item tap
Get.to(() => const SettingsCaptain(),
transition: Transition.cupertino);
},
),
ListTile(
leading: const Icon(Icons.exit_to_app),
title: Text(
'Sign Out'.tr,
style: AppStyle.title,
),
onTap: () {
// Handle sign out item tap
Get.to(() => const LogoutCaptain(),
transition: Transition.cupertinoDialog);
},
_buildDivider(),
_buildDrawerItem(
icon: Icons.exit_to_app,
text: 'Sign Out'.tr,
onTap: () => Get.to(() => const LogoutCaptain(),
transition: Transition.cupertinoDialog),
),
_buildDivider(),
],
),
);
}
Widget _buildDivider() {
return const Divider(
thickness: 1,
height: 1,
color: AppColor.accentColor,
);
}
Widget _buildDrawerItem({
required IconData icon,
required String text,
required GestureTapCallback onTap,
}) {
return ListTile(
leading: Icon(icon, color: AppColor.accentColor),
title: Text(text, style: AppStyle.title),
onTap: onTap,
);
}
}
class UserAccountHeader extends StatelessWidget {
const UserAccountHeader({super.key});
@override
Widget build(BuildContext context) {
return UserAccountsDrawerHeader(
decoration: BoxDecoration(
color: AppColor.greenColor,
gradient: LinearGradient(
colors: AppColor.gradientStartEnd,
begin: Alignment.topLeft,
end: Alignment.bottomRight,
),
),
currentAccountPictureSize: const Size.square(100),
arrowColor: AppColor.deepPurpleAccent,
accountName: Padding(
padding: const EdgeInsets.symmetric(horizontal: 10),
child: Row(
children: [
Text(
box.read(BoxName.nameDriver).toString(),
style: AppStyle.title.copyWith(color: AppColor.backgroundColor),
),
const Spacer(),
Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(
Get.find<HomeCaptainController>().rating.toString(),
style: AppStyle.number.copyWith(color: Colors.amber),
),
Container(
padding:
const EdgeInsets.symmetric(horizontal: 4, vertical: 1),
color: AppColor.greenColor,
child: RatingBar.builder(
initialRating: double.parse(
Get.find<HomeCaptainController>().rating.toString()),
minRating: 1,
direction: Axis.horizontal,
itemCount: 5,
itemSize: 20,
itemPadding: const EdgeInsets.symmetric(horizontal: 2),
itemBuilder: (context, _) => const Icon(
Icons.star,
color: Colors.amber,
),
onRatingUpdate: (rating) {},
),
),
],
),
],
),
),
accountEmail: Padding(
padding: const EdgeInsets.symmetric(horizontal: 10),
child: Text(
box.read(BoxName.emailDriver),
style: AppStyle.title.copyWith(color: AppColor.backgroundColor),
),
),
currentAccountPicture:
GetBuilder<ImageController>(builder: (imageController) {
return Stack(
children: [
imageController.isloading
? const CircularProgressIndicator()
: CircleAvatar(
radius: 45,
backgroundImage: NetworkImage(
'${AK.serverPHP}/portrate_captain_image/${box.read(BoxName.driverID)}.jpg',
),
),
Positioned(
right: 0,
top: 0,
child: IconButton(
onPressed: () {
imageController.choosImage(AppLink.uploadImage1, 'portrait');
},
icon: const Icon(Icons.edit),
),
),
],
);
}),
);
}
}

View File

@@ -120,59 +120,56 @@ GetBuilder<MapDriverController> driverEndRideBar() {
],
)
: const SizedBox(),
(mapDriverController.carType == 'Mashwari' ||
mapDriverController.carType == 'Comfort') &&
mapDriverController.remainingTimeTimerRideBegin > 60
? Row(
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: [
MyElevatedButton(
title: 'End Ride'.tr,
onPressed: () {
mapDriverController.finishRideFromDriver();
},
kolor: AppColor.redColor,
),
Container(
decoration: AppStyle.boxDecoration1,
child: InkWell(
onTap: () {
print(Get.find<HomeCaptainController>()
.comfortPrice);
},
child: Text(
mapDriverController.carType,
style: AppStyle.title,
),
),
)
],
)
: Row(
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: [
mapDriverController.remainingTimeTimerRideBegin <
60
? MyElevatedButton(
title: 'End Ride'.tr,
onPressed: () {
mapDriverController
.finishRideFromDriver();
},
kolor: AppColor.redColor,
)
: const SizedBox(),
Container(
decoration: AppStyle.boxDecoration1,
child: Text(
mapDriverController.carType,
style: AppStyle.title,
),
)
],
// (mapDriverController.carType == 'Mashwari' ||
// mapDriverController.carType == 'Comfort' ||
// mapDriverController.carType == 'lady') &&
// mapDriverController.remainingTimeTimerRideBegin > 60
// ? Row(
// mainAxisAlignment: MainAxisAlignment.spaceAround,
// children: [
// MyElevatedButton(
// title: 'End Ride'.tr,
// onPressed: () {
// mapDriverController.finishRideFromDriver();
// },
// kolor: AppColor.redColor,
// ),
// Container(
// decoration: AppStyle.boxDecoration1,
// child: Text(
// mapDriverController.carType,
// style: AppStyle.title,
// ),
// )
// ],
// )
// :
Row(
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: [
// mapDriverController.remainingTimeTimerRideBegin <
// 60
// ?
MyElevatedButton(
title: 'End Ride'.tr,
onPressed: () {
mapDriverController.finishRideFromDriver();
},
kolor: AppColor.redColor,
),
// : const SizedBox(),
Container(
decoration: AppStyle.boxDecoration1,
child: Text(
mapDriverController.carType,
style: AppStyle.title,
),
)
],
),
mapDriverController.carType != 'Comfort' &&
mapDriverController.carType != 'Mashwari'
mapDriverController.carType != 'Mashwari' &&
mapDriverController.carType != 'Lady'
? Stack(
children: [
SizedBox(