Update: 2026-06-25 02:55:24
This commit is contained in:
@@ -1,14 +1,4 @@
|
|||||||
PODS:
|
PODS:
|
||||||
- AppAuth (2.0.0):
|
|
||||||
- AppAuth/Core (= 2.0.0)
|
|
||||||
- AppAuth/ExternalUserAgent (= 2.0.0)
|
|
||||||
- AppAuth/Core (2.0.0)
|
|
||||||
- AppAuth/ExternalUserAgent (2.0.0):
|
|
||||||
- AppAuth/Core
|
|
||||||
- AppCheckCore (11.2.0):
|
|
||||||
- GoogleUtilities/Environment (~> 8.0)
|
|
||||||
- GoogleUtilities/UserDefaults (~> 8.0)
|
|
||||||
- PromisesObjC (~> 2.4)
|
|
||||||
- audio_session (0.0.1):
|
- audio_session (0.0.1):
|
||||||
- Flutter
|
- Flutter
|
||||||
- battery_plus (1.0.0):
|
- battery_plus (1.0.0):
|
||||||
@@ -103,19 +93,9 @@ PODS:
|
|||||||
- geolocator_apple (1.2.0):
|
- geolocator_apple (1.2.0):
|
||||||
- Flutter
|
- Flutter
|
||||||
- FlutterMacOS
|
- FlutterMacOS
|
||||||
- google_sign_in_ios (0.0.1):
|
|
||||||
- Flutter
|
|
||||||
- FlutterMacOS
|
|
||||||
- GoogleSignIn (~> 9.0)
|
|
||||||
- GTMSessionFetcher (>= 3.4.0)
|
|
||||||
- GoogleDataTransport (10.1.0):
|
- GoogleDataTransport (10.1.0):
|
||||||
- nanopb (~> 3.30910.0)
|
- nanopb (~> 3.30910.0)
|
||||||
- PromisesObjC (~> 2.4)
|
- PromisesObjC (~> 2.4)
|
||||||
- GoogleSignIn (9.1.0):
|
|
||||||
- AppAuth (~> 2.0)
|
|
||||||
- AppCheckCore (~> 11.0)
|
|
||||||
- GTMAppAuth (~> 5.0)
|
|
||||||
- GTMSessionFetcher/Core (~> 3.3)
|
|
||||||
- GoogleUtilities/AppDelegateSwizzler (8.1.0):
|
- GoogleUtilities/AppDelegateSwizzler (8.1.0):
|
||||||
- GoogleUtilities/Environment
|
- GoogleUtilities/Environment
|
||||||
- GoogleUtilities/Logger
|
- GoogleUtilities/Logger
|
||||||
@@ -140,14 +120,7 @@ PODS:
|
|||||||
- GoogleUtilities/UserDefaults (8.1.0):
|
- GoogleUtilities/UserDefaults (8.1.0):
|
||||||
- GoogleUtilities/Logger
|
- GoogleUtilities/Logger
|
||||||
- GoogleUtilities/Privacy
|
- GoogleUtilities/Privacy
|
||||||
- GTMAppAuth (5.0.0):
|
|
||||||
- AppAuth/Core (~> 2.0)
|
|
||||||
- GTMSessionFetcher/Core (< 4.0, >= 3.3)
|
|
||||||
- GTMSessionFetcher (3.5.0):
|
|
||||||
- GTMSessionFetcher/Full (= 3.5.0)
|
|
||||||
- GTMSessionFetcher/Core (3.5.0)
|
- GTMSessionFetcher/Core (3.5.0)
|
||||||
- GTMSessionFetcher/Full (3.5.0):
|
|
||||||
- GTMSessionFetcher/Core
|
|
||||||
- image_cropper (0.0.5):
|
- image_cropper (0.0.5):
|
||||||
- Flutter
|
- Flutter
|
||||||
- TOCropViewController (~> 3.1.2)
|
- TOCropViewController (~> 3.1.2)
|
||||||
@@ -250,7 +223,6 @@ DEPENDENCIES:
|
|||||||
- flutter_web_browser (from `.symlinks/plugins/flutter_web_browser/ios`)
|
- flutter_web_browser (from `.symlinks/plugins/flutter_web_browser/ios`)
|
||||||
- flutter_webrtc (from `.symlinks/plugins/flutter_webrtc/ios`)
|
- flutter_webrtc (from `.symlinks/plugins/flutter_webrtc/ios`)
|
||||||
- geolocator_apple (from `.symlinks/plugins/geolocator_apple/darwin`)
|
- geolocator_apple (from `.symlinks/plugins/geolocator_apple/darwin`)
|
||||||
- google_sign_in_ios (from `.symlinks/plugins/google_sign_in_ios/darwin`)
|
|
||||||
- image_cropper (from `.symlinks/plugins/image_cropper/ios`)
|
- image_cropper (from `.symlinks/plugins/image_cropper/ios`)
|
||||||
- image_picker_ios (from `.symlinks/plugins/image_picker_ios/ios`)
|
- image_picker_ios (from `.symlinks/plugins/image_picker_ios/ios`)
|
||||||
- jailbreak_root_detection (from `.symlinks/plugins/jailbreak_root_detection/ios`)
|
- jailbreak_root_detection (from `.symlinks/plugins/jailbreak_root_detection/ios`)
|
||||||
@@ -274,8 +246,6 @@ DEPENDENCIES:
|
|||||||
|
|
||||||
SPEC REPOS:
|
SPEC REPOS:
|
||||||
trunk:
|
trunk:
|
||||||
- AppAuth
|
|
||||||
- AppCheckCore
|
|
||||||
- Firebase
|
- Firebase
|
||||||
- FirebaseAppCheckInterop
|
- FirebaseAppCheckInterop
|
||||||
- FirebaseAuth
|
- FirebaseAuth
|
||||||
@@ -286,9 +256,7 @@ SPEC REPOS:
|
|||||||
- FirebaseInstallations
|
- FirebaseInstallations
|
||||||
- FirebaseMessaging
|
- FirebaseMessaging
|
||||||
- GoogleDataTransport
|
- GoogleDataTransport
|
||||||
- GoogleSignIn
|
|
||||||
- GoogleUtilities
|
- GoogleUtilities
|
||||||
- GTMAppAuth
|
|
||||||
- GTMSessionFetcher
|
- GTMSessionFetcher
|
||||||
- IOSSecuritySuite
|
- IOSSecuritySuite
|
||||||
- libwebp
|
- libwebp
|
||||||
@@ -342,8 +310,6 @@ EXTERNAL SOURCES:
|
|||||||
:path: ".symlinks/plugins/flutter_webrtc/ios"
|
:path: ".symlinks/plugins/flutter_webrtc/ios"
|
||||||
geolocator_apple:
|
geolocator_apple:
|
||||||
:path: ".symlinks/plugins/geolocator_apple/darwin"
|
:path: ".symlinks/plugins/geolocator_apple/darwin"
|
||||||
google_sign_in_ios:
|
|
||||||
:path: ".symlinks/plugins/google_sign_in_ios/darwin"
|
|
||||||
image_cropper:
|
image_cropper:
|
||||||
:path: ".symlinks/plugins/image_cropper/ios"
|
:path: ".symlinks/plugins/image_cropper/ios"
|
||||||
image_picker_ios:
|
image_picker_ios:
|
||||||
@@ -386,8 +352,6 @@ EXTERNAL SOURCES:
|
|||||||
:path: ".symlinks/plugins/webview_flutter_wkwebview/darwin"
|
:path: ".symlinks/plugins/webview_flutter_wkwebview/darwin"
|
||||||
|
|
||||||
SPEC CHECKSUMS:
|
SPEC CHECKSUMS:
|
||||||
AppAuth: 1c1a8afa7e12f2ec3a294d9882dfa5ab7d3cb063
|
|
||||||
AppCheckCore: cc8fd0a3a230ddd401f326489c99990b013f0c4f
|
|
||||||
audio_session: 9bb7f6c970f21241b19f5a3658097ae459681ba0
|
audio_session: 9bb7f6c970f21241b19f5a3658097ae459681ba0
|
||||||
battery_plus: b42253f6d2dde71712f8c36fef456d99121c5977
|
battery_plus: b42253f6d2dde71712f8c36fef456d99121c5977
|
||||||
connectivity_plus: cb623214f4e1f6ef8fe7403d580fdad517d2f7dd
|
connectivity_plus: cb623214f4e1f6ef8fe7403d580fdad517d2f7dd
|
||||||
@@ -416,11 +380,8 @@ SPEC CHECKSUMS:
|
|||||||
flutter_web_browser: 68b27d2c4773b059cef19e12c890cb204518d3c3
|
flutter_web_browser: 68b27d2c4773b059cef19e12c890cb204518d3c3
|
||||||
flutter_webrtc: ec91d94b484ad49cf191ef93413f64a40ffd3b4c
|
flutter_webrtc: ec91d94b484ad49cf191ef93413f64a40ffd3b4c
|
||||||
geolocator_apple: ab36aa0e8b7d7a2d7639b3b4e48308394e8cef5e
|
geolocator_apple: ab36aa0e8b7d7a2d7639b3b4e48308394e8cef5e
|
||||||
google_sign_in_ios: 000870aa06da9b28d1d0bf7ef70ff0213059dd28
|
|
||||||
GoogleDataTransport: aae35b7ea0c09004c3797d53c8c41f66f219d6a7
|
GoogleDataTransport: aae35b7ea0c09004c3797d53c8c41f66f219d6a7
|
||||||
GoogleSignIn: fcee2257188d5eda57a5e2b6a715550ffff9206d
|
|
||||||
GoogleUtilities: 00c88b9a86066ef77f0da2fab05f65d7768ed8e1
|
GoogleUtilities: 00c88b9a86066ef77f0da2fab05f65d7768ed8e1
|
||||||
GTMAppAuth: 217a876b249c3c585a54fd6f73e6b58c4f5c4238
|
|
||||||
GTMSessionFetcher: 5aea5ba6bd522a239e236100971f10cb71b96ab6
|
GTMSessionFetcher: 5aea5ba6bd522a239e236100971f10cb71b96ab6
|
||||||
image_cropper: fca51f94982730acae168c4b5d691e0f11aeb259
|
image_cropper: fca51f94982730acae168c4b5d691e0f11aeb259
|
||||||
image_picker_ios: e0ece4aa2a75771a7de3fa735d26d90817041326
|
image_picker_ios: e0ece4aa2a75771a7de3fa735d26d90817041326
|
||||||
|
|||||||
@@ -351,9 +351,10 @@ class RegistrationController extends GetxController {
|
|||||||
final uri = Uri.parse(link);
|
final uri = Uri.parse(link);
|
||||||
final request = http.MultipartRequest('POST', uri);
|
final request = http.MultipartRequest('POST', uri);
|
||||||
|
|
||||||
|
final _jwt = box.read(BoxName.jwt);
|
||||||
|
final String _token = _jwt != null ? r(_jwt).split(AppInformation.addd)[0] : '';
|
||||||
final headers = <String, String>{
|
final headers = <String, String>{
|
||||||
'Authorization':
|
'Authorization': 'Bearer $_token',
|
||||||
'Bearer ${r(box.read(BoxName.jwt)).split(AppInformation.addd)[0]}',
|
|
||||||
'X-HMAC-Auth': '${box.read(BoxName.hmac)}',
|
'X-HMAC-Auth': '${box.read(BoxName.hmac)}',
|
||||||
};
|
};
|
||||||
request.headers.addAll(headers);
|
request.headers.addAll(headers);
|
||||||
@@ -542,8 +543,8 @@ class RegistrationController extends GetxController {
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
// ترويسات مشتركة
|
// ترويسات مشتركة
|
||||||
final bearer =
|
final _jwt = box.read(BoxName.jwt);
|
||||||
'Bearer ${r(box.read(BoxName.jwt)).split(AppInformation.addd)[0]}';
|
final bearer = 'Bearer ${_jwt != null ? r(_jwt).split(AppInformation.addd)[0] : ''}';
|
||||||
final hmac = '${box.read(BoxName.hmac)}';
|
final hmac = '${box.read(BoxName.hmac)}';
|
||||||
|
|
||||||
String fingerPrint =
|
String fingerPrint =
|
||||||
|
|||||||
@@ -97,6 +97,16 @@ class CRUD {
|
|||||||
return box.read(BoxName.deviceFingerprint)?.toString() ?? '';
|
return box.read(BoxName.deviceFingerprint)?.toString() ?? '';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
String _getJwt() {
|
||||||
|
try {
|
||||||
|
final jwt = box.read(BoxName.jwt);
|
||||||
|
if (jwt == null || jwt.toString().isEmpty) return '';
|
||||||
|
return r(jwt).toString().split(Env.addd)[0];
|
||||||
|
} catch (_) {
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// ═══════════════════════════════════════════════════════════════
|
// ═══════════════════════════════════════════════════════════════
|
||||||
// _makeRequest — دالة مركزية لكل الطلبات
|
// _makeRequest — دالة مركزية لكل الطلبات
|
||||||
// ───────────────────────────────────────────────────────────────
|
// ───────────────────────────────────────────────────────────────
|
||||||
@@ -207,14 +217,14 @@ class CRUD {
|
|||||||
required String link,
|
required String link,
|
||||||
Map<String, dynamic>? payload,
|
Map<String, dynamic>? payload,
|
||||||
}) async {
|
}) async {
|
||||||
String token = r(box.read(BoxName.jwt)).toString().split(Env.addd)[0];
|
String token = _getJwt();
|
||||||
|
|
||||||
// فحص صلاحية التوكن قبل الإرسال — تجنب طلب مضمون الرفض
|
// فحص صلاحية التوكن قبل الإرسال — تجنب طلب مضمون الرفض
|
||||||
if (!_isJwtValid(token) && !_isRefreshingJWT) {
|
if (!_isJwtValid(token) && !_isRefreshingJWT) {
|
||||||
_isRefreshingJWT = true;
|
_isRefreshingJWT = true;
|
||||||
try {
|
try {
|
||||||
await Get.put(LoginDriverController()).getJWT();
|
await Get.put(LoginDriverController()).getJWT();
|
||||||
token = r(box.read(BoxName.jwt)).toString().split(Env.addd)[0];
|
token = _getJwt();
|
||||||
} finally {
|
} finally {
|
||||||
_isRefreshingJWT = false;
|
_isRefreshingJWT = false;
|
||||||
}
|
}
|
||||||
@@ -239,12 +249,12 @@ class CRUD {
|
|||||||
}) async {
|
}) async {
|
||||||
try {
|
try {
|
||||||
// فحص صلاحية التوكن قبل الإرسال
|
// فحص صلاحية التوكن قبل الإرسال
|
||||||
String token = r(box.read(BoxName.jwt)).toString().split(Env.addd)[0];
|
String token = _getJwt();
|
||||||
if (!_isJwtValid(token) && !_isRefreshingJWT) {
|
if (!_isJwtValid(token) && !_isRefreshingJWT) {
|
||||||
_isRefreshingJWT = true;
|
_isRefreshingJWT = true;
|
||||||
try {
|
try {
|
||||||
await Get.put(LoginDriverController()).getJWT();
|
await Get.put(LoginDriverController()).getJWT();
|
||||||
token = r(box.read(BoxName.jwt)).toString().split(Env.addd)[0];
|
token = _getJwt();
|
||||||
} finally {
|
} finally {
|
||||||
_isRefreshingJWT = false;
|
_isRefreshingJWT = false;
|
||||||
}
|
}
|
||||||
@@ -557,11 +567,11 @@ class CRUD {
|
|||||||
// ── sendEmail — إصلاح: استخدام r() بدل X.r() القديم ─────────
|
// ── sendEmail — إصلاح: استخدام r() بدل X.r() القديم ─────────
|
||||||
Future<void> sendEmail(String link, Map<String, String>? payload) async {
|
Future<void> sendEmail(String link, Map<String, String>? payload) async {
|
||||||
// r() هي نفس دالة فك التشفير الثلاثي المختصرة
|
// r() هي نفس دالة فك التشفير الثلاثي المختصرة
|
||||||
String token = r(box.read(BoxName.jwt)).toString().split(Env.addd)[0];
|
String token = _getJwt();
|
||||||
|
|
||||||
if (!_isJwtValid(token)) {
|
if (!_isJwtValid(token)) {
|
||||||
await LoginDriverController().getJWT();
|
await LoginDriverController().getJWT();
|
||||||
token = r(box.read(BoxName.jwt)).toString().split(Env.addd)[0];
|
token = _getJwt();
|
||||||
}
|
}
|
||||||
|
|
||||||
final headers = {
|
final headers = {
|
||||||
|
|||||||
@@ -479,9 +479,10 @@ class AI extends GetxController {
|
|||||||
bool isLoadingVehicleFrontSy = false;
|
bool isLoadingVehicleFrontSy = false;
|
||||||
bool isLoadingVehicleBackSy = false;
|
bool isLoadingVehicleBackSy = false;
|
||||||
Future<void> sendToAI(String type, {required File imageFile}) async {
|
Future<void> sendToAI(String type, {required File imageFile}) async {
|
||||||
|
final _jwt = box.read(BoxName.jwt);
|
||||||
|
final String _token = _jwt != null ? r(_jwt).split(AppInformation.addd)[0] : '';
|
||||||
final headers = {
|
final headers = {
|
||||||
'Authorization':
|
'Authorization': 'Bearer $_token',
|
||||||
'Bearer ${r(box.read(BoxName.jwt)).split(AppInformation.addd)[0]}',
|
|
||||||
'X-HMAC-Auth': '${box.read(BoxName.hmac)}',
|
'X-HMAC-Auth': '${box.read(BoxName.hmac)}',
|
||||||
};
|
};
|
||||||
final driverID = box.read(BoxName.driverID) ?? 'eddfdfdgfd';
|
final driverID = box.read(BoxName.driverID) ?? 'eddfdfdgfd';
|
||||||
|
|||||||
@@ -311,7 +311,8 @@ class ImageController extends GetxController {
|
|||||||
required String filename,
|
required String filename,
|
||||||
required String methodLabel,
|
required String methodLabel,
|
||||||
}) async {
|
}) async {
|
||||||
final String token = r(box.read(BoxName.jwt)).split(AppInformation.addd)[0];
|
final jwt = box.read(BoxName.jwt);
|
||||||
|
final String token = jwt != null ? r(jwt).split(AppInformation.addd)[0] : '';
|
||||||
final String fingerPrint = box.read(BoxName.deviceFingerprint)?.toString() ?? '';
|
final String fingerPrint = box.read(BoxName.deviceFingerprint)?.toString() ?? '';
|
||||||
final int fileSizeBytes = await file.length();
|
final int fileSizeBytes = await file.length();
|
||||||
|
|
||||||
|
|||||||
@@ -87,7 +87,8 @@ class ComplaintController extends GetxController {
|
|||||||
|
|
||||||
var uri = Uri.parse(AppLink.uploadAudio);
|
var uri = Uri.parse(AppLink.uploadAudio);
|
||||||
var request = http.MultipartRequest('POST', uri);
|
var request = http.MultipartRequest('POST', uri);
|
||||||
String token = r(box.read(BoxName.jwt)).toString().split(Env.addd)[0];
|
final jwt = box.read(BoxName.jwt);
|
||||||
|
String token = jwt != null ? r(jwt).toString().split(Env.addd)[0] : '';
|
||||||
final String fingerPrint = box.read(BoxName.deviceFingerprint)?.toString() ?? '';
|
final String fingerPrint = box.read(BoxName.deviceFingerprint)?.toString() ?? '';
|
||||||
|
|
||||||
var mimeType = lookupMimeType(audioFile.path);
|
var mimeType = lookupMimeType(audioFile.path);
|
||||||
|
|||||||
@@ -48,9 +48,9 @@ class CustomSliderOnBoarding extends GetView<OnBoardingControllerImp> {
|
|||||||
children: [
|
children: [
|
||||||
Image.asset(
|
Image.asset(
|
||||||
onBoardingList[i].image!,
|
onBoardingList[i].image!,
|
||||||
// width: ,
|
width: Get.width * 0.8,
|
||||||
height: Get.width / 2,
|
height: Get.width * 0.65,
|
||||||
fit: BoxFit.fill,
|
fit: BoxFit.contain,
|
||||||
),
|
),
|
||||||
const SizedBox(height: 20),
|
const SizedBox(height: 20),
|
||||||
Text(onBoardingList[i].title!,
|
Text(onBoardingList[i].title!,
|
||||||
|
|||||||
@@ -16,10 +16,9 @@ class SplashScreen extends StatelessWidget {
|
|||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
final controller = Get.put(SplashScreenController());
|
final controller = Get.put(SplashScreenController());
|
||||||
final size = MediaQuery.of(context).size;
|
final size = MediaQuery.of(context).size;
|
||||||
final isDark = Get.isDarkMode;
|
|
||||||
final bg = isDark ? const Color(0xFF0A0F1E) : AppColor.primaryColor;
|
|
||||||
final accent = AppColor.secondaryColorStatic;
|
final accent = AppColor.secondaryColorStatic;
|
||||||
final gold = AppColor.gold;
|
final gold = AppColor.gold;
|
||||||
|
final bg = AppColor.primaryColor;
|
||||||
|
|
||||||
return SafeArea(
|
return SafeArea(
|
||||||
child: Scaffold(
|
child: Scaffold(
|
||||||
@@ -37,8 +36,7 @@ class SplashScreen extends StatelessWidget {
|
|||||||
end: Alignment.bottomRight,
|
end: Alignment.bottomRight,
|
||||||
colors: [
|
colors: [
|
||||||
bg,
|
bg,
|
||||||
Color.lerp(bg, accent.withOpacity(0.1),
|
Color.lerp(bg, accent.withOpacity(0.08), controller.glowAnimation.value)!,
|
||||||
controller.glowAnimation.value)!,
|
|
||||||
bg,
|
bg,
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
@@ -326,7 +324,9 @@ class _GlowProgressBar extends StatelessWidget {
|
|||||||
height: 2,
|
height: 2,
|
||||||
decoration: BoxDecoration(
|
decoration: BoxDecoration(
|
||||||
color: Colors.white.withOpacity(0.06),
|
color: Colors.white.withOpacity(0.06),
|
||||||
borderRadius: BorderRadius.circular(2))),
|
borderRadius: BorderRadius.circular(2),
|
||||||
|
),
|
||||||
|
),
|
||||||
FractionallySizedBox(
|
FractionallySizedBox(
|
||||||
widthFactor: value.clamp(0.0, 1.0),
|
widthFactor: value.clamp(0.0, 1.0),
|
||||||
child: Container(
|
child: Container(
|
||||||
@@ -339,7 +339,8 @@ class _GlowProgressBar extends StatelessWidget {
|
|||||||
BoxShadow(
|
BoxShadow(
|
||||||
color: accent.withOpacity(0.4),
|
color: accent.withOpacity(0.4),
|
||||||
blurRadius: 8,
|
blurRadius: 8,
|
||||||
spreadRadius: 1)
|
spreadRadius: 1,
|
||||||
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|||||||
@@ -52,6 +52,7 @@ class _CliqPaymentSheetState extends State<CliqPaymentSheet> {
|
|||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
final accent = AppColor.secondaryColorStatic;
|
final accent = AppColor.secondaryColorStatic;
|
||||||
|
final navy = AppColor.primaryColor;
|
||||||
return Padding(
|
return Padding(
|
||||||
padding: EdgeInsets.only(
|
padding: EdgeInsets.only(
|
||||||
left: 24, right: 24, top: 20,
|
left: 24, right: 24, top: 20,
|
||||||
@@ -68,7 +69,7 @@ class _CliqPaymentSheetState extends State<CliqPaymentSheet> {
|
|||||||
child: Container(
|
child: Container(
|
||||||
width: 36, height: 4,
|
width: 36, height: 4,
|
||||||
decoration: BoxDecoration(
|
decoration: BoxDecoration(
|
||||||
color: Colors.white.withOpacity(0.2),
|
color: Colors.grey.shade300,
|
||||||
borderRadius: BorderRadius.circular(2),
|
borderRadius: BorderRadius.circular(2),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
@@ -76,14 +77,11 @@ class _CliqPaymentSheetState extends State<CliqPaymentSheet> {
|
|||||||
const SizedBox(height: 20),
|
const SizedBox(height: 20),
|
||||||
|
|
||||||
// Title
|
// Title
|
||||||
Text('Pay by Cliq'.tr, style: AppStyle.headTitle2),
|
Text('Pay by Cliq'.tr, style: AppStyle.headTitle2.copyWith(color: navy)),
|
||||||
const SizedBox(height: 4),
|
const SizedBox(height: 4),
|
||||||
Text(
|
Text(
|
||||||
'Enter your Cliq wallet details'.tr,
|
'Enter your Cliq wallet details'.tr,
|
||||||
style: TextStyle(
|
style: TextStyle(color: navy.withOpacity(0.5), fontSize: 13),
|
||||||
color: Colors.white.withOpacity(0.5),
|
|
||||||
fontSize: 13,
|
|
||||||
),
|
|
||||||
),
|
),
|
||||||
const SizedBox(height: 24),
|
const SizedBox(height: 24),
|
||||||
|
|
||||||
@@ -91,26 +89,26 @@ class _CliqPaymentSheetState extends State<CliqPaymentSheet> {
|
|||||||
TextFormField(
|
TextFormField(
|
||||||
controller: _phoneCtrl,
|
controller: _phoneCtrl,
|
||||||
keyboardType: TextInputType.phone,
|
keyboardType: TextInputType.phone,
|
||||||
style: const TextStyle(color: Colors.white, fontSize: 16, letterSpacing: 1.2),
|
style: TextStyle(color: navy, fontSize: 16, letterSpacing: 1.2),
|
||||||
decoration: InputDecoration(
|
decoration: InputDecoration(
|
||||||
labelText: 'Wallet Phone Number'.tr,
|
labelText: 'Wallet Phone Number'.tr,
|
||||||
hintText: CountryLogic.getPhoneHint(box.read(BoxName.countryCode) ?? 'Jordan'),
|
hintText: CountryLogic.getPhoneHint(box.read(BoxName.countryCode) ?? 'Jordan'),
|
||||||
hintStyle: TextStyle(color: Colors.white.withOpacity(0.3)),
|
hintStyle: TextStyle(color: navy.withOpacity(0.3)),
|
||||||
labelStyle: TextStyle(color: accent.withOpacity(0.7)),
|
labelStyle: TextStyle(color: accent),
|
||||||
filled: true,
|
filled: true,
|
||||||
fillColor: Colors.white.withOpacity(0.06),
|
fillColor: Colors.grey.shade50,
|
||||||
border: OutlineInputBorder(
|
border: OutlineInputBorder(
|
||||||
borderRadius: BorderRadius.circular(12),
|
borderRadius: BorderRadius.circular(12),
|
||||||
borderSide: BorderSide.none,
|
borderSide: BorderSide(color: Colors.grey.shade200),
|
||||||
),
|
),
|
||||||
focusedBorder: OutlineInputBorder(
|
focusedBorder: OutlineInputBorder(
|
||||||
borderRadius: BorderRadius.circular(12),
|
borderRadius: BorderRadius.circular(12),
|
||||||
borderSide: BorderSide(color: accent, width: 1.5),
|
borderSide: BorderSide(color: accent, width: 1.5),
|
||||||
),
|
),
|
||||||
prefixIcon: Icon(Icons.phone_android, color: accent.withOpacity(0.6)),
|
prefixIcon: Icon(Icons.phone_android, color: accent),
|
||||||
suffixIcon: _phoneCtrl.text.isNotEmpty
|
suffixIcon: _phoneCtrl.text.isNotEmpty
|
||||||
? IconButton(
|
? IconButton(
|
||||||
icon: Icon(Icons.clear, color: Colors.white.withOpacity(0.4)),
|
icon: Icon(Icons.clear, color: navy.withOpacity(0.4)),
|
||||||
onPressed: () => setState(() => _phoneCtrl.clear()),
|
onPressed: () => setState(() => _phoneCtrl.clear()),
|
||||||
)
|
)
|
||||||
: null,
|
: null,
|
||||||
@@ -126,7 +124,7 @@ class _CliqPaymentSheetState extends State<CliqPaymentSheet> {
|
|||||||
Container(
|
Container(
|
||||||
padding: const EdgeInsets.all(14),
|
padding: const EdgeInsets.all(14),
|
||||||
decoration: BoxDecoration(
|
decoration: BoxDecoration(
|
||||||
color: accent.withOpacity(0.08),
|
color: accent.withOpacity(0.06),
|
||||||
borderRadius: BorderRadius.circular(12),
|
borderRadius: BorderRadius.circular(12),
|
||||||
border: Border.all(color: accent.withOpacity(0.15)),
|
border: Border.all(color: accent.withOpacity(0.15)),
|
||||||
),
|
),
|
||||||
@@ -138,10 +136,10 @@ class _CliqPaymentSheetState extends State<CliqPaymentSheet> {
|
|||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
children: [
|
children: [
|
||||||
Text('Invoice Amount'.tr,
|
Text('Invoice Amount'.tr,
|
||||||
style: TextStyle(fontSize: 11, color: Colors.white.withOpacity(0.5))),
|
style: TextStyle(fontSize: 11, color: navy.withOpacity(0.5))),
|
||||||
const SizedBox(height: 2),
|
const SizedBox(height: 2),
|
||||||
Text('${PaymentTierConfig.formatAmount(widget.amount)} ${CurrencyHelper.currency}',
|
Text('${PaymentTierConfig.formatAmount(widget.amount)} ${CurrencyHelper.currency}',
|
||||||
style: const TextStyle(fontSize: 18, fontWeight: FontWeight.w700, color: Colors.white)),
|
style: TextStyle(fontSize: 18, fontWeight: FontWeight.w700, color: navy)),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
|||||||
@@ -35,7 +35,8 @@ class PassengerWallet extends StatelessWidget {
|
|||||||
Stack(
|
Stack(
|
||||||
children: [
|
children: [
|
||||||
// استخدام Column لتنظيم المحتوى بشكل أفضل
|
// استخدام Column لتنظيم المحتوى بشكل أفضل
|
||||||
Padding(
|
SingleChildScrollView(
|
||||||
|
child: Padding(
|
||||||
padding: const EdgeInsets.symmetric(horizontal: 16.0),
|
padding: const EdgeInsets.symmetric(horizontal: 16.0),
|
||||||
child: Column(
|
child: Column(
|
||||||
crossAxisAlignment: CrossAxisAlignment.stretch,
|
crossAxisAlignment: CrossAxisAlignment.stretch,
|
||||||
@@ -77,6 +78,7 @@ class PassengerWallet extends StatelessWidget {
|
|||||||
],
|
],
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
),
|
||||||
|
|
||||||
// --- عرض الـ Dialog بنفس طريقتك القديمة ---
|
// --- عرض الـ Dialog بنفس طريقتك القديمة ---
|
||||||
const PassengerWalletDialog(),
|
const PassengerWalletDialog(),
|
||||||
|
|||||||
@@ -346,7 +346,7 @@ void showPaymentOptions(BuildContext context, PaymentController controller) {
|
|||||||
showModalBottomSheet(
|
showModalBottomSheet(
|
||||||
context: context,
|
context: context,
|
||||||
isScrollControlled: true,
|
isScrollControlled: true,
|
||||||
backgroundColor: AppColor.primaryColor,
|
backgroundColor: Colors.white,
|
||||||
shape: const RoundedRectangleBorder(
|
shape: const RoundedRectangleBorder(
|
||||||
borderRadius: BorderRadius.vertical(top: Radius.circular(20)),
|
borderRadius: BorderRadius.vertical(top: Radius.circular(20)),
|
||||||
),
|
),
|
||||||
|
|||||||
Reference in New Issue
Block a user