import 'package:sefer_driver/views/widgets/mydialoug.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:sefer_driver/constant/colors.dart'; import 'package:sefer_driver/constant/info.dart'; import 'package:sefer_driver/controller/firebase/firbase_messge.dart'; import 'package:sefer_driver/controller/home/captin/map_driver_controller.dart'; import 'package:sefer_driver/views/widgets/elevated_btn.dart'; import '../../../../constant/box_name.dart'; import '../../../../constant/style.dart'; import '../../../../controller/firebase/notification_service.dart'; import '../../../../main.dart'; import '../../../../print.dart'; // Changed: إعادة تصميم كاملة لتصبح شريط معلومات علوي مدمج class PassengerInfoWindow extends StatelessWidget { PassengerInfoWindow({super.key}); final fcm = Get.isRegistered() ? Get.find() : Get.put(FirebaseMessagesController()); @override Widget build(BuildContext context) { return GetBuilder( builder: (controller) => AnimatedPositioned( duration: const Duration(milliseconds: 400), curve: Curves.easeInOut, // Changed: تم تغيير الموضع من الأسفل إلى الأعلى top: controller.isPassengerInfoWindow ? 15.0 : -200.0, left: 15.0, right: 15.0, child: Card( elevation: 8, shadowColor: Colors.black.withOpacity(0.3), shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(16), ), child: Padding( padding: const EdgeInsets.symmetric(horizontal: 16.0, vertical: 12.0), child: Column( mainAxisSize: MainAxisSize.min, children: [ // New: صف علوي للمعلومات الأساسية _buildTopInfoRow(controller), const Divider(height: 16), // Changed: الأزرار الآن في صف أفقي ومدمج if (!controller.isRideBegin) _buildActionButtons(controller), // New: مؤشر انتظار الراكب المدمج if (controller.remainingTimeInPassengerLocatioWait < 300 && controller.remainingTimeInPassengerLocatioWait != 0 && !controller.isRideBegin) ...[ const SizedBox(height: 10), _buildWaitingIndicator(controller), ], // زر الإلغاء بعد انتهاء وقت الانتظار if (controller.isdriverWaitTimeEnd && !controller.isRideBegin) ...[ const SizedBox(height: 10), _buildCancelAfterWaitButton(controller), ] ], ), ), ), ), ); } // New: ودجت لعرض المعلومات العلوية بشكل مدمج Widget _buildTopInfoRow(MapDriverController controller) { return Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ // معلومات الراكب Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( 'Go to passenger:'.tr, style: AppStyle.title .copyWith(color: Colors.grey[600], fontSize: 13), ), Text( controller.passengerName, style: AppStyle.title .copyWith(fontWeight: FontWeight.bold, fontSize: 18), overflow: TextOverflow.ellipsis, ), ], ), ), // معلومات المسافة والزمن Row( children: [ _buildInfoChip(Icons.map_outlined, '${controller.distance} km'), const SizedBox(width: 8), _buildInfoChip( Icons.timer_outlined, controller.hours > 1 ? '${controller.hours}h ${controller.minutes}m' : '${controller.minutes}m', ), ], ), ], ); } // New: ودجت مخصص لعرض المعلومات بشكل أنيق Widget _buildInfoChip(IconData icon, String text) { return Container( padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4), decoration: BoxDecoration( color: AppColor.primaryColor.withOpacity(0.1), borderRadius: BorderRadius.circular(20), ), child: Row( mainAxisSize: MainAxisSize.min, children: [ Icon(icon, color: AppColor.primaryColor, size: 16), const SizedBox(width: 4), Text(text, style: TextStyle( color: AppColor.primaryColor, fontWeight: FontWeight.bold)), ], ), ); } // Changed: إعادة تصميم أزرار الإجراءات لتكون أكثر دمجًا Widget _buildActionButtons(MapDriverController controller) { return Row( children: [ if (controller.isArrivedSend) Expanded( child: ElevatedButton.icon( icon: const Icon(Icons.location_on, size: 18), label: Text('I Arrive'.tr), style: ElevatedButton.styleFrom( backgroundColor: AppColor.yellowColor, foregroundColor: Colors.black, shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(10)), ), onPressed: () async { controller.getRoute( origin: controller.latLngPassengerLocation, destination: controller.latLngPassengerDestination, routeColor: Colors.blue // أو أي لون ); if (await controller .calculateDistanceBetweenDriverAndPassengerLocation() < 140) { // fcm.sendNotificationToDriverMAP( // 'Hi ,I Arrive your site', // 'I Arrive at your site'.tr, // controller.tokenPassenger, // [], // 'ding.wav', // ); Log.print( 'controller.tokenPassenger: ${controller.tokenPassenger}'); NotificationService.sendNotification( target: controller.tokenPassenger.toString(), title: 'Hi ,I Arrive your site'.tr, body: 'I Arrive at your site'.tr, isTopic: false, // Important: this is a token tone: 'ding', driverList: [], ); controller.startTimerToShowDriverWaitPassengerDuration(); controller.isArrivedSend = false; } else { MyDialog().getDialog( 'You are not near the passenger location'.tr, 'Please go to the pickup location exactly'.tr, () => Get.back()); } }, ), ), if (controller.isArrivedSend) const SizedBox(width: 8), Expanded( flex: 2, child: ElevatedButton.icon( icon: const Icon(Icons.play_arrow_rounded, size: 20), label: Text('Start the Ride'.tr, style: const TextStyle(fontWeight: FontWeight.bold)), style: ElevatedButton.styleFrom( backgroundColor: AppColor.greenColor, foregroundColor: Colors.white, shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(10)), ), onPressed: () { MyDialog().getDialog( "Is the Passenger in your Car?".tr, "Don't start trip if passenger not in your car".tr, () async { await controller.startRideFromDriver(); Get.back(); }, ); }, ), ), ], ); } // Changed: مؤشر الانتظار الآن أكثر دمجًا Widget _buildWaitingIndicator(MapDriverController controller) { return ClipRRect( borderRadius: BorderRadius.circular(10), child: Stack( alignment: Alignment.center, children: [ LinearProgressIndicator( backgroundColor: AppColor.greyColor.withOpacity(0.3), color: controller.remainingTimeInPassengerLocatioWait < 60 ? AppColor.redColor : AppColor.greenColor, minHeight: 25, value: controller.progressInPassengerLocationFromDriver.toDouble(), ), Text( controller.stringRemainingTimeWaitingPassenger, style: AppStyle.title.copyWith( color: Colors.white, fontWeight: FontWeight.bold, fontSize: 13, shadows: [ Shadow(color: Colors.black.withOpacity(0.5), blurRadius: 2) ]), ), ], ), ); } // New: زر الإلغاء بعد انتهاء الانتظار Widget _buildCancelAfterWaitButton(MapDriverController controller) { return MyElevatedButton( title: 'You Can Cancel the Trip and get Cost From '.tr + AppInformation.appName.tr, kolor: AppColor.deepPurpleAccent, onPressed: () { MyDialog().getDialog('Are you sure to cancel?'.tr, '', () async { // fcm.sendNotificationToDriverMAP( // 'Driver Cancelled Your Trip', // 'You will need to pay the cost to the driver, or it will be deducted from your next trip' // .tr, // controller.tokenPassenger, // [], // 'cancel.wav'); NotificationService.sendNotification( target: controller.tokenPassenger.toString(), title: 'Driver Cancelled Your Trip', body: 'You will need to pay the cost to the driver, or it will be deducted from your next trip', isTopic: false, // Important: this is a token tone: 'cancel', driverList: [], ); box.write(BoxName.rideStatus, 'Cancel'); await controller.addWaitingTimeCostFromPassengerToDriverWallet(); controller.isdriverWaitTimeEnd = false; Get.back(); }); }, ); } }