Update codebase
This commit is contained in:
@@ -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';
|
||||
|
||||
|
||||
Reference in New Issue
Block a user