This commit is contained in:
Hamza-Ayed
2024-08-03 00:50:14 +03:00
parent 74abae1b38
commit 871b9a4d09
24 changed files with 689 additions and 211 deletions

View File

@@ -55,8 +55,8 @@ android {
// For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration. // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration.
minSdkVersion 23 minSdkVersion 23
targetSdkVersion 34 targetSdkVersion 34
versionCode 51 versionCode 53
versionName '1.5.51' versionName '1.5.53'
// manifestPlaceholders = [mapsApiKey: 'android/app/src/main/AndroidManifest.xml'] // manifestPlaceholders = [mapsApiKey: 'android/app/src/main/AndroidManifest.xml']
} }

View File

@@ -5,6 +5,78 @@
"storage_bucket": "ride-b1bd8.appspot.com" "storage_bucket": "ride-b1bd8.appspot.com"
}, },
"client": [ "client": [
{
"client_info": {
"mobilesdk_app_id": "1:594687661098:android:8ec72f5f8b0b0ab8595f53",
"android_client_info": {
"package_name": "com.example.sefer_admin1"
}
},
"oauth_client": [
{
"client_id": "594687661098-2u640akrb3k7sak5t0nqki6f4v6hq1bq.apps.googleusercontent.com",
"client_type": 3
}
],
"api_key": [
{
"current_key": "AIzaSyCyfwRXTwSTLOFQSQgN5p7QZgGJVZnEKq0"
}
],
"services": {
"appinvite_service": {
"other_platform_oauth_client": [
{
"client_id": "594687661098-2hfb9gumub3j60vb7mqtq794k8spihuh.apps.googleusercontent.com",
"client_type": 3
},
{
"client_id": "594687661098-8e26699cris2k3nj5msj1osi59it9kpf.apps.googleusercontent.com",
"client_type": 2,
"ios_info": {
"bundle_id": "com.mobileapp.store.ride"
}
}
]
}
}
},
{
"client_info": {
"mobilesdk_app_id": "1:594687661098:android:f81fcce13962121a595f53",
"android_client_info": {
"package_name": "com.example.service"
}
},
"oauth_client": [
{
"client_id": "594687661098-2u640akrb3k7sak5t0nqki6f4v6hq1bq.apps.googleusercontent.com",
"client_type": 3
}
],
"api_key": [
{
"current_key": "AIzaSyCyfwRXTwSTLOFQSQgN5p7QZgGJVZnEKq0"
}
],
"services": {
"appinvite_service": {
"other_platform_oauth_client": [
{
"client_id": "594687661098-2hfb9gumub3j60vb7mqtq794k8spihuh.apps.googleusercontent.com",
"client_type": 3
},
{
"client_id": "594687661098-8e26699cris2k3nj5msj1osi59it9kpf.apps.googleusercontent.com",
"client_type": 2,
"ios_info": {
"bundle_id": "com.mobileapp.store.ride"
}
}
]
}
}
},
{ {
"client_info": { "client_info": {
"mobilesdk_app_id": "1:594687661098:android:683982cbf71fa423595f53", "mobilesdk_app_id": "1:594687661098:android:683982cbf71fa423595f53",
@@ -12,6 +84,50 @@
"package_name": "com.mobileapp.store.ride" "package_name": "com.mobileapp.store.ride"
} }
}, },
"oauth_client": [
{
"client_id": "594687661098-2dhoogl7be9phobfbu8bbg1sj567iv88.apps.googleusercontent.com",
"client_type": 1,
"android_info": {
"package_name": "com.mobileapp.store.ride",
"certificate_hash": "9bf3876c66e490f30cd7982fa972d8e52e0edbb6"
}
},
{
"client_id": "594687661098-2u640akrb3k7sak5t0nqki6f4v6hq1bq.apps.googleusercontent.com",
"client_type": 3
}
],
"api_key": [
{
"current_key": "AIzaSyCyfwRXTwSTLOFQSQgN5p7QZgGJVZnEKq0"
}
],
"services": {
"appinvite_service": {
"other_platform_oauth_client": [
{
"client_id": "594687661098-2hfb9gumub3j60vb7mqtq794k8spihuh.apps.googleusercontent.com",
"client_type": 3
},
{
"client_id": "594687661098-8e26699cris2k3nj5msj1osi59it9kpf.apps.googleusercontent.com",
"client_type": 2,
"ios_info": {
"bundle_id": "com.mobileapp.store.ride"
}
}
]
}
}
},
{
"client_info": {
"mobilesdk_app_id": "1:594687661098:android:b7ce96c17eb928ca595f53",
"android_client_info": {
"package_name": "com.sefer.driver"
}
},
"oauth_client": [ "oauth_client": [
{ {
"client_id": "594687661098-2u640akrb3k7sak5t0nqki6f4v6hq1bq.apps.googleusercontent.com", "client_id": "594687661098-2u640akrb3k7sak5t0nqki6f4v6hq1bq.apps.googleusercontent.com",
@@ -49,6 +165,14 @@
} }
}, },
"oauth_client": [ "oauth_client": [
{
"client_id": "594687661098-op7a9cpgm9dilgh8nl48bu6aor55f7qj.apps.googleusercontent.com",
"client_type": 1,
"android_info": {
"package_name": "com.sefer_driver",
"certificate_hash": "6f83a0b80b7e1b30b3dd42811cbc2c60ee931a3b"
}
},
{ {
"client_id": "594687661098-2u640akrb3k7sak5t0nqki6f4v6hq1bq.apps.googleusercontent.com", "client_id": "594687661098-2u640akrb3k7sak5t0nqki6f4v6hq1bq.apps.googleusercontent.com",
"client_type": 3 "client_type": 3

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.7 KiB

After

Width:  |  Height:  |  Size: 7.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 23 MiB

After

Width:  |  Height:  |  Size: 1.7 MiB

View File

@@ -1 +1 @@
{"functions":[{"source":"functions","codebase":"default","ignore":["node_modules",".git","firebase-debug.log","firebase-debug.*.log"],"predeploy":["npm --prefix \"$RESOURCE_DIR\" run lint"]}],"flutter":{"platforms":{"android":{"default":{"projectId":"ride-b1bd8","appId":"1:594687661098:android:683982cbf71fa423595f53","fileOutput":"android/app/google-services.json"}},"dart":{"lib/firebase_options.dart":{"projectId":"ride-b1bd8","configurations":{"android":"1:594687661098:android:683982cbf71fa423595f53","ios":"1:594687661098:ios:6f69eee1449be943595f53"}}}}}} {"functions":[{"source":"functions","codebase":"default","ignore":["node_modules",".git","firebase-debug.log","firebase-debug.*.log"],"predeploy":["npm --prefix \"$RESOURCE_DIR\" run lint"]}],"flutter":{"platforms":{"android":{"default":{"projectId":"ride-b1bd8","appId":"1:594687661098:android:683982cbf71fa423595f53","fileOutput":"android/app/google-services.json"}},"dart":{"lib/firebase_options.dart":{"projectId":"ride-b1bd8","configurations":{"android":"1:594687661098:android:683982cbf71fa423595f53","ios":"1:594687661098:ios:6f69eee1449be943595f53","macos":"1:594687661098:ios:6f69eee1449be943595f53","web":"1:594687661098:web:62d8388476ec91ec595f53","windows":"1:594687661098:web:d9f43a2091395d87595f53"}}},"ios":{"default":{"projectId":"ride-b1bd8","appId":"1:594687661098:ios:6f69eee1449be943595f53","uploadDebugSymbols":false,"fileOutput":"ios/Runner/GoogleService-Info.plist"}},"macos":{"default":{"projectId":"ride-b1bd8","appId":"1:594687661098:ios:6f69eee1449be943595f53","uploadDebugSymbols":false,"fileOutput":"macos/Runner/GoogleService-Info.plist"}}}}}

View File

@@ -0,0 +1,36 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CLIENT_ID</key>
<string>594687661098-8e26699cris2k3nj5msj1osi59it9kpf.apps.googleusercontent.com</string>
<key>REVERSED_CLIENT_ID</key>
<string>com.googleusercontent.apps.594687661098-8e26699cris2k3nj5msj1osi59it9kpf</string>
<key>ANDROID_CLIENT_ID</key>
<string>594687661098-2dhoogl7be9phobfbu8bbg1sj567iv88.apps.googleusercontent.com</string>
<key>API_KEY</key>
<string>AIzaSyCf2mW2h0HD8ZYjwh4VOa2ladw6MJkCDTM</string>
<key>GCM_SENDER_ID</key>
<string>594687661098</string>
<key>PLIST_VERSION</key>
<string>1</string>
<key>BUNDLE_ID</key>
<string>com.mobileapp.store.ride</string>
<key>PROJECT_ID</key>
<string>ride-b1bd8</string>
<key>STORAGE_BUCKET</key>
<string>ride-b1bd8.appspot.com</string>
<key>IS_ADS_ENABLED</key>
<false></false>
<key>IS_ANALYTICS_ENABLED</key>
<false></false>
<key>IS_APPINVITE_ENABLED</key>
<true></true>
<key>IS_GCM_ENABLED</key>
<true></true>
<key>IS_SIGNIN_ENABLED</key>
<true></true>
<key>GOOGLE_APP_ID</key>
<string>1:594687661098:ios:6f69eee1449be943595f53</string>
</dict>
</plist>

View File

@@ -172,6 +172,7 @@ class AppLink {
static String location = '$server/ride/location'; static String location = '$server/ride/location';
static String getCarsLocationByPassenger = "$location/get.php"; static String getCarsLocationByPassenger = "$location/get.php";
static String getCarsLocationByPassengerSpeed = "$location/getSpeed.php"; static String getCarsLocationByPassengerSpeed = "$location/getSpeed.php";
static String getCarsLocationByPassengerComfort = "$location/getComfort.php";
static String getCarsLocationByPassengerDelivery = static String getCarsLocationByPassengerDelivery =
"$location/getDelivery.php"; "$location/getDelivery.php";
static String getLocationParents = "$location/getLocationParents.php"; static String getLocationParents = "$location/getLocationParents.php";
@@ -244,5 +245,8 @@ class AppLink {
static String sendvalidity = "https://sms.kazumi.me/api/sms/send-validity"; static String sendvalidity = "https://sms.kazumi.me/api/sms/send-validity";
static String sendmany = "https://sms.kazumi.me/api/sms/send-many"; static String sendmany = "https://sms.kazumi.me/api/sms/send-many";
static String checkCredit = "https://sms.kazumi.me/api/sms/check-credit"; static String checkCredit = "https://sms.kazumi.me/api/sms/check-credit";
static String getSender = "$server/auth/sms/getSender.php";
static String checkStatus = "https://sms.kazumi.me/api/sms/check-status"; static String checkStatus = "https://sms.kazumi.me/api/sms/check-status";
static String updatePhoneInvalidSMSPassenger =
"$server/auth/sms/updatePhoneInvalidSMSPassenger.php";
} }

View File

@@ -81,6 +81,21 @@ class RegisterController extends GetxController {
update(); update();
} }
bool isValidEgyptianPhoneNumber(String phoneNumber) {
// Remove any whitespace from the phone number
phoneNumber = phoneNumber.replaceAll(RegExp(r'\s+'), '');
// Check if the phone number has exactly 11 digits
if (phoneNumber.length != 11) {
return false;
}
// Check if the phone number starts with 010, 011, 012, or 015
RegExp validPrefixes = RegExp(r'^01[0125]\d{8}$');
return validPrefixes.hasMatch(phoneNumber);
}
sendOtpMessage() async { sendOtpMessage() async {
SmsEgyptController smsEgyptController = Get.put(SmsEgyptController()); SmsEgyptController smsEgyptController = Get.put(SmsEgyptController());
@@ -89,18 +104,33 @@ class RegisterController extends GetxController {
update(); update();
if (formKey3.currentState!.validate()) { if (formKey3.currentState!.validate()) {
if (box.read(BoxName.countryCode) == 'Egypt') { if (box.read(BoxName.countryCode) == 'Egypt') {
var responseCheker = await CRUD() if (isValidEgyptianPhoneNumber(phoneController.text)) {
.post(link: AppLink.checkPhoneNumberISVerfiedPassenger, payload: { var responseCheker = await CRUD()
'phone_number': '+2${phoneController.text}', .post(link: AppLink.checkPhoneNumberISVerfiedPassenger, payload: {
}); 'phone_number': '+2${phoneController.text}',
if (responseCheker != 'failure') { });
var d = jsonDecode(responseCheker); if (responseCheker != 'failure') {
if (d['message'][0]['verified'].toString() == '1') { var d = jsonDecode(responseCheker);
Get.snackbar('Phone number is verified before'.tr, '', if (d['message'][0]['verified'].toString() == '1') {
backgroundColor: AppColor.greenColor); Get.snackbar('Phone number is verified before'.tr, '',
box.write(BoxName.isVerified, '1'); backgroundColor: AppColor.greenColor);
box.write(BoxName.phone, '+2${phoneController.text}'); box.write(BoxName.isVerified, '1');
Get.offAll(const MapPagePassenger()); box.write(BoxName.phone, '+2${phoneController.text}');
Get.offAll(const MapPagePassenger());
} else {
await CRUD().post(link: AppLink.sendVerifyOtpMessage, payload: {
'phone_number': '+2${phoneController.text}',
'token': randomNumber.toString(),
});
await smsEgyptController.sendSmsEgypt(
phoneController.text.toString(), randomNumber.toString());
isSent = true;
remainingTime = 300; // Reset to 5 minutes
startTimer();
isLoading = false;
update();
}
} else { } else {
await CRUD().post(link: AppLink.sendVerifyOtpMessage, payload: { await CRUD().post(link: AppLink.sendVerifyOtpMessage, payload: {
'phone_number': '+2${phoneController.text}', 'phone_number': '+2${phoneController.text}',
@@ -114,22 +144,12 @@ class RegisterController extends GetxController {
startTimer(); startTimer();
isLoading = false; isLoading = false;
update(); update();
// Get.snackbar(responseCheker, 'message');
} }
} else { } else {
await CRUD().post(link: AppLink.sendVerifyOtpMessage, payload: { Get.snackbar('Phone Number wrong'.tr, '',
'phone_number': '+2${phoneController.text}', backgroundColor: AppColor.redColor);
'token': randomNumber.toString(),
});
await smsEgyptController.sendSmsEgypt(
phoneController.text.toString(), randomNumber.toString());
isSent = true;
remainingTime = 300; // Reset to 5 minutes
startTimer();
isLoading = false;
update();
// Get.snackbar(responseCheker, 'message');
} }
} }
} }

View File

@@ -1,5 +1,6 @@
import 'dart:convert'; import 'dart:convert';
import 'dart:io'; import 'dart:io';
import 'package:SEFER/views/widgets/my_dialog.dart';
import 'package:firebase_messaging/firebase_messaging.dart'; import 'package:firebase_messaging/firebase_messaging.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
@@ -13,6 +14,7 @@ import '../../constant/colors.dart';
import '../../constant/links.dart'; import '../../constant/links.dart';
import '../../constant/style.dart'; import '../../constant/style.dart';
import '../../main.dart'; import '../../main.dart';
import '../../print.dart';
import '../../views/Rate/rate_captain.dart'; import '../../views/Rate/rate_captain.dart';
import '../../views/home/map_page_passenger.dart'; import '../../views/home/map_page_passenger.dart';
import '../../views/home/profile/promos_passenger_page.dart'; import '../../views/home/profile/promos_passenger_page.dart';
@@ -183,6 +185,29 @@ class FirebaseMessagesController extends GetxController {
driverArrivePassengerDialoge(); driverArrivePassengerDialoge();
update(); update();
} else if (message.notification!.title! == "Cancel Trip from driver".tr) {
Get.back();
Get.defaultDialog(
title: "The driver canceled your ride.".tr,
middleText: "We will look for a new driver.\nPlease wait.".tr,
confirm: MyElevatedButton(
title: 'Ok'.tr,
onPressed: () async {
Get.back();
Get.find<MapPassengerController>()
.delayAndFetchRideStatusForAllDriverAvailable(
Get.find<MapPassengerController>().rideId);
},
),
cancel: MyElevatedButton(
title: 'Cancel'.tr,
onPressed: () {
Get.offAll(const MapPagePassenger());
},
)
// Get.find<MapPassengerController>()
// .searchNewDriverAfterRejectingFromDriver();
);
} else if (message.notification!.title! == 'Driver Finish Trip'.tr) { } else if (message.notification!.title! == 'Driver Finish Trip'.tr) {
var myListString = message.data['passengerList']; var myListString = message.data['passengerList'];
var driverList = jsonDecode(myListString) as List<dynamic>; var driverList = jsonDecode(myListString) as List<dynamic>;
@@ -547,7 +572,6 @@ class FirebaseMessagesController extends GetxController {
'notification': <String, dynamic>{ 'notification': <String, dynamic>{
'title': title, 'title': title,
'body': body, 'body': body,
// 'sound': 'tone2.wav',
'sound': tone 'sound': tone
}, },
'data': { 'data': {
@@ -559,13 +583,16 @@ class FirebaseMessagesController extends GetxController {
); );
if (response.statusCode == 200) { if (response.statusCode == 200) {
// Notification sent successfully Log.print(
'Notification sent successfully. Status code: ${response.statusCode}');
Log.print('Response body: ${response.body}');
} else { } else {
// Handle error response Log.print(
'Failed to send notification. Status code: ${response.statusCode}'; 'Failed to send notification. Status code: ${response.statusCode}');
Log.print('Response body: ${response.body}');
} }
} catch (e) { } catch (e) {
// Handle other exceptions Log.print('Error sending notification: $e');
} }
} }

View File

@@ -8,6 +8,7 @@ import 'package:SEFER/env/env.dart';
import '../../constant/api_key.dart'; import '../../constant/api_key.dart';
import '../../print.dart';
import 'upload_image.dart'; import 'upload_image.dart';
class CRUD { class CRUD {
@@ -28,6 +29,7 @@ class CRUD {
}, },
); );
print(response.request); print(response.request);
Log.print('payload: ${payload}');
print(response.body); print(response.body);
// print(payload); // print(payload);
// if (response.statusCode == 200) { // if (response.statusCode == 200) {

View File

@@ -4,21 +4,35 @@ import 'package:SEFER/constant/api_key.dart';
import 'package:SEFER/constant/box_name.dart'; import 'package:SEFER/constant/box_name.dart';
import 'package:SEFER/constant/info.dart'; import 'package:SEFER/constant/info.dart';
import 'package:SEFER/constant/links.dart'; import 'package:SEFER/constant/links.dart';
import 'package:SEFER/controller/auth/login_controller.dart';
import 'package:SEFER/main.dart'; import 'package:SEFER/main.dart';
import 'package:SEFER/views/widgets/elevated_btn.dart'; import 'package:SEFER/views/widgets/elevated_btn.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:http/http.dart' as http; import 'package:http/http.dart' as http;
import '../auth/register_controller.dart';
import 'crud.dart';
class SmsEgyptController extends GetxController { class SmsEgyptController extends GetxController {
var headers = {'Content-Type': 'application/json'}; var headers = {'Content-Type': 'application/json'};
Future<String> getSender() async {
var res = await CRUD().get(link: AppLink.getSender, payload: {});
if (res != 'failure') {
var d = jsonDecode(res)['message'][0]['senderId'].toString();
return d;
} else {
return "Sefer Egy";
}
}
Future<dynamic> sendSmsEgypt(String phone, otp) async { Future<dynamic> sendSmsEgypt(String phone, otp) async {
String sender = await getSender();
var body = jsonEncode({ var body = jsonEncode({
"username": AppInformation.appName, "username": AppInformation.appName,
"password": AK.smsPasswordEgypt, "password": AK.smsPasswordEgypt,
"message": "${AppInformation.appName} app code is $otp\ncopy it to app", "message": "${AppInformation.appName} app code is $otp\ncopy it to app",
"language": box.read(BoxName.lang) == 'en' ? "e" : 'r', "language": box.read(BoxName.lang) == 'en' ? "e" : 'r',
"sender": "Sefer Egy", "sender": sender, //"Sefer Egy",
"receiver": "2$phone" "receiver": "2$phone"
}); });
@@ -28,9 +42,23 @@ class SmsEgyptController extends GetxController {
headers: headers, headers: headers,
); );
if (res.statusCode == 200) { if (jsonDecode(res.body)['message'].toString() ==
"Invalid Sender with Connection") {
await CRUD().post(link: AppLink.updatePhoneInvalidSMSPassenger, payload: {
"phone_number":
'+2${Get.find<RegisterController>().phoneController.text}'
});
box.write(BoxName.phoneDriver,
'+2${Get.find<RegisterController>().phoneController.text}');
box.write(BoxName.isVerified, '1');
await Get.put(LoginController()).loginUsingCredentials(
box.read(BoxName.driverID).toString(),
box.read(BoxName.emailDriver).toString(),
);
} else {
Get.defaultDialog( Get.defaultDialog(
title: 'You will recieve code in sms message'.tr, title: 'You will receive code in sms message'.tr,
middleText: '', middleText: '',
confirm: MyElevatedButton( confirm: MyElevatedButton(
title: 'OK'.tr, title: 'OK'.tr,

View File

@@ -5,6 +5,7 @@ import 'dart:math' as math;
import 'package:SEFER/controller/functions/tts.dart'; import 'package:SEFER/controller/functions/tts.dart';
import 'package:SEFER/views/home/map_page_passenger.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:SEFER/views/widgets/my_textField.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:geolocator/geolocator.dart'; import 'package:geolocator/geolocator.dart';
@@ -739,7 +740,10 @@ class MapPassengerController extends GetxController {
var res = await CRUD().get( var res = await CRUD().get(
link: AppLink.getRideStatusFromStartApp, link: AppLink.getRideStatusFromStartApp,
payload: {'passenger_id': box.read(BoxName.passengerID)}); payload: {'passenger_id': box.read(BoxName.passengerID)});
if (res == 'failure') {} if (res == 'failure') {
print(
"No rides found for the given passenger ID within the last hour.");
}
rideStatusFromStartApp = jsonDecode(res); rideStatusFromStartApp = jsonDecode(res);
if (rideStatusFromStartApp['data']['status'] == 'Begin') { if (rideStatusFromStartApp['data']['status'] == 'Begin') {
statusRide = 'Begin'; statusRide = 'Begin';
@@ -968,12 +972,6 @@ class MapPassengerController extends GetxController {
} }
} }
// Example usage
void someFunction() {
String whatsAppLink = 'https://maps.google.com/maps?q=37.4220,-122.0841';
handleWhatsAppLink(whatsAppLink);
}
void goToWhatappLocation() async { void goToWhatappLocation() async {
if (sosFormKey.currentState!.validate()) { if (sosFormKey.currentState!.validate()) {
changeIsWhatsAppOrder(true); changeIsWhatsAppOrder(true);
@@ -999,7 +997,8 @@ class MapPassengerController extends GetxController {
late String make = ''; late String make = '';
late String licensePlate = ''; late String licensePlate = '';
confirmRideForFirstDriver() async { confirmRideForFirstDriver() async {
await getCarsLocationByPassengerAndReloadMarker(); startCarLocationSearch(box.read(BoxName.carType));
// await getCarsLocationByPassengerAndReloadMarker();
await getNearestDriverByPassengerLocationAPIGOOGLE(); await getNearestDriverByPassengerLocationAPIGOOGLE();
if (dataCarsLocationByPassenger != 'failure') { if (dataCarsLocationByPassenger != 'failure') {
@@ -1097,10 +1096,12 @@ class MapPassengerController extends GetxController {
box.read(BoxName.carType), box.read(BoxName.carType),
kazan.toStringAsFixed(0), kazan.toStringAsFixed(0),
passengerRate.toStringAsFixed(2), passengerRate.toStringAsFixed(2),
]; // ];
Log.print('body: ${body}');
FirebaseMessagesController().sendNotificationToDriverMAP( FirebaseMessagesController().sendNotificationToDriverMAP(
'Order'.tr, 'Order'.tr,
jsonDecode(value)['message'].toString(), 'from: $startNameAddress\nto: $startNameAddress\ndistanceFromMe: $distanceByPassenger\nDistance :$distance\nPrice ; $totalPassenger',
// jsonDecode(value)['message'].toString(),
dataCarsLocationByPassenger['message'][carsOrder]['token'] dataCarsLocationByPassenger['message'][carsOrder]['token']
.toString(), .toString(),
body, body,
@@ -1108,6 +1109,8 @@ class MapPassengerController extends GetxController {
// polylineCoordinates.toString() // polylineCoordinates.toString()
); );
Log.print(
'body: ${dataCarsLocationByPassenger['message'][carsOrder]['token']}');
}); });
delayAndFetchRideStatus(rideId); delayAndFetchRideStatus(rideId);
if (shouldFetch == false) { if (shouldFetch == false) {
@@ -1135,12 +1138,13 @@ class MapPassengerController extends GetxController {
bool isDriversTokensSend = false; bool isDriversTokensSend = false;
confirmRideForAllDriverAvailable() async { confirmRideForAllDriverAvailable() async {
// isDriversTokensSend = true; // isDriversTokensSend = true;
driversToken.remove(driverToken);
PaymentController paymentController = Get.find<PaymentController>(); PaymentController paymentController = Get.find<PaymentController>();
rideConfirm = true; rideConfirm = true;
shouldFetch = true; shouldFetch = true;
isBottomSheetShown = false; isBottomSheetShown = false;
timeToPassengerFromDriverAfterApplied = 60; timeToPassengerFromDriverAfterApplied = 60;
driversToken.remove(driverToken);
List<String> body = [ List<String> body = [
'${data[0]["start_location"]['lat']},${data[0]["start_location"]['lng']}', '${data[0]["start_location"]['lat']},${data[0]["start_location"]['lng']}',
'${data[0]["end_location"]['lat']},${data[0]["end_location"]['lng']}', '${data[0]["end_location"]['lat']},${data[0]["end_location"]['lng']}',
@@ -1196,44 +1200,57 @@ class MapPassengerController extends GetxController {
update(); update();
} }
int tick = 0; // Move tick outside the function to maintain its state
void delayAndFetchRideStatus(String rideId) { void delayAndFetchRideStatus(String rideId) {
Timer(const Duration(seconds: 1), () async { Timer.periodic(const Duration(seconds: 1), (timer) async {
if (shouldFetch) { if (shouldFetch) {
if (remainingTimeToPassengerFromDriverAfterApplied > 0) { if (remainingTimeToPassengerFromDriverAfterApplied > 0) {
var res = await getRideStatus(rideId); String res = await getRideStatus(rideId);
// var decod = jsonDecode(res); Log.print('tick: $tick');
if (res.toString() == 'Apply') {
// getUpdatedRideForDriverApply(rideId); if (res.toString() == 'waiting' && tick == 15) {
timer.cancel(); // Stop the current timer
delayAndFetchRideStatusForAllDriverAvailable(rideId);
} else if (res.toString() == 'Apply') {
timer.cancel(); // Stop the current timer
shouldFetch = false; // Stop further fetches shouldFetch = false; // Stop further fetches
statusRide = 'Apply'; statusRide = 'Apply';
rideConfirm = false; rideConfirm = false;
isSearchingWindow = false; isSearchingWindow = false;
update(); update();
startTimerFromDriverToPassengerAfterApplied(); startTimerFromDriverToPassengerAfterApplied();
// startTimer();
} else if (res.toString() == 'Refused') { } else if (res.toString() == 'Refused') {
statusRide = 'Refused'; statusRide = 'Refused';
// isDriversTokensSend = false;
if (isDriversTokensSend == false) { if (isDriversTokensSend == false) {
confirmRideForAllDriverAvailable(); confirmRideForAllDriverAvailable();
isDriversTokensSend = true; isDriversTokensSend = true;
} } // Start 15-second timer
} else if (isDriversTokensSend == false) { } else if (isDriversTokensSend == false) {
delayAndFetchRideStatus( // No need to recall delayAndFetchRideStatus as Timer.periodic is already running
rideId); // Repeat the delay and fetch operation
update(); update();
} }
tick++;
} else {
timer
.cancel(); // Stop the timer if remainingTimeToPassengerFromDriverAfterApplied <= 0
} }
} else {
timer.cancel(); // Stop the timer if shouldFetch is false
} }
}); });
} }
void delayAndFetchRideStatusForAllDriverAvailable(String rideId) { void delayAndFetchRideStatusForAllDriverAvailable(String rideId) {
Timer(const Duration(milliseconds: 1000), () async { int attemptCounter = 0;
if (shouldFetch) { const int maxAttempts = 15;
void fetchRideStatus() async {
if (shouldFetch && attemptCounter < maxAttempts) {
attemptCounter++;
var res = await getRideStatus(rideId); var res = await getRideStatus(rideId);
// var decod = jsonDecode(res);
if (res.toString() == 'Apply') { if (res.toString() == 'Apply') {
getUpdatedRideForDriverApply(rideId); getUpdatedRideForDriverApply(rideId);
@@ -1243,10 +1260,28 @@ class MapPassengerController extends GetxController {
isSearchingWindow = false; isSearchingWindow = false;
update(); update();
startTimerFromDriverToPassengerAfterApplied(); startTimerFromDriverToPassengerAfterApplied();
} else if (res.toString() == 'Refused') { } else {
delayAndFetchRideStatusForAllDriverAvailable(rideId); Timer(const Duration(seconds: 2),
fetchRideStatus); // Continue fetching for other statuses
} }
} else {
// Stop fetching after maxAttempts or if shouldFetch is false
shouldFetch = false;
MyDialog().getDialog('upgrade price'.tr,
'You can upgrade price to may driver accept your order'.tr, () {
Get.back();
});
update();
print('Stopped fetching ride status after 30 seconds.');
} }
}
fetchRideStatus(); // Initial call to start the process
}
void start15SecondTimer(String rideId) {
Timer(const Duration(seconds: 15), () {
delayAndFetchRideStatusForAllDriverAvailable(rideId);
}); });
} }
@@ -1431,89 +1466,134 @@ class MapPassengerController extends GetxController {
Map<String, Timer> _animationTimers = {}; Map<String, Timer> _animationTimers = {};
final int updateIntervalMs = 100; // Update every 100ms final int updateIntervalMs = 100; // Update every 100ms
final double minMovementThreshold = final double minMovementThreshold =
1.0; // Minimum movement in meters to trigger update 10; // Minimum movement in meters to trigger update
Future<void> getCarsLocationByPassengerAndReloadMarker() async { void startCarLocationSearch(String carType) {
int searchInterval = 5; // Interval in seconds
int boundIncreaseStep = 4500; // Initial bounds in meters
int maxAttempts = 3; // Maximum attempts to increase bounds
int attempt = 0; // Current attempt
Timer.periodic(Duration(seconds: searchInterval), (Timer timer) async {
if (attempt >= maxAttempts) {
timer.cancel();
noCarString = true;
dataCarsLocationByPassenger = 'failure';
update();
return;
}
bool foundCars = await getCarsLocationByPassengerAndReloadMarker(
carType, boundIncreaseStep);
if (foundCars) {
timer.cancel();
} else {
attempt++;
boundIncreaseStep = boundIncreaseStep + 1500; // Increase bounds
}
});
}
Future<bool> getCarsLocationByPassengerAndReloadMarker(
String carType, int boundIncreaseStep) async {
if (statusRide == 'wait') { if (statusRide == 'wait') {
LatLngBounds bounds = calculateBounds( carsLocationByPassenger = [];
passengerLocation.latitude, passengerLocation.longitude, 7000); LatLngBounds bounds = calculateBounds(passengerLocation.latitude,
passengerLocation.longitude, boundIncreaseStep.toDouble());
var res;
var res = await _fetchCarLocations(bounds); switch (carType) {
case 'Lady':
res = await CRUD()
.get(link: AppLink.getFemalDriverLocationByPassenger, payload: {
'southwestLat': bounds.southwest.latitude.toString(),
'southwestLon': bounds.southwest.longitude.toString(),
'northeastLat': bounds.northeast.latitude.toString(),
'northeastLon': bounds.northeast.longitude.toString(),
});
break;
case 'Comfort':
res = await CRUD()
.get(link: AppLink.getCarsLocationByPassengerComfort, payload: {
'southwestLat': bounds.southwest.latitude.toString(),
'southwestLon': bounds.southwest.longitude.toString(),
'northeastLat': bounds.northeast.latitude.toString(),
'northeastLon': bounds.northeast.longitude.toString(),
});
break;
case 'Speed':
res = await CRUD()
.get(link: AppLink.getCarsLocationByPassengerSpeed, payload: {
'southwestLat': bounds.southwest.latitude.toString(),
'southwestLon': bounds.southwest.longitude.toString(),
'northeastLat': bounds.northeast.latitude.toString(),
'northeastLon': bounds.northeast.longitude.toString(),
});
break;
case 'Delivery':
res = await CRUD()
.get(link: AppLink.getCarsLocationByPassengerDelivery, payload: {
'southwestLat': bounds.southwest.latitude.toString(),
'southwestLon': bounds.southwest.longitude.toString(),
'northeastLat': bounds.northeast.latitude.toString(),
'northeastLon': bounds.northeast.longitude.toString(),
});
break;
default:
res = await CRUD()
.get(link: AppLink.getCarsLocationByPassenger, payload: {
'southwestLat': bounds.southwest.latitude.toString(),
'southwestLon': bounds.southwest.longitude.toString(),
'northeastLat': bounds.northeast.latitude.toString(),
'northeastLon': bounds.northeast.longitude.toString(),
});
}
if (res == 'failure') { if (res == 'failure') {
noCarString = true; // noCarString = true;
dataCarsLocationByPassenger = res; // dataCarsLocationByPassenger = res;
// update();
return false;
} else { } else {
noCarString = false; noCarString = false;
dataCarsLocationByPassenger = jsonDecode(res); dataCarsLocationByPassenger = jsonDecode(res);
driverId = dataCarsLocationByPassenger['message'][carsOrder] driverId = dataCarsLocationByPassenger['message'][carsOrder]
['driver_id'] ['driver_id']
.toString(); .toString();
gender = dataCarsLocationByPassenger['message'][carsOrder]['gender'] gender = dataCarsLocationByPassenger['message'][carsOrder]['gender']
.toString(); .toString();
_updateMarkers(dataCarsLocationByPassenger['message']); carsLocationByPassenger.clear(); // Clear existing markers
for (var i = 0;
i < dataCarsLocationByPassenger['message'].length;
i++) {
var json = dataCarsLocationByPassenger['message'][i];
_updateOrCreateMarker(
MarkerId(json['latitude']).toString(),
LatLng(double.parse(json['latitude']),
double.parse(json['longitude'])),
double.parse(json['heading']),
_getIconForCar(json),
);
driversToken.add(json['token']);
}
update();
return true;
} }
update();
} }
} return false;
Future<String> _fetchCarLocations(LatLngBounds bounds) async {
var payload = {
'southwestLat': bounds.southwest.latitude.toString(),
'southwestLon': bounds.southwest.longitude.toString(),
'northeastLat': bounds.northeast.latitude.toString(),
'northeastLon': bounds.northeast.longitude.toString(),
};
String link;
switch (box.read(BoxName.carType)) {
case 'Lady':
link = AppLink.getFemalDriverLocationByPassenger;
break;
case 'Speed':
link = AppLink.getCarsLocationByPassengerSpeed;
break;
case 'Delivery':
link = AppLink.getCarsLocationByPassengerDelivery;
break;
default:
link = AppLink.getCarsLocationByPassenger;
}
return await CRUD().get(link: link, payload: payload);
}
void _updateMarkers(List<dynamic> carsData) {
driversToken.clear();
for (var json in carsData) {
String markerId = json['driver_id'].toString();
LatLng newPosition = LatLng(
double.parse(json['latitude']),
double.parse(json['longitude']),
);
double newHeading = double.parse(json['heading']);
BitmapDescriptor icon = _getIconForCar(json);
_updateOrCreateMarker(markerId, newPosition, newHeading, icon);
driversToken.add(json['token']);
}
// Remove markers for cars that are no longer present
markers.removeWhere((marker) => !carsData
.any((car) => car['driver_id'].toString() == marker.markerId.value));
} }
BitmapDescriptor _getIconForCar(Map<String, dynamic> carData) { BitmapDescriptor _getIconForCar(Map<String, dynamic> carData) {
if (carData['model'].toString().contains('دراجة')) { if (carData['model'].toString().contains('دراجة')) {
return motoIcon; return motoIcon;
} else if (carData['gender'] == 'Male'.tr) { } else if (carData['gender'] == 'Female') {
return carIcon;
} else {
return ladyIcon; return ladyIcon;
} else {
return carIcon;
} }
} }
@@ -1611,6 +1691,8 @@ class MapPassengerController extends GetxController {
'sosPhone': sosPhonePassengerProfile.text, 'sosPhone': sosPhonePassengerProfile.text,
}, },
); );
box.write(
BoxName.sosPhonePassenger, sosPhonePassengerProfile.text);
} }
})); }));
} }
@@ -1714,12 +1796,12 @@ class MapPassengerController extends GetxController {
Future runEvery30SecondsUntilConditionMet() async { Future runEvery30SecondsUntilConditionMet() async {
// Calculate the duration of the trip in minutes. // Calculate the duration of the trip in minutes.
double tripDurationInMinutes = durationToPassenger / 6; double tripDurationInMinutes = durationToPassenger / 5;
int loopCount = tripDurationInMinutes.ceil(); int loopCount = tripDurationInMinutes.ceil();
// If the trip duration is less than or equal to 50 minutes, then break the loop. // If the trip duration is less than or equal to 50 minutes, then break the loop.
for (var i = 0; i < loopCount; i++) { for (var i = 0; i < loopCount; i++) {
// Wait for 50 seconds. // Wait for 50 seconds.
await Future.delayed(const Duration(seconds: 4)); await Future.delayed(const Duration(seconds: 5));
if (rideTimerBegin == true || statusRide == 'Apply') { if (rideTimerBegin == true || statusRide == 'Apply') {
await getDriverCarsLocationToPassengerAfterApplied(); await getDriverCarsLocationToPassengerAfterApplied();
reloadMarkerDriverCarsLocationToPassengerAfterApplied(); reloadMarkerDriverCarsLocationToPassengerAfterApplied();
@@ -1761,7 +1843,7 @@ class MapPassengerController extends GetxController {
} }
void reloadMarkerDriverCarsLocationToPassengerAfterApplied() { void reloadMarkerDriverCarsLocationToPassengerAfterApplied() {
clearMarkersExceptStartEnd(); // clearMarkersExceptStartEnd();
LatLng driverPosition = LatLng( LatLng driverPosition = LatLng(
double.parse(datadriverCarsLocationToPassengerAfterApplied['message'][0] double.parse(datadriverCarsLocationToPassengerAfterApplied['message'][0]
@@ -1780,9 +1862,9 @@ class MapPassengerController extends GetxController {
? motoIcon ? motoIcon
: datadriverCarsLocationToPassengerAfterApplied['message'][0] : datadriverCarsLocationToPassengerAfterApplied['message'][0]
['gender'] == ['gender'] ==
'Male'.tr 'Female'
? carIcon ? ladyIcon
: ladyIcon; : carIcon;
_updateMarkerPosition(driverPosition, heading, icon); _updateMarkerPosition(driverPosition, heading, icon);
} }
@@ -1834,6 +1916,18 @@ class MapPassengerController extends GetxController {
update(); update();
} }
searchNewDriverAfterRejectingFromDriver() {
//
shouldFetch = true; // Stop further fetches
statusRide = 'wait';
rideConfirm = true;
isSearchingWindow = true;
confirmRideForFirstDriver();
update();
}
Future<void> cancelRideAfterRejectFromAll() async { Future<void> cancelRideAfterRejectFromAll() async {
clearPlacesDestination(); clearPlacesDestination();
clearPolyline(); clearPolyline();
@@ -1869,6 +1963,10 @@ class MapPassengerController extends GetxController {
"order_id": rideId.toString(), // Convert to String "order_id": rideId.toString(), // Convert to String
"status": 'Cancel' "status": 'Cancel'
}); });
await CRUD().post(link: AppLink.updateRides, payload: {
"id": rideId.toString(), // Convert to String
"status": 'Cancel'
});
print('Cancel'); print('Cancel');
FirebaseMessagesController().sendNotificationToDriverMAP( FirebaseMessagesController().sendNotificationToDriverMAP(
'Cancel Trip', 'Cancel Trip',
@@ -2169,7 +2267,7 @@ class MapPassengerController extends GetxController {
void addCustomCarIcon() { void addCustomCarIcon() {
ImageConfiguration config = ImageConfiguration( ImageConfiguration config = ImageConfiguration(
size: const Size(30, 30), devicePixelRatio: Get.pixelRatio); size: const Size(30, 35), devicePixelRatio: Get.pixelRatio);
BitmapDescriptor.asset( BitmapDescriptor.asset(
config, config,
'assets/images/car.png', 'assets/images/car.png',
@@ -2332,7 +2430,7 @@ class MapPassengerController extends GetxController {
startMarkerReloading() async { startMarkerReloading() async {
int reloadCount = 0; int reloadCount = 0;
Timer.periodic(const Duration(seconds: 2), (timer) { Timer.periodic(const Duration(seconds: 5), (timer) {
reloadCount++; reloadCount++;
if (!rideConfirm) { if (!rideConfirm) {
@@ -2348,11 +2446,13 @@ class MapPassengerController extends GetxController {
} }
reloadMarkers() async { reloadMarkers() async {
if (statusRide == 'wait') { // if (statusRide == 'wait') {
clearMarkersExceptStartEnd(); clearMarkersExceptStartEnd();
await getCarsLocationByPassengerAndReloadMarker(); // _smoothlyUpdateMarker();
await getNearestDriverByPassengerLocation(); startCarLocationSearch(box.read(BoxName.carType));
} // await getCarsLocationByPassengerAndReloadMarker();
await getNearestDriverByPassengerLocation();
// }
} }
String durationByPassenger = ''; String durationByPassenger = '';
@@ -2361,6 +2461,7 @@ class MapPassengerController extends GetxController {
String distanceByPassenger = ''; String distanceByPassenger = '';
late Duration durationFromDriverToPassenger; late Duration durationFromDriverToPassenger;
double nearestDistance = double.infinity; double nearestDistance = double.infinity;
Future<CarLocation?> getNearestDriverByPassengerLocation() async { Future<CarLocation?> getNearestDriverByPassengerLocation() async {
if (polyLines.isEmpty || data.isEmpty) { if (polyLines.isEmpty || data.isEmpty) {
return null; // Early return if data is empty return null; // Early return if data is empty
@@ -2380,7 +2481,7 @@ class MapPassengerController extends GetxController {
double.parse(carLocation['latitude']), double.parse(carLocation['latitude']),
double.parse(carLocation['longitude']), double.parse(carLocation['longitude']),
); );
durationToPassenger = (distance * 35 * (1000 / 3600)) durationToPassenger = (distance * 25 * (1000 / 3600))
.round(); //////35 is avg of speed in city .round(); //////35 is avg of speed in city
// Update the UI with the distance and duration // Update the UI with the distance and duration
update(); update();
@@ -2487,13 +2588,38 @@ class MapPassengerController extends GetxController {
update(); update();
} else { } else {
Get.defaultDialog( Get.defaultDialog(
barrierDismissible: false,
title: 'The Driver Will be in your location soon .'.tr, title: 'The Driver Will be in your location soon .'.tr,
middleText: 'The distance less than 500 meter.'.tr, middleText: 'The distance less than 500 meter.'.tr,
confirm: MyElevatedButton( confirm: Column(
title: 'Ok'.tr, children: [
onPressed: () { MyElevatedButton(
Get.back(); kolor: AppColor.greenColor,
}, title: 'Ok'.tr,
onPressed: () {
Get.back();
},
),
MyElevatedButton(
kolor: AppColor.redColor,
title: 'No, I want to cancel this trip'.tr,
onPressed: () {
Get.back();
MyDialog().getDialog(
'Attention'.tr,
'You will be charged for the cost of the driver coming to your location.'
.tr,
() async {
Get.back();
Get.find<PaymentController>()
.payToDriverForCancelAfterAppliedAndHeNearYou(rideId);
// isCancelRidePageShown = true;
// update();
},
);
},
),
],
), ),
); );
// cancel: MyElevatedButton( // cancel: MyElevatedButton(
@@ -2528,7 +2654,8 @@ class MapPassengerController extends GetxController {
isLoading = true; isLoading = true;
update(); update();
remainingTime = 25; //to make cancel every call remainingTime = 25; //to make cancel every call
await getCarsLocationByPassengerAndReloadMarker(); startCarLocationSearch(box.read(BoxName.carType));
// await getCarsLocationByPassengerAndReloadMarker();
var coordDestination = destination.split(','); var coordDestination = destination.split(',');
double latPassengerDestination = double.parse(coordDestination[0]); double latPassengerDestination = double.parse(coordDestination[0]);
double lngPassengerDestination = double.parse(coordDestination[1]); double lngPassengerDestination = double.parse(coordDestination[1]);
@@ -2731,7 +2858,8 @@ class MapPassengerController extends GetxController {
getMapPoints(String originSteps, String destinationSteps, int index) async { getMapPoints(String originSteps, String destinationSteps, int index) async {
isWayPointStopsSheetUtilGetMap = false; isWayPointStopsSheetUtilGetMap = false;
// haveSteps = true; // haveSteps = true;
await getCarsLocationByPassengerAndReloadMarker(); startCarLocationSearch(box.read(BoxName.carType));
// await getCarsLocationByPassengerAndReloadMarker();
// isLoading = true; // isLoading = true;
update(); update();
var url = var url =

View File

@@ -44,11 +44,31 @@ class MyTranslation extends Translations {
"Choose who this order is for": "اختر لمن هذا الطلب", "Choose who this order is for": "اختر لمن هذا الطلب",
"I want to order for myself": "أريد أن أطلب لنفسي", "I want to order for myself": "أريد أن أطلب لنفسي",
"I want to order for someone else": "أريد أن أطلب لشخص آخر", "I want to order for someone else": "أريد أن أطلب لشخص آخر",
"Cancel Trip from driver": "إلغاء الرحلة من السائق",
"If you want order to another person": "إذا كنت تريد الطلب لشخص آخر", "If you want order to another person": "إذا كنت تريد الطلب لشخص آخر",
"Wehaven'tfoundanydriversyet.Considerincreasingyourtripfeetomakeyouroffermoreattractivetodrivers.": "We will look for a new driver.\nPlease wait.":
"سنبحث عن سائق جديد.\nمن فضلك انتظر.",
"upgrade price": "رفع السعر",
"You can upgrade price to may driver accept your order":
"يمكنك رفع السعر حتى يقبل السائق طلبك",
"No, I want to cancel this trip": "لا، أريد إلغاء هذه الرحلة",
'Trip Cancelled. The cost of the trip will be added to your wallet.':
"تم إلغاء الرحلة. سيتم إضافة تكلفة الرحلة إلى محفظتك.",
"Attention": "تنبيه",
"Trip Cancelled. The cost of the trip will be deducted from your wallet.":
"تم إلغاء الرحلة. سيتم خصم تكلفة الرحلة من محفظتك.",
"You will be charged for the cost of the driver coming to your location.":
"سيتم خصم تكلفة قدوم السائق إلى موقعك.",
"reject your order.": "رفض طلبك.",
"Order Under Review": "الطلب قيد المراجعة",
"is reviewing your order. They may need more information or a higher price.":
"يتم مراجعة طلبك. قد يحتاجون إلى مزيد من المعلومات أو سعر أعلى.",
"The driver canceled your ride.": "ألغى السائق رحلتك.",
"We haven't found any drivers yet. Consider increasing your trip fee to make your offer more attractive to drivers.":
"لم نجد أي سائقين بعد. ضع في اعتبارك زيادة رسوم رحلتك لجعل عرضك أكثر جاذبية للسائقين.", "لم نجد أي سائقين بعد. ضع في اعتبارك زيادة رسوم رحلتك لجعل عرضك أكثر جاذبية للسائقين.",
"IncreaseYourTripFee(Optional)": "زيادة رسوم رحلتك (اختياري)", "Increase Your Trip Fee (Optional)": "زيادة رسوم رحلتك (اختياري)",
'Vibration': "اهتزاز‏", 'Vibration': "اهتزاز‏",
'Resend code': "إعادة إرسال الرمز", 'Resend code': "إعادة إرسال الرمز",
"Sign in with Apple": "تسجيل الدخول باستخدام Apple", "Sign in with Apple": "تسجيل الدخول باستخدام Apple",

View File

@@ -1,8 +1,10 @@
import 'dart:convert'; import 'dart:convert';
import 'package:SEFER/constant/api_key.dart'; import 'package:SEFER/constant/api_key.dart';
import 'package:SEFER/constant/style.dart'; import 'package:SEFER/constant/style.dart';
import 'package:SEFER/controller/firebase/firbase_messge.dart';
import 'package:SEFER/controller/functions/tts.dart'; import 'package:SEFER/controller/functions/tts.dart';
import 'package:SEFER/controller/payment/paymob/paymob_response.dart'; import 'package:SEFER/controller/payment/paymob/paymob_response.dart';
import 'package:SEFER/views/home/map_page_passenger.dart';
import 'package:SEFER/views/widgets/elevated_btn.dart'; import 'package:SEFER/views/widgets/elevated_btn.dart';
import 'package:http/http.dart' as http; import 'package:http/http.dart' as http;
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
@@ -101,6 +103,54 @@ class PaymentController extends GetxController {
}); });
} }
payToDriverForCancelAfterAppliedAndHeNearYou(String rideId) async {
{
double costOfWaiting5Minute = box.read(BoxName.countryCode) == 'Egypt'
? (4 * .08) + (5 * 1)
// 4 indicate foe 4 km ditance from driver start move to passenger
: (4 * .06) + (5 * .06); //for Eygpt other like jordan .06 per minute
var paymentTokenWait =
await generateTokenDriver(costOfWaiting5Minute.toString());
var res = await CRUD().post(link: AppLink.addDrivePayment, payload: {
'rideId': rideId,
'amount': costOfWaiting5Minute.toString(),
'payment_method': 'cancel-from-near',
'passengerID': box.read(BoxName.passengerID).toString(),
'token': paymentTokenWait,
'driverID': Get.find<MapPassengerController>().driverId.toString(),
});
var paymentTokenWait1 =
await generateTokenDriver(costOfWaiting5Minute.toString());
var res1 =
await CRUD().post(link: AppLink.addDriversWalletPoints, payload: {
'paymentID': 'rideId$rideId',
'amount': (costOfWaiting5Minute).toStringAsFixed(0),
'paymentMethod': 'cancel-from-near',
'token': paymentTokenWait1,
'driverID': Get.find<MapPassengerController>().driverId.toString(),
});
if (res != 'failure') {
FirebaseMessagesController().sendNotificationToDriverMAP(
'Cancel',
'Trip Cancelled. The cost of the trip will be added to your wallet.'
.tr,
Get.find<MapPassengerController>().driverToken,
[],
'cancel.wav',
);
}
var paymentTokenWaitPassenger1 =
await generateTokenPassenger((costOfWaiting5Minute * -1).toString());
await CRUD().post(link: AppLink.addPassengersWallet, payload: {
'passenger_id': box.read(BoxName.passengerID).toString(),
'balance': (costOfWaiting5Minute * -1).toString(),
'token': paymentTokenWaitPassenger1,
});
Get.offAll(const MapPagePassenger());
}
}
addPassengerWallet() async { addPassengerWallet() async {
isLoading = true; isLoading = true;
update(); update();

View File

@@ -6,6 +6,7 @@ import 'package:url_launcher/url_launcher.dart';
import '../../constant/api_key.dart'; import '../../constant/api_key.dart';
import '../../main.dart'; import '../../main.dart';
import '../../print.dart';
class PaymobManager extends GetxController { class PaymobManager extends GetxController {
String authanticationToken1 = ""; String authanticationToken1 = "";
@@ -95,6 +96,7 @@ class PaymobManager extends GetxController {
'username': AK.usernamePayMob, 'username': AK.usernamePayMob,
"password": AK.passwordPayMob, "password": AK.passwordPayMob,
}); });
Log.print('token: ${response}');
return response.data["token"]; return response.data["token"];
} }
@@ -111,6 +113,7 @@ class PaymobManager extends GetxController {
"delivery_needed": "false", "delivery_needed": "false",
"items": [], "items": [],
}); });
Log.print('id: ${response}');
return response.data["id"]; return response.data["id"];
} }
@@ -126,16 +129,15 @@ class PaymobManager extends GetxController {
"auth_token": authanticationToken.toString(), "auth_token": authanticationToken.toString(),
"order_id": orderId.toString(), "order_id": orderId.toString(),
"integration_id": "integration_id":
4556056, ////todo wallet or online card int.parse(AK.integrationIdPayMob), 4601103, ////todo wallet or online card int.parse(AK.integrationIdPayMob),
"lock_order_when_paid": "false", "lock_order_when_paid": "false",
"amount_cents": amount, "amount_cents": amount,
"currency": currency, "currency": currency,
"billing_data": { "billing_data": {
"first_name": box.read(BoxName.nameDriver) ?? box.read(BoxName.name), "first_name": box.read(BoxName.name),
"last_name": box.read(BoxName.lastNameDriver) ?? box.read(BoxName.name), "last_name": box.read(BoxName.name),
"email": box.read(BoxName.emailDriver) ?? box.read(BoxName.email), "email": box.read(BoxName.email),
"phone_number": "phone_number": box.read(BoxName.phone),
box.read(BoxName.phoneDriver) ?? box.read(BoxName.phone),
"apartment": "NA", "apartment": "NA",
"floor": "NA", "floor": "NA",
"street": "NA", "street": "NA",
@@ -147,7 +149,7 @@ class PaymobManager extends GetxController {
"state": "NA" "state": "NA"
}, },
}); });
Log.print('token: ${response}');
return response.data["token"]; return response.data["token"];
} }
} }

View File

@@ -4,6 +4,8 @@ import 'package:dio/dio.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:webview_flutter/webview_flutter.dart'; import 'package:webview_flutter/webview_flutter.dart';
import '../../../print.dart';
class PaymobResponseWallet { class PaymobResponseWallet {
final bool success; final bool success;
final String? transactionID; final String? transactionID;
@@ -142,9 +144,7 @@ class PaymobPaymentWallet {
}) async { }) async {
final Map<String, dynamic> data = { final Map<String, dynamic> data = {
"source": { "source": {
"identifier": box "identifier": box.read(BoxName.phone).toString(),
.read(BoxName.phone)
.toString(), // Replace with actual source identifier
"subtype": "WALLET", "subtype": "WALLET",
}, },
"payment_token": paymentToken, "payment_token": paymentToken,
@@ -219,6 +219,7 @@ class PaymobPaymentWallet {
), ),
); );
final urlWallet = await _getWalletUrl(paymentToken: purchaseToken); final urlWallet = await _getWalletUrl(paymentToken: purchaseToken);
Log.print('urlWallet: ${urlWallet}');
if (context.mounted) { if (context.mounted) {
final response = await PaymobIFrameWallet.show( final response = await PaymobIFrameWallet.show(

View File

@@ -17,10 +17,7 @@ import 'package:flutter/foundation.dart'
class DefaultFirebaseOptions { class DefaultFirebaseOptions {
static FirebaseOptions get currentPlatform { static FirebaseOptions get currentPlatform {
if (kIsWeb) { if (kIsWeb) {
throw UnsupportedError( return web;
'DefaultFirebaseOptions have not been configured for web - '
'you can reconfigure this by running the FlutterFire CLI again.',
);
} }
switch (defaultTargetPlatform) { switch (defaultTargetPlatform) {
case TargetPlatform.android: case TargetPlatform.android:
@@ -28,15 +25,9 @@ class DefaultFirebaseOptions {
case TargetPlatform.iOS: case TargetPlatform.iOS:
return ios; return ios;
case TargetPlatform.macOS: case TargetPlatform.macOS:
throw UnsupportedError( return macos;
'DefaultFirebaseOptions have not been configured for macos - '
'you can reconfigure this by running the FlutterFire CLI again.',
);
case TargetPlatform.windows: case TargetPlatform.windows:
throw UnsupportedError( return windows;
'DefaultFirebaseOptions have not been configured for windows - '
'you can reconfigure this by running the FlutterFire CLI again.',
);
case TargetPlatform.linux: case TargetPlatform.linux:
throw UnsupportedError( throw UnsupportedError(
'DefaultFirebaseOptions have not been configured for linux - ' 'DefaultFirebaseOptions have not been configured for linux - '
@@ -63,8 +54,40 @@ class DefaultFirebaseOptions {
messagingSenderId: '594687661098', messagingSenderId: '594687661098',
projectId: 'ride-b1bd8', projectId: 'ride-b1bd8',
storageBucket: 'ride-b1bd8.appspot.com', storageBucket: 'ride-b1bd8.appspot.com',
iosClientId: androidClientId: '594687661098-2dhoogl7be9phobfbu8bbg1sj567iv88.apps.googleusercontent.com',
'594687661098-8e26699cris2k3nj5msj1osi59it9kpf.apps.googleusercontent.com', iosClientId: '594687661098-8e26699cris2k3nj5msj1osi59it9kpf.apps.googleusercontent.com',
iosBundleId: 'com.mobileapp.store.ride', iosBundleId: 'com.mobileapp.store.ride',
); );
}
static const FirebaseOptions web = FirebaseOptions(
apiKey: 'AIzaSyAVtyV7YVMeLbwA1UlNPxV9FhCzT0kjeAE',
appId: '1:594687661098:web:62d8388476ec91ec595f53',
messagingSenderId: '594687661098',
projectId: 'ride-b1bd8',
authDomain: 'ride-b1bd8.firebaseapp.com',
storageBucket: 'ride-b1bd8.appspot.com',
measurementId: 'G-Y3HFEC6F4N',
);
static const FirebaseOptions macos = FirebaseOptions(
apiKey: 'AIzaSyCf2mW2h0HD8ZYjwh4VOa2ladw6MJkCDTM',
appId: '1:594687661098:ios:6f69eee1449be943595f53',
messagingSenderId: '594687661098',
projectId: 'ride-b1bd8',
storageBucket: 'ride-b1bd8.appspot.com',
androidClientId: '594687661098-2dhoogl7be9phobfbu8bbg1sj567iv88.apps.googleusercontent.com',
iosClientId: '594687661098-8e26699cris2k3nj5msj1osi59it9kpf.apps.googleusercontent.com',
iosBundleId: 'com.mobileapp.store.ride',
);
static const FirebaseOptions windows = FirebaseOptions(
apiKey: 'AIzaSyAVtyV7YVMeLbwA1UlNPxV9FhCzT0kjeAE',
appId: '1:594687661098:web:d9f43a2091395d87595f53',
messagingSenderId: '594687661098',
projectId: 'ride-b1bd8',
authDomain: 'ride-b1bd8.firebaseapp.com',
storageBucket: 'ride-b1bd8.appspot.com',
measurementId: 'G-C3DWQ8Z062',
);
}

View File

@@ -11,7 +11,6 @@ import 'package:get_storage/get_storage.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:wakelock_plus/wakelock_plus.dart'; import 'package:wakelock_plus/wakelock_plus.dart';
import 'constant/api_key.dart'; import 'constant/api_key.dart';
import 'constant/credential.dart';
import 'constant/info.dart'; import 'constant/info.dart';
import 'controller/firebase/firbase_messge.dart'; import 'controller/firebase/firbase_messge.dart';
import 'controller/firebase/local_notification.dart'; import 'controller/firebase/local_notification.dart';

View File

@@ -6,6 +6,7 @@ import 'package:google_maps_flutter/google_maps_flutter.dart';
import '../../../constant/char_map.dart'; import '../../../constant/char_map.dart';
import '../../../constant/colors.dart'; import '../../../constant/colors.dart';
import '../../../constant/credential.dart'; import '../../../constant/credential.dart';
import '../../../controller/firebase/firbase_messge.dart';
import '../../../controller/functions/tts.dart'; import '../../../controller/functions/tts.dart';
import '../../../controller/home/map_passenger_controller.dart'; import '../../../controller/home/map_passenger_controller.dart';
import '../../../main.dart'; import '../../../main.dart';
@@ -103,26 +104,32 @@ GetBuilder<MapPassengerController> leftMainMenuIcons() {
// ), // ),
// ), // ),
// ), // ),
// AnimatedContainer( AnimatedContainer(
// duration: const Duration(microseconds: 200), duration: const Duration(microseconds: 200),
// width: controller.widthMapTypeAndTraffic, width: controller.widthMapTypeAndTraffic,
// decoration: BoxDecoration( decoration: BoxDecoration(
// color: AppColor.secondaryColor, color: AppColor.secondaryColor,
// border: Border.all(), border: Border.all(),
// borderRadius: BorderRadius.circular(15)), borderRadius: BorderRadius.circular(15)),
// child: IconButton( child: IconButton(
// onPressed: () async { onPressed: () async {
// var phone = box.read(BoxName.countryCode) == 'Egypt' FirebaseMessagesController().sendNotificationToDriverMAP(
// ? '+2${box.read(BoxName.sosPhonePassenger)}' '',
// : '+962${box.read(BoxName.sosPhonePassenger)}'; 'from: ',
// controller.sendWhatsapp(phone); // jsonDecode(value)['message'].toString(),
// }, 'cXavJMQgRACEfYdOnSLDU4:APA91bE_7aB5kLUcCgolp6BTy3girf7NCxR49dRt9wMDCu3C3td9V-KwZqsbJvYyIqgkI9oxZCiqyVv9ZnVG7rN0LBf7Nxe9AEcatgHNo0fEomaMWB3ff_SagtNkUuYeHc-GaPETq6Oa',
// icon: const Icon( [],
// Icons.chat, 'order.wav'
// size: 29,
// ), // polylineCoordinates.toString()
// ), );
// ), },
icon: const Icon(
Icons.chat,
size: 29,
),
),
),
// AnimatedContainer( // AnimatedContainer(
// duration: const Duration(microseconds: 200), // duration: const Duration(microseconds: 200),
// width: controller.widthMapTypeAndTraffic, // width: controller.widthMapTypeAndTraffic,

View File

@@ -14,6 +14,7 @@ class MyDialog extends GetxController {
Get.defaultDialog( Get.defaultDialog(
title: title, title: title,
titleStyle: AppStyle.title, titleStyle: AppStyle.title,
barrierDismissible: false,
middleTextStyle: AppStyle.title, middleTextStyle: AppStyle.title,
content: Column( content: Column(
children: [ children: [

View File

@@ -27,6 +27,7 @@
33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; }; 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; };
33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; }; 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; };
33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; }; 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; };
643B04D2AB43F88CA67B4296 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = DDF4384B47D24C01FF9439DD /* GoogleService-Info.plist */; };
/* End PBXBuildFile section */ /* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */ /* Begin PBXContainerItemProxy section */
@@ -64,7 +65,7 @@
331C80D7294CF71000263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = "<group>"; }; 331C80D7294CF71000263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = "<group>"; };
333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = "<group>"; }; 333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = "<group>"; };
335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GeneratedPluginRegistrant.swift; sourceTree = "<group>"; }; 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GeneratedPluginRegistrant.swift; sourceTree = "<group>"; };
33CC10ED2044A3C60003C045 /* ride.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "ride.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 33CC10ED2044A3C60003C045 /* ride.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ride.app; sourceTree = BUILT_PRODUCTS_DIR; };
33CC10F02044A3C60003C045 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; }; 33CC10F02044A3C60003C045 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
33CC10F22044A3C60003C045 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Assets.xcassets; path = Runner/Assets.xcassets; sourceTree = "<group>"; }; 33CC10F22044A3C60003C045 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Assets.xcassets; path = Runner/Assets.xcassets; sourceTree = "<group>"; };
33CC10F52044A3C60003C045 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = "<group>"; }; 33CC10F52044A3C60003C045 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = "<group>"; };
@@ -78,6 +79,7 @@
33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = "<group>"; }; 33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = "<group>"; };
7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = "<group>"; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = "<group>"; };
9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = "<group>"; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = "<group>"; };
DDF4384B47D24C01FF9439DD /* GoogleService-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; name = "GoogleService-Info.plist"; path = "Runner/GoogleService-Info.plist"; sourceTree = "<group>"; };
/* End PBXFileReference section */ /* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */ /* Begin PBXFrameworksBuildPhase section */
@@ -125,6 +127,7 @@
331C80D6294CF71000263BE5 /* RunnerTests */, 331C80D6294CF71000263BE5 /* RunnerTests */,
33CC10EE2044A3C60003C045 /* Products */, 33CC10EE2044A3C60003C045 /* Products */,
D73912EC22F37F3D000D13A0 /* Frameworks */, D73912EC22F37F3D000D13A0 /* Frameworks */,
DDF4384B47D24C01FF9439DD /* GoogleService-Info.plist */,
); );
sourceTree = "<group>"; sourceTree = "<group>";
}; };
@@ -284,6 +287,7 @@
files = ( files = (
33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */, 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */,
33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */, 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */,
643B04D2AB43F88CA67B4296 /* GoogleService-Info.plist in Resources */,
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
}; };

View File

@@ -3,9 +3,11 @@
<plist version="1.0"> <plist version="1.0">
<dict> <dict>
<key>CLIENT_ID</key> <key>CLIENT_ID</key>
<string>594687661098-od4d3lpsdba79shpjmala0a3lrps4spi.apps.googleusercontent.com</string> <string>594687661098-8e26699cris2k3nj5msj1osi59it9kpf.apps.googleusercontent.com</string>
<key>REVERSED_CLIENT_ID</key> <key>REVERSED_CLIENT_ID</key>
<string>com.googleusercontent.apps.594687661098-od4d3lpsdba79shpjmala0a3lrps4spi</string> <string>com.googleusercontent.apps.594687661098-8e26699cris2k3nj5msj1osi59it9kpf</string>
<key>ANDROID_CLIENT_ID</key>
<string>594687661098-2dhoogl7be9phobfbu8bbg1sj567iv88.apps.googleusercontent.com</string>
<key>API_KEY</key> <key>API_KEY</key>
<string>AIzaSyCf2mW2h0HD8ZYjwh4VOa2ladw6MJkCDTM</string> <string>AIzaSyCf2mW2h0HD8ZYjwh4VOa2ladw6MJkCDTM</string>
<key>GCM_SENDER_ID</key> <key>GCM_SENDER_ID</key>
@@ -13,7 +15,7 @@
<key>PLIST_VERSION</key> <key>PLIST_VERSION</key>
<string>1</string> <string>1</string>
<key>BUNDLE_ID</key> <key>BUNDLE_ID</key>
<string>com.mobileapp.store.ride.RunnerTests</string> <string>com.mobileapp.store.ride</string>
<key>PROJECT_ID</key> <key>PROJECT_ID</key>
<string>ride-b1bd8</string> <string>ride-b1bd8</string>
<key>STORAGE_BUCKET</key> <key>STORAGE_BUCKET</key>
@@ -29,6 +31,6 @@
<key>IS_SIGNIN_ENABLED</key> <key>IS_SIGNIN_ENABLED</key>
<true></true> <true></true>
<key>GOOGLE_APP_ID</key> <key>GOOGLE_APP_ID</key>
<string>1:594687661098:ios:e8ca02ed508d4737595f53</string> <string>1:594687661098:ios:6f69eee1449be943595f53</string>
</dict> </dict>
</plist> </plist>

View File

@@ -389,10 +389,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: file_selector_windows name: file_selector_windows
sha256: d3547240c20cabf205c7c7f01a50ecdbc413755814d6677f3cb366f04abcead0 sha256: "2ad726953f6e8affbc4df8dc78b77c3b4a060967a291e528ef72ae846c60fb69"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "0.9.3+1" version: "0.9.3+2"
firebase_auth: firebase_auth:
dependency: "direct main" dependency: "direct main"
description: description:
@@ -482,10 +482,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: flutter_cache_manager name: flutter_cache_manager
sha256: "395d6b7831f21f3b989ebedbb785545932adb9afe2622c1ffacf7f4b53a7e544" sha256: ceff65d74d907b1b772e22cf04daad60fb472461638977d9fae8b00a63e01e3d
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "3.3.2" version: "3.3.3"
flutter_font_icons: flutter_font_icons:
dependency: "direct main" dependency: "direct main"
description: description:
@@ -1004,10 +1004,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: image_picker_android name: image_picker_android
sha256: cea2bd5b9fcff039a4901d3b13c67fe747f940be9ba76bde1bcd218d168eeb7f sha256: a26dc9a03fe042440c1e4be554fb0fceae2bf6d887d7467fc48c688fa4a81889
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "0.8.12+6" version: "0.8.12+7"
image_picker_for_web: image_picker_for_web:
dependency: transitive dependency: transitive
description: description:
@@ -1188,10 +1188,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: local_auth_windows name: local_auth_windows
sha256: "505ba3367ca781efb1c50d3132e44a2446bccc4163427bc203b9b4d8994d97ea" sha256: bc4e66a29b0fdf751aafbec923b5bed7ad6ed3614875d8151afe2578520b2ab5
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.0.10" version: "1.0.11"
location: location:
dependency: "direct main" dependency: "direct main"
description: description:
@@ -1532,10 +1532,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: rxdart name: rxdart
sha256: "0c7c0cedd93788d996e33041ffecda924cc54389199cde4e6a34b440f50044cb" sha256: "5c3004a4a8dbb94bd4bf5412a4def4acdaa12e12f269737a5751369e12d1a962"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "0.27.7" version: "0.28.0"
sanitize_html: sanitize_html:
dependency: transitive dependency: transitive
description: description:
@@ -1832,10 +1832,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: url_launcher_windows name: url_launcher_windows
sha256: ecf9725510600aa2bb6d7ddabe16357691b6d2805f66216a97d1b881e21beff7 sha256: "49c10f879746271804767cb45551ec5592cdab00ee105c06dddde1a98f73b185"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "3.1.1" version: "3.1.2"
uuid: uuid:
dependency: transitive dependency: transitive
description: description: