This commit is contained in:
Hamza-Ayed
2024-11-17 22:13:31 +02:00
parent e8c72d79a9
commit 5aeb3cf685
45 changed files with 856 additions and 284 deletions

View File

@@ -54,8 +54,8 @@ android {
// For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration.
minSdk = 23
targetSdk = flutter.targetSdkVersion
versionCode = 117
versionName = '1.5.17'
versionCode = 120
versionName = '1.5.20'
multiDexEnabled =true
}

View File

@@ -555,9 +555,10 @@
BUNDLE_LOADER = "$(TEST_HOST)";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_TEAM = 63CVT8G5P8;
GENERATE_INFOPLIST_FILE = YES;
MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = com.mobileapp.store.ride.RunnerTests;
PRODUCT_BUNDLE_IDENTIFIER = com.mobileapp.store.ride;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
@@ -573,9 +574,10 @@
BUNDLE_LOADER = "$(TEST_HOST)";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_TEAM = 63CVT8G5P8;
GENERATE_INFOPLIST_FILE = YES;
MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = com.mobileapp.store.ride.RunnerTests;
PRODUCT_BUNDLE_IDENTIFIER = com.mobileapp.store.ride;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 5.0;
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner";
@@ -589,9 +591,10 @@
BUNDLE_LOADER = "$(TEST_HOST)";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_TEAM = 63CVT8G5P8;
GENERATE_INFOPLIST_FILE = YES;
MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = com.mobileapp.store.ride.RunnerTests;
PRODUCT_BUNDLE_IDENTIFIER = com.mobileapp.store.ride;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 5.0;
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner";

File diff suppressed because one or more lines are too long

View File

@@ -35,7 +35,7 @@
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>77</string>
<string>79</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleURLTypes</key>
@@ -50,7 +50,7 @@
</dict>
</array>
<key>CFBundleVersion</key>
<string>4.0.77</string>
<string>4.0.79</string>
<key>FirebaseAppDelegateProxyEnabled</key>
<string>NO</string>
<key>GMSApiKey</key>

View File

@@ -74,7 +74,7 @@ class AppLink {
//-----------------ridessss------------------
static String addRides = "$ride/rides/add.php";
static String getRides = "$ride/rides/get.php";
static String getMishwari = "$ride/ride/mishwari/get.php";
static String getMishwari = "$ride/mishwari/get.php";
static String getTripCountByCaptain = "$ride/rides/getTripCountByCaptain.php";
static String getRideOrderID = "$ride/rides/getRideOrderID.php";
static String getRideStatus = "$ride/rides/getRideStatus.php";
@@ -196,14 +196,17 @@ class AppLink {
// =====================================
static String addRateToPassenger = "$ride/rate/add.php";
static String addRateToDriver = "$ride/rate/addRateToDriver.php";
static String addRateApp = "$ride/rate/add_rate_app.php";
static String sendEmailRateingApp =
"https://api.sefer.live/sefer/ride/rate/sendEmailRateingApp.php";
static String getDriverRate = "$ride/rate/getDriverRate.php";
static String getPassengerRate = "$ride/rate/getPassengerRate.php";
////////////////emails ============//
static String sendEmailToPassengerForTripDetails =
"$ride/rides/emailToPassengerTripDetail.php";
"https://api.sefer.live/sefer/ride/rides/emailToPassengerTripDetail.php";
static String sendEmailToDrivertransaction =
"$seferPaymentServer0/Admin/sendEmailToDrivertransaction.php";
"https://api.sefer.live/sefer/Admin/sendEmailToDrivertransaction.php";
// "https://api.sefer.live/sefer/Admin/sendEmailToDrivertransaction.php";
// ===========================================
static String pathImage = "$server/upload/types/";

View File

@@ -14,6 +14,7 @@ import 'package:share/share.dart';
import '../../../main.dart';
import '../../../print.dart';
import '../../../views/widgets/error_snakbar.dart';
import '../../functions/launch.dart';
import '../../notification/notification_captain_controller.dart';
@@ -103,10 +104,11 @@ Download the SEFER app now and enjoy your ride!
// TODO: Implement the actual server upload logic here
// Simulating a server request
await Future.delayed(Duration(seconds: 2));
Get.snackbar('Success'.tr,
mySnackbarSuccess(
'${selectedContacts.length} contacts saved to server'.tr);
} catch (e) {
Get.snackbar('Error'.tr,
mySnackeBarError(
'An error occurred while saving contacts to server: $e'.tr);
}
}
@@ -134,16 +136,13 @@ Download the SEFER app now and enjoy your ride!
update();
if (contacts.isEmpty) {
Get.snackbar('No contacts available'.tr,
'Please add contacts to your phone.'.tr);
mySnackeBarError('Please add contacts to your phone.'.tr);
}
} else {
Get.snackbar('Permission denied'.tr,
'Contact permission is required to pick contacts'.tr);
mySnackeBarError('Contact permission is required to pick contacts'.tr);
}
} catch (e) {
Get.snackbar(
'Error'.tr, 'An error occurred while picking contacts: $e'.tr);
mySnackeBarError('An error occurred while picking contacts: $e'.tr);
}
}
@@ -267,7 +266,7 @@ Download the SEFER app now and enjoy your ride!
void sendInvite() async {
if (invitePhoneController.text.isEmpty) {
Get.snackbar('Error', 'Please enter an phone address'.tr);
mySnackeBarError('Please enter an phone address'.tr);
return;
}
@@ -281,8 +280,7 @@ Download the SEFER app now and enjoy your ride!
if (response != 'failure') {
var d = jsonDecode(response);
Get.snackbar('Success', 'Invite sent successfully'.tr);
mySnackbarSuccess('Invite sent successfully'.tr);
String message = '${'*SEFER DRIVER CODE*'.tr}\n\n'
'${"Use this code in registration".tr}\n'
'${"To get a gift for both".tr}\n\n'
@@ -297,18 +295,14 @@ Download the SEFER app now and enjoy your ride!
invitePhoneController.clear();
} else {
Get.snackbar('Error'.tr, "Invite code already used".tr,
backgroundColor: AppColor.redColor,
duration: const Duration(seconds: 4));
mySnackeBarError("Invite code already used".tr);
}
// } catch (e) {
// Get.snackbar('Error', 'An error occurred'.tr);
// }
}
void sendInviteToPassenger() async {
if (invitePhoneController.text.isEmpty) {
Get.snackbar('Error', 'Please enter an phone address'.tr);
mySnackeBarError('Please enter an phone address'.tr);
return;
}
@@ -323,7 +317,8 @@ Download the SEFER app now and enjoy your ride!
if (response != 'failure') {
var d = jsonDecode(response);
Get.snackbar('Success', 'Invite sent successfully'.tr);
mySnackbarSuccess('Invite sent successfully'.tr);
String message = '${'*SEFER APP CODE*'.tr}\n\n'
'${"Use this code in registration".tr}\n'
@@ -339,13 +334,10 @@ Download the SEFER app now and enjoy your ride!
invitePhoneController.clear();
} else {
Get.snackbar('Error'.tr, "Invite code already used".tr,
backgroundColor: AppColor.redColor,
duration: const Duration(seconds: 4));
mySnackeBarError(
"Invite code already used".tr,
);
}
// } catch (e) {
// Get.snackbar('Error', 'An error occurred'.tr);
// }
}
}

View File

