This commit is contained in:
Hamza-Ayed
2025-02-07 23:55:33 +03:00
parent 3162ae823e
commit 5f53461b34
18 changed files with 965 additions and 933 deletions

View File

@@ -33,7 +33,7 @@ def keystorePropertiesFile = rootProject.file('key.properties')
android { android {
namespace "com.sefer_driver" namespace "com.sefer_driver"
compileSdk 35 compileSdk 35
ndkVersion flutter.ndkVersion ndkVersion "27.0.12077973"
compileOptions { compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8 sourceCompatibility JavaVersion.VERSION_1_8
@@ -55,8 +55,8 @@ android {
// For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration. // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration.
minSdk = 23 minSdk = 23
targetSdk = flutter.targetSdkVersion targetSdk = flutter.targetSdkVersion
versionCode = 133 versionCode = 135
versionName = '2.0.133' versionName = '2.0.135'
multiDexEnabled =true multiDexEnabled =true
} }

View File

@@ -9,7 +9,7 @@ buildscript {
// START: FlutterFire Configuration // START: FlutterFire Configuration
classpath 'com.google.gms:google-services:4.4.2' classpath 'com.google.gms:google-services:4.4.2'
// END: FlutterFire Configuration // END: FlutterFire Configuration
classpath 'com.android.tools.build:gradle:8.4.0' classpath 'com.android.tools.build:gradle:8.8.0'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
} }
} }

View File

@@ -4,4 +4,4 @@ distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists distributionPath=wrapper/dists
zipStorePath=wrapper/dists zipStorePath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME zipStoreBase=GRADLE_USER_HOME
distributionUrl=https\://services.gradle.org/distributions/gradle-8.6-all.zip distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip

Binary file not shown.

Before

Width:  |  Height:  |  Size: 607 KiB

After

Width:  |  Height:  |  Size: 8.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 MiB

After

Width:  |  Height:  |  Size: 86 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.5 MiB

After

Width:  |  Height:  |  Size: 3.0 MiB

View File

@@ -35,7 +35,7 @@
<key>CFBundlePackageType</key> <key>CFBundlePackageType</key>
<string>APPL</string> <string>APPL</string>
<key>CFBundleShortVersionString</key> <key>CFBundleShortVersionString</key>
<string>91</string> <string>93</string>
<key>CFBundleSignature</key> <key>CFBundleSignature</key>
<string>????</string> <string>????</string>
<key>CFBundleURLTypes</key> <key>CFBundleURLTypes</key>
@@ -50,7 +50,7 @@
</dict> </dict>
</array> </array>
<key>CFBundleVersion</key> <key>CFBundleVersion</key>
<string>5.0.090</string> <string>5.0.93</string>
<key>FirebaseAppDelegateProxyEnabled</key> <key>FirebaseAppDelegateProxyEnabled</key>
<string>NO</string> <string>NO</string>
<key>GMSApiKey</key> <key>GMSApiKey</key>

View File

