257 lines
9.4 KiB
Dart
Executable File
257 lines
9.4 KiB
Dart
Executable File
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 '../../../../main.dart';
|
|
|
|
// Changed: إعادة تصميم كاملة لتصبح شريط معلومات علوي مدمج
|
|
class PassengerInfoWindow extends StatelessWidget {
|
|
const PassengerInfoWindow({super.key});
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return GetBuilder<MapDriverController>(
|
|
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) {
|
|
Get.find<FirebaseMessagesController>()
|
|
.sendNotificationToDriverMAP(
|
|
'Hi ,I Arrive your site',
|
|
'I Arrive at your site'.tr,
|
|
controller.tokenPassenger,
|
|
[],
|
|
'ding.wav',
|
|
);
|
|
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 {
|
|
Get.find<FirebaseMessagesController>().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');
|
|
box.write(BoxName.rideStatus, 'Cancel');
|
|
await controller.addWaitingTimeCostFromPassengerToDriverWallet();
|
|
controller.isdriverWaitTimeEnd = false;
|
|
Get.back();
|
|
});
|
|
},
|
|
);
|
|
}
|
|
}
|