@@ -1,12 +1,10 @@
import 'dart:convert';
import 'dart:math';
import 'package:SEFER/constant/colors.dart';
import 'package:SEFER/controller/functions/location_background_controller.dart';
import 'package:SEFER/print.dart';
import 'package:SEFER/views/auth/captin/cards/sms_signup.dart';
import 'package:SEFER/views/auth/captin/login_captin.dart';
import 'package:SEFER/views/widgets/elevated_btn.dart';
import 'package:SEFER/views/widgets/error_snakbar.dart';
import 'package:flutter/material.dart';
import 'package:flutter_secure_storage/flutter_secure_storage.dart';
import 'package:get/get.dart';
@@ -164,7 +162,7 @@ class LoginDriverController extends GetxController {
box.write(BoxName.carTypeOfDriver, 'Pink Bike');
}
} else if (int.parse(jsonDecoeded['data'][0]['year'].toString()) >
2017) {
2016) {
if (jsonDecoeded['data'][0]['gender'].toString() != 'Male') {
box.write(BoxName.carTypeOfDriver, 'Lady');
} else {
@@ -172,7 +170,7 @@ class LoginDriverController extends GetxController {
}
} else if (int.parse(jsonDecoeded['data'][0]['year'].toString()) >
2002 &&
int.parse(jsonDecoeded['data'][0]['year'].toString()) < 2017) {
int.parse(jsonDecoeded['data'][0]['year'].toString()) < 2016) {
box.write(BoxName.carTypeOfDriver, 'Speed');
} else if (int.parse(jsonDecoeded['data'][0]['year'].toString()) <
2002) {
@@ -204,7 +202,7 @@ class LoginDriverController extends GetxController {
'token': box.read(BoxName.tokenDriver),
'captain_id': box.read(BoxName.driverID).toString()
});
CRUD().post(
await CRUD().post(
link:
"${AppLink.seferAlexandriaServer}/ride/firebase/addDriver.php",
payload: {
@@ -212,30 +210,29 @@ class LoginDriverController extends GetxController {
'captain_id':
box.read(BoxName.driverID).toString()
});
CRUD().post(
link:
"${AppLink.seferGizaServer}/ride/firebase/addDriver.php",
payload: {
'token': box.read(BoxName.tokenDriver),
'captain_id':
box.read(BoxName.driverID).toString()
});
// await CRUD().post(
// link:
// "${AppLink.seferGizaServer}/ride/firebase/addDriver.php",
// payload: {
// 'token': box.read(BoxName.tokenDriver),
// 'captain_id':
// box.read(BoxName.driverID).toString()
// });
Get.back();
}));
}
}
Get.off(() => HomeCaptain());
// Get.off(() => LoginCaptin());
} else {
Get.offAll(() => SmsSignupEgypt());
// Get.snackbar(jsonDecoeded['status'], jsonDecoeded['data'],
// backgroundColor: Colors.redAccent);
isloading = false;
update();
}
} else {
Get.snackbar('failure'.tr, '', backgroundColor: AppColor.redColor);
mySnackbarSuccess('');
isloading = false;
update();
}
@@ -263,7 +260,6 @@ class LoginDriverController extends GetxController {
isloading = false;
update();
// Get.snackbar('Failure', '', backgroundColor: Colors.red);
} else {
var jsonDecoeded = jsonDecode(res);
if (jsonDecoeded.isNotEmpty) {
@@ -321,7 +317,7 @@ class LoginDriverController extends GetxController {
'change device'.tr,
jsonDecode(token)['data'][0]['token'].toString(),
[],
'promo.wav');
'ding.wav');
Get.defaultDialog(
title: 'you will use this device?'.tr,
middleText: '',
@@ -333,7 +329,7 @@ class LoginDriverController extends GetxController {
'token': box.read(BoxName.tokenDriver),
'captain_id': box.read(BoxName.driverID).toString()
});
CRUD().post(
await CRUD().post(
link:
"${AppLink.seferAlexandriaServer}/ride/firebase/addDriver.php",
payload: {
@@ -341,7 +337,7 @@ class LoginDriverController extends GetxController {
'captain_id':
box.read(BoxName.driverID).toString()
});
CRUD().post(
await CRUD().post(
link:
"${AppLink.seferGizaServer}/ride/firebase/addDriver.php",
payload: {
@@ -358,13 +354,13 @@ class LoginDriverController extends GetxController {
// Get.off(() => LoginCaptin());
} else {
Get.offAll(() => SmsSignupEgypt());
// Get.snackbar(jsonDecoeded['status'], jsonDecoeded['data'],
// backgroundColor: Colors.redAccent);
isloading = false;
update();
}
} else {
Get.snackbar('failure'.tr, '', backgroundColor: AppColor.redColor);
mySnackeBarError('');
isloading = false;
update();
}

View File

@@ -4,6 +4,7 @@ import 'dart:math';
import 'package:SEFER/controller/auth/captin/login_captin_controller.dart';
import 'package:SEFER/views/auth/captin/cards/egypt_card_a_i.dart';
import 'package:SEFER/views/auth/captin/register_captin.dart';
import 'package:SEFER/views/widgets/error_snakbar.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:SEFER/constant/box_name.dart';
@@ -152,8 +153,9 @@ class RegisterCaptainController extends GetxController {
update();
}
} else {
Get.snackbar('Phone Number wrong'.tr, '',
backgroundColor: AppColor.redColor);
mySnackeBarError(
'Phone Number wrong'.tr,
);
}
}
}
@@ -235,11 +237,7 @@ class RegisterCaptainController extends GetxController {
// Handle case where phone number is already verified
_handleAlreadyVerified() {
Get.snackbar(
'Phone number is already verified'.tr,
'',
backgroundColor: AppColor.greenColor,
);
mySnackbarSuccess('Phone number is already verified'.tr);
box.write(BoxName.phoneVerified, '1');
box.write(BoxName.phone, '+2${phoneController.text}');
Get.put(LoginDriverController()).loginUsingCredentials(
@@ -263,7 +261,6 @@ class RegisterCaptainController extends GetxController {
},
);
// Get.snackbar('', '');
await smsEgyptController.sendSmsEgypt(phoneNumber, randomNumber.toString());
lastOtpSentTime = DateTime.now(); // Update the last OTP sent time
@@ -274,11 +271,7 @@ class RegisterCaptainController extends GetxController {
// Show error message in case of invalid phone number
void _showErrorMessage(String message) {
Get.snackbar(
message.tr,
'',
backgroundColor: AppColor.redColor,
);
mySnackeBarError(message);
}
verifySMSCode() async {
@@ -315,8 +308,7 @@ class RegisterCaptainController extends GetxController {
// }
}
} else {
Get.snackbar('Error'.tr, 'you must insert token code '.tr,
backgroundColor: AppColor.redColor);
mySnackeBarError('you must insert token code '.tr);
}
}

View File

@@ -6,6 +6,7 @@ import 'package:SEFER/controller/functions/crud.dart';
import 'package:SEFER/main.dart';
import 'package:SEFER/views/auth/captin/cards/sms_signup.dart';
import 'package:SEFER/views/home/on_boarding_page.dart';
import 'package:SEFER/views/widgets/error_snakbar.dart';
import 'package:get/get.dart';
import 'package:google_sign_in/google_sign_in.dart';
@@ -116,8 +117,7 @@ class GoogleSignInHelper {
return googleUser;
} catch (error) {
Get.snackbar('Google Sign-In error', '$error',
backgroundColor: AppColor.redColor);
mySnackeBarError('$error');
addError(error.toString(), 'GoogleSignInAccount?> signInFromLogin()');
return null;
}

View File

@@ -1,6 +1,7 @@
import 'dart:convert';
import 'dart:math';
import 'package:SEFER/views/widgets/error_snakbar.dart';
import 'package:flutter/material.dart';
import 'package:flutter_secure_storage/flutter_secure_storage.dart';
import 'package:get/get.dart';
@@ -50,7 +51,7 @@ class LoginController extends GetxController {
update();
if (res == 'failure') {
//Failure
Get.snackbar('Failure', '', backgroundColor: Colors.red);
mySnackeBarError('');
} else {
var jsonDecoeded = jsonDecode(res);
if (jsonDecoeded.isNotEmpty) {
@@ -90,8 +91,7 @@ class LoginController extends GetxController {
);
}
} else if (jsonDecoeded['status'] == 'Failure') {
Get.snackbar(jsonDecoeded['status'], jsonDecoeded['data'],
backgroundColor: Colors.redAccent);
mySnackeBarError(jsonDecoeded['data']);
isloading = false;
update();
}

View File

@@ -1,5 +1,6 @@
import 'dart:convert';
import 'package:SEFER/views/widgets/error_snakbar.dart';
import 'package:get/get.dart';
import 'package:http/http.dart' as http;
@@ -31,7 +32,7 @@ class TokenController extends GetxController {
update();
var jsonToken = jsonDecode(res.body);
if (jsonToken['status'] == 'The token has been updated successfully.') {
Get.snackbar('token updated'.tr, '');
mySnackbarSuccess('token updated'.tr);
}
}
}

View File

@@ -1,8 +1,7 @@
import 'dart:convert';
import 'dart:io';
import 'package:SEFER/controller/home/captin/home_captain_controller.dart';
import 'package:SEFER/env/env.dart';
import 'package:SEFER/print.dart';
import 'package:SEFER/views/widgets/error_snakbar.dart';
import 'package:SEFER/views/widgets/mydialoug.dart';
import 'package:firebase_messaging/firebase_messaging.dart';
import 'package:flutter/material.dart';
@@ -10,7 +9,6 @@ import 'package:get/get.dart';
import 'package:http/http.dart' as http;
import 'package:SEFER/views/widgets/elevated_btn.dart';
import '../../constant/api_key.dart';
import '../../constant/box_name.dart';
import '../../constant/colors.dart';
import '../../constant/style.dart';
@@ -208,8 +206,6 @@ class FirebaseMessagesController extends GetxController {
update();
} else if (message.notification!.title! == 'Hi ,I will go now') {
// Get.snackbar('Hi ,I will go now', '',
// backgroundColor: AppColor.greenColor);
if (Platform.isAndroid) {
notificationController.showNotification(
'Passenger come to you'.tr, 'Hi ,I will go now'.tr, 'tone2', '');
@@ -274,14 +270,7 @@ class FirebaseMessagesController extends GetxController {
// Get.off(const CallPage());
} catch (e) {}
} else if (message.notification!.title! == 'Order Applied'.tr) {
Get.snackbar(
"The order has been accepted by another driver."
.tr, // Corrected grammar
"Be more mindful next time to avoid dropping orders."
.tr, // Improved sentence structure
backgroundColor: AppColor.yellowColor,
snackPosition: SnackPosition.BOTTOM,
);
mySnackbarSuccess("The order has been accepted by another driver.".tr);
} else if (message.notification!.title! == 'Order') {
if (Platform.isAndroid) {
notificationController.showNotification(

View File

@@ -230,7 +230,7 @@ class NotificationController extends GetxController {
});
}
void scheduleDailyNotifications(
void scheduleNotificationsForSevenDays(
String title, String message, String tone) async {
final AndroidNotificationDetails android = AndroidNotificationDetails(
'high_importance_channel',
@@ -262,47 +262,72 @@ class NotificationController extends GetxController {
}
}
// Schedule notifications for 10:00 AM and 3:00 PM daily
await _scheduleNotificationForTime(7, 0, title, message, details);
await _scheduleNotificationForTime(13, 0, title, message, details);
await _scheduleNotificationForTime(18, 0, title, message, details);
// await _scheduleNotificationForTime(0, 22, title, message, details);
// Schedule notifications for the next 7 days
for (int day = 0; day < 7; day++) {
// Schedule for 8:00 AM
await _scheduleNotificationForTime(
day, 7, 0, title, message, details, day * 1000 + 1); // Unique ID
print('Daily notifications scheduled successfully');
await _scheduleNotificationForTime(
day, 10, 14, title, message, details, day * 1000 + 2); // Unique ID
// Schedule for 3:00 PM
await _scheduleNotificationForTime(
day, 13, 0, title, message, details, day * 1000 + 3); // Unique ID
// Schedule for 8:00 PM
await _scheduleNotificationForTime(
day, 20, 0, title, message, details, day * 1000 + 4); // Unique ID
}
print('Notifications scheduled successfully for the next 7 days');
}
// Helper function to get the next instance of a specific hour and minute
Future<void> _scheduleNotificationForTime(int hour, int minute, String title,
String message, NotificationDetails details) async {
Future<void> _scheduleNotificationForTime(
int dayOffset,
int hour,
int minute,
String title,
String message,
NotificationDetails details,
int notificationId,
) async {
// Initialize and set Cairo timezone
tz.initializeTimeZones();
final cairoLocation = tz.getLocation('Africa/Cairo'); // Set Cairo timezone
var cairoLocation = tz.getLocation('Africa/Cairo');
final now = tz.TZDateTime.now(
cairoLocation); // Use Cairo timezone for the current time
final now = tz.TZDateTime.now(cairoLocation);
tz.TZDateTime scheduledDate = tz.TZDateTime(
cairoLocation, now.year, now.month, now.day, hour, minute);
cairoLocation,
now.year,
now.month,
now.day + dayOffset, // Add offset to schedule for the next days
hour,
minute,
);
// If scheduled time is already past today, schedule it for the next day
// If the scheduled time is in the past, move it to the next day
if (scheduledDate.isBefore(now)) {
scheduledDate = scheduledDate.add(const Duration(days: 1));
scheduledDate = scheduledDate.add(Duration(days: 1));
}
print('Current time (Cairo): $now');
print('Scheduling notification for: $scheduledDate');
await _flutterLocalNotificationsPlugin.zonedSchedule(
0, // Use unique IDs if you want to manage each notification separately
notificationId, // Unique ID for each notification
title,
message,
scheduledDate,
details,
androidAllowWhileIdle: true,
androidScheduleMode: AndroidScheduleMode.exact,
uiLocalNotificationDateInterpretation:
UILocalNotificationDateInterpretation.absoluteTime,
matchDateTimeComponents: DateTimeComponents.time,
matchDateTimeComponents:
null, // Don't repeat automatically; we handle 7 days manually
);
print('Notification scheduled successfully for Cairo timezone');
print('Notification scheduled successfully for: $scheduledDate');
}
void scheduleNotificationEvery10Hours(

View File

@@ -1,10 +1,8 @@
import 'package:SEFER/constant/links.dart';
import 'package:SEFER/controller/functions/crud.dart';
import 'package:SEFER/views/home/Captin/home_captain/home_captin.dart';
import 'package:SEFER/views/home/Captin/orderCaptin/order_request_page.dart';
import 'package:SEFER/views/widgets/elevated_btn.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
class OverlayContent1 extends StatelessWidget {
@override

View File

@@ -231,9 +231,9 @@ class CRUD {
);
Log.print('response: ${response.request}');
Log.print('response: ${response.body}');
Log.print('response: ${response.statusCode}');
Log.print('response: ${response.reasonPhrase}');
Log.print('response: ${payload}');
// Log.print('response: ${response.statusCode}');
// Log.print('response: ${response.reasonPhrase}');
// Log.print('response: ${payload}');
var jsonData = jsonDecode(response.body);
if (response.statusCode == 200) {
if (jsonData['status'] == 'success') {

View File

@@ -10,6 +10,7 @@ import 'package:SEFER/controller/functions/crud.dart';
import 'package:SEFER/controller/functions/device_info.dart';
import 'package:SEFER/main.dart';
import 'package:SEFER/views/home/Captin/home_captain/home_captin.dart';
import 'package:SEFER/views/widgets/error_snakbar.dart';
import 'package:SEFER/views/widgets/mydialoug.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
@@ -63,11 +64,9 @@ class AI extends GetxController {
if (res != 'failure') {
isInviteDriverFound = true;
update();
Get.snackbar("Code approved".tr, '',
backgroundColor: AppColor.greenColor);
mySnackbarSuccess("Code approved".tr);
} else {
Get.snackbar("Code not approved".tr, '',
backgroundColor: AppColor.redColor);
mySnackeBarError("Code not approved".tr);
}
}
}
@@ -80,11 +79,9 @@ class AI extends GetxController {
if (res != 'failure') {
isInviteDriverFound = true;
update();
Get.snackbar("Code approved".tr, '',
backgroundColor: AppColor.greenColor);
mySnackbarSuccess("Code approved".tr);
} else {
Get.snackbar("Code not approved".tr, '',
backgroundColor: AppColor.redColor);
mySnackeBarError("Code not approved".tr);
}
}
}
@@ -386,18 +383,17 @@ class AI extends GetxController {
CRUD().post(
link: '${AppLink.seferAlexandriaServer}/auth/captin/register.php',
payload: payload);
Get.snackbar('Success', 'Driver data saved successfully',
backgroundColor: AppColor.greenColor);
mySnackbarSuccess('Driver data saved successfully');
} else {
Get.snackbar('Error'.tr,
'${'Failed to save driver data'.tr}: ${status1['message']}',
backgroundColor: Colors.red);
mySnackeBarError(
'${'Failed to save driver data'.tr}: ${status1['message']}');
}
} catch (e) {
isLoading = false;
update();
Get.snackbar('Error'.tr, 'An error occurred while saving driver data'.tr,
backgroundColor: Colors.red);
mySnackeBarError(
'An error occurred while saving driver data'.tr,
);
}
}
@@ -408,7 +404,7 @@ class AI extends GetxController {
"InspectionResult": responseCriminalRecordEgypt['InspectionResult'],
});
if (res != 'failure') {
Get.snackbar('uploaded sucssefuly'.tr, '');
mySnackbarSuccess('uploaded sucssefuly'.tr);
}
}
@@ -439,8 +435,7 @@ class AI extends GetxController {
var status = jsonDecode(res);
if (status['status'] == 'success') {
isCarSaved = true;
Get.snackbar('Success', 'message',
backgroundColor: AppColor.greenColor);
mySnackbarSuccess('');
CRUD().post(
link:
'${AppLink.seferAlexandriaServer}/ride/RegisrationCar/add.php',
@@ -979,8 +974,7 @@ class AI extends GetxController {
update();
} else {
Get.snackbar('Error', "JSON string not found",
backgroundColor: AppColor.redColor);
mySnackeBarError("JSON string not found");
}
// Rest of your code...

View File

@@ -1,6 +1,7 @@
import 'dart:io';
import 'package:SEFER/views/home/on_boarding_page.dart';
import 'package:SEFER/views/widgets/error_snakbar.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:SEFER/constant/box_name.dart';
@@ -174,9 +175,9 @@ class LogOutController extends GetxController {
'email': box.read(BoxName.email),
});
} else {
Get.snackbar('Email Wrong'.tr, 'Email you inserted is Wrong.'.tr,
snackPosition: SnackPosition.BOTTOM,
backgroundColor: AppColor.redColor);
mySnackeBarError(
'Email you inserted is Wrong.'.tr,
);
}
}
}

View File

@@ -1,5 +1,6 @@
import 'package:SEFER/constant/box_name.dart';
import 'package:SEFER/main.dart';
import 'package:SEFER/views/widgets/error_snakbar.dart';
import 'package:flutter/material.dart';
import 'package:flutter_tts/flutter_tts.dart';
import 'package:get/get.dart';
@@ -45,8 +46,7 @@ class TextToSpeechController extends GetxController {
update();
}
} catch (error) {
// Handle error gracefully, e.g., show a message
Get.snackbar('Error', 'Failed to speak text: $error');
mySnackeBarError('Failed to speak text: $error');
}
}
}

View File

@@ -1,6 +1,7 @@
import 'dart:convert';
import 'dart:io';
import 'package:SEFER/constant/api_key.dart';
import 'package:SEFER/views/widgets/error_snakbar.dart';
import 'package:get/get.dart';
import 'package:http/http.dart' as http;
import 'package:image_cropper/image_cropper.dart';
@@ -152,8 +153,9 @@ class ImageController extends GetxController {
);
} catch (e) {
print('Error in choosImage: $e');
Get.snackbar('Image Upload Failed'.tr, e.toString(),
backgroundColor: AppColor.primaryColor);
mySnackeBarError('Image Upload Failed'.tr);
// Get.snackbar('Image Upload Failed'.tr, e.toString(),
// backgroundColor: AppColor.primaryColor);
} finally {
isloading = false;
update();
@@ -211,8 +213,9 @@ class ImageController extends GetxController {
);
} catch (e) {
print('Error in choosImage: $e');
Get.snackbar('Image Upload Failed'.tr, e.toString(),
backgroundColor: AppColor.primaryColor);
// Get.snackbar('Image Upload Failed'.tr, e.toString(),
// backgroundColor: AppColor.primaryColor);
mySnackeBarError('Image Upload Failed'.tr);
} finally {
isloading = false;
update();
@@ -287,8 +290,9 @@ class ImageController extends GetxController {
link,
);
} catch (e) {
Get.snackbar('Image Upload Failed'.tr, e.toString(),
backgroundColor: AppColor.redColor);
mySnackeBarError('Image Upload Failed'.tr);
// Get.snackbar('Image Upload Failed'.tr, e.toString(),
// backgroundColor: AppColor.redColor);
} finally {
isloading = false;
update();
@@ -420,8 +424,9 @@ class ImageController extends GetxController {
link,
);
} catch (e) {
Get.snackbar('Image Upload Failed'.tr, e.toString(),
backgroundColor: AppColor.redColor);
mySnackeBarError('Image Upload Failed'.tr);
// Get.snackbar('Image Upload Failed'.tr, e.toString(),
// backgroundColor: AppColor.redColor);
} finally {
isloading = false;
update();

View File

@@ -4,6 +4,7 @@ import 'package:SEFER/constant/box_name.dart';
import 'package:SEFER/constant/links.dart';
import 'package:SEFER/controller/functions/crud.dart';
import 'package:SEFER/main.dart';
import 'package:SEFER/views/widgets/error_snakbar.dart';
import 'package:get/get.dart';
import '../../../../constant/colors.dart';
@@ -43,20 +44,13 @@ class AssuranceHealthController extends GetxController {
if (response != 'failure') {
// Handle success (e.g., show a success message)
print("Health assurance data saved successfully");
Get.snackbar(
"Success".tr,
"You have successfully opted for health insurance.".tr,
backgroundColor: AppColor.greenColor,
);
mySnackbarSuccess(
"You have successfully opted for health insurance.".tr);
} else {
// Handle failure (e.g., show an error message)
print("Failed to save health assurance data");
Get.snackbar(
"Error".tr,
"Please enter a health insurance status.".tr,
backgroundColor: AppColor.redColor,
);
mySnackeBarError("Please enter a health insurance status.".tr);
}
} catch (e) {
// Handle any errors

View File

@@ -3,6 +3,7 @@ import 'dart:convert';
import 'package:SEFER/constant/links.dart';
import 'package:SEFER/controller/functions/crud.dart';
import 'package:SEFER/print.dart';
import 'package:SEFER/views/widgets/error_snakbar.dart';
import 'package:get/get.dart';
import 'package:video_player/video_player.dart';
@@ -57,10 +58,10 @@ class VideoController extends GetxController {
// Log.print('videos: ${videos}');
update();
} else {
Get.snackbar('Error'.tr, '');
mySnackeBarError('');
}
} catch (e) {
Get.snackbar("Error", e.toString());
mySnackeBarError(e.toString());
} finally {
isLoading(false);
}

View File

@@ -302,13 +302,13 @@ class HomeCaptainController extends GetxController {
'token': box.read(BoxName.tokenDriver),
'captain_id': box.read(BoxName.driverID).toString()
});
CRUD().post(
await CRUD().post(
link: "${AppLink.seferAlexandriaServer}/ride/firebase/addDriver.php",
payload: {
'token': box.read(BoxName.tokenDriver),
'captain_id': box.read(BoxName.driverID).toString()
});
CRUD().post(
await CRUD().post(
link: "${AppLink.seferGizaServer}/ride/firebase/addDriver.php",
payload: {
'token': box.read(BoxName.tokenDriver),

View File

@@ -551,7 +551,8 @@ class MapDriverController extends GetxController {
);
MyDialog().getDialog('Are you sure to exit ride ?'.tr, '', () {
if (distanceToDestination > 900 ||
(double.parse(distance) < 1000 && distanceToDestination > 150)) {
(double.parse(distance.toString()) < 1000 &&
distanceToDestination > 150)) {
Get.back();
finishRideFromDriver1();
} else {
@@ -611,16 +612,17 @@ class MapDriverController extends GetxController {
paymentAmount = totalCost;
box.write(BoxName.statusDriverLocation, 'off');
// changeRideToBeginToPassenger();
await CRUD()
.post(link: "${AppLink.seferCairoServer}/rides/update.php", payload: {
'id': rideId,
'rideTimeFinish': DateTime.now().toString(),
'status': 'Finished',
'price': totalCost,
});
await CRUD().post(
link: "${AppLink.seferCairoServer}/ride/rides/update.php",
payload: {
'id': rideId,
'rideTimeFinish': DateTime.now().toString(),
'status': 'Finished',
'price': totalCost,
});
if (AppLink.endPoint != AppLink.seferCairoServer) {
CRUD().post(
link: "${AppLink.endPoint}/rides/update.php",
link: "${AppLink.endPoint}/ride/rides/update.php",
payload: {
'id': rideId,
'rideTimeFinish': DateTime.now().toString(),

View File

@@ -4,6 +4,7 @@ import 'package:SEFER/constant/colors.dart';
import 'package:SEFER/constant/style.dart';
import 'package:SEFER/controller/firebase/firbase_messge.dart';
import 'package:SEFER/views/widgets/elevated_btn.dart';
import 'package:SEFER/views/widgets/error_snakbar.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:SEFER/constant/box_name.dart';
@@ -81,22 +82,10 @@ class CaptainWalletController extends GetxController {
amountToNewDriverMap = d['data'];
// update();
} else {
Get.snackbar(
"This driver is not registered".tr,
'',
duration: const Duration(seconds: 3),
backgroundColor: AppColor.redColor,
snackPosition: SnackPosition.BOTTOM,
);
mySnackeBarError("This driver is not registered".tr);
}
} else {
Get.snackbar(
'Your Budget less than needed'.tr,
'',
duration: const Duration(seconds: 3),
backgroundColor: AppColor.redColor,
snackPosition: SnackPosition.BOTTOM,
);
mySnackeBarError('Your Budget less than needed'.tr);
}
}
}

View File

@@ -5,6 +5,7 @@ import 'package:SEFER/constant/box_name.dart';
import 'package:SEFER/constant/colors.dart';
import 'package:SEFER/main.dart';
import 'package:SEFER/print.dart';
import 'package:SEFER/views/widgets/error_snakbar.dart';
import 'package:get/get.dart';
import 'package:http/http.dart' as http;
import 'package:secure_string_operations/secure_string_operations.dart';
@@ -91,14 +92,11 @@ class PaymobPayout extends GetxController {
'Wallet',
box.read(BoxName.emailDriver).toString());
Get.snackbar('Transaction successful'.tr,
'${'Transaction successful'.tr} ${dec['amount']}',
backgroundColor: AppColor.greenColor);
mySnackbarSuccess('${'Transaction successful'.tr} ${dec['amount']}');
Get.find<CaptainWalletController>().refreshCaptainWallet();
} else if (dec['disbursement_status'] == 'failed') {
Get.snackbar('Transaction failed'.tr, 'Transaction failed'.tr,
backgroundColor: AppColor.redColor);
mySnackeBarError('Transaction failed'.tr);
}
}
@@ -175,14 +173,10 @@ class PaymobPayout extends GetxController {
'Wallet',
box.read(BoxName.emailDriver).toString());
Get.snackbar('Transaction successful'.tr,
'${'Transaction successful'.tr} ${dec['amount']}',
backgroundColor: AppColor.greenColor);
mySnackbarSuccess('${'Transaction successful'.tr} ${dec['amount']}');
Get.find<CaptainWalletController>().refreshCaptainWallet();
} else if (dec['disbursement_status'] == 'failed') {
Get.snackbar('Transaction failed'.tr, 'Transaction failed'.tr,
backgroundColor: AppColor.redColor);
mySnackeBarError('Transaction failed'.tr);
}
}

View File

@@ -197,7 +197,13 @@ class MyTranslation extends Translations {
"Choose from contact": "اختر من جهات الاتصال",
"Cancel": "إلغاء",
"Open App": "افتح التطبيق",
"Add new car": "أضف سيارة جديدة",
"Ok I will go now.": "حسنًا، سأذهب الآن.",
"Hi, I will go now": "مرحبًا، سأذهب الآن.",
"Add new car": "أضف سيارة جديدة", "Rate Our App": "قيّم تطبيقنا",
"How would you rate our app?": "كيف تقيم تطبيقنا؟",
"write comment here": "اكتب تعليقك هنا",
"Submit Rating": "إرسال التقييم",
"Rating submitted successfully": "تم إرسال التقييم بنجاح",
"Open the app to stay updated and ready for upcoming tasks.":
"افتح التطبيق لتبقى على اطلاع واستعداد للمهام القادمة.",
"No invitation found": "لم يتم العثور على دعوة",

View File

@@ -4,6 +4,7 @@ import 'package:SEFER/constant/style.dart';
import 'package:SEFER/controller/functions/tts.dart';
import 'package:SEFER/controller/payment/paymob/paymob_response.dart';
import 'package:SEFER/views/widgets/elevated_btn.dart';
import 'package:SEFER/views/widgets/error_snakbar.dart';
import 'package:http/http.dart' as http;
import 'package:flutter/material.dart';
import 'package:flutter_paypal/flutter_paypal.dart';
@@ -396,7 +397,8 @@ class PaymentController extends GetxController {
'accountBank': box.read(BoxName.accountIdStripeConnect),
});
if (jsonDecode(res)['status'] == 'success') {
Get.snackbar('Account Updated', '');
mySnackbarSuccess('Account Updated'.tr);
// Get.snackbar('Account Updated', '');
}
}
@@ -589,11 +591,12 @@ class PaymentController extends GetxController {
billingData: PaymobBillingDataWallet(),
onPayment: (PaymobResponseWallet response) {},
);
// Log.print('message: ${response!.message}');
// Log.print('responseCode: ${response.responseCode}');
// Log.print('success: ${response.success}');
// Log.print('transactionID: ${response.transactionID}');
if (response!.responseCode == '200' && response.success == true) {
Log.print('message: ${response!.message}');
Log.print('responseCode: ${response.responseCode}');
Log.print('success: ${response.success}');
Log.print('transactionID: ${response.transactionID}');
if (response.responseCode.toString() == '200' &&
response.success == true) {
// Log.print('transactionID wewer: ${response.transactionID}');
Toast.show(context, 'Payment Successful'.tr, AppColor.greenColor);
method();

View File

@@ -0,0 +1,97 @@
import 'dart:convert';
import 'package:SEFER/constant/box_name.dart';
import 'package:SEFER/constant/colors.dart';
import 'package:SEFER/constant/links.dart';
import 'package:SEFER/controller/functions/crud.dart';
import 'package:SEFER/main.dart';
import 'package:SEFER/views/widgets/error_snakbar.dart';
import 'package:SEFER/views/widgets/mydialoug.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
// Import url_launcher to open the app store
import 'package:url_launcher/url_launcher.dart';
class RatingController extends GetxController {
var userRating = 0.obs;
final comment = TextEditingController();
void submitRating(int rating) {
userRating.value = rating;
_saveRating(rating);
}
void _redirectToAppStore() async {
// URLs for App Store and Google Play Store
const appStoreUrl = 'https://apps.apple.com/app/6502189302';
const playStoreUrl =
'https://play.google.com/store/apps/details?id=com.sefer_driver';
final url = GetPlatform.isIOS ? appStoreUrl : playStoreUrl;
if (await launchUrl(Uri.parse(url))) {
await launchUrl(Uri.parse(url));
} else {
mySnackeBarError("Could not open the app store.");
}
}
Future<void> _saveRating(int rating) async {
// Build the payload with user data
final payload = {
"name": box.read(BoxName.driverID) != null
? box.read(BoxName.nameDriver)
: box.read(BoxName.name),
"email": box.read(BoxName.driverID) == null
? box.read(BoxName.email).toString()
: box.read(BoxName.emailDriver).toString(),
"phone": box.read(BoxName.driverID) == null
? box.read(BoxName.phone)
: box.read(BoxName.phoneDriver),
"userId": box.read(BoxName.driverID) ?? box.read(BoxName.passengerID),
"userType": box.read(BoxName.driverID) != null ? "driver" : "passenger",
"rating": rating.toString(),
"comment": comment.text.isEmpty
? 'nothing'
: comment.text, // Get actual text from comment controller
};
// Send the rating data to the backend
var res = await CRUD().post(link: AppLink.addRateApp, payload: payload);
// Handle the response and check if it's JSON-formatted
if (res != 'failure') {
try {
// Attempt to parse the response as JSON
final parsedResponse = jsonDecode(res);
if (parsedResponse['status'] == 'success') {
// Display a success message
await CRUD().post(link: AppLink.sendEmailRateingApp, payload: {
"name": payload["name"],
"email": payload["email"],
"rating": rating.toString(),
"comment": payload["comment"],
});
MyDialog().getDialog('Rating submitted successfully'.tr, '', () {
if (rating == 5) {
Get.back();
_redirectToAppStore();
} else {
Get.back();
}
});
// Send confirmation email if the rating was successfully submitted
} else {
mySnackeBarError('Failed to submit rating');
}
} catch (e) {
// If JSON decoding fails, log the response directly
// Get.snackbar('Success', 'Rating submitted successfully',
// backgroundColor: AppColor.greenColor);
}
} else {
mySnackeBarError('Failed to connect to the server');
}
}
}

View File

@@ -2,6 +2,7 @@ import 'package:SEFER/constant/colors.dart';
import 'package:SEFER/controller/firebase/firbase_messge.dart';
import 'package:SEFER/controller/home/captin/map_driver_controller.dart';
import 'package:SEFER/controller/payment/payment_controller.dart';
import 'package:SEFER/views/widgets/error_snakbar.dart';
import 'package:flutter/cupertino.dart';
import 'package:get/get.dart';
import 'package:SEFER/constant/box_name.dart';
@@ -54,8 +55,7 @@ class RateController extends GetxController {
'token': paymentToken2,
}).then((value) async {
if (value != 'failure') {
Get.snackbar('Wallet Added'.tr, '',
backgroundColor: AppColor.greenColor);
mySnackbarSuccess('Wallet Added'.tr);
// if (double.parse(
// Get.find<CaptainWalletController>().totalAmountVisa) >
// remainingFee) {

View File

@@ -130,6 +130,8 @@ void main() async {
}
if (Platform.isAndroid || Platform.isIOS) {
NotificationController notificationController =
Get.put(NotificationController());
await Firebase.initializeApp(
options: DefaultFirebaseOptions.currentPlatform,
);
@@ -141,8 +143,7 @@ void main() async {
// if (Platform.isAndroid) {
// await Get.put(NotificationController()).initNotifications();
// }
NotificationController notificationController =
Get.put(NotificationController());
await notificationController.initNotifications();
// Generate a random index to pick a message
@@ -150,7 +151,7 @@ void main() async {
final randomMessage = driverMessages[random.nextInt(driverMessages.length)];
// Schedule the notification with the random message
notificationController.scheduleDailyNotifications(
notificationController.scheduleNotificationsForSevenDays(
randomMessage.split(':')[0],
randomMessage.split(':')[1],
"ding",

View File

@@ -6,7 +6,6 @@ import 'package:SEFER/constant/colors.dart';
import 'package:SEFER/constant/info.dart';
import 'package:SEFER/constant/style.dart';
import 'controller/functions/location_background_controller.dart';
import 'controller/home/splash_screen_controlle.dart';
import 'main.dart';

View File

@@ -0,0 +1,86 @@
import 'package:SEFER/views/widgets/elevated_btn.dart';
import 'package:SEFER/views/widgets/my_textField.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import '../../controller/rate/rate_app_controller.dart';
class RatingScreen extends StatelessWidget {
// Initialize the RatingController using GetX for state management
final RatingController ratingController = Get.put(RatingController());
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
// Display title "Rate Our App", with .tr for localization support
title: Text("Rate Our App".tr),
),
body: Center(
child: Obx(() {
// Observe changes in userRating; when updated, rebuild the UI accordingly
return Padding(
padding: const EdgeInsets.all(8.0),
child: ListView(
// mainAxisAlignment:
// MainAxisAlignment.center, // Center content vertically
children: [
ClipRRect(
borderRadius: BorderRadius.circular(15),
child: Image.asset('assets/images/logo.gif')),
const SizedBox(height: 10),
// Text prompt asking the user to rate the app, with localization support
Text("How would you rate our app?".tr),
const SizedBox(height: 10), // Vertical spacing between elements
MyTextForm(
controller: ratingController.comment,
label: 'write comment here'.tr,
hint: 'write comment here'.tr,
type: TextInputType.name,
),
// Build and display the row of rating stars
_buildRatingStars(),
const SizedBox(
height: 20), // Additional spacing before the button
// Button to submit the selected rating
MyElevatedButton(
onPressed: () {
// Calls submitRating() method in the controller with the current rating value
ratingController
.submitRating(ratingController.userRating.value);
},
// Button text "Submit Rating" with localization support
title: "Submit Rating".tr,
),
],
),
);
}),
),
);
}
// Widget function to display a row of clickable star icons for rating
Widget _buildRatingStars() {
return Row(
mainAxisAlignment:
MainAxisAlignment.center, // Center-aligns stars horizontally
children: List.generate(5, (index) {
return IconButton(
// Display a star icon, filled if selected, otherwise grey
icon: Icon(
Icons.star,
color: index < ratingController.userRating.value
? Colors.orange // Orange for selected stars
: Colors.grey, // Grey for unselected stars
),
onPressed: () {
// Update user rating in the controller when a star is clicked
ratingController.userRating.value = index + 1;
},
);
}),
);
}
}

View File

@@ -1,3 +1,4 @@
import 'package:SEFER/constant/colors.dart';
import 'package:SEFER/constant/style.dart';
import 'package:SEFER/controller/auth/captin/register_captin_controller.dart';
import 'package:SEFER/views/widgets/elevated_btn.dart';
@@ -7,6 +8,8 @@ import 'package:SEFER/views/widgets/mycircular.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import '../../../Rate/rate_app_page.dart';
class SmsSignupEgypt extends StatelessWidget {
SmsSignupEgypt({super.key});
@@ -102,6 +105,15 @@ class SmsSignupEgypt extends StatelessWidget {
title: 'Submit'.tr,
),
),
Padding(
padding: const EdgeInsets.all(16.0),
child: MyElevatedButton(
kolor: AppColor.yellowColor,
title: "Rate Our App".tr,
onPressed: () {
Get.to(RatingScreen());
}),
)
],
);
}),

View File

@@ -5,6 +5,7 @@ import 'package:SEFER/constant/colors.dart';
import 'package:SEFER/constant/links.dart';
import 'package:SEFER/controller/functions/crud.dart';
import 'package:SEFER/main.dart';
import 'package:SEFER/views/widgets/error_snakbar.dart';
import 'package:get/get.dart';
class DriverCarController extends GetxController {
@@ -60,10 +61,11 @@ class DriverCarController extends GetxController {
},
);
if (res != 'failure') {
Get.snackbar('Success'.tr, '', backgroundColor: AppColor.greenColor);
mySnackbarSuccess('');
fetchCatrsForDrivers();
} else {
Get.snackbar('Error'.tr, '', backgroundColor: AppColor.redColor);
mySnackeBarError('');
}
}

View File

@@ -1,13 +1,11 @@
import 'package:SEFER/constant/box_name.dart';
import 'package:SEFER/constant/colors.dart';
import 'package:SEFER/main.dart';
import 'package:SEFER/views/widgets/mydialoug.dart';
import 'package:flutter/material.dart';
import 'package:flutter/cupertino.dart';
import 'package:get/get.dart';
import '../../../controller/auth/captin/invit_controller.dart';
import '../../widgets/elevated_btn.dart';
class InviteScreen extends StatelessWidget {
final InviteController controller = Get.put(InviteController());

View File

@@ -1,8 +1,6 @@
import 'dart:io';
import 'package:SEFER/controller/auth/facebook_login.dart';
import 'package:SEFER/views/auth/captin/contact_us_page.dart';
import 'package:SEFER/views/widgets/my_textField.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/gestures.dart';
import 'package:flutter/material.dart';
@@ -18,7 +16,6 @@ import '../../../constant/style.dart';
import '../../../controller/auth/apple_sigin.dart';
import '../../../controller/auth/captin/login_captin_controller.dart';
import '../../../controller/auth/google_sign.dart';
import '../../../controller/functions/location_permission.dart';
import '../../../controller/functions/overlay_permisssion.dart';
import '../../../main.dart';
import '../../../print.dart';

View File

@@ -1,5 +1,6 @@
import 'package:SEFER/constant/box_name.dart';
import 'package:SEFER/main.dart';
import 'package:SEFER/views/widgets/error_snakbar.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
@@ -168,12 +169,15 @@ class AssuranceHealthPage extends StatelessWidget {
Navigator.of(context)
.pop(); // Just close the dialog
// Optionally show feedback if the driver opts out
Get.snackbar(
"Opted out".tr,
// Get.snackbar(
// "Opted out".tr,
// "You have chosen not to proceed with health insurance."
// .tr,
// backgroundColor:
// CupertinoColors.systemGrey);
mySnackbarSuccess(
"You have chosen not to proceed with health insurance."
.tr,
backgroundColor:
CupertinoColors.systemGrey);
.tr);
},
),
],

View File

@@ -1,6 +1,7 @@
import 'package:SEFER/constant/api_key.dart';
import 'package:SEFER/constant/links.dart';
import 'package:SEFER/controller/home/captin/home_captain_controller.dart';
import 'package:SEFER/views/Rate/rate_app_page.dart';
import 'package:SEFER/views/auth/captin/contact_us_page.dart';
import 'package:SEFER/views/auth/captin/invite_driver_screen.dart';
import 'package:SEFER/views/notification/available_rides_page.dart';
@@ -102,11 +103,18 @@ class CupertinoDrawerCaptain extends StatelessWidget {
),
_buildDivider(),
_buildDrawerItem(
icon: CupertinoIcons.settings,
icon:
Icons.play_circle_filled, // Icon representing video play
text: 'Videos Tutorials'.tr,
onTap: () => Get.to(() => VideoListPage()),
),
_buildDivider(),
_buildDrawerItem(
icon: Icons.star, // Another option with a filled star icon
text: "Rate Our App".tr,
onTap: () => Get.to(() => RatingScreen()),
),
_buildDivider(),
_buildDrawerItem(
icon: CupertinoIcons.settings,
text: 'Settings'.tr,

View File

@@ -1,26 +1,16 @@
import 'dart:convert';
import 'dart:math';
import 'package:SEFER/constant/box_name.dart';
import 'package:SEFER/controller/firebase/local_notification.dart';
import 'package:SEFER/main.dart';
import 'package:bubble_head/bubble.dart';
import 'package:SEFER/views/home/Captin/orderCaptin/vip_order_page.dart';
import 'package:flutter/material.dart';
import 'package:flutter_font_icons/flutter_font_icons.dart';
import 'package:get/get.dart';
import 'package:SEFER/controller/home/captin/home_captain_controller.dart';
import 'package:google_maps_flutter/google_maps_flutter.dart';
import 'package:timezone/data/latest.dart' as tz;
import 'package:timezone/timezone.dart' as tz;
import '../../../../../constant/colors.dart';
import '../../../../../constant/notification.dart';
import '../../../../../controller/functions/audio_controller.dart';
import '../../../../../print.dart';
import '../../../../Rate/ride_calculate_driver.dart';
import '../../../../../controller/functions/location_controller.dart';
import '../../driver_map_page.dart';
import '../../orderCaptin/order_speed_request.dart';
GetBuilder<HomeCaptainController> leftMainMenuCaptainIcons() {
return GetBuilder<HomeCaptainController>(
@@ -195,34 +185,13 @@ GetBuilder<HomeCaptainController> leftMainMenuCaptainIcons() {
child: Builder(builder: (context) {
return IconButton(
onPressed: () async {
// NotificationController().showNotification(
// ' message.notification!.title.toString()',
// ' message.notification!.body.toString()',
// 'order',
// '');
NotificationController notificationController =
Get.put(NotificationController());
await notificationController.initNotifications();
final random = Random();
final randomMessage =
driverMessages[random.nextInt(driverMessages.length)];
Log.print(
' randomMessage.split[0]: ${randomMessage.split(':')[0]}');
Log.print(
' randomMessage.split([1]: ${randomMessage.split(':')[1]}');
// Schedule the notification with the random message
notificationController.showNotification(
randomMessage.split(':')[0],
randomMessage.split(':')[1],
"ding",
'');
// notificationController.scheduleNotificationEvery10Hours(
// "افتح التطبيق".tr,
// "افتح التطبيق لتبقى على اطلاع واستعداد للمهام القادمة.".tr,
// "ding",
// );
// mySnakeBarError('ad');
Get.to(() => VipOrderPage(), arguments: {
'myListString': 'myListString',
'DriverList': 'myList',
// 'PolylineJson': myPoints,
'body': 'message.notification!.body'
});
},
icon: const Icon(
FontAwesome5.window_close,

View File

@@ -1,11 +1,9 @@
import 'package:SEFER/print.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import '../../../constant/box_name.dart';
import '../../../constant/colors.dart';
import '../../../constant/info.dart';
import '../../../constant/style.dart';
import '../../../controller/home/payment/captain_wallet_controller.dart';
import '../../../controller/home/payment/paymob_payout.dart';

View File

@@ -4,6 +4,7 @@ import 'package:SEFER/controller/functions/tts.dart';
import 'package:SEFER/controller/home/payment/paymob_payout.dart';
import 'package:SEFER/views/home/my_wallet/bank_account_egypt.dart';
import 'package:SEFER/views/home/my_wallet/payment_history_driver_page.dart';
import 'package:SEFER/views/widgets/error_snakbar.dart';
import 'package:SEFER/views/widgets/mydialoug.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
@@ -13,14 +14,12 @@ import 'package:SEFER/constant/colors.dart';
import 'package:SEFER/constant/info.dart';
import 'package:SEFER/constant/style.dart';
import 'package:SEFER/controller/home/payment/captain_wallet_controller.dart';
import 'package:SEFER/controller/payment/payment_controller.dart';
import 'package:SEFER/main.dart';
import 'package:SEFER/views/widgets/elevated_btn.dart';
import 'package:SEFER/views/widgets/my_textField.dart';
import 'package:SEFER/views/widgets/mycircular.dart';
import '../../../controller/payment/driver_payment_controller.dart';
import '../../../print.dart';
import '../../widgets/my_scafold.dart';
import 'card_wallet_widget.dart';
import 'points_captain.dart';
@@ -380,10 +379,8 @@ class WalletCaptain extends StatelessWidget {
await controller.payFromBudget();
} else {
Get.back();
Get.snackbar('Your Budget less than needed'.tr, '',
duration: const Duration(seconds: 3),
backgroundColor: AppColor.redColor,
snackPosition: SnackPosition.BOTTOM);
mySnackeBarError('Your Budget less than needed'.tr);
}
},
),
@@ -405,8 +402,8 @@ class WalletCaptain extends StatelessWidget {
if (double.parse(controller.totalAmountVisa) > 15) {
Get.to(() => const TransferBudgetPage());
} else {
Get.snackbar(
"You don't have enough money in your SEFER wallet".tr, '');
mySnackeBarError(
"You don't have enough money in your SEFER wallet".tr);
}
},
);
@@ -507,9 +504,7 @@ Future<dynamic> addBankCodeEgypt(
});
print('res: ${res}');
if (res != 'failure') {
Get.snackbar(
'updated succses'.tr, 'bank account added succesfly',
backgroundColor: AppColor.greenColor);
mySnackbarSuccess('bank account added succesfly'.tr);
}
}
}));

View File

@@ -1,4 +1,3 @@
import 'package:SEFER/splash_screen_page.dart';
import 'package:SEFER/views/widgets/elevated_btn.dart';
import 'package:SEFER/views/widgets/my_scafold.dart';
import 'package:flutter/material.dart';

View File

@@ -1,5 +1,3 @@
import 'package:SEFER/controller/auth/captin/login_captin_controller.dart';
import 'package:SEFER/views/auth/captin/login_captin.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';

View File

@@ -2,7 +2,6 @@ import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:SEFER/controller/notification/notification_captain_controller.dart';
import 'package:flutter/cupertino.dart';
import 'package:get/get.dart';
class NotificationCaptain extends StatelessWidget {
const NotificationCaptain({Key? key}) : super(key: key);

View File

@@ -0,0 +1,69 @@
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import '../../constant/colors.dart';
SnackbarController mySnackeBarError(String message) {
return Get.snackbar(
'Error'.tr,
message,
backgroundColor: AppColor.redColor.withOpacity(0.9),
colorText: AppColor.secondaryColor,
icon: const Icon(Icons.error, color: AppColor.secondaryColor),
shouldIconPulse: true,
snackPosition: SnackPosition.TOP,
margin: const EdgeInsets.all(10),
borderRadius: 10,
animationDuration: const Duration(milliseconds: 500),
forwardAnimationCurve: Curves.easeOutBack,
reverseAnimationCurve: Curves.easeInBack,
titleText: Text(
'Error'.tr,
style: const TextStyle(
fontWeight: FontWeight.bold,
color: Colors.white,
fontSize: 16,
),
),
messageText: Text(
message,
style: TextStyle(
color: Colors.white.withOpacity(0.9),
fontSize: 14,
),
),
);
}
SnackbarController mySnackbarSuccess(String message) {
return Get.snackbar(
'Success'.tr,
message,
backgroundColor: AppColor.greenColor
.withOpacity(0.9), // Assuming green color for success
colorText: AppColor.secondaryColor,
icon: const Icon(Icons.check_circle, color: AppColor.secondaryColor),
shouldIconPulse: true,
snackPosition: SnackPosition.TOP,
margin: const EdgeInsets.all(10),
borderRadius: 10,
animationDuration: const Duration(milliseconds: 500),
forwardAnimationCurve: Curves.easeOutBack,
reverseAnimationCurve: Curves.easeInBack,
titleText: Text(
'Success'.tr,
style: const TextStyle(
fontWeight: FontWeight.bold,
color: Colors.white,
fontSize: 16,
),
),
messageText: Text(
message,
style: TextStyle(
color: Colors.white.withOpacity(0.9),
fontSize: 14,
),
),
);
}