286 lines
10 KiB
Dart
286 lines
10 KiB
Dart
import 'package:SEFER/constant/style.dart';
|
|
import 'package:SEFER/controller/home/map_passenger_controller.dart';
|
|
import 'package:SEFER/views/widgets/elevated_btn.dart';
|
|
import 'package:flutter/cupertino.dart';
|
|
import 'package:flutter/material.dart';
|
|
import 'package:flutter_local_notifications/flutter_local_notifications.dart';
|
|
import 'package:get/get.dart';
|
|
|
|
import '../../../constant/api_key.dart';
|
|
|
|
class CupertinoDriverListWidget extends StatelessWidget {
|
|
final List drivers;
|
|
|
|
const CupertinoDriverListWidget({super.key, required this.drivers});
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return CupertinoPageScaffold(
|
|
navigationBar: CupertinoNavigationBar(
|
|
middle: Text('Driver List'.tr),
|
|
),
|
|
child: SafeArea(
|
|
child: ListView.separated(
|
|
itemCount: drivers.length,
|
|
separatorBuilder: (context, index) => const Divider(height: 1),
|
|
itemBuilder: (context, index) {
|
|
var driver = drivers[index];
|
|
return Container(
|
|
decoration: AppStyle.boxDecoration1,
|
|
child: CupertinoListTile(
|
|
padding: const EdgeInsets.symmetric(vertical: 4, horizontal: 8),
|
|
leading: CircleAvatar(
|
|
radius: 25,
|
|
backgroundImage: NetworkImage(
|
|
'${AK.serverPHP}/portrate_captain_image/${driver['id']}.jpg',
|
|
),
|
|
backgroundColor: CupertinoColors.systemGrey5,
|
|
),
|
|
title: Row(
|
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
|
children: [
|
|
Text(
|
|
'${driver['NAME'].toString().split(' ')[0]} ${driver['NAME'].toString().split(' ')[1]}',
|
|
style: const TextStyle(fontWeight: FontWeight.bold),
|
|
),
|
|
Text('${'Age'.tr}: ${driver['age'].toString()}'),
|
|
Row(
|
|
children: [
|
|
const Icon(CupertinoIcons.star_fill,
|
|
size: 16, color: CupertinoColors.systemYellow),
|
|
const SizedBox(width: 4),
|
|
Text(driver['rating']?.toStringAsFixed(1) ?? 'N/A'.tr),
|
|
const SizedBox(width: 8),
|
|
Text('${'Rides'.tr}: ${driver['countRide']}'),
|
|
],
|
|
),
|
|
],
|
|
),
|
|
subtitle: Column(
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
children: [
|
|
Row(
|
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
|
children: [
|
|
Text(
|
|
'${'Car'.tr}: ${driver['make']} ${driver['model']} (${driver['year']})'),
|
|
Text('${'Plate'.tr}: ${driver['car_plate']}'),
|
|
],
|
|
),
|
|
Row(
|
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
|
children: [
|
|
Text('${'Education'.tr}: ${driver['education']}'),
|
|
],
|
|
),
|
|
Row(
|
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
|
children: [
|
|
SizedBox(
|
|
// width: Get.width * .3,
|
|
child: Row(
|
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
|
children: [
|
|
Text('${'Color'.tr}: ${driver['color']}'),
|
|
const SizedBox(width: 8),
|
|
Container(
|
|
width: 20,
|
|
height: 20,
|
|
decoration: BoxDecoration(
|
|
color:
|
|
hexToColor(driver['color_hex'].toString()),
|
|
borderRadius: BorderRadius.circular(4),
|
|
border: Border.all(),
|
|
),
|
|
),
|
|
],
|
|
),
|
|
),
|
|
],
|
|
),
|
|
],
|
|
),
|
|
onTap: () {
|
|
// Handle driver selection
|
|
Get.defaultDialog(
|
|
title: '${'Selected driver'.tr}: ${driver['NAME']}',
|
|
content: Column(
|
|
children: [
|
|
Column(
|
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
|
children: [
|
|
Text(
|
|
'${'Car'.tr}: ${driver['make']} ${driver['model']} (${driver['year']})'),
|
|
Text('${'Plate'.tr}: ${driver['car_plate']}'),
|
|
Row(
|
|
mainAxisAlignment: MainAxisAlignment.center,
|
|
children: [
|
|
Text('${'Color'.tr}: ${driver['color']}'),
|
|
const SizedBox(width: 8),
|
|
Container(
|
|
width: 20,
|
|
height: 20,
|
|
decoration: BoxDecoration(
|
|
color: hexToColor(
|
|
driver['color_hex'].toString()),
|
|
borderRadius: BorderRadius.circular(4),
|
|
border: Border.all(),
|
|
),
|
|
),
|
|
],
|
|
),
|
|
],
|
|
),
|
|
],
|
|
),
|
|
confirm: MyElevatedButton(
|
|
title: 'OK'.tr,
|
|
onPressed: () {
|
|
Get.back();
|
|
showDateTimePickerDialog();
|
|
}));
|
|
print('${'Selected driver'.tr}: ${driver['NAME']}');
|
|
// Get.back(); // Close the dialog
|
|
},
|
|
),
|
|
);
|
|
},
|
|
)),
|
|
);
|
|
}
|
|
|
|
Color hexToColor(String hexColor) {
|
|
hexColor = hexColor.replaceAll("#", "");
|
|
String colorString = "ff$hexColor";
|
|
return Color(int.parse(colorString, radix: 16));
|
|
}
|
|
|
|
void showDriverSelectionDialog(Map<String, dynamic> driver) {
|
|
Get.defaultDialog(
|
|
title: '${'Selected driver'.tr}: ${driver['name']}',
|
|
content: Column(
|
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
|
children: [
|
|
Text(
|
|
'${'Car'.tr}: ${driver['make']} ${driver['model']} (${driver['year']})'),
|
|
Text('${'Plate'.tr}: ${driver['car_plate']}'),
|
|
Row(
|
|
mainAxisAlignment: MainAxisAlignment.center,
|
|
children: [
|
|
Text('${'Color'.tr}: ${driver['color']}'),
|
|
const SizedBox(width: 8),
|
|
Container(
|
|
width: 20,
|
|
height: 20,
|
|
decoration: BoxDecoration(
|
|
color: hexToColor(driver['color_hex'].toString()),
|
|
borderRadius: BorderRadius.circular(4),
|
|
border: Border.all(),
|
|
),
|
|
),
|
|
],
|
|
),
|
|
],
|
|
),
|
|
confirm: MyElevatedButton(
|
|
title: 'OK'.tr,
|
|
onPressed: () {
|
|
Get.back();
|
|
showDateTimePickerDialog();
|
|
},
|
|
),
|
|
);
|
|
}
|
|
|
|
void showDateTimePickerDialog() {
|
|
DateTime selectedDateTime = DateTime.now();
|
|
|
|
Get.defaultDialog(
|
|
barrierDismissible: false,
|
|
title: 'select date and time of trip'.tr,
|
|
content: SizedBox(
|
|
// height: 400, // Adjust height as needed
|
|
width: double.maxFinite,
|
|
child: Column(
|
|
children: [
|
|
DateTimePickerWidget(),
|
|
],
|
|
),
|
|
),
|
|
confirm: MyElevatedButton(
|
|
title: 'Confirm Trip'.tr,
|
|
onPressed: () async {
|
|
DateTime selectedDateTime =
|
|
Get.find<MapPassengerController>().selectedDateTime.value;
|
|
// Save trip data and set up notifications
|
|
// await Get.find<MapPassengerController>().saveTripData(driver, selectedDateTime);
|
|
Get.back();
|
|
},
|
|
),
|
|
);
|
|
}
|
|
}
|
|
|
|
class DateTimePickerWidget extends StatelessWidget {
|
|
final MapPassengerController controller = Get.put(MapPassengerController());
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return CupertinoPageScaffold(
|
|
navigationBar: const CupertinoNavigationBar(
|
|
transitionBetweenRoutes: false,
|
|
automaticallyImplyLeading: false,
|
|
middle: Text('Date and Time Picker'),
|
|
),
|
|
child: SafeArea(
|
|
child: Column(
|
|
mainAxisAlignment: MainAxisAlignment.center,
|
|
children: [
|
|
Obx(() => Text(
|
|
'${'Selected Date and Time'.tr}: ${controller.selectedDateTime.value}',
|
|
style: const TextStyle(fontSize: 18),
|
|
textAlign: TextAlign.center,
|
|
)),
|
|
const SizedBox(height: 20),
|
|
SizedBox(
|
|
height: 200,
|
|
child: CupertinoDatePicker(
|
|
mode: CupertinoDatePickerMode.dateAndTime,
|
|
initialDateTime: controller.selectedDateTime.value,
|
|
onDateTimeChanged: (newDateTime) {
|
|
controller.updateDateTime(newDateTime);
|
|
},
|
|
),
|
|
),
|
|
],
|
|
),
|
|
),
|
|
);
|
|
}
|
|
}
|
|
|
|
// Future<void> setLocalNotification(DateTime tripDateTime) async {
|
|
// FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin =
|
|
// FlutterLocalNotificationsPlugin();
|
|
|
|
// var androidPlatformChannelSpecifics = const AndroidNotificationDetails(
|
|
// 'trip_reminder_channel',
|
|
// 'Trip Reminders',
|
|
// importance: Importance.max,
|
|
// priority: Priority.high,
|
|
// );
|
|
// var iOSPlatformChannelSpecifics = IOSNotificationDetails();
|
|
// var platformChannelSpecifics = NotificationDetails(
|
|
// android: androidPlatformChannelSpecifics,
|
|
// iOS: iOSPlatformChannelSpecifics,
|
|
// );
|
|
|
|
// await flutterLocalNotificationsPlugin.schedule(
|
|
// 0,
|
|
// 'Trip Reminder'.tr,
|
|
// 'Your trip is scheduled in 30 minutes'.tr,
|
|
// tripDateTime.subtract(const Duration(minutes: 30)),
|
|
// platformChannelSpecifics,
|
|
// );
|
|
// }
|