@@ -39,7 +39,43 @@ class CRUD {
return jsonData['status']; return jsonData['status'];
} }
// } // }
Future<dynamic> post({
required String link,
Map<String, dynamic>? payload,
}) async {
// String? basicAuthCredentials =
// await storage.read(key: BoxName.basicAuthCredentials);
var url = Uri.parse(
link,
);
var response = await http.post(
url,
body: payload,
headers: {
"Content-Type": "application/x-www-form-urlencoded",
'Authorization':
'Basic ${base64Encode(utf8.encode(AK.basicAuthCredentials))}',
},
);
Log.print('request: ${response.request}');
Log.print('response: ${response.body}');
Log.print('payload: ${payload}');
var jsonData = jsonDecode(response.body);
if (response.statusCode == 200) {
if (jsonData['status'] == 'success') {
return response.body;
} else {
// String errorMessage = jsonData['message'];
// Get.snackbar('Error'.tr, errorMessage.tr,
// backgroundColor: AppColor.redColor);
return (jsonData['status']);
}
} else {
return response.statusCode;
}
}
Future<dynamic> getAgoraToken({ Future<dynamic> getAgoraToken({
required String channelName, required String channelName,
@@ -206,42 +242,6 @@ class CRUD {
} else {} } else {}
} }
Future<dynamic> post({
required String link,
Map<String, dynamic>? payload,
}) async {
// String? basicAuthCredentials =
// await storage.read(key: BoxName.basicAuthCredentials);
var url = Uri.parse(
link,
);
var response = await http.post(
url,
body: payload,
headers: {
"Content-Type": "application/x-www-form-urlencoded",
'Authorization':
'Basic ${base64Encode(utf8.encode(AK.basicAuthCredentials))}',
},
);
Log.print('request: ${response.request}');
Log.print('response: ${response.body}');
Log.print('payload: ${payload}');
var jsonData = jsonDecode(response.body);
if (response.statusCode == 200) {
if (jsonData['status'] == 'success') {
return response.body;
} else {
// String errorMessage = jsonData['message'];
// Get.snackbar('Error'.tr, errorMessage.tr,
// backgroundColor: AppColor.redColor);
return (jsonData['status']);
}
} else {
return response.statusCode;
}
}
Future<dynamic> postPayMob({ Future<dynamic> postPayMob({
required String link, required String link,
Map<String, dynamic>? payload, Map<String, dynamic>? payload,

View File

@@ -52,7 +52,6 @@ class AppInitializer {
try { try {
var res = var res =
await CRUD().get(link: AppLink.getLocationAreaLinks, payload: {}); await CRUD().get(link: AppLink.getLocationAreaLinks, payload: {});
Log.print('res: ${res}');
if (res != 'failure') { if (res != 'failure') {
links = List<Map<String, dynamic>>.from(jsonDecode(res)['message']); links = List<Map<String, dynamic>>.from(jsonDecode(res)['message']);
await box.remove(BoxName.locationName); await box.remove(BoxName.locationName);
@@ -70,8 +69,6 @@ class AppInitializer {
await box.write(BoxName.paymentLink, await box.write(BoxName.paymentLink,
encryptionHelper.decryptData(links[4]['server_link'])); encryptionHelper.decryptData(links[4]['server_link']));
} }
} catch (e) { } catch (e) {}
print('Error fetching or decoding location data: $e');
}
} }
} }

View File

@@ -1,8 +1,9 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:sefer_driver/constant/box_name.dart';
import 'package:sefer_driver/main.dart'; import '../../constant/box_name.dart';
import 'package:sefer_driver/controller/themes/themes.dart'; import '../../main.dart';
import '../themes/themes.dart';
class LocaleController extends GetxController { class LocaleController extends GetxController {
Locale? language; Locale? language;
@@ -73,6 +74,16 @@ class LocaleController extends GetxController {
appTheme = lightThemeEnglish; appTheme = lightThemeEnglish;
box.write(BoxName.lang, 'hi'); box.write(BoxName.lang, 'hi');
break; break;
case "ar-ma":
locale = const Locale("ar-ma");
appTheme = lightThemeArabic;
box.write(BoxName.lang, 'ar-ma');
break;
case "ar-gulf":
locale = const Locale("ar-gulf");
appTheme = lightThemeArabic;
box.write(BoxName.lang, 'ar-gulf');
break;
default: default:
locale = Locale(Get.deviceLocale!.languageCode); locale = Locale(Get.deviceLocale!.languageCode);
box.write(BoxName.lang, Get.deviceLocale!.languageCode); box.write(BoxName.lang, Get.deviceLocale!.languageCode);

File diff suppressed because it is too large Load Diff

View File

@@ -19,6 +19,7 @@ import '../../constant/links.dart';
import '../../main.dart'; import '../../main.dart';
import '../../print.dart'; import '../../print.dart';
import '../functions/crud.dart'; import '../functions/crud.dart';
import '../functions/encrypt_decrypt.dart';
import '../functions/toast.dart'; import '../functions/toast.dart';
import 'paymob/paymob_wallet.dart'; import 'paymob/paymob_wallet.dart';
@@ -155,15 +156,9 @@ class PaymentController extends GetxController {
paymentIntentClientSecret: clientSecret, paymentIntentClientSecret: clientSecret,
merchantDisplayName: AppInformation.appName, merchantDisplayName: AppInformation.appName,
billingDetails: BillingDetails( billingDetails: BillingDetails(
name: box.read(BoxName.nameDriver) == null name: encryptionHelper.decryptData(box.read(BoxName.nameDriver)),
? box.read(BoxName.name).toString() email: encryptionHelper.decryptData(box.read(BoxName.emailDriver)),
: box.read(BoxName.nameDriver).toString(), phone: encryptionHelper.decryptData(box.read(BoxName.phoneDriver)),
email: box.read(BoxName.emailDriver) == null
? box.read(BoxName.email).toString()
: box.read(BoxName.emailDriver).toString(),
phone: box.read(BoxName.phoneDriver) == null
? box.read(BoxName.phone).toString()
: box.read(BoxName.phoneDriver).toString(),
address: Address( address: Address(
city: 'city', city: 'city',
country: box.read(BoxName.countryCode), //'United States' country: box.read(BoxName.countryCode), //'United States'

View File

@@ -7,6 +7,7 @@ import 'package:url_launcher/url_launcher.dart';
import '../../constant/api_key.dart'; import '../../constant/api_key.dart';
import '../../main.dart'; import '../../main.dart';
import '../functions/encrypt_decrypt.dart';
class PaymobManager extends GetxController { class PaymobManager extends GetxController {
String authanticationToken1 = ""; String authanticationToken1 = "";
@@ -132,11 +133,13 @@ class PaymobManager extends GetxController {
"amount_cents": amount, "amount_cents": amount,
"currency": currency, "currency": currency,
"billing_data": { "billing_data": {
"first_name": box.read(BoxName.nameDriver) ?? box.read(BoxName.name), "first_name":
"last_name": box.read(BoxName.lastNameDriver) ?? box.read(BoxName.name), encryptionHelper.decryptData(box.read(BoxName.nameDriver)),
"email": box.read(BoxName.emailDriver) ?? box.read(BoxName.email), "last_name":
encryptionHelper.decryptData(box.read(BoxName.lastNameDriver)),
"email": encryptionHelper.decryptData(box.read(BoxName.emailDriver)),
"phone_number": "phone_number":
box.read(BoxName.phoneDriver) ?? box.read(BoxName.phone), encryptionHelper.decryptData(box.read(BoxName.phoneDriver)),
"apartment": "NA", "apartment": "NA",
"floor": "NA", "floor": "NA",
"street": "NA", "street": "NA",

View File

@@ -1,4 +1,5 @@
import 'package:sefer_driver/constant/box_name.dart'; import 'package:sefer_driver/constant/box_name.dart';
import 'package:sefer_driver/controller/functions/encrypt_decrypt.dart';
import 'package:sefer_driver/main.dart'; import 'package:sefer_driver/main.dart';
import 'package:dio/dio.dart'; import 'package:dio/dio.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
@@ -223,10 +224,11 @@ class PaymobBillingData {
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
return { return {
"email": box.read(BoxName.email) ?? box.read(BoxName.emailDriver), "email": encryptionHelper.decryptData(box.read(BoxName.emailDriver)),
"first_name": box.read(BoxName.name) ?? box.read(BoxName.nameDriver), "first_name": box.read(BoxName.nameDriver),
"last_name": box.read(BoxName.name) ?? box.read(BoxName.nameDriver), "last_name": box.read(BoxName.nameDriver),
"phone_number": box.read(BoxName.phone) ?? box.read(BoxName.phoneDriver), "phone_number":
encryptionHelper.decryptData(box.read(BoxName.phoneDriver)),
"apartment": apartment ?? "NA", "apartment": apartment ?? "NA",
"floor": floor ?? "NA", "floor": floor ?? "NA",
"building": building ?? "NA", "building": building ?? "NA",

View File

@@ -1,4 +1,5 @@
import 'package:sefer_driver/constant/box_name.dart'; import 'package:sefer_driver/constant/box_name.dart';
import 'package:sefer_driver/controller/functions/encrypt_decrypt.dart';
import 'package:sefer_driver/main.dart'; import 'package:sefer_driver/main.dart';
import 'package:dio/dio.dart'; import 'package:dio/dio.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
@@ -266,10 +267,10 @@ class PaymobBillingDataWallet {
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
return { return {
"email": box.read(BoxName.email) ?? box.read(BoxName.emailDriver), "email": encryptionHelper.decryptData(box.read(BoxName.emailDriver)),
"first_name": box.read(BoxName.name) ?? box.read(BoxName.nameDriver), "first_name": box.read(BoxName.name) ?? box.read(BoxName.nameDriver),
"last_name": box.read(BoxName.name) ?? box.read(BoxName.nameDriver), "last_name": box.read(BoxName.name) ?? box.read(BoxName.nameDriver),
"phone_number": box.read(BoxName.phone) ?? box.read(BoxName.phoneDriver), "phone_number": (box.read(BoxName.phoneWallet)),
"apartment": apartment ?? "NA", "apartment": apartment ?? "NA",
"floor": floor ?? "NA", "floor": floor ?? "NA",
"building": building ?? "NA", "building": building ?? "NA",

View File

@@ -2,22 +2,22 @@ import 'package:get/get.dart';
List<OnBoardingModel> onBoardingList = [ List<OnBoardingModel> onBoardingList = [
OnBoardingModel( OnBoardingModel(
title: 'Welcome to Sefer!'.tr, title: 'Welcome to Tripz!'.tr,
image: 'assets/images/on1.png', image: 'assets/images/on1.png',
body: body:
'Sefer is the ride-hailing app that is safe, reliable, and accessible.' 'Tripz is the ride-hailing app that is safe, reliable, and accessible.'
.tr, .tr,
), ),
OnBoardingModel( OnBoardingModel(
title: 'Get to your destination quickly and easily.'.tr, title: 'Get to your destination quickly and easily.'.tr,
image: 'assets/images/on2.png', image: 'assets/images/on2.png',
body: 'With Sefer, you can get a ride to your destination in minutes.'.tr, body: 'With Tripz, you can get a ride to your destination in minutes.'.tr,
), ),
OnBoardingModel( OnBoardingModel(
title: 'Enjoy a safe and comfortable ride.'.tr, title: 'Enjoy a safe and comfortable ride.'.tr,
image: 'assets/images/on3.png', image: 'assets/images/on3.png',
body: body:
'Sefer is committed to safety, and all of our captains are carefully screened and background checked.' 'Tripz is committed to safety, and all of our captains are carefully screened and background checked.'
.tr, .tr,
), ),
]; ];

View File

@@ -4,6 +4,7 @@ import 'package:sefer_driver/constant/colors.dart';
import 'package:sefer_driver/constant/style.dart'; import 'package:sefer_driver/constant/style.dart';
import 'package:sefer_driver/controller/home/payment/captain_wallet_controller.dart'; import 'package:sefer_driver/controller/home/payment/captain_wallet_controller.dart';
import 'package:sefer_driver/controller/payment/payment_controller.dart'; import 'package:sefer_driver/controller/payment/payment_controller.dart';
import 'package:sefer_driver/views/widgets/mydialoug.dart';
import '../../../constant/box_name.dart'; import '../../../constant/box_name.dart';
import '../../../main.dart'; import '../../../main.dart';
@@ -105,6 +106,13 @@ class PointsCaptain extends StatelessWidget {
.getCaptainWalletFromBuyPoints(); .getCaptainWalletFromBuyPoints();
}); });
} }
MyDialog().getDialog(
'phone number is wrong'.tr,
'',
() {
Get.back();
},
);
// Get.back(); // Get.back();
})); }));
}, },

View File

@@ -1,7 +1,8 @@
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:sefer_driver/views/home/Captin/home_captain/home_captin.dart'; import 'package:sefer_driver/views/home/Captin/home_captain/home_captin.dart';
import 'package:sefer_driver/views/widgets/elevated_btn.dart';
import '../../controller/local/local_controller.dart'; import '../../controller/local/local_controller.dart';
class Language extends StatelessWidget { class Language extends StatelessWidget {
@@ -14,46 +15,55 @@ class Language extends StatelessWidget {
middle: Text('Choose Language'.tr), middle: Text('Choose Language'.tr),
border: null, border: null,
), ),
child: SafeArea( child: Material(
child: GetBuilder<LocaleController>( // Wrap SafeArea with Material widget
builder: (controller) => Center( child: SafeArea(
child: Padding( child: GetBuilder<LocaleController>(
padding: const EdgeInsets.all(16), builder: (controller) => Center(
child: Column( child: Padding(
children: [ padding: const EdgeInsets.symmetric(horizontal: 20),
_buildHeader(), child: Column(
const SizedBox(height: 20), crossAxisAlignment: CrossAxisAlignment.start,
Expanded( children: [
child: ListView( _buildHeader(),
physics: const BouncingScrollPhysics(), const SizedBox(height: 20),
children: [ Expanded(
_buildLanguageButton( child: ListView(
'العربية', 'ar', controller, context), physics: const BouncingScrollPhysics(),
_buildLanguageButton( children: [
'English', 'en', controller, context), _buildLanguageButton(
_buildLanguageButton( 'العربية', 'ar', controller, context, '🇪🇬'),
'Türkçe', 'tr', controller, context), _buildLanguageButton('العربية (الخليج)', 'ar-gulf',
_buildLanguageButton( controller, context, '🇸🇦'),
'Français', 'fr', controller, context), _buildLanguageButton('العربية (المغرب)', 'ar-ma',
_buildLanguageButton( controller, context, '🇲🇦'),
'Italiano', 'it', controller, context), _buildLanguageButton(
_buildLanguageButton( 'English', 'en', controller, context, '🇺🇸'),
'Deutsch', 'de', controller, context), _buildLanguageButton(
_buildLanguageButton( 'Türkçe', 'tr', controller, context, '🇹🇷'),
'Ελληνικά', 'el', controller, context), _buildLanguageButton(
_buildLanguageButton( 'Français', 'fr', controller, context, '🇫🇷'),
'Español', 'es', controller, context), _buildLanguageButton(
_buildLanguageButton( 'Italiano', 'it', controller, context, '🇮🇹'),
'فارسی', 'fa', controller, context), _buildLanguageButton(
_buildLanguageButton('中文', 'zh', controller, context), 'Deutsch', 'de', controller, context, '🇩🇪'),
_buildLanguageButton( _buildLanguageButton(
'Русский', 'ru', controller, context), 'Ελληνικά', 'el', controller, context, '🇬🇷'),
_buildLanguageButton( _buildLanguageButton(
'हिन्दी', 'hi', controller, context), 'Español', 'es', controller, context, '🇪🇸'),
], _buildLanguageButton(
'فارسی', 'fa', controller, context, '🇮🇷'),
_buildLanguageButton(
'中文', 'zh', controller, context, '🇨🇳'),
_buildLanguageButton(
'Русский', 'ru', controller, context, '🇷🇺'),
_buildLanguageButton(
'हिन्दी', 'hi', controller, context, '🇮🇳'),
],
),
), ),
), ],
], ),
), ),
), ),
), ),
@@ -63,39 +73,28 @@ class Language extends StatelessWidget {
} }
Widget _buildHeader() { Widget _buildHeader() {
return Container( return Padding(
padding: const EdgeInsets.all(20), padding: const EdgeInsets.only(top: 20, bottom: 10),
decoration: BoxDecoration(
gradient: const LinearGradient(
colors: [Color(0xFF2196F3), Color(0xFF1976D2)],
begin: Alignment.topLeft,
end: Alignment.bottomRight,
),
borderRadius: BorderRadius.circular(16),
boxShadow: [
BoxShadow(
color: CupertinoColors.systemBlue.withOpacity(0.2),
blurRadius: 10,
offset: const Offset(0, 4),
),
],
),
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
const Icon(
CupertinoIcons.globe,
color: CupertinoColors.white,
size: 48,
),
const SizedBox(height: 16),
Text( Text(
'Choose Language'.tr, 'Language Options'.tr,
style: const TextStyle( style: const TextStyle(
color: CupertinoColors.white, fontSize: 24,
fontSize: 22,
fontWeight: FontWeight.bold, fontWeight: FontWeight.bold,
color: CupertinoColors.black, // Or your theme primary color
), ),
textAlign: TextAlign.center, textAlign: TextAlign.start,
),
const SizedBox(height: 8),
Text(
'Select your preferred language for the app interface.',
style: TextStyle(
fontSize: 16,
color: CupertinoColors.secondaryLabel,
),
textAlign: TextAlign.start,
), ),
], ],
), ),
@@ -103,28 +102,49 @@ class Language extends StatelessWidget {
} }
Widget _buildLanguageButton(String title, String langCode, Widget _buildLanguageButton(String title, String langCode,
LocaleController controller, BuildContext context) { LocaleController controller, BuildContext context, String flagIcon) {
return Padding( return Container(
padding: const EdgeInsets.symmetric(vertical: 8), decoration: BoxDecoration(
child: MyElevatedButton( color: CupertinoColors.white,
title: title, borderRadius: BorderRadius.circular(12),
onPressed: () async { boxShadow: [
controller.changeLang(langCode); BoxShadow(
showCupertinoDialog( color: CupertinoColors.systemGrey5.withOpacity(0.5),
context: context, spreadRadius: 1,
builder: (context) => CupertinoAlertDialog( blurRadius: 3,
title: Text('You should restart app to change language'.tr), offset: const Offset(0, 2),
actions: [ ),
CupertinoDialogAction( ],
child: Text('Ok'.tr), ),
onPressed: () { child: ListTile(
Get.offAll(() => HomeCaptain()); leading: Text(flagIcon,
}, style: const TextStyle(fontSize: 28)), // Using flag icon as leading
), title: Text(
], title,
), style: const TextStyle(
); fontWeight: FontWeight.w500,
}, ),
)); ),
trailing: const Icon(CupertinoIcons.chevron_forward,
color: CupertinoColors.inactiveGray),
onTap: () async {
controller.changeLang(langCode);
showCupertinoDialog(
context: context,
builder: (context) => CupertinoAlertDialog(
title: Text('You should restart app to change language'.tr),
actions: [
CupertinoDialogAction(
child: Text('Ok'.tr),
onPressed: () {
Get.offAll(() => HomeCaptain());
},
),
],
),
);
},
),
);
} }
} }