From 5aeb3cf685d079c6f422f74695e1eb315db03f22 Mon Sep 17 00:00:00 2001 From: Hamza-Ayed Date: Sun, 17 Nov 2024 22:13:31 +0200 Subject: [PATCH] 11/17/1 --- android/app/build.gradle | 4 +- ios/Runner.xcodeproj/project.pbxproj | 9 +- .../AppIcon.appiconset/Contents.json | 355 +++++++++++++++++- ios/Runner/Info.plist | 4 +- lib/constant/links.dart | 9 +- .../auth/captin/invit_controller.dart | 42 +-- .../auth/captin/login_captin_controller.dart | 46 ++- .../captin/register_captin_controller.dart | 22 +- lib/controller/auth/google_sign.dart | 4 +- lib/controller/auth/login_controller.dart | 6 +- lib/controller/auth/tokens_controller.dart | 3 +- lib/controller/firebase/firbase_messge.dart | 15 +- .../firebase/local_notification.dart | 65 +++- lib/controller/firebase/order_lay.dart | 2 - lib/controller/functions/crud.dart | 6 +- lib/controller/functions/gemeni.dart | 34 +- lib/controller/functions/log_out.dart | 7 +- lib/controller/functions/tts.dart | 4 +- lib/controller/functions/upload_image.dart | 21 +- .../captin/help/assurance_controller.dart | 16 +- .../home/captin/help/video_controller.dart | 5 +- .../home/captin/home_captain_controller.dart | 4 +- .../home/captin/map_driver_controller.dart | 20 +- .../payment/captain_wallet_controller.dart | 17 +- .../home/payment/paymob_payout.dart | 16 +- lib/controller/local/translations.dart | 8 +- .../payment/payment_controller.dart | 15 +- lib/controller/rate/rate_app_controller.dart | 97 +++++ lib/controller/rate/rate_conroller.dart | 4 +- lib/main.dart | 7 +- lib/splash_screen_page.dart | 1 - lib/views/Rate/rate_app_page.dart | 86 +++++ lib/views/auth/captin/cards/sms_signup.dart | 12 + .../auth/captin/driver_car_controller.dart | 6 +- .../auth/captin/invite_driver_screen.dart | 2 - lib/views/auth/captin/login_captin.dart | 3 - .../home/Captin/assurance_health_page.dart | 14 +- .../Captin/home_captain/drawer_captain.dart | 10 +- .../widget/left_menu_map_captain.dart | 47 +-- .../home/my_wallet/card_wallet_widget.dart | 2 - lib/views/home/my_wallet/walet_captain.dart | 17 +- .../home/profile/cars_inserting_page.dart | 1 - .../home/profile/passenger_profile_page.dart | 2 - .../notification/notification_captain.dart | 1 - lib/views/widgets/error_snakbar.dart | 69 ++++ 45 files changed, 856 insertions(+), 284 deletions(-) create mode 100644 lib/controller/rate/rate_app_controller.dart create mode 100644 lib/views/Rate/rate_app_page.dart create mode 100644 lib/views/widgets/error_snakbar.dart diff --git a/android/app/build.gradle b/android/app/build.gradle index 44cc32f..5b5a27b 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -54,8 +54,8 @@ android { // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration. minSdk = 23 targetSdk = flutter.targetSdkVersion - versionCode = 117 - versionName = '1.5.17' + versionCode = 120 + versionName = '1.5.20' multiDexEnabled =true } diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index e6ef576..84e1046 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -555,9 +555,10 @@ BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = 63CVT8G5P8; GENERATE_INFOPLIST_FILE = YES; MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = com.mobileapp.store.ride.RunnerTests; + PRODUCT_BUNDLE_IDENTIFIER = com.mobileapp.store.ride; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; @@ -573,9 +574,10 @@ BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = 63CVT8G5P8; GENERATE_INFOPLIST_FILE = YES; MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = com.mobileapp.store.ride.RunnerTests; + PRODUCT_BUNDLE_IDENTIFIER = com.mobileapp.store.ride; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_VERSION = 5.0; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; @@ -589,9 +591,10 @@ BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = 63CVT8G5P8; GENERATE_INFOPLIST_FILE = YES; MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = com.mobileapp.store.ride.RunnerTests; + PRODUCT_BUNDLE_IDENTIFIER = com.mobileapp.store.ride; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_VERSION = 5.0; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json index ffab254..6bf81eb 100644 --- a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json +++ b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -1 +1,354 @@ -{"images":[{"size":"60x60","expected-size":"180","filename":"180.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"3x"},{"size":"40x40","expected-size":"80","filename":"80.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"40x40","expected-size":"120","filename":"120.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"3x"},{"size":"60x60","expected-size":"120","filename":"120.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"57x57","expected-size":"57","filename":"57.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"1x"},{"size":"29x29","expected-size":"58","filename":"58.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"29x29","expected-size":"29","filename":"29.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"1x"},{"size":"29x29","expected-size":"87","filename":"87.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"3x"},{"size":"57x57","expected-size":"114","filename":"114.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"20x20","expected-size":"40","filename":"40.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"20x20","expected-size":"60","filename":"60.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"3x"},{"size":"1024x1024","filename":"1024.png","expected-size":"1024","idiom":"ios-marketing","folder":"Assets.xcassets/AppIcon.appiconset/","scale":"1x"},{"size":"40x40","expected-size":"80","filename":"80.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"72x72","expected-size":"72","filename":"72.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"76x76","expected-size":"152","filename":"152.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"50x50","expected-size":"100","filename":"100.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"29x29","expected-size":"58","filename":"58.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"76x76","expected-size":"76","filename":"76.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"29x29","expected-size":"29","filename":"29.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"50x50","expected-size":"50","filename":"50.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"72x72","expected-size":"144","filename":"144.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"40x40","expected-size":"40","filename":"40.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"83.5x83.5","expected-size":"167","filename":"167.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"20x20","expected-size":"20","filename":"20.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"20x20","expected-size":"40","filename":"40.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"idiom":"watch","filename":"172.png","folder":"Assets.xcassets/AppIcon.appiconset/","subtype":"38mm","scale":"2x","size":"86x86","expected-size":"172","role":"quickLook"},{"idiom":"watch","filename":"80.png","folder":"Assets.xcassets/AppIcon.appiconset/","subtype":"38mm","scale":"2x","size":"40x40","expected-size":"80","role":"appLauncher"},{"idiom":"watch","filename":"88.png","folder":"Assets.xcassets/AppIcon.appiconset/","subtype":"40mm","scale":"2x","size":"44x44","expected-size":"88","role":"appLauncher"},{"idiom":"watch","filename":"102.png","folder":"Assets.xcassets/AppIcon.appiconset/","subtype":"41mm","scale":"2x","size":"45x45","expected-size":"102","role":"appLauncher"},{"idiom":"watch","filename":"92.png","folder":"Assets.xcassets/AppIcon.appiconset/","subtype":"41mm","scale":"2x","size":"46x46","expected-size":"92","role":"appLauncher"},{"idiom":"watch","filename":"100.png","folder":"Assets.xcassets/AppIcon.appiconset/","subtype":"44mm","scale":"2x","size":"50x50","expected-size":"100","role":"appLauncher"},{"idiom":"watch","filename":"196.png","folder":"Assets.xcassets/AppIcon.appiconset/","subtype":"42mm","scale":"2x","size":"98x98","expected-size":"196","role":"quickLook"},{"idiom":"watch","filename":"216.png","folder":"Assets.xcassets/AppIcon.appiconset/","subtype":"44mm","scale":"2x","size":"108x108","expected-size":"216","role":"quickLook"},{"idiom":"watch","filename":"48.png","folder":"Assets.xcassets/AppIcon.appiconset/","subtype":"38mm","scale":"2x","size":"24x24","expected-size":"48","role":"notificationCenter"},{"idiom":"watch","filename":"55.png","folder":"Assets.xcassets/AppIcon.appiconset/","subtype":"42mm","scale":"2x","size":"27.5x27.5","expected-size":"55","role":"notificationCenter"},{"idiom":"watch","filename":"66.png","folder":"Assets.xcassets/AppIcon.appiconset/","subtype":"45mm","scale":"2x","size":"33x33","expected-size":"66","role":"notificationCenter"},{"size":"29x29","expected-size":"87","filename":"87.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"watch","role":"companionSettings","scale":"3x"},{"size":"29x29","expected-size":"58","filename":"58.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"watch","role":"companionSettings","scale":"2x"},{"size":"1024x1024","expected-size":"1024","filename":"1024.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"watch-marketing","scale":"1x"},{"size":"128x128","expected-size":"128","filename":"128.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"1x"},{"size":"256x256","expected-size":"256","filename":"256.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"1x"},{"size":"128x128","expected-size":"256","filename":"256.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"2x"},{"size":"256x256","expected-size":"512","filename":"512.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"2x"},{"size":"32x32","expected-size":"32","filename":"32.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"1x"},{"size":"512x512","expected-size":"512","filename":"512.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"1x"},{"size":"16x16","expected-size":"16","filename":"16.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"1x"},{"size":"16x16","expected-size":"32","filename":"32.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"2x"},{"size":"32x32","expected-size":"64","filename":"64.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"2x"},{"size":"512x512","expected-size":"1024","filename":"1024.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"2x"}]} \ No newline at end of file +{ + "images" : [ + { + "filename" : "40.png", + "idiom" : "iphone", + "scale" : "2x", + "size" : "20x20" + }, + { + "filename" : "60.png", + "idiom" : "iphone", + "scale" : "3x", + "size" : "20x20" + }, + { + "filename" : "29.png", + "idiom" : "iphone", + "scale" : "1x", + "size" : "29x29" + }, + { + "filename" : "58.png", + "idiom" : "iphone", + "scale" : "2x", + "size" : "29x29" + }, + { + "filename" : "87.png", + "idiom" : "iphone", + "scale" : "3x", + "size" : "29x29" + }, + { + "filename" : "80.png", + "idiom" : "iphone", + "scale" : "2x", + "size" : "40x40" + }, + { + "filename" : "120.png", + "idiom" : "iphone", + "scale" : "3x", + "size" : "40x40" + }, + { + "filename" : "57.png", + "idiom" : "iphone", + "scale" : "1x", + "size" : "57x57" + }, + { + "filename" : "114.png", + "idiom" : "iphone", + "scale" : "2x", + "size" : "57x57" + }, + { + "filename" : "120.png", + "idiom" : "iphone", + "scale" : "2x", + "size" : "60x60" + }, + { + "filename" : "180.png", + "idiom" : "iphone", + "scale" : "3x", + "size" : "60x60" + }, + { + "filename" : "20.png", + "idiom" : "ipad", + "scale" : "1x", + "size" : "20x20" + }, + { + "filename" : "40.png", + "idiom" : "ipad", + "scale" : "2x", + "size" : "20x20" + }, + { + "filename" : "29.png", + "idiom" : "ipad", + "scale" : "1x", + "size" : "29x29" + }, + { + "filename" : "58.png", + "idiom" : "ipad", + "scale" : "2x", + "size" : "29x29" + }, + { + "filename" : "40.png", + "idiom" : "ipad", + "scale" : "1x", + "size" : "40x40" + }, + { + "filename" : "80.png", + "idiom" : "ipad", + "scale" : "2x", + "size" : "40x40" + }, + { + "filename" : "50.png", + "idiom" : "ipad", + "scale" : "1x", + "size" : "50x50" + }, + { + "filename" : "100.png", + "idiom" : "ipad", + "scale" : "2x", + "size" : "50x50" + }, + { + "filename" : "72.png", + "idiom" : "ipad", + "scale" : "1x", + "size" : "72x72" + }, + { + "filename" : "144.png", + "idiom" : "ipad", + "scale" : "2x", + "size" : "72x72" + }, + { + "filename" : "76.png", + "idiom" : "ipad", + "scale" : "1x", + "size" : "76x76" + }, + { + "filename" : "152.png", + "idiom" : "ipad", + "scale" : "2x", + "size" : "76x76" + }, + { + "filename" : "167.png", + "idiom" : "ipad", + "scale" : "2x", + "size" : "83.5x83.5" + }, + { + "filename" : "1024.png", + "idiom" : "ios-marketing", + "scale" : "1x", + "size" : "1024x1024" + }, + { + "filename" : "16.png", + "idiom" : "mac", + "scale" : "1x", + "size" : "16x16" + }, + { + "filename" : "32.png", + "idiom" : "mac", + "scale" : "2x", + "size" : "16x16" + }, + { + "filename" : "32.png", + "idiom" : "mac", + "scale" : "1x", + "size" : "32x32" + }, + { + "filename" : "64.png", + "idiom" : "mac", + "scale" : "2x", + "size" : "32x32" + }, + { + "filename" : "128.png", + "idiom" : "mac", + "scale" : "1x", + "size" : "128x128" + }, + { + "filename" : "256.png", + "idiom" : "mac", + "scale" : "2x", + "size" : "128x128" + }, + { + "filename" : "256.png", + "idiom" : "mac", + "scale" : "1x", + "size" : "256x256" + }, + { + "filename" : "512.png", + "idiom" : "mac", + "scale" : "2x", + "size" : "256x256" + }, + { + "filename" : "512.png", + "idiom" : "mac", + "scale" : "1x", + "size" : "512x512" + }, + { + "filename" : "1024.png", + "idiom" : "mac", + "scale" : "2x", + "size" : "512x512" + }, + { + "filename" : "48.png", + "idiom" : "watch", + "role" : "notificationCenter", + "scale" : "2x", + "size" : "24x24", + "subtype" : "38mm" + }, + { + "filename" : "55.png", + "idiom" : "watch", + "role" : "notificationCenter", + "scale" : "2x", + "size" : "27.5x27.5", + "subtype" : "42mm" + }, + { + "filename" : "58.png", + "idiom" : "watch", + "role" : "companionSettings", + "scale" : "2x", + "size" : "29x29" + }, + { + "filename" : "87.png", + "idiom" : "watch", + "role" : "companionSettings", + "scale" : "3x", + "size" : "29x29" + }, + { + "filename" : "66.png", + "idiom" : "watch", + "role" : "notificationCenter", + "scale" : "2x", + "size" : "33x33", + "subtype" : "45mm" + }, + { + "filename" : "80.png", + "idiom" : "watch", + "role" : "appLauncher", + "scale" : "2x", + "size" : "40x40", + "subtype" : "38mm" + }, + { + "filename" : "88.png", + "idiom" : "watch", + "role" : "appLauncher", + "scale" : "2x", + "size" : "44x44", + "subtype" : "40mm" + }, + { + "filename" : "92.png", + "idiom" : "watch", + "role" : "appLauncher", + "scale" : "2x", + "size" : "46x46", + "subtype" : "41mm" + }, + { + "filename" : "100.png", + "idiom" : "watch", + "role" : "appLauncher", + "scale" : "2x", + "size" : "50x50", + "subtype" : "44mm" + }, + { + "idiom" : "watch", + "role" : "appLauncher", + "scale" : "2x", + "size" : "51x51", + "subtype" : "45mm" + }, + { + "idiom" : "watch", + "role" : "appLauncher", + "scale" : "2x", + "size" : "54x54", + "subtype" : "49mm" + }, + { + "filename" : "172.png", + "idiom" : "watch", + "role" : "quickLook", + "scale" : "2x", + "size" : "86x86", + "subtype" : "38mm" + }, + { + "filename" : "196.png", + "idiom" : "watch", + "role" : "quickLook", + "scale" : "2x", + "size" : "98x98", + "subtype" : "42mm" + }, + { + "filename" : "216.png", + "idiom" : "watch", + "role" : "quickLook", + "scale" : "2x", + "size" : "108x108", + "subtype" : "44mm" + }, + { + "idiom" : "watch", + "role" : "quickLook", + "scale" : "2x", + "size" : "117x117", + "subtype" : "45mm" + }, + { + "idiom" : "watch", + "role" : "quickLook", + "scale" : "2x", + "size" : "129x129", + "subtype" : "49mm" + }, + { + "filename" : "1024.png", + "idiom" : "watch-marketing", + "scale" : "1x", + "size" : "1024x1024" + }, + { + "filename" : "102.png", + "idiom" : "watch", + "role" : "appLauncher", + "scale" : "2x", + "size" : "45x45", + "subtype" : "41mm" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist index 7c88e58..0da6cd8 100644 --- a/ios/Runner/Info.plist +++ b/ios/Runner/Info.plist @@ -35,7 +35,7 @@ CFBundlePackageType APPL CFBundleShortVersionString - 77 + 79 CFBundleSignature ???? CFBundleURLTypes @@ -50,7 +50,7 @@ CFBundleVersion - 4.0.77 + 4.0.79 FirebaseAppDelegateProxyEnabled NO GMSApiKey diff --git a/lib/constant/links.dart b/lib/constant/links.dart index 458d10e..c3d52cc 100644 --- a/lib/constant/links.dart +++ b/lib/constant/links.dart @@ -74,7 +74,7 @@ class AppLink { //-----------------ridessss------------------ static String addRides = "$ride/rides/add.php"; static String getRides = "$ride/rides/get.php"; - static String getMishwari = "$ride/ride/mishwari/get.php"; + static String getMishwari = "$ride/mishwari/get.php"; static String getTripCountByCaptain = "$ride/rides/getTripCountByCaptain.php"; static String getRideOrderID = "$ride/rides/getRideOrderID.php"; static String getRideStatus = "$ride/rides/getRideStatus.php"; @@ -196,14 +196,17 @@ class AppLink { // ===================================== static String addRateToPassenger = "$ride/rate/add.php"; static String addRateToDriver = "$ride/rate/addRateToDriver.php"; + static String addRateApp = "$ride/rate/add_rate_app.php"; + static String sendEmailRateingApp = + "https://api.sefer.live/sefer/ride/rate/sendEmailRateingApp.php"; static String getDriverRate = "$ride/rate/getDriverRate.php"; static String getPassengerRate = "$ride/rate/getPassengerRate.php"; ////////////////emails ============// static String sendEmailToPassengerForTripDetails = - "$ride/rides/emailToPassengerTripDetail.php"; + "https://api.sefer.live/sefer/ride/rides/emailToPassengerTripDetail.php"; static String sendEmailToDrivertransaction = - "$seferPaymentServer0/Admin/sendEmailToDrivertransaction.php"; + "https://api.sefer.live/sefer/Admin/sendEmailToDrivertransaction.php"; // "https://api.sefer.live/sefer/Admin/sendEmailToDrivertransaction.php"; // =========================================== static String pathImage = "$server/upload/types/"; diff --git a/lib/controller/auth/captin/invit_controller.dart b/lib/controller/auth/captin/invit_controller.dart index bae4564..44bd80b 100644 --- a/lib/controller/auth/captin/invit_controller.dart +++ b/lib/controller/auth/captin/invit_controller.dart @@ -14,6 +14,7 @@ import 'package:share/share.dart'; import '../../../main.dart'; import '../../../print.dart'; +import '../../../views/widgets/error_snakbar.dart'; import '../../functions/launch.dart'; import '../../notification/notification_captain_controller.dart'; @@ -103,10 +104,11 @@ Download the SEFER app now and enjoy your ride! // TODO: Implement the actual server upload logic here // Simulating a server request await Future.delayed(Duration(seconds: 2)); - Get.snackbar('Success'.tr, + + mySnackbarSuccess( '${selectedContacts.length} contacts saved to server'.tr); } catch (e) { - Get.snackbar('Error'.tr, + mySnackeBarError( 'An error occurred while saving contacts to server: $e'.tr); } } @@ -134,16 +136,13 @@ Download the SEFER app now and enjoy your ride! update(); if (contacts.isEmpty) { - Get.snackbar('No contacts available'.tr, - 'Please add contacts to your phone.'.tr); + mySnackeBarError('Please add contacts to your phone.'.tr); } } else { - Get.snackbar('Permission denied'.tr, - 'Contact permission is required to pick contacts'.tr); + mySnackeBarError('Contact permission is required to pick contacts'.tr); } } catch (e) { - Get.snackbar( - 'Error'.tr, 'An error occurred while picking contacts: $e'.tr); + mySnackeBarError('An error occurred while picking contacts: $e'.tr); } } @@ -267,7 +266,7 @@ Download the SEFER app now and enjoy your ride! void sendInvite() async { if (invitePhoneController.text.isEmpty) { - Get.snackbar('Error', 'Please enter an phone address'.tr); + mySnackeBarError('Please enter an phone address'.tr); return; } @@ -281,8 +280,7 @@ Download the SEFER app now and enjoy your ride! if (response != 'failure') { var d = jsonDecode(response); - Get.snackbar('Success', 'Invite sent successfully'.tr); - + mySnackbarSuccess('Invite sent successfully'.tr); String message = '${'*SEFER DRIVER CODE*'.tr}\n\n' '${"Use this code in registration".tr}\n' '${"To get a gift for both".tr}\n\n' @@ -297,18 +295,14 @@ Download the SEFER app now and enjoy your ride! invitePhoneController.clear(); } else { - Get.snackbar('Error'.tr, "Invite code already used".tr, - backgroundColor: AppColor.redColor, - duration: const Duration(seconds: 4)); + mySnackeBarError("Invite code already used".tr); } - // } catch (e) { - // Get.snackbar('Error', 'An error occurred'.tr); - // } } void sendInviteToPassenger() async { if (invitePhoneController.text.isEmpty) { - Get.snackbar('Error', 'Please enter an phone address'.tr); + mySnackeBarError('Please enter an phone address'.tr); + return; } @@ -323,7 +317,8 @@ Download the SEFER app now and enjoy your ride! if (response != 'failure') { var d = jsonDecode(response); - Get.snackbar('Success', 'Invite sent successfully'.tr); + + mySnackbarSuccess('Invite sent successfully'.tr); String message = '${'*SEFER APP CODE*'.tr}\n\n' '${"Use this code in registration".tr}\n' @@ -339,13 +334,10 @@ Download the SEFER app now and enjoy your ride! invitePhoneController.clear(); } else { - Get.snackbar('Error'.tr, "Invite code already used".tr, - backgroundColor: AppColor.redColor, - duration: const Duration(seconds: 4)); + mySnackeBarError( + "Invite code already used".tr, + ); } - // } catch (e) { - // Get.snackbar('Error', 'An error occurred'.tr); - // } } } diff --git a/lib/controller/auth/captin/login_captin_controller.dart b/lib/controller/auth/captin/login_captin_controller.dart index 785728c..feb195e 100644 --- a/lib/controller/auth/captin/login_captin_controller.dart +++ b/lib/controller/auth/captin/login_captin_controller.dart @@ -1,12 +1,10 @@ import 'dart:convert'; import 'dart:math'; -import 'package:SEFER/constant/colors.dart'; import 'package:SEFER/controller/functions/location_background_controller.dart'; -import 'package:SEFER/print.dart'; import 'package:SEFER/views/auth/captin/cards/sms_signup.dart'; -import 'package:SEFER/views/auth/captin/login_captin.dart'; import 'package:SEFER/views/widgets/elevated_btn.dart'; +import 'package:SEFER/views/widgets/error_snakbar.dart'; import 'package:flutter/material.dart'; import 'package:flutter_secure_storage/flutter_secure_storage.dart'; import 'package:get/get.dart'; @@ -164,7 +162,7 @@ class LoginDriverController extends GetxController { box.write(BoxName.carTypeOfDriver, 'Pink Bike'); } } else if (int.parse(jsonDecoeded['data'][0]['year'].toString()) > - 2017) { + 2016) { if (jsonDecoeded['data'][0]['gender'].toString() != 'Male') { box.write(BoxName.carTypeOfDriver, 'Lady'); } else { @@ -172,7 +170,7 @@ class LoginDriverController extends GetxController { } } else if (int.parse(jsonDecoeded['data'][0]['year'].toString()) > 2002 && - int.parse(jsonDecoeded['data'][0]['year'].toString()) < 2017) { + int.parse(jsonDecoeded['data'][0]['year'].toString()) < 2016) { box.write(BoxName.carTypeOfDriver, 'Speed'); } else if (int.parse(jsonDecoeded['data'][0]['year'].toString()) < 2002) { @@ -204,7 +202,7 @@ class LoginDriverController extends GetxController { 'token': box.read(BoxName.tokenDriver), 'captain_id': box.read(BoxName.driverID).toString() }); - CRUD().post( + await CRUD().post( link: "${AppLink.seferAlexandriaServer}/ride/firebase/addDriver.php", payload: { @@ -212,30 +210,29 @@ class LoginDriverController extends GetxController { 'captain_id': box.read(BoxName.driverID).toString() }); - CRUD().post( - link: - "${AppLink.seferGizaServer}/ride/firebase/addDriver.php", - payload: { - 'token': box.read(BoxName.tokenDriver), - 'captain_id': - box.read(BoxName.driverID).toString() - }); + // await CRUD().post( + // link: + // "${AppLink.seferGizaServer}/ride/firebase/addDriver.php", + // payload: { + // 'token': box.read(BoxName.tokenDriver), + // 'captain_id': + // box.read(BoxName.driverID).toString() + // }); Get.back(); })); } } Get.off(() => HomeCaptain()); - // Get.off(() => LoginCaptin()); } else { Get.offAll(() => SmsSignupEgypt()); - // Get.snackbar(jsonDecoeded['status'], jsonDecoeded['data'], - // backgroundColor: Colors.redAccent); + isloading = false; update(); } } else { - Get.snackbar('failure'.tr, '', backgroundColor: AppColor.redColor); + mySnackbarSuccess(''); + isloading = false; update(); } @@ -263,7 +260,6 @@ class LoginDriverController extends GetxController { isloading = false; update(); - // Get.snackbar('Failure', '', backgroundColor: Colors.red); } else { var jsonDecoeded = jsonDecode(res); if (jsonDecoeded.isNotEmpty) { @@ -321,7 +317,7 @@ class LoginDriverController extends GetxController { 'change device'.tr, jsonDecode(token)['data'][0]['token'].toString(), [], - 'promo.wav'); + 'ding.wav'); Get.defaultDialog( title: 'you will use this device?'.tr, middleText: '', @@ -333,7 +329,7 @@ class LoginDriverController extends GetxController { 'token': box.read(BoxName.tokenDriver), 'captain_id': box.read(BoxName.driverID).toString() }); - CRUD().post( + await CRUD().post( link: "${AppLink.seferAlexandriaServer}/ride/firebase/addDriver.php", payload: { @@ -341,7 +337,7 @@ class LoginDriverController extends GetxController { 'captain_id': box.read(BoxName.driverID).toString() }); - CRUD().post( + await CRUD().post( link: "${AppLink.seferGizaServer}/ride/firebase/addDriver.php", payload: { @@ -358,13 +354,13 @@ class LoginDriverController extends GetxController { // Get.off(() => LoginCaptin()); } else { Get.offAll(() => SmsSignupEgypt()); - // Get.snackbar(jsonDecoeded['status'], jsonDecoeded['data'], - // backgroundColor: Colors.redAccent); + isloading = false; update(); } } else { - Get.snackbar('failure'.tr, '', backgroundColor: AppColor.redColor); + mySnackeBarError(''); + isloading = false; update(); } diff --git a/lib/controller/auth/captin/register_captin_controller.dart b/lib/controller/auth/captin/register_captin_controller.dart index 087cbd9..0b35f9b 100644 --- a/lib/controller/auth/captin/register_captin_controller.dart +++ b/lib/controller/auth/captin/register_captin_controller.dart @@ -4,6 +4,7 @@ import 'dart:math'; import 'package:SEFER/controller/auth/captin/login_captin_controller.dart'; import 'package:SEFER/views/auth/captin/cards/egypt_card_a_i.dart'; import 'package:SEFER/views/auth/captin/register_captin.dart'; +import 'package:SEFER/views/widgets/error_snakbar.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:SEFER/constant/box_name.dart'; @@ -152,8 +153,9 @@ class RegisterCaptainController extends GetxController { update(); } } else { - Get.snackbar('Phone Number wrong'.tr, '', - backgroundColor: AppColor.redColor); + mySnackeBarError( + 'Phone Number wrong'.tr, + ); } } } @@ -235,11 +237,7 @@ class RegisterCaptainController extends GetxController { // Handle case where phone number is already verified _handleAlreadyVerified() { - Get.snackbar( - 'Phone number is already verified'.tr, - '', - backgroundColor: AppColor.greenColor, - ); + mySnackbarSuccess('Phone number is already verified'.tr); box.write(BoxName.phoneVerified, '1'); box.write(BoxName.phone, '+2${phoneController.text}'); Get.put(LoginDriverController()).loginUsingCredentials( @@ -263,7 +261,6 @@ class RegisterCaptainController extends GetxController { }, ); - // Get.snackbar('', ''); await smsEgyptController.sendSmsEgypt(phoneNumber, randomNumber.toString()); lastOtpSentTime = DateTime.now(); // Update the last OTP sent time @@ -274,11 +271,7 @@ class RegisterCaptainController extends GetxController { // Show error message in case of invalid phone number void _showErrorMessage(String message) { - Get.snackbar( - message.tr, - '', - backgroundColor: AppColor.redColor, - ); + mySnackeBarError(message); } verifySMSCode() async { @@ -315,8 +308,7 @@ class RegisterCaptainController extends GetxController { // } } } else { - Get.snackbar('Error'.tr, 'you must insert token code '.tr, - backgroundColor: AppColor.redColor); + mySnackeBarError('you must insert token code '.tr); } } diff --git a/lib/controller/auth/google_sign.dart b/lib/controller/auth/google_sign.dart index bf8f3ff..360556b 100644 --- a/lib/controller/auth/google_sign.dart +++ b/lib/controller/auth/google_sign.dart @@ -6,6 +6,7 @@ import 'package:SEFER/controller/functions/crud.dart'; import 'package:SEFER/main.dart'; import 'package:SEFER/views/auth/captin/cards/sms_signup.dart'; import 'package:SEFER/views/home/on_boarding_page.dart'; +import 'package:SEFER/views/widgets/error_snakbar.dart'; import 'package:get/get.dart'; import 'package:google_sign_in/google_sign_in.dart'; @@ -116,8 +117,7 @@ class GoogleSignInHelper { return googleUser; } catch (error) { - Get.snackbar('Google Sign-In error', '$error', - backgroundColor: AppColor.redColor); + mySnackeBarError('$error'); addError(error.toString(), 'GoogleSignInAccount?> signInFromLogin()'); return null; } diff --git a/lib/controller/auth/login_controller.dart b/lib/controller/auth/login_controller.dart index 367a053..91f7e26 100644 --- a/lib/controller/auth/login_controller.dart +++ b/lib/controller/auth/login_controller.dart @@ -1,6 +1,7 @@ import 'dart:convert'; import 'dart:math'; +import 'package:SEFER/views/widgets/error_snakbar.dart'; import 'package:flutter/material.dart'; import 'package:flutter_secure_storage/flutter_secure_storage.dart'; import 'package:get/get.dart'; @@ -50,7 +51,7 @@ class LoginController extends GetxController { update(); if (res == 'failure') { //Failure - Get.snackbar('Failure', '', backgroundColor: Colors.red); + mySnackeBarError(''); } else { var jsonDecoeded = jsonDecode(res); if (jsonDecoeded.isNotEmpty) { @@ -90,8 +91,7 @@ class LoginController extends GetxController { ); } } else if (jsonDecoeded['status'] == 'Failure') { - Get.snackbar(jsonDecoeded['status'], jsonDecoeded['data'], - backgroundColor: Colors.redAccent); + mySnackeBarError(jsonDecoeded['data']); isloading = false; update(); } diff --git a/lib/controller/auth/tokens_controller.dart b/lib/controller/auth/tokens_controller.dart index 3458470..73be75e 100644 --- a/lib/controller/auth/tokens_controller.dart +++ b/lib/controller/auth/tokens_controller.dart @@ -1,5 +1,6 @@ import 'dart:convert'; +import 'package:SEFER/views/widgets/error_snakbar.dart'; import 'package:get/get.dart'; import 'package:http/http.dart' as http; @@ -31,7 +32,7 @@ class TokenController extends GetxController { update(); var jsonToken = jsonDecode(res.body); if (jsonToken['status'] == 'The token has been updated successfully.') { - Get.snackbar('token updated'.tr, ''); + mySnackbarSuccess('token updated'.tr); } } } diff --git a/lib/controller/firebase/firbase_messge.dart b/lib/controller/firebase/firbase_messge.dart index e862b2e..6c85c7a 100644 --- a/lib/controller/firebase/firbase_messge.dart +++ b/lib/controller/firebase/firbase_messge.dart @@ -1,8 +1,7 @@ import 'dart:convert'; import 'dart:io'; import 'package:SEFER/controller/home/captin/home_captain_controller.dart'; -import 'package:SEFER/env/env.dart'; -import 'package:SEFER/print.dart'; +import 'package:SEFER/views/widgets/error_snakbar.dart'; import 'package:SEFER/views/widgets/mydialoug.dart'; import 'package:firebase_messaging/firebase_messaging.dart'; import 'package:flutter/material.dart'; @@ -10,7 +9,6 @@ import 'package:get/get.dart'; import 'package:http/http.dart' as http; import 'package:SEFER/views/widgets/elevated_btn.dart'; -import '../../constant/api_key.dart'; import '../../constant/box_name.dart'; import '../../constant/colors.dart'; import '../../constant/style.dart'; @@ -208,8 +206,6 @@ class FirebaseMessagesController extends GetxController { update(); } else if (message.notification!.title! == 'Hi ,I will go now') { - // Get.snackbar('Hi ,I will go now', '', - // backgroundColor: AppColor.greenColor); if (Platform.isAndroid) { notificationController.showNotification( 'Passenger come to you'.tr, 'Hi ,I will go now'.tr, 'tone2', ''); @@ -274,14 +270,7 @@ class FirebaseMessagesController extends GetxController { // Get.off(const CallPage()); } catch (e) {} } else if (message.notification!.title! == 'Order Applied'.tr) { - Get.snackbar( - "The order has been accepted by another driver." - .tr, // Corrected grammar - "Be more mindful next time to avoid dropping orders." - .tr, // Improved sentence structure - backgroundColor: AppColor.yellowColor, - snackPosition: SnackPosition.BOTTOM, - ); + mySnackbarSuccess("The order has been accepted by another driver.".tr); } else if (message.notification!.title! == 'Order') { if (Platform.isAndroid) { notificationController.showNotification( diff --git a/lib/controller/firebase/local_notification.dart b/lib/controller/firebase/local_notification.dart index 1f16930..c689aad 100644 --- a/lib/controller/firebase/local_notification.dart +++ b/lib/controller/firebase/local_notification.dart @@ -230,7 +230,7 @@ class NotificationController extends GetxController { }); } - void scheduleDailyNotifications( + void scheduleNotificationsForSevenDays( String title, String message, String tone) async { final AndroidNotificationDetails android = AndroidNotificationDetails( 'high_importance_channel', @@ -262,47 +262,72 @@ class NotificationController extends GetxController { } } - // Schedule notifications for 10:00 AM and 3:00 PM daily - await _scheduleNotificationForTime(7, 0, title, message, details); - await _scheduleNotificationForTime(13, 0, title, message, details); - await _scheduleNotificationForTime(18, 0, title, message, details); - // await _scheduleNotificationForTime(0, 22, title, message, details); + // Schedule notifications for the next 7 days + for (int day = 0; day < 7; day++) { + // Schedule for 8:00 AM + await _scheduleNotificationForTime( + day, 7, 0, title, message, details, day * 1000 + 1); // Unique ID - print('Daily notifications scheduled successfully'); + await _scheduleNotificationForTime( + day, 10, 14, title, message, details, day * 1000 + 2); // Unique ID + + // Schedule for 3:00 PM + await _scheduleNotificationForTime( + day, 13, 0, title, message, details, day * 1000 + 3); // Unique ID + + // Schedule for 8:00 PM + await _scheduleNotificationForTime( + day, 20, 0, title, message, details, day * 1000 + 4); // Unique ID + } + + print('Notifications scheduled successfully for the next 7 days'); } -// Helper function to get the next instance of a specific hour and minute - Future _scheduleNotificationForTime(int hour, int minute, String title, - String message, NotificationDetails details) async { + Future _scheduleNotificationForTime( + int dayOffset, + int hour, + int minute, + String title, + String message, + NotificationDetails details, + int notificationId, + ) async { // Initialize and set Cairo timezone tz.initializeTimeZones(); - final cairoLocation = tz.getLocation('Africa/Cairo'); // Set Cairo timezone + var cairoLocation = tz.getLocation('Africa/Cairo'); - final now = tz.TZDateTime.now( - cairoLocation); // Use Cairo timezone for the current time + final now = tz.TZDateTime.now(cairoLocation); tz.TZDateTime scheduledDate = tz.TZDateTime( - cairoLocation, now.year, now.month, now.day, hour, minute); + cairoLocation, + now.year, + now.month, + now.day + dayOffset, // Add offset to schedule for the next days + hour, + minute, + ); - // If scheduled time is already past today, schedule it for the next day + // If the scheduled time is in the past, move it to the next day if (scheduledDate.isBefore(now)) { - scheduledDate = scheduledDate.add(const Duration(days: 1)); + scheduledDate = scheduledDate.add(Duration(days: 1)); } print('Current time (Cairo): $now'); print('Scheduling notification for: $scheduledDate'); await _flutterLocalNotificationsPlugin.zonedSchedule( - 0, // Use unique IDs if you want to manage each notification separately + notificationId, // Unique ID for each notification title, message, scheduledDate, details, - androidAllowWhileIdle: true, + androidScheduleMode: AndroidScheduleMode.exact, uiLocalNotificationDateInterpretation: UILocalNotificationDateInterpretation.absoluteTime, - matchDateTimeComponents: DateTimeComponents.time, + matchDateTimeComponents: + null, // Don't repeat automatically; we handle 7 days manually ); - print('Notification scheduled successfully for Cairo timezone'); + + print('Notification scheduled successfully for: $scheduledDate'); } void scheduleNotificationEvery10Hours( diff --git a/lib/controller/firebase/order_lay.dart b/lib/controller/firebase/order_lay.dart index 7d5dc75..90e2938 100644 --- a/lib/controller/firebase/order_lay.dart +++ b/lib/controller/firebase/order_lay.dart @@ -1,10 +1,8 @@ import 'package:SEFER/constant/links.dart'; import 'package:SEFER/controller/functions/crud.dart'; import 'package:SEFER/views/home/Captin/home_captain/home_captin.dart'; -import 'package:SEFER/views/home/Captin/orderCaptin/order_request_page.dart'; import 'package:SEFER/views/widgets/elevated_btn.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; class OverlayContent1 extends StatelessWidget { @override diff --git a/lib/controller/functions/crud.dart b/lib/controller/functions/crud.dart index aaed62b..d0ee70c 100644 --- a/lib/controller/functions/crud.dart +++ b/lib/controller/functions/crud.dart @@ -231,9 +231,9 @@ class CRUD { ); Log.print('response: ${response.request}'); Log.print('response: ${response.body}'); - Log.print('response: ${response.statusCode}'); - Log.print('response: ${response.reasonPhrase}'); - Log.print('response: ${payload}'); + // Log.print('response: ${response.statusCode}'); + // Log.print('response: ${response.reasonPhrase}'); + // Log.print('response: ${payload}'); var jsonData = jsonDecode(response.body); if (response.statusCode == 200) { if (jsonData['status'] == 'success') { diff --git a/lib/controller/functions/gemeni.dart b/lib/controller/functions/gemeni.dart index 8b520b2..517ef49 100644 --- a/lib/controller/functions/gemeni.dart +++ b/lib/controller/functions/gemeni.dart @@ -10,6 +10,7 @@ import 'package:SEFER/controller/functions/crud.dart'; import 'package:SEFER/controller/functions/device_info.dart'; import 'package:SEFER/main.dart'; import 'package:SEFER/views/home/Captin/home_captain/home_captin.dart'; +import 'package:SEFER/views/widgets/error_snakbar.dart'; import 'package:SEFER/views/widgets/mydialoug.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; @@ -63,11 +64,9 @@ class AI extends GetxController { if (res != 'failure') { isInviteDriverFound = true; update(); - Get.snackbar("Code approved".tr, '', - backgroundColor: AppColor.greenColor); + mySnackbarSuccess("Code approved".tr); } else { - Get.snackbar("Code not approved".tr, '', - backgroundColor: AppColor.redColor); + mySnackeBarError("Code not approved".tr); } } } @@ -80,11 +79,9 @@ class AI extends GetxController { if (res != 'failure') { isInviteDriverFound = true; update(); - Get.snackbar("Code approved".tr, '', - backgroundColor: AppColor.greenColor); + mySnackbarSuccess("Code approved".tr); } else { - Get.snackbar("Code not approved".tr, '', - backgroundColor: AppColor.redColor); + mySnackeBarError("Code not approved".tr); } } } @@ -386,18 +383,17 @@ class AI extends GetxController { CRUD().post( link: '${AppLink.seferAlexandriaServer}/auth/captin/register.php', payload: payload); - Get.snackbar('Success', 'Driver data saved successfully', - backgroundColor: AppColor.greenColor); + mySnackbarSuccess('Driver data saved successfully'); } else { - Get.snackbar('Error'.tr, - '${'Failed to save driver data'.tr}: ${status1['message']}', - backgroundColor: Colors.red); + mySnackeBarError( + '${'Failed to save driver data'.tr}: ${status1['message']}'); } } catch (e) { isLoading = false; update(); - Get.snackbar('Error'.tr, 'An error occurred while saving driver data'.tr, - backgroundColor: Colors.red); + mySnackeBarError( + 'An error occurred while saving driver data'.tr, + ); } } @@ -408,7 +404,7 @@ class AI extends GetxController { "InspectionResult": responseCriminalRecordEgypt['InspectionResult'], }); if (res != 'failure') { - Get.snackbar('uploaded sucssefuly'.tr, ''); + mySnackbarSuccess('uploaded sucssefuly'.tr); } } @@ -439,8 +435,7 @@ class AI extends GetxController { var status = jsonDecode(res); if (status['status'] == 'success') { isCarSaved = true; - Get.snackbar('Success', 'message', - backgroundColor: AppColor.greenColor); + mySnackbarSuccess(''); CRUD().post( link: '${AppLink.seferAlexandriaServer}/ride/RegisrationCar/add.php', @@ -979,8 +974,7 @@ class AI extends GetxController { update(); } else { - Get.snackbar('Error', "JSON string not found", - backgroundColor: AppColor.redColor); + mySnackeBarError("JSON string not found"); } // Rest of your code... diff --git a/lib/controller/functions/log_out.dart b/lib/controller/functions/log_out.dart index b13a267..00e4add 100644 --- a/lib/controller/functions/log_out.dart +++ b/lib/controller/functions/log_out.dart @@ -1,6 +1,7 @@ import 'dart:io'; import 'package:SEFER/views/home/on_boarding_page.dart'; +import 'package:SEFER/views/widgets/error_snakbar.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:SEFER/constant/box_name.dart'; @@ -174,9 +175,9 @@ class LogOutController extends GetxController { 'email': box.read(BoxName.email), }); } else { - Get.snackbar('Email Wrong'.tr, 'Email you inserted is Wrong.'.tr, - snackPosition: SnackPosition.BOTTOM, - backgroundColor: AppColor.redColor); + mySnackeBarError( + 'Email you inserted is Wrong.'.tr, + ); } } } diff --git a/lib/controller/functions/tts.dart b/lib/controller/functions/tts.dart index 058184b..068dab9 100644 --- a/lib/controller/functions/tts.dart +++ b/lib/controller/functions/tts.dart @@ -1,5 +1,6 @@ import 'package:SEFER/constant/box_name.dart'; import 'package:SEFER/main.dart'; +import 'package:SEFER/views/widgets/error_snakbar.dart'; import 'package:flutter/material.dart'; import 'package:flutter_tts/flutter_tts.dart'; import 'package:get/get.dart'; @@ -45,8 +46,7 @@ class TextToSpeechController extends GetxController { update(); } } catch (error) { - // Handle error gracefully, e.g., show a message - Get.snackbar('Error', 'Failed to speak text: $error'); + mySnackeBarError('Failed to speak text: $error'); } } } diff --git a/lib/controller/functions/upload_image.dart b/lib/controller/functions/upload_image.dart index f2d11cf..b521459 100644 --- a/lib/controller/functions/upload_image.dart +++ b/lib/controller/functions/upload_image.dart @@ -1,6 +1,7 @@ import 'dart:convert'; import 'dart:io'; import 'package:SEFER/constant/api_key.dart'; +import 'package:SEFER/views/widgets/error_snakbar.dart'; import 'package:get/get.dart'; import 'package:http/http.dart' as http; import 'package:image_cropper/image_cropper.dart'; @@ -152,8 +153,9 @@ class ImageController extends GetxController { ); } catch (e) { print('Error in choosImage: $e'); - Get.snackbar('Image Upload Failed'.tr, e.toString(), - backgroundColor: AppColor.primaryColor); + mySnackeBarError('Image Upload Failed'.tr); + // Get.snackbar('Image Upload Failed'.tr, e.toString(), + // backgroundColor: AppColor.primaryColor); } finally { isloading = false; update(); @@ -211,8 +213,9 @@ class ImageController extends GetxController { ); } catch (e) { print('Error in choosImage: $e'); - Get.snackbar('Image Upload Failed'.tr, e.toString(), - backgroundColor: AppColor.primaryColor); + // Get.snackbar('Image Upload Failed'.tr, e.toString(), + // backgroundColor: AppColor.primaryColor); + mySnackeBarError('Image Upload Failed'.tr); } finally { isloading = false; update(); @@ -287,8 +290,9 @@ class ImageController extends GetxController { link, ); } catch (e) { - Get.snackbar('Image Upload Failed'.tr, e.toString(), - backgroundColor: AppColor.redColor); + mySnackeBarError('Image Upload Failed'.tr); + // Get.snackbar('Image Upload Failed'.tr, e.toString(), + // backgroundColor: AppColor.redColor); } finally { isloading = false; update(); @@ -420,8 +424,9 @@ class ImageController extends GetxController { link, ); } catch (e) { - Get.snackbar('Image Upload Failed'.tr, e.toString(), - backgroundColor: AppColor.redColor); + mySnackeBarError('Image Upload Failed'.tr); + // Get.snackbar('Image Upload Failed'.tr, e.toString(), + // backgroundColor: AppColor.redColor); } finally { isloading = false; update(); diff --git a/lib/controller/home/captin/help/assurance_controller.dart b/lib/controller/home/captin/help/assurance_controller.dart index e6c81e4..9b14b02 100644 --- a/lib/controller/home/captin/help/assurance_controller.dart +++ b/lib/controller/home/captin/help/assurance_controller.dart @@ -4,6 +4,7 @@ import 'package:SEFER/constant/box_name.dart'; import 'package:SEFER/constant/links.dart'; import 'package:SEFER/controller/functions/crud.dart'; import 'package:SEFER/main.dart'; +import 'package:SEFER/views/widgets/error_snakbar.dart'; import 'package:get/get.dart'; import '../../../../constant/colors.dart'; @@ -43,20 +44,13 @@ class AssuranceHealthController extends GetxController { if (response != 'failure') { // Handle success (e.g., show a success message) - print("Health assurance data saved successfully"); - Get.snackbar( - "Success".tr, - "You have successfully opted for health insurance.".tr, - backgroundColor: AppColor.greenColor, - ); + + mySnackbarSuccess( + "You have successfully opted for health insurance.".tr); } else { // Handle failure (e.g., show an error message) print("Failed to save health assurance data"); - Get.snackbar( - "Error".tr, - "Please enter a health insurance status.".tr, - backgroundColor: AppColor.redColor, - ); + mySnackeBarError("Please enter a health insurance status.".tr); } } catch (e) { // Handle any errors diff --git a/lib/controller/home/captin/help/video_controller.dart b/lib/controller/home/captin/help/video_controller.dart index 6f57f8c..e9c9c60 100644 --- a/lib/controller/home/captin/help/video_controller.dart +++ b/lib/controller/home/captin/help/video_controller.dart @@ -3,6 +3,7 @@ import 'dart:convert'; import 'package:SEFER/constant/links.dart'; import 'package:SEFER/controller/functions/crud.dart'; import 'package:SEFER/print.dart'; +import 'package:SEFER/views/widgets/error_snakbar.dart'; import 'package:get/get.dart'; import 'package:video_player/video_player.dart'; @@ -57,10 +58,10 @@ class VideoController extends GetxController { // Log.print('videos: ${videos}'); update(); } else { - Get.snackbar('Error'.tr, ''); + mySnackeBarError(''); } } catch (e) { - Get.snackbar("Error", e.toString()); + mySnackeBarError(e.toString()); } finally { isLoading(false); } diff --git a/lib/controller/home/captin/home_captain_controller.dart b/lib/controller/home/captin/home_captain_controller.dart index 7434d14..e772c48 100644 --- a/lib/controller/home/captin/home_captain_controller.dart +++ b/lib/controller/home/captin/home_captain_controller.dart @@ -302,13 +302,13 @@ class HomeCaptainController extends GetxController { 'token': box.read(BoxName.tokenDriver), 'captain_id': box.read(BoxName.driverID).toString() }); - CRUD().post( + await CRUD().post( link: "${AppLink.seferAlexandriaServer}/ride/firebase/addDriver.php", payload: { 'token': box.read(BoxName.tokenDriver), 'captain_id': box.read(BoxName.driverID).toString() }); - CRUD().post( + await CRUD().post( link: "${AppLink.seferGizaServer}/ride/firebase/addDriver.php", payload: { 'token': box.read(BoxName.tokenDriver), diff --git a/lib/controller/home/captin/map_driver_controller.dart b/lib/controller/home/captin/map_driver_controller.dart index e4ff59b..dade0c3 100644 --- a/lib/controller/home/captin/map_driver_controller.dart +++ b/lib/controller/home/captin/map_driver_controller.dart @@ -551,7 +551,8 @@ class MapDriverController extends GetxController { ); MyDialog().getDialog('Are you sure to exit ride ?'.tr, '', () { if (distanceToDestination > 900 || - (double.parse(distance) < 1000 && distanceToDestination > 150)) { + (double.parse(distance.toString()) < 1000 && + distanceToDestination > 150)) { Get.back(); finishRideFromDriver1(); } else { @@ -611,16 +612,17 @@ class MapDriverController extends GetxController { paymentAmount = totalCost; box.write(BoxName.statusDriverLocation, 'off'); // changeRideToBeginToPassenger(); - await CRUD() - .post(link: "${AppLink.seferCairoServer}/rides/update.php", payload: { - 'id': rideId, - 'rideTimeFinish': DateTime.now().toString(), - 'status': 'Finished', - 'price': totalCost, - }); + await CRUD().post( + link: "${AppLink.seferCairoServer}/ride/rides/update.php", + payload: { + 'id': rideId, + 'rideTimeFinish': DateTime.now().toString(), + 'status': 'Finished', + 'price': totalCost, + }); if (AppLink.endPoint != AppLink.seferCairoServer) { CRUD().post( - link: "${AppLink.endPoint}/rides/update.php", + link: "${AppLink.endPoint}/ride/rides/update.php", payload: { 'id': rideId, 'rideTimeFinish': DateTime.now().toString(), diff --git a/lib/controller/home/payment/captain_wallet_controller.dart b/lib/controller/home/payment/captain_wallet_controller.dart index 9347b1e..9f004b0 100644 --- a/lib/controller/home/payment/captain_wallet_controller.dart +++ b/lib/controller/home/payment/captain_wallet_controller.dart @@ -4,6 +4,7 @@ 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/error_snakbar.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:SEFER/constant/box_name.dart'; @@ -81,22 +82,10 @@ class CaptainWalletController extends GetxController { amountToNewDriverMap = d['data']; // update(); } else { - Get.snackbar( - "This driver is not registered".tr, - '', - duration: const Duration(seconds: 3), - backgroundColor: AppColor.redColor, - snackPosition: SnackPosition.BOTTOM, - ); + mySnackeBarError("This driver is not registered".tr); } } else { - Get.snackbar( - 'Your Budget less than needed'.tr, - '', - duration: const Duration(seconds: 3), - backgroundColor: AppColor.redColor, - snackPosition: SnackPosition.BOTTOM, - ); + mySnackeBarError('Your Budget less than needed'.tr); } } } diff --git a/lib/controller/home/payment/paymob_payout.dart b/lib/controller/home/payment/paymob_payout.dart index 0420a7c..513d7ac 100644 --- a/lib/controller/home/payment/paymob_payout.dart +++ b/lib/controller/home/payment/paymob_payout.dart @@ -5,6 +5,7 @@ import 'package:SEFER/constant/box_name.dart'; import 'package:SEFER/constant/colors.dart'; import 'package:SEFER/main.dart'; import 'package:SEFER/print.dart'; +import 'package:SEFER/views/widgets/error_snakbar.dart'; import 'package:get/get.dart'; import 'package:http/http.dart' as http; import 'package:secure_string_operations/secure_string_operations.dart'; @@ -91,14 +92,11 @@ class PaymobPayout extends GetxController { 'Wallet', box.read(BoxName.emailDriver).toString()); - Get.snackbar('Transaction successful'.tr, - '${'Transaction successful'.tr} ${dec['amount']}', - backgroundColor: AppColor.greenColor); + mySnackbarSuccess('${'Transaction successful'.tr} ${dec['amount']}'); Get.find().refreshCaptainWallet(); } else if (dec['disbursement_status'] == 'failed') { - Get.snackbar('Transaction failed'.tr, 'Transaction failed'.tr, - backgroundColor: AppColor.redColor); + mySnackeBarError('Transaction failed'.tr); } } @@ -175,14 +173,10 @@ class PaymobPayout extends GetxController { 'Wallet', box.read(BoxName.emailDriver).toString()); - Get.snackbar('Transaction successful'.tr, - '${'Transaction successful'.tr} ${dec['amount']}', - backgroundColor: AppColor.greenColor); - + mySnackbarSuccess('${'Transaction successful'.tr} ${dec['amount']}'); Get.find().refreshCaptainWallet(); } else if (dec['disbursement_status'] == 'failed') { - Get.snackbar('Transaction failed'.tr, 'Transaction failed'.tr, - backgroundColor: AppColor.redColor); + mySnackeBarError('Transaction failed'.tr); } } diff --git a/lib/controller/local/translations.dart b/lib/controller/local/translations.dart index 62ac7bf..fc8f915 100644 --- a/lib/controller/local/translations.dart +++ b/lib/controller/local/translations.dart @@ -197,7 +197,13 @@ class MyTranslation extends Translations { "Choose from contact": "اختر من جهات الاتصال", "Cancel": "إلغاء", "Open App": "افتح التطبيق", - "Add new car": "أضف سيارة جديدة", + "Ok I will go now.": "حسنًا، سأذهب الآن.", + "Hi, I will go now": "مرحبًا، سأذهب الآن.", + "Add new car": "أضف سيارة جديدة", "Rate Our App": "قيّم تطبيقنا", + "How would you rate our app?": "كيف تقيم تطبيقنا؟", + "write comment here": "اكتب تعليقك هنا", + "Submit Rating": "إرسال التقييم", + "Rating submitted successfully": "تم إرسال التقييم بنجاح", "Open the app to stay updated and ready for upcoming tasks.": "افتح التطبيق لتبقى على اطلاع واستعداد للمهام القادمة.", "No invitation found": "لم يتم العثور على دعوة", diff --git a/lib/controller/payment/payment_controller.dart b/lib/controller/payment/payment_controller.dart index 04a33d2..04b49fc 100644 --- a/lib/controller/payment/payment_controller.dart +++ b/lib/controller/payment/payment_controller.dart @@ -4,6 +4,7 @@ import 'package:SEFER/constant/style.dart'; import 'package:SEFER/controller/functions/tts.dart'; import 'package:SEFER/controller/payment/paymob/paymob_response.dart'; import 'package:SEFER/views/widgets/elevated_btn.dart'; +import 'package:SEFER/views/widgets/error_snakbar.dart'; import 'package:http/http.dart' as http; import 'package:flutter/material.dart'; import 'package:flutter_paypal/flutter_paypal.dart'; @@ -396,7 +397,8 @@ class PaymentController extends GetxController { 'accountBank': box.read(BoxName.accountIdStripeConnect), }); if (jsonDecode(res)['status'] == 'success') { - Get.snackbar('Account Updated', ''); + mySnackbarSuccess('Account Updated'.tr); + // Get.snackbar('Account Updated', ''); } } @@ -589,11 +591,12 @@ class PaymentController extends GetxController { billingData: PaymobBillingDataWallet(), onPayment: (PaymobResponseWallet response) {}, ); - // Log.print('message: ${response!.message}'); - // Log.print('responseCode: ${response.responseCode}'); - // Log.print('success: ${response.success}'); - // Log.print('transactionID: ${response.transactionID}'); - if (response!.responseCode == '200' && response.success == true) { + Log.print('message: ${response!.message}'); + Log.print('responseCode: ${response.responseCode}'); + Log.print('success: ${response.success}'); + Log.print('transactionID: ${response.transactionID}'); + if (response.responseCode.toString() == '200' && + response.success == true) { // Log.print('transactionID wewer: ${response.transactionID}'); Toast.show(context, 'Payment Successful'.tr, AppColor.greenColor); method(); diff --git a/lib/controller/rate/rate_app_controller.dart b/lib/controller/rate/rate_app_controller.dart new file mode 100644 index 0000000..862fad6 --- /dev/null +++ b/lib/controller/rate/rate_app_controller.dart @@ -0,0 +1,97 @@ +import 'dart:convert'; + +import 'package:SEFER/constant/box_name.dart'; +import 'package:SEFER/constant/colors.dart'; +import 'package:SEFER/constant/links.dart'; +import 'package:SEFER/controller/functions/crud.dart'; +import 'package:SEFER/main.dart'; +import 'package:SEFER/views/widgets/error_snakbar.dart'; +import 'package:SEFER/views/widgets/mydialoug.dart'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +// Import url_launcher to open the app store +import 'package:url_launcher/url_launcher.dart'; + +class RatingController extends GetxController { + var userRating = 0.obs; + final comment = TextEditingController(); + void submitRating(int rating) { + userRating.value = rating; + + _saveRating(rating); + } + + void _redirectToAppStore() async { + // URLs for App Store and Google Play Store + const appStoreUrl = 'https://apps.apple.com/app/6502189302'; + const playStoreUrl = + 'https://play.google.com/store/apps/details?id=com.sefer_driver'; + final url = GetPlatform.isIOS ? appStoreUrl : playStoreUrl; + + if (await launchUrl(Uri.parse(url))) { + await launchUrl(Uri.parse(url)); + } else { + mySnackeBarError("Could not open the app store."); + } + } + + Future _saveRating(int rating) async { + // Build the payload with user data + final payload = { + "name": box.read(BoxName.driverID) != null + ? box.read(BoxName.nameDriver) + : box.read(BoxName.name), + "email": box.read(BoxName.driverID) == null + ? box.read(BoxName.email).toString() + : box.read(BoxName.emailDriver).toString(), + "phone": box.read(BoxName.driverID) == null + ? box.read(BoxName.phone) + : box.read(BoxName.phoneDriver), + "userId": box.read(BoxName.driverID) ?? box.read(BoxName.passengerID), + "userType": box.read(BoxName.driverID) != null ? "driver" : "passenger", + "rating": rating.toString(), + "comment": comment.text.isEmpty + ? 'nothing' + : comment.text, // Get actual text from comment controller + }; + + // Send the rating data to the backend + var res = await CRUD().post(link: AppLink.addRateApp, payload: payload); + + // Handle the response and check if it's JSON-formatted + if (res != 'failure') { + try { + // Attempt to parse the response as JSON + final parsedResponse = jsonDecode(res); + + if (parsedResponse['status'] == 'success') { + // Display a success message + await CRUD().post(link: AppLink.sendEmailRateingApp, payload: { + "name": payload["name"], + "email": payload["email"], + "rating": rating.toString(), + "comment": payload["comment"], + }); + MyDialog().getDialog('Rating submitted successfully'.tr, '', () { + if (rating == 5) { + Get.back(); + _redirectToAppStore(); + } else { + Get.back(); + } + }); + + // Send confirmation email if the rating was successfully submitted + } else { + mySnackeBarError('Failed to submit rating'); + } + } catch (e) { + // If JSON decoding fails, log the response directly + // Get.snackbar('Success', 'Rating submitted successfully', + // backgroundColor: AppColor.greenColor); + } + } else { + mySnackeBarError('Failed to connect to the server'); + } + } +} diff --git a/lib/controller/rate/rate_conroller.dart b/lib/controller/rate/rate_conroller.dart index 81669c8..4cd172d 100644 --- a/lib/controller/rate/rate_conroller.dart +++ b/lib/controller/rate/rate_conroller.dart @@ -2,6 +2,7 @@ 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/payment/payment_controller.dart'; +import 'package:SEFER/views/widgets/error_snakbar.dart'; import 'package:flutter/cupertino.dart'; import 'package:get/get.dart'; import 'package:SEFER/constant/box_name.dart'; @@ -54,8 +55,7 @@ class RateController extends GetxController { 'token': paymentToken2, }).then((value) async { if (value != 'failure') { - Get.snackbar('Wallet Added'.tr, '', - backgroundColor: AppColor.greenColor); + mySnackbarSuccess('Wallet Added'.tr); // if (double.parse( // Get.find().totalAmountVisa) > // remainingFee) { diff --git a/lib/main.dart b/lib/main.dart index 5b16a68..1f0421b 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -130,6 +130,8 @@ void main() async { } if (Platform.isAndroid || Platform.isIOS) { + NotificationController notificationController = + Get.put(NotificationController()); await Firebase.initializeApp( options: DefaultFirebaseOptions.currentPlatform, ); @@ -141,8 +143,7 @@ void main() async { // if (Platform.isAndroid) { // await Get.put(NotificationController()).initNotifications(); // } - NotificationController notificationController = - Get.put(NotificationController()); + await notificationController.initNotifications(); // Generate a random index to pick a message @@ -150,7 +151,7 @@ void main() async { final randomMessage = driverMessages[random.nextInt(driverMessages.length)]; // Schedule the notification with the random message - notificationController.scheduleDailyNotifications( + notificationController.scheduleNotificationsForSevenDays( randomMessage.split(':')[0], randomMessage.split(':')[1], "ding", diff --git a/lib/splash_screen_page.dart b/lib/splash_screen_page.dart index 59ef7b1..0bf8e5a 100644 --- a/lib/splash_screen_page.dart +++ b/lib/splash_screen_page.dart @@ -6,7 +6,6 @@ import 'package:SEFER/constant/colors.dart'; import 'package:SEFER/constant/info.dart'; import 'package:SEFER/constant/style.dart'; -import 'controller/functions/location_background_controller.dart'; import 'controller/home/splash_screen_controlle.dart'; import 'main.dart'; diff --git a/lib/views/Rate/rate_app_page.dart b/lib/views/Rate/rate_app_page.dart new file mode 100644 index 0000000..5ab1402 --- /dev/null +++ b/lib/views/Rate/rate_app_page.dart @@ -0,0 +1,86 @@ +import 'package:SEFER/views/widgets/elevated_btn.dart'; +import 'package:SEFER/views/widgets/my_textField.dart'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import '../../controller/rate/rate_app_controller.dart'; + +class RatingScreen extends StatelessWidget { + // Initialize the RatingController using GetX for state management + final RatingController ratingController = Get.put(RatingController()); + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + // Display title "Rate Our App", with .tr for localization support + title: Text("Rate Our App".tr), + ), + body: Center( + child: Obx(() { + // Observe changes in userRating; when updated, rebuild the UI accordingly + return Padding( + padding: const EdgeInsets.all(8.0), + child: ListView( + // mainAxisAlignment: + // MainAxisAlignment.center, // Center content vertically + children: [ + ClipRRect( + borderRadius: BorderRadius.circular(15), + child: Image.asset('assets/images/logo.gif')), + const SizedBox(height: 10), + // Text prompt asking the user to rate the app, with localization support + Text("How would you rate our app?".tr), + const SizedBox(height: 10), // Vertical spacing between elements + MyTextForm( + controller: ratingController.comment, + label: 'write comment here'.tr, + hint: 'write comment here'.tr, + type: TextInputType.name, + ), + // Build and display the row of rating stars + _buildRatingStars(), + + const SizedBox( + height: 20), // Additional spacing before the button + + // Button to submit the selected rating + MyElevatedButton( + onPressed: () { + // Calls submitRating() method in the controller with the current rating value + ratingController + .submitRating(ratingController.userRating.value); + }, + // Button text "Submit Rating" with localization support + title: "Submit Rating".tr, + ), + ], + ), + ); + }), + ), + ); + } + + // Widget function to display a row of clickable star icons for rating + Widget _buildRatingStars() { + return Row( + mainAxisAlignment: + MainAxisAlignment.center, // Center-aligns stars horizontally + children: List.generate(5, (index) { + return IconButton( + // Display a star icon, filled if selected, otherwise grey + icon: Icon( + Icons.star, + color: index < ratingController.userRating.value + ? Colors.orange // Orange for selected stars + : Colors.grey, // Grey for unselected stars + ), + onPressed: () { + // Update user rating in the controller when a star is clicked + ratingController.userRating.value = index + 1; + }, + ); + }), + ); + } +} diff --git a/lib/views/auth/captin/cards/sms_signup.dart b/lib/views/auth/captin/cards/sms_signup.dart index 889315a..c7a8533 100644 --- a/lib/views/auth/captin/cards/sms_signup.dart +++ b/lib/views/auth/captin/cards/sms_signup.dart @@ -1,3 +1,4 @@ +import 'package:SEFER/constant/colors.dart'; import 'package:SEFER/constant/style.dart'; import 'package:SEFER/controller/auth/captin/register_captin_controller.dart'; import 'package:SEFER/views/widgets/elevated_btn.dart'; @@ -7,6 +8,8 @@ import 'package:SEFER/views/widgets/mycircular.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; +import '../../../Rate/rate_app_page.dart'; + class SmsSignupEgypt extends StatelessWidget { SmsSignupEgypt({super.key}); @@ -102,6 +105,15 @@ class SmsSignupEgypt extends StatelessWidget { title: 'Submit'.tr, ), ), + Padding( + padding: const EdgeInsets.all(16.0), + child: MyElevatedButton( + kolor: AppColor.yellowColor, + title: "Rate Our App".tr, + onPressed: () { + Get.to(RatingScreen()); + }), + ) ], ); }), diff --git a/lib/views/auth/captin/driver_car_controller.dart b/lib/views/auth/captin/driver_car_controller.dart index 04fad6c..47f72f3 100644 --- a/lib/views/auth/captin/driver_car_controller.dart +++ b/lib/views/auth/captin/driver_car_controller.dart @@ -5,6 +5,7 @@ import 'package:SEFER/constant/colors.dart'; import 'package:SEFER/constant/links.dart'; import 'package:SEFER/controller/functions/crud.dart'; import 'package:SEFER/main.dart'; +import 'package:SEFER/views/widgets/error_snakbar.dart'; import 'package:get/get.dart'; class DriverCarController extends GetxController { @@ -60,10 +61,11 @@ class DriverCarController extends GetxController { }, ); if (res != 'failure') { - Get.snackbar('Success'.tr, '', backgroundColor: AppColor.greenColor); + mySnackbarSuccess(''); + fetchCatrsForDrivers(); } else { - Get.snackbar('Error'.tr, '', backgroundColor: AppColor.redColor); + mySnackeBarError(''); } } diff --git a/lib/views/auth/captin/invite_driver_screen.dart b/lib/views/auth/captin/invite_driver_screen.dart index 5ebbe63..3cca4d6 100644 --- a/lib/views/auth/captin/invite_driver_screen.dart +++ b/lib/views/auth/captin/invite_driver_screen.dart @@ -1,13 +1,11 @@ import 'package:SEFER/constant/box_name.dart'; import 'package:SEFER/constant/colors.dart'; import 'package:SEFER/main.dart'; -import 'package:SEFER/views/widgets/mydialoug.dart'; import 'package:flutter/material.dart'; import 'package:flutter/cupertino.dart'; import 'package:get/get.dart'; import '../../../controller/auth/captin/invit_controller.dart'; -import '../../widgets/elevated_btn.dart'; class InviteScreen extends StatelessWidget { final InviteController controller = Get.put(InviteController()); diff --git a/lib/views/auth/captin/login_captin.dart b/lib/views/auth/captin/login_captin.dart index dfc6d60..f702baa 100644 --- a/lib/views/auth/captin/login_captin.dart +++ b/lib/views/auth/captin/login_captin.dart @@ -1,8 +1,6 @@ import 'dart:io'; -import 'package:SEFER/controller/auth/facebook_login.dart'; import 'package:SEFER/views/auth/captin/contact_us_page.dart'; -import 'package:SEFER/views/widgets/my_textField.dart'; import 'package:firebase_auth/firebase_auth.dart'; import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; @@ -18,7 +16,6 @@ import '../../../constant/style.dart'; import '../../../controller/auth/apple_sigin.dart'; import '../../../controller/auth/captin/login_captin_controller.dart'; import '../../../controller/auth/google_sign.dart'; -import '../../../controller/functions/location_permission.dart'; import '../../../controller/functions/overlay_permisssion.dart'; import '../../../main.dart'; import '../../../print.dart'; diff --git a/lib/views/home/Captin/assurance_health_page.dart b/lib/views/home/Captin/assurance_health_page.dart index e37a574..872a6cd 100644 --- a/lib/views/home/Captin/assurance_health_page.dart +++ b/lib/views/home/Captin/assurance_health_page.dart @@ -1,5 +1,6 @@ import 'package:SEFER/constant/box_name.dart'; import 'package:SEFER/main.dart'; +import 'package:SEFER/views/widgets/error_snakbar.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; @@ -168,12 +169,15 @@ class AssuranceHealthPage extends StatelessWidget { Navigator.of(context) .pop(); // Just close the dialog // Optionally show feedback if the driver opts out - Get.snackbar( - "Opted out".tr, + // Get.snackbar( + // "Opted out".tr, + // "You have chosen not to proceed with health insurance." + // .tr, + // backgroundColor: + // CupertinoColors.systemGrey); + mySnackbarSuccess( "You have chosen not to proceed with health insurance." - .tr, - backgroundColor: - CupertinoColors.systemGrey); + .tr); }, ), ], diff --git a/lib/views/home/Captin/home_captain/drawer_captain.dart b/lib/views/home/Captin/home_captain/drawer_captain.dart index ec3acf3..90cde19 100644 --- a/lib/views/home/Captin/home_captain/drawer_captain.dart +++ b/lib/views/home/Captin/home_captain/drawer_captain.dart @@ -1,6 +1,7 @@ import 'package:SEFER/constant/api_key.dart'; import 'package:SEFER/constant/links.dart'; import 'package:SEFER/controller/home/captin/home_captain_controller.dart'; +import 'package:SEFER/views/Rate/rate_app_page.dart'; import 'package:SEFER/views/auth/captin/contact_us_page.dart'; import 'package:SEFER/views/auth/captin/invite_driver_screen.dart'; import 'package:SEFER/views/notification/available_rides_page.dart'; @@ -102,11 +103,18 @@ class CupertinoDrawerCaptain extends StatelessWidget { ), _buildDivider(), _buildDrawerItem( - icon: CupertinoIcons.settings, + icon: + Icons.play_circle_filled, // Icon representing video play text: 'Videos Tutorials'.tr, onTap: () => Get.to(() => VideoListPage()), ), _buildDivider(), + _buildDrawerItem( + icon: Icons.star, // Another option with a filled star icon + text: "Rate Our App".tr, + onTap: () => Get.to(() => RatingScreen()), + ), + _buildDivider(), _buildDrawerItem( icon: CupertinoIcons.settings, text: 'Settings'.tr, diff --git a/lib/views/home/Captin/home_captain/widget/left_menu_map_captain.dart b/lib/views/home/Captin/home_captain/widget/left_menu_map_captain.dart index 1a945e7..bf29453 100644 --- a/lib/views/home/Captin/home_captain/widget/left_menu_map_captain.dart +++ b/lib/views/home/Captin/home_captain/widget/left_menu_map_captain.dart @@ -1,26 +1,16 @@ -import 'dart:convert'; -import 'dart:math'; - import 'package:SEFER/constant/box_name.dart'; import 'package:SEFER/controller/firebase/local_notification.dart'; import 'package:SEFER/main.dart'; -import 'package:bubble_head/bubble.dart'; +import 'package:SEFER/views/home/Captin/orderCaptin/vip_order_page.dart'; import 'package:flutter/material.dart'; import 'package:flutter_font_icons/flutter_font_icons.dart'; import 'package:get/get.dart'; import 'package:SEFER/controller/home/captin/home_captain_controller.dart'; import 'package:google_maps_flutter/google_maps_flutter.dart'; -import 'package:timezone/data/latest.dart' as tz; -import 'package:timezone/timezone.dart' as tz; import '../../../../../constant/colors.dart'; -import '../../../../../constant/notification.dart'; -import '../../../../../controller/functions/audio_controller.dart'; -import '../../../../../print.dart'; import '../../../../Rate/ride_calculate_driver.dart'; import '../../../../../controller/functions/location_controller.dart'; -import '../../driver_map_page.dart'; -import '../../orderCaptin/order_speed_request.dart'; GetBuilder leftMainMenuCaptainIcons() { return GetBuilder( @@ -195,34 +185,13 @@ GetBuilder leftMainMenuCaptainIcons() { child: Builder(builder: (context) { return IconButton( onPressed: () async { - // NotificationController().showNotification( - // ' message.notification!.title.toString()', - // ' message.notification!.body.toString()', - // 'order', - // ''); - - NotificationController notificationController = - Get.put(NotificationController()); - await notificationController.initNotifications(); - final random = Random(); - final randomMessage = - driverMessages[random.nextInt(driverMessages.length)]; - Log.print( - ' randomMessage.split[0]: ${randomMessage.split(':')[0]}'); - Log.print( - ' randomMessage.split([1]: ${randomMessage.split(':')[1]}'); - // Schedule the notification with the random message - notificationController.showNotification( - randomMessage.split(':')[0], - randomMessage.split(':')[1], - "ding", - ''); - - // notificationController.scheduleNotificationEvery10Hours( - // "افتح التطبيق".tr, - // "افتح التطبيق لتبقى على اطلاع واستعداد للمهام القادمة.".tr, - // "ding", - // ); + // mySnakeBarError('ad'); + Get.to(() => VipOrderPage(), arguments: { + 'myListString': 'myListString', + 'DriverList': 'myList', + // 'PolylineJson': myPoints, + 'body': 'message.notification!.body' + }); }, icon: const Icon( FontAwesome5.window_close, diff --git a/lib/views/home/my_wallet/card_wallet_widget.dart b/lib/views/home/my_wallet/card_wallet_widget.dart index 41e4f43..c238fc5 100644 --- a/lib/views/home/my_wallet/card_wallet_widget.dart +++ b/lib/views/home/my_wallet/card_wallet_widget.dart @@ -1,11 +1,9 @@ -import 'package:SEFER/print.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import '../../../constant/box_name.dart'; import '../../../constant/colors.dart'; -import '../../../constant/info.dart'; import '../../../constant/style.dart'; import '../../../controller/home/payment/captain_wallet_controller.dart'; import '../../../controller/home/payment/paymob_payout.dart'; diff --git a/lib/views/home/my_wallet/walet_captain.dart b/lib/views/home/my_wallet/walet_captain.dart index f9dd1b5..fc285a2 100644 --- a/lib/views/home/my_wallet/walet_captain.dart +++ b/lib/views/home/my_wallet/walet_captain.dart @@ -4,6 +4,7 @@ import 'package:SEFER/controller/functions/tts.dart'; import 'package:SEFER/controller/home/payment/paymob_payout.dart'; import 'package:SEFER/views/home/my_wallet/bank_account_egypt.dart'; import 'package:SEFER/views/home/my_wallet/payment_history_driver_page.dart'; +import 'package:SEFER/views/widgets/error_snakbar.dart'; import 'package:SEFER/views/widgets/mydialoug.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; @@ -13,14 +14,12 @@ import 'package:SEFER/constant/colors.dart'; import 'package:SEFER/constant/info.dart'; import 'package:SEFER/constant/style.dart'; import 'package:SEFER/controller/home/payment/captain_wallet_controller.dart'; -import 'package:SEFER/controller/payment/payment_controller.dart'; import 'package:SEFER/main.dart'; import 'package:SEFER/views/widgets/elevated_btn.dart'; import 'package:SEFER/views/widgets/my_textField.dart'; import 'package:SEFER/views/widgets/mycircular.dart'; import '../../../controller/payment/driver_payment_controller.dart'; -import '../../../print.dart'; import '../../widgets/my_scafold.dart'; import 'card_wallet_widget.dart'; import 'points_captain.dart'; @@ -380,10 +379,8 @@ class WalletCaptain extends StatelessWidget { await controller.payFromBudget(); } else { Get.back(); - Get.snackbar('Your Budget less than needed'.tr, '', - duration: const Duration(seconds: 3), - backgroundColor: AppColor.redColor, - snackPosition: SnackPosition.BOTTOM); + + mySnackeBarError('Your Budget less than needed'.tr); } }, ), @@ -405,8 +402,8 @@ class WalletCaptain extends StatelessWidget { if (double.parse(controller.totalAmountVisa) > 15) { Get.to(() => const TransferBudgetPage()); } else { - Get.snackbar( - "You don't have enough money in your SEFER wallet".tr, ''); + mySnackeBarError( + "You don't have enough money in your SEFER wallet".tr); } }, ); @@ -507,9 +504,7 @@ Future addBankCodeEgypt( }); print('res: ${res}'); if (res != 'failure') { - Get.snackbar( - 'updated succses'.tr, 'bank account added succesfly', - backgroundColor: AppColor.greenColor); + mySnackbarSuccess('bank account added succesfly'.tr); } } })); diff --git a/lib/views/home/profile/cars_inserting_page.dart b/lib/views/home/profile/cars_inserting_page.dart index 2af3b11..21056ef 100644 --- a/lib/views/home/profile/cars_inserting_page.dart +++ b/lib/views/home/profile/cars_inserting_page.dart @@ -1,4 +1,3 @@ -import 'package:SEFER/splash_screen_page.dart'; import 'package:SEFER/views/widgets/elevated_btn.dart'; import 'package:SEFER/views/widgets/my_scafold.dart'; import 'package:flutter/material.dart'; diff --git a/lib/views/home/profile/passenger_profile_page.dart b/lib/views/home/profile/passenger_profile_page.dart index 59d5ad1..da8a268 100644 --- a/lib/views/home/profile/passenger_profile_page.dart +++ b/lib/views/home/profile/passenger_profile_page.dart @@ -1,5 +1,3 @@ -import 'package:SEFER/controller/auth/captin/login_captin_controller.dart'; -import 'package:SEFER/views/auth/captin/login_captin.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; diff --git a/lib/views/notification/notification_captain.dart b/lib/views/notification/notification_captain.dart index 6ede68d..cb379db 100644 --- a/lib/views/notification/notification_captain.dart +++ b/lib/views/notification/notification_captain.dart @@ -2,7 +2,6 @@ import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:SEFER/controller/notification/notification_captain_controller.dart'; import 'package:flutter/cupertino.dart'; -import 'package:get/get.dart'; class NotificationCaptain extends StatelessWidget { const NotificationCaptain({Key? key}) : super(key: key); diff --git a/lib/views/widgets/error_snakbar.dart b/lib/views/widgets/error_snakbar.dart new file mode 100644 index 0000000..8b7e73b --- /dev/null +++ b/lib/views/widgets/error_snakbar.dart @@ -0,0 +1,69 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +import '../../constant/colors.dart'; + +SnackbarController mySnackeBarError(String message) { + return Get.snackbar( + 'Error'.tr, + message, + backgroundColor: AppColor.redColor.withOpacity(0.9), + colorText: AppColor.secondaryColor, + icon: const Icon(Icons.error, color: AppColor.secondaryColor), + shouldIconPulse: true, + snackPosition: SnackPosition.TOP, + margin: const EdgeInsets.all(10), + borderRadius: 10, + animationDuration: const Duration(milliseconds: 500), + forwardAnimationCurve: Curves.easeOutBack, + reverseAnimationCurve: Curves.easeInBack, + titleText: Text( + 'Error'.tr, + style: const TextStyle( + fontWeight: FontWeight.bold, + color: Colors.white, + fontSize: 16, + ), + ), + messageText: Text( + message, + style: TextStyle( + color: Colors.white.withOpacity(0.9), + fontSize: 14, + ), + ), + ); +} + +SnackbarController mySnackbarSuccess(String message) { + return Get.snackbar( + 'Success'.tr, + message, + backgroundColor: AppColor.greenColor + .withOpacity(0.9), // Assuming green color for success + colorText: AppColor.secondaryColor, + icon: const Icon(Icons.check_circle, color: AppColor.secondaryColor), + shouldIconPulse: true, + snackPosition: SnackPosition.TOP, + margin: const EdgeInsets.all(10), + borderRadius: 10, + animationDuration: const Duration(milliseconds: 500), + forwardAnimationCurve: Curves.easeOutBack, + reverseAnimationCurve: Curves.easeInBack, + titleText: Text( + 'Success'.tr, + style: const TextStyle( + fontWeight: FontWeight.bold, + color: Colors.white, + fontSize: 16, + ), + ), + messageText: Text( + message, + style: TextStyle( + color: Colors.white.withOpacity(0.9), + fontSize: 14, + ), + ), + ); +}