This commit is contained in:
Hamza-Ayed
2024-09-30 09:37:26 +03:00
parent f5b7307f86
commit 659f178737
21 changed files with 416 additions and 151 deletions

View File

@@ -54,8 +54,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.
minSdk = 23 minSdk = 23
targetSdk = flutter.targetSdkVersion targetSdk = flutter.targetSdkVersion
versionCode = 94 versionCode = 95
versionName = '1.5.94' versionName = '1.5.95'
multiDexEnabled =true multiDexEnabled =true
} }
@@ -85,6 +85,9 @@ flutter {
dependencies { dependencies {
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
// implementation platform('com.google.firebase:firebase-bom:32.1.1') // implementation platform('com.google.firebase:firebase-bom:32.1.1')
// implementation 'com.facebook.android:facebook-login:12.3.0'
implementation 'com.facebook.android:facebook-login:latest.release'
implementation 'com.stripe:paymentsheet:20.47.0' implementation 'com.stripe:paymentsheet:20.47.0'
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.2.2' coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.2.2'

View File

@@ -33,6 +33,22 @@
android:icon="@mipmap/launcher_icon" android:icon="@mipmap/launcher_icon"
android:label="Sefer Driver" android:label="Sefer Driver"
android:theme="@style/LaunchTheme"> android:theme="@style/LaunchTheme">
<meta-data android:name="com.facebook.sdk.ApplicationId"
android:value="@string/facebook_app_id" />
<activity android:name="com.facebook.FacebookActivity"
android:configChanges="keyboard|keyboardHidden|screenLayout|screenSize|orientation"
android:label="@string/app_name" />
<activity
android:name="com.facebook.CustomTabActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="@string/fb_login_protocol_scheme" />
</intent-filter>
</activity>
<service <service
android:name=".MyFirebaseMessagingService" android:name=".MyFirebaseMessagingService"
android:exported="false"></service> android:exported="false"></service>
@@ -59,6 +75,7 @@
android:name="com.yalantis.ucrop.UCropActivity" android:name="com.yalantis.ucrop.UCropActivity"
android:screenOrientation="portrait" android:screenOrientation="portrait"
android:theme="@style/Theme.AppCompat.Light.NoActionBar" /> android:theme="@style/Theme.AppCompat.Light.NoActionBar" />
<meta-data <meta-data
android:name="com.google.android.geo.API_KEY" android:name="com.google.android.geo.API_KEY"
android:value="@string/api_key" /> android:value="@string/api_key" />
@@ -74,14 +91,7 @@
android:exported="false" android:exported="false"
android:foregroundServiceType="location" /> android:foregroundServiceType="location" />
<!-- Firebase Messaging Service -->
<!-- <service
android:name=".java.MyFirebaseMessagingService"
android:exported="false">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT" />
</intent-filter>
</service> -->
<service <service
android:name="com.google.firebase.messaging.FirebaseMessagingService" android:name="com.google.firebase.messaging.FirebaseMessagingService"
android:exported="false" android:exported="false"
@@ -90,43 +100,23 @@
<action android:name="com.google.firebase.MESSAGING_EVENT" /> <action android:name="com.google.firebase.MESSAGING_EVENT" />
</intent-filter> </intent-filter>
</service> </service>
<service
android:name="com.phan_tech.flutter_overlay_apps.OverlayService"
android:exported="false" />
<service
android:name="flutter.overlay.window.flutter_overlay_window.OverlayService"
android:foregroundServiceType="specialUse">
<property
android:name="android.app.PROPERTY_SPECIAL_USE_FGS_SUBTYPE"
android:value="explanation_for_special_use" />
</service>
<receiver
android:name="com.google.firebase.iid.FirebaseInstanceIdReceiver"
android:exported="true"
android:permission="com.google.android.c2dm.permission.SEND">
<intent-filter>
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
<category android:name="com.sefer_driver" />
</intent-filter>
</receiver>
<!-- Sign-In Service -->
<service <service
android:name="com.dsaved.bubblehead.bubble.BubbleHeadService" android:name="com.dsaved.bubblehead.bubble.BubbleHeadService"
android:enabled="true" android:enabled="true"
android:exported="false"> android:exported="false">
<intent-filter> <intent-filter>
<action android:name="intent.bring.app.to.foreground" /> <action android:name="intent.bring.app.to.foreground" />
<category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.DEFAULT" />
</intent-filter> </intent-filter>
</service> </service>
<receiver <!-- <receiver
android:name="com.dexterous.flutterlocalnotifications.ScheduledNotificationReceiver" android:name="com.dexterous.flutterlocalnotifications.ScheduledNotificationReceiver"
android:exported="false" /> android:exported="false" /> -->
<receiver
<!-- <receiver
android:name="com.dexterous.flutterlocalnotifications.ScheduledNotificationBootReceiver" android:name="com.dexterous.flutterlocalnotifications.ScheduledNotificationBootReceiver"
android:exported="false"> android:exported="false">
<intent-filter> <intent-filter>
@@ -135,10 +125,8 @@
<action android:name="android.intent.action.QUICKBOOT_POWERON" /> <action android:name="android.intent.action.QUICKBOOT_POWERON" />
<action android:name="com.htc.intent.action.QUICKBOOT_POWERON" /> <action android:name="com.htc.intent.action.QUICKBOOT_POWERON" />
</intent-filter> </intent-filter>
</receiver> </receiver> -->
<receiver
android:name=".YourBroadcastReceiver"
android:exported="false" />
</application>
</application>
</manifest> </manifest>

View File

@@ -5,4 +5,11 @@
<string name="api_key">AIzaSyCyfwRXTwSTLOFQSQgN5p7QZgGJVZnEKq0</string> <string name="api_key">AIzaSyCyfwRXTwSTLOFQSQgN5p7QZgGJVZnEKq0</string>
<string name="channel_name">FCM Notifications</string> <string name="channel_name">FCM Notifications</string>
<string name="channel_description">Notifications from Firebase Cloud Messaging</string> <string name="channel_description">Notifications from Firebase Cloud Messaging</string>
<!-- <string name="app_name">auth_app</string> -->
<string name="facebook_app_id">1749628025888168</string>
<string name="fb_login_protocol_scheme">fb1749628025888168</string>
<string name="facebook_client_token">af5af0a2c8feffe25c27755977bb9ff7</string>
</resources> </resources>

View File

@@ -13,6 +13,14 @@ PODS:
- Flutter - Flutter
- device_info_plus (0.0.1): - device_info_plus (0.0.1):
- Flutter - Flutter
- FBAEMKit (17.0.3):
- FBSDKCoreKit_Basics (= 17.0.3)
- FBSDKCoreKit (17.0.3):
- FBAEMKit (= 17.0.3)
- FBSDKCoreKit_Basics (= 17.0.3)
- FBSDKCoreKit_Basics (17.0.3)
- FBSDKLoginKit (17.0.3):
- FBSDKCoreKit (= 17.0.3)
- Firebase/Auth (10.28.0): - Firebase/Auth (10.28.0):
- Firebase/CoreOnly - Firebase/CoreOnly
- FirebaseAuth (~> 10.28.0) - FirebaseAuth (~> 10.28.0)
@@ -63,6 +71,9 @@ PODS:
- Flutter (1.0.0) - Flutter (1.0.0)
- flutter_contacts (0.0.1): - flutter_contacts (0.0.1):
- Flutter - Flutter
- flutter_facebook_auth (7.0.1):
- FBSDKLoginKit (~> 17.0.2)
- Flutter
- flutter_image_compress_common (1.0.0): - flutter_image_compress_common (1.0.0):
- Flutter - Flutter
- Mantle - Mantle
@@ -286,6 +297,7 @@ DEPENDENCIES:
- firebase_messaging (from `.symlinks/plugins/firebase_messaging/ios`) - firebase_messaging (from `.symlinks/plugins/firebase_messaging/ios`)
- Flutter (from `Flutter`) - Flutter (from `Flutter`)
- flutter_contacts (from `.symlinks/plugins/flutter_contacts/ios`) - flutter_contacts (from `.symlinks/plugins/flutter_contacts/ios`)
- flutter_facebook_auth (from `.symlinks/plugins/flutter_facebook_auth/ios`)
- flutter_image_compress_common (from `.symlinks/plugins/flutter_image_compress_common/ios`) - flutter_image_compress_common (from `.symlinks/plugins/flutter_image_compress_common/ios`)
- flutter_local_notifications (from `.symlinks/plugins/flutter_local_notifications/ios`) - flutter_local_notifications (from `.symlinks/plugins/flutter_local_notifications/ios`)
- flutter_secure_storage (from `.symlinks/plugins/flutter_secure_storage/ios`) - flutter_secure_storage (from `.symlinks/plugins/flutter_secure_storage/ios`)
@@ -317,6 +329,10 @@ DEPENDENCIES:
SPEC REPOS: SPEC REPOS:
trunk: trunk:
- AppAuth - AppAuth
- FBAEMKit
- FBSDKCoreKit
- FBSDKCoreKit_Basics
- FBSDKLoginKit
- Firebase - Firebase
- FirebaseAppCheckInterop - FirebaseAppCheckInterop
- FirebaseAuth - FirebaseAuth
@@ -374,6 +390,8 @@ EXTERNAL SOURCES:
:path: Flutter :path: Flutter
flutter_contacts: flutter_contacts:
:path: ".symlinks/plugins/flutter_contacts/ios" :path: ".symlinks/plugins/flutter_contacts/ios"
flutter_facebook_auth:
:path: ".symlinks/plugins/flutter_facebook_auth/ios"
flutter_image_compress_common: flutter_image_compress_common:
:path: ".symlinks/plugins/flutter_image_compress_common/ios" :path: ".symlinks/plugins/flutter_image_compress_common/ios"
flutter_local_notifications: flutter_local_notifications:
@@ -435,6 +453,10 @@ SPEC CHECKSUMS:
background_location: 1b80c1fe3abd9912bca298618f6e365abf6f588f background_location: 1b80c1fe3abd9912bca298618f6e365abf6f588f
camera_avfoundation: dd002b0330f4981e1bbcb46ae9b62829237459a4 camera_avfoundation: dd002b0330f4981e1bbcb46ae9b62829237459a4
device_info_plus: 97af1d7e84681a90d0693e63169a5d50e0839a0d device_info_plus: 97af1d7e84681a90d0693e63169a5d50e0839a0d
FBAEMKit: 9900b2edd99a2d21629a6277e6166f14c6215799
FBSDKCoreKit: 0791f8f68a8630931a4c12aa23a56cc021551596
FBSDKCoreKit_Basics: 46d6b472c0dd0a5a7e972c025033d1c567f54eb4
FBSDKLoginKit: b4a4eba1d62eb452544411824f41689adabd5bd2
Firebase: 5121c624121af81cbc81df3bda414b3c28c4f3c3 Firebase: 5121c624121af81cbc81df3bda414b3c28c4f3c3
firebase_auth: e778ee89483b86fe4200d1f8e9a1c52aa5fb64a8 firebase_auth: e778ee89483b86fe4200d1f8e9a1c52aa5fb64a8
firebase_core: a9d0180d5285527884d07a41eb4a9ec9ed12cdb6 firebase_core: a9d0180d5285527884d07a41eb4a9ec9ed12cdb6
@@ -447,6 +469,7 @@ SPEC CHECKSUMS:
FirebaseMessaging: 087a7c7cadef7b9239f005bc4db823894844f323 FirebaseMessaging: 087a7c7cadef7b9239f005bc4db823894844f323
Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7 Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7
flutter_contacts: edb1c5ce76aa433e20e6cb14c615f4c0b66e0983 flutter_contacts: edb1c5ce76aa433e20e6cb14c615f4c0b66e0983
flutter_facebook_auth: 4fa1dc3fa624284a5ddfdf9e4a2b7945b3835949
flutter_image_compress_common: ec1d45c362c9d30a3f6a0426c297f47c52007e3e flutter_image_compress_common: ec1d45c362c9d30a3f6a0426c297f47c52007e3e
flutter_local_notifications: 4cde75091f6327eb8517fa068a0a5950212d2086 flutter_local_notifications: 4cde75091f6327eb8517fa068a0a5950212d2086
flutter_secure_storage: d33dac7ae2ea08509be337e775f6b59f1ff45f12 flutter_secure_storage: d33dac7ae2ea08509be337e775f6b59f1ff45f12

View File

@@ -281,6 +281,7 @@ class AppLink {
static String getPassengerDetails = "$server/Admin/getPassengerDetails.php"; static String getPassengerDetails = "$server/Admin/getPassengerDetails.php";
static String getPassengerbyEmail = "$server/Admin/getPassengerbyEmail.php"; static String getPassengerbyEmail = "$server/Admin/getPassengerbyEmail.php";
static String addAdminUser = "$server/Admin/adminUser/add.php"; static String addAdminUser = "$server/Admin/adminUser/add.php";
static String addError = "$server/Admin/errorApp.php";
static String getAdminUser = "$server/Admin/adminUser/get.php"; static String getAdminUser = "$server/Admin/adminUser/get.php";
static String getCaptainDetailsByEmailOrIDOrPhone = static String getCaptainDetailsByEmailOrIDOrPhone =
"$server/Admin/AdminCaptain/getCaptainDetailsByEmailOrIDOrPhone.php"; "$server/Admin/AdminCaptain/getCaptainDetailsByEmailOrIDOrPhone.php";

View File

@@ -4,6 +4,7 @@ import 'package:SEFER/constant/colors.dart';
import 'package:SEFER/controller/functions/location_background_controller.dart'; import 'package:SEFER/controller/functions/location_background_controller.dart';
import 'package:SEFER/print.dart'; import 'package:SEFER/print.dart';
import 'package:SEFER/views/auth/captin/cards/sms_signup.dart'; import 'package:SEFER/views/auth/captin/cards/sms_signup.dart';
import 'package:SEFER/views/auth/captin/login_captin.dart';
import 'package:SEFER/views/widgets/elevated_btn.dart'; import 'package:SEFER/views/widgets/elevated_btn.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_secure_storage/flutter_secure_storage.dart'; import 'package:flutter_secure_storage/flutter_secure_storage.dart';
@@ -134,6 +135,7 @@ class LoginDriverController extends GetxController {
} }
Get.off(() => HomeCaptain()); Get.off(() => HomeCaptain());
// Get.off(() => LoginCaptin());
} else { } else {
Get.offAll(() => SmsSignupEgypt()); Get.offAll(() => SmsSignupEgypt());
// Get.snackbar(jsonDecoeded['status'], jsonDecoeded['data'], // Get.snackbar(jsonDecoeded['status'], jsonDecoeded['data'],

View File

@@ -160,83 +160,124 @@ class RegisterCaptainController extends GetxController {
// isLoading = false; // isLoading = false;
// update(); // update();
// } // }
DateTime? lastOtpSentTime; // Store the last OTP sent time
int otpResendInterval = 300; // 5 minutes in seconds
// Main function to handle OTP sending
sendOtpMessage() async { sendOtpMessage() async {
SmsEgyptController smsEgyptController = Get.put(SmsEgyptController()); if (_isOtpResendAllowed()) {
isLoading = true; isLoading = true;
update();
int randomNumber = Random().nextInt(100000) + 1;
isLoading = true;
update();
// Get the current time and the last OTP time (if it exists)
DateTime currentTime = DateTime.now();
DateTime? lastOtpTime = box.read(BoxName.lastOtpTime);
// Check if the last OTP was sent within 5 minutes (300 seconds)
if (lastOtpTime != null &&
currentTime.difference(lastOtpTime).inSeconds < 300) {
Get.snackbar(
'Please wait'.tr, 'You can send another OTP after 5 minutes.'.tr,
backgroundColor: AppColor.redColor);
isLoading = false;
update(); update();
return;
}
if (formKey3.currentState!.validate()) { if (formKey3.currentState!.validate()) {
if (box.read(BoxName.countryCode) == 'Egypt') { String countryCode = box.read(BoxName.countryCode);
if (isValidEgyptianPhoneNumber(phoneController.text)) { String phoneNumber = phoneController.text;
var responseCheker = await CRUD()
.post(link: AppLink.checkPhoneNumberISVerfiedDriver, payload: {
'phone_number': '+2${phoneController.text}',
});
if (responseCheker != 'failure') { if (countryCode == 'Egypt' && isValidEgyptianPhoneNumber(phoneNumber)) {
var d = jsonDecode(responseCheker); await _checkAndSendOtp(phoneNumber);
if (d['message'][0]['is_verified'].toString() == '1') {
Get.snackbar('Phone number is verified before'.tr, '',
backgroundColor: AppColor.greenColor);
box.write(BoxName.phoneVerified, '1');
box.write(BoxName.phone, '+2${phoneController.text}');
await Get.put(LoginDriverController()).loginUsingCredentials(
box.read(BoxName.driverID).toString(),
box.read(BoxName.emailDriver).toString(),
);
} else {
await _sendOtp(randomNumber, smsEgyptController);
}
} else {
await _sendOtp(randomNumber, smsEgyptController);
}
} else { } else {
Get.snackbar('Phone Number wrong'.tr, '', _showErrorMessage('Phone Number is not Egypt phone '.tr);
backgroundColor: AppColor.redColor);
} }
} }
isLoading = false;
update();
} else {
_showCooldownMessage();
} }
}
// Check if the resend OTP request is allowed (5 minutes cooldown)
bool _isOtpResendAllowed() {
if (lastOtpSentTime == null) return true;
final int elapsedTime =
DateTime.now().difference(lastOtpSentTime!).inSeconds;
return elapsedTime >= otpResendInterval;
}
// Show message when user tries to resend OTP too soon
void _showCooldownMessage() {
int remainingTime = otpResendInterval -
DateTime.now().difference(lastOtpSentTime!).inSeconds;
Get.snackbar(
'Please wait ${remainingTime ~/ 60}:${(remainingTime % 60).toString().padLeft(2, '0')} minutes before requesting again',
'',
backgroundColor: AppColor.redColor,
);
}
// Check if the phone number has been verified, and send OTP if not verified
_checkAndSendOtp(String phoneNumber) async {
var responseChecker = await CRUD().post(
link: AppLink.checkPhoneNumberISVerfiedDriver,
payload: {
'phone_number': '+2$phoneNumber',
},
);
if (responseChecker != 'failure') {
var responseData = jsonDecode(responseChecker);
if (_isPhoneVerified(responseData)) {
_handleAlreadyVerified();
} else {
await _sendOtpAndSms(phoneNumber);
}
} else {
await _sendOtpAndSms(phoneNumber);
}
}
// Check if the phone number is already verified
bool _isPhoneVerified(dynamic responseData) {
return responseData['message'][0]['is_verified'].toString() == '1';
}
// Handle case where phone number is already verified
_handleAlreadyVerified() {
Get.snackbar(
'Phone number is already verified'.tr,
'',
backgroundColor: AppColor.greenColor,
);
box.write(BoxName.phoneVerified, '1');
box.write(BoxName.phone, '+2${phoneController.text}');
Get.put(LoginDriverController()).loginUsingCredentials(
box.read(BoxName.driverID).toString(),
box.read(BoxName.emailDriver).toString(),
);
}
// Send OTP and SMS
_sendOtpAndSms(String phoneNumber) async {
SmsEgyptController smsEgyptController = Get.put(SmsEgyptController());
int randomNumber = Random().nextInt(100000) + 1;
await CRUD().post(
link: AppLink.sendVerifyOtpMessage,
payload: {
'phone_number': '+2$phoneNumber',
'token_code': randomNumber.toString(),
'driverId': box.read(BoxName.driverID),
'email': box.read(BoxName.emailDriver),
},
);
// Get.snackbar('', '');
// await smsEgyptController.sendSmsEgypt(phoneNumber, randomNumber.toString());
lastOtpSentTime = DateTime.now(); // Update the last OTP sent time
isSent = true;
isLoading = false; isLoading = false;
update(); update();
} }
_sendOtp(int randomNumber, SmsEgyptController smsEgyptController) async { // Show error message in case of invalid phone number
await CRUD().post(link: AppLink.sendVerifyOtpMessage, payload: { void _showErrorMessage(String message) {
'phone_number': '+2${phoneController.text}', Get.snackbar(
'token_code': randomNumber.toString(), message.tr,
"driverId": box.read(BoxName.driverID), '',
"email": box.read(BoxName.emailDriver), backgroundColor: AppColor.redColor,
}); );
await smsEgyptController.sendSmsEgypt(
phoneController.text.toString(), randomNumber.toString());
// Save the current time as the last OTP time
box.write(BoxName.lastOtpTime, DateTime.now());
isSent = true;
isLoading = false;
update();
} }
verifySMSCode() async { verifySMSCode() async {

View File

@@ -0,0 +1,30 @@
import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter_facebook_auth/flutter_facebook_auth.dart';
class FacebookSignIn {
Future<UserCredential?> signInWithFacebook() async {
final LoginResult result = await FacebookAuth.instance.login();
if (result.status == LoginStatus.success) {
// Create a credential from the access token
final OAuthCredential credential =
FacebookAuthProvider.credential(result.accessToken!.tokenString);
// Once signed in, return the UserCredential
return await FirebaseAuth.instance.signInWithCredential(credential);
}
return null;
}
Future<void> signOut() async {
try {
await FacebookAuth.instance.logOut();
print('Facebook Sign Out Successful');
} catch (e) {
print('Error during Facebook Sign Out: $e');
}
}
Future<bool> isSignedIn() async {
final accessToken = await FacebookAuth.instance.accessToken;
return accessToken != null;
}
}

View File

@@ -1,6 +1,8 @@
import 'package:SEFER/constant/box_name.dart'; import 'package:SEFER/constant/box_name.dart';
import 'package:SEFER/constant/colors.dart'; import 'package:SEFER/constant/colors.dart';
import 'package:SEFER/constant/links.dart';
import 'package:SEFER/controller/auth/captin/login_captin_controller.dart'; import 'package:SEFER/controller/auth/captin/login_captin_controller.dart';
import 'package:SEFER/controller/functions/crud.dart';
import 'package:SEFER/main.dart'; import 'package:SEFER/main.dart';
import 'package:SEFER/views/auth/captin/cards/sms_signup.dart'; import 'package:SEFER/views/auth/captin/cards/sms_signup.dart';
import 'package:SEFER/views/home/on_boarding_page.dart'; import 'package:SEFER/views/home/on_boarding_page.dart';
@@ -83,7 +85,7 @@ class GoogleSignInHelper {
// return null; // return null;
// } // }
// } // }
static Future<GoogleSignInAccount?> signInFromLogin() async { Future<GoogleSignInAccount?> signInFromLogin() async {
try { try {
final GoogleSignInAccount? googleUser = await _googleSignIn.signIn(); final GoogleSignInAccount? googleUser = await _googleSignIn.signIn();
@@ -106,11 +108,27 @@ class GoogleSignInHelper {
} catch (error) { } catch (error) {
Get.snackbar('Google Sign-In error', '$error', Get.snackbar('Google Sign-In error', '$error',
backgroundColor: AppColor.redColor); backgroundColor: AppColor.redColor);
addError(error.toString(), 'GoogleSignInAccount?> signInFromLogin()');
print('Google Sign-In error: $error'); print('Google Sign-In error: $error');
return null; return null;
} }
} }
addError(String error, where) async {
CRUD().post(link: AppLink.addError, payload: {
'error': error.toString(), // Example error description
'userId': box.read(BoxName.driverID) ??
box.read(BoxName.passengerID), // Example user ID
'userType': box.read(BoxName.driverID) != null
? 'Driver'
: 'passenger', // Example user type
'phone': box.read(BoxName.phone) ??
box.read(BoxName.phoneDriver), // Example phone number
'device': where
});
}
// Method to handle Google Sign-Out // Method to handle Google Sign-Out
static Future<void> signOut() async { static Future<void> signOut() async {
try { try {

View File

@@ -135,7 +135,7 @@ class FirebaseMessagesController extends GetxController {
}); });
} else if (message.notification!.title == 'Cancel Trip') { } else if (message.notification!.title == 'Cancel Trip') {
if (Platform.isAndroid) { if (Platform.isAndroid) {
NotificationController().showNotification( NotificationController1().showNotification(
'Cancel Trip'.tr, 'Passenger Cancel Trip'.tr, 'cancel', ''); 'Cancel Trip'.tr, 'Passenger Cancel Trip'.tr, 'cancel', '');
} }
cancelTripDialog(); cancelTripDialog();
@@ -143,7 +143,7 @@ class FirebaseMessagesController extends GetxController {
var myListString = message.data['DriverList']; var myListString = message.data['DriverList'];
var driverList = jsonDecode(myListString) as List<dynamic>; var driverList = jsonDecode(myListString) as List<dynamic>;
if (Platform.isAndroid) { if (Platform.isAndroid) {
NotificationController() NotificationController1()
.showNotification('VIP Order'.tr, '', 'order', ''); .showNotification('VIP Order'.tr, '', 'order', '');
} }
MyDialog().getDialog('VIP Order'.tr, 'midTitle', () { MyDialog().getDialog('VIP Order'.tr, 'midTitle', () {
@@ -159,13 +159,13 @@ class FirebaseMessagesController extends GetxController {
} else if (message.notification!.title == 'Cancel') { } else if (message.notification!.title == 'Cancel') {
cancelTripDialog1(); cancelTripDialog1();
} else if (message.notification!.title! == 'token change') { } else if (message.notification!.title! == 'token change') {
// NotificationController() NotificationController1()
// .showNotification('token change'.tr, 'token change', 'cancel'); .showNotification('token change'.tr, 'token change', 'cancel', '');
// GoogleSignInHelper.signOut(); // GoogleSignInHelper.signOut();
GoogleSignInHelper.signOut(); GoogleSignInHelper.signOut();
} else if (message.notification!.title! == 'message From passenger') { } else if (message.notification!.title! == 'message From passenger') {
if (Platform.isAndroid) { if (Platform.isAndroid) {
NotificationController() NotificationController1()
.showNotification('message From passenger'.tr, ''.tr, 'tone2', ''); .showNotification('message From passenger'.tr, ''.tr, 'tone2', '');
} }
passengerDialog(message.notification!.body!); passengerDialog(message.notification!.body!);

View File

@@ -61,7 +61,7 @@ class NotificationController extends GetxController {
priority: Priority.high, priority: Priority.high,
styleInformation: bigTextStyleInformation, styleInformation: bigTextStyleInformation,
playSound: true, playSound: true,
sound: RawResourceAndroidNotificationSound(tone), sound: RawResourceAndroidNotificationSound(tone == '' ? 'ding' : tone),
// audioAttributesUsage: AudioAttributesUsage.alarm, // audioAttributesUsage: AudioAttributesUsage.alarm,
visibility: NotificationVisibility.public, visibility: NotificationVisibility.public,
autoCancel: false, autoCancel: false,

View File

@@ -16,6 +16,7 @@ import '../../constant/colors.dart';
import '../../constant/info.dart'; import '../../constant/info.dart';
import '../../constant/links.dart'; import '../../constant/links.dart';
import '../../main.dart'; import '../../main.dart';
import '../../print.dart';
import '../functions/crud.dart'; import '../functions/crud.dart';
import '../functions/toast.dart'; import '../functions/toast.dart';
import 'paymob/paymob_wallet.dart'; import 'paymob/paymob_wallet.dart';
@@ -588,25 +589,31 @@ class PaymentController extends GetxController {
billingData: PaymobBillingDataWallet(), billingData: PaymobBillingDataWallet(),
onPayment: (PaymobResponseWallet response) {}, onPayment: (PaymobResponseWallet response) {},
); );
// Log.print('message: ${response!.message}');
if (response!.success == true && response.responseCode == '200') { // Log.print('responseCode: ${response.responseCode}');
Get.defaultDialog( // Log.print('success: ${response.success}');
barrierDismissible: false, // Log.print('transactionID: ${response.transactionID}');
title: 'Payment Successful'.tr, if (response!.responseCode == '200' && response.success == true) {
titleStyle: AppStyle.title, // Log.print('transactionID wewer: ${response.transactionID}');
content: Text( Toast.show(context, 'Payment Successful'.tr, AppColor.greenColor);
'The payment was approved.'.tr, method();
style: AppStyle.title, // Get.defaultDialog(
), // barrierDismissible: false,
confirm: MyElevatedButton( // title: 'Payment Successful'.tr,
title: 'OK'.tr, // titleStyle: AppStyle.title,
kolor: AppColor.greenColor, // content: Text(
onPressed: () async { // 'The payment was approved.'.tr,
Get.back(); // style: AppStyle.title,
method(); // ),
}, // confirm: MyElevatedButton(
), // title: 'OK'.tr,
); // kolor: AppColor.greenColor,
// onPressed: () async {
// Get.back();
// method();
// },
// ),
// );
} else { } else {
Get.defaultDialog( Get.defaultDialog(
barrierDismissible: false, barrierDismissible: false,

View File

@@ -313,6 +313,70 @@ class PaymobIFrameWallet extends StatefulWidget {
State<PaymobIFrameWallet> createState() => _PaymobIFrameState(); State<PaymobIFrameWallet> createState() => _PaymobIFrameState();
} }
// class _PaymobIFrameState extends State<PaymobIFrameWallet> {
// WebViewController? controller;
// @override
// void initState() {
// controller = WebViewController()
// ..setJavaScriptMode(JavaScriptMode.unrestricted)
// ..setNavigationDelegate(
// NavigationDelegate(
// onNavigationRequest: (NavigationRequest request) {
// Log.print('request.url: ${request.url}');
// if (request.url.contains('txn_response_code') &&
// request.url.contains('success') &&
// request.url.contains('id')) {
// final params = _getParamFromURL(request.url);
// final response = PaymobResponseWallet.fromJson(params);
// if (widget.onPayment != null) {
// widget.onPayment!(response);
// }
// Navigator.pop(context, response);
// return NavigationDecision.prevent;
// }
// return NavigationDecision.navigate;
// },
// ),
// )
// ..loadRequest(Uri.parse(widget.redirectURL));
// super.initState();
// }
// @override
// Widget build(BuildContext context) {
// return Scaffold(
// body: controller == null
// ? const Center(
// child: CircularProgressIndicator.adaptive(),
// )
// : SafeArea(
// child: WebViewWidget(
// controller: controller!,
// ),
// ),
// );
// }
// Map<String, dynamic> _getParamFromURL(String url) {
// final uri = Uri.parse(url);
// final queryParams = uri.queryParameters;
// final data = <String, dynamic>{};
// queryParams.forEach((key, value) {
// if (key.contains('.')) {
// final parts = key.split('.');
// data.putIfAbsent(parts.first, () => <String, dynamic>{});
// (data[parts.first] as Map<String, dynamic>)[parts.last] = value;
// } else {
// data[key] = value;
// }
// });
// return data;
// }
// }
class _PaymobIFrameState extends State<PaymobIFrameWallet> { class _PaymobIFrameState extends State<PaymobIFrameWallet> {
WebViewController? controller; WebViewController? controller;
@@ -323,16 +387,23 @@ class _PaymobIFrameState extends State<PaymobIFrameWallet> {
..setNavigationDelegate( ..setNavigationDelegate(
NavigationDelegate( NavigationDelegate(
onNavigationRequest: (NavigationRequest request) { onNavigationRequest: (NavigationRequest request) {
Log.print('request.url: ${request.url}');
if (request.url.contains('txn_response_code') && if (request.url.contains('txn_response_code') &&
// request.url.contains('successfully') &&
request.url.contains('success') && request.url.contains('success') &&
request.url.contains('id')) { request.url.contains('id')) {
final params = _getParamFromURL(request.url); final params = _getParamFromURL(request.url);
final response = PaymobResponseWallet.fromJson(params); final response = PaymobResponseWallet.fromJson(params);
if (widget.onPayment != null) { if (widget.onPayment != null) {
widget.onPayment!(response); widget.onPayment!(response);
} }
Navigator.pop(context, response); Navigator.pop(context, response);
// Show a dialog after successful payment
// _showSuccessDialog(response);
return NavigationDecision.prevent; return NavigationDecision.prevent;
} }
return NavigationDecision.navigate; return NavigationDecision.navigate;
@@ -375,4 +446,24 @@ class _PaymobIFrameState extends State<PaymobIFrameWallet> {
return data; return data;
} }
void _showSuccessDialog(PaymobResponseWallet response) {
showDialog(
context: context,
builder: (BuildContext context) {
return AlertDialog(
title: Text('Payment Successful'),
content: Text('Transaction ID: EGP'),
actions: <Widget>[
TextButton(
onPressed: () {
Navigator.of(context).pop(); // Close the dialog
},
child: Text('OK'),
),
],
);
},
);
}
} }

View File

@@ -7,6 +7,7 @@ import 'package:SEFER/views/home/Captin/orderCaptin/order_request_page.dart';
import 'package:firebase_core/firebase_core.dart'; import 'package:firebase_core/firebase_core.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:flutter_facebook_auth/flutter_facebook_auth.dart';
import 'package:flutter_overlay_window/flutter_overlay_window.dart'; import 'package:flutter_overlay_window/flutter_overlay_window.dart';
import 'package:flutter_secure_storage/flutter_secure_storage.dart'; import 'package:flutter_secure_storage/flutter_secure_storage.dart';
import 'package:flutter_stripe/flutter_stripe.dart'; import 'package:flutter_stripe/flutter_stripe.dart';
@@ -129,14 +130,14 @@ void main() async {
await FirebaseMessagesController().requestFirebaseMessagingPermission(); await FirebaseMessagesController().requestFirebaseMessagingPermission();
FirebaseMessaging.onBackgroundMessage(backgroundMessageHandler); FirebaseMessaging.onBackgroundMessage(backgroundMessageHandler);
// NotificationController1().initNotifications();
NotificationController().initNotifications(); NotificationController().initNotifications();
NotificationController1().initNotifications();
await Future.wait([ await Future.wait([
FirebaseMessagesController().getNotificationSettings(), FirebaseMessagesController().getNotificationSettings(),
FirebaseMessagesController().getToken(), FirebaseMessagesController().getToken(),
]); ]);
// await FacebookAuth.instance.init();
SystemChrome.setPreferredOrientations([ SystemChrome.setPreferredOrientations([
DeviceOrientation.portraitUp, DeviceOrientation.portraitUp,
DeviceOrientation.portraitDown, DeviceOrientation.portraitDown,
@@ -145,6 +146,7 @@ void main() async {
PaymobPayment.instance.initialize( PaymobPayment.instance.initialize(
apiKey: AK.payMobApikey, apiKey: AK.payMobApikey,
// integrationID: 4556055,
integrationID: int.parse(AK.integrationIdPayMob), integrationID: int.parse(AK.integrationIdPayMob),
userTokenExpiration: 200, userTokenExpiration: 200,
iFrameID: 837992, iFrameID: 837992,
@@ -152,6 +154,7 @@ void main() async {
PaymobPaymentWallet.instance.initialize( PaymobPaymentWallet.instance.initialize(
apiKey: AK.payMobApikey, apiKey: AK.payMobApikey,
integrationID: int.parse(AK.integrationIdPayMobWallet), integrationID: int.parse(AK.integrationIdPayMobWallet),
// integrationID: 4556056,
userTokenExpiration: 200, userTokenExpiration: 200,
iFrameID: 837992, iFrameID: 837992,
); );

View File

@@ -1,5 +1,6 @@
import 'dart:io'; import 'dart:io';
import 'package:SEFER/controller/auth/facebook_login.dart';
import 'package:firebase_auth/firebase_auth.dart'; import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/gestures.dart'; import 'package:flutter/gestures.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
@@ -210,10 +211,20 @@ class LoginCaptin extends StatelessWidget {
MyElevatedButton( MyElevatedButton(
title: 'Sign In by Google'.tr, title: 'Sign In by Google'.tr,
onPressed: () async { onPressed: () async {
await GoogleSignInHelper.signInFromLogin(); await GoogleSignInHelper().signInFromLogin();
}, },
kolor: AppColor.redColor, kolor: AppColor.redColor,
), ),
// Platform.isAndroid
// ? MyElevatedButton(
// title: 'Sign In by Facebook'.tr,
// onPressed: () async {
// await FacebookSignIn()
// .signInWithFacebook();
// },
// kolor: AppColor.blueColor,
// )
// : const SizedBox(),
!Platform.isAndroid !Platform.isAndroid
? MyElevatedButton( ? MyElevatedButton(
title: 'Sign In by Apple'.tr, title: 'Sign In by Apple'.tr,

View File

@@ -3,6 +3,7 @@ import 'package:SEFER/controller/firebase/local_notification.dart';
import 'package:SEFER/main.dart'; import 'package:SEFER/main.dart';
import 'package:SEFER/views/auth/captin/cards/egypt_card_a_i.dart'; import 'package:SEFER/views/auth/captin/cards/egypt_card_a_i.dart';
import 'package:SEFER/views/auth/captin/cards/sms_signup.dart'; import 'package:SEFER/views/auth/captin/cards/sms_signup.dart';
import 'package:SEFER/views/auth/captin/login_captin.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_font_icons/flutter_font_icons.dart'; import 'package:flutter_font_icons/flutter_font_icons.dart';
import 'package:bubble_head/bubble.dart'; import 'package:bubble_head/bubble.dart';
@@ -276,20 +277,20 @@ GetBuilder<HomeCaptainController> leftMainMenuCaptainIcons() {
// return IconButton( // return IconButton(
// onPressed: () async { // onPressed: () async {
// // FirebaseMessagesController().sendNotificationToAnyWithoutData( // // FirebaseMessagesController().sendNotificationToAnyWithoutData(
// // 'Order'.tr, // 'Order'.tr,
// // 'from: ', // 'from: ',
// // // jsonDecode(value)['message'].toString(), // // jsonDecode(value)['message'].toString(),
// // 'dqK5wNrPTr20HQ8qa5KsgL:APA91bHwPW_XzCIxQtg_IkJmHg1JRd8NRMquvsgedBaHAIgErTs6Uzpw1IX0EIJqkTaZq5dxd1u2z7NVdLlvcmEzrpjjWt1pUsZaa5UU7Cpx6hUzJMUdXvhNlAYFGklM8bWUG4ZXSRf1', // 'dqK5wNrPTr20HQ8qa5KsgL:APA91bHwPW_XzCIxQtg_IkJmHg1JRd8NRMquvsgedBaHAIgErTs6Uzpw1IX0EIJqkTaZq5dxd1u2z7NVdLlvcmEzrpjjWt1pUsZaa5UU7Cpx6hUzJMUdXvhNlAYFGklM8bWUG4ZXSRf1',
// // 'order.wav'); // 'order.wav');
// // NotificationController().showNotification( // NotificationController1().showNotification(
// // 'Order'.tr, // 'sdf'.tr,
// // 'We regret to inform you that another driver has accepted this order.' // 'We regret to inform you that another driver has accepted this order.'
// // .tr, // .tr,
// // 'order', // '',
// // ''); // '');
// // requestLocationPermission(); // requestLocationPermission();
// // Get.to(SmsSignupEgypt()); // Get.to(() => LoginCaptin());
// // print(box.read(BoxName.tokenDriver)); // print(box.read(BoxName.tokenDriver));
// }, // },
// icon: const Icon( // icon: const Icon(
// FontAwesome5.closed_captioning, // FontAwesome5.closed_captioning,

View File

@@ -437,8 +437,12 @@ class PassengerInfoWindow extends StatelessWidget {
title: 'I arrive you'.tr, title: 'I arrive you'.tr,
kolor: AppColor.yellowColor, kolor: AppColor.yellowColor,
onPressed: () async { onPressed: () async {
if (controller // Await the result of the distance calculation
.calculateDistanceBetweenDriverAndPassengerLocation() < double distanceToArrive =
await controller
.calculateDistanceBetweenDriverAndPassengerLocation();
if (distanceToArrive <
40) { 40) {
FirebaseMessagesController() FirebaseMessagesController()
.sendNotificationToPassengerToken( .sendNotificationToPassengerToken(

View File

@@ -106,7 +106,7 @@ class PointsCaptain extends StatelessWidget {
.getCaptainWalletFromBuyPoints(); .getCaptainWalletFromBuyPoints();
}); });
} }
Get.back(); // Get.back();
})); }));
}, },
), ),

View File

@@ -7,6 +7,7 @@ import Foundation
import audio_session import audio_session
import device_info_plus import device_info_plus
import facebook_auth_desktop
import file_selector_macos import file_selector_macos
import firebase_auth import firebase_auth
import firebase_core import firebase_core
@@ -31,6 +32,7 @@ import wakelock_plus
func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
AudioSessionPlugin.register(with: registry.registrar(forPlugin: "AudioSessionPlugin")) AudioSessionPlugin.register(with: registry.registrar(forPlugin: "AudioSessionPlugin"))
DeviceInfoPlusMacosPlugin.register(with: registry.registrar(forPlugin: "DeviceInfoPlusMacosPlugin")) DeviceInfoPlusMacosPlugin.register(with: registry.registrar(forPlugin: "DeviceInfoPlusMacosPlugin"))
FacebookAuthDesktopPlugin.register(with: registry.registrar(forPlugin: "FacebookAuthDesktopPlugin"))
FileSelectorPlugin.register(with: registry.registrar(forPlugin: "FileSelectorPlugin")) FileSelectorPlugin.register(with: registry.registrar(forPlugin: "FileSelectorPlugin"))
FLTFirebaseAuthPlugin.register(with: registry.registrar(forPlugin: "FLTFirebaseAuthPlugin")) FLTFirebaseAuthPlugin.register(with: registry.registrar(forPlugin: "FLTFirebaseAuthPlugin"))
FLTFirebaseCorePlugin.register(with: registry.registrar(forPlugin: "FLTFirebaseCorePlugin")) FLTFirebaseCorePlugin.register(with: registry.registrar(forPlugin: "FLTFirebaseCorePlugin"))

View File

@@ -409,6 +409,14 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.0.5" version: "2.0.5"
facebook_auth_desktop:
dependency: transitive
description:
name: facebook_auth_desktop
sha256: "219d559a33891e937c1913430505eae01fb946cb35729167bbdc747e3ebbd9ff"
url: "https://pub.dev"
source: hosted
version: "2.1.1"
fake_async: fake_async:
dependency: transitive dependency: transitive
description: description:
@@ -574,6 +582,30 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.1.8" version: "1.1.8"
flutter_facebook_auth:
dependency: "direct main"
description:
name: flutter_facebook_auth
sha256: faa92fb7626c230837f30d02de7d92b6af334b77ba744867c63545d4ad7e171f
url: "https://pub.dev"
source: hosted
version: "7.1.0"
flutter_facebook_auth_platform_interface:
dependency: transitive
description:
name: flutter_facebook_auth_platform_interface
sha256: e04b8dbfa77702bea45a79993163ad5d20b2c0084109bec591fdc2b9ee505779
url: "https://pub.dev"
source: hosted
version: "6.1.2"
flutter_facebook_auth_web:
dependency: transitive
description:
name: flutter_facebook_auth_web
sha256: "8a6890a98522604169ca9f958d7189c9f579dbf05ba4d3d7adf26eca4c4c4c93"
url: "https://pub.dev"
source: hosted
version: "6.1.1"
flutter_font_icons: flutter_font_icons:
dependency: "direct main" dependency: "direct main"
description: description:

View File

@@ -85,6 +85,7 @@ dependencies:
flutter_contacts: ^1.1.8 flutter_contacts: ^1.1.8
flutter_overlay_window: ^0.4.4 flutter_overlay_window: ^0.4.4
googleapis_auth: ^1.6.0 googleapis_auth: ^1.6.0
flutter_facebook_auth: ^7.1.0
# dash_bubble: ^2.0.0 # dash_bubble: ^2.0.0
# bubble_head: ^0.0.4 # bubble_head: ^0.0.4
# google_mlkit_face_detection: ^0.11.0 # google_mlkit_face_detection: ^0.11.0