Update codebase

This commit is contained in:
Hamza-Ayed
2026-08-09 16:56:13 +03:00
parent 95e2e4f35d
commit b64debaa88
1058 changed files with 164327 additions and 113928 deletions
@@ -153,8 +153,7 @@ class MarkerGenerator {
..strokeWidth = 3.0;
canvas.drawCircle(const Offset(size / 2, size / 2), size / 2.5, paint);
canvas.drawCircle(
const Offset(size / 2, size / 2), size / 2.5, borderPaint);
canvas.drawCircle(const Offset(size / 2, size / 2), size / 2.5, borderPaint);
TextPainter iconPainter = TextPainter(textDirection: TextDirection.ltr);
iconPainter.text = TextSpan(
@@ -5,8 +5,8 @@ import 'package:flutter_overlay_window/flutter_overlay_window.dart';
import 'package:get/get.dart';
import 'package:intl/intl.dart';
import 'package:just_audio/just_audio.dart';
import 'package:tripz_driver/constant/api_key.dart';
import 'package:tripz_driver/models/overlay_service.dart';
import 'package:siro_driver/constant/api_key.dart';
import 'package:siro_driver/models/overlay_service.dart';
import '../../../../constant/box_name.dart';
import '../../../../constant/links.dart';
import '../../../../controller/firebase/local_notification.dart';
@@ -41,9 +41,16 @@ class OrderOverlay extends StatefulWidget {
class _OrderOverlayState extends State<OrderOverlay>
with WidgetsBindingObserver {
// === State Variables ===
/// مدة مرحلة "الطلب العام" بعد انتهاء السبق الحصري.
static const int kPublicWindowSeconds = 15;
OrderData? orderData;
Timer? timer;
int remainingSeconds = 10;
int remainingSeconds = kPublicWindowSeconds;
/// هل ما زلنا داخل ثواني السبق الحصري؟ تنقلب إلى false تلقائياً حين
/// يتبقّى من العدّاد ما يساوي مدة المرحلة العامة.
bool isExclusive = false;
final AudioPlayer audioPlayer = AudioPlayer();
bool buttonsEnabled = true;
final String mapApiKey = AK.mapAPIKEY;
@@ -113,20 +120,29 @@ class _OrderOverlayState extends State<OrderOverlay>
void _processEventData(dynamic event) {
_log("Received event: $event");
if (event is List<dynamic>) {
try {
myList = event;
final newOrder = OrderData.fromList(event);
_log("Parsed OrderData: ${newOrder.toMap()}");
setState(() {
orderData = newOrder;
});
_resetAndStartTimer();
} catch (e, s) {
_log("Error parsing OrderData: $e\nStackTrace: $s");
// ‏مساران يغذّيان هذه النافذة بشكلين مختلفين:
// • FCM → قائمة مفهرسة
// • السوكِت → خريطة JSON
// ‏كان الشرط يقبل القائمة وحدها، فحمولة السوكِت تُرفض بصمت ولا تظهر
// ‏نافذة إطلاقاً. OrderData.fromAny يوحّد الشكلين.
try {
final newOrder = OrderData.fromAny(event);
if (newOrder == null) {
_log("Unexpected data format: $event");
return;
}
} else {
_log("Unexpected data format: $event");
if (event is List) myList = event;
_log("Parsed OrderData: ${newOrder.toMap()}");
setState(() {
orderData = newOrder;
isExclusive = newOrder.offerType == 'exclusive';
});
_resetAndStartTimer();
} catch (e, s) {
_log("Error parsing OrderData: $e\nStackTrace: $s");
}
}
@@ -151,13 +167,16 @@ class _OrderOverlayState extends State<OrderOverlay>
_startTimer();
}
/// المدة الكلية للنافذة = ثواني السبق الحصري + مدة الطلب العام.
///
/// في وضع الإسناد بالدفعات: ٥ ثوانٍ الطلب خاص بهذا السائق، ثم ١٥ ثانية
/// طلب عام يتنافس فيها مع غيره — أي نافذة ٢٠ ثانية إجمالاً.
/// في البثّ الحر (بلا offerType): ١٥ ثانية عامة فقط، بلا شارة.
int _calculateTimerDuration() {
if (orderData?.durationToPassengerMinutes != null &&
orderData!.durationToPassengerMinutes > 0) {
int duration = orderData!.durationToPassengerMinutes * 60;
return duration > 10 ? 10 : duration;
}
return 10;
final int head = orderData?.offerType == 'exclusive'
? (orderData!.offerExpiresIn > 0 ? orderData!.offerExpiresIn : 5)
: 0;
return head + kPublicWindowSeconds;
}
void _startTimer() {
@@ -171,6 +190,11 @@ class _OrderOverlayState extends State<OrderOverlay>
setState(() {
if (remainingSeconds > 0) {
remainingSeconds--;
// ‏انتهى السبق: الطلب صار عاماً. النافذة لا تُغلق — السائق يظل
// ‏قادراً على القبول لكنه صار يتنافس.
if (isExclusive && remainingSeconds <= kPublicWindowSeconds) {
isExclusive = false;
}
} else {
timer.cancel();
_stopAudio();
@@ -450,12 +474,37 @@ class _OrderOverlayState extends State<OrderOverlay>
children: [
Row(
children: [
Icon(Icons.drive_eta_rounded, color: AppColors.white, size: 24),
Icon(
orderData?.isScheduled == true
? Icons.schedule
: isExclusive
? Icons.star_rounded
: Icons.drive_eta_rounded,
color: orderData?.isScheduled == true
? const Color(0xFFB39DDB)
: isExclusive
? const Color(0xFFFFD54F)
: AppColors.white,
size: 24,
),
const SizedBox(width: 8),
// ‏العنوان يحمل حالة العرض: خاص خلال السبق، عام بعده، و"طلب
// ‏جديد" في البثّ الحر حيث لا معنى للتمييز.
Text(
"طلب جديد".tr,
style: const TextStyle(
color: AppColors.white,
orderData?.isScheduled == true
// ‏الأولوية للمجدولة: معلومة دائمة عن الرحلة تسبق حالة
// ‏العرض المؤقتة، والسائق يحتاجها ليقرر إن كان يستطيع
// ‏الالتزام بالموعد.
? "🗓️ رحلة مجدولة".tr
: orderData?.offerType == null
? "طلب جديد".tr
: (isExclusive ? "⭐ طلب خاص لك".tr : "🌐 طلب عام".tr),
style: TextStyle(
color: orderData?.isScheduled == true
? const Color(0xFFB39DDB)
: isExclusive
? const Color(0xFFFFD54F)
: AppColors.white,
fontSize: 18,
fontWeight: FontWeight.w600),
),
@@ -1,11 +1,14 @@
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:intaleq_maps/intaleq_maps.dart';
import 'package:tripz_driver/constant/api_key.dart';
import 'package:tripz_driver/constant/colors.dart';
import 'package:tripz_driver/controller/home/captin/order_request_controller.dart';
import 'package:tripz_driver/constant/currency.dart';
import 'package:tripz_driver/views/widgets/driver_earnings_badge.dart';
import 'package:siro_driver/constant/api_key.dart';
import 'package:siro_driver/constant/colors.dart';
import 'package:siro_driver/controller/home/captin/order_request_controller.dart';
import 'package:siro_driver/views/widgets/offer_type_badge.dart';
import 'package:siro_driver/views/widgets/scheduled_ride_badge.dart';
import 'package:siro_driver/views/widgets/sms_ride_badge.dart';
import 'package:siro_driver/constant/currency.dart';
import 'package:siro_driver/views/widgets/driver_earnings_badge.dart';
class OrderRequestPage extends StatelessWidget {
const OrderRequestPage({super.key});
@@ -76,7 +79,7 @@ class OrderRequestPage extends StatelessWidget {
zoom: 13.0,
),
markers: controller.markers,
mapType: Get.isDarkMode
mapType: Theme.of(context).brightness == Brightness.dark
? IntaleqMapType.normal
: IntaleqMapType.light,
polylines: controller.polylines,
@@ -109,6 +112,24 @@ class OrderRequestPage extends StatelessWidget {
child: Row(
mainAxisSize: MainAxisSize.min,
children: [
// شارة الطلب الخاص/العام — تختفي في وضع البثّ الحر
if (controller.offerInfo != null) ...[
OfferTypeBadge(rideInfo: controller.offerInfo!),
const SizedBox(width: 10),
],
// شارة الرحلة المجدولة — موعد مضبوط لا طلب فوري
if (ScheduledRideBadge.isScheduled(
controller.scheduleInfo)) ...[
ScheduledRideBadge(
rideInfo: controller.scheduleInfo!),
const SizedBox(width: 10),
],
// راكب بلا إنترنت — الاتصال هو القناة الوحيدة
if (SmsRideBadge.isSmsRide(
controller.scheduleInfo)) ...[
SmsRideBadge(rideInfo: controller.scheduleInfo!),
const SizedBox(width: 10),
],
const Icon(Icons.near_me,
color: Colors.amber, size: 16),
const SizedBox(width: 8),
@@ -198,8 +219,7 @@ class OrderRequestPage extends StatelessWidget {
Column(
crossAxisAlignment: CrossAxisAlignment.end,
children: [
Text(
"${controller.tripPrice} ${CurrencyHelper.currency}",
Text("${controller.tripPrice} ${CurrencyHelper.currency}",
style: const TextStyle(
fontSize: 20,
fontWeight: FontWeight.bold,
@@ -2,14 +2,14 @@
// import 'package:flutter/material.dart';
// import 'package:get/get.dart';
// import 'package:tripz_maps/tripz_maps.dart';
// import 'package:intaleq_maps/intaleq_maps.dart';
// import 'package:tripz_driver/controller/home/captin/home_captain_controller.dart';
// import 'package:tripz_driver/constant/box_name.dart';
// import 'package:tripz_driver/controller/firebase/firbase_messge.dart';
// import 'package:tripz_driver/main.dart';
// import 'package:tripz_driver/print.dart';
// import 'package:tripz_driver/views/home/Captin/driver_map_page.dart';
// import 'package:siro_driver/controller/home/captin/home_captain_controller.dart';
// import 'package:siro_driver/constant/box_name.dart';
// import 'package:siro_driver/controller/firebase/firbase_messge.dart';
// import 'package:siro_driver/main.dart';
// import 'package:siro_driver/print.dart';
// import 'package:siro_driver/views/home/Captin/driver_map_page.dart';
// import '../../../../constant/colors.dart';
// import '../../../../constant/links.dart';
@@ -2,7 +2,7 @@ import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:intaleq_maps/intaleq_maps.dart';
import 'package:tripz_driver/constant/api_key.dart';
import 'package:siro_driver/constant/api_key.dart';
import 'dart:math' as math;
import '../../../../constant/colors.dart';
@@ -62,7 +62,7 @@ class _OrderRequestPageTestState extends State<OrderRequestPageTest> {
SizedBox(
height: Get.height * .33,
child: Obx(() => IntaleqMap(
apiKey: AK.mapSaasKey,
apiKey: AK.mapAPIKEY,
initialCameraPosition: CameraPosition(
zoom: 12,
target:
@@ -1,9 +1,9 @@
import 'dart:convert';
import 'package:tripz_driver/constant/box_name.dart';
import 'package:tripz_driver/constant/links.dart';
import 'package:tripz_driver/controller/functions/crud.dart';
import 'package:tripz_driver/views/widgets/my_scafold.dart';
import 'package:siro_driver/constant/box_name.dart';
import 'package:siro_driver/constant/links.dart';
import 'package:siro_driver/controller/functions/crud.dart';
import 'package:siro_driver/views/widgets/my_scafold.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';