diff --git a/.gitignore b/.gitignore index 5256ca2..399ec11 100644 --- a/.gitignore +++ b/.gitignore @@ -5,9 +5,11 @@ *.swp .DS_Store .atom/ +.build/ .buildlog/ .history .svn/ +.swiftpm/ migrate_working_dir/ # IntelliJ related diff --git a/android/app/build.gradle b/android/app/build.gradle index f30629a..0a79203 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -59,22 +59,13 @@ android { applicationId = "com.mobileapp.store.ride" // You can update the following values to match your application needs. // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration. -<<<<<<< HEAD - minSdkVersion 23 - targetSdkVersion 34 - versionCode 65 - versionName '1.5.65' - multiDexEnabled =true - // manifestPlaceholders = [mapsApiKey: 'android/app/src/main/AndroidManifest.xml'] -======= minSdk = 23 targetSdk = flutter.targetSdkVersion - versionCode = 108 - versionName = '1.6.108' + versionCode = 109 + versionName = '1.6.109' multiDexEnabled =true // manifestPlaceholders can be specified here if needed ->>>>>>> 8813b4d } signingConfigs { @@ -89,9 +80,9 @@ android { buildTypes { release { signingConfig signingConfigs.release -// minifyEnabled true -// shrinkResources true -// proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + minifyEnabled true + shrinkResources true + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } } @@ -102,11 +93,11 @@ flutter { dependencies { implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" - coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.2.2' + coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.1.4' // Optional dependencies like Firebase can be uncommented if needed // implementation platform('com.google.firebase:firebase-bom:32.1.1') - implementation "com.stripe:stripe-android:20.47.0" - implementation 'com.stripe:paymentsheet:20.47.0' + implementation "com.stripe:stripe-android:20.52.2" + implementation 'com.stripe:paymentsheet:20.52.2' // If push provisioning is needed, make sure you have the correct version: diff --git a/android/app/proguard-rules.pro b/android/app/proguard-rules.pro index ef62132..19a6761 100644 --- a/android/app/proguard-rules.pro +++ b/android/app/proguard-rules.pro @@ -28,3 +28,5 @@ # Keep rules for Stripe -keep class com.stripe.android.** { *; } -keep class com.stripe.android.pushProvisioning.** { *; } +-keep class com.yalantis.ucrop.** { *; } +-keep class com.yalantis.ucrop.util.** { *; } \ No newline at end of file diff --git a/android/gradle.properties b/android/gradle.properties index 91ed4fe..5794139 100644 --- a/android/gradle.properties +++ b/android/gradle.properties @@ -4,3 +4,5 @@ android.enableJetifier=true android.defaults.buildfeatures.buildconfig=true android.nonTransitiveRClass=false android.nonFinalResIds=false + +android.enableR8.fullMode=true \ No newline at end of file diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 7975ed8..371454f 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -1,58 +1,58 @@ PODS: - - AppAuth (1.7.5): - - AppAuth/Core (= 1.7.5) - - AppAuth/ExternalUserAgent (= 1.7.5) - - AppAuth/Core (1.7.5) - - AppAuth/ExternalUserAgent (1.7.5): + - AppAuth (1.7.6): + - AppAuth/Core (= 1.7.6) + - AppAuth/ExternalUserAgent (= 1.7.6) + - AppAuth/Core (1.7.6) + - AppAuth/ExternalUserAgent (1.7.6): - AppAuth/Core - audio_session (0.0.1): - Flutter - device_info_plus (0.0.1): - Flutter - - Firebase/Auth (11.0.0): + - Firebase/Auth (11.4.0): - Firebase/CoreOnly - - FirebaseAuth (~> 11.0.0) - - Firebase/CoreOnly (11.0.0): - - FirebaseCore (= 11.0.0) - - Firebase/Messaging (11.0.0): + - FirebaseAuth (~> 11.4.0) + - Firebase/CoreOnly (11.4.0): + - FirebaseCore (= 11.4.0) + - Firebase/Messaging (11.4.0): - Firebase/CoreOnly - - FirebaseMessaging (~> 11.0.0) - - firebase_auth (5.2.0): - - Firebase/Auth (= 11.0.0) + - FirebaseMessaging (~> 11.4.0) + - firebase_auth (5.3.4): + - Firebase/Auth (= 11.4.0) - firebase_core - Flutter - - firebase_core (3.4.0): - - Firebase/CoreOnly (= 11.0.0) + - firebase_core (3.9.0): + - Firebase/CoreOnly (= 11.4.0) - Flutter - - firebase_messaging (15.1.0): - - Firebase/Messaging (= 11.0.0) + - firebase_messaging (15.1.6): + - Firebase/Messaging (= 11.4.0) - firebase_core - Flutter - - FirebaseAppCheckInterop (11.5.0) - - FirebaseAuth (11.0.0): + - FirebaseAppCheckInterop (11.6.0) + - FirebaseAuth (11.4.0): - FirebaseAppCheckInterop (~> 11.0) - FirebaseAuthInterop (~> 11.0) - - FirebaseCore (~> 11.0) - - FirebaseCoreExtension (~> 11.0) + - FirebaseCore (~> 11.4) + - FirebaseCoreExtension (~> 11.4) - GoogleUtilities/AppDelegateSwizzler (~> 8.0) - GoogleUtilities/Environment (~> 8.0) - - GTMSessionFetcher/Core (~> 3.4) + - GTMSessionFetcher/Core (< 5.0, >= 3.4) - RecaptchaInterop (~> 100.0) - - FirebaseAuthInterop (11.5.0) - - FirebaseCore (11.0.0): + - FirebaseAuthInterop (11.6.0) + - FirebaseCore (11.4.0): - FirebaseCoreInternal (~> 11.0) - GoogleUtilities/Environment (~> 8.0) - GoogleUtilities/Logger (~> 8.0) - FirebaseCoreExtension (11.4.1): - FirebaseCore (~> 11.0) - - FirebaseCoreInternal (11.5.0): + - FirebaseCoreInternal (11.6.0): - "GoogleUtilities/NSData+zlib (~> 8.0)" - FirebaseInstallations (11.4.0): - FirebaseCore (~> 11.0) - GoogleUtilities/Environment (~> 8.0) - GoogleUtilities/UserDefaults (~> 8.0) - PromisesObjC (~> 2.4) - - FirebaseMessaging (11.0.0): + - FirebaseMessaging (11.4.0): - FirebaseCore (~> 11.0) - FirebaseInstallations (~> 11.0) - GoogleDataTransport (~> 10.0) @@ -156,50 +156,49 @@ PODS: - RecaptchaInterop (100.0.0) - record_darwin (1.0.0): - Flutter - - FlutterMacOS - share (0.0.1): - Flutter - sign_in_with_apple (0.0.1): - Flutter - - sqflite (0.0.3): + - sqflite_darwin (0.0.4): - Flutter - FlutterMacOS - - Stripe (23.28.3): - - StripeApplePay (= 23.28.3) - - StripeCore (= 23.28.3) - - StripePayments (= 23.28.3) - - StripePaymentsUI (= 23.28.3) - - StripeUICore (= 23.28.3) + - Stripe (23.30.0): + - StripeApplePay (= 23.30.0) + - StripeCore (= 23.30.0) + - StripePayments (= 23.30.0) + - StripePaymentsUI (= 23.30.0) + - StripeUICore (= 23.30.0) - stripe_ios (0.0.1): - Flutter - - Stripe (~> 23.28.0) - - StripeApplePay (~> 23.28.0) - - StripeFinancialConnections (~> 23.28.0) - - StripePayments (~> 23.28.0) - - StripePaymentSheet (~> 23.28.0) - - StripePaymentsUI (~> 23.28.0) - - StripeApplePay (23.28.3): - - StripeCore (= 23.28.3) - - StripeCore (23.28.3) - - StripeFinancialConnections (23.28.3): - - StripeCore (= 23.28.3) - - StripeUICore (= 23.28.3) - - StripePayments (23.28.3): - - StripeCore (= 23.28.3) - - StripePayments/Stripe3DS2 (= 23.28.3) - - StripePayments/Stripe3DS2 (23.28.3): - - StripeCore (= 23.28.3) - - StripePaymentSheet (23.28.3): - - StripeApplePay (= 23.28.3) - - StripeCore (= 23.28.3) - - StripePayments (= 23.28.3) - - StripePaymentsUI (= 23.28.3) - - StripePaymentsUI (23.28.3): - - StripeCore (= 23.28.3) - - StripePayments (= 23.28.3) - - StripeUICore (= 23.28.3) - - StripeUICore (23.28.3): - - StripeCore (= 23.28.3) + - Stripe (~> 23.30.0) + - StripeApplePay (~> 23.30.0) + - StripeFinancialConnections (~> 23.30.0) + - StripePayments (~> 23.30.0) + - StripePaymentSheet (~> 23.30.0) + - StripePaymentsUI (~> 23.30.0) + - StripeApplePay (23.30.0): + - StripeCore (= 23.30.0) + - StripeCore (23.30.0) + - StripeFinancialConnections (23.30.0): + - StripeCore (= 23.30.0) + - StripeUICore (= 23.30.0) + - StripePayments (23.30.0): + - StripeCore (= 23.30.0) + - StripePayments/Stripe3DS2 (= 23.30.0) + - StripePayments/Stripe3DS2 (23.30.0): + - StripeCore (= 23.30.0) + - StripePaymentSheet (23.30.0): + - StripeApplePay (= 23.30.0) + - StripeCore (= 23.30.0) + - StripePayments (= 23.30.0) + - StripePaymentsUI (= 23.30.0) + - StripePaymentsUI (23.30.0): + - StripeCore (= 23.30.0) + - StripePayments (= 23.30.0) + - StripeUICore (= 23.30.0) + - StripeUICore (23.30.0): + - StripeCore (= 23.30.0) - TOCropViewController (2.7.4) - uni_links (0.0.1): - Flutter @@ -241,7 +240,7 @@ DEPENDENCIES: - record_darwin (from `.symlinks/plugins/record_darwin/ios`) - share (from `.symlinks/plugins/share/ios`) - sign_in_with_apple (from `.symlinks/plugins/sign_in_with_apple/ios`) - - sqflite (from `.symlinks/plugins/sqflite/darwin`) + - sqflite_darwin (from `.symlinks/plugins/sqflite_darwin/darwin`) - stripe_ios (from `.symlinks/plugins/stripe_ios/ios`) - uni_links (from `.symlinks/plugins/uni_links/ios`) - url_launcher_ios (from `.symlinks/plugins/url_launcher_ios/ios`) @@ -331,8 +330,8 @@ EXTERNAL SOURCES: :path: ".symlinks/plugins/share/ios" sign_in_with_apple: :path: ".symlinks/plugins/sign_in_with_apple/ios" - sqflite: - :path: ".symlinks/plugins/sqflite/darwin" + sqflite_darwin: + :path: ".symlinks/plugins/sqflite_darwin/darwin" stripe_ios: :path: ".symlinks/plugins/stripe_ios/ios" uni_links: @@ -349,27 +348,27 @@ EXTERNAL SOURCES: :path: ".symlinks/plugins/webview_flutter_wkwebview/darwin" SPEC CHECKSUMS: - AppAuth: 501c04eda8a8d11f179dbe8637b7a91bb7e5d2fa + AppAuth: d4f13a8fe0baf391b2108511793e4b479691fb73 audio_session: 088d2483ebd1dc43f51d253d4a1c517d9a2e7207 - device_info_plus: 97af1d7e84681a90d0693e63169a5d50e0839a0d - Firebase: 9f574c08c2396885b5e7e100ed4293d956218af9 - firebase_auth: 16ac5db3d064db837ecd845080d7e18e4be7c66d - firebase_core: ceec591a66629daaee82d3321551692c4a871493 - firebase_messaging: 15d8b557010f3bb7b98d0302e1c7c8fbcd244425 - FirebaseAppCheckInterop: d265d9f4484e7ec1c591086408840fdd383d1213 - FirebaseAuth: d5cf28be74d7e82257f6a3f717509eff70d3cf4a - FirebaseAuthInterop: 1219bee9b23e6ebe84c256a0d95adab53d11c331 - FirebaseCore: 3cf438f431f18c12cdf2aaf64434648b63f7e383 + device_info_plus: bf2e3232933866d73fe290f2942f2156cdd10342 + Firebase: cf1b19f21410b029b6786a54e9764a0cacad3c99 + firebase_auth: c4bdd9d7b338ac004008cb5024a643584e0ec03f + firebase_core: b62a5080210edad3f2934314a8b2c6f5124e8e10 + firebase_messaging: 98619a0572d82cfb3668e78859ba9f1110e268c9 + FirebaseAppCheckInterop: 347aa09a805219a31249b58fc956888e9fcb314b + FirebaseAuth: c359af98bd703cbf4293eec107a40de08ede6ce6 + FirebaseAuthInterop: a919d415797d23b7bfe195a04f322b86c65020ef + FirebaseCore: e0510f1523bc0eb21653cac00792e1e2bd6f1771 FirebaseCoreExtension: f1bc67a4702931a7caa097d8e4ac0a1b0d16720e - FirebaseCoreInternal: f47dd28ae7782e6a4738aad3106071a8fe0af604 + FirebaseCoreInternal: d98ab91e2d80a56d7b246856a8885443b302c0c2 FirebaseInstallations: 6ef4a1c7eb2a61ee1f74727d7f6ce2e72acf1414 - FirebaseMessaging: d2d1d9c62c46dd2db49a952f7deb5b16ad2c9742 + FirebaseMessaging: f8a160d99c2c2e5babbbcc90c4a3e15db036aee2 Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7 flutter_contacts: edb1c5ce76aa433e20e6cb14c615f4c0b66e0983 - flutter_local_notifications: 4cde75091f6327eb8517fa068a0a5950212d2086 + flutter_local_notifications: df98d66e515e1ca797af436137b4459b160ad8c9 flutter_secure_storage: d33dac7ae2ea08509be337e775f6b59f1ff45f12 flutter_tts: 0f492aab6accf87059b72354fcb4ba934304771d - geolocator_apple: 6cbaf322953988e009e5ecb481f07efece75c450 + geolocator_apple: 9bcea1918ff7f0062d98345d238ae12718acfbc1 Google-Maps-iOS-Utils: 66d6de12be1ce6d3742a54661e7a79cb317a9321 google_maps_flutter_ios: e31555a04d1986ab130f2b9f24b6cdc861acc6d3 google_sign_in_ios: 07375bfbf2620bc93a602c0e27160d6afc6ead38 @@ -385,32 +384,32 @@ SPEC CHECKSUMS: local_auth_darwin: 66e40372f1c29f383a314c738c7446e2f7fdadc3 location: d5cf8598915965547c3f36761ae9cc4f4e87d22e nanopb: fad817b59e0457d11a5dfbde799381cd727c1275 - package_info_plus: 58f0028419748fad15bf008b270aaa8e54380b1c + package_info_plus: c0502532a26c7662a62a356cebe2692ec5fe4ec4 path_provider_foundation: 2b6b4c569c0fb62ec74538f866245ac84301af46 permission_handler_apple: 9878588469a2b0d0fc1e048d9f43605f92e6cec2 PromisesObjC: f5707f49cb48b9636751c5b2e7d227e43fba9f47 RecaptchaInterop: 7d1a4a01a6b2cb1610a47ef3f85f0c411434cb21 - record_darwin: df0a677188e5fed18472550298e675f19ddaffbe + record_darwin: 3b1a8e7d5c0cbf45ad6165b4d83a6ca643d929c3 share: 0b2c3e82132f5888bccca3351c504d0003b3b410 sign_in_with_apple: f3bf75217ea4c2c8b91823f225d70230119b8440 - sqflite: 673a0e54cc04b7d6dba8d24fb8095b31c3a99eec - Stripe: cdf416cf2efe286f532a6306de0fcaa0ecc8c71a - stripe_ios: 91946e5c07e0a0dc0e1484ee6659e1f90a302cf3 - StripeApplePay: efb62ffc08e6cd4f161d77ddb45de2451075c54e - StripeCore: 9731f05e327c3dcaf7d7abd116840ceaa9482bbe - StripeFinancialConnections: 46c0049aaab3a179193502bce4a8096eb7b73f55 - StripePayments: dd1867a620b0b8b5e294e9ff2f1f7b7770765f47 - StripePaymentSheet: d155dfde74e90784d054deffb4f561a1f6dd638f - StripePaymentsUI: c24f990b03a68a7f6fe704b15dd487e7bb6b603e - StripeUICore: f2d514e900c37436dc5427fdf2c29d68ab1c2935 + sqflite_darwin: 5a7236e3b501866c1c9befc6771dfd73ffb8702d + Stripe: 9757efc154de1d9615cbea4836d590bc4034d3a4 + stripe_ios: 4463f81157e91cbbf441e1b3fdf5edce90787491 + StripeApplePay: ca33933601302742623762157d587b79b942d073 + StripeCore: 2af250a2366ff2bbf64d4243c5f9bbf2a98b2aaf + StripeFinancialConnections: 3ab1ef6182ec44e71c29e9a2100b663f9713ac20 + StripePayments: 658a16bd34d20c8185aa281866227b9e1743300e + StripePaymentSheet: eac031f76d7fbb4f52df9b9c39be5be671ca4c07 + StripePaymentsUI: 7d7cffb2ecfc0d6b5ac3a4488c02893a5ff6cc77 + StripeUICore: bb102d453b1e1a10a37f810bc0a9aa0675fb17fd TOCropViewController: 80b8985ad794298fb69d3341de183f33d1853654 uni_links: d97da20c7701486ba192624d99bffaaffcfc298a url_launcher_ios: 5334b05cef931de560670eeae103fd3e431ac3fe vibration: 7d883d141656a1c1a6d8d238616b2042a51a1241 video_player_avfoundation: 7c6c11d8470e1675df7397027218274b6d2360b3 - wakelock_plus: 78ec7c5b202cab7761af8e2b2b3d0671be6c4ae1 + wakelock_plus: 373cfe59b235a6dd5837d0fb88791d2f13a90d56 webview_flutter_wkwebview: 0982481e3d9c78fd5c6f62a002fcd24fc791f1e4 PODFILE CHECKSUM: d9271c147dd54ffd9ca5d77bf00ca21a1c9a5961 -COCOAPODS: 1.15.2 +COCOAPODS: 1.16.2 diff --git a/lib/constant/style.dart b/lib/constant/style.dart index a0993aa..131f5bf 100644 --- a/lib/constant/style.dart +++ b/lib/constant/style.dart @@ -1,43 +1,39 @@ -import 'package:SEFER/constant/box_name.dart'; -import 'package:SEFER/main.dart'; import 'package:flutter/material.dart'; import 'package:google_fonts/google_fonts.dart'; +import '../main.dart'; +import 'box_name.dart'; import 'colors.dart'; class AppStyle { - static TextStyle headTitle = const TextStyle( - fontWeight: FontWeight.bold, - fontSize: 40, - color: AppColor.accentColor, - // fontFamily: box.read(BoxName.lang) == 'ar' - // // ?GoogleFonts.notoNaskhArabic().fontFamily - // ? GoogleFonts.notoNaskhArabic().fontFamily - // : GoogleFonts.roboto().fontFamily, - ); - static TextStyle headTitle2 = const TextStyle( - fontWeight: FontWeight.bold, - fontSize: 22, - color: AppColor.writeColor, - // fontFamily: box.read(BoxName.lang) == 'ar' - // ? GoogleFonts.notoNaskhArabic().fontFamily - // : GoogleFonts.roboto().fontFamily - ); + static TextStyle headTitle = TextStyle( + fontWeight: FontWeight.bold, + fontSize: 36, + color: AppColor.accentColor, + fontFamily: box.read(BoxName.lang) == 'ar' + // ?GoogleFonts.markaziText().fontFamily + ? GoogleFonts.markaziText().fontFamily + : GoogleFonts.inter().fontFamily); + static TextStyle headTitle2 = TextStyle( + fontWeight: FontWeight.bold, + fontSize: 24, + color: AppColor.writeColor, + fontFamily: box.read(BoxName.lang) == 'ar' + ? GoogleFonts.markaziText().fontFamily + : GoogleFonts.inter().fontFamily); static TextStyle title = TextStyle( - fontWeight: FontWeight.normal, - fontSize: box.read(BoxName.lang) == 'ar' ? 14 : 16, - color: AppColor.writeColor, - // fontFamily: box.read(BoxName.lang) == 'ar' - // ? GoogleFonts.notoNaskhArabic().fontFamily - // : GoogleFonts.roboto().fontFamily - ); - static TextStyle subtitle = const TextStyle( - fontWeight: FontWeight.bold, - fontSize: 13, - color: AppColor.writeColor, - // fontFamily: box.read(BoxName.lang) == 'ar' - // ? GoogleFonts.notoNaskhArabic().fontFamily - // : GoogleFonts.roboto().fontFamily - ); + fontWeight: FontWeight.normal, + fontSize: 16, + color: AppColor.writeColor, + fontFamily: box.read(BoxName.lang) == 'ar' + ? GoogleFonts.markaziText().fontFamily + : GoogleFonts.inter().fontFamily); + static TextStyle subtitle = TextStyle( + fontWeight: FontWeight.bold, + fontSize: 12, + color: AppColor.writeColor, + fontFamily: box.read(BoxName.lang) == 'ar' + ? GoogleFonts.markaziText().fontFamily + : GoogleFonts.inter().fontFamily); static TextStyle number = const TextStyle( fontWeight: FontWeight.bold, fontSize: 14, @@ -47,9 +43,7 @@ class AppStyle { static BoxDecoration boxDecoration = const BoxDecoration( boxShadow: [ BoxShadow( - color: Color.fromARGB(255, 218, 218, 255), - blurRadius: 5, - offset: Offset(2, 4)), + color: AppColor.accentColor, blurRadius: 5, offset: Offset(2, 4)), BoxShadow( color: AppColor.accentColor, blurRadius: 5, offset: Offset(-2, -2)) ], diff --git a/lib/controller/auth/login_controller.dart b/lib/controller/auth/login_controller.dart index d2f4745..64b6c38 100644 --- a/lib/controller/auth/login_controller.dart +++ b/lib/controller/auth/login_controller.dart @@ -6,7 +6,6 @@ import 'package:SEFER/controller/firebase/firbase_messge.dart'; import 'package:SEFER/controller/functions/add_error.dart'; import 'package:SEFER/views/auth/login_page.dart'; import 'package:SEFER/views/auth/sms_verfy_page.dart'; -import 'package:SEFER/views/widgets/my_dialog.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:SEFER/constant/box_name.dart'; diff --git a/lib/controller/auth/register_controller.dart b/lib/controller/auth/register_controller.dart index d01ceee..0d75b10 100644 --- a/lib/controller/auth/register_controller.dart +++ b/lib/controller/auth/register_controller.dart @@ -7,7 +7,6 @@ import 'package:SEFER/controller/auth/login_controller.dart'; import 'package:SEFER/controller/functions/add_error.dart'; import 'package:SEFER/controller/local/phone_intel/phone_number.dart'; import 'package:SEFER/views/home/map_page_passenger.dart'; -import 'package:SEFER/views/widgets/my_dialog.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:SEFER/constant/links.dart'; @@ -20,6 +19,7 @@ import '../../constant/box_name.dart'; import '../../main.dart'; import '../../print.dart'; import '../../views/auth/verify_email_page.dart'; +import '../../views/widgets/mydialoug.dart'; import '../functions/sms_controller.dart'; class RegisterController extends GetxController { diff --git a/lib/controller/firebase/firbase_messge.dart b/lib/controller/firebase/firbase_messge.dart index 18d324c..a4d50b0 100644 --- a/lib/controller/firebase/firbase_messge.dart +++ b/lib/controller/firebase/firbase_messge.dart @@ -1,6 +1,5 @@ import 'dart:convert'; import 'dart:io'; -import 'package:SEFER/views/widgets/my_dialog.dart'; import 'package:firebase_messaging/firebase_messaging.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; @@ -136,8 +135,8 @@ class FirebaseMessagesController extends GetxController { var myList = jsonDecode(passengerList) as List; driverID = myList[0].toString(); Get.find().driverToken = myList[2].toString(); - Get.find().statusRide == 'Apply'; - Get.find().isSearchingWindow == false; + Get.find().statusRide = 'Apply'; + Get.find().isSearchingWindow = false; Get.find().update(); Get.find().rideAppliedFromDriver(true); diff --git a/lib/controller/firebase/local_notification.dart b/lib/controller/firebase/local_notification.dart index fb2fc26..8fb28ad 100644 --- a/lib/controller/firebase/local_notification.dart +++ b/lib/controller/firebase/local_notification.dart @@ -27,8 +27,8 @@ class NotificationController extends GetxController { requestAlertPermission: true, requestBadgePermission: true, requestSoundPermission: true, - onDidReceiveLocalNotification: - (int id, String? title, String? body, String? payload) async {}, + // onDidReceiveLocalNotification: + // (int id, String? title, String? body, String? payload) async {}, ); InitializationSettings initializationSettings = InitializationSettings(android: android, iOS: ios); diff --git a/lib/controller/functions/package_info.dart b/lib/controller/functions/package_info.dart index bfcef9c..04f4574 100644 --- a/lib/controller/functions/package_info.dart +++ b/lib/controller/functions/package_info.dart @@ -1,13 +1,12 @@ -import 'dart:convert'; import 'dart:io'; -import 'package:SEFER/constant/links.dart'; -import 'package:SEFER/controller/functions/crud.dart'; +import 'dart:ui'; import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:package_info_plus/package_info_plus.dart'; import 'package:url_launcher/url_launcher.dart'; import '../../constant/box_name.dart'; -import '../../constant/info.dart'; +import '../../constant/colors.dart'; import '../../main.dart'; Future checkForUpdate(BuildContext context) async { @@ -42,38 +41,120 @@ checkForBounusInvitation() { void showUpdateDialog(BuildContext context) { final String storeUrl = Platform.isAndroid - ? 'https://play.google.com/store/apps/details?id=com.mobileapp.store.ride' - : 'https://apps.apple.com/ae/app/sefer/id6458734951'; - showCupertinoDialog( + ? 'https://play.google.com/store/apps/details?id=com.sefer_driver' + : 'https://apps.apple.com/ae/app/sefer-driver/id6502189302'; + + showGeneralDialog( context: context, barrierDismissible: false, - builder: (BuildContext context) { - return CupertinoAlertDialog( - title: Text('Update Available'.tr), - content: Text( - 'A new version of the app is available. Please update to the latest version.' - .tr, + barrierColor: Colors.black.withOpacity(0.5), + pageBuilder: (_, __, ___) { + return BackdropFilter( + filter: ImageFilter.blur(sigmaX: 5, sigmaY: 5), + child: Center( + child: AlertDialog( + // Using AlertDialog for a more Material Design look + shape: RoundedRectangleBorder( + borderRadius: + BorderRadius.circular(16)), // More rounded corners + elevation: 4, // Add a bit more elevation + contentPadding: EdgeInsets.zero, // Remove default content padding + content: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Padding( + padding: const EdgeInsets.only(top: 20.0), + child: Image.asset( + 'assets/images/logo.png', + height: 72, // Slightly larger logo + width: 72, + ), + ), + const SizedBox(height: 16), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 24.0), + child: Text( + 'Update Available'.tr, + textAlign: TextAlign.center, + style: Theme.of(context).textTheme.titleLarge?.copyWith( + // Use theme's title style + fontWeight: FontWeight.bold, + ), + ), + ), + Padding( + padding: const EdgeInsets.all(24.0), + child: Text( + 'A new version of the app is available. Please update to the latest version.' + .tr, // More encouraging message + textAlign: TextAlign.center, + style: Theme.of(context).textTheme.bodyMedium?.copyWith( + // Use theme's body style + color: Colors.black87, + ), + ), + ), + const Divider(height: 0), + Row( + children: [ + Expanded( + child: TextButton( + // Using TextButton for "Cancel" + onPressed: () => Navigator.pop(context), + style: TextButton.styleFrom( + foregroundColor: Colors.grey, + shape: const RoundedRectangleBorder( + borderRadius: BorderRadius.only( + bottomLeft: Radius.circular(16), + ), + ), + ), + child: Text('Cancel'.tr), + ), + ), + const SizedBox( + height: 48, + child: VerticalDivider(width: 0), // Using VerticalDivider + ), + Expanded( + child: ElevatedButton( + // Using ElevatedButton for "Update" + onPressed: () async { + if (await canLaunchUrl(Uri.parse(storeUrl))) { + await launchUrl(Uri.parse(storeUrl)); + } + if (context.mounted) Navigator.pop(context); + }, + style: ElevatedButton.styleFrom( + backgroundColor: AppColor + .primaryColor, // Use theme's primary color + foregroundColor: Theme.of(context) + .colorScheme + .onPrimary, // Use theme's onPrimary color + shape: const RoundedRectangleBorder( + borderRadius: BorderRadius.only( + bottomRight: Radius.circular(16), + ), + ), + ), + child: Text('Update'.tr), + ), + ), + ], + ), + ], + ), + ), ), - actions: [ - CupertinoDialogAction( - child: Text('Update'.tr), - onPressed: () async { - if (await canLaunchUrl(Uri.parse(storeUrl))) { - await launchUrl(Uri.parse(storeUrl)); - } else { - print('Could not launch $storeUrl'); - } - - Navigator.of(context).pop(); - }, - ), - CupertinoDialogAction( - child: Text('Cancel'.tr), - onPressed: () async { - Navigator.of(context).pop(); - }, - ), - ], + ); + }, + transitionBuilder: (_, animation, __, child) { + return ScaleTransition( + scale: CurvedAnimation( + parent: animation, + curve: Curves.easeOutCubic, // More natural curve + ), + child: child, ); }, ); diff --git a/lib/controller/home/map_passenger_controller.dart b/lib/controller/home/map_passenger_controller.dart index a532fd8..6001be3 100644 --- a/lib/controller/home/map_passenger_controller.dart +++ b/lib/controller/home/map_passenger_controller.dart @@ -5,14 +5,12 @@ import 'dart:math' as math; import 'dart:ui'; import 'package:SEFER/constant/univeries_polygon.dart'; import 'package:SEFER/controller/firebase/local_notification.dart'; -import 'package:SEFER/views/widgets/mysnakbar.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter_confetti/flutter_confetti.dart'; import 'package:vector_math/vector_math.dart' show radians, degrees; import 'package:SEFER/controller/functions/tts.dart'; import 'package:SEFER/views/home/map_page_passenger.dart'; -import 'package:SEFER/views/widgets/my_dialog.dart'; import 'package:SEFER/views/widgets/my_textField.dart'; import 'package:flutter/material.dart'; import 'package:geolocator/geolocator.dart'; @@ -34,9 +32,12 @@ import '../../main.dart'; import '../../models/model/locations.dart'; import '../../models/model/painter_copoun.dart'; import '../../print.dart'; +import '../../views/home/map_widget.dart/cancel_raide_page.dart'; import '../../views/home/map_widget.dart/car_details_widget_to_go.dart'; import '../../views/home/map_widget.dart/select_driver_mishwari.dart'; import '../../views/widgets/elevated_btn.dart'; +import '../../views/widgets/error_snakbar.dart'; +import '../../views/widgets/mydialoug.dart'; import '../firebase/firbase_messge.dart'; import '../functions/audio_record1.dart'; import '../functions/crud.dart'; @@ -565,8 +566,7 @@ class MapPassengerController extends GetxController { } void changeCancelRidePageShow() { - // rideConfirm == true - // ? + showCancelRideBottomSheet(); isCancelRidePageShown = !isCancelRidePageShown; // : cancelRide(); update(); @@ -1791,16 +1791,17 @@ class MapPassengerController extends GetxController { return; } driversStatusForSearchWindow = 'Your order is being prepared'.tr; - Log.print('driversStatusForSearchWindow: ${driversStatusForSearchWindow}'); + Log.print('driversStatusForSearchWindow: $driversStatusForSearchWindow'); update(); await postRideDetailsToServer(); driversStatusForSearchWindow = 'Your order sent to drivers'.tr; + delayAndFetchRideStatusForAllDriverAvailable(rideId); await notifyAvailableDrivers(); driversStatusForSearchWindow = 'The drivers are reviewing your request'.tr; - Log.print('driversStatusForSearchWindow: ${driversStatusForSearchWindow}'); + Log.print('driversStatusForSearchWindow: $driversStatusForSearchWindow'); update(); - delayAndFetchRideStatusForAllDriverAvailable(rideId); + // update(); } @@ -1829,9 +1830,9 @@ class MapPassengerController extends GetxController { } // await postRideDetailsToServer(); - await notifyAvailableDrivers(); delayAndFetchRideStatusForAllDriverAvailable(rideId); - update(); + // update(); + await notifyAvailableDrivers(); } bool isDriversDataValid() { @@ -2023,7 +2024,7 @@ class MapPassengerController extends GetxController { tick = 0; await addRideToNotificationDriverAvailable(); Timer.periodic(const Duration(seconds: 1), (timer) async { - if (attemptCounter >= maxAttempts || isApplied) { + if (attemptCounter >= maxAttempts || isApplied == true) { timer.cancel(); _rideStatusStreamController.close(); // Close the stream when done return; @@ -2034,9 +2035,9 @@ class MapPassengerController extends GetxController { try { var res = await getRideStatus(rideId); - Log.print('res:2022 ${res}'); + Log.print('res:2022 $res'); String rideStatusDelayed = res.toString(); - Log.print('rideStatusDelayed: ${rideStatusDelayed}'); + Log.print('rideStatusDelayed: $rideStatusDelayed'); _rideStatusStreamController .add(rideStatusDelayed); // Emit the ride status @@ -2051,6 +2052,7 @@ class MapPassengerController extends GetxController { // } else if (rideStatusDelayed == 'Apply' || rideStatusDelayed == 'Applied') { + isApplied = true; rideAppliedFromDriver(isApplied); timer.cancel(); // Close stream after applying @@ -2525,7 +2527,7 @@ class MapPassengerController extends GetxController { noCarString = false; dataCarsLocationByPassenger = jsonDecode(res); Log.print( - 'dataCarsLocationByPassenger:getCarsLocationByPassengerAndReloadMarker ${dataCarsLocationByPassenger}'); + 'dataCarsLocationByPassenger:getCarsLocationByPassengerAndReloadMarker $dataCarsLocationByPassenger'); // Check if 'message' is present and not null if (dataCarsLocationByPassenger != null && @@ -3084,7 +3086,7 @@ class MapPassengerController extends GetxController { changeCancelRidePageShow(); if (rideId != 'yet') { Log.print('cancelRide: 1'); - FirebaseMessagesController().sendNotificationToDriverMAP( + await FirebaseMessagesController().sendNotificationToDriverMAP( 'Cancel Trip'.tr, 'Trip Cancelled'.tr, driverToken.toString(), @@ -3698,6 +3700,11 @@ class MapPassengerController extends GetxController { controller.animateCamera( CameraUpdate.newLatLng(passengerLocation), ); + // Future.delayed(const Duration(milliseconds: 500), () { + // markers.forEach((marker) { + // controller.showMarkerInfoWindow(marker.markerId); + // }); + // }); update(); } @@ -4011,7 +4018,7 @@ class MapPassengerController extends GetxController { late String startNameAddress = ''; late String endNameAddress = ''; - getMap(String origin, destination) async { + getDirectionMap(String origin, destination) async { isLoading = true; update(); remainingTime = 25; //to make cancel every call @@ -4043,22 +4050,7 @@ class MapPassengerController extends GetxController { isLoading = false; newStartPointLocation = LatLng( data[0]["start_location"]['lat'], data[0]["start_location"]['lng']); - markers.add( - Marker( - markerId: const MarkerId('start'), - position: newStartPointLocation, - icon: startIcon, - ), - ); - markers.add( - Marker( - markerId: const MarkerId('end'), - position: LatLng( - data[0]["end_location"]['lat'], data[0]["end_location"]['lng']), - icon: endIcon, - ), - ); - update(); + durationToRide = data[0]['duration']['value']; final points = decodePolyline(response["routes"][0]["overview_polyline"]["points"]); @@ -4081,31 +4073,176 @@ class MapPassengerController extends GetxController { LatLngBounds(northeast: northeast, southwest: southwest); // Fit the camera to the bounds - var cameraUpdate = CameraUpdate.newLatLngBounds(boundsData, 160); + var cameraUpdate = CameraUpdate.newLatLngBounds(boundsData, 100); mapController!.animateCamera(cameraUpdate); // getDistanceFromText(data[0]['distance']['text']); double distanceOfTrip = (data[0]['distance']['value']) / 1000; distance = distanceOfTrip; + durationToAdd = Duration(seconds: durationToRide); + hours = durationToAdd.inHours; + minutes = (durationToAdd.inMinutes % 60).round(); // updateCameraForDistanceAfterGetMap(); + markers.clear(); + update(); + markers.add( + Marker( + markerId: const MarkerId('start'), + position: newStartPointLocation, + icon: startIcon, + infoWindow: InfoWindow( + title: startNameAddress, + snippet: '', + ), + ), + ); + +// Add end marker + markers.add( + Marker( + markerId: const MarkerId('end'), + position: LatLng( + data[0]["end_location"]['lat'], data[0]["end_location"]['lng']), + icon: endIcon, + infoWindow: InfoWindow( + title: endNameAddress, + snippet: + '$distance ${'KM'.tr} ⌛ ${hours > 0 ? '${'Your Ride Duration is '.tr}$hours ${'H and'.tr} $minutes ${'m'.tr}' : '${'Your Ride Duration is '.tr} $minutes ${'m'.tr}'}'), + ), + ); +// // Show info windows automatically +// Future.delayed(const Duration(milliseconds: 500), () { +// mapController?.showMarkerInfoWindow(const MarkerId('start')); +// }); + Future.delayed(const Duration(milliseconds: 500), () { + mapController?.showMarkerInfoWindow(const MarkerId('end')); + }); + update(); if (polyLines.isNotEmpty) { clearPolyline(); } else { - var polyline = Polyline( - polylineId: PolylineId(response["routes"][0]["summary"]), - points: polylineCoordinates, - width: 10, - color: Colors.blue, - ); - - polyLines.add(polyline); + _animatePolyline(polylineCoordinates); rideConfirm = false; isMarkersShown = true; + update(); } } + Future _animatePolyline(List coordinates) async { + // Initial animation + polyLines.clear(); + List animatedPoints = []; + + // Draw initial polyline + for (int i = 0; i < coordinates.length; i++) { + animatedPoints.add(coordinates[i]); + polyLines.clear(); + polyLines.add( + Polyline( + polylineId: const PolylineId('animated_route'), + points: List.from(animatedPoints), + width: 4, + color: AppColor.primaryColor, + endCap: Cap.roundCap, + startCap: Cap.roundCap, + geodesic: true, + ), + ); + + update(); + await Future.delayed(const Duration(milliseconds: 1)); + } + + // Color change animations + for (int cycle = 0; cycle < 6; cycle++) { + // Change to green + polyLines.clear(); + polyLines.add( + Polyline( + polylineId: const PolylineId('animated_route'), + points: coordinates, + width: 4, + color: AppColor.bronze, + endCap: Cap.roundCap, + startCap: Cap.roundCap, + geodesic: true, + ), + ); + update(); + await Future.delayed(const Duration(milliseconds: 500)); + + // Change back to primary color + polyLines.clear(); + polyLines.add( + Polyline( + polylineId: const PolylineId('animated_route'), + points: coordinates, + width: 4, + color: AppColor.writeColor, + endCap: Cap.roundCap, + startCap: Cap.roundCap, + geodesic: true, + ), + ); + update(); + await Future.delayed(const Duration(milliseconds: 500)); + } + } +// Add this method to your controller class + // Future _animatePolyline(List coordinates) async { + // // Clear existing polylines + // polyLines.clear(); + + // // Create segments for animation + // List animatedPoints = []; + + // // Calculate step size for smoother animation + // int stepSize = (coordinates.length / 20).round(); + // stepSize = stepSize < 1 ? 1 : stepSize; + + // for (int i = 0; i < coordinates.length; i += stepSize) { + // // Add points gradually + // animatedPoints.add(coordinates[i]); + + // if (animatedPoints.length > 1) { + // // Remove previous polyline + // if (polyLines.isNotEmpty) { + // polyLines.clear(); + // } + // // Add new polyline segment + // polyLines.add( + // Polyline( + // polylineId: const PolylineId('animated_route'), + // points: List.from(animatedPoints), + // width: 4, + // color: Colors.blue, + // ), + // ); + + // // Update camera position to follow animation + // if (mapController != null) { + // final bounds = LatLngBounds( + // southwest: animatedPoints.reduce((value, element) => LatLng( + // min(value.latitude, element.latitude), + // min(value.longitude, element.longitude))), + // northeast: animatedPoints.reduce((value, element) => LatLng( + // max(value.latitude, element.latitude), + // max(value.longitude, element.longitude))), + // ); + + // mapController!.animateCamera( + // CameraUpdate.newLatLngBounds(bounds, 100), + // ); + // } + // } + + // update(); + // await Future.delayed(const Duration(milliseconds: 50)); + // } + // } + String shortenAddress(String fullAddress) { // Split the address into parts List parts = fullAddress.split('،'); @@ -4871,7 +5008,7 @@ class MapPassengerController extends GetxController { try { var d = jsonDecode(res); driversForMishwari = d['message']; - Log.print('driversForMishwari: ${driversForMishwari}'); + Log.print('driversForMishwari: $driversForMishwari'); update(); } catch (e) { // Handle invalid JSON format diff --git a/lib/controller/home/profile/complaint_controller.dart b/lib/controller/home/profile/complaint_controller.dart index 3e3aa42..ce02477 100644 --- a/lib/controller/home/profile/complaint_controller.dart +++ b/lib/controller/home/profile/complaint_controller.dart @@ -1,7 +1,6 @@ import 'dart:convert'; import 'dart:io'; -import 'package:SEFER/views/widgets/my_dialog.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:http/http.dart' as http; @@ -17,6 +16,7 @@ import 'package:mime/mime.dart'; import '../../../constant/api_key.dart'; import '../../../print.dart'; +import '../../../views/widgets/mydialoug.dart'; class ComplaintController extends GetxController { bool isLoading = false; diff --git a/lib/controller/home/profile/invit_controller.dart b/lib/controller/home/profile/invit_controller.dart index e7307f2..985c374 100644 --- a/lib/controller/home/profile/invit_controller.dart +++ b/lib/controller/home/profile/invit_controller.dart @@ -5,16 +5,15 @@ import 'package:SEFER/constant/colors.dart'; import 'package:SEFER/constant/links.dart'; import 'package:SEFER/controller/functions/crud.dart'; import 'package:SEFER/controller/payment/payment_controller.dart'; -import 'package:SEFER/views/widgets/mysnakbar.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_contacts/contact.dart'; import 'package:flutter_contacts/flutter_contacts.dart'; import 'package:get/get.dart'; import 'package:share/share.dart'; import '../../../main.dart'; import '../../../print.dart'; -import '../../../views/widgets/my_dialog.dart'; +import '../../../views/widgets/error_snakbar.dart'; +import '../../../views/widgets/mydialoug.dart'; import '../../functions/launch.dart'; import '../../notification/notification_captain_controller.dart'; diff --git a/lib/controller/home/splash_screen_controlle.dart b/lib/controller/home/splash_screen_controlle.dart index d13edbc..8c0e304 100644 --- a/lib/controller/home/splash_screen_controlle.dart +++ b/lib/controller/home/splash_screen_controlle.dart @@ -13,112 +13,84 @@ import '../../onbording_page.dart'; import '../auth/login_controller.dart'; class SplashScreenController extends GetxController - with SingleGetTickerProviderMixin { - late AnimationController animationController; - late Animation zoomInAnimation; - late Animation zoomOutAnimation; + with GetTickerProviderStateMixin { + late AnimationController _animationController; + late Animation animation; + final progress = 0.0.obs; + Timer? _progressTimer; String packageInfo = ''; - late String version = '1.5.48'; - Future checkForUpdate() async { - final packageInfo = await PackageInfo.fromPlatform(); - final currentVersion = packageInfo.buildNumber; - final version1 = packageInfo.version; - print('currentVersion is : $currentVersion'); - // Fetch the latest version from your server - version = version1.toString(); - print('version: ${version}'); + + Future _getPackageInfo() async { + final info = await PackageInfo.fromPlatform(); + packageInfo = info.version; + box.write(BoxName.packagInfo, packageInfo); update(); } - StreamSubscription? _sub; - // Future initUniLinks() async { - // // Handle initial URI if the app was launched from a link - // try { - // final initialUri = await getInitialUri(); - // if (initialUri != null) { - // handleLink(initialUri); - // } - // } on PlatformException { - // // Handle exception by warning the user their action did not succeed - // print("Failed to get initial uri"); - // } + @override + void onInit() { + super.onInit(); + _getPackageInfo(); + _animationController = AnimationController( + vsync: this, + duration: const Duration(milliseconds: 1500), // Reduced duration + )..forward(); - // // Listen to new links while the app is running - // _sub = uriLinkStream.listen((Uri? uri) { - // if (uri != null) { - // handleLink(uri); - // } - // }, onError: (Object err) { - // print('Error occurred: $err'); - // }); - // } + animation = + CurvedAnimation(parent: _animationController, curve: Curves.easeOut); - void handleLink(Uri uri) { - if (uri.host == 'sefer.live' && uri.path == '/tripmonitor') { - final rideId = uri.queryParameters['rideId']; - final driverId = uri.queryParameters['driverId']; - - if (rideId != null && driverId != null) { - Get.toNamed('/tripmonitor', parameters: { - 'rideId': rideId, - 'driverId': driverId, - }); - } else { - // Handle the case where rideId or driverId is null - print('Invalid parameters in the deep link'); - // You might want to show an error message to the user or handle this case differently - } - } + startTimer(); + _startProgressTimer(); } - @override - void onInit() async { - super.onInit(); - checkForUpdate(); - // initUniLinks(); - animationController = AnimationController( - vsync: this, - duration: const Duration(seconds: 4), - ); + void _startProgressTimer() { + const totalTime = 3000; // 5 seconds in milliseconds + const interval = 50; // Update every 50ms + int elapsed = 0; - zoomInAnimation = Tween(begin: 1.0, end: 1.5).animate( - CurvedAnimation( - parent: animationController, - curve: Curves.easeInOut, - ), - ); + _progressTimer = + Timer.periodic(const Duration(milliseconds: interval), (timer) async { + elapsed += interval; + progress.value = (elapsed / totalTime).clamp(0.0, 1.0); - zoomOutAnimation = Tween(begin: 1.5, end: 1.0).animate( - CurvedAnimation( - parent: animationController, - curve: Curves.easeInOut, - ), - ); - - animationController.repeat(reverse: true); - startTimer(); + if (elapsed >= totalTime) { + timer.cancel(); + box.read(BoxName.onBoarding) == null + ? Get.off(() => OnBoardingPage()) + : box.read(BoxName.email) != null && + box.read(BoxName.phone) != null && + box.read(BoxName.isVerified) == '1' + // ? Get.off(() => const MapPagePassenger()) + ? await Get.put(LoginController()).loginUsingCredentials( + box.read(BoxName.passengerID).toString(), + box.read(BoxName.email).toString(), + ) + : Get.off(() => LoginPage()); + } + }); } void startTimer() async { Timer(const Duration(seconds: 5), () async { - box.read(BoxName.onBoarding) == null - ? Get.off(() => OnBoardingPage()) - : box.read(BoxName.email) != null && - box.read(BoxName.phone) != null && - box.read(BoxName.isVerified) == '1' - // ? Get.off(() => const MapPagePassenger()) - ? await Get.put(LoginController()).loginUsingCredentials( - box.read(BoxName.passengerID).toString(), - box.read(BoxName.email).toString(), - ) - : Get.off(() => LoginPage()); + // box.read(BoxName.onBoarding) == null + // ? Get.off(() => OnBoardingPage()) + // : box.read(BoxName.email) != null && + // box.read(BoxName.phone) != null && + // box.read(BoxName.isVerified) == '1' + // // ? Get.off(() => const MapPagePassenger()) + // ? await Get.put(LoginController()).loginUsingCredentials( + // box.read(BoxName.passengerID).toString(), + // box.read(BoxName.email).toString(), + // ) + // : Get.off(() => LoginPage()); }); } @override void onClose() { - animationController.dispose(); + _progressTimer?.cancel(); + _animationController.dispose(); super.onClose(); } } diff --git a/lib/controller/home/vip_waitting_page.dart b/lib/controller/home/vip_waitting_page.dart index 7990458..a38897f 100644 --- a/lib/controller/home/vip_waitting_page.dart +++ b/lib/controller/home/vip_waitting_page.dart @@ -10,7 +10,6 @@ import 'package:SEFER/main.dart'; import 'package:SEFER/views/widgets/elevated_btn.dart'; import 'package:SEFER/views/widgets/my_scafold.dart'; import 'package:SEFER/views/widgets/mycircular.dart'; -import 'package:SEFER/views/widgets/mysnakbar.dart'; import 'package:flutter/material.dart'; import 'package:flutter_font_icons/flutter_font_icons.dart'; import 'package:get/get.dart'; diff --git a/lib/controller/local/local_controller.dart b/lib/controller/local/local_controller.dart index ebb51cb..cbf041a 100644 --- a/lib/controller/local/local_controller.dart +++ b/lib/controller/local/local_controller.dart @@ -8,73 +8,82 @@ import '../themes/themes.dart'; class LocaleController extends GetxController { Locale? language; String countryCode = ''; - void restartApp() { - runApp(const MyApp()); - } - ThemeData appTheme = themeEnglish; + ThemeData appTheme = lightThemeEnglish; - changeLang(String langcode) { + void changeLang(String langcode) { Locale locale; switch (langcode) { case "ar": locale = const Locale("ar"); - appTheme = themeArabic; + appTheme = lightThemeArabic; + box.write(BoxName.lang, 'ar'); break; case "en": locale = const Locale("en"); - appTheme = themeEnglish; + appTheme = lightThemeEnglish; + box.write(BoxName.lang, 'en'); break; case "tr": locale = const Locale("tr"); - appTheme = themeEnglish; + appTheme = lightThemeEnglish; + box.write(BoxName.lang, 'tr'); break; case "fr": locale = const Locale("fr"); - appTheme = themeEnglish; + appTheme = lightThemeEnglish; + box.write(BoxName.lang, 'fr'); break; case "it": locale = const Locale("it"); - appTheme = themeEnglish; + appTheme = lightThemeEnglish; + box.write(BoxName.lang, 'it'); break; case "de": locale = const Locale("de"); - appTheme = themeEnglish; + appTheme = lightThemeEnglish; + box.write(BoxName.lang, 'de'); break; case "el": locale = const Locale("el"); - appTheme = themeEnglish; + appTheme = lightThemeEnglish; + box.write(BoxName.lang, 'el'); break; case "es": locale = const Locale("es"); - appTheme = themeEnglish; + appTheme = lightThemeEnglish; + box.write(BoxName.lang, 'es'); break; case "fa": locale = const Locale("fa"); - appTheme = themeArabic; + appTheme = lightThemeEnglish; + box.write(BoxName.lang, 'fa'); break; case "zh": locale = const Locale("zh"); - appTheme = themeEnglish; + appTheme = lightThemeEnglish; + box.write(BoxName.lang, 'zh'); break; case "ru": locale = const Locale("ru"); - appTheme = themeEnglish; + appTheme = lightThemeEnglish; + box.write(BoxName.lang, 'ru'); break; case "hi": locale = const Locale("hi"); - appTheme = themeEnglish; + appTheme = lightThemeEnglish; + box.write(BoxName.lang, 'hi'); break; default: locale = Locale(Get.deviceLocale!.languageCode); - appTheme = themeEnglish; + box.write(BoxName.lang, Get.deviceLocale!.languageCode); + appTheme = lightThemeEnglish; break; } box.write(BoxName.lang, langcode); Get.changeTheme(appTheme); Get.updateLocale(locale); - restartApp(); update(); } @@ -88,7 +97,94 @@ class LocaleController extends GetxController { } changeLang(storedLang); - super.onInit(); } } + +// class LocaleController extends GetxController { +// Locale? language; +// String countryCode = ''; +// void restartApp() { +// runApp(const MyApp()); +// } + +// ThemeData appTheme = themeEnglish; + +// changeLang(String langcode) { +// Locale locale; +// switch (langcode) { +// case "ar": +// locale = const Locale("ar"); +// appTheme = themeArabic; +// break; +// case "en": +// locale = const Locale("en"); +// appTheme = themeEnglish; +// break; +// case "tr": +// locale = const Locale("tr"); +// appTheme = themeEnglish; +// break; +// case "fr": +// locale = const Locale("fr"); +// appTheme = themeEnglish; +// break; +// case "it": +// locale = const Locale("it"); +// appTheme = themeEnglish; +// break; +// case "de": +// locale = const Locale("de"); +// appTheme = themeEnglish; +// break; +// case "el": +// locale = const Locale("el"); +// appTheme = themeEnglish; +// break; +// case "es": +// locale = const Locale("es"); +// appTheme = themeEnglish; +// break; +// case "fa": +// locale = const Locale("fa"); +// appTheme = themeArabic; +// break; +// case "zh": +// locale = const Locale("zh"); +// appTheme = themeEnglish; +// break; +// case "ru": +// locale = const Locale("ru"); +// appTheme = themeEnglish; +// break; +// case "hi": +// locale = const Locale("hi"); +// appTheme = themeEnglish; +// break; +// default: +// locale = Locale(Get.deviceLocale!.languageCode); +// appTheme = themeEnglish; +// break; +// } + +// box.write(BoxName.lang, langcode); +// Get.changeTheme(appTheme); +// Get.updateLocale(locale); +// restartApp(); +// update(); +// } + +// @override +// void onInit() { +// String? storedLang = box.read(BoxName.lang); +// if (storedLang == null) { +// // Use device language if no language is stored +// storedLang = Get.deviceLocale!.languageCode; +// box.write(BoxName.lang, storedLang); +// } + +// changeLang(storedLang); + +// super.onInit(); +// } +// } diff --git a/lib/controller/local/translations.dart b/lib/controller/local/translations.dart index c0d2313..1aaf29b 100644 --- a/lib/controller/local/translations.dart +++ b/lib/controller/local/translations.dart @@ -4,11 +4,15 @@ class MyTranslation extends Translations { @override Map> get keys => { "ar": { + "You should restart app to change language": + "يجب إعادة تشغيل التطبيق لتغيير اللغة", "Home Page": "الصفحة الرئيسية", "To change Language the App": "لتغيير لغة التطبيق", "Learn more about our app and mission": "تعرف على المزيد حول تطبيقنا ورسالتنا", "Promos For Today": "عروض اليوم", + 'Choose your ride': "اختر رحلتك", + "Your Journey Begins Here": "رحلتك تبدأ هنا", 'Bonus gift': 'بونص', "Pay": "ادفع", "Get": "احصل على", "Send to Driver Again": "إرسال إلى السائق مرة أخرى", @@ -436,17 +440,74 @@ iOS [https://getapp.cc/app/6458734951] "To : ": "إِلَى: ", "Add Promo": "إضَافَة بَرُومُو", "Confirm Selection": "تَأْكِيد الاخْتِيَار", - "distance is": "المَسَافَة", - "duration is": "المُدَّة", - "I don't need a ride anymore": - "لَسْتُ بِحَاجَة إِلَى رِحْلَة بَعْد الآن", - "I was just trying the application": - "كُنْتُ فَقَط أُجَرِّب التَّطْبِيق", - "No driver accepted my request": "لَمْ يَقْبَل أَيُّ سَائِق طَلَبِي", + "distance is": "المَسَافَة", "About Us": "عنّا", + "SEFER LLC": "شركة SEFER", + "Egypt's pioneering ride-sharing service, proudly developed by Arabian and local owners. We prioritize being near you – both our valued passengers and our dedicated captains.": + "أول خدمة مشاركة ركوب في مصر، تم تطويرها بفخر من قبل مالكين عرب ومحليين. نحن نركز على أن نكون قريبين منك - سواء كنت راكبًا قيمًا أو قائدًا مخلصًا.", + "Why Choose SEFER?": "لماذا تختار SEFER؟", + "Closest to You": "الأقرب إليك", + "We connect you with the nearest drivers for faster pickups and quicker journeys.": + "نربطك بأقرب السائقين لضمان وصول سريع ورحلات أسرع.", + "Uncompromising Security": "أعلى مستويات الأمان", + "Lady Captains Available": "قائدات سيارات متاحات", + "Recorded Trips (Voice & AI Analysis)": + "الرحلات المسجلة (تحليل صوتي بالذكاء الاصطناعي)", + "Fastest Complaint Response": "أسرع استجابة للشكاوى", + "Our dedicated customer service team ensures swift resolution of any issues.": + "فريق خدمة العملاء لدينا يضمن حل أي مشكلة بسرعة.", + "Affordable for Everyone": "في متناول الجميع", + "Frequently Asked Questions": "الأسئلة الشائعة", + "Getting Started": "البدء", + "How do I request a ride?": "كيف يمكنني طلب رحلة؟", + "Simply open the Sefer app, enter your destination, and tap \"Request Ride\". The app will connect you with a nearby driver.": + "افتح تطبيق Sefer، وأدخل وجهتك، واضغط على \"طلب رحلة\". سيقوم التطبيق بتوصيلك بأقرب سائق.", + "Vehicle Options": "خيارات المركبات", + "What types of vehicles are available?": + "ما هي أنواع المركبات المتاحة؟", + "Sefer offers a variety of options including Economy, Comfort, and Luxury to suit your needs and budget.": + "يوفر Sefer مجموعة متنوعة من الخيارات بما في ذلك الاقتصادية، المريحة، والفاخرة لتلبية احتياجاتك وميزانيتك.", + "Payments": "المدفوعات", + "How can I pay for my ride?": "كيف يمكنني دفع تكلفة رحلتي؟", + "You can pay for your ride using cash or credit/debit card. You can select your preferred payment method before confirming your ride.": + "يمكنك دفع تكلفة رحلتك نقدًا أو باستخدام بطاقة ائتمان/خصم. يمكنك اختيار طريقة الدفع المفضلة قبل تأكيد الرحلة.", + "Ride Management": "إدارة الرحلات", + "Can I cancel my ride?": "هل يمكنني إلغاء رحلتي؟", + "Yes, you can cancel your ride, but please note that cancellation fees may apply depending on how far in advance you cancel.": + "نعم، يمكنك إلغاء رحلتك، ولكن يرجى ملاحظة أن رسوم الإلغاء قد تنطبق اعتمادًا على توقيت الإلغاء.", + "For Drivers": "للسائقين", + "Driver Registration & Requirements": "التسجيل ومتطلبات السائقين", + "Driver Registration": "تسجيل السائق", + "To register as a driver or learn about the requirements, please visit our website or contact Sefer support directly.": + "لتسجيل نفسك كسائق أو لمعرفة المتطلبات، يرجى زيارة موقعنا الإلكتروني أو الاتصال بدعم Sefer مباشرة.", + "Visit Website/Contact Support": "زيارة الموقع/الاتصال بالدعم", + "Close": "إغلاق", + "Communication": "التواصل", + "How do I communicate with the other party (passenger/driver)?": + "كيف يمكنني التواصل مع الطرف الآخر (الراكب/السائق)؟", + "You can communicate with your driver or passenger through the in-app chat feature once a ride is confirmed.": + "يمكنك التواصل مع السائق أو الراكب من خلال ميزة الدردشة داخل التطبيق بمجرد تأكيد الرحلة.", + "Safety & Security": "الأمان والحماية", + "What safety measures does Sefer offer?": + "ما هي تدابير الأمان التي يوفرها Sefer؟", + "Sefer offers various safety features including driver verification, in-app trip tracking, emergency contact options, and the ability to share your trip status with trusted contacts.": + "يوفر Sefer ميزات أمان مختلفة بما في ذلك التحقق من السائق، تتبع الرحلة داخل التطبيق، خيارات الاتصال في حالات الطوارئ، والقدرة على مشاركة حالة رحلتك مع جهات اتصال موثوقة.", + "Enjoy competitive prices across all trip options, making travel accessible.": + "استمتع بأسعار تنافسية لجميع خيارات الرحلات، مما يجعل السفر متاحًا.", + "Variety of Trip Choices": "خيارات رحلات متنوعة", + "Choose the trip option that perfectly suits your needs and preferences.": + "اختر خيار الرحلة الذي يناسب احتياجاتك وتفضيلاتك.", + "Your Choice, Our Priority": "اختيارك هو أولويتنا", + "Because we are near, you have the flexibility to choose the ride that works best for you.": + "لأننا قريبون، لديك المرونة لاختيار الرحلة التي تناسبك.", + "duration is": "المُدَّة", "Setting": "الإعدادات", + "Find answers to common questions": "اعثر على إجابات للأسئلة الشائعة", + "I don't need a ride anymore": "لا أحتاج إلى رحلة بعد الآن", + "I was just trying the application": "كنت أجرب التطبيق فقط", + "No driver accepted my request": "لم يقبل أي سائق طلبي", "I added the wrong pick-up/drop-off location": - "أَضَفْتُ مَوْقِع الالْتِقَاط/التَّسْلِيم الخَاطِئ", - "I don't have a reason": "لَيْسَ لَدَيَّ سَبَب", - "Other": "آخَر", + "أضفت موقع استلام/توصيل خاطئ", + "I don't have a reason": "ليس لدي سبب", + "Other": "أخرى", "Can we know why you want to cancel Ride ?": "هَل يُمْكِنُنَا مَعْرِفَة سَبَب رَغْبَتِكَ فِي إلْغَاء الرِّحْلَة؟", "Cancel Ride": "إلْغَاء الرِّحْلَة", diff --git a/lib/controller/notification/passenger_notification_controller.dart b/lib/controller/notification/passenger_notification_controller.dart index 062e162..c942672 100644 --- a/lib/controller/notification/passenger_notification_controller.dart +++ b/lib/controller/notification/passenger_notification_controller.dart @@ -1,12 +1,12 @@ import 'dart:convert'; -import 'package:SEFER/views/widgets/my_dialog.dart'; import 'package:get/get.dart'; import 'package:SEFER/controller/firebase/firbase_messge.dart'; import '../../constant/box_name.dart'; import '../../constant/links.dart'; import '../../main.dart'; +import '../../views/widgets/mydialoug.dart'; import '../functions/crud.dart'; class PassengerNotificationController extends GetxController { diff --git a/lib/controller/payment/passenger_wallet_history_controller.dart b/lib/controller/payment/passenger_wallet_history_controller.dart index fe8eea9..0ba5ba0 100644 --- a/lib/controller/payment/passenger_wallet_history_controller.dart +++ b/lib/controller/payment/passenger_wallet_history_controller.dart @@ -1,31 +1,42 @@ import 'dart:convert'; -import 'package:SEFER/views/widgets/my_dialog.dart'; import 'package:get/get.dart'; 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 '../../views/widgets/mydialoug.dart'; + class PassengerWalletHistoryController extends GetxController { bool isLoading = false; List archive = []; - getArchivePayment() async { - isLoading = true; - update(); - var res = await CRUD().get( - link: AppLink.getPassengerWalletArchive, - payload: {'passenger_id': box.read(BoxName.passengerID)}); - if (res != 'failure') { - archive = jsonDecode(res)['message']; - isLoading = false; + Future getArchivePayment() async { + try { + isLoading = true; update(); - } else { - MyDialog().getDialog('No wallet record found'.tr, '', () { - Get.back(); + + var res = await CRUD().get( + link: AppLink.getPassengerWalletArchive, + payload: {'passenger_id': box.read(BoxName.passengerID)}, + ); + + if (res != 'failure') { + archive = jsonDecode(res)['message']; + } else { + MyDialog().getDialog('No wallet record found'.tr, '', () { + Get.back(); + Get.back(); + }); + } + } catch (e) { + MyDialog().getDialog('An error occurred'.tr, e.toString(), () { Get.back(); }); + } finally { + isLoading = false; + update(); } } diff --git a/lib/controller/themes/themes.dart b/lib/controller/themes/themes.dart index 17fd014..e6f6156 100644 --- a/lib/controller/themes/themes.dart +++ b/lib/controller/themes/themes.dart @@ -3,19 +3,21 @@ import 'package:SEFER/constant/style.dart'; import '../../constant/colors.dart'; -ThemeData themeEnglish = ThemeData( - fontFamily: "PlayfairDisplay", +ThemeData lightThemeEnglish = ThemeData( + brightness: Brightness.light, + fontFamily: "SFPro", textTheme: TextTheme( - displaySmall: AppStyle.title, - displayLarge: AppStyle.title, - displayMedium: AppStyle.title, - bodyLarge: AppStyle.title, - bodyMedium: AppStyle.title), + displaySmall: AppStyle.title, + displayLarge: AppStyle.headTitle, + displayMedium: AppStyle.headTitle2, + bodyLarge: AppStyle.title, + bodyMedium: AppStyle.subtitle, + ), primarySwatch: Colors.blue, dialogTheme: DialogTheme( backgroundColor: AppColor.secondaryColor, contentTextStyle: AppStyle.title, - titleTextStyle: AppStyle.title, + titleTextStyle: AppStyle.headTitle2, ), appBarTheme: AppBarTheme( elevation: 0, @@ -25,35 +27,122 @@ ThemeData themeEnglish = ThemeData( color: AppColor.primaryColor, ), toolbarTextStyle: TextTheme( - titleSmall: AppStyle.subtitle, - headlineSmall: AppStyle.title, - titleLarge: AppStyle.headTitle2) - .bodyMedium, + titleSmall: AppStyle.subtitle, + headlineSmall: AppStyle.title, + titleLarge: AppStyle.headTitle2, + ).bodyMedium, titleTextStyle: TextTheme( - titleSmall: AppStyle.subtitle, - headlineSmall: AppStyle.title, - titleLarge: AppStyle.headTitle2) - .titleLarge, + titleSmall: AppStyle.subtitle, + headlineSmall: AppStyle.title, + titleLarge: AppStyle.headTitle2, + ).titleLarge, ), ); -ThemeData themeArabic = ThemeData( - fontFamily: "Cairo", - textTheme: const TextTheme( - displayLarge: TextStyle( - fontWeight: FontWeight.bold, - fontSize: 22, - color: AppColor.primaryColor), - displayMedium: TextStyle( - fontWeight: FontWeight.bold, - fontSize: 26, - color: AppColor.primaryColor), - bodyLarge: TextStyle( - height: 2, - color: AppColor.accentColor, - fontWeight: FontWeight.bold, - fontSize: 14), - bodyMedium: - TextStyle(height: 2, color: AppColor.accentColor, fontSize: 14)), +ThemeData darkThemeEnglish = ThemeData( + brightness: Brightness.dark, + fontFamily: "SFPro", + textTheme: TextTheme( + displaySmall: AppStyle.title, + displayLarge: AppStyle.headTitle, + displayMedium: AppStyle.headTitle2, + bodyLarge: AppStyle.title, + bodyMedium: AppStyle.subtitle, + ), primarySwatch: Colors.blue, + dialogTheme: DialogTheme( + backgroundColor: AppColor.secondaryColor, + contentTextStyle: AppStyle.title, + titleTextStyle: AppStyle.headTitle2, + ), + appBarTheme: AppBarTheme( + elevation: 0, + color: AppColor.secondaryColor, + centerTitle: true, + iconTheme: const IconThemeData( + color: AppColor.primaryColor, + ), + toolbarTextStyle: TextTheme( + titleSmall: AppStyle.subtitle, + headlineSmall: AppStyle.title, + titleLarge: AppStyle.headTitle2, + ).bodyMedium, + titleTextStyle: TextTheme( + titleSmall: AppStyle.subtitle, + headlineSmall: AppStyle.title, + titleLarge: AppStyle.headTitle2, + ).titleLarge, + ), +); + +ThemeData lightThemeArabic = ThemeData( + brightness: Brightness.light, + fontFamily: 'SFArabic', + textTheme: TextTheme( + displaySmall: AppStyle.title, + displayLarge: AppStyle.headTitle, + displayMedium: AppStyle.headTitle2, + bodyLarge: AppStyle.title, + bodyMedium: AppStyle.subtitle, + ), + primarySwatch: Colors.blue, + dialogTheme: DialogTheme( + backgroundColor: AppColor.secondaryColor, + contentTextStyle: AppStyle.title, + titleTextStyle: AppStyle.headTitle2, + ), + appBarTheme: AppBarTheme( + elevation: 0, + color: AppColor.secondaryColor, + centerTitle: true, + iconTheme: const IconThemeData( + color: AppColor.primaryColor, + ), + toolbarTextStyle: TextTheme( + titleSmall: AppStyle.subtitle, + headlineSmall: AppStyle.title, + titleLarge: AppStyle.headTitle2, + ).bodyMedium, + titleTextStyle: TextTheme( + titleSmall: AppStyle.subtitle, + headlineSmall: AppStyle.title, + titleLarge: AppStyle.headTitle2, + ).titleLarge, + ), +); + +ThemeData darkThemeArabic = ThemeData( + brightness: Brightness.dark, + fontFamily: 'SFArabic', + textTheme: TextTheme( + displaySmall: AppStyle.title, + displayLarge: AppStyle.headTitle, + displayMedium: AppStyle.headTitle2, + bodyLarge: AppStyle.title, + bodyMedium: AppStyle.subtitle, + ), + primarySwatch: Colors.blue, + dialogTheme: DialogTheme( + backgroundColor: AppColor.secondaryColor, + contentTextStyle: AppStyle.title, + titleTextStyle: AppStyle.headTitle2, + ), + appBarTheme: AppBarTheme( + elevation: 0, + color: AppColor.secondaryColor, + centerTitle: true, + iconTheme: const IconThemeData( + color: AppColor.primaryColor, + ), + toolbarTextStyle: TextTheme( + titleSmall: AppStyle.subtitle, + headlineSmall: AppStyle.title, + titleLarge: AppStyle.headTitle2, + ).bodyMedium, + titleTextStyle: TextTheme( + titleSmall: AppStyle.subtitle, + headlineSmall: AppStyle.title, + titleLarge: AppStyle.headTitle2, + ).titleLarge, + ), ); diff --git a/lib/models/db_sql.dart b/lib/models/db_sql.dart index 4178e68..8cc4c85 100644 --- a/lib/models/db_sql.dart +++ b/lib/models/db_sql.dart @@ -41,7 +41,7 @@ class DbSql { createdAt TEXT ) '''); - await db.execute('DROP TABLE IF EXISTS ${TableName.recentLocations}'); + // await db.execute('DROP TABLE IF EXISTS ${TableName.recentLocations}'); await db.execute(''' CREATE TABLE ${TableName.recentLocations}( id INTEGER PRIMARY KEY AUTOINCREMENT, diff --git a/lib/splash_screen_page.dart b/lib/splash_screen_page.dart index 9a66819..0c37bdb 100644 --- a/lib/splash_screen_page.dart +++ b/lib/splash_screen_page.dart @@ -18,65 +18,195 @@ class SplashScreen extends StatelessWidget { @override Widget build(BuildContext context) { return Scaffold( - backgroundColor: - AppColor.secondaryColor, // Set your desired background color - body: Center( - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - GetBuilder( - builder: (_) { - return AnimatedBuilder( - animation: splashScreenController.animationController, - builder: (BuildContext context, Widget? child) { - return Transform.scale( - scale: - splashScreenController.animationController.value < 0.2 - ? splashScreenController.zoomInAnimation.value - : splashScreenController.zoomOutAnimation.value, - child: Image.asset( - 'assets/images/logo.gif', - width: Get.width * .5, + body: Container( + decoration: const BoxDecoration( + gradient: LinearGradient( + begin: Alignment.topCenter, + end: Alignment.bottomCenter, + colors: [ + AppColor.primaryColor, + // AppColor.primaryColor, + AppColor.secondaryColor, + AppColor.secondaryColor, + ], + ), + ), + child: Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + GetBuilder( + builder: (_) { + return ScaleTransition( + scale: splashScreenController.animation, + child: FadeTransition( + opacity: splashScreenController.animation, + child: Column( + children: [ + DefaultTextStyle( + style: AppStyle.headTitle.copyWith( + color: AppColor.primaryColor, + fontSize: 48, + fontWeight: FontWeight.bold, + ), + child: AnimatedTextKit( + animatedTexts: [ + WavyAnimatedText( + AppInformation.appName, + speed: const Duration(milliseconds: 200), + ), + ], + isRepeatingAnimation: false, + onFinished: () { + // Trigger any additional animations here + }, + ), + ), + const SizedBox(height: 20), + DefaultTextStyle( + style: AppStyle.title.copyWith( + color: AppColor.writeColor.withOpacity(0.8), + fontSize: 18, + ), + child: AnimatedTextKit( + animatedTexts: [ + TyperAnimatedText( + 'Your Journey Begins Here'.tr, + speed: const Duration(milliseconds: 100), + ), + ], + isRepeatingAnimation: false, + ), + ), + ], ), - ); - }, - ); - }, - ), - AnimatedTextKit(animatedTexts: [ - TypewriterAnimatedText( - 'Welcome to ${AppInformation.appName}', - textStyle: - AppStyle.headTitle2.copyWith(color: AppColor.writeColor), - speed: const Duration(milliseconds: 200), + ), + ); + }, ), - ], isRepeatingAnimation: true), - const SizedBox( - height: 20, - ), - AnimatedTextKit(animatedTexts: [ - TypewriterAnimatedText( - 'Powered By ${AppInformation.appName} LLC', - textStyle: - AppStyle.title.copyWith(color: AppColor.primaryColor), - speed: const Duration(milliseconds: 200), + Padding( + padding: + const EdgeInsets.symmetric(horizontal: 40, vertical: 20), + child: Column( + children: [ + Obx(() => LinearProgressIndicator( + value: splashScreenController.progress.value, + backgroundColor: AppColor.writeColor.withOpacity(0.2), + valueColor: AlwaysStoppedAnimation( + AppColor.primaryColor), + minHeight: 3, + )), + const SizedBox(height: 16), + Text( + 'Version: ${box.read(BoxName.packagInfo) ?? '1.0.0'}', + style: AppStyle.subtitle.copyWith( + color: AppColor.writeColor.withOpacity(0.6), + ), + ), + const SizedBox(height: 20), + ], + ), ), - ], isRepeatingAnimation: false), - const SizedBox( - height: 100, - ), - ], + ], + ), ), ), - bottomNavigationBar: Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Text( - box.read(BoxName.packagInfo) ?? '1.4.61', - style: AppStyle.subtitle, + bottomNavigationBar: Padding( + padding: const EdgeInsets.only(bottom: 16.0), + child: Text( + 'Version: ${box.read(BoxName.packagInfo) ?? '1.0.0'}', + style: AppStyle.subtitle.copyWith( + color: AppColor.writeColor.withOpacity(0.6), ), - ], + textAlign: TextAlign.center, + ), ), ); } } +// class SplashScreen extends StatelessWidget { +// final SplashScreenController splashScreenController = +// Get.put(SplashScreenController()); + +// SplashScreen({super.key}); + +// @override +// Widget build(BuildContext context) { +// return Scaffold( +// // Using a Container with BoxDecoration for gradient background +// body: Container( +// decoration: const BoxDecoration( +// gradient: LinearGradient( +// begin: Alignment.topCenter, +// end: Alignment.bottomCenter, +// colors: [ +// AppColor.primaryColor, +// AppColor.secondaryColor, +// ], +// ), +// ), +// child: Center( +// child: Column( +// mainAxisAlignment: MainAxisAlignment.center, +// children: [ +// GetBuilder( +// builder: (_) { +// return ScaleTransition( +// scale: splashScreenController.animation, +// child: FadeTransition( +// opacity: splashScreenController.animation, +// child: Image.asset( +// 'assets/images/logo.gif', +// width: Get.width * 0.4, // Slightly smaller logo +// ), +// ), +// ); +// }, +// ), +// const SizedBox(height: 20), +// DefaultTextStyle( +// style: AppStyle.headTitle2.copyWith(color: AppColor.writeColor), +// textAlign: TextAlign.center, +// child: AnimatedTextKit( +// animatedTexts: [ +// FadeAnimatedText(AppInformation.appName, +// duration: const Duration(milliseconds: 1000)), +// ], +// isRepeatingAnimation: false, // Only animate once +// pause: const Duration(milliseconds: 500), +// ), +// ), +// const SizedBox(height: 8), +// DefaultTextStyle( +// style: AppStyle.title +// .copyWith(color: AppColor.writeColor.withOpacity(0.8)), +// textAlign: TextAlign.center, +// child: AnimatedTextKit( +// animatedTexts: [ +// FadeAnimatedText('Powered By ${AppInformation.appName}', +// duration: const Duration(milliseconds: 1000)), +// ], +// isRepeatingAnimation: false, // Only animate once +// pause: const Duration(milliseconds: 500), +// ), +// ), +// ], +// ), +// ), +// ), +// bottomNavigationBar: Padding( +// padding: const EdgeInsets.only(bottom: 16.0), +// child: Row( +// mainAxisAlignment: MainAxisAlignment.center, +// children: [ +// Text( +// 'Version: ${box.read(BoxName.packagInfo) ?? '1.0.0'}', // More descriptive label +// style: AppStyle.subtitle +// .copyWith(color: AppColor.writeColor.withOpacity(0.6)), +// ), +// ], +// ), +// ), +// ); +// } +// } diff --git a/lib/views/auth/sms_verfy_page.dart b/lib/views/auth/sms_verfy_page.dart index 837c85f..981d721 100644 --- a/lib/views/auth/sms_verfy_page.dart +++ b/lib/views/auth/sms_verfy_page.dart @@ -1,7 +1,6 @@ import 'package:SEFER/constant/style.dart'; import 'package:SEFER/controller/auth/register_controller.dart'; import 'package:SEFER/views/widgets/elevated_btn.dart'; -import 'package:SEFER/views/widgets/my_dialog.dart'; import 'package:SEFER/views/widgets/my_scafold.dart'; import 'package:SEFER/views/widgets/my_textField.dart'; import 'package:flutter/material.dart'; diff --git a/lib/views/home/HomePage/about_page.dart b/lib/views/home/HomePage/about_page.dart index 7b487ca..04f219d 100644 --- a/lib/views/home/HomePage/about_page.dart +++ b/lib/views/home/HomePage/about_page.dart @@ -1,8 +1,7 @@ import 'package:SEFER/constant/box_name.dart'; import 'package:SEFER/main.dart'; -import 'package:flutter/material.dart'; -import 'package:get/get.dart'; import 'package:flutter/cupertino.dart'; +import 'package:get/get.dart'; class AboutPage extends StatelessWidget { const AboutPage({super.key}); @@ -15,136 +14,219 @@ class AboutPage extends StatelessWidget { ), child: SafeArea( child: SingleChildScrollView( - child: Column( - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - // Company Logo - Center( - child: Padding( - padding: const EdgeInsets.all(16.0), + child: Padding( + padding: const EdgeInsets.all(20.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + // Company Logo + Center( child: Image.asset( - 'assets/images/logo.png', // Replace with your logo image asset path - height: 100.0, - width: 100.0, + 'assets/images/logo.gif', // Replace with your logo image asset path + height: 80.0, ), ), - ), + const SizedBox(height: 20), - // Company Name and Location - Padding( - padding: const EdgeInsets.all(16.0), - child: Text( - 'SEFER LLC\n${box.read(BoxName.countryCode).toString().tr}', - style: - CupertinoTheme.of(context).textTheme.textStyle.copyWith( - fontSize: 22.0, - fontWeight: FontWeight.bold, - ), + // Company Name and Introduction + Text( + 'SEFER LLC', + style: CupertinoTheme.of(context).textTheme.navTitleTextStyle, textAlign: TextAlign.center, ), - ), - - // About Us Description - Padding( - padding: const EdgeInsets.symmetric(horizontal: 16.0), - child: Text( - 'SEFER is a ride-sharing app designed with your safety and affordability in mind. We connect you with reliable drivers in your area, ensuring a convenient and stress-free travel experience.\n\nHere are some of the key features that set us apart:' + const SizedBox(height: 8), + Text( + 'Egypt\'s pioneering ride-sharing service, proudly developed by Arabian and local owners. We prioritize being near you – both our valued passengers and our dedicated captains.' .tr, - style: - CupertinoTheme.of(context).textTheme.textStyle.copyWith( - fontSize: 16.0, - ), + style: CupertinoTheme.of(context).textTheme.textStyle, textAlign: TextAlign.center, ), - ), + const SizedBox(height: 30), - const SizedBox(height: 20), + // Key Features Section + Text( + 'Why Choose SEFER?'.tr, + style: CupertinoTheme.of(context).textTheme.navTitleTextStyle, + textAlign: TextAlign.center, + ), + const SizedBox(height: 15), - // Security Features - Padding( - padding: const EdgeInsets.symmetric(horizontal: 24.0), - child: Column( + // Nearest Availability + Row( + children: [ + const Icon(CupertinoIcons.location_solid, + color: CupertinoColors.activeBlue), + const SizedBox(width: 10), + Expanded( + child: Text( + 'Closest to You'.tr, + style: CupertinoTheme.of(context).textTheme.textStyle, + ), + ), + ], + ), + const SizedBox(height: 10), + Text( + 'We connect you with the nearest drivers for faster pickups and quicker journeys.' + .tr, + style: CupertinoTheme.of(context) + .textTheme + .textStyle + .copyWith(color: CupertinoColors.secondaryLabel), + ), + const SizedBox(height: 20), + + // High-Level Security + Row( + children: [ + const Icon(CupertinoIcons.shield_fill, + color: CupertinoColors.activeGreen), + const SizedBox(width: 10), + Expanded( + child: Text( + 'Uncompromising Security'.tr, + style: CupertinoTheme.of(context).textTheme.textStyle, + ), + ), + ], + ), + const SizedBox(height: 10), + Column( + crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( children: [ - const Icon(CupertinoIcons.lock_fill, - color: CupertinoColors.activeBlue), - const SizedBox(width: 8.0), - Expanded( - child: Text( - 'Most Secure Methods'.tr, - style: CupertinoTheme.of(context) - .textTheme - .textStyle - .copyWith( - fontSize: 16.0, - fontWeight: FontWeight.w500, - ), - ), + const Icon(CupertinoIcons.person_2_fill, + size: 18, color: CupertinoColors.activeGreen), + const SizedBox(width: 5), + Text( + 'Lady Captains Available'.tr, + style: CupertinoTheme.of(context) + .textTheme + .textStyle + .copyWith(fontSize: 15), ), ], ), - const SizedBox(height: 8.0), + const SizedBox(height: 5), Row( children: [ - const Icon(CupertinoIcons.phone_fill, - color: CupertinoColors.activeBlue), - const SizedBox(width: 8.0), - Expanded( - child: Text( - 'In-App VOIP Calls'.tr, - style: CupertinoTheme.of(context) - .textTheme - .textStyle - .copyWith( - fontSize: 16.0, - fontWeight: FontWeight.w500, - ), - ), - ), - ], - ), - const SizedBox(height: 8.0), - Row( - children: [ - const Icon(CupertinoIcons.videocam_fill, - color: CupertinoColors.activeBlue), - const SizedBox(width: 8.0), - Expanded( - child: Text( - 'Recorded Trips for Safety'.tr, - style: CupertinoTheme.of(context) - .textTheme - .textStyle - .copyWith( - fontSize: 16.0, - fontWeight: FontWeight.w500, - ), - ), + const Icon(CupertinoIcons.recordingtape, + size: 18, color: CupertinoColors.activeGreen), + const SizedBox(width: 5), + Text( + 'Recorded Trips (Voice & AI Analysis)'.tr, + style: CupertinoTheme.of(context) + .textTheme + .textStyle + .copyWith(fontSize: 15), ), ], ), ], ), - ), + const SizedBox(height: 20), - // Affordability Highlight - Padding( - padding: const EdgeInsets.symmetric(horizontal: 16.0), - child: Text( - '\nWe also prioritize affordability, offering competitive pricing to make your rides accessible.' - .tr, - style: - CupertinoTheme.of(context).textTheme.textStyle.copyWith( - fontSize: 16.0, - fontWeight: FontWeight.w500, - ), - textAlign: TextAlign.center, + // Fast Support + Row( + children: [ + const Icon(CupertinoIcons.bolt_horizontal_fill, + color: CupertinoColors.systemOrange), + const SizedBox(width: 10), + Expanded( + child: Text( + 'Fastest Complaint Response'.tr, + style: CupertinoTheme.of(context).textTheme.textStyle, + ), + ), + ], ), - ), + const SizedBox(height: 10), + Text( + 'Our dedicated customer service team ensures swift resolution of any issues.' + .tr, + style: CupertinoTheme.of(context) + .textTheme + .textStyle + .copyWith(color: CupertinoColors.secondaryLabel), + ), + const SizedBox(height: 20), - const SizedBox(height: 20), - ], + // Affordable Pricing + Row( + children: [ + const Icon(CupertinoIcons.money_dollar_circle_fill, + color: CupertinoColors.activeBlue), + const SizedBox(width: 10), + Expanded( + child: Text( + 'Affordable for Everyone'.tr, + style: CupertinoTheme.of(context).textTheme.textStyle, + ), + ), + ], + ), + const SizedBox(height: 10), + Text( + 'Enjoy competitive prices across all trip options, making travel accessible.' + .tr, + style: CupertinoTheme.of(context) + .textTheme + .textStyle + .copyWith(color: CupertinoColors.secondaryLabel), + ), + const SizedBox(height: 20), + + // Trip Options + Row( + children: [ + const Icon(CupertinoIcons.car_detailed, + color: CupertinoColors.systemPurple), + const SizedBox(width: 10), + Expanded( + child: Text( + 'Variety of Trip Choices'.tr, + style: CupertinoTheme.of(context).textTheme.textStyle, + ), + ), + ], + ), + const SizedBox(height: 10), + Text( + 'Choose the trip option that perfectly suits your needs and preferences.' + .tr, + style: CupertinoTheme.of(context) + .textTheme + .textStyle + .copyWith(color: CupertinoColors.secondaryLabel), + ), + const SizedBox(height: 20), + + // Passenger Choice + Row( + children: [ + Icon(CupertinoIcons.hand_draw_fill, + color: CupertinoColors.systemGreen), + const SizedBox(width: 10), + Expanded( + child: Text( + 'Your Choice, Our Priority'.tr, + style: CupertinoTheme.of(context).textTheme.textStyle, + ), + ), + ], + ), + const SizedBox(height: 10), + Text( + 'Because we are near, you have the flexibility to choose the ride that works best for you.' + .tr, + style: CupertinoTheme.of(context) + .textTheme + .textStyle + .copyWith(color: CupertinoColors.secondaryLabel), + ), + ], + ), ), ), ), diff --git a/lib/views/home/HomePage/frequentlyQuestionsPage.dart b/lib/views/home/HomePage/frequentlyQuestionsPage.dart index 5b371b9..b612441 100644 --- a/lib/views/home/HomePage/frequentlyQuestionsPage.dart +++ b/lib/views/home/HomePage/frequentlyQuestionsPage.dart @@ -1,146 +1,228 @@ -import 'package:SEFER/controller/home/map_passenger_controller.dart'; -import 'package:SEFER/views/widgets/my_scafold.dart'; +import 'package:SEFER/views/home/HomePage/contact_us.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; -import '../../../constant/style.dart'; - class FrequentlyQuestionsPage extends StatelessWidget { const FrequentlyQuestionsPage({super.key}); + void _showAnswerDialog(BuildContext context, String question, String answer) { + showCupertinoDialog( + context: context, + builder: (BuildContext context) => CupertinoAlertDialog( + title: Text(question, + style: const TextStyle( + fontWeight: FontWeight.bold, color: Colors.indigo)), + content: Text(answer), + actions: [ + CupertinoDialogAction( + isDefaultAction: true, + onPressed: () { + Navigator.of(context).pop(); + }, + child: const Text('Close'), + ), + ], + ), + ); + } + @override Widget build(BuildContext context) { - String selectedPayment = 'cash'; // Replace with your initial selection - bool canCancelRide = false; - return MyScafolld( - title: 'Frequently Questions'.tr, - body: [ - Padding( - padding: const EdgeInsets.all(8.0), - child: ListView( - children: [ - // Question 1: How do I request a ride? - ExpansionTile( - title: Text( + return CupertinoPageScaffold( + navigationBar: CupertinoNavigationBar( + backgroundColor: Colors.indigo, + middle: Text( + 'Frequently Asked Questions'.tr, + style: const TextStyle(color: Colors.white), + ), + ), + child: SafeArea( + child: ListView( + children: [ + CupertinoListSection.insetGrouped( + header: Text( + 'Getting Started'.tr, + style: const TextStyle(fontWeight: FontWeight.bold), + ), + children: [ + CupertinoListTile( + leading: const Icon( + CupertinoIcons.car_detailed, + color: Colors.indigo, + ), + title: Text('How do I request a ride?'.tr), + trailing: const CupertinoListTileChevron(), + onTap: () => _showAnswerDialog( + context, 'How do I request a ride?'.tr, - style: AppStyle.title, - ), - children: [ - Text( - 'Step-by-step instructions on how to request a ride through the Sefer app.' - .tr, - style: AppStyle.title, - ), - ], - ), - - // Question 2: What types of vehicles are available? - ExpansionTile( - title: Text( - 'What types of vehicles are available?'.tr, - style: AppStyle.title, - ), - children: [ - Text( - 'Sefer offers a variety of vehicle options to suit your needs, including economy, comfort, and luxury. Choose the option that best fits your budget and passenger count.' - .tr, - style: AppStyle.title, - ), - ], - ), - - // Question 3: How can I pay for my ride? - ExpansionTile( - title: Text( - 'How can I pay for my ride?'.tr, - style: AppStyle.title, - ), - children: [ - Text( - 'Sefer offers multiple payment methods for your convenience. Choose between cash payment or credit/debit card payment during ride confirmation.' - .tr, - style: AppStyle.title, - ), - ], - ), - - // Question 4: Can I cancel my ride? (if applicable) - ExpansionTile( - title: Text( - 'Can I cancel my ride?'.tr, - style: AppStyle.title, - ), - children: [ - Text( - 'Yes, you can cancel your ride under certain conditions (e.g., before driver is assigned). See the Sefer cancellation policy for details.' - .tr, - style: AppStyle.title, - ), - ], - ), - - // Question 5 & 6: Driver-specific questions - ExpansionTile( - title: Text( - 'Driver Registration & Requirements'.tr, - style: AppStyle.title, - ), - children: [ - Text( - '${'How can I register as a driver?'.tr}\n${'What are the requirements to become a driver?'.tr}', - style: AppStyle.title, - ), - InkWell( - onTap: () { - Get.find() - .getDialog('title', 'midTitle', () { - ; //todo add in this dialog papers for driver - }); - }, - child: Text( - 'Visit our website or contact Sefer support for information on driver registration and requirements.' - .tr, - style: AppStyle.title, - ), - ), - ], - ), - - // Question 7: How do I communicate with the other party? - ExpansionTile( - title: Text( - 'How do I communicate with the other party (passenger/driver)?' + 'Simply open the Sefer app, enter your destination, and tap "Request Ride". The app will connect you with a nearby driver.' .tr, - style: AppStyle.title, ), - children: [ - Text( - 'Sefer provides in-app chat functionality to allow you to communicate with your driver or passenger during your ride.' - .tr, - style: AppStyle.title, - ), - ], - ), - - // Question 8: What safety measures does Sefer offer? - ExpansionTile( - title: Text( - 'What safety measures does Sefer offer?'.tr, - style: AppStyle.title, - ), - children: [ - Text( - 'Sefer prioritizes your safety. We offer features like driver verification, in-app trip tracking, and emergency contact options.' - .tr, - style: AppStyle.title, - ), - ], ), ], ), - ) - ], - isleading: true); + CupertinoListSection.insetGrouped( + header: Text( + 'Vehicle Options'.tr, + style: const TextStyle(fontWeight: FontWeight.bold), + ), + children: [ + CupertinoListTile( + leading: const Icon( + CupertinoIcons.car_fill, + color: Colors.blue, + ), + title: Text('What types of vehicles are available?'.tr), + trailing: const CupertinoListTileChevron(), + onTap: () => _showAnswerDialog( + context, + 'What types of vehicles are available?'.tr, + 'Sefer offers a variety of options including Economy, Comfort, and Luxury to suit your needs and budget.' + .tr, + ), + ), + ], + ), + CupertinoListSection.insetGrouped( + header: Text( + 'Payments'.tr, + style: const TextStyle(fontWeight: FontWeight.bold), + ), + children: [ + CupertinoListTile( + leading: const Icon( + CupertinoIcons.creditcard, + color: Colors.green, + ), + title: Text('How can I pay for my ride?'.tr), + trailing: const CupertinoListTileChevron(), + onTap: () => _showAnswerDialog( + context, + 'How can I pay for my ride?'.tr, + 'You can pay for your ride using cash or credit/debit card. You can select your preferred payment method before confirming your ride.' + .tr, + ), + ), + ], + ), + CupertinoListSection.insetGrouped( + header: Text( + 'Ride Management'.tr, + style: const TextStyle(fontWeight: FontWeight.bold), + ), + children: [ + CupertinoListTile( + leading: const Icon( + CupertinoIcons.xmark_circle_fill, + color: Colors.red, + ), + title: Text('Can I cancel my ride?'.tr), + trailing: const CupertinoListTileChevron(), + onTap: () => _showAnswerDialog( + context, + 'Can I cancel my ride?'.tr, + 'Yes, you can cancel your ride, but please note that cancellation fees may apply depending on how far in advance you cancel.' + .tr, + ), + ), + ], + ), + CupertinoListSection.insetGrouped( + header: Text( + 'For Drivers'.tr, + style: const TextStyle(fontWeight: FontWeight.bold), + ), + children: [ + CupertinoListTile( + leading: const Icon( + CupertinoIcons.person_crop_circle_fill, + color: Colors.orange, + ), + title: Text('Driver Registration & Requirements'.tr), + trailing: const CupertinoListTileChevron(), + onTap: () => showCupertinoDialog( + context: context, + builder: (BuildContext context) => CupertinoAlertDialog( + title: Text('Driver Registration'.tr, + style: const TextStyle( + fontWeight: FontWeight.bold, + color: Colors.indigo)), + content: Text( + 'To register as a driver or learn about the requirements, please visit our website or contact Sefer support directly.' + .tr), + actions: [ + CupertinoDialogAction( + isDefaultAction: true, + onPressed: () { + Get.to(() => ContactUsPage()); + // Optionally, you can open a URL here + }, + child: Text('Visit Website/Contact Support'.tr), + ), + CupertinoDialogAction( + onPressed: () { + Navigator.of(context).pop(); + }, + child: Text('Close'.tr), + ), + ], + ), + ), + ), + ], + ), + CupertinoListSection.insetGrouped( + header: Text( + 'Communication'.tr, + style: const TextStyle(fontWeight: FontWeight.bold), + ), + children: [ + CupertinoListTile( + leading: const Icon( + CupertinoIcons.chat_bubble_2_fill, + color: Colors.purple, + ), + title: Text( + 'How do I communicate with the other party (passenger/driver)?' + .tr), + trailing: const CupertinoListTileChevron(), + onTap: () => _showAnswerDialog( + context, + 'How do I communicate with the other party (passenger/driver)?' + .tr, + 'You can communicate with your driver or passenger through the in-app chat feature once a ride is confirmed.' + .tr, + ), + ), + ], + ), + CupertinoListSection.insetGrouped( + header: Text( + 'Safety & Security'.tr, + style: const TextStyle(fontWeight: FontWeight.bold), + ), + children: [ + CupertinoListTile( + leading: const Icon( + CupertinoIcons.shield_fill, + color: Colors.teal, + ), + title: Text('What safety measures does Sefer offer?'.tr), + trailing: const CupertinoListTileChevron(), + onTap: () => _showAnswerDialog( + context, + 'What safety measures does Sefer offer?'.tr, + 'Sefer offers various safety features including driver verification, in-app trip tracking, emergency contact options, and the ability to share your trip status with trusted contacts.' + .tr, + ), + ), + ], + ), + const SizedBox(height: 20), // Add some bottom padding + ], + ), + ), + ); } } diff --git a/lib/views/home/map_page_passenger.dart b/lib/views/home/map_page_passenger.dart index 040f669..d3e2b92 100644 --- a/lib/views/home/map_page_passenger.dart +++ b/lib/views/home/map_page_passenger.dart @@ -50,7 +50,7 @@ class MapPagePassenger extends StatelessWidget { buttomSheetMapPage(), CarDetailsTypeToChoose(), - const HeaderDestination(), + // const HeaderDestination(), const BurcMoney(), const PromoCode(), const ApplyOrderWidget(), const MapMenuWidget(), @@ -67,7 +67,7 @@ class MapPagePassenger extends StatelessWidget { const VipRideBeginPassenger(), const RideFromStartApp(), - cancelRidePage(), + // cancelRidePage(), const MenuIconMapPageWidget(), PointsPageForRider() ], diff --git a/lib/views/home/map_widget.dart/cancel_raide_page.dart b/lib/views/home/map_widget.dart/cancel_raide_page.dart index 286e2e6..a7592dc 100644 --- a/lib/views/home/map_widget.dart/cancel_raide_page.dart +++ b/lib/views/home/map_widget.dart/cancel_raide_page.dart @@ -5,6 +5,14 @@ import 'package:SEFER/constant/style.dart'; import 'package:SEFER/controller/home/map_passenger_controller.dart'; import '../../widgets/elevated_btn.dart'; +void showCancelRideBottomSheet() { + Get.bottomSheet( + cancelRidePage(), + backgroundColor: Colors.transparent, + isScrollControlled: true, + ); +} + GetBuilder cancelRidePage() { Get.put(MapPassengerController()); @@ -19,78 +27,73 @@ GetBuilder cancelRidePage() { return GetBuilder( builder: (controller) => controller.isCancelRidePageShown - ? Positioned( - left: 20, - top: Get.height * 0.15, - right: 20, - bottom: Get.height * 0.15, - child: Container( - padding: const EdgeInsets.all(20), - decoration: BoxDecoration( - color: Colors.white, - boxShadow: [ - BoxShadow( - color: Colors.black.withOpacity(0.2), - offset: const Offset(0, 8), - blurRadius: 16, - ), - ], - borderRadius: BorderRadius.circular(20), - ), - child: Column( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Text( - 'Can we know why you want to cancel Ride ?'.tr, - style: AppStyle.title - .copyWith(fontSize: 18, fontWeight: FontWeight.bold), - textAlign: TextAlign.center, - ), - const SizedBox(height: 20), - Expanded( - child: ListView.separated( - itemCount: reasons.length, - separatorBuilder: (context, index) => const Divider(), - itemBuilder: (context, index) { - return ListTile( - title: Text( - reasons[index], - style: AppStyle.title.copyWith(fontSize: 16), - ), - leading: Radio( - value: index, - groupValue: controller.selectedReason, - onChanged: (int? value) { - controller.selectReason(value!, reasons[index]); - }, - activeColor: AppColor.primaryColor, - ), - onTap: () { - controller.selectReason(index, reasons[index]); + ? Container( + height: Get.height * 0.6, + padding: const EdgeInsets.all(20), + decoration: BoxDecoration( + color: Colors.white, + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.2), + offset: const Offset(0, 8), + blurRadius: 16, + ), + ], + borderRadius: BorderRadius.circular(20), + ), + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + 'Can we know why you want to cancel Ride ?'.tr, + style: AppStyle.title + .copyWith(fontSize: 18, fontWeight: FontWeight.bold), + textAlign: TextAlign.center, + ), + const SizedBox(height: 20), + Expanded( + child: ListView.separated( + itemCount: reasons.length, + separatorBuilder: (context, index) => const Divider(), + itemBuilder: (context, index) { + return ListTile( + title: Text( + reasons[index], + style: AppStyle.title.copyWith(fontSize: 16), + ), + leading: Radio( + value: index, + groupValue: controller.selectedReason, + onChanged: (int? value) { + controller.selectReason(value!, reasons[index]); }, - ); - }, - ), - ), - const SizedBox(height: 20), - MyElevatedButton( - title: 'Cancel Ride'.tr, - onPressed: () { - if (controller.selectedReason == -1) { - Get.snackbar( - 'You Should be select reason.'.tr, - '', - snackPosition: SnackPosition.BOTTOM, - backgroundColor: AppColor.redColor, - colorText: Colors.white, - ); - } else { - controller.cancelRide(); - } + activeColor: AppColor.primaryColor, + ), + onTap: () { + controller.selectReason(index, reasons[index]); + }, + ); }, ), - ], - ), + ), + const SizedBox(height: 20), + MyElevatedButton( + title: 'Cancel Ride'.tr, + onPressed: () { + if (controller.selectedReason == -1) { + Get.snackbar( + 'You Should be select reason.'.tr, + '', + snackPosition: SnackPosition.BOTTOM, + backgroundColor: AppColor.redColor, + colorText: Colors.white, + ); + } else { + controller.cancelRide(); + } + }, + ), + ], ), ) : const SizedBox(), diff --git a/lib/views/home/map_widget.dart/car_details_widget_to_go.dart b/lib/views/home/map_widget.dart/car_details_widget_to_go.dart index eb9840e..66d16e9 100644 --- a/lib/views/home/map_widget.dart/car_details_widget_to_go.dart +++ b/lib/views/home/map_widget.dart/car_details_widget_to_go.dart @@ -5,7 +5,6 @@ import 'package:SEFER/controller/home/blinking_promo_controller.dart.dart'; import 'package:SEFER/main.dart'; import 'package:SEFER/views/home/profile/passenger_profile_page.dart'; import 'package:SEFER/views/widgets/elevated_btn.dart'; -import 'package:SEFER/views/widgets/my_dialog.dart'; import 'package:SEFER/views/widgets/my_textField.dart'; import 'package:flutter/material.dart'; import 'package:flutter_confetti/flutter_confetti.dart'; @@ -15,6 +14,7 @@ import '../../../constant/info.dart'; import '../../../controller/functions/tts.dart'; import '../../../controller/home/map_passenger_controller.dart'; import '../../../print.dart'; +import '../../widgets/mydialoug.dart'; class CarType { final String carType; @@ -72,6 +72,7 @@ List carTypes = [ class CarDetailsTypeToChoose extends StatelessWidget { CarDetailsTypeToChoose({super.key}); final textToSpeechController = Get.put(TextToSpeechController()); + @override Widget build(BuildContext context) { return GetBuilder( @@ -96,759 +97,126 @@ class CarDetailsTypeToChoose extends StatelessWidget { // Convert the Set back to a List carTypes = uniqueCarTypes.toList(); + return mapPassengerController.data.isNotEmpty && mapPassengerController.isBottomSheetShown && mapPassengerController.rideConfirm == false ? Positioned( bottom: 0, - left: 5, - right: 5, + left: 8, + right: 8, child: Container( - decoration: AppStyle.boxDecoration1, - height: Get.height * .4, + height: Get.height * .3, + decoration: BoxDecoration( + gradient: LinearGradient( + begin: Alignment.topCenter, + end: Alignment.bottomCenter, + colors: [ + AppColor.secondaryColor, + AppColor.secondaryColor, + ], + ), + borderRadius: BorderRadius.circular(20), + boxShadow: [ + BoxShadow( + color: AppColor.primaryColor, + blurRadius: 10, + offset: const Offset(0, 5), + ), + ], + border: Border.all( + color: Colors.grey.shade200, + width: 1, + ), + ), child: Column( children: [ - SizedBox( - height: Get.height * .4, - child: ListView.builder( - itemCount: carTypes.length, - itemBuilder: (context, index) { - final carType = carTypes[index]; - return ListTile( - title: Container( - width: Get.width, - decoration: BoxDecoration( + Padding( + padding: const EdgeInsets.all(4), + child: Text( + 'Choose your ride'.tr, + style: AppStyle.title.copyWith(fontSize: 22), + ), + ), + Padding( + padding: const EdgeInsets.all(8.0), + child: SizedBox( + height: Get.height * .22, // Adjust height as needed + child: ListView.separated( + padding: const EdgeInsets.symmetric(horizontal: 8.0), + scrollDirection: Axis.horizontal, + itemCount: carTypes.length, + separatorBuilder: (context, index) => + const SizedBox(width: 8), + itemBuilder: (context, index) { + final carType = carTypes[index]; + final isSelected = + mapPassengerController.selectedIndex == index; + return GestureDetector( + onTap: () { + mapPassengerController.selectCarFromList(index); + _showCarDetailsDialog( + context, + mapPassengerController, + carType, + textToSpeechController); + }, + child: AnimatedContainer( + duration: const Duration(milliseconds: 200), + width: + Get.width * 0.4, // Adjust width as needed + decoration: BoxDecoration( color: AppColor.secondaryColor, - borderRadius: const BorderRadius.all( - Radius.circular(20)), + borderRadius: BorderRadius.circular(15), + border: Border.all( + color: isSelected + ? AppColor.accentColor + : Colors.transparent, + width: 2, + ), boxShadow: [ - carType.isSelected - ? const BoxShadow( - spreadRadius: 3, - blurStyle: BlurStyle.solid, - color: AppColor.accentColor, - blurRadius: 3, - offset: Offset(1, 3)) - : const BoxShadow(), - ]), - child: Row( - mainAxisAlignment: - MainAxisAlignment.spaceBetween, - children: [ - Image.asset( - carType.image, - width: 50, - height: 50, - ), - SizedBox( - width: Get.width * .25, - child: Column( - children: [ - Text( - carType.carType.tr, - style: AppStyle.title.copyWith( - fontWeight: FontWeight.bold, - fontSize: 20), - ), - // Text( - // carType.carDetail, - // style: AppStyle.subtitle, - // ), - ], + BoxShadow( + color: Colors.black.withOpacity(0.1), + spreadRadius: 1, + blurRadius: 5, + offset: const Offset(0, 3), ), - ), - Text( - carType.carType == 'Comfort' - ? mapPassengerController - .totalPassengerComfort - .toStringAsFixed(1) - : carType.carType == 'Speed' - ? mapPassengerController - .totalPassengerSpeed - .toStringAsFixed(1) - : carType.carType == 'Awfar Car' - ? mapPassengerController - .totalPassengerBalash - .toStringAsFixed(1) - : carType.carType == 'Scooter' - ? mapPassengerController - .totalPassengerScooter - .toStringAsFixed(1) - : carType.carType == 'Lady' - ? mapPassengerController - .totalPassengerLady - .toStringAsFixed(1) - : carType.carType == - 'Pink Bike' - ? mapPassengerController - .totalPassengerScooter - .toStringAsFixed( - 1) - : carType.carType == - 'Rayeh Gai' - ? mapPassengerController - .totalPassengerRayehGai - .toStringAsFixed( - 1) - : 'Pre-booking' - .tr, - style: - AppStyle.title.copyWith(fontSize: 20), - ), - Row( - children: [ - carType.carType == 'Comfort' && - (mapPassengerController - .totalPassengerSpeed > - 20) - ? Row( - children: [ - Container( - decoration: - AppStyle.boxDecoration1, - child: Text( - mapPassengerController - .promoTaken - ? mapPassengerController - .totalPassengerComfortDiscount - .toStringAsFixed( - 1) - : (mapPassengerController - .totalPassengerComfortDiscount - - mapPassengerController - .totalPassengerComfort) - .toStringAsFixed( - 1), - style: AppStyle.subtitle - .copyWith( - color: AppColor - .greenColor), - )), - const SizedBox( - width: 10, - ), - Text( - mapPassengerController - .promoTaken - ? (mapPassengerController - .totalPassengerComfortDiscount + - mapPassengerController - .totalPassengerComfort) - .toStringAsFixed(1) - : mapPassengerController - .totalPassengerComfortDiscount - .toStringAsFixed(1), - style: - AppStyle.title.copyWith( - color: AppColor.redColor, - decoration: TextDecoration - .lineThrough, // Strikethrough line - ), - ) - ], - ) - : carType.carType == 'Speed' && - (mapPassengerController - .totalPassengerSpeed > - 20) - ? Row( - children: [ - Container( - decoration: AppStyle - .boxDecoration1, - child: Text( - mapPassengerController - .promoTaken - ? mapPassengerController - .totalPassengerSpeedDiscount - .toStringAsFixed( - 1) - : (mapPassengerController - .totalPassengerSpeedDiscount - - mapPassengerController - .totalPassengerSpeed) - .toStringAsFixed( - 1), - style: AppStyle - .subtitle - .copyWith( - color: AppColor - .greenColor), - )), - const SizedBox( - width: 10, - ), - Text( - mapPassengerController - .promoTaken - ? (mapPassengerController - .totalPassengerSpeedDiscount + - mapPassengerController - .totalPassengerSpeed) - .toStringAsFixed( - 1) - : mapPassengerController - .totalPassengerSpeedDiscount - .toStringAsFixed( - 1), - style: AppStyle.title - .copyWith( - color: - AppColor.redColor, - decoration: TextDecoration - .lineThrough, // Strikethrough line - ), - ) - ], - ) - : carType.carType == - 'Awfar Car' && - (mapPassengerController - .totalPassengerBalash > - 20) - ? Row( - children: [ - Container( - decoration: AppStyle - .boxDecoration1, - child: Text( - mapPassengerController - .promoTaken - ? mapPassengerController - .totalPassengerBalashDiscount - .toStringAsFixed( - 1) - : (mapPassengerController - .totalPassengerBalashDiscount - - mapPassengerController - .totalPassengerBalash) - .toStringAsFixed( - 1), - style: AppStyle - .subtitle - .copyWith( - color: AppColor - .greenColor), - )), - const SizedBox( - width: 10, - ), - Text( - mapPassengerController - .promoTaken - ? (mapPassengerController - .totalPassengerBalashDiscount + - mapPassengerController - .totalPassengerBalash) - .toStringAsFixed( - 1) - : mapPassengerController - .totalPassengerBalashDiscount - .toStringAsFixed( - 1), - style: AppStyle.title - .copyWith( - color: AppColor - .redColor, - decoration: - TextDecoration - .lineThrough, // Strikethrough line - ), - ) - ], - ) - : carType.carType == 'Lady' && - (mapPassengerController - .totalPassengerSpeed > - 20) - ? Row( - children: [ - Container( - decoration: AppStyle - .boxDecoration1, - child: Text( - mapPassengerController - .promoTaken - ? mapPassengerController - .totalPassengerLadyDiscount - .toStringAsFixed( - 1) - : (mapPassengerController.totalPassengerLadyDiscount - - mapPassengerController.totalPassengerLady) - .toStringAsFixed(0), - style: AppStyle - .subtitle - .copyWith( - color: - AppColor.greenColor), - )), - const SizedBox( - width: 10, - ), - Text( - mapPassengerController - .promoTaken - ? (mapPassengerController - .totalPassengerLadyDiscount + - mapPassengerController - .totalPassengerLady) - .toStringAsFixed( - 0) - : mapPassengerController - .totalPassengerLadyDiscount - .toStringAsFixed( - 1), - style: AppStyle - .title - .copyWith( - color: AppColor - .redColor, - decoration: - TextDecoration - .lineThrough, // Strikethrough line - ), - ) - ], - ) - : const SizedBox( - width: 3, - ), - ], - ), - const SizedBox( - width: 4, - ) - ], + ], + ), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Image.asset( + carType.image, + height: 60, + width: 60, + ), + const SizedBox(height: 8), + Text( + carType.carType.tr, + style: AppStyle.title.copyWith( + fontWeight: FontWeight.bold, + fontSize: 18), + textAlign: TextAlign.center, + ), + const SizedBox(height: 4), + // Text( + // carType.carDetail, + // style: AppStyle.title.copyWith( + // fontSize: 14, color: Colors.grey[600]), + // textAlign: TextAlign.center, + // maxLines: 2, + // overflow: TextOverflow.ellipsis, + // ), + const SizedBox(height: 8), + _buildPriceDisplay( + mapPassengerController, carType), + ], + ), ), - ), - - selected: mapPassengerController.selectedIndex == - index, // Set selected based on index - selectedColor: - Colors.blue, // Color for selected item - - onTap: () { - mapPassengerController.selectCarFromList(index); - - if (mapPassengerController.selectedIndex != -1) { - // Get.snackbar('You should select one'.tr, '', - // backgroundColor: AppColor.greenColor); - if (mapPassengerController.selectedIndex == 0) { - box.write(BoxName.carType, 'Comfort'); - mapPassengerController.totalPassenger = - mapPassengerController - .totalPassengerComfort; - Log.print( - 'mapPassengerController.endNameAddress: ${mapPassengerController.endNameAddress}'); - Get.defaultDialog( - title: 'Comfort'.tr, - titleStyle: AppStyle.title, - content: CarDialogue( - textToSpeechController: - textToSpeechController, - image: 'assets/images/blob.png', - text: mapPassengerController - .endNameAddress - .toLowerCase() - .contains("airport".tr) - ? "Best choice for a comfortable car with a flexible route and stop points. This airport offers visa entry at this price." - .tr - : 'Best choice for comfort car and flexible route and stops point' - .tr), - confirm: MyElevatedButton( - kolor: AppColor.greenColor, - title: 'Next'.tr, - onPressed: () { - Get.back(); - mapPassengerController - .isBottomSheetShown = false; - mapPassengerController.update(); - mapPassengerController - .changeCashConfirmPageShown(); - }), - cancel: MyElevatedButton( - title: 'Cancel'.tr, - kolor: AppColor.redColor, - onPressed: () { - Get.back(); - })); - } else if (mapPassengerController - .selectedIndex == - 1) { - box.write(BoxName.carType, 'Speed'); - mapPassengerController.totalPassenger = - mapPassengerController - .totalPassengerSpeed; - Get.defaultDialog( - title: 'Speed'.tr, - titleStyle: AppStyle.title, - content: CarDialogue( - textToSpeechController: - textToSpeechController, - image: 'assets/images/carspeed.png', - text: - 'This trip goes directly from your starting point to your destination for a fixed price. The driver must follow the planned route' - .tr), - confirm: MyElevatedButton( - kolor: AppColor.greenColor, - title: 'Next'.tr, - onPressed: () { - Get.back(); - mapPassengerController - .isBottomSheetShown = false; - mapPassengerController.update(); - mapPassengerController - .changeCashConfirmPageShown(); - }), - cancel: MyElevatedButton( - title: 'Cancel'.tr, - kolor: AppColor.redColor, - onPressed: () { - Get.back(); - })); - } else if (mapPassengerController - .selectedIndex == - 4) { - box.write(BoxName.carType, 'Scooter'); - mapPassengerController.totalPassenger = - mapPassengerController - .totalPassengerScooter; - Get.defaultDialog( - title: 'Scooter'.tr, - titleStyle: AppStyle.title, - content: CarDialogue( - textToSpeechController: - textToSpeechController, - image: 'assets/images/moto.png', - text: - 'This is for delivery or a motorcycle.' - .tr), - confirm: MyElevatedButton( - kolor: AppColor.greenColor, - title: 'Next'.tr, - onPressed: () { - Get.back(); - mapPassengerController - .isBottomSheetShown = false; - mapPassengerController.update(); - mapPassengerController - .changeCashConfirmPageShown(); - }), - cancel: MyElevatedButton( - title: 'Cancel'.tr, - kolor: AppColor.redColor, - onPressed: () { - Get.back(); - })); - } else if (mapPassengerController - .selectedIndex == - 6) { - box.write(BoxName.carType, 'Pink Bike'); - mapPassengerController.totalPassenger = - mapPassengerController - .totalPassengerScooter; - Get.defaultDialog( - title: 'Pink Bike'.tr, - titleStyle: AppStyle.title, - content: CarDialogue( - textToSpeechController: - textToSpeechController, - image: 'assets/images/pinkBike.png', - text: - 'This is for delivery or a motorcycle.' - .tr), - confirm: MyElevatedButton( - kolor: AppColor.greenColor, - title: 'Next'.tr, - onPressed: () { - Get.back(); - mapPassengerController - .isBottomSheetShown = false; - mapPassengerController.update(); - mapPassengerController - .changeCashConfirmPageShown(); - }), - cancel: MyElevatedButton( - title: 'Cancel'.tr, - kolor: AppColor.redColor, - onPressed: () { - Get.back(); - })); - } else if (mapPassengerController - .selectedIndex == - 5) { - box.write(BoxName.carType, 'Mishwar Vip'); - mapPassengerController.totalPassenger = 50; - Get.defaultDialog( - title: 'Mishwar Vip'.tr, - titleStyle: AppStyle.title, - content: CarDialogue( - textToSpeechController: - textToSpeechController, - image: 'assets/images/freeRide.png', - text: - "Perfect for passengers seeking the latest car models with the freedom to choose any route they desire" - .tr), - confirm: MyElevatedButton( - kolor: AppColor.greenColor, - title: 'Next'.tr, - onPressed: () { - Get.back(); - mapPassengerController - .mishwariOption(); - }), - cancel: MyElevatedButton( - title: 'Cancel'.tr, - kolor: AppColor.redColor, - onPressed: () { - Get.back(); - })); - } else if (mapPassengerController - .selectedIndex == - 2) { - box.write(BoxName.carType, 'Awfar Car'); - mapPassengerController.totalPassenger = - mapPassengerController - .totalPassengerBalash; - Get.defaultDialog( - title: 'Awfar Car'.tr, - titleStyle: AppStyle.title, - content: CarDialogue( - textToSpeechController: - textToSpeechController, - image: 'assets/images/balash.png', - text: - "Old and affordable, perfect for budget rides." - .tr), - confirm: MyElevatedButton( - kolor: AppColor.greenColor, - title: 'Next'.tr, - onPressed: () { - Get.back(); - mapPassengerController - .isBottomSheetShown = false; - mapPassengerController.update(); - mapPassengerController - .changeCashConfirmPageShown(); - }), - cancel: MyElevatedButton( - title: 'Cancel'.tr, - kolor: AppColor.redColor, - onPressed: () { - Get.back(); - })); - } else if (mapPassengerController - .selectedIndex == - 3) { - box.write(BoxName.carType, 'Lady'); - mapPassengerController.totalPassenger = - mapPassengerController.totalPassengerLady; - Get.defaultDialog( - title: 'Lady'.tr, - titleStyle: AppStyle.title, - content: CarDialogue( - textToSpeechController: - textToSpeechController, - image: 'assets/images/lady.png', - text: - "This trip is for women only".tr), - confirm: MyElevatedButton( - kolor: AppColor.greenColor, - title: 'Next'.tr, - onPressed: () { - Get.back(); - if (box - .read(BoxName.gender) - .toString() != - '') { - mapPassengerController - .isBottomSheetShown = false; - mapPassengerController.update(); - mapPassengerController - .changeCashConfirmPageShown(); - } else { - MyDialog().getDialog( - 'Idintify gender', - 'You should ideintify your gender for this type of trip!' - .tr, () { - Get.to(() => - PassengerProfilePage()); - }); - } - }), - cancel: MyElevatedButton( - title: 'Cancel'.tr, - kolor: AppColor.redColor, - onPressed: () { - Get.back(); - })); - } else if (mapPassengerController - .selectedIndex == - 7) { - box.write(BoxName.carType, 'Rayeh Gai'); - mapPassengerController.totalPassenger = - mapPassengerController.totalPassengerLady; - Get.defaultDialog( - title: 'Rayeh Gai'.tr, - titleStyle: AppStyle.title, - content: CarDialogue( - textToSpeechController: - textToSpeechController, - image: 'assets/images/roundtrip.png', - text: - "Rayeh Gai: Round trip service for convenient travel between cities, easy and reliable." - .tr), - confirm: MyElevatedButton( - kolor: AppColor.greenColor, - title: 'Next'.tr, - onPressed: () { - Get.back(); - - Get.defaultDialog( - barrierDismissible: false, - title: - "Select betweeen types".tr, - content: Row( - mainAxisAlignment: - MainAxisAlignment - .spaceBetween, - children: [ - GestureDetector( - onTap: () { - Get.back(); - mapPassengerController - .totalPassenger = - mapPassengerController - .totalPassengerRayehGaiBalash; - mapPassengerController - .isBottomSheetShown = - false; - mapPassengerController - .update(); - mapPassengerController - .changeCashConfirmPageShown(); - }, - child: Container( - decoration: AppStyle - .boxDecoration1, - child: Padding( - padding: - const EdgeInsets - .all(8.0), - child: Column( - children: [ - Text('Awfar Car' - .tr), - Text(mapPassengerController - .totalPassengerRayehGaiBalash - .toStringAsFixed( - 0)), - ], - ), - )), - ), - GestureDetector( - onTap: () { - Get.back(); - mapPassengerController - .totalPassenger = - mapPassengerController - .totalPassengerRayehGai; - mapPassengerController - .isBottomSheetShown = - false; - mapPassengerController - .update(); - mapPassengerController - .changeCashConfirmPageShown(); - }, - child: Container( - decoration: AppStyle - .boxDecoration1, - child: Padding( - padding: - const EdgeInsets - .all(8.0), - child: Column( - children: [ - Text( - 'Speed'.tr), - Text(mapPassengerController - .totalPassengerRayehGai - .toStringAsFixed( - 0)), - ], - ), - )), - ), - GestureDetector( - onTap: () { - Get.back(); - mapPassengerController - .totalPassenger = - mapPassengerController - .totalPassengerRayehGaiComfort; - mapPassengerController - .isBottomSheetShown = - false; - mapPassengerController - .update(); - mapPassengerController - .changeCashConfirmPageShown(); - }, - child: Container( - decoration: AppStyle - .boxDecoration1, - child: Padding( - padding: - const EdgeInsets - .all(8.0), - child: Column( - children: [ - Text('Comfort' - .tr), - Text(mapPassengerController - .totalPassengerRayehGaiComfort - .toStringAsFixed( - 0)), - ], - ), - )), - ) - ], - ), - cancel: MyElevatedButton( - kolor: AppColor.redColor, - title: 'Cancel'.tr, - onPressed: () => - Get.back()), - confirm: MyElevatedButton( - kolor: AppColor.greenColor, - title: 'Next'.tr, - onPressed: () { - mapPassengerController - .isBottomSheetShown = - false; - mapPassengerController - .update(); - mapPassengerController - .changeCashConfirmPageShown(); - })); - }), - cancel: MyElevatedButton( - title: 'Cancel'.tr, - kolor: AppColor.redColor, - onPressed: () { - Get.back(); - })); - } else { - Get.snackbar('You should select one'.tr, '', - backgroundColor: AppColor.redColor); - } - } - }, - ); - }, + ); + }, + ), ), ), ], @@ -856,9 +224,250 @@ class CarDetailsTypeToChoose extends StatelessWidget { ), ) : const SizedBox(); - // ; }); } + + Widget _buildPriceDisplay( + MapPassengerController mapPassengerController, CarType carType) { + double originalPrice = _getOriginalPrice(carType, mapPassengerController); + double discountedPrice = + _getDiscountedPrice(carType, mapPassengerController); + bool hasDiscount = _hasDiscount(carType, mapPassengerController); + + return Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + _getPassengerPriceText(carType, mapPassengerController), + style: AppStyle.title.copyWith(fontSize: 18), + ), + const SizedBox(width: 4), + // Text( + // 'currency'.tr, // Assuming you have a currency translation + // style: AppStyle.title, + // ), + if (hasDiscount) ...[ + const SizedBox(width: 8), + Text( + discountedPrice.toStringAsFixed(1), + style: AppStyle.title.copyWith( + decoration: TextDecoration.lineThrough, + color: AppColor.redColor, + ), + ), + ], + ], + ); + } + + String _getPassengerPriceText( + CarType carType, MapPassengerController mapPassengerController) { + switch (carType.carType) { + case 'Comfort': + return mapPassengerController.totalPassengerComfort.toStringAsFixed(1); + case 'Speed': + return mapPassengerController.totalPassengerSpeed.toStringAsFixed(1); + case 'Awfar Car': + return mapPassengerController.totalPassengerBalash.toStringAsFixed(1); + case 'Scooter': + return mapPassengerController.totalPassengerScooter.toStringAsFixed(1); + case 'Lady': + return mapPassengerController.totalPassengerLady.toStringAsFixed(1); + case 'Pink Bike': + return mapPassengerController.totalPassengerScooter.toStringAsFixed(1); + case 'Rayeh Gai': + return mapPassengerController.totalPassengerRayehGai.toStringAsFixed(1); + default: + return 'Pre-booking'.tr; + } + } + + double _getOriginalPrice( + CarType carType, MapPassengerController mapPassengerController) { + switch (carType.carType) { + case 'Comfort': + return mapPassengerController.totalPassengerComfort; + case 'Speed': + return mapPassengerController.totalPassengerSpeed; + case 'Awfar Car': + return mapPassengerController.totalPassengerBalash; + case 'Lady': + return mapPassengerController.totalPassengerLady; + default: + return 0.0; // Or some default value + } + } + + double _getDiscountedPrice( + CarType carType, MapPassengerController mapPassengerController) { + switch (carType.carType) { + case 'Comfort': + return mapPassengerController.totalPassengerComfortDiscount; + case 'Speed': + return mapPassengerController.totalPassengerSpeedDiscount; + case 'Awfar Car': + return mapPassengerController.totalPassengerBalashDiscount; + case 'Lady': + return mapPassengerController.totalPassengerLadyDiscount; + default: + return 0.0; // Or some default value + } + } + + bool _hasDiscount( + CarType carType, MapPassengerController mapPassengerController) { + switch (carType.carType) { + case 'Comfort': + return mapPassengerController.totalPassengerComfort > 20; + case 'Speed': + return mapPassengerController.totalPassengerSpeed > 20; + case 'Awfar Car': + return mapPassengerController.totalPassengerBalash > 20; + case 'Lady': + return mapPassengerController.totalPassengerSpeed > 20; + default: + return false; + } + } + + void _showCarDetailsDialog( + BuildContext context, + MapPassengerController mapPassengerController, + CarType carType, + TextToSpeechController textToSpeechController, + ) { + Get.defaultDialog( + title: carType.carType.tr, + titleStyle: AppStyle.title, + content: CarDialogue( + textToSpeechController: textToSpeechController, + image: carType.image, + text: _getCarDescription(mapPassengerController, carType), + ), + confirm: MyElevatedButton( + kolor: AppColor.greenColor, + title: 'Next'.tr, + onPressed: () { + Get.back(); + _handleCarSelection(context, mapPassengerController, carType); + }, + ), + cancel: MyElevatedButton( + title: 'Cancel'.tr, + kolor: AppColor.redColor, + onPressed: () => Get.back(), + ), + ); + } + + String _getCarDescription( + MapPassengerController mapPassengerController, CarType carType) { + switch (carType.carType) { + case 'Comfort': + return mapPassengerController.endNameAddress + .toLowerCase() + .contains("airport".tr) + ? "Best choice for a comfortable car with a flexible route and stop points. This airport offers visa entry at this price." + .tr + : 'Best choice for comfort car and flexible route and stops point' + .tr; + case 'Speed': + return 'This trip goes directly from your starting point to your destination for a fixed price. The driver must follow the planned route' + .tr; + case 'Scooter': + case 'Pink Bike': + return 'This is for delivery or a motorcycle.'.tr; + case 'Mishwar Vip': + return "Perfect for passengers seeking the latest car models with the freedom to choose any route they desire" + .tr; + case 'Awfar Car': + return "Old and affordable, perfect for budget rides.".tr; + case 'Lady': + return "This trip is for women only".tr; + case 'Rayeh Gai': + return "Rayeh Gai: Round trip service for convenient travel between cities, easy and reliable." + .tr; + default: + return ''; + } + } + + void _handleCarSelection(BuildContext context, + MapPassengerController mapPassengerController, CarType carType) { + box.write(BoxName.carType, carType.carType); + mapPassengerController.totalPassenger = + _getOriginalPrice(carType, mapPassengerController); + + if (carType.carType == 'Mishwar Vip') { + Get.back(); + mapPassengerController.mishwariOption(); + } else if (carType.carType == 'Lady') { + if (box.read(BoxName.gender).toString() != '') { + mapPassengerController.isBottomSheetShown = false; + mapPassengerController.update(); + mapPassengerController.changeCashConfirmPageShown(); + } else { + MyDialog().getDialog('Idintify gender', + 'You should ideintify your gender for this type of trip!'.tr, () { + Get.to(() => PassengerProfilePage()); + }); + } + } else if (carType.carType == 'Rayeh Gai') { + Get.defaultDialog( + barrierDismissible: false, + title: "Select betweeen types".tr, + content: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + _buildRayehGaiOption(mapPassengerController, 'Awfar Car', + mapPassengerController.totalPassengerRayehGaiBalash), + _buildRayehGaiOption(mapPassengerController, 'Speed', + mapPassengerController.totalPassengerRayehGai), + _buildRayehGaiOption(mapPassengerController, 'Comfort', + mapPassengerController.totalPassengerRayehGaiComfort), + ], + ), + cancel: MyElevatedButton( + kolor: AppColor.redColor, + title: 'Cancel'.tr, + onPressed: () => Get.back()), + confirm: MyElevatedButton( + kolor: AppColor.greenColor, + title: 'Next'.tr, + onPressed: () { + mapPassengerController.isBottomSheetShown = false; + mapPassengerController.update(); + mapPassengerController.changeCashConfirmPageShown(); + })); + } else { + mapPassengerController.isBottomSheetShown = false; + mapPassengerController.update(); + mapPassengerController.changeCashConfirmPageShown(); + } + } + + Widget _buildRayehGaiOption(MapPassengerController mapPassengerController, + String carTypeName, double price) { + return GestureDetector( + onTap: () { + Get.back(); + mapPassengerController.totalPassenger = price; + mapPassengerController.isBottomSheetShown = false; + mapPassengerController.update(); + mapPassengerController.changeCashConfirmPageShown(); + }, + child: Container( + decoration: AppStyle.boxDecoration1, + padding: const EdgeInsets.all(8.0), + child: Column( + children: [ + Text(carTypeName.tr), + Text(price.toStringAsFixed(0)), + ], + ), + ), + ); + } } class PromoCode extends StatelessWidget { @@ -877,7 +486,7 @@ class PromoCode extends StatelessWidget { blinkingController.startBlinking(); return Positioned( right: 5, - bottom: Get.height * 0.5, + bottom: Get.height * 0.36, child: Obx(() { return AnimatedContainer( duration: const Duration(milliseconds: 500), diff --git a/lib/views/home/map_widget.dart/form_search_places_destenation.dart b/lib/views/home/map_widget.dart/form_search_places_destenation.dart index 83217c3..f4335d2 100644 --- a/lib/views/home/map_widget.dart/form_search_places_destenation.dart +++ b/lib/views/home/map_widget.dart/form_search_places_destenation.dart @@ -116,7 +116,7 @@ GetBuilder formSearchPlacesDestenation() { controller.newStartPointLocation; controller.changeMainBottomMenuMap(); - await controller.getMap( + await controller.getDirectionMap( '${controller.passengerLocation.latitude},${controller.passengerLocation.longitude}', '${latLng.latitude},${latLng.longitude}', ); @@ -191,7 +191,7 @@ GetBuilder formSearchPlacesDestenation() { controller.changeMainBottomMenuMap(); // controller.newMyLocation = latLng; - await controller.getMap( + await controller.getDirectionMap( '${controller.passengerLocation.latitude},${controller.passengerLocation.longitude}', '${latLng.latitude},${latLng.longitude}', ); diff --git a/lib/views/home/map_widget.dart/form_search_start.dart b/lib/views/home/map_widget.dart/form_search_start.dart index ac7d2d2..d16c6b3 100644 --- a/lib/views/home/map_widget.dart/form_search_start.dart +++ b/lib/views/home/map_widget.dart/form_search_start.dart @@ -108,6 +108,7 @@ GetBuilder formSearchPlacesStart() { 'longitude': res['geometry']['location']['lng'], 'name': res['name'].toString(), 'rate': res['rating'].toString(), + 'createdAt': DateTime.now().toIso8601String(), }, TableName.recentLocations); controller.convertHintTextStartNewPlaces(index); diff --git a/lib/views/home/map_widget.dart/google_map_passenger_widget.dart b/lib/views/home/map_widget.dart/google_map_passenger_widget.dart index a7bfdcc..74c6ecf 100644 --- a/lib/views/home/map_widget.dart/google_map_passenger_widget.dart +++ b/lib/views/home/map_widget.dart/google_map_passenger_widget.dart @@ -1,4 +1,3 @@ -import 'package:SEFER/views/widgets/my_dialog.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:google_maps_flutter/google_maps_flutter.dart'; @@ -7,8 +6,8 @@ import 'package:SEFER/controller/home/points_for_rider_controller.dart'; import '../../../constant/colors.dart'; import '../../../constant/style.dart'; import '../../../controller/home/map_passenger_controller.dart'; -import '../../widgets/elevated_btn.dart'; import '../../widgets/mycircular.dart'; +import '../../widgets/mydialoug.dart'; class GoogleMapPassengerWidget extends StatelessWidget { GoogleMapPassengerWidget({ @@ -34,7 +33,7 @@ class GoogleMapPassengerWidget extends StatelessWidget { () async { controller.clearPolyline(); if (controller.dataCarsLocationByPassenger != null) { - await controller.getMap( + await controller.getDirectionMap( '${controller.passengerLocation.latitude},${controller.passengerLocation.longitude}', '${argument.latitude.toString()},${argument.longitude.toString()}'); @@ -230,6 +229,7 @@ class GoogleMapPassengerWidget extends StatelessWidget { target: controller.passengerLocation, zoom: 15, ), + markers: controller.markers.toSet(), // { // if (controller.statusRide != 'Apply' || @@ -319,86 +319,88 @@ class GoogleMapPassengerWidget extends StatelessWidget { // ), // }, polygons: controller.polygons, - polylines: { - Polyline( - zIndex: 2, - consumeTapEvents: true, - geodesic: true, - endCap: Cap.buttCap, - startCap: Cap.buttCap, - visible: true, - polylineId: const PolylineId('route'), - points: controller.polylineCoordinates, - color: AppColor.primaryColor, - width: 5, - ), + polylines: controller.polyLines.toSet(), + // { + // Polyline( + // polylineId: const PolylineId('route'), + // points: controller.polylineCoordinates, + // color: AppColor.primaryColor, + // width: 4, + // // patterns: [ + // // PatternItem.dot, + // // PatternItem.gap(10), + // // ], + // endCap: Cap.roundCap, + // startCap: Cap.roundCap, + // geodesic: true, + // ), - Polyline( - zIndex: 1, - consumeTapEvents: true, - geodesic: true, - endCap: Cap.buttCap, - startCap: Cap.buttCap, - visible: true, - polylineId: const PolylineId('route0'), - points: controller.polylineCoordinatesPointsAll[0], - color: AppColor.blueColor, - width: 5, - ), - Polyline( - zIndex: 2, - consumeTapEvents: true, - geodesic: true, - endCap: Cap.buttCap, - startCap: Cap.buttCap, - visible: true, - polylineId: const PolylineId('route1'), - points: controller.polylineCoordinatesPointsAll[1], - color: AppColor.yellowColor, - width: 5, - ), - Polyline( - zIndex: 2, - consumeTapEvents: true, - geodesic: true, - endCap: Cap.buttCap, - startCap: Cap.buttCap, - visible: true, - polylineId: const PolylineId('route2'), - points: controller.polylineCoordinatesPointsAll[2], - color: AppColor.greenColor, - width: 5, - ), - Polyline( - zIndex: 2, - consumeTapEvents: true, - geodesic: true, - endCap: Cap.buttCap, - startCap: Cap.buttCap, - visible: true, - polylineId: const PolylineId('route3'), - points: controller.polylineCoordinatesPointsAll[2], - color: AppColor.deepPurpleAccent, - width: 5, - ), - // Polyline( - // zIndex: 2, - // consumeTapEvents: true, - // geodesic: true, - // endCap: Cap.buttCap, - // startCap: Cap.buttCap, - // visible: true, - // polylineId: PolylineId('g'), - // points: [ - // LatLng(controller.southwest.latitude, - // controller.southwest.longitude), - // LatLng(controller.northeast.latitude, - // controller.northeast.longitude) - // ], - // color: AppColor.primaryColor, - // width: 5, - // ), - }, + // Polyline( + // zIndex: 1, + // consumeTapEvents: true, + // geodesic: true, + // endCap: Cap.buttCap, + // startCap: Cap.buttCap, + // visible: true, + // polylineId: const PolylineId('route0'), + // points: controller.polylineCoordinatesPointsAll[0], + // color: AppColor.blueColor, + // width: 5, + // ), + // Polyline( + // zIndex: 2, + // consumeTapEvents: true, + // geodesic: true, + // endCap: Cap.buttCap, + // startCap: Cap.buttCap, + // visible: true, + // polylineId: const PolylineId('route1'), + // points: controller.polylineCoordinatesPointsAll[1], + // color: AppColor.yellowColor, + // width: 5, + // ), + // Polyline( + // zIndex: 2, + // consumeTapEvents: true, + // geodesic: true, + // endCap: Cap.buttCap, + // startCap: Cap.buttCap, + // visible: true, + // polylineId: const PolylineId('route2'), + // points: controller.polylineCoordinatesPointsAll[2], + // color: AppColor.greenColor, + // width: 5, + // ), + // Polyline( + // zIndex: 2, + // consumeTapEvents: true, + // geodesic: true, + // endCap: Cap.buttCap, + // startCap: Cap.buttCap, + // visible: true, + // polylineId: const PolylineId('route3'), + // points: controller.polylineCoordinatesPointsAll[2], + // color: AppColor.deepPurpleAccent, + // width: 5, + // ), + // // Polyline( + // // zIndex: 2, + // // consumeTapEvents: true, + // // geodesic: true, + // // endCap: Cap.buttCap, + // // startCap: Cap.buttCap, + // // visible: true, + // // polylineId: PolylineId('g'), + // // points: [ + // // LatLng(controller.southwest.latitude, + // // controller.southwest.longitude), + // // LatLng(controller.northeast.latitude, + // // controller.northeast.longitude) + // // ], + // // color: AppColor.primaryColor, + // // width: 5, + // // ), + // }, // circles: { // Circle( // circleId: const CircleId('kk'), diff --git a/lib/views/home/map_widget.dart/left_main_menu_icons.dart b/lib/views/home/map_widget.dart/left_main_menu_icons.dart index 09b3346..b932525 100644 --- a/lib/views/home/map_widget.dart/left_main_menu_icons.dart +++ b/lib/views/home/map_widget.dart/left_main_menu_icons.dart @@ -1,8 +1,10 @@ +import 'package:SEFER/main.dart'; import 'package:flutter/material.dart'; import 'package:flutter_font_icons/flutter_font_icons.dart'; import 'package:get/get.dart'; import 'package:google_maps_flutter/google_maps_flutter.dart'; import '../../../constant/colors.dart'; +import '../../../constant/table_names.dart'; import '../../../controller/functions/tts.dart'; import '../../../controller/home/map_passenger_controller.dart'; import '../../../controller/home/vip_waitting_page.dart'; @@ -99,26 +101,26 @@ GetBuilder leftMainMenuIcons() { ), ), ), - // AnimatedContainer( - // duration: const Duration(microseconds: 200), - // width: controller.widthMapTypeAndTraffic, - // decoration: BoxDecoration( - // color: AppColor.secondaryColor, - // border: Border.all(), - // borderRadius: BorderRadius.circular(15)), - // child: IconButton( - // onPressed: () async { - // controller.statusRide == 'Apply' && - // controller.isSearchingWindow == false; - // controller.update(); - // }, - // icon: const Icon( - // Octicons - // .telescope, // Replace this with your desired VIP icon - // size: 29, - // ), - // ), - // ), +// AnimatedContainer( +// duration: const Duration(microseconds: 200), +// width: controller.widthMapTypeAndTraffic, +// decoration: BoxDecoration( +// color: AppColor.secondaryColor, +// border: Border.all(), +// borderRadius: BorderRadius.circular(15)), +// child: IconButton( +// onPressed: () async { +// final result = await sql.getCustomQuery(''' +// SELECT * FROM ${TableName.recentLocations} ORDER BY createdAt DESC +// '''); +// }, +// icon: const Icon( +// Octicons +// .telescope, // Replace this with your desired VIP icon +// size: 29, +// ), +// ), +// ), ], ); })), diff --git a/lib/views/home/map_widget.dart/main_bottom_Menu_map.dart b/lib/views/home/map_widget.dart/main_bottom_Menu_map.dart index 65591c5..36e9786 100644 --- a/lib/views/home/map_widget.dart/main_bottom_Menu_map.dart +++ b/lib/views/home/map_widget.dart/main_bottom_Menu_map.dart @@ -1,6 +1,4 @@ -import 'package:SEFER/views/widgets/my_dialog.dart'; import 'package:SEFER/views/widgets/my_textField.dart'; -import 'package:SEFER/views/widgets/mysnakbar.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; @@ -16,7 +14,8 @@ import '../../../constant/colors.dart'; import '../../../constant/table_names.dart'; import '../../../controller/functions/toast.dart'; import '../../../controller/functions/tts.dart'; -import '../../../print.dart'; +import '../../widgets/error_snakbar.dart'; +import '../../widgets/mydialoug.dart'; import 'form_search_start.dart'; class MainBottomMenuMap extends StatelessWidget { @@ -352,7 +351,7 @@ class MainBottomMenuMap extends StatelessWidget { onPressed: () async { Get.back(); await controller.getLocation(); - await controller.getMap( + await controller.getDirectionMap( '${controller.passengerLocation.latitude},${controller.passengerLocation.longitude}', '${controller.recentPlaces[index]['latitude']},${controller.recentPlaces[index]['longitude']}', ); @@ -402,7 +401,7 @@ class MainBottomMenuMap extends StatelessWidget { controller.newMyLocation = controller.newStartPointLocation; controller.changeMainBottomMenuMap(); - await controller.getMap( + await controller.getDirectionMap( '${controller.newStartPointLocation.latitude},${controller.newStartPointLocation.longitude}', '${controller.myDestination.latitude},${controller.myDestination.longitude}', ); @@ -632,7 +631,7 @@ class FaviouratePlacesDialog extends StatelessWidget { onPressed: () async { Get.back(); await controller.getLocation(); - await controller.getMap( + await controller.getDirectionMap( '${controller.passengerLocation.latitude},${controller.passengerLocation.longitude}', '${favoritePlaces[index]['latitude']},${favoritePlaces[index]['longitude']}', ); diff --git a/lib/views/home/map_widget.dart/map_menu_widget.dart b/lib/views/home/map_widget.dart/map_menu_widget.dart index 8082df7..efa16dd 100644 --- a/lib/views/home/map_widget.dart/map_menu_widget.dart +++ b/lib/views/home/map_widget.dart/map_menu_widget.dart @@ -16,7 +16,7 @@ import '../../../constant/colors.dart'; import '../../../controller/home/map_passenger_controller.dart'; import '../../notification/notification_page.dart'; import '../../widgets/icon_widget_menu.dart'; -import '../home_page.dart'; +import '../setting_page.dart'; import '../profile/passenger_profile_page.dart'; class MapMenuWidget extends StatelessWidget { @@ -73,12 +73,12 @@ class MapMenuWidget extends StatelessWidget { title: 'Home'.tr, onpressed: () { Get.to( - () => const HomePage(), + () => const SettingPage(), transition: Transition.downToUp, curve: Curves.easeInOutExpo, ); }, - icon: Icons.home), + icon: Icons.settings), ], ) : const SizedBox(), // Choose the desired overlay color diff --git a/lib/views/home/map_widget.dart/picker_animation_container.dart b/lib/views/home/map_widget.dart/picker_animation_container.dart index 28dae52..92742bb 100644 --- a/lib/views/home/map_widget.dart/picker_animation_container.dart +++ b/lib/views/home/map_widget.dart/picker_animation_container.dart @@ -133,7 +133,7 @@ class PickerAnimtionContainerFormPlaces extends StatelessWidget { TextButton( onPressed: () async { await controller - .getMap( + .getDirectionMap( '${controller.passengerLocation.latitude},${controller.passengerLocation.longitude}', '${favoritePlaces[index]['latitude']},${favoritePlaces[index]['longitude']}', ); @@ -191,7 +191,7 @@ class PickerAnimtionContainerFormPlaces extends StatelessWidget { MyElevatedButton( title: 'Go to this Target'.tr, onPressed: () async { - await controller.getMap( + await controller.getDirectionMap( '${controller.passengerLocation.latitude},${controller.passengerLocation.longitude}', '${controller.newMyLocation.latitude},${controller.newMyLocation.longitude}', ); diff --git a/lib/views/home/map_widget.dart/searching_captain_window.dart b/lib/views/home/map_widget.dart/searching_captain_window.dart index d98c834..55ec8d9 100644 --- a/lib/views/home/map_widget.dart/searching_captain_window.dart +++ b/lib/views/home/map_widget.dart/searching_captain_window.dart @@ -8,121 +8,6 @@ import 'package:SEFER/views/widgets/my_textField.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; -import '../../../constant/links.dart'; - -// class SearchingCaptainWindow extends StatelessWidget { -// const SearchingCaptainWindow({super.key}); - -// Widget _buildDriverAvatars(MapPassengerController controller) { -// // If no drivers yet, show loading indicator -// if (controller.isSearchingWindow) { -// // Check if dataCarsLocationByPassenger or its 'data' is null -// if (controller.dataCarsLocationByPassenger == null || -// controller.dataCarsLocationByPassenger['data'] == null || -// controller.dataCarsLocationByPassenger['data'].isEmpty) { -// return const SizedBox( -// height: 60, -// child: Center( -// child: CircularProgressIndicator( -// valueColor: -// AlwaysStoppedAnimation(AppColor.secondaryColor), -// ), -// ), -// ); -// } -// } - -// return SizedBox( -// height: 60, -// child: ListView.builder( -// scrollDirection: Axis.horizontal, -// itemCount: controller.dataCarsLocationByPassenger['data'].length, -// padding: const EdgeInsets.symmetric(horizontal: 16), -// itemBuilder: (context, index) { -// final driver = controller.dataCarsLocationByPassenger['data'][index]; -// return Padding( -// padding: const EdgeInsets.only(right: 8), -// child: Column( -// mainAxisSize: MainAxisSize.min, -// children: [ -// CircleAvatar( -// radius: 25, -// backgroundColor: AppColor.secondaryColor, -// child: ClipOval( -// child: Image.network( -// '${AppLink.server}/portrate_captain_image/${driver['driver_id']}.jpg', -// width: 50, -// height: 50, -// fit: BoxFit.cover, -// errorBuilder: (context, error, stackTrace) { -// return const Icon( -// Icons.person, -// color: Colors.white, -// size: 30, -// ); -// }, -// ), -// ), -// ), -// ], -// ), -// ); -// }, -// ), -// ); -// } - -// @override -// Widget build(BuildContext context) { -// return GetBuilder( -// builder: (mapPassengerController) { -// return mapPassengerController.isSearchingWindow -// ? Positioned( -// bottom: 0, -// left: 0, -// right: 0, -// child: Container( -// decoration: AppStyle.boxDecoration1, -// height: Get.height * -// .3, // Increased height to accommodate avatars -// child: Column( -// mainAxisAlignment: MainAxisAlignment.spaceEvenly, -// children: [ -// SizedBox( -// width: Get.width * .7, -// child: const LinearProgressIndicator( -// minHeight: 6, -// backgroundColor: AppColor.yellowColor, -// color: AppColor.secondaryColor, -// ), -// ), -// mapPassengerController.driverOrderStatus == 'recive' -// ? Text( -// "Drivers received orders".tr, -// style: AppStyle.title, -// ) -// : Text( -// "We are searching for the nearest driver to you" -// .tr, -// style: AppStyle.title, -// ), -// Text( -// 'please wait till driver accept your order'.tr, -// style: AppStyle.title, -// ), -// // New: Driver avatars section -// _buildDriverAvatars(mapPassengerController), -// _buildTimer(mapPassengerController), -// ], -// ), -// ), -// ) -// : const SizedBox(); -// }, -// ); -// } -// } - class SearchingCaptainWindow extends StatelessWidget { const SearchingCaptainWindow({super.key}); diff --git a/lib/views/home/map_widget.dart/select_driver_mishwari.dart b/lib/views/home/map_widget.dart/select_driver_mishwari.dart index dfaee4b..59e3546 100644 --- a/lib/views/home/map_widget.dart/select_driver_mishwari.dart +++ b/lib/views/home/map_widget.dart/select_driver_mishwari.dart @@ -6,7 +6,6 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; -import '../../../constant/api_key.dart'; import '../../../constant/links.dart'; import '../../../print.dart'; diff --git a/lib/views/home/profile/complaint_page.dart b/lib/views/home/profile/complaint_page.dart index eae4907..4ad8a50 100644 --- a/lib/views/home/profile/complaint_page.dart +++ b/lib/views/home/profile/complaint_page.dart @@ -4,12 +4,12 @@ import 'package:SEFER/constant/colors.dart'; import 'package:SEFER/constant/style.dart'; import 'package:SEFER/controller/functions/crud.dart'; import 'package:SEFER/controller/home/profile/complaint_controller.dart'; -import 'package:SEFER/views/widgets/my_dialog.dart'; import 'package:flutter/cupertino.dart'; import 'package:get/get.dart'; import 'dart:io'; import '../../../controller/functions/audio_record1.dart'; +import '../../widgets/mydialoug.dart'; class ComplaintPage extends StatelessWidget { final ComplaintController complaintController = diff --git a/lib/views/home/profile/passenger_profile_page.dart b/lib/views/home/profile/passenger_profile_page.dart index 04e2083..b55b025 100644 --- a/lib/views/home/profile/passenger_profile_page.dart +++ b/lib/views/home/profile/passenger_profile_page.dart @@ -413,68 +413,72 @@ class CountryPickerFromSetting extends StatelessWidget { @override Widget build(BuildContext context) { return GetBuilder(builder: (controller) { - return Padding( - padding: const EdgeInsets.all(20.0), - child: ListView( - children: [ - const SizedBox( - height: 20, - ), - Text( - "Select Your Country".tr, - style: AppStyle.headTitle2, - textAlign: TextAlign.center, - ), - // const SizedBox( - // height: 20, - // ), - Padding( - padding: const EdgeInsets.all(10), - child: Text( - "To ensure you receive the most accurate information for your location, please select your country below. This will help tailor the app experience and content to your country." - .tr, - style: AppStyle.title, - textAlign: TextAlign.center, - ), - ), - SizedBox( - height: 200, - child: CupertinoPicker( - itemExtent: 32, - onSelectedItemChanged: (int index) { - controller.setCountry(countryOptions[index]); - box.write(BoxName.countryCode, - countryOptions[index]); // Save in English - }, - children: List.generate( - countryOptions.length, - (index) => Center( - child: Text( - countryOptions[index] - .tr, // Display translated if not English - style: AppStyle.title, + return CupertinoPageScaffold( + navigationBar: CupertinoNavigationBar( + middle: Text('Select Your Country'.tr), + ), + child: Padding( + padding: const EdgeInsets.all(20.0), + child: ListView( + children: [ + const SizedBox( + height: 20, + ), + // Text( + // "Select Your Country".tr, + // style: AppStyle.headTitle2, + // textAlign: TextAlign.center, + // ), + // const SizedBox( + // height: 20, + // ), + Padding( + padding: const EdgeInsets.all(10), + child: Text( + "To ensure you receive the most accurate information for your location, please select your country below. This will help tailor the app experience and content to your country." + .tr, + style: AppStyle.headTitle2, + textAlign: TextAlign.center, + ), + ), + SizedBox( + height: 200, + child: CupertinoPicker( + itemExtent: 32, + onSelectedItemChanged: (int index) { + controller.setCountry(countryOptions[index]); + box.write(BoxName.countryCode, + countryOptions[index]); // Save in English + }, + children: List.generate( + countryOptions.length, + (index) => Center( + child: Text( + countryOptions[index] + .tr, // Display translated if not English + style: AppStyle.title, + ), + ), ), ), ), - ), - ), - MyElevatedButton( - title: 'Select Country'.tr, // Use translated text for button - onPressed: () async { - loginController.saveCountryCode(controller.selectedCountry - .toString()); // No conversion needed - box.write( - BoxName.countryCode, // - controller.selectedCountry); // Already saved in English - Get.snackbar(controller.selectedCountry.toString().tr, '', - backgroundColor: AppColor.greenColor); - // Get.back();// - // Get.back(); - }, - ) - ], - ), + MyElevatedButton( + title: 'Select Country'.tr, // Use translated text for button + onPressed: () async { + loginController.saveCountryCode(controller.selectedCountry + .toString()); // No conversion needed + box.write( + BoxName.countryCode, // + controller.selectedCountry); // Already saved in English + Get.snackbar(controller.selectedCountry.toString().tr, '', + backgroundColor: AppColor.greenColor); + // Get.back();// + // Get.back(); + }, + ) + ], + )), ); }); } diff --git a/lib/views/home/home_page.dart b/lib/views/home/setting_page.dart similarity index 90% rename from lib/views/home/home_page.dart rename to lib/views/home/setting_page.dart index 3b9949d..3920785 100644 --- a/lib/views/home/home_page.dart +++ b/lib/views/home/setting_page.dart @@ -10,15 +10,15 @@ import 'HomePage/share_app_page.dart'; import 'HomePage/trip_record_page.dart'; import 'profile/passenger_profile_page.dart'; -class HomePage extends StatelessWidget { - const HomePage({super.key}); +class SettingPage extends StatelessWidget { + const SettingPage({super.key}); @override Widget build(BuildContext context) { Get.put(HomePageController()); return CupertinoPageScaffold( navigationBar: CupertinoNavigationBar( - middle: Text('Home Page'.tr), + middle: Text('Setting'.tr), leading: CupertinoButton( padding: EdgeInsets.zero, child: const Icon(CupertinoIcons.back), @@ -42,14 +42,7 @@ class HomePage extends StatelessWidget { ), CupertinoListTile( onTap: () { - Get.to(CupertinoPageScaffold( - navigationBar: CupertinoNavigationBar( - middle: Text('Change Country'.tr), - ), - child: SafeArea( - child: CountryPickerFromSetting(), - ), - )); + Get.to(() => CountryPickerFromSetting()); }, leading: const Icon(CupertinoIcons.location, color: CupertinoColors.activeBlue), diff --git a/lib/views/lang/languages.dart b/lib/views/lang/languages.dart index 84af0f9..2f9d734 100644 --- a/lib/views/lang/languages.dart +++ b/lib/views/lang/languages.dart @@ -1,4 +1,5 @@ import 'package:SEFER/constant/style.dart'; +import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:SEFER/views/widgets/elevated_btn.dart'; @@ -14,238 +15,122 @@ class Language extends StatelessWidget { @override Widget build(BuildContext context) { - return Scaffold( - body: GetBuilder( - builder: (controller) => Center( - child: Container( - padding: const EdgeInsets.all(15), - child: ListView( - // mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: [ - Text( - "Choose Language".tr, - style: Theme.of(context).textTheme.headlineLarge, + return CupertinoPageScaffold( + navigationBar: CupertinoNavigationBar( + middle: Text('Choose Language'.tr), + border: null, + ), + child: SafeArea( + child: GetBuilder( + builder: (controller) => Center( + child: Padding( + padding: const EdgeInsets.all(16), + child: Column( + children: [ + _buildHeader(), + const SizedBox(height: 20), + Expanded( + child: ListView( + physics: const BouncingScrollPhysics(), + children: [ + _buildLanguageButton( + 'العربية', 'ar', controller, context), + _buildLanguageButton( + 'English', 'en', controller, context), + _buildLanguageButton( + 'Türkçe', 'tr', controller, context), + _buildLanguageButton( + 'Français', 'fr', controller, context), + _buildLanguageButton( + 'Italiano', 'it', controller, context), + _buildLanguageButton( + 'Deutsch', 'de', controller, context), + _buildLanguageButton( + 'Ελληνικά', 'el', controller, context), + _buildLanguageButton( + 'Español', 'es', controller, context), + _buildLanguageButton( + 'فارسی', 'fa', controller, context), + _buildLanguageButton('中文', 'zh', controller, context), + _buildLanguageButton( + 'Русский', 'ru', controller, context), + _buildLanguageButton( + 'हिन्दी', 'hi', controller, context), + ], + ), + ), + ], ), - const SizedBox(height: 20), - MyElevatedButton( - title: 'العربية', - onPressed: () { - controller.changeLang("ar"); - Get.defaultDialog( - title: 'You should restart app to change language'.tr, - titleStyle: AppStyle.title, - middleText: '', - confirm: MyElevatedButton( - title: 'Ok'.tr, - onPressed: () { - box.read(BoxName.email) != null - ? Get.offAll(() => const MapPagePassenger()) - : Get.offAll(() => LoginPage()); - })); - }, - ), - MyElevatedButton( - title: "English", - onPressed: () { - controller.changeLang("en"); - Get.defaultDialog( - title: 'You should restart app to change language'.tr, - titleStyle: AppStyle.title, - middleText: '', - confirm: MyElevatedButton( - title: 'Ok'.tr, - onPressed: () { - box.read(BoxName.email) != null - ? Get.offAll(() => const MapPagePassenger()) - : Get.offAll(() => LoginPage()); - })); - }, - ), - MyElevatedButton( - title: "Türkçe", - onPressed: () { - controller.changeLang("tr"); - Get.defaultDialog( - title: 'You should restart app to change language'.tr, - titleStyle: AppStyle.title, - middleText: '', - confirm: MyElevatedButton( - title: 'Ok'.tr, - onPressed: () { - box.read(BoxName.email) != null - ? Get.offAll(() => const MapPagePassenger()) - : Get.offAll(() => LoginPage()); - })); - }, - ), - MyElevatedButton( - title: "Français", - onPressed: () { - controller.changeLang("fr"); - Get.defaultDialog( - title: 'You should restart app to change language'.tr, - titleStyle: AppStyle.title, - middleText: '', - confirm: MyElevatedButton( - title: 'Ok'.tr, - onPressed: () { - box.read(BoxName.email) != null - ? Get.offAll(() => const MapPagePassenger()) - : Get.offAll(() => LoginPage()); - })); - }, - ), - MyElevatedButton( - title: "Italiano", - onPressed: () { - controller.changeLang("it"); - Get.defaultDialog( - title: 'You should restart app to change language'.tr, - titleStyle: AppStyle.title, - middleText: '', - confirm: MyElevatedButton( - title: 'Ok'.tr, - onPressed: () { - box.read(BoxName.email) != null - ? Get.offAll(() => const MapPagePassenger()) - : Get.offAll(() => LoginPage()); - })); - }, - ), - MyElevatedButton( - title: "Deutsch", - onPressed: () { - controller.changeLang("de"); - Get.defaultDialog( - title: 'You should restart app to change language'.tr, - titleStyle: AppStyle.title, - middleText: '', - confirm: MyElevatedButton( - title: 'Ok'.tr, - onPressed: () { - Get.defaultDialog( - title: - 'You should restart app to change language' - .tr, - titleStyle: AppStyle.title, - middleText: '', - confirm: MyElevatedButton( - title: 'Ok'.tr, - onPressed: () { - box.read(BoxName.email) != null - ? Get.offAll( - () => const MapPagePassenger()) - : Get.offAll(() => LoginPage()); - })); - })); - }, - ), - MyElevatedButton( - title: "Ελληνικά", - onPressed: () { - controller.changeLang("el"); - Get.defaultDialog( - title: 'You should restart app to change language'.tr, - titleStyle: AppStyle.title, - middleText: '', - confirm: MyElevatedButton( - title: 'Ok'.tr, - onPressed: () { - box.read(BoxName.email) != null - ? Get.offAll(() => const MapPagePassenger()) - : Get.offAll(() => LoginPage()); - })); - }, - ), - MyElevatedButton( - title: "Español", - onPressed: () { - controller.changeLang("es"); - Get.defaultDialog( - title: 'You should restart app to change language'.tr, - titleStyle: AppStyle.title, - middleText: '', - confirm: MyElevatedButton( - title: 'Ok'.tr, - onPressed: () { - box.read(BoxName.email) != null - ? Get.offAll(() => const MapPagePassenger()) - : Get.offAll(() => LoginPage()); - })); - }, - ), - MyElevatedButton( - title: "فارسی", - onPressed: () { - controller.changeLang("fa"); - Get.defaultDialog( - title: 'You should restart app to change language'.tr, - titleStyle: AppStyle.title, - middleText: '', - confirm: MyElevatedButton( - title: 'Ok'.tr, - onPressed: () { - box.read(BoxName.email) != null - ? Get.offAll(() => const MapPagePassenger()) - : Get.offAll(() => LoginPage()); - })); - }, - ), - MyElevatedButton( - title: "中文", - onPressed: () { - controller.changeLang("zh"); - Get.defaultDialog( - title: 'You should restart app to change language'.tr, - titleStyle: AppStyle.title, - middleText: '', - confirm: MyElevatedButton( - title: 'Ok'.tr, - onPressed: () { - box.read(BoxName.email) != null - ? Get.offAll(() => const MapPagePassenger()) - : Get.offAll(() => LoginPage()); - })); - }, - ), - MyElevatedButton( - title: "Русский", - onPressed: () { - controller.changeLang("ru"); - Get.defaultDialog( - title: 'You should restart app to change language'.tr, - titleStyle: AppStyle.title, - middleText: '', - confirm: MyElevatedButton( - title: 'Ok'.tr, - onPressed: () { - box.read(BoxName.email) != null - ? Get.offAll(() => const MapPagePassenger()) - : Get.offAll(() => LoginPage()); - })); - }, - ), - MyElevatedButton( - title: "हिन्दी", - onPressed: () { - controller.changeLang("hi"); - Get.defaultDialog( - title: 'You should restart app to change language'.tr, - titleStyle: AppStyle.title, - middleText: '', - confirm: MyElevatedButton( - title: 'Ok'.tr, - onPressed: () { - box.read(BoxName.email) != null - ? Get.offAll(() => const MapPagePassenger()) - : Get.offAll(() => LoginPage()); - })); - }, - ), - ], + ), ), ), ), - )); + ); + } + + Widget _buildHeader() { + return Container( + padding: const EdgeInsets.all(20), + decoration: BoxDecoration( + gradient: const LinearGradient( + colors: [Color(0xFF2196F3), Color(0xFF1976D2)], + begin: Alignment.topLeft, + end: Alignment.bottomRight, + ), + borderRadius: BorderRadius.circular(16), + boxShadow: [ + BoxShadow( + color: CupertinoColors.systemBlue.withOpacity(0.2), + blurRadius: 10, + offset: const Offset(0, 4), + ), + ], + ), + child: Column( + children: [ + const Icon( + CupertinoIcons.globe, + color: CupertinoColors.white, + size: 48, + ), + const SizedBox(height: 16), + Text( + 'Choose Language'.tr, + style: const TextStyle( + color: CupertinoColors.white, + fontSize: 22, + fontWeight: FontWeight.bold, + ), + textAlign: TextAlign.center, + ), + ], + ), + ); + } + + Widget _buildLanguageButton(String title, String langCode, + LocaleController controller, BuildContext context) { + return Padding( + padding: const EdgeInsets.symmetric(vertical: 8), + child: MyElevatedButton( + title: title, + onPressed: () async { + controller.changeLang(langCode); + showCupertinoDialog( + context: context, + builder: (context) => CupertinoAlertDialog( + title: Text('You should restart app to change language'.tr), + actions: [ + CupertinoDialogAction( + child: Text('Ok'.tr), + onPressed: () { + Get.offAll(() => MapPagePassenger()); + }, + ), + ], + ), + ); + }, + )); } } diff --git a/lib/views/widgets/circle_container.dart b/lib/views/widgets/circle_container.dart index eb7fc21..d3b1013 100644 --- a/lib/views/widgets/circle_container.dart +++ b/lib/views/widgets/circle_container.dart @@ -1,6 +1,8 @@ import 'package:flutter/material.dart'; import 'package:get/get.dart'; -import 'package:SEFER/constant/colors.dart'; + +import '../../constant/colors.dart'; +import 'mydialoug.dart'; class MyCircleContainer extends StatelessWidget { final Widget child; @@ -22,6 +24,12 @@ class MyCircleContainer extends StatelessWidget { builder: ((controller) => GestureDetector( onTap: () { controller.changeColor(); + MyDialog().getDialog( + 'Rejected Orders Count'.tr, + 'This is the total number of rejected orders per day after accepting the orders' + .tr, () { + Get.back(); + }); }, child: AnimatedContainer( onEnd: () { diff --git a/lib/views/widgets/elevated_btn.dart b/lib/views/widgets/elevated_btn.dart index f89014c..edce2a4 100644 --- a/lib/views/widgets/elevated_btn.dart +++ b/lib/views/widgets/elevated_btn.dart @@ -1,18 +1,19 @@ import 'dart:io'; + import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:vibration/vibration.dart'; -import 'package:SEFER/constant/box_name.dart'; -import 'package:SEFER/constant/colors.dart'; -import 'package:SEFER/constant/style.dart'; -import 'package:SEFER/main.dart'; + +import '../../constant/box_name.dart'; +import '../../constant/colors.dart'; +import '../../constant/style.dart'; +import '../../main.dart'; class MyElevatedButton extends StatelessWidget { final String title; final VoidCallback onPressed; final Color kolor; final int vibrateDuration; - const MyElevatedButton({ Key? key, required this.title, @@ -24,22 +25,27 @@ class MyElevatedButton extends StatelessWidget { @override Widget build(BuildContext context) { bool vibrate = box.read(BoxName.isvibrate) ?? true; - return ElevatedButton( - style: ElevatedButton.styleFrom( - backgroundColor: kolor, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(12.0), + style: ButtonStyle( + backgroundColor: WidgetStateProperty.all(kolor), + shadowColor: WidgetStateProperty.all(Colors.transparent), + shape: WidgetStateProperty.all( + RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8), + ), ), ), onPressed: () async { + // Handle haptic feedback for both iOS and Android if (vibrate == true) { if (Platform.isIOS) { HapticFeedback.selectionClick(); - } else { + } else if (Platform.isAndroid) { await Vibration.vibrate(duration: vibrateDuration); - } + } else {} } + + // Ensure the onPressed callback is called after haptic feedback onPressed(); }, child: Text( diff --git a/lib/views/widgets/error_snakbar.dart b/lib/views/widgets/error_snakbar.dart new file mode 100644 index 0000000..0a129e4 --- /dev/null +++ b/lib/views/widgets/error_snakbar.dart @@ -0,0 +1,123 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:get/get.dart'; + +import '../../constant/colors.dart'; + +class SnackbarConfig { + static const duration = Duration(seconds: 3); + static const animationDuration = Duration(milliseconds: 300); + static const margin = EdgeInsets.symmetric(horizontal: 16, vertical: 10); + static const borderRadius = 12.0; + static const elevation = 6.0; + + static final BoxShadow shadow = BoxShadow( + color: Colors.black.withOpacity(0.1), + blurRadius: 10, + offset: const Offset(0, 2), + ); +} + +SnackbarController mySnackeBarError(String message) { + // Trigger error haptic feedback + HapticFeedback.mediumImpact(); + + return Get.snackbar( + 'Error'.tr, + message, + backgroundColor: AppColor.redColor.withOpacity(0.95), + colorText: AppColor.secondaryColor, + icon: const Icon( + Icons.error_outline_rounded, + color: AppColor.secondaryColor, + size: 28, + ), + shouldIconPulse: true, + snackPosition: SnackPosition.TOP, + margin: SnackbarConfig.margin, + borderRadius: SnackbarConfig.borderRadius, + duration: SnackbarConfig.duration, + animationDuration: SnackbarConfig.animationDuration, + forwardAnimationCurve: Curves.easeOutCirc, + reverseAnimationCurve: Curves.easeInCirc, + boxShadows: [SnackbarConfig.shadow], + padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 12), + titleText: Text( + 'Error'.tr, + style: const TextStyle( + fontWeight: FontWeight.w700, + color: Colors.white, + fontSize: 16, + letterSpacing: 0.2, + ), + ), + messageText: Text( + message, + style: TextStyle( + color: Colors.white.withOpacity(0.95), + fontSize: 14, + height: 1.3, + ), + ), + onTap: (_) { + HapticFeedback.lightImpact(); + Get.closeCurrentSnackbar(); + }, + isDismissible: true, + dismissDirection: DismissDirection.horizontal, + overlayBlur: 0.8, + overlayColor: Colors.black12, + ); +} + +SnackbarController mySnackbarSuccess(String message) { + // Trigger success haptic feedback + HapticFeedback.lightImpact(); + + return Get.snackbar( + 'Success'.tr, + message, + backgroundColor: AppColor.greenColor.withOpacity(0.95), + colorText: AppColor.secondaryColor, + icon: const Icon( + Icons.check_circle_outline_rounded, + color: AppColor.secondaryColor, + size: 28, + ), + shouldIconPulse: true, + snackPosition: SnackPosition.TOP, + margin: SnackbarConfig.margin, + borderRadius: SnackbarConfig.borderRadius, + duration: SnackbarConfig.duration, + animationDuration: SnackbarConfig.animationDuration, + forwardAnimationCurve: Curves.easeOutCirc, + reverseAnimationCurve: Curves.easeInCirc, + boxShadows: [SnackbarConfig.shadow], + padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 12), + titleText: Text( + 'Success'.tr, + style: const TextStyle( + fontWeight: FontWeight.w700, + color: Colors.white, + fontSize: 16, + letterSpacing: 0.2, + ), + ), + messageText: Text( + message, + style: TextStyle( + color: Colors.white.withOpacity(0.95), + fontSize: 14, + height: 1.3, + ), + ), + onTap: (_) { + HapticFeedback.lightImpact(); + Get.closeCurrentSnackbar(); + }, + isDismissible: true, + dismissDirection: DismissDirection.horizontal, + overlayBlur: 0.8, + overlayColor: Colors.black12, + ); +} diff --git a/lib/views/widgets/icon_widget_menu.dart b/lib/views/widgets/icon_widget_menu.dart index b090b95..604aa40 100644 --- a/lib/views/widgets/icon_widget_menu.dart +++ b/lib/views/widgets/icon_widget_menu.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; -import 'package:SEFER/constant/style.dart'; import '../../constant/colors.dart'; +import '../../constant/style.dart'; class IconWidgetMenu extends StatelessWidget { const IconWidgetMenu({ @@ -20,7 +20,7 @@ class IconWidgetMenu extends StatelessWidget { return InkWell( onTap: onpressed, child: Padding( - padding: const EdgeInsets.only(top: 1), + padding: const EdgeInsets.only(top: 25), child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ @@ -29,22 +29,22 @@ class IconWidgetMenu extends StatelessWidget { decoration: const BoxDecoration( color: AppColor.secondaryColor, shape: BoxShape.circle, - // boxShadow: [ - // BoxShadow( - // color: AppColor.secondaryColor, - // offset: Offset(-2, -2), - // blurRadius: 0, - // spreadRadius: 0, - // blurStyle: BlurStyle.outer, - // ), - // BoxShadow( - // color: AppColor.accentColor, - // offset: Offset(3, 3), - // blurRadius: 0, - // spreadRadius: 0, - // blurStyle: BlurStyle.outer, - // ), - // ], + boxShadow: [ + BoxShadow( + color: AppColor.secondaryColor, + offset: Offset(-2, -2), + blurRadius: 0, + spreadRadius: 0, + blurStyle: BlurStyle.outer, + ), + BoxShadow( + color: AppColor.accentColor, + offset: Offset(3, 3), + blurRadius: 0, + spreadRadius: 0, + blurStyle: BlurStyle.outer, + ), + ], ), child: Center( child: Icon( @@ -56,7 +56,7 @@ class IconWidgetMenu extends StatelessWidget { ), Text( title, - style: AppStyle.subtitle.copyWith(color: AppColor.secondaryColor), + style: AppStyle.subtitle, ) ], ), diff --git a/lib/views/widgets/my_circular_indicator_timer.dart b/lib/views/widgets/my_circular_indicator_timer.dart new file mode 100644 index 0000000..54488fe --- /dev/null +++ b/lib/views/widgets/my_circular_indicator_timer.dart @@ -0,0 +1,74 @@ +import 'package:flutter/material.dart'; +import 'dart:async'; + +import '../../constant/style.dart'; + +class MyCircularProgressIndicatorWithTimer extends StatelessWidget { + final Color backgroundColor; + final bool isLoading; + + MyCircularProgressIndicatorWithTimer({ + Key? key, + this.backgroundColor = Colors.transparent, + required this.isLoading, + }) : super(key: key); + + final StreamController _streamController = StreamController(); + + void startTimer() { + int _timeLeft = 60; + Timer.periodic(const Duration(seconds: 1), (timer) { + if (_timeLeft > 0 && isLoading) { + _streamController.add(_timeLeft); + _timeLeft--; + } else { + timer.cancel(); + _streamController.close(); + } + }); + } + + @override + Widget build(BuildContext context) { + if (isLoading) { + startTimer(); + } + + return Center( + child: Container( + width: 200, + height: 200, + decoration: BoxDecoration( + color: backgroundColor, + shape: BoxShape.circle, + ), + child: Stack( + children: [ + const Center(child: CircularProgressIndicator()), + Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Align( + alignment: Alignment.center, + child: Image.asset( + 'assets/images/logo.gif', + width: 140, + height: 140, + ), + ), + const SizedBox(height: 10), + StreamBuilder( + stream: _streamController.stream, + initialData: 60, + builder: (context, snapshot) { + return Text('${snapshot.data}', style: AppStyle.title); + }, + ), + ], + ), + ], + ), + ), + ); + } +} diff --git a/lib/views/widgets/my_dialog.dart b/lib/views/widgets/my_dialog.dart deleted file mode 100644 index add3cc1..0000000 --- a/lib/views/widgets/my_dialog.dart +++ /dev/null @@ -1,109 +0,0 @@ -import 'dart:ui'; - -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; -import 'package:get/get.dart'; - -import '../../constant/colors.dart'; -import '../../constant/style.dart'; -import '../../controller/functions/tts.dart'; -import 'elevated_btn.dart'; - -class MyDialog extends GetxController { - void getDialog(String title, String? midTitle, VoidCallback onPressed) { - final textToSpeechController = Get.put(TextToSpeechController()); - - Get.dialog( - BackdropFilter( - filter: ImageFilter.blur(sigmaX: 5, sigmaY: 5), - child: CupertinoAlertDialog( - title: Text( - title, - style: AppStyle.title.copyWith( - fontSize: 20, - fontWeight: FontWeight.bold, - ), - ), - content: Column( - children: [ - CupertinoButton( - onPressed: () async { - await textToSpeechController.speakText(title ?? midTitle!); - }, - child: const Icon(CupertinoIcons.headphones, - color: AppColor.primaryColor), - ), - Text( - midTitle!, - style: AppStyle.title.copyWith(fontSize: 16), - ), - ], - ), - actions: [ - CupertinoDialogAction( - child: const Text('Cancel', - style: TextStyle(color: AppColor.redColor)), - onPressed: () { - Get.back(); - }, - ), - CupertinoDialogAction( - onPressed: onPressed, - child: Text('OK'.tr, - style: const TextStyle(color: AppColor.greenColor)), - ), - ], - ), - ), - barrierDismissible: false, - ); - } -} - -class MyDialogContent extends GetxController { - void getDialog(String title, Widget? content, VoidCallback onPressed) { - final textToSpeechController = Get.put(TextToSpeechController()); - - Get.dialog( - BackdropFilter( - filter: ImageFilter.blur(sigmaX: 5, sigmaY: 5), - child: CupertinoAlertDialog( - title: Text( - title, - style: AppStyle.title.copyWith( - fontSize: 20, - fontWeight: FontWeight.bold, - ), - ), - content: Column( - children: [ - CupertinoButton( - onPressed: () async { - await textToSpeechController.speakText(title); - }, - child: const Icon(CupertinoIcons.speaker_2, - color: AppColor.primaryColor), - ), - content! - ], - ), - actions: [ - CupertinoDialogAction( - child: const Text('Cancel', - style: TextStyle(color: AppColor.redColor)), - onPressed: () { - Get.back(); - }, - ), - CupertinoDialogAction( - onPressed: onPressed, - child: Text('OK'.tr, - style: const TextStyle(color: AppColor.greenColor)), - ), - ], - ), - ), - barrierDismissible: false, - ); - } -} diff --git a/lib/views/widgets/my_textField.dart b/lib/views/widgets/my_textField.dart index 15fc4c0..79f49ae 100644 --- a/lib/views/widgets/my_textField.dart +++ b/lib/views/widgets/my_textField.dart @@ -1,7 +1,8 @@ import 'package:flutter/cupertino.dart'; import 'package:get/get.dart'; import 'package:get_storage/get_storage.dart'; -import 'package:SEFER/constant/box_name.dart'; + +import '../../constant/box_name.dart'; class MyTextForm extends StatelessWidget { const MyTextForm({ @@ -27,7 +28,7 @@ class MyTextForm extends StatelessWidget { children: [ Text( label.tr, - style: const TextStyle( + style: TextStyle( color: CupertinoColors.label, fontSize: 16, fontWeight: FontWeight.w600, diff --git a/lib/views/widgets/mycircular.dart b/lib/views/widgets/mycircular.dart index af68047..c0a9d80 100644 --- a/lib/views/widgets/mycircular.dart +++ b/lib/views/widgets/mycircular.dart @@ -1,34 +1,131 @@ import 'package:flutter/material.dart'; -class MyCircularProgressIndicator extends StatelessWidget { +class MyCircularProgressIndicator extends StatefulWidget { final Color backgroundColor; + final double size; + final Color progressColor; + final double strokeWidth; const MyCircularProgressIndicator({ super.key, this.backgroundColor = Colors.transparent, + this.size = 110, + this.progressColor = Colors.blue, + this.strokeWidth = 3.0, }); + @override + State createState() => + _MyCircularProgressIndicatorState(); +} + +class _MyCircularProgressIndicatorState + extends State + with SingleTickerProviderStateMixin { + late AnimationController _controller; + late Animation _scaleAnimation; + late Animation _rotationAnimation; + + @override + void initState() { + super.initState(); + _controller = AnimationController( + duration: const Duration(seconds: 2), + vsync: this, + )..repeat(reverse: true); + + _scaleAnimation = Tween( + begin: 0.95, + end: 1.05, + ).animate(CurvedAnimation( + parent: _controller, + curve: Curves.easeInOut, + )); + + _rotationAnimation = Tween( + begin: 0, + end: 2, + ).animate(CurvedAnimation( + parent: _controller, + curve: Curves.linear, + )); + } + + @override + void dispose() { + _controller.dispose(); + super.dispose(); + } + @override Widget build(BuildContext context) { return Center( - child: Container( - width: 140, - height: 140, - decoration: BoxDecoration( - color: backgroundColor, - shape: BoxShape.circle, - ), - child: Stack( - children: [ - const Center(child: CircularProgressIndicator()), - Image.asset( - 'assets/images/logo.gif', - width: 140, - height: 140, - fit: BoxFit.contain, + child: AnimatedBuilder( + animation: _controller, + builder: (context, child) { + return Transform.scale( + scale: _scaleAnimation.value, + child: Container( + width: widget.size, + height: widget.size, + decoration: BoxDecoration( + color: widget.backgroundColor, + shape: BoxShape.circle, + boxShadow: [ + BoxShadow( + color: widget.progressColor.withAlpha(30), + blurRadius: 12, + spreadRadius: 2, + ), + ], + ), + child: Stack( + alignment: Alignment.center, + children: [ + // Outer rotating progress indicator + Transform.rotate( + angle: _rotationAnimation.value * 3.14, + child: CircularProgressIndicator( + strokeWidth: widget.strokeWidth, + valueColor: AlwaysStoppedAnimation( + widget.progressColor, + ), + ), + ), + // Inner static progress indicator + CircularProgressIndicator( + strokeWidth: widget.strokeWidth * 0.7, + valueColor: AlwaysStoppedAnimation( + widget.progressColor.withAlpha(150), + ), + ), + // Logo container with scale animation + ScaleTransition( + scale: Tween( + begin: 0.9, + end: 1.0, + ).animate(CurvedAnimation( + parent: _controller, + curve: Curves.easeInOut, + )), + child: Container( + width: widget.size * 0.7, + height: widget.size * 0.7, + decoration: BoxDecoration( + shape: BoxShape.circle, + color: widget.backgroundColor, + ), + child: Image.asset( + 'assets/images/logo.gif', + fit: BoxFit.contain, + ), + ), + ), + ], + ), ), - ], - ), + ); + }, ), ); } diff --git a/lib/views/widgets/mydialoug.dart b/lib/views/widgets/mydialoug.dart new file mode 100644 index 0000000..4784783 --- /dev/null +++ b/lib/views/widgets/mydialoug.dart @@ -0,0 +1,246 @@ +import 'dart:ui'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:get/get.dart'; + +import '../../constant/colors.dart'; +import '../../constant/style.dart'; +import '../../controller/functions/tts.dart'; + +class DialogConfig { + static const Duration animationDuration = Duration(milliseconds: 200); + static const double blurStrength = 8.0; + static const double cornerRadius = 14.0; + static final BoxDecoration decoration = BoxDecoration( + borderRadius: BorderRadius.circular(cornerRadius), + boxShadow: [ + BoxShadow( + color: Colors.black.withAlpha(38), // 0.15 opacity + blurRadius: 16, + offset: const Offset(0, 8), + ), + ], + ); +} + +class MyDialog extends GetxController { + void getDialog(String title, String? midTitle, VoidCallback onPressed) { + final textToSpeechController = Get.put(TextToSpeechController()); + + HapticFeedback.mediumImpact(); + + Get.dialog( + TweenAnimationBuilder( + duration: DialogConfig.animationDuration, + tween: Tween(begin: 0.0, end: 1.0), + builder: (context, value, child) { + return Transform.scale( + scale: 0.95 + (0.05 * value), + child: Opacity(opacity: value, child: child), + ); + }, + child: BackdropFilter( + filter: ImageFilter.blur( + sigmaX: DialogConfig.blurStrength, + sigmaY: DialogConfig.blurStrength, + ), + child: Theme( + data: ThemeData.light().copyWith( + dialogBackgroundColor: CupertinoColors.systemBackground, + ), + child: CupertinoAlertDialog( + title: Column( + children: [ + Text( + title, + style: AppStyle.title.copyWith( + fontSize: 20, + fontWeight: FontWeight.w700, + letterSpacing: -0.5, + color: AppColor.primaryColor, + ), + ), + const SizedBox(height: 8), + ], + ), + content: Column( + children: [ + CupertinoButton( + padding: const EdgeInsets.all(8), + onPressed: () async { + HapticFeedback.selectionClick(); + await textToSpeechController.speakText(title); + await textToSpeechController.speakText(midTitle!); + }, + child: Container( + padding: const EdgeInsets.all(8), + decoration: BoxDecoration( + color: + AppColor.primaryColor.withAlpha(26), // 0.1 opacity + borderRadius: BorderRadius.circular(8), + ), + child: Icon( + CupertinoIcons.speaker_2_fill, + color: AppColor.primaryColor, + size: 24, + ), + ), + ), + const SizedBox(height: 8), + Text( + midTitle!, + style: AppStyle.title.copyWith( + fontSize: 16, + height: 1.3, + color: Colors.black87, + ), + textAlign: TextAlign.center, + ), + ], + ), + actions: [ + CupertinoDialogAction( + onPressed: () { + HapticFeedback.lightImpact(); + Get.back(); + }, + child: Text( + 'Cancel', + style: TextStyle( + color: AppColor.redColor, + fontWeight: FontWeight.w600, + fontSize: 17, + ), + ), + ), + CupertinoDialogAction( + onPressed: () { + HapticFeedback.mediumImpact(); + onPressed(); + }, + child: Text( + 'OK'.tr, + style: TextStyle( + color: AppColor.greenColor, + fontWeight: FontWeight.w600, + fontSize: 17, + ), + ), + ), + ], + ), + ), + ), + ), + barrierDismissible: true, + barrierColor: Colors.black.withAlpha(102), // 0.4 opacity + ); + } +} + +class MyDialogContent extends GetxController { + void getDialog(String title, Widget? content, VoidCallback onPressed) { + final textToSpeechController = Get.put(TextToSpeechController()); + + HapticFeedback.mediumImpact(); + + Get.dialog( + TweenAnimationBuilder( + duration: DialogConfig.animationDuration, + tween: Tween(begin: 0.0, end: 1.0), + builder: (context, value, child) { + return Transform.scale( + scale: 0.95 + (0.05 * value), + child: Opacity(opacity: value, child: child), + ); + }, + child: BackdropFilter( + filter: ImageFilter.blur( + sigmaX: DialogConfig.blurStrength, + sigmaY: DialogConfig.blurStrength, + ), + child: Theme( + data: ThemeData.light().copyWith( + dialogBackgroundColor: CupertinoColors.systemBackground, + ), + child: CupertinoAlertDialog( + title: Column( + children: [ + Text( + title, + style: AppStyle.title.copyWith( + fontSize: 20, + fontWeight: FontWeight.w700, + letterSpacing: -0.5, + color: AppColor.primaryColor, + ), + ), + const SizedBox(height: 8), + ], + ), + content: Column( + children: [ + CupertinoButton( + padding: const EdgeInsets.all(8), + onPressed: () async { + HapticFeedback.selectionClick(); + await textToSpeechController.speakText(title); + }, + child: Container( + padding: const EdgeInsets.all(8), + decoration: BoxDecoration( + color: + AppColor.primaryColor.withAlpha(26), // 0.1 opacity + borderRadius: BorderRadius.circular(8), + ), + child: Icon( + CupertinoIcons.headphones, + color: AppColor.primaryColor, + size: 24, + ), + ), + ), + const SizedBox(height: 12), + content!, + ], + ), + actions: [ + CupertinoDialogAction( + onPressed: () { + HapticFeedback.lightImpact(); + Get.back(); + }, + child: Text( + 'Cancel', + style: TextStyle( + color: AppColor.redColor, + fontWeight: FontWeight.w600, + fontSize: 17, + ), + ), + ), + CupertinoDialogAction( + onPressed: () { + HapticFeedback.mediumImpact(); + onPressed(); + }, + child: Text( + 'OK'.tr, + style: TextStyle( + color: AppColor.greenColor, + fontWeight: FontWeight.w600, + fontSize: 17, + ), + ), + ), + ], + ), + ), + ), + ), + barrierDismissible: true, + barrierColor: Colors.black.withAlpha(102), // 0.4 opacity + ); + } +} diff --git a/lib/views/widgets/mysnakbar.dart b/lib/views/widgets/mysnakbar.dart deleted file mode 100644 index 8b7e73b..0000000 --- a/lib/views/widgets/mysnakbar.dart +++ /dev/null @@ -1,69 +0,0 @@ -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, - ), - ), - ); -} diff --git a/macos/Flutter/GeneratedPluginRegistrant.swift b/macos/Flutter/GeneratedPluginRegistrant.swift index b54e01e..cef7e86 100644 --- a/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/macos/Flutter/GeneratedPluginRegistrant.swift @@ -23,7 +23,7 @@ import package_info_plus import path_provider_foundation import record_darwin import sign_in_with_apple -import sqflite +import sqflite_darwin import url_launcher_macos import video_player_avfoundation import wakelock_plus diff --git a/macos/Runner/AppDelegate.swift b/macos/Runner/AppDelegate.swift index 8e02df2..b3c1761 100644 --- a/macos/Runner/AppDelegate.swift +++ b/macos/Runner/AppDelegate.swift @@ -6,4 +6,8 @@ class AppDelegate: FlutterAppDelegate { override func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool { return true } + + override func applicationSupportsSecureRestorableState(_ app: NSApplication) -> Bool { + return true + } } diff --git a/pubspec.lock b/pubspec.lock index 7c2a472..a839aec 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -5,31 +5,31 @@ packages: dependency: transitive description: name: _fe_analyzer_shared - sha256: f256b0c0ba6c7577c15e2e4e114755640a875e885099367bf6e012b19314c834 + sha256: "16e298750b6d0af7ce8a3ba7c18c69c3785d11b15ec83f6dcd0ad2a0009b3cab" url: "https://pub.dev" source: hosted - version: "72.0.0" + version: "76.0.0" _flutterfire_internals: dependency: transitive description: name: _flutterfire_internals - sha256: "9371d13b8ee442e3bfc08a24e3a1b3742c839abbfaf5eef11b79c4b862c89bf7" + sha256: daa1d780fdecf8af925680c06c86563cdd445deea995d5c9176f1302a2b10bbe url: "https://pub.dev" source: hosted - version: "1.3.41" + version: "1.3.48" _macros: dependency: transitive description: dart source: sdk - version: "0.3.2" + version: "0.3.3" analyzer: dependency: transitive description: name: analyzer - sha256: b652861553cd3990d8ed361f7979dc6d7053a9ac8843fa73820ab68ce5410139 + sha256: "1f14db053a8c23e260789e9b0980fa27f2680dd640932cae5e1137cce0e46e1e" url: "https://pub.dev" source: hosted - version: "6.7.0" + version: "6.11.0" animated_text_kit: dependency: "direct main" description: @@ -42,18 +42,18 @@ packages: dependency: transitive description: name: archive - sha256: cb6a278ef2dbb298455e1a713bda08524a175630ec643a242c399c932a0a1f7d + sha256: "6199c74e3db4fbfbd04f66d739e72fe11c8a8957d5f219f1f4482dbde6420b5a" url: "https://pub.dev" source: hosted - version: "3.6.1" + version: "4.0.2" args: dependency: transitive description: name: args - sha256: "7cf60b9f0cc88203c5a190b4cd62a99feea42759a7fa695010eb5de1c0b2252a" + sha256: bf9f5caeea8d8fe6721a9c358dd8a5c1947b27f1cfaa18b39c301273594919e6 url: "https://pub.dev" source: hosted - version: "2.5.0" + version: "2.6.0" async: dependency: transitive description: @@ -66,10 +66,10 @@ packages: dependency: transitive description: name: audio_session - sha256: "343e83bc7809fbda2591a49e525d6b63213ade10c76f15813be9aed6657b3261" + sha256: b2a26ba8b7efa1790d6460e82971fde3e398cfbe2295df9dea22f3499d2c12a7 url: "https://pub.dev" source: hosted - version: "0.1.21" + version: "0.1.23" boolean_selector: dependency: transitive description: @@ -82,50 +82,50 @@ packages: dependency: transitive description: name: build - sha256: "80184af8b6cb3e5c1c4ec6d8544d27711700bc3e6d2efad04238c7b5290889f0" + sha256: cef23f1eda9b57566c81e2133d196f8e3df48f244b317368d65c5943d91148f0 url: "https://pub.dev" source: hosted - version: "2.4.1" + version: "2.4.2" build_config: dependency: transitive description: name: build_config - sha256: bf80fcfb46a29945b423bd9aad884590fb1dc69b330a4d4700cac476af1708d1 + sha256: "4ae2de3e1e67ea270081eaee972e1bd8f027d459f249e0f1186730784c2e7e33" url: "https://pub.dev" source: hosted - version: "1.1.1" + version: "1.1.2" build_daemon: dependency: transitive description: name: build_daemon - sha256: "79b2aef6ac2ed00046867ed354c88778c9c0f029df8a20fe10b5436826721ef9" + sha256: "294a2edaf4814a378725bfe6358210196f5ea37af89ecd81bfa32960113d4948" url: "https://pub.dev" source: hosted - version: "4.0.2" + version: "4.0.3" build_resolvers: dependency: transitive description: name: build_resolvers - sha256: "339086358431fa15d7eca8b6a36e5d783728cf025e559b834f4609a1fcfb7b0a" + sha256: "99d3980049739a985cf9b21f30881f46db3ebc62c5b8d5e60e27440876b1ba1e" url: "https://pub.dev" source: hosted - version: "2.4.2" + version: "2.4.3" build_runner: dependency: "direct dev" description: name: build_runner - sha256: dd09dd4e2b078992f42aac7f1a622f01882a8492fef08486b27ddde929c19f04 + sha256: "74691599a5bc750dc96a6b4bfd48f7d9d66453eab04c7f4063134800d6a5c573" url: "https://pub.dev" source: hosted - version: "2.4.12" + version: "2.4.14" build_runner_core: dependency: transitive description: name: build_runner_core - sha256: f8126682b87a7282a339b871298cc12009cb67109cfa1614d6436fb0289193e0 + sha256: "22e3aa1c80e0ada3722fe5b63fd43d9c8990759d0a2cf489c8c5d7b2bdebc021" url: "https://pub.dev" source: hosted - version: "7.3.2" + version: "8.0.0" built_collection: dependency: transitive description: @@ -138,34 +138,34 @@ packages: dependency: transitive description: name: built_value - sha256: c7913a9737ee4007efedaffc968c049fd0f3d0e49109e778edc10de9426005cb + sha256: "28a712df2576b63c6c005c465989a348604960c0958d28be5303ba9baa841ac2" url: "https://pub.dev" source: hosted - version: "8.9.2" + version: "8.9.3" cached_network_image: dependency: transitive description: name: cached_network_image - sha256: "28ea9690a8207179c319965c13cd8df184d5ee721ae2ce60f398ced1219cea1f" + sha256: "7c1183e361e5c8b0a0f21a28401eecdbde252441106a9816400dd4c2b2424916" url: "https://pub.dev" source: hosted - version: "3.3.1" + version: "3.4.1" cached_network_image_platform_interface: dependency: transitive description: name: cached_network_image_platform_interface - sha256: "9e90e78ae72caa874a323d78fa6301b3fb8fa7ea76a8f96dc5b5bf79f283bf2f" + sha256: "35814b016e37fbdc91f7ae18c8caf49ba5c88501813f73ce8a07027a395e2829" url: "https://pub.dev" source: hosted - version: "4.0.0" + version: "4.1.1" cached_network_image_web: dependency: transitive description: name: cached_network_image_web - sha256: "205d6a9f1862de34b93184f22b9d2d94586b2f05c581d546695e3d8f6a805cd7" + sha256: "980842f4e8e2535b8dbd3d5ca0b1f0ba66bf61d14cc3a17a9b4788a3685ba062" url: "https://pub.dev" source: hosted - version: "1.2.0" + version: "1.3.1" calendar_builder: dependency: "direct main" description: @@ -194,18 +194,18 @@ packages: dependency: transitive description: name: chewie - sha256: e53da939709efb9aad0f3d72a69a8d05f889168b7a138af60ce78bab5c94b135 + sha256: "335df378c025588aef400c704bd71f0daea479d4cd57c471c88c056c1144e7cd" url: "https://pub.dev" source: hosted - version: "1.8.1" + version: "1.8.5" cli_util: dependency: transitive description: name: cli_util - sha256: c05b7406fdabc7a49a3929d4af76bcaccbbffcbcdcf185b082e1ae07da323d19 + sha256: ff6785f7e9e3c38ac98b2fb035701789de90154024a75b6cb926445e83197d1c url: "https://pub.dev" source: hosted - version: "0.4.1" + version: "0.4.2" clock: dependency: transitive description: @@ -218,26 +218,26 @@ packages: dependency: transitive description: name: code_builder - sha256: f692079e25e7869c14132d39f223f8eec9830eb76131925143b2129c4bb01b37 + sha256: "0ec10bf4a89e4c613960bf1e8b42c64127021740fb21640c29c909826a5eea3e" url: "https://pub.dev" source: hosted - version: "4.10.0" + version: "4.10.1" collection: dependency: transitive description: name: collection - sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a + sha256: a1ace0a119f20aabc852d165077c036cd864315bd99b7eaa10a60100341941bf url: "https://pub.dev" source: hosted - version: "1.18.0" + version: "1.19.0" convert: dependency: transitive description: name: convert - sha256: "0f08b14755d163f6e2134cb58222dd25ea2a2ee8a195e53983d57c075324d592" + sha256: b30acd5944035672bc15c6b7a8b47d773e41e2f17de064350988c5d02adb1c68 url: "https://pub.dev" source: hosted - version: "3.1.1" + version: "3.1.2" cross_file: dependency: transitive description: @@ -250,18 +250,18 @@ packages: dependency: transitive description: name: crypto - sha256: ec30d999af904f33454ba22ed9a86162b35e52b44ac4807d1d93c288041d7d27 + sha256: "1e445881f28f22d6140f181e07737b22f1e099a5e1ff94b0af2f9e4a463f4855" url: "https://pub.dev" source: hosted - version: "3.0.5" + version: "3.0.6" csslib: dependency: transitive description: name: csslib - sha256: "706b5707578e0c1b4b7550f64078f0a0f19dec3f50a178ffae7006b0a9ca58fb" + sha256: "09bad715f418841f976c77db72d5398dc1253c21fb9c0c7f0b0b985860b2d58e" url: "https://pub.dev" source: hosted - version: "1.0.0" + version: "1.0.2" cupertino_icons: dependency: "direct main" description: @@ -290,18 +290,18 @@ packages: dependency: transitive description: name: device_info_plus - sha256: a7fd703482b391a87d60b6061d04dfdeab07826b96f9abd8f5ed98068acc0074 + sha256: "4fa68e53e26ab17b70ca39f072c285562cfc1589df5bb1e9295db90f6645f431" url: "https://pub.dev" source: hosted - version: "10.1.2" + version: "11.2.0" device_info_plus_platform_interface: dependency: transitive description: name: device_info_plus_platform_interface - sha256: "282d3cf731045a2feb66abfe61bbc40870ae50a3ed10a4d3d217556c35c8c2ba" + sha256: "0b04e02b30791224b31969eb1b50d723498f402971bff3630bca2ba839bd1ed2" url: "https://pub.dev" source: hosted - version: "7.0.1" + version: "7.0.2" dio: dependency: "direct main" description: @@ -322,26 +322,26 @@ packages: dependency: "direct main" description: name: envied - sha256: bbff9c76120e4dc5e2e36a46690cf0a26feb65e7765633f4e8d916bcd173a450 + sha256: "129a0dbf32b90344fa2e9d6943569fdec8f17904e66161e0a1f09ee3416508ae" url: "https://pub.dev" source: hosted - version: "0.5.4+1" + version: "1.0.0" envied_generator: dependency: "direct dev" description: name: envied_generator - sha256: "517b70de08d13dcd40e97b4e5347e216a0b1c75c99e704f3c85c0474a392d14a" + sha256: "76aec98907872ce8488f021e68d213bd0d9bf224eb393a094be1708cc3180d41" url: "https://pub.dev" source: hosted - version: "0.5.4+1" + version: "1.0.0" equatable: dependency: transitive description: name: equatable - sha256: c2b87cb7756efdf69892005af546c56c0b5037f54d2a88269b4f347a505e3ca2 + sha256: "567c64b3cb4cf82397aac55f4f0cbd3ca20d77c6c03bedbc4ceaddc08904aef7" url: "https://pub.dev" source: hosted - version: "2.0.5" + version: "2.0.7" fake_async: dependency: transitive description: @@ -362,26 +362,26 @@ packages: dependency: transitive description: name: file - sha256: "5fc22d7c25582e38ad9a8515372cd9a93834027aacf1801cf01164dac0ffa08c" + sha256: a3b4f84adafef897088c160faf7dfffb7696046cb13ae90b508c2cbc95d3b8d4 url: "https://pub.dev" source: hosted - version: "7.0.0" + version: "7.0.1" file_selector_linux: dependency: transitive description: name: file_selector_linux - sha256: "045d372bf19b02aeb69cacf8b4009555fb5f6f0b7ad8016e5f46dd1387ddd492" + sha256: "54cbbd957e1156d29548c7d9b9ec0c0ebb6de0a90452198683a7d23aed617a33" url: "https://pub.dev" source: hosted - version: "0.9.2+1" + version: "0.9.3+2" file_selector_macos: dependency: transitive description: name: file_selector_macos - sha256: f42eacb83b318e183b1ae24eead1373ab1334084404c8c16e0354f9a3e55d385 + sha256: "271ab9986df0c135d45c3cdb6bd0faa5db6f4976d3e4b437cf7d0f258d941bfc" url: "https://pub.dev" source: hosted - version: "0.9.4" + version: "0.9.4+2" file_selector_platform_interface: dependency: transitive description: @@ -394,90 +394,90 @@ packages: dependency: transitive description: name: file_selector_windows - sha256: "2ad726953f6e8affbc4df8dc78b77c3b4a060967a291e528ef72ae846c60fb69" + sha256: "8f5d2f6590d51ecd9179ba39c64f722edc15226cc93dcc8698466ad36a4a85a4" url: "https://pub.dev" source: hosted - version: "0.9.3+2" + version: "0.9.3+3" firebase_auth: dependency: "direct main" description: name: firebase_auth - sha256: "6f5792bdc208416bfdfbfe3363b78ce01667b6ebc4c5cb47cfa891f2fca45ab7" + sha256: "03483af6e67b7c4b696ca9386989a6cd5593569e1ac5af6907ea5f7fd9c16d8b" url: "https://pub.dev" source: hosted - version: "5.2.0" + version: "5.3.4" firebase_auth_platform_interface: dependency: transitive description: name: firebase_auth_platform_interface - sha256: "80237bb8a92bb0a5e3b40de1c8dbc80254e49ac9e3907b4b47b8e95ac3dd3fad" + sha256: "3e1409f48c48930635705b1237ebbdee8c54c19106a0a4fb321dbb4b642820c4" url: "https://pub.dev" source: hosted - version: "7.4.4" + version: "7.4.10" firebase_auth_web: dependency: transitive description: name: firebase_auth_web - sha256: "9d315491a6be65ea83511cb0e078544a309c39dd54c0ee355c51dbd6d8c03cc8" + sha256: d83fe95c44d73c9c29b006ac7df3aa5e1b8ce92b62edc44e8f86250951fe2cd0 url: "https://pub.dev" source: hosted - version: "5.12.6" + version: "5.13.5" firebase_core: dependency: "direct main" description: name: firebase_core - sha256: "06537da27db981947fa535bb91ca120b4e9cb59cb87278dbdde718558cafc9ff" + sha256: "15d761b95dfa2906dfcc31b7fc6fe293188533d1a3ffe78389ba9e69bd7fdbde" url: "https://pub.dev" source: hosted - version: "3.4.0" + version: "3.9.0" firebase_core_platform_interface: dependency: transitive description: name: firebase_core_platform_interface - sha256: f7d7180c7f99babd4b4c517754d41a09a4943a0f7a69b65c894ca5c68ba66315 + sha256: d7253d255ff10f85cfd2adaba9ac17bae878fa3ba577462451163bd9f1d1f0bf url: "https://pub.dev" source: hosted - version: "5.2.1" + version: "5.4.0" firebase_core_web: dependency: transitive description: name: firebase_core_web - sha256: "362e52457ed2b7b180964769c1e04d1e0ea0259fdf7025fdfedd019d4ae2bd88" + sha256: fbc008cf390d909b823763064b63afefe9f02d8afdb13eb3f485b871afee956b url: "https://pub.dev" source: hosted - version: "2.17.5" + version: "2.19.0" firebase_messaging: dependency: "direct main" description: name: firebase_messaging - sha256: "29941ba5a3204d80656c0e52103369aa9a53edfd9ceae05a2bb3376f24fda453" + sha256: "151a3ee68736abf293aab66d1317ade53c88abe1db09c75a0460aebf7767bbdf" url: "https://pub.dev" source: hosted - version: "15.1.0" + version: "15.1.6" firebase_messaging_platform_interface: dependency: transitive description: name: firebase_messaging_platform_interface - sha256: "26c5370d3a79b15c8032724a68a4741e28f63e1f1a45699c4f0a8ae740aadd72" + sha256: f331ee51e40c243f90cc7bc059222dfec4e5df53125b08d31fb28961b00d2a9d url: "https://pub.dev" source: hosted - version: "4.5.43" + version: "4.5.49" firebase_messaging_web: dependency: transitive description: name: firebase_messaging_web - sha256: "58276cd5d9e22a9320ef9e5bc358628920f770f93c91221f8b638e8346ed5df4" + sha256: efaf3fdc54cd77e0eedb8e75f7f01c808828c64d052ddbf94d3009974e47d30f url: "https://pub.dev" source: hosted - version: "3.8.13" + version: "3.9.5" fixnum: dependency: transitive description: name: fixnum - sha256: "25517a4deb0c03aa0f32fd12db525856438902d9c16536311e76cdc57b31d7d1" + sha256: b6dc7065e46c974bc7c5f143080a6764ec7a4be6da1285ececdc37be96de53be url: "https://pub.dev" source: hosted - version: "1.1.0" + version: "1.1.1" flutter: dependency: "direct main" description: flutter @@ -487,10 +487,10 @@ packages: dependency: transitive description: name: flutter_cache_manager - sha256: ceff65d74d907b1b772e22cf04daad60fb472461638977d9fae8b00a63e01e3d + sha256: "400b6592f16a4409a7f2bb929a9a7e38c72cceb8ffb99ee57bbf2cb2cecf8386" url: "https://pub.dev" source: hosted - version: "3.3.3" + version: "3.4.1" flutter_confetti: dependency: "direct main" description: @@ -519,42 +519,42 @@ packages: dependency: "direct main" description: name: flutter_launcher_icons - sha256: "526faf84284b86a4cb36d20a5e45147747b7563d921373d4ee0559c54fcdbcea" + sha256: "31cd0885738e87c72d6f055564d37fabcdacee743b396b78c7636c169cac64f5" url: "https://pub.dev" source: hosted - version: "0.13.1" + version: "0.14.2" flutter_lints: dependency: "direct dev" description: name: flutter_lints - sha256: "3f41d009ba7172d5ff9be5f6e6e6abb4300e263aab8866d2a0842ed2a70f8f0c" + sha256: "5398f14efa795ffb7a33e9b6a08798b26a180edac4ad7db3f231e40f82ce11e1" url: "https://pub.dev" source: hosted - version: "4.0.0" + version: "5.0.0" flutter_local_notifications: dependency: "direct main" description: name: flutter_local_notifications - sha256: c500d5d9e7e553f06b61877ca6b9c8b92c570a4c8db371038702e8ce57f8a50f + sha256: ef41ae901e7529e52934feba19ed82827b11baa67336829564aeab3129460610 url: "https://pub.dev" source: hosted - version: "17.2.2" + version: "18.0.1" flutter_local_notifications_linux: dependency: transitive description: name: flutter_local_notifications_linux - sha256: c49bd06165cad9beeb79090b18cd1eb0296f4bf4b23b84426e37dd7c027fc3af + sha256: "8f685642876742c941b29c32030f6f4f6dacd0e4eaecb3efbb187d6a3812ca01" url: "https://pub.dev" source: hosted - version: "4.0.1" + version: "5.0.0" flutter_local_notifications_platform_interface: dependency: transitive description: name: flutter_local_notifications_platform_interface - sha256: "85f8d07fe708c1bdcf45037f2c0109753b26ae077e9d9e899d55971711a4ea66" + sha256: "6c5b83c86bf819cdb177a9247a3722067dd8cc6313827ce7c77a4b238a26fd52" url: "https://pub.dev" source: hosted - version: "7.2.0" + version: "8.0.0" flutter_paypal: dependency: "direct main" description: @@ -567,10 +567,10 @@ packages: dependency: transitive description: name: flutter_plugin_android_lifecycle - sha256: "9ee02950848f61c4129af3d6ec84a1cfc0e47931abc746b03e7a3bc3e8ff6eda" + sha256: "615a505aef59b151b46bbeef55b36ce2b6ed299d160c51d84281946f0aa0ce0e" url: "https://pub.dev" source: hosted - version: "2.0.22" + version: "2.0.24" flutter_rating_bar: dependency: "direct main" description: @@ -639,18 +639,18 @@ packages: dependency: "direct main" description: name: flutter_stripe - sha256: "28527923373720fcd39eade306f4acc007df8a3f2c0aeea545f1521dec9399c2" + sha256: "06d7d8ac853470b7c9a9ed81f9fccafaf35f417a151e1b7ddcded56113aadf6f" url: "https://pub.dev" source: hosted - version: "11.0.0" + version: "11.3.0" flutter_svg: dependency: transitive description: name: flutter_svg - sha256: "7b4ca6cf3304575fe9c8ec64813c8d02ee41d2afe60bcfe0678bcb5375d596a2" + sha256: "54900a1a1243f3c4a5506d853a2b5c2dbc38d5f27e52a52618a8054401431123" url: "https://pub.dev" source: hosted - version: "2.0.10+1" + version: "2.0.16" flutter_test: dependency: "direct dev" description: flutter @@ -660,10 +660,10 @@ packages: dependency: "direct main" description: name: flutter_tts - sha256: aed2a00c48c43af043ed81145fd8503ddd793dafa7088ab137dbef81a703e53d + sha256: cbec5f0447223e1b4c47f893c7f8ef663ac582120c147e4a1e2cade7f2e8b0c8 url: "https://pub.dev" source: hosted - version: "4.0.2" + version: "4.2.0" flutter_web_plugins: dependency: transitive description: flutter @@ -673,10 +673,10 @@ packages: dependency: "direct main" description: name: flutter_widget_from_html - sha256: "9e2a6201c4d2eb910b6b3ebb2a9f5c490fc61c9a1aa35eafdde38f0fc659cf4c" + sha256: f3967a5b42896662efdd420b5adaf8a7d3692b0f44462a07c80e3b4c173b1a02 url: "https://pub.dev" source: hosted - version: "0.15.2" + version: "0.15.3" flutter_widget_from_html_core: dependency: transitive description: @@ -745,18 +745,18 @@ packages: dependency: transitive description: name: fwfh_webview - sha256: f67890bc0d6278da98bd197469ae9511c859f7db327e92299fe0ea0cf46c4057 + sha256: c0a8b664b642f40f4c252a0ab4e72c22dcd97c7fb3a7e50a6b4bdb6f63afca19 url: "https://pub.dev" source: hosted - version: "0.15.2" + version: "0.15.3" geolocator: dependency: "direct main" description: name: geolocator - sha256: "149876cc5207a0f5daf4fdd3bfcf0a0f27258b3fe95108fa084f527ad0568f1b" + sha256: d2ec66329cab29cb297d51d96c067d457ca519dca8589665fa0b82ebacb7dbe4 url: "https://pub.dev" source: hosted - version: "12.0.0" + version: "13.0.2" geolocator_android: dependency: transitive description: @@ -769,10 +769,10 @@ packages: dependency: transitive description: name: geolocator_apple - sha256: bc2aca02423ad429cb0556121f56e60360a2b7d694c8570301d06ea0c00732fd + sha256: "6154ea2682563f69fc0125762ed7e91e7ed85d0b9776595653be33918e064807" url: "https://pub.dev" source: hosted - version: "2.3.7" + version: "2.3.8+1" geolocator_platform_interface: dependency: transitive description: @@ -785,10 +785,10 @@ packages: dependency: transitive description: name: geolocator_web - sha256: "7a22f400d831f924a89d931ba126a10e6b8b437f31e6b9311320435f3e1571bd" + sha256: "2ed69328e05cd94e7eb48bb0535f5fc0c0c44d1c4fa1e9737267484d05c29b5e" url: "https://pub.dev" source: hosted - version: "4.0.0" + version: "4.1.1" geolocator_windows: dependency: transitive description: @@ -833,26 +833,26 @@ packages: dependency: transitive description: name: google_identity_services_web - sha256: "5be191523702ba8d7a01ca97c17fca096822ccf246b0a9f11923a6ded06199b6" + sha256: "55580f436822d64c8ff9a77e37d61f5fb1e6c7ec9d632a43ee324e2a05c3c6c9" url: "https://pub.dev" source: hosted - version: "0.3.1+4" + version: "0.3.3" google_maps: dependency: transitive description: name: google_maps - sha256: "463b38e5a92a05cde41220a11fd5eef3847031fef3e8cf295ac76ec453246907" + sha256: "4d6e199c561ca06792c964fa24b2bac7197bf4b401c2e1d23e345e5f9939f531" url: "https://pub.dev" source: hosted - version: "8.0.0" + version: "8.1.1" google_maps_flutter: dependency: "direct main" description: name: google_maps_flutter - sha256: "2e302fa3aaf4e2a297f0342d83ebc5e8e9f826e9a716aef473fe7f404ec630a7" + sha256: "209856c8e5571626afba7182cf634b2910069dc567954e76ec3e3fb37f5e9db3" url: "https://pub.dev" source: hosted - version: "2.9.0" + version: "2.10.0" google_maps_flutter_android: dependency: transitive description: @@ -865,10 +865,10 @@ packages: dependency: transitive description: name: google_maps_flutter_ios - sha256: "3a484846fc56f15e47e3de1f5ea80a7ff2b31721d2faa88f390f3b3cf580c953" + sha256: "6f798adb0aa1db5adf551f2e39e24bd06c8c0fbe4de912fb2d9b5b3f48147b02" url: "https://pub.dev" source: hosted - version: "2.13.0" + version: "2.13.2" google_maps_flutter_platform_interface: dependency: transitive description: @@ -897,26 +897,26 @@ packages: dependency: "direct main" description: name: google_sign_in - sha256: "0b8787cb9c1a68ad398e8010e8c8766bfa33556d2ab97c439fb4137756d7308f" + sha256: fad6ddc80c427b0bba705f2116204ce1173e09cf299f85e053d57a55e5b2dd56 url: "https://pub.dev" source: hosted - version: "6.2.1" + version: "6.2.2" google_sign_in_android: dependency: transitive description: name: google_sign_in_android - sha256: "0608de03fc541ece4f91ba3e01a68b17cce7a6cf42bd59e40bbe5c55cc3a49d8" + sha256: "3b96f9b6cf61915f73cbe1218a192623e296a9b8b31965702503649477761e36" url: "https://pub.dev" source: hosted - version: "6.1.30" + version: "6.1.34" google_sign_in_ios: dependency: transitive description: name: google_sign_in_ios - sha256: "4898410f55440049e1ba8f15411612d9f89299d89c61cd9baf7e02d56ff81ac7" + sha256: "83f015169102df1ab2905cf8abd8934e28f87db9ace7a5fa676998842fed228a" url: "https://pub.dev" source: hosted - version: "5.7.7" + version: "5.7.8" google_sign_in_platform_interface: dependency: transitive description: @@ -929,10 +929,10 @@ packages: dependency: transitive description: name: google_sign_in_web - sha256: "042805a21127a85b0dc46bba98a37926f17d2439720e8a459d27045d8ef68055" + sha256: ada595df6c30cead48e66b1f3a050edf0c5cf2ba60c185d69690e08adcc6281b url: "https://pub.dev" source: hosted - version: "0.12.4+2" + version: "0.12.4+3" googleapis_auth: dependency: "direct main" description: @@ -953,10 +953,10 @@ packages: dependency: transitive description: name: html - sha256: "3a7812d5bcd2894edf53dfaf8cd640876cf6cef50a8f238745c8b8120ea74d3a" + sha256: "1fc58edeaec4307368c60d59b7e15b9d658b57d7f3125098b6294153c75337ec" url: "https://pub.dev" source: hosted - version: "0.15.4" + version: "0.15.5" http: dependency: "direct main" description: @@ -977,34 +977,34 @@ packages: dependency: transitive description: name: http_multi_server - sha256: "97486f20f9c2f7be8f514851703d0119c3596d14ea63227af6f7a481ef2b2f8b" + sha256: aa6199f908078bb1c5efb8d8638d4ae191aac11b311132c3ef48ce352fb52ef8 url: "https://pub.dev" source: hosted - version: "3.2.1" + version: "3.2.2" http_parser: dependency: "direct main" description: name: http_parser - sha256: "2aa08ce0341cc9b354a498388e30986515406668dbcc4f7c950c3e715496693b" + sha256: "76d306a1c3afb33fe82e2bbacad62a61f409b5634c915fceb0d799de1a913360" url: "https://pub.dev" source: hosted - version: "4.0.2" + version: "4.1.1" image: dependency: transitive description: name: image - sha256: "2237616a36c0d69aef7549ab439b833fb7f9fb9fc861af2cc9ac3eedddd69ca8" + sha256: "8346ad4b5173924b5ddddab782fc7d8a6300178c8b1dc427775405a01701c4a6" url: "https://pub.dev" source: hosted - version: "4.2.0" + version: "4.5.2" image_cropper: dependency: "direct main" description: name: image_cropper - sha256: fe37d9a129411486e0d93089b61bd326d05b89e78ad4981de54b560725bf5bd5 + sha256: "266760ed426d7121f0ada02c672bfe5c1b5c714e908328716aee756f045709dc" url: "https://pub.dev" source: hosted - version: "8.0.2" + version: "8.1.0" image_cropper_for_web: dependency: transitive description: @@ -1033,26 +1033,26 @@ packages: dependency: transitive description: name: image_picker_android - sha256: a26dc9a03fe042440c1e4be554fb0fceae2bf6d887d7467fc48c688fa4a81889 + sha256: fa8141602fde3f7e2f81dbf043613eb44dfa325fa0bcf93c0f142c9f7a2c193e url: "https://pub.dev" source: hosted - version: "0.8.12+7" + version: "0.8.12+18" image_picker_for_web: dependency: transitive description: name: image_picker_for_web - sha256: "65d94623e15372c5c51bebbcb820848d7bcb323836e12dfdba60b5d3a8b39e50" + sha256: "717eb042ab08c40767684327be06a5d8dbb341fe791d514e4b92c7bbe1b7bb83" url: "https://pub.dev" source: hosted - version: "3.0.5" + version: "3.0.6" image_picker_ios: dependency: transitive description: name: image_picker_ios - sha256: "6703696ad49f5c3c8356d576d7ace84d1faf459afb07accbb0fae780753ff447" + sha256: "4f0568120c6fcc0aaa04511cb9f9f4d29fc3d0139884b1d06be88dcec7641d6b" url: "https://pub.dev" source: hosted - version: "0.8.12" + version: "0.8.12+1" image_picker_linux: dependency: transitive description: @@ -1097,10 +1097,10 @@ packages: dependency: transitive description: name: io - sha256: "2ec25704aba361659e10e3e5f5d672068d332fc8ac516421d483a11e5cbd061e" + sha256: dfd5a80599cf0165756e3181807ed3e77daf6dd4137caaad72d0b7931597650b url: "https://pub.dev" source: hosted - version: "1.0.4" + version: "1.0.5" js: dependency: transitive description: @@ -1121,10 +1121,10 @@ packages: dependency: "direct main" description: name: just_audio - sha256: d8e8aaf417d33e345299c17f6457f72bd4ba0c549dc34607abb5183a354edc4d + sha256: a49e7120b95600bd357f37a2bb04cd1e88252f7cdea8f3368803779b925b1049 url: "https://pub.dev" source: hosted - version: "0.9.40" + version: "0.9.42" just_audio_platform_interface: dependency: transitive description: @@ -1137,26 +1137,26 @@ packages: dependency: transitive description: name: just_audio_web - sha256: b163878529d9b028c53a6972fcd58cae2405bcd11cbfcea620b6fb9f151429d6 + sha256: "9a98035b8b24b40749507687520ec5ab404e291d2b0937823ff45d92cb18d448" url: "https://pub.dev" source: hosted - version: "0.4.12" + version: "0.4.13" leak_tracker: dependency: transitive description: name: leak_tracker - sha256: "3f87a60e8c63aecc975dda1ceedbc8f24de75f09e4856ea27daf8958f2f0ce05" + sha256: "7bb2830ebd849694d1ec25bf1f44582d6ac531a57a365a803a6034ff751d2d06" url: "https://pub.dev" source: hosted - version: "10.0.5" + version: "10.0.7" leak_tracker_flutter_testing: dependency: transitive description: name: leak_tracker_flutter_testing - sha256: "932549fb305594d82d7183ecd9fa93463e9914e1b67cacc34bc40906594a1806" + sha256: "9491a714cca3667b60b5c420da8217e6de0d1ba7a5ec322fab01758f6998f379" url: "https://pub.dev" source: hosted - version: "3.0.5" + version: "3.0.8" leak_tracker_testing: dependency: transitive description: @@ -1169,10 +1169,10 @@ packages: dependency: transitive description: name: lints - sha256: "976c774dd944a42e83e2467f4cc670daef7eed6295b10b36ae8c85bcbf828235" + sha256: "4a16b3f03741e1252fda5de3ce712666d010ba2122f8e912c94f9f7b90e1a4c3" url: "https://pub.dev" source: hosted - version: "4.0.0" + version: "5.1.0" local_auth: dependency: "direct main" description: @@ -1185,18 +1185,18 @@ packages: dependency: transitive description: name: local_auth_android - sha256: "33fcebe9c3cf1bb0033bc85caed354c1e75ff7f7670918a571bd3152a2b65bf4" + sha256: "6763aaf8965f21822624cb2fd3c03d2a8b3791037b5efb0fe4b13e110f5afc92" url: "https://pub.dev" source: hosted - version: "1.0.42" + version: "1.0.46" local_auth_darwin: dependency: transitive description: name: local_auth_darwin - sha256: "7ba5738c874ca2b910d72385d00d2bebad9d4e807612936cf5e32bc01a048c71" + sha256: "5c5127061107278ab4cafa1ac51b3b6760282bf1a2abf011270908a429d1634b" url: "https://pub.dev" source: hosted - version: "1.4.0" + version: "1.4.2" local_auth_platform_interface: dependency: transitive description: @@ -1217,10 +1217,10 @@ packages: dependency: "direct main" description: name: location - sha256: "6463a242973bf247e3fb1c7722919521b98026978ee3b5177202e103a39c145e" + sha256: ee57923720163324416ce0306b701db6d845d2c1a3bf44d25b607cbddbaa3973 url: "https://pub.dev" source: hosted - version: "7.0.0" + version: "7.0.1" location_platform_interface: dependency: transitive description: @@ -1233,26 +1233,26 @@ packages: dependency: transitive description: name: location_web - sha256: "613597b489beb396f658c6f4358dd383c5ed0a1402d95e287642a5f2d8171cb0" + sha256: e6435cfd175b0f6e94d6fdc43c104d13cec7e27b21a8cee00bd9516a3d6a4c81 url: "https://pub.dev" source: hosted - version: "5.0.3" + version: "5.0.4" logging: dependency: transitive description: name: logging - sha256: "623a88c9594aa774443aa3eb2d41807a48486b5613e67599fb4c41c0ad47c340" + sha256: c8245ada5f1717ed44271ed1c26b8ce85ca3228fd2ffdb75468ab01979309d61 url: "https://pub.dev" source: hosted - version: "1.2.0" + version: "1.3.0" macros: dependency: transitive description: name: macros - sha256: "0acaed5d6b7eab89f63350bccd82119e6c602df0f391260d0e32b5e23db79536" + sha256: "1d9e801cd66f7ea3663c45fc708450db1fa57f988142c64289142c9b7ee80656" url: "https://pub.dev" source: hosted - version: "0.1.2-main.4" + version: "0.1.3-main.0" matcher: dependency: transitive description: @@ -1305,26 +1305,26 @@ packages: dependency: transitive description: name: package_config - sha256: "1c5b77ccc91e4823a5af61ee74e6b972db1ef98c2ff5a18d3161c982a55448bd" + sha256: "92d4488434b520a62570293fbd33bb556c7d49230791c1b4bbd973baf6d2dc67" url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.1.1" package_info_plus: dependency: "direct main" description: name: package_info_plus - sha256: a75164ade98cb7d24cfd0a13c6408927c6b217fa60dee5a7ff5c116a58f28918 + sha256: "70c421fe9d9cc1a9a7f3b05ae56befd469fe4f8daa3b484823141a55442d858d" url: "https://pub.dev" source: hosted - version: "8.0.2" + version: "8.1.2" package_info_plus_platform_interface: dependency: transitive description: name: package_info_plus_platform_interface - sha256: ac1f4a4847f1ade8e6a87d1f39f5d7c67490738642e2542f559ec38c37489a66 + sha256: a5ef9986efc7bf772f2696183a3992615baa76c1ffb1189318dd8803778fb05b url: "https://pub.dev" source: hosted - version: "3.0.1" + version: "3.0.2" path: dependency: "direct main" description: @@ -1337,34 +1337,34 @@ packages: dependency: transitive description: name: path_parsing - sha256: e3e67b1629e6f7e8100b367d3db6ba6af4b1f0bb80f64db18ef1fbabd2fa9ccf + sha256: "883402936929eac138ee0a45da5b0f2c80f89913e6dc3bf77eb65b84b409c6ca" url: "https://pub.dev" source: hosted - version: "1.0.1" + version: "1.1.0" path_provider: dependency: transitive description: name: path_provider - sha256: fec0d61223fba3154d87759e3cc27fe2c8dc498f6386c6d6fc80d1afdd1bf378 + sha256: "50c5dd5b6e1aaf6fb3a78b33f6aa3afca52bf903a8a5298f53101fdaee55bbcd" url: "https://pub.dev" source: hosted - version: "2.1.4" + version: "2.1.5" path_provider_android: dependency: transitive description: name: path_provider_android - sha256: "6f01f8e37ec30b07bc424b4deabac37cacb1bc7e2e515ad74486039918a37eb7" + sha256: "4adf4fd5423ec60a29506c76581bc05854c55e3a0b72d35bb28d661c9686edf2" url: "https://pub.dev" source: hosted - version: "2.2.10" + version: "2.2.15" path_provider_foundation: dependency: transitive description: name: path_provider_foundation - sha256: f234384a3fdd67f989b4d54a5d73ca2a6c422fa55ae694381ae0f4375cd1ea16 + sha256: "4843174df4d288f5e29185bd6e72a6fbdf5a4a4602717eed565497429f179942" url: "https://pub.dev" source: hosted - version: "2.4.0" + version: "2.4.1" path_provider_linux: dependency: transitive description: @@ -1401,10 +1401,10 @@ packages: dependency: transitive description: name: permission_handler_android - sha256: "76e4ab092c1b240d31177bb64d2b0bea43f43d0e23541ec866151b9f7b2490fa" + sha256: "71bbecfee799e65aff7c744761a57e817e73b738fedf62ab7afd5593da21f9f1" url: "https://pub.dev" source: hosted - version: "12.0.12" + version: "12.0.13" permission_handler_apple: dependency: transitive description: @@ -1417,18 +1417,18 @@ packages: dependency: transitive description: name: permission_handler_html - sha256: af26edbbb1f2674af65a8f4b56e1a6f526156bc273d0e65dd8075fab51c78851 + sha256: "38f000e83355abb3392140f6bc3030660cfaef189e1f87824facb76300b4ff24" url: "https://pub.dev" source: hosted - version: "0.1.3+2" + version: "0.1.3+5" permission_handler_platform_interface: dependency: transitive description: name: permission_handler_platform_interface - sha256: "48d4fcf201a1dad93ee869ab0d4101d084f49136ec82a8a06ed9cfeacab9fd20" + sha256: e9c8eadee926c4532d0305dff94b85bf961f16759c3af791486613152af4b4f9 url: "https://pub.dev" source: hosted - version: "4.2.1" + version: "4.2.3" permission_handler_windows: dependency: transitive description: @@ -1449,10 +1449,10 @@ packages: dependency: transitive description: name: platform - sha256: "9b71283fc13df574056616011fb138fd3b793ea47cc509c189a6c3fa5f8a1a65" + sha256: "5d6b1b0036a5f331ebc77c850ebc8506cbc1e9416c27e59b439f917a902a4984" url: "https://pub.dev" source: hosted - version: "3.1.5" + version: "3.1.6" plugin_platform_interface: dependency: transitive description: @@ -1469,6 +1469,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.5.1" + posix: + dependency: transitive + description: + name: posix + sha256: a0117dc2167805aa9125b82eee515cc891819bac2f538c83646d355b16f58b9a + url: "https://pub.dev" + source: hosted + version: "6.0.1" provider: dependency: transitive description: @@ -1481,10 +1489,10 @@ packages: dependency: transitive description: name: pub_semver - sha256: "40d3ab1bbd474c4c2328c91e3a7df8c6dd629b79ece4c4bd04bee496a224fb0c" + sha256: "7b3cfbf654f3edd0c6298ecd5be782ce997ddf0e00531b9464b55245185bbbbd" url: "https://pub.dev" source: hosted - version: "2.1.4" + version: "2.1.5" pubspec_parse: dependency: transitive description: @@ -1505,26 +1513,26 @@ packages: dependency: "direct main" description: name: record - sha256: "4a5cf4d083d1ee49e0878823c4397d073f8eb0a775f31215d388e2bc47a9e867" + sha256: "8cb57763d954624fbc673874930c6f1ceca3baaf9bfee24b25da6fd451362394" url: "https://pub.dev" source: hosted - version: "5.1.2" + version: "5.2.0" record_android: dependency: transitive description: name: record_android - sha256: d7af0b3119725a0f561817c72b5f5eca4d7a76d441deef519ae04e4824c0734c + sha256: "0b4739a2502fff402b0ac0ff1d6b2740854d116d78e06a4a16b3989821f84446" url: "https://pub.dev" source: hosted - version: "1.2.6" + version: "1.3.0" record_darwin: dependency: transitive description: name: record_darwin - sha256: fe90d302acb1f3cee1ade5df9c150ca5cee33b48d8cdf1cf433bf577d7f00134 + sha256: e487eccb19d82a9a39cd0126945cfc47b9986e0df211734e2788c95e3f63c82c url: "https://pub.dev" source: hosted - version: "1.1.2" + version: "1.2.2" record_linux: dependency: transitive description: @@ -1537,26 +1545,26 @@ packages: dependency: transitive description: name: record_platform_interface - sha256: "11f8b03ea8a0e279b0e306571dbe0db0202c0b8e866495c9fa1ad2281d5e4c15" + sha256: "8a575828733d4c3cb5983c914696f40db8667eab3538d4c41c50cbb79e722ef4" url: "https://pub.dev" source: hosted - version: "1.1.0" + version: "1.2.0" record_web: dependency: transitive description: name: record_web - sha256: "656b7a865f90651fab997c2a563364f5fd60a0b527d5dadbb915d62d84fc3867" + sha256: "10cb041349024ce4256e11dd35874df26d8b45b800678f2f51fd1318901adc64" url: "https://pub.dev" source: hosted - version: "1.1.3" + version: "1.1.4" record_windows: dependency: transitive description: name: record_windows - sha256: e653555aa3fda168aded7c34e11bd82baf0c6ac84e7624553def3c77ffefd36f + sha256: "7bce0ac47454212ca8bfa72791d8b6a951f2fb0d4b953b64443c014227f035b4" url: "https://pub.dev" source: hosted - version: "1.0.3" + version: "1.0.4" rxdart: dependency: transitive description: @@ -1592,26 +1600,26 @@ packages: dependency: transitive description: name: shelf - sha256: ad29c505aee705f41a4d8963641f91ac4cee3c8fad5947e033390a7bd8180fa4 + sha256: e7dd780a7ffb623c57850b33f43309312fc863fb6aa3d276a754bb299839ef12 url: "https://pub.dev" source: hosted - version: "1.4.1" + version: "1.4.2" shelf_web_socket: dependency: transitive description: name: shelf_web_socket - sha256: "073c147238594ecd0d193f3456a5fe91c4b0abbcc68bf5cd95b36c4e194ac611" + sha256: cc36c297b52866d203dbf9332263c94becc2fe0ceaa9681d07b6ef9807023b67 url: "https://pub.dev" source: hosted - version: "2.0.0" + version: "2.0.1" sign_in_with_apple: dependency: "direct main" description: name: sign_in_with_apple - sha256: "3c9dc9dcd5c42a17c6d4b912556198e8bd8e731ab67ac30f4a655974f95e7260" + sha256: e84a62e17b7e463abf0a64ce826c2cd1f0b72dff07b7b275e32d5302d76fb4c5 url: "https://pub.dev" source: hosted - version: "6.1.2" + version: "6.1.4" sign_in_with_apple_platform_interface: dependency: transitive description: @@ -1624,15 +1632,15 @@ packages: dependency: transitive description: name: sign_in_with_apple_web - sha256: c009e9beeb6c376e86aaa154fcc8b4e075d4bad90c56286b9668a51cdb6129ea + sha256: "2f7c38368f49e3f2043bca4b46a4a61aaae568c140a79aa0675dc59ad0ca49bc" url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.1.1" sky_engine: dependency: transitive description: flutter source: sdk - version: "0.0.99" + version: "0.0.0" source_gen: dependency: transitive description: @@ -1661,26 +1669,50 @@ packages: dependency: "direct main" description: name: sqflite - sha256: a43e5a27235518c03ca238e7b4732cf35eabe863a369ceba6cbefa537a66f16d + sha256: "2d7299468485dca85efeeadf5d38986909c5eb0cd71fd3db2c2f000e6c9454bb" url: "https://pub.dev" source: hosted - version: "2.3.3+1" + version: "2.4.1" + sqflite_android: + dependency: transitive + description: + name: sqflite_android + sha256: "78f489aab276260cdd26676d2169446c7ecd3484bbd5fead4ca14f3ed4dd9ee3" + url: "https://pub.dev" + source: hosted + version: "2.4.0" sqflite_common: dependency: transitive description: name: sqflite_common - sha256: "7b41b6c3507854a159e24ae90a8e3e9cc01eb26a477c118d6dca065b5f55453e" + sha256: "761b9740ecbd4d3e66b8916d784e581861fd3c3553eda85e167bc49fdb68f709" url: "https://pub.dev" source: hosted - version: "2.5.4+2" + version: "2.5.4+6" + sqflite_darwin: + dependency: transitive + description: + name: sqflite_darwin + sha256: "96a698e2bc82bd770a4d6aab00b42396a7c63d9e33513a56945cbccb594c2474" + url: "https://pub.dev" + source: hosted + version: "2.4.1" + sqflite_platform_interface: + dependency: transitive + description: + name: sqflite_platform_interface + sha256: "8dd4515c7bdcae0a785b0062859336de775e8c65db81ae33dd5445f35be61920" + url: "https://pub.dev" + source: hosted + version: "2.4.0" stack_trace: dependency: transitive description: name: stack_trace - sha256: "73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b" + sha256: "9f47fd3630d76be3ab26f0ee06d213679aa425996925ff3feffdec504931c377" url: "https://pub.dev" source: hosted - version: "1.11.1" + version: "1.12.0" stream_channel: dependency: transitive description: @@ -1693,50 +1725,50 @@ packages: dependency: transitive description: name: stream_transform - sha256: "14a00e794c7c11aa145a170587321aedce29769c08d7f58b1d141da75e3b1c6f" + sha256: ad47125e588cfd37a9a7f86c7d6356dde8dfe89d071d293f80ca9e9273a33871 url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.1.1" string_scanner: dependency: transitive description: name: string_scanner - sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde" + sha256: "688af5ed3402a4bde5b3a6c15fd768dbf2621a614950b17f04626c431ab3c4c3" url: "https://pub.dev" source: hosted - version: "1.2.0" + version: "1.3.0" stripe_android: dependency: transitive description: name: stripe_android - sha256: "189b8d5c79dfb363540a77e813ba350c9058559673f3df80a2cb87e0983a316e" + sha256: bc919b07ba1560b25a69002f9ca67a5973f12bfb96f78033cf9bd6c561f1aa10 url: "https://pub.dev" source: hosted - version: "11.0.0" + version: "11.3.0" stripe_ios: dependency: transitive description: name: stripe_ios - sha256: "680d442b2bb920dd91bec4aba9286de050a76a789e9bc128044f2b3732369be6" + sha256: "734a7668babd85a451c8049f0dfa8ca5dc6d80f85600d29732e7fa703dd5ec5e" url: "https://pub.dev" source: hosted - version: "11.0.0" + version: "11.3.0" stripe_platform_interface: dependency: transitive description: name: stripe_platform_interface - sha256: "3a4e22f0ad461dc47147601d1215f2a72715c6c67f56fb4b8a3cab4b857b9a41" + sha256: "5cb987074b6ee199e7dd1b81d189c87583f6eaeb19147ffc8c15bc009596e6ce" url: "https://pub.dev" source: hosted - version: "11.0.0" + version: "11.3.0" synchronized: dependency: transitive description: name: synchronized - sha256: a824e842b8a054f91a728b783c177c1e4731f6b124f9192468457a8913371255 + sha256: "69fe30f3a8b04a0be0c15ae6490fc859a78ef4c43ae2dd5e8a623d45bfcf9225" url: "https://pub.dev" source: hosted - version: "3.2.0" + version: "3.3.0+3" term_glyph: dependency: transitive description: @@ -1749,10 +1781,10 @@ packages: dependency: transitive description: name: test_api - sha256: "5b8a98dafc4d5c4c9c72d8b31ab2b23fc13422348d2997120294d3bac86b4ddb" + sha256: "664d3a9a64782fcdeb83ce9c6b39e78fd2971d4e37827b9b06c3aa1edc5e760c" url: "https://pub.dev" source: hosted - version: "0.7.2" + version: "0.7.3" timezone: dependency: transitive description: @@ -1765,18 +1797,18 @@ packages: dependency: transitive description: name: timing - sha256: "70a3b636575d4163c477e6de42f247a23b315ae20e86442bebe32d3cabf61c32" + sha256: "62ee18aca144e4a9f29d212f5a4c6a053be252b895ab14b5821996cff4ed90fe" url: "https://pub.dev" source: hosted - version: "1.0.1" + version: "1.0.2" typed_data: dependency: transitive description: name: typed_data - sha256: facc8d6582f16042dd49f2463ff1bd6e2c9ef9f3d5da3d9b087e244a7b564b3c + sha256: f9049c039ebfeb4cf7a7104a675823cd72dba8297f264b6637062516699fa006 url: "https://pub.dev" source: hosted - version: "1.3.2" + version: "1.4.0" uni_links: dependency: "direct main" description: @@ -1805,42 +1837,42 @@ packages: dependency: "direct main" description: name: url_launcher - sha256: "21b704ce5fa560ea9f3b525b43601c678728ba46725bab9b01187b4831377ed3" + sha256: "9d06212b1362abc2f0f0d78e6f09f726608c74e3b9462e8368bb03314aa8d603" url: "https://pub.dev" source: hosted - version: "6.3.0" + version: "6.3.1" url_launcher_android: dependency: transitive description: name: url_launcher_android - sha256: "95d8027db36a0e52caf55680f91e33ea6aa12a3ce608c90b06f4e429a21067ac" + sha256: "6fc2f56536ee873eeb867ad176ae15f304ccccc357848b351f6f0d8d4a40d193" url: "https://pub.dev" source: hosted - version: "6.3.5" + version: "6.3.14" url_launcher_ios: dependency: transitive description: name: url_launcher_ios - sha256: e43b677296fadce447e987a2f519dcf5f6d1e527dc35d01ffab4fff5b8a7063e + sha256: "16a513b6c12bb419304e72ea0ae2ab4fed569920d1c7cb850263fe3acc824626" url: "https://pub.dev" source: hosted - version: "6.3.1" + version: "6.3.2" url_launcher_linux: dependency: transitive description: name: url_launcher_linux - sha256: e2b9622b4007f97f504cd64c0128309dfb978ae66adbe944125ed9e1750f06af + sha256: "4e9ba368772369e3e08f231d2301b4ef72b9ff87c31192ef471b380ef29a4935" url: "https://pub.dev" source: hosted - version: "3.2.0" + version: "3.2.1" url_launcher_macos: dependency: transitive description: name: url_launcher_macos - sha256: "9a1a42d5d2d95400c795b2914c36fdcb525870c752569438e4ebb09a2b5d90de" + sha256: "17ba2000b847f334f16626a574c702b196723af2a289e7a93ffcb79acff855c2" url: "https://pub.dev" source: hosted - version: "3.2.0" + version: "3.2.2" url_launcher_platform_interface: dependency: transitive description: @@ -1861,42 +1893,42 @@ packages: dependency: transitive description: name: url_launcher_windows - sha256: "49c10f879746271804767cb45551ec5592cdab00ee105c06dddde1a98f73b185" + sha256: "44cf3aabcedde30f2dba119a9dea3b0f2672fbe6fa96e85536251d678216b3c4" url: "https://pub.dev" source: hosted - version: "3.1.2" + version: "3.1.3" uuid: dependency: transitive description: name: uuid - sha256: f33d6bb662f0e4f79dcd7ada2e6170f3b3a2530c28fc41f49a411ddedd576a77 + sha256: a5be9ef6618a7ac1e964353ef476418026db906c4facdedaa299b7a2e71690ff url: "https://pub.dev" source: hosted - version: "4.5.0" + version: "4.5.1" vector_graphics: dependency: transitive description: name: vector_graphics - sha256: "32c3c684e02f9bc0afb0ae0aa653337a2fe022e8ab064bcd7ffda27a74e288e3" + sha256: "27d5fefe86fb9aace4a9f8375b56b3c292b64d8c04510df230f849850d912cb7" url: "https://pub.dev" source: hosted - version: "1.1.11+1" + version: "1.1.15" vector_graphics_codec: dependency: transitive description: name: vector_graphics_codec - sha256: c86987475f162fadff579e7320c7ddda04cd2fdeffbe1129227a85d9ac9e03da + sha256: "2430b973a4ca3c4dbc9999b62b8c719a160100dcbae5c819bae0cacce32c9cdb" url: "https://pub.dev" source: hosted - version: "1.1.11+1" + version: "1.1.12" vector_graphics_compiler: dependency: transitive description: name: vector_graphics_compiler - sha256: "12faff3f73b1741a36ca7e31b292ddeb629af819ca9efe9953b70bd63fc8cd81" + sha256: "1b4b9e706a10294258727674a340ae0d6e64a7231980f9f9a3d12e4b42407aad" url: "https://pub.dev" source: hosted - version: "1.1.11+1" + version: "1.1.16" vector_math: dependency: transitive description: @@ -1909,74 +1941,74 @@ packages: dependency: "direct main" description: name: vibration - sha256: fe8f90e1827f86a4f722b819799ecac8a24789a39c6d562ea316bcaeb8b1ec61 + sha256: f0af02af2d63132135ae0332a3e54d5de718e214ee94c4f082176ef6ce624a4b url: "https://pub.dev" source: hosted - version: "2.0.0" + version: "2.0.1" vibration_platform_interface: dependency: transitive description: name: vibration_platform_interface - sha256: "735a5fef0f284de0ad9449a5ed7d36ba017c6f59b5b20ac64418af4a6bd35ee7" + sha256: f66b39aab2447038978c16f3d6f77228e49ef5717556e3da02313e044e4a7600 url: "https://pub.dev" source: hosted - version: "0.0.1" + version: "0.0.2" video_player: dependency: transitive description: name: video_player - sha256: e30df0d226c4ef82e2c150ebf6834b3522cf3f654d8e2f9419d376cdc071425d + sha256: "4a8c3492d734f7c39c2588a3206707a05ee80cef52e8c7f3b2078d430c84bc17" url: "https://pub.dev" source: hosted - version: "2.9.1" + version: "2.9.2" video_player_android: dependency: transitive description: name: video_player_android - sha256: fdc0331ce9f808cc2714014cb8126bd6369943affefd54f8fdab0ea0bb617b7f + sha256: "391e092ba4abe2f93b3e625bd6b6a6ec7d7414279462c1c0ee42b5ab8d0a0898" url: "https://pub.dev" source: hosted - version: "2.5.2" + version: "2.7.16" video_player_avfoundation: dependency: transitive description: name: video_player_avfoundation - sha256: d1e9a824f2b324000dc8fb2dcb2a3285b6c1c7c487521c63306cc5b394f68a7c + sha256: "33224c19775fd244be2d6e3dbd8e1826ab162877bd61123bf71890772119a2b7" url: "https://pub.dev" source: hosted - version: "2.6.1" + version: "2.6.5" video_player_platform_interface: dependency: transitive description: name: video_player_platform_interface - sha256: "236454725fafcacf98f0f39af0d7c7ab2ce84762e3b63f2cbb3ef9a7e0550bc6" + sha256: "229d7642ccd9f3dc4aba169609dd6b5f3f443bb4cc15b82f7785fcada5af9bbb" url: "https://pub.dev" source: hosted - version: "6.2.2" + version: "6.2.3" video_player_web: dependency: transitive description: name: video_player_web - sha256: "6dcdd298136523eaf7dfc31abaf0dfba9aa8a8dbc96670e87e9d42b6f2caf774" + sha256: "881b375a934d8ebf868c7fb1423b2bfaa393a0a265fa3f733079a86536064a10" url: "https://pub.dev" source: hosted - version: "2.3.2" + version: "2.3.3" vm_service: dependency: transitive description: name: vm_service - sha256: "5c5f338a667b4c644744b661f309fb8080bb94b18a7e91ef1dbd343bed00ed6d" + sha256: f6be3ed8bd01289b34d679c2b62226f63c0e69f9fd2e50a6b3c1c729a961041b url: "https://pub.dev" source: hosted - version: "14.2.5" + version: "14.3.0" wakelock_plus: dependency: "direct main" description: name: wakelock_plus - sha256: bf4ee6f17a2fa373ed3753ad0e602b7603f8c75af006d5b9bdade263928c0484 + sha256: "1aeab49f24aec1e5ab417d7cdfc47c7bbcb815353f1840667ffe68c89a0cd2e6" url: "https://pub.dev" source: hosted - version: "1.2.8" + version: "1.2.9" wakelock_plus_platform_interface: dependency: transitive description: @@ -1989,18 +2021,18 @@ packages: dependency: transitive description: name: watcher - sha256: "3d2ad6751b3c16cf07c7fca317a1413b3f26530319181b37e3b9039b84fc01d8" + sha256: "69da27e49efa56a15f8afe8f4438c4ec02eff0a117df1b22ea4aad194fe1c104" url: "https://pub.dev" source: hosted - version: "1.1.0" + version: "1.1.1" web: dependency: transitive description: name: web - sha256: "97da13628db363c635202ad97068d47c5b8aa555808e7a9411963c533b449b27" + sha256: cd3543bd5798f6ad290ea73d210f423502e71900302dde696f8bff84bf89a1cb url: "https://pub.dev" source: hosted - version: "0.5.1" + version: "1.1.0" web_socket: dependency: transitive description: @@ -2029,10 +2061,10 @@ packages: dependency: transitive description: name: webview_flutter_android - sha256: "6e64fcb1c19d92024da8f33503aaeeda35825d77142c01d0ea2aa32edc79fdc8" + sha256: "47a8da40d02befda5b151a26dba71f47df471cddd91dfdb7802d0a87c5442558" url: "https://pub.dev" source: hosted - version: "3.16.7" + version: "3.16.9" webview_flutter_platform_interface: dependency: transitive description: @@ -2045,34 +2077,34 @@ packages: dependency: transitive description: name: webview_flutter_wkwebview - sha256: "1942a12224ab31e9508cf00c0c6347b931b023b8a4f0811e5dec3b06f94f117d" + sha256: b7e92f129482460951d96ef9a46b49db34bd2e1621685de26e9eaafd9674e7eb url: "https://pub.dev" source: hosted - version: "3.15.0" + version: "3.16.3" win32: dependency: transitive description: name: win32 - sha256: "68d1e89a91ed61ad9c370f9f8b6effed9ae5e0ede22a270bdfa6daf79fc2290a" + sha256: "8b338d4486ab3fbc0ba0db9f9b4f5239b6697fcee427939a40e720cbb9ee0a69" url: "https://pub.dev" source: hosted - version: "5.5.4" + version: "5.9.0" win32_registry: dependency: transitive description: name: win32_registry - sha256: "10589e0d7f4e053f2c61023a31c9ce01146656a70b7b7f0828c0b46d7da2a9bb" + sha256: "21ec76dfc731550fd3e2ce7a33a9ea90b828fdf19a5c3bcf556fa992cfa99852" url: "https://pub.dev" source: hosted - version: "1.1.3" + version: "1.1.5" xdg_directories: dependency: transitive description: name: xdg_directories - sha256: faea9dee56b520b55a566385b84f2e8de55e7496104adada9962e0bd11bcff1d + sha256: "7a3f37b05d989967cdddcbb571f1ea834867ae2faa29725fd085180e0883aa15" url: "https://pub.dev" source: hosted - version: "1.0.4" + version: "1.1.0" xml: dependency: transitive description: @@ -2090,5 +2122,5 @@ packages: source: hosted version: "3.1.2" sdks: - dart: ">=3.5.0 <4.0.0" + dart: ">=3.6.0 <4.0.0" flutter: ">=3.24.0" diff --git a/pubspec.yaml b/pubspec.yaml index 5e19f7c..4c13c79 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -15,7 +15,7 @@ dependencies: path: ./secure_string_operations firebase_messaging: ^15.0.3 firebase_core: ^3.2.0 - flutter_local_notifications: ^17.2.1+2 + flutter_local_notifications: ^18.0.1 google_maps_flutter: ^2.5.0 sqflite: ^2.3.0 path: ^1.8.3 @@ -28,10 +28,10 @@ dependencies: google_polyline_algorithm: ^3.1.0 animated_text_kit: ^4.2.2 flutter_secure_storage: ^9.0.0 - geolocator: ^12.0.0 + geolocator: ^13.0.2 flutter_paypal: ^0.2.0 google_fonts: ^6.2.1 - flutter_launcher_icons: ^0.13.1 + flutter_launcher_icons: ^0.14.2 flutter_rating_bar: ^4.0.1 flutter_font_icons: ^2.2.5 image_picker: ^1.0.4 @@ -41,7 +41,7 @@ dependencies: local_auth: ^2.1.7 # image: ^4.1.3 #to be remove image_cropper: ^8.0.2 - envied: ^0.5.2 + envied: ^1.0.0 # cached_network_image: ^3.3.0 calendar_builder: ^0.0.6 # agora_rtc_engine: ^6.2.6 @@ -70,8 +70,8 @@ dependencies: dev_dependencies: flutter_test: sdk: flutter - flutter_lints: ^4.0.0 - envied_generator: ^0.5.2 + flutter_lints: ^5.0.0 + envied_generator: ^1.0.0 build_runner: ^2.4.6 flutter_launcher_icons: