From c1e4c74356b8bcb652b41f7ab102d471ac85b254 Mon Sep 17 00:00:00 2001 From: Hamza-Ayed Date: Thu, 12 Oct 2023 14:16:55 +0300 Subject: [PATCH] 10/12/1 --- android/app/build.gradle | 6 +- ios/Runner/Info.plist | 8 +- lib/constant/links.dart | 5 + lib/constant/style.dart | 8 +- .../home/captin/map_driver_controller.dart | 27 +++- .../home/map_passenger_controller.dart | 42 +++--- lib/controller/rate/rate_conroller.dart | 75 ++++++++++ lib/views/Rate/rate_captain.dart | 130 +++++++++++++++++ lib/views/Rate/rate_passenger.dart | 134 ++++++++++++++++++ .../passenger_info_window.dart | 2 +- lib/views/orderCaptin/driver_map_page.dart | 7 +- lib/views/orderCaptin/order_request_page.dart | 2 + pubspec.lock | 8 ++ pubspec.yaml | 1 + 14 files changed, 416 insertions(+), 39 deletions(-) create mode 100644 lib/controller/rate/rate_conroller.dart diff --git a/android/app/build.gradle b/android/app/build.gradle index df1e8db..ba06585 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -14,7 +14,7 @@ if (flutterRoot == null) { def flutterVersionCode = localProperties.getProperty('flutter.versionCode') if (flutterVersionCode == null) { - flutterVersionCode = '3' + flutterVersionCode = '6' } def flutterVersionName = localProperties.getProperty('flutter.versionName') @@ -55,8 +55,8 @@ android { // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration. minSdkVersion 23 targetSdkVersion flutter.targetSdkVersion - versionCode 6 - versionName '1.0.6' + versionCode 7 + versionName '1.0.7' } signingConfigs { diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist index 0590caf..5dcec36 100644 --- a/ios/Runner/Info.plist +++ b/ios/Runner/Info.plist @@ -8,10 +8,8 @@ NSCameraUsageDescription Sefer app requires access to your camera in order to scan QR codes and capture images for uploading. NSLocationAlwaysAndWhenInUseUsageDescription - Sefer app needs access to your location to provide you with accurate directions and location-based services. - FirebaseAppDelegateProxyEnabled - NSLocationWhenInUseUsageDescription This app needs access to your location to provide you with the best ride experience. Your location data will be used to find the nearest available cars and connect you with the closest captain for efficient and convenient rides. + FirebaseAppDelegateProxyEnabled NO CFBundleGetInfoString @@ -62,5 +60,7 @@ UIApplicationSupportsIndirectInputEvents + NSLocationWhenInUseUsageDescription + This app needs access to your location to provide you with the best ride experience. Your location data will be used to find the nearest available cars and connect you with the closest captain for efficient and convenient rides. - + \ No newline at end of file diff --git a/lib/constant/links.dart b/lib/constant/links.dart index 4eb587b..a0908d4 100644 --- a/lib/constant/links.dart +++ b/lib/constant/links.dart @@ -45,6 +45,11 @@ class AppLink { static const String updateDriverOrder = "$ride/driver_order/update.php"; static const String deleteDriverOrder = "$ride/driver_order/delete.php"; + // ===================================== + static const String addRateToPassenger = "$ride/rate/add.php"; + static const String addRateToDriver = "$ride/rate/addRateToDriver.php"; + +// =========================================== static const String pathImage = "$server/upload/types/"; static const String uploadImage = "$server/uploadImage.php"; static const String uploadImageType = "$server/uploadImageType.php"; diff --git a/lib/constant/style.dart b/lib/constant/style.dart index 5b9a136..70aa4ce 100644 --- a/lib/constant/style.dart +++ b/lib/constant/style.dart @@ -36,14 +36,14 @@ class AppStyle { BoxShadow( color: AppColor.accentColor, offset: Offset(-3, -3), - blurRadius: 0, - spreadRadius: 0, + blurRadius: 1, + spreadRadius: 1, blurStyle: BlurStyle.outer), BoxShadow( color: AppColor.accentColor, offset: Offset(3, 3), - blurRadius: 0, - spreadRadius: 0, + blurRadius: 1, + spreadRadius: 1, blurStyle: BlurStyle.outer) ]); } diff --git a/lib/controller/home/captin/map_driver_controller.dart b/lib/controller/home/captin/map_driver_controller.dart index cee0827..9b1d58d 100644 --- a/lib/controller/home/captin/map_driver_controller.dart +++ b/lib/controller/home/captin/map_driver_controller.dart @@ -9,9 +9,11 @@ import 'package:ride/constant/colors.dart'; import 'package:ride/controller/firebase/firbase_messge.dart'; import 'package:ride/controller/functions/location_controller.dart'; import 'package:ride/main.dart'; +import 'package:ride/views/Rate/rate_passenger.dart'; import '../../../constant/credential.dart'; import '../../../constant/links.dart'; +import '../../../views/home/Captin/home_captin.dart'; import '../../functions/crud.dart'; class MapDriverController extends GetxController { @@ -28,6 +30,8 @@ class MapDriverController extends GetxController { late String name; late String phone; late String rideId; + late String passengerId; + late String driverId; late String tokenPassenger; late String durationToPassenger; late String walletChecked; @@ -35,6 +39,7 @@ class MapDriverController extends GetxController { bool isPassengerInfoWindow = false; bool isBtnRideBegin = false; bool isRideFinished = false; + bool isRideStarted = false; double passengerInfoWindow = Get.height * .32; double progress = 0; double progressToPassenger = 0; @@ -156,10 +161,11 @@ class MapDriverController extends GetxController { tokenPassenger); } - void beginRideFromDriver() async { + void startRideFromDriver() async { changeRideToBeginToPassenger(); isPassengerInfoWindow = false; - isRideFinished = true; + isRideStarted = true; + isRideFinished = false; update(); await CRUD().post(link: AppLink.updateRides, payload: { 'id': rideId, @@ -171,14 +177,23 @@ class MapDriverController extends GetxController { } void finishRideFromDriver() async { + isRideFinished = true; + isRideStarted = false; // changeRideToBeginToPassenger(); await CRUD().post(link: AppLink.updateRides, payload: { 'id': rideId, - 'rideTimeStart': DateTime.now().toString(), + 'rideTimeFinish': DateTime.now().toString(), 'status': 'Finished' }); - FirebaseMessagesController().sendNotificationToAnyWithoutData( - 'isRideFinished', box.read(BoxName.name).toString(), tokenPassenger); + Get.back(); + Future.delayed(const Duration(milliseconds: 300)); + Get.to(() => RatePassenger(), arguments: { + 'rideId': rideId, + 'passengerId': passengerId, + 'driverId': driverId + }); + // FirebaseMessagesController().sendNotificationToAnyWithoutData( + // 'isRideFinished', box.read(BoxName.name).toString(), tokenPassenger); } void updateMarker() { @@ -277,6 +292,8 @@ class MapDriverController extends GetxController { // Get the passenger location from the arguments. passengerLocation = Get.arguments['passengerLocation']; duration = Get.arguments['Duration']; + passengerId = Get.arguments['passengerId']; + driverId = Get.arguments['driverId']; distance = Get.arguments['Distance']; name = Get.arguments['name']; phone = Get.arguments['phone']; diff --git a/lib/controller/home/map_passenger_controller.dart b/lib/controller/home/map_passenger_controller.dart index 646e20e..b0a94e9 100644 --- a/lib/controller/home/map_passenger_controller.dart +++ b/lib/controller/home/map_passenger_controller.dart @@ -9,11 +9,11 @@ import 'package:location/location.dart'; import 'package:ride/constant/box_name.dart'; import 'package:ride/constant/credential.dart'; import 'package:ride/constant/links.dart'; -import 'package:ride/constant/style.dart'; import 'package:ride/controller/firebase/firbase_messge.dart'; import 'package:ride/controller/functions/crud.dart'; import 'package:ride/controller/functions/secure_storage.dart'; import 'package:ride/controller/payment/payment_controller.dart'; +import 'package:ride/views/Rate/rate_captain.dart'; import 'package:ride/views/widgets/elevated_btn.dart'; import '../../main.dart'; import '../../models/model/locations.dart'; @@ -175,22 +175,23 @@ class MapPassengerController extends GetxController { update(); print('rideTimerBegin: $rideTimerBegin'); print('isRideFinished: $isRideFinished'); - - Get.defaultDialog( - title: 'Ride Is Finished.'.tr, - titleStyle: AppStyle.title, - content: Text( - 'Rate the Captain Please?'.tr, - style: AppStyle.title, - ), - confirm: MyElevatedButton( - title: 'Ok'.tr, - onPressed: () { - Get.back(); //todo make Rate page - }, - ), - barrierDismissible: false, - ); + Get.to(() => RateCaptain()); + // Get.defaultDialog( + // title: 'Ride Is Finished.'.tr, + // titleStyle: AppStyle.title, + // content: Text( + // 'Rate the Captain Please?'.tr, + // style: AppStyle.title, + // ), + // confirm: MyElevatedButton( + // title: 'Ok'.tr, + // onPressed: () { + // + // Get.back(); //todo make Rate page + // }, + // ), + // barrierDismissible: false, + // ); } void getBeginRideFromDriver() async { @@ -260,8 +261,9 @@ class MapPassengerController extends GetxController { "endtime": durationToAdd.toString(), "price": totalPassenger.toString(), "passenger_id": box.read(BoxName.pasengerID).toString(), - "driver_id": - dataCarsLocationByPassenger['message'][carsOrder]['id'].toString(), + "driver_id": dataCarsLocationByPassenger['message'][carsOrder] + ['driver_id'] + .toString(), "status": "waiting", "price_for_driver": totalDriver.toString(), "price_for_passenger": totalME.toString(), @@ -289,6 +291,8 @@ class MapPassengerController extends GetxController { duration1.toString(), rideId, rideTimerBegin.toString(), + dataCarsLocationByPassenger['message'][carsOrder]['driver_id'] + .toString() ]; FirebaseMessagesController().sendNotificationToDriverMAP( 'Order', diff --git a/lib/controller/rate/rate_conroller.dart b/lib/controller/rate/rate_conroller.dart new file mode 100644 index 0000000..448e987 --- /dev/null +++ b/lib/controller/rate/rate_conroller.dart @@ -0,0 +1,75 @@ +import 'package:flutter/cupertino.dart'; +import 'package:get/get.dart'; +import 'package:ride/constant/box_name.dart'; +import 'package:ride/constant/colors.dart'; +import 'package:ride/constant/links.dart'; +import 'package:ride/constant/style.dart'; +import 'package:ride/controller/functions/crud.dart'; +import 'package:ride/controller/home/map_passenger_controller.dart'; +import 'package:ride/main.dart'; +import 'package:ride/views/home/Captin/home_captin.dart'; +import 'package:ride/views/home/map_page.dart'; +import 'package:ride/views/widgets/elevated_btn.dart'; + +class RatePassengerController extends GetxController { + double selectedRateItemId = -1; + TextEditingController comment = TextEditingController(); + late String rideId, passengerId, driverId; + @override + void onInit() { + if (box.read(BoxName.driverID).toString() != '' || + box.read(BoxName.driverID).toString() != null) { + passengerId = Get.arguments['passengerId']; + rideId = Get.arguments['rideId']; + } else { + driverId = Get.arguments['driverId']; + rideId = Get.find().rideId; + } + super.onInit(); + } + + void selectRateItem(double id) { + selectedRateItemId = id; + update(); + } + + void addRateToPassenger() async { + if (selectedRateItemId < 1) { + Get.defaultDialog( + title: 'You Should choose rate figure'.tr, + titleStyle: AppStyle.title, + middleText: '', + confirm: MyElevatedButton(title: 'Ok', onPressed: () => Get.back())); + } else { + await CRUD().post(link: AppLink.addRateToPassenger, payload: { + 'passenger_id': passengerId, + 'driverID': box.read(BoxName.driverID).toString(), + 'rideId': rideId, + 'rating': selectedRateItemId.toString(), + 'comment': comment.text, + }).then((value) { + Get.offAll(const HomeCaptain()); + }); + } + } + + void addRateToDriver() async { + if (selectedRateItemId < 1) { + Get.defaultDialog( + title: 'You Should choose rate figure'.tr, + titleStyle: AppStyle.title, + middleText: '', + confirm: MyElevatedButton(title: 'Ok', onPressed: () => Get.back())); + } else { + await CRUD().post(link: AppLink.addRateToDriver, payload: { + 'passenger_id': box.read(BoxName.pasengerID).toString(), + 'driverID': driverId, + 'rideId': rideId, + 'rating': selectedRateItemId.toString(), + 'comment': comment.text, + }).then((value) { + Get.offAll(const MapPage()); + }); + } + } +} diff --git a/lib/views/Rate/rate_captain.dart b/lib/views/Rate/rate_captain.dart index e69de29..410d598 100644 --- a/lib/views/Rate/rate_captain.dart +++ b/lib/views/Rate/rate_captain.dart @@ -0,0 +1,130 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_rating_bar/flutter_rating_bar.dart'; +import 'package:get/get.dart'; + +import '../../constant/colors.dart'; +import '../../constant/style.dart'; +import '../../controller/rate/rate_conroller.dart'; +import '../widgets/elevated_btn.dart'; +import '../widgets/my_scafold.dart'; + +class RateCaptain extends StatelessWidget { + RateCaptain({super.key}); + final RatePassengerController controller = Get.put(RatePassengerController()); + @override + Widget build(BuildContext context) { + return MyScafolld( + title: 'Rate Captain'.tr, + body: [ + Positioned( + top: 40, + left: Get.width * .1, + right: Get.width * .1, + child: Container( + decoration: AppStyle.boxDecoration, + child: Column( + children: [ + Center( + child: RatingBar.builder( + initialRating: 0, + itemCount: 5, + itemSize: 50, + itemPadding: const EdgeInsets.symmetric(horizontal: 2), + itemBuilder: (context, index) { + switch (index) { + case 0: + return const Icon( + Icons.sentiment_very_dissatisfied, + color: Colors.red, + ); + case 1: + return const Icon( + Icons.sentiment_dissatisfied, + color: Colors.redAccent, + ); + case 2: + return const Icon( + Icons.sentiment_neutral, + color: Colors.amber, + ); + case 3: + return const Icon( + Icons.sentiment_satisfied, + color: Colors.lightGreen, + ); + case 4: + return const Icon( + Icons.sentiment_very_satisfied, + color: Colors.green, + ); + default: + return const Icon( + Icons.sentiment_neutral, + color: Colors.amber, + ); + } // + }, + onRatingUpdate: (rating) { + controller.selectRateItem(rating); + }, + ), + ), + const SizedBox( + height: 20, + ), + Form( + child: SizedBox( + width: Get.width * .75, + child: TextFormField( + maxLines: 4, + minLines: 1, + keyboardType: TextInputType.multiline, + controller: controller.comment, + decoration: InputDecoration( + labelText: 'Enter your Note'.tr, + hintText: 'Type something...', + prefixIcon: const Icon( + Icons.rate_review), // Add an icon as a prefix + suffixIcon: IconButton( + icon: const Icon( + Icons.clear, + color: AppColor.redColor, + ), // Add an icon as a suffix + onPressed: () { + controller.comment.clear(); + }, + ), + border: + const OutlineInputBorder(), // Add a border around the input field + enabledBorder: const OutlineInputBorder( + borderSide: BorderSide( + color: Colors + .blue), // Customize the border color + ), + focusedBorder: const OutlineInputBorder( + borderSide: BorderSide( + color: Colors + .green), // Customize the border color when focused + ), + errorBorder: const OutlineInputBorder( + borderSide: BorderSide( + color: Colors + .red), // Customize the border color when there's an error + ), + ), + ), + ), + ), + const SizedBox( + height: 20, + ), + MyElevatedButton( + title: 'Submit rating'.tr, + onPressed: () => controller.addRateToPassenger()) + ], + ), + )), + ], + isleading: false); + } +} diff --git a/lib/views/Rate/rate_passenger.dart b/lib/views/Rate/rate_passenger.dart index e69de29..a43c818 100644 --- a/lib/views/Rate/rate_passenger.dart +++ b/lib/views/Rate/rate_passenger.dart @@ -0,0 +1,134 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_rating_bar/flutter_rating_bar.dart'; +import 'package:geolocator/geolocator.dart'; +import 'package:get/get.dart'; +import 'package:ride/constant/colors.dart'; +import 'package:ride/views/widgets/elevated_btn.dart'; +import 'package:ride/views/widgets/my_scafold.dart'; + +import '../../constant/style.dart'; +import '../../controller/rate/rate_conroller.dart'; + +class RatePassenger extends StatelessWidget { + final RatePassengerController controller = Get.put(RatePassengerController()); + + RatePassenger({super.key}); + + @override + Widget build(BuildContext context) { + return MyScafolld( + title: 'Rate Passenger'.tr, + body: [ + Positioned( + top: 40, + left: Get.width * .1, + right: Get.width * .1, + child: Container( + decoration: AppStyle.boxDecoration, + child: Column( + children: [ + Center( + child: RatingBar.builder( + initialRating: 0, + itemCount: 5, + itemSize: 50, + itemPadding: const EdgeInsets.symmetric(horizontal: 2), + itemBuilder: (context, index) { + switch (index) { + case 0: + return const Icon( + Icons.sentiment_very_dissatisfied, + color: Colors.red, + ); + case 1: + return const Icon( + Icons.sentiment_dissatisfied, + color: Colors.redAccent, + ); + case 2: + return const Icon( + Icons.sentiment_neutral, + color: Colors.amber, + ); + case 3: + return const Icon( + Icons.sentiment_satisfied, + color: Colors.lightGreen, + ); + case 4: + return const Icon( + Icons.sentiment_very_satisfied, + color: Colors.green, + ); + default: + return const Icon( + Icons.sentiment_neutral, + color: Colors.amber, + ); + } // + }, + onRatingUpdate: (rating) { + controller.selectRateItem(rating); + }, + ), + ), + const SizedBox( + height: 20, + ), + Form( + child: SizedBox( + width: Get.width * .75, + child: TextFormField( + maxLines: 4, + minLines: 1, + keyboardType: TextInputType.multiline, + controller: controller.comment, + decoration: InputDecoration( + labelText: 'Enter your Note'.tr, + hintText: 'Type something...', + prefixIcon: const Icon( + Icons.rate_review), // Add an icon as a prefix + suffixIcon: IconButton( + icon: const Icon( + Icons.clear, + color: AppColor.redColor, + ), // Add an icon as a suffix + onPressed: () { + controller.comment.clear(); + }, + ), + border: + const OutlineInputBorder(), // Add a border around the input field + enabledBorder: const OutlineInputBorder( + borderSide: BorderSide( + color: + Colors.blue), // Customize the border color + ), + focusedBorder: const OutlineInputBorder( + borderSide: BorderSide( + color: Colors + .green), // Customize the border color when focused + ), + errorBorder: const OutlineInputBorder( + borderSide: BorderSide( + color: Colors + .red), // Customize the border color when there's an error + ), + ), + ), + ), + ), + const SizedBox( + height: 20, + ), + MyElevatedButton( + title: 'Submit rating'.tr, + onPressed: () => controller.addRateToPassenger()) + ], + ), + )), + ], + isleading: false, + ); + } +} diff --git a/lib/views/home/map_widget.dart/passenger_info_window.dart b/lib/views/home/map_widget.dart/passenger_info_window.dart index 3ffc13b..77eb647 100644 --- a/lib/views/home/map_widget.dart/passenger_info_window.dart +++ b/lib/views/home/map_widget.dart/passenger_info_window.dart @@ -178,7 +178,7 @@ class PassengerInfoWindow extends StatelessWidget { : MyElevatedButton( title: 'Start the Ride'.tr, onPressed: () { - controller.beginRideFromDriver(); + controller.startRideFromDriver(); }), ], ), diff --git a/lib/views/orderCaptin/driver_map_page.dart b/lib/views/orderCaptin/driver_map_page.dart index f50cf18..8247d2b 100644 --- a/lib/views/orderCaptin/driver_map_page.dart +++ b/lib/views/orderCaptin/driver_map_page.dart @@ -19,7 +19,6 @@ class PassengerLocationDirection extends StatelessWidget { Widget build(BuildContext context) { Get.put(MapDriverController()); - // mapDirection.getMap();//todo get this argument return MyScafolld( title: 'Map'.tr, body: [ @@ -72,7 +71,7 @@ class PassengerLocationDirection extends StatelessWidget { const PassengerInfoWindow(), GetBuilder( builder: (mapDriverController) => mapDriverController - .isRideFinished + .isRideStarted ? Positioned( left: 5, top: 5, @@ -97,7 +96,9 @@ class PassengerLocationDirection extends StatelessWidget { ), MyElevatedButton( title: 'End Ride'.tr, - onPressed: () {}, + onPressed: () { + mapDriverController.finishRideFromDriver(); + }, kolor: AppColor.redColor, ), Column( diff --git a/lib/views/orderCaptin/order_request_page.dart b/lib/views/orderCaptin/order_request_page.dart index db372a4..40a79b0 100644 --- a/lib/views/orderCaptin/order_request_page.dart +++ b/lib/views/orderCaptin/order_request_page.dart @@ -199,6 +199,8 @@ class OrderRequestPage extends StatelessWidget { 'https://www.google.com/maps/dir/${myList[0]}/${myList[1]}/', 'DurationToPassenger': myList[15].toString(), 'rideId': myList[16].toString(), + 'passengerId': myList[7].toString(), + 'driverId': myList[18].toString(), }); }, ), diff --git a/pubspec.lock b/pubspec.lock index 2f88ce6..351ccf3 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -270,6 +270,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.0.15" + flutter_rating_bar: + dependency: "direct main" + description: + name: flutter_rating_bar + sha256: d2af03469eac832c591a1eba47c91ecc871fe5708e69967073c043b2d775ed93 + url: "https://pub.dev" + source: hosted + version: "4.0.1" flutter_secure_storage: dependency: "direct main" description: diff --git a/pubspec.yaml b/pubspec.yaml index 6c3af88..b016e0f 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -36,6 +36,7 @@ dependencies: flutter_paypal: ^0.2.0 flutter_launcher_icons: ^0.13.1 crypto: ^3.0.3 + flutter_rating_bar: ^4.0.1 dev_dependencies: