This commit is contained in:
Hamza-Ayed
2024-09-08 10:31:59 +03:00
parent 2098aeda23
commit a40c6851ee
16 changed files with 812 additions and 187 deletions

View File

@@ -1,4 +1,5 @@
import 'package:SEFER/controller/home/home_page_controller.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:SEFER/constant/colors.dart';
@@ -6,6 +7,10 @@ import 'package:SEFER/constant/style.dart';
import 'package:SEFER/views/lang/languages.dart';
import 'package:SEFER/views/widgets/my_scafold.dart';
import '../../constant/box_name.dart';
import '../../controller/profile/profile_controller.dart';
import '../../main.dart';
import '../widgets/elevated_btn.dart';
import 'HomePage/about_page.dart';
import 'HomePage/frequentlyQuestionsPage.dart';
import 'HomePage/trip_record_page.dart';
@@ -17,6 +22,16 @@ class HomePage extends StatelessWidget {
@override
Widget build(BuildContext context) {
Get.put(HomePageController());
final List<String> countryOptions = [
'Jordan',
'USA',
'Egypt',
'Turkey',
'Saudi Arabia',
'Qatar',
'Bahrain',
'Kuwait',
];
return MyScafolld(
isleading: true,
title: 'Home Page'.tr,
@@ -45,21 +60,7 @@ class HomePage extends StatelessWidget {
color: AppColor.primaryColor,
),
),
ListTile(
leading: const Icon(Icons.location_city_outlined),
title: Text(
'Change Country'.tr,
style: AppStyle.headTitle2,
),
subtitle: Text(
'You can change the Country to get all features'.tr,
style: AppStyle.title,
),
onTap: () => Get.to(MyScafolld(
title: 'Change Country'.tr,
body: [CountryPickerFromSetting()],
isleading: true)),
),
changeCountry(countryOptions),
ListTile(
leading: const Icon(Icons.question_answer),
title: Text(

View File

@@ -5,6 +5,7 @@ import 'package:SEFER/main.dart';
import 'package:SEFER/views/home/profile/passenger_profile_page.dart';
import 'package:SEFER/views/widgets/elevated_btn.dart';
import 'package:SEFER/views/widgets/my_dialog.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
@@ -45,29 +46,47 @@ List<CarType> carTypes = [
image: 'assets/images/lady.png',
),
CarType(
carType: 'Delivery',
carDetail: 'Delivery service'.tr,
carType: 'Scooter',
carDetail: 'Scooter service'.tr,
image: 'assets/images/moto.png',
),
CarType(
carType: 'Mashwari',
carDetail: 'Mashwari without end point'.tr,
carType: 'Mishwar Vip',
carDetail: 'Mishwar Vip without end point'.tr,
image: 'assets/images/freeRide.png',
),
CarType(
carType: 'Rayeh Gai',
carDetail: "Best choice for cities".tr,
image: 'assets/images/roundtrip.png',
),
];
class CarDetailsTypeToChoose extends StatelessWidget {
CarDetailsTypeToChoose({super.key});
final textToSpeechController = Get.put(TextToSpeechController());
@override
Widget build(BuildContext context) {
return GetBuilder<MapPassengerController>(
builder: (mapPassengerController) {
// Add a new CarType if the distance condition is met and the list has fewer than 6 items
if (mapPassengerController.distance > 40) {
carTypes.add(
CarType(
carType: 'Rayeh Gai',
carDetail: "Best choice for cities".tr,
image: 'assets/images/roundtrip.png',
),
);
if (carTypes.length > 7) {
carTypes.removeRange(7, carTypes.length);
}
} // Create a Set to remove duplicates based on the `carType` field
else if (carTypes.length > 6) {
carTypes.removeRange(6, carTypes.length);
}
Set<CarType> uniqueCarTypes = {};
uniqueCarTypes.addAll(carTypes);
// Convert the Set back to a List
carTypes = uniqueCarTypes.toList();
return mapPassengerController.data.isNotEmpty &&
mapPassengerController.isBottomSheetShown &&
mapPassengerController.rideConfirm == false
@@ -142,9 +161,9 @@ class CarDetailsTypeToChoose extends StatelessWidget {
? mapPassengerController
.totalPassengerBalash
.toStringAsFixed(2)
: carType.carType == 'Delivery'
: carType.carType == 'Scooter'
? mapPassengerController
.totalPassengerMotoDelivery
.totalPassengerScooter
.toStringAsFixed(2)
: carType.carType == 'Lady'
? mapPassengerController
@@ -153,7 +172,7 @@ class CarDetailsTypeToChoose extends StatelessWidget {
: carType.carType ==
'Rayeh Gai'
? mapPassengerController
.totalPassengerRayehGai
.totalPassengerRayehGaiBalash
.toStringAsFixed(
2)
: '50',
@@ -231,7 +250,7 @@ class CarDetailsTypeToChoose extends StatelessWidget {
: carType.carType == 'Balash' &&
(mapPassengerController
.totalPassengerBalash >
15)
20)
? Row(
children: [
Container(
@@ -400,19 +419,19 @@ class CarDetailsTypeToChoose extends StatelessWidget {
} else if (mapPassengerController
.selectedIndex ==
4) {
box.write(BoxName.carType, 'Delivery');
box.write(BoxName.carType, 'Scooter');
mapPassengerController.totalPassenger =
mapPassengerController
.totalPassengerMotoDelivery;
.totalPassengerScooter;
Get.defaultDialog(
title: 'Delivery'.tr,
title: 'Scooter'.tr,
titleStyle: AppStyle.title,
content: CarDialogue(
textToSpeechController:
textToSpeechController,
image: 'assets/images/moto.png',
text:
'This is for delivery or a motorcycle.'
'This is for Scooter or a motorcycle.'
.tr),
confirm: MyElevatedButton(
kolor: AppColor.greenColor,
@@ -434,17 +453,17 @@ class CarDetailsTypeToChoose extends StatelessWidget {
} else if (mapPassengerController
.selectedIndex ==
5) {
box.write(BoxName.carType, 'Mashwari');
box.write(BoxName.carType, 'Mishwar Vip');
mapPassengerController.totalPassenger = 50;
Get.defaultDialog(
title: 'Mashwari'.tr,
title: 'Mishwar Vip'.tr,
titleStyle: AppStyle.title,
content: CarDialogue(
textToSpeechController:
textToSpeechController,
image: 'assets/images/freeRide.png',
text:
'Perfect for adventure seekers who want to experience something new and exciting'
'A trip with a prior reservation, allowing you to choose the best captains and cars.'
.tr),
confirm: MyElevatedButton(
kolor: AppColor.greenColor,
@@ -541,29 +560,175 @@ class CarDetailsTypeToChoose extends StatelessWidget {
.selectedIndex ==
6) {
box.write(BoxName.carType, 'Rayeh Gai');
mapPassengerController.totalPassenger =
mapPassengerController.totalPassengerLady;
// mapPassengerController.totalPassenger =
// mapPassengerController.totalPassengerRayehGai;
Get.defaultDialog(
title: 'Rayeh Gai'.tr,
titleStyle: AppStyle.title,
content: CarDialogue(
textToSpeechController:
textToSpeechController,
image: 'assets/images/roundtrip.png',
text:
"Rayeh Gai: Round trip service for convenient travel between cities, easy and reliable."
.tr),
confirm: MyElevatedButton(
kolor: AppColor.greenColor,
title: 'Next'.tr,
onPressed: () {
Get.back();
mapPassengerController
.isBottomSheetShown = false;
mapPassengerController.update();
mapPassengerController
.changeCashConfirmPageShown();
}),
content: Column(
children: [
CarDialogue(
textToSpeechController:
textToSpeechController,
image:
'assets/images/roundtrip.png',
text:
"Rayeh Gai: Round trip service for convenient travel between cities, easy and reliable."
.tr),
const SizedBox(
height: 16,
),
Container(
decoration: AppStyle.boxDecoration,
child: Padding(
padding:
const EdgeInsets.all(8.0),
child: Text(
'Choose between those Type Cars'
.tr),
),
),
const SizedBox(
height: 16,
),
Row(
mainAxisAlignment:
MainAxisAlignment.spaceAround,
children: [
Container(
decoration:
AppStyle.boxDecoration,
child: InkWell(
onTap: () {
box.write(BoxName.carType,
'RayehGaiComfort');
mapPassengerController
.totalPassenger =
mapPassengerController
.totalPassengerRayehGaiComfort;
Get.back();
mapPassengerController
.isBottomSheetShown =
false;
mapPassengerController
.update();
mapPassengerController
.changeCashConfirmPageShown();
},
child: Padding(
padding:
const EdgeInsets.all(
8.0),
child: Column(
children: [
Text('Comfort'.tr),
Text(mapPassengerController
.totalPassengerRayehGaiComfort
.toString() +
r'$'),
],
),
),
)),
const SizedBox(
width: 10,
),
Container(
decoration:
AppStyle.boxDecoration,
child: InkWell(
onTap: () {
box.write(BoxName.carType,
'Speed');
mapPassengerController
.totalPassenger =
mapPassengerController
.totalPassengerRayehGai;
Get.back();
mapPassengerController
.isBottomSheetShown =
false;
mapPassengerController
.update();
mapPassengerController
.changeCashConfirmPageShown();
},
child: Padding(
padding:
const EdgeInsets.all(
8.0),
child: Column(
children: [
Text('Speed'.tr),
Text(mapPassengerController
.totalPassengerRayehGai
.toString() +
r'$'),
],
),
),
),
),
const SizedBox(
width: 10,
),
Container(
decoration:
AppStyle.boxDecoration,
child: InkWell(
onTap: () {
box.write(BoxName.carType,
'Balash');
mapPassengerController
.totalPassenger =
mapPassengerController
.totalPassengerRayehGaiBalash;
Get.back();
mapPassengerController
.isBottomSheetShown =
false;
mapPassengerController
.update();
mapPassengerController
.changeCashConfirmPageShown();
},
child: Padding(
padding:
const EdgeInsets.all(
8.0),
child: Column(
children: [
Text('Balash'.tr),
Text(mapPassengerController
.totalPassengerRayehGaiBalash
.toString() +
r'$'),
],
),
),
),
),
],
),
const SizedBox(
height: 16,
),
const SizedBox(
height: 16,
),
],
),
// confirm: MyElevatedButton(
// kolor: AppColor.greenColor,
// title: 'Next'.tr,
// onPressed: () {
// Get.back();
// mapPassengerController
// .isBottomSheetShown = false;
// mapPassengerController.update();
// mapPassengerController
// .changeCashConfirmPageShown();
// }),
cancel: MyElevatedButton(
title: 'Cancel'.tr,
kolor: AppColor.redColor,
@@ -588,6 +753,111 @@ class CarDetailsTypeToChoose extends StatelessWidget {
// ;
});
}
Future<dynamic> comfortDialougRayehgai(
MapPassengerController mapPassengerController) {
return Get.defaultDialog(
title: 'Comfort'.tr,
content: GetBuilder<MapPassengerController>(
builder: (mapPassengerController) {
return Column(
children: [
SizedBox(height: 60, child: HourPickerExample()),
const SizedBox(
height: 16,
),
SizedBox(
height: 30,
child: Text(box.read(BoxName.hourWait).toString() + 'hour'.tr ??
'1${'hour'.tr}'),
),
],
);
}),
confirm: MyElevatedButton(
kolor: AppColor.greenColor,
title: 'Next'.tr,
onPressed: () {
Get.back();
mapPassengerController.isBottomSheetShown = false;
mapPassengerController.update();
mapPassengerController.changeCashConfirmPageShown();
}),
cancel: MyElevatedButton(
title: 'Cancel'.tr,
kolor: AppColor.redColor,
onPressed: () {
Get.back();
}));
}
Future<dynamic> speedDialougRayehGai(
MapPassengerController mapPassengerController) {
return Get.defaultDialog(
title: 'Speed'.tr,
content: Column(
children: [
SizedBox(height: 60, child: HourPickerExample()),
const SizedBox(
height: 16,
),
SizedBox(
height: 30,
child: Text(box.read(BoxName.hourWait).toString() + 'hour'.tr ??
'1${'hour'.tr}'),
),
],
),
confirm: MyElevatedButton(
kolor: AppColor.greenColor,
title: 'Next'.tr,
onPressed: () {
Get.back();
mapPassengerController.isBottomSheetShown = false;
mapPassengerController.update();
mapPassengerController.changeCashConfirmPageShown();
}),
cancel: MyElevatedButton(
title: 'Cancel'.tr,
kolor: AppColor.redColor,
onPressed: () {
Get.back();
}));
}
Future<dynamic> balashDialougRayehGai(
MapPassengerController mapPassengerController) {
return Get.defaultDialog(
title: 'Balash'.tr,
content: Column(
children: [
SizedBox(height: 60, child: HourPickerExample()),
const SizedBox(
height: 16,
),
SizedBox(
height: 30,
child: Text(box.read(BoxName.hourWait).toString() + 'hour'.tr ??
'1${'hour'.tr}'),
),
],
),
confirm: MyElevatedButton(
kolor: AppColor.greenColor,
title: 'Next'.tr,
onPressed: () {
Get.back();
mapPassengerController.isBottomSheetShown = false;
mapPassengerController.update();
mapPassengerController.changeCashConfirmPageShown();
}),
cancel: MyElevatedButton(
title: 'Cancel'.tr,
kolor: AppColor.redColor,
onPressed: () {
Get.back();
}));
}
}
class BurcMoney extends StatelessWidget {
@@ -805,3 +1075,72 @@ class CarDialogue extends StatelessWidget {
);
}
}
class HourPickerExample extends StatelessWidget {
@override
Widget build(BuildContext context) {
return GestureDetector(
onTap: () async {
int? selectedHour = await showCupertinoModalPopup<int>(
context: context,
builder: (BuildContext context) {
return Padding(
padding: const EdgeInsets.all(8.0),
child: Container(
height: 200,
color: Colors.white,
child: Column(
children: [
CupertinoButton(
child: Text('Done'.tr),
onPressed: () {
Navigator.of(context).pop();
},
),
SizedBox(
height: 140,
child: CupertinoPicker(
itemExtent: 32.0,
onSelectedItemChanged: (int index) {
// Handle the selection
box.write(BoxName.hourWait, index);
// Navigator.pop(context, index + 1);
},
children: List<Widget>.generate(5, (int index) {
return Center(
child: Text('${index + 1} ${'hour'.tr}'),
);
}),
),
),
],
),
),
);
},
);
if (selectedHour != null) {
// Do something with the selected hour
print('Selected hour: $selectedHour');
}
},
child: Container(
// height: 70,
decoration: BoxDecoration(
border: Border.all(
color: AppColor.blueColor,
width: 3,
),
borderRadius: BorderRadius.circular(12)),
child: Padding(
padding: const EdgeInsets.all(8.0),
child: Text(
'How many hours would you like to wait?'.tr,
style: TextStyle(fontSize: 18),
),
),
),
);
}
}

View File

@@ -338,7 +338,7 @@ class MainBottomMenuMap extends StatelessWidget {
title: 'Yes'.tr,
onPressed: () async {
Get.back();
await controller.getLocation();
controller.getLocation();
await controller.getMap(
'${controller.passengerLocation.latitude},${controller.passengerLocation.longitude}',
'${controller.recentPlaces[index]['latitude']},${controller.recentPlaces[index]['longitude']}',
@@ -606,7 +606,7 @@ class FaviouratePlacesDialog extends StatelessWidget {
TextButton(
onPressed: () async {
Get.back();
await controller.getLocation();
controller.getLocation();
await controller.getMap(
'${controller.passengerLocation.latitude},${controller.passengerLocation.longitude}',
'${favoritePlaces[index]['latitude']},${favoritePlaces[index]['longitude']}',

View File

@@ -1,12 +1,14 @@
import 'package:SEFER/constant/colors.dart';
import 'package:SEFER/constant/style.dart';
import 'package:SEFER/controller/home/map_passenger_controller.dart';
import 'package:SEFER/env/env.dart';
import 'package:SEFER/views/widgets/elevated_btn.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import '../../../constant/api_key.dart';
import '../../../print.dart';
class CupertinoDriverListWidget extends StatelessWidget {
MapPassengerController mapPassengerController =
@@ -30,7 +32,7 @@ class CupertinoDriverListWidget extends StatelessWidget {
leading: CircleAvatar(
radius: 25,
backgroundImage: NetworkImage(
'${AK.serverPHP}/portrate_captain_image/${driver['id']}.jpg',
'${Env.seferCairoServer}/portrate_captain_image/${driver['id']}.jpg',
),
backgroundColor: CupertinoColors.systemGrey5,
),
@@ -138,6 +140,7 @@ class CupertinoDriverListWidget extends StatelessWidget {
onPressed: () {
Get.back();
showDateTimePickerDialog(driver);
Log.print('driver: ${driver}');
}));
print('${'Selected driver'.tr}: ${driver['NAME']}');
// Get.back(); // Close the dialog
@@ -150,9 +153,18 @@ class CupertinoDriverListWidget extends StatelessWidget {
}
Color hexToColor(String hexColor) {
if (hexColor == null || hexColor.isEmpty || hexColor == 'null') {
// Return a default color if the hex color is invalid
return Colors.grey;
}
hexColor = hexColor.replaceAll("#", "");
String colorString = "ff$hexColor";
return Color(int.parse(colorString, radix: 16));
if (hexColor.length == 6) {
hexColor = "ff$hexColor";
} else if (hexColor.length != 8) {
// Return a default color if the hex color is not in the valid format
return Colors.grey;
}
return Color(int.parse(hexColor, radix: 16));
}
void showDriverSelectionDialog(Map<String, dynamic> driver) {
@@ -192,7 +204,23 @@ class CupertinoDriverListWidget extends StatelessWidget {
);
}
Future<void> confirmTripData(
Map<String, dynamic> driver, DateTime selectedDateTime) async {
try {
// Save trip data and set up notifications
// Log.print('selectedDateTime: $selectedDateTime');
// Log.print('driver: $driver');
await mapPassengerController.saveTripData(driver, selectedDateTime);
Get.back(); // Close the dialog
} catch (e) {
// Handle any errors that occur during the save process
Log.print('Error saving trip data: $e');
Get.snackbar('Error', 'Failed to save trip data');
}
}
void showDateTimePickerDialog(Map<String, dynamic> driver) {
Log.print('driver: ${driver}');
DateTime selectedDateTime = DateTime.now();
Get.defaultDialog(
@@ -209,12 +237,10 @@ class CupertinoDriverListWidget extends StatelessWidget {
),
confirm: MyElevatedButton(
title: 'Confirm Trip'.tr,
onPressed: () async {
onPressed: () {
DateTime selectedDateTime =
mapPassengerController.selectedDateTime.value;
// Save trip data and set up notifications
Get.back();
await mapPassengerController.saveTripData(driver, selectedDateTime);
confirmTripData(driver, selectedDateTime);
},
),
);

View File

@@ -393,6 +393,92 @@ class CountryPicker extends StatelessWidget {
}
}
ListTile changeCountry(List<String> countryOptions) {
return ListTile(
leading: const Icon(Icons.location_city_outlined),
title: Text(
'Change Country'.tr,
style: AppStyle.headTitle2,
),
subtitle: Text(
'You can change the Country to get all features'.tr,
style: AppStyle.title,
),
onTap: () => Get.to(MyScafolld(
title: 'Change Country'.tr,
// body: [],
body: [
GetBuilder<ProfileController>(builder: (controller) {
return Padding(
padding: const EdgeInsets.all(20.0),
child: ListView(
children: [
const SizedBox(
height: 20,
),
Text(
"Select Your Country".tr,
style: AppStyle.headTitle2,
textAlign: TextAlign.center,
),
// const SizedBox(
// height: 20,
// ),
Padding(
padding: const EdgeInsets.all(10),
child: Text(
"To ensure you receive the most accurate information for your location, please select your country below. This will help tailor the app experience and content to your country."
.tr,
style: AppStyle.title,
textAlign: TextAlign.center,
),
),
SizedBox(
height: 200,
child: CupertinoPicker(
itemExtent: 32,
onSelectedItemChanged: (int index) {
controller.setCountry(countryOptions[index]);
box.write(BoxName.countryCode,
countryOptions[index]); // Save in English
},
children: List.generate(
countryOptions.length,
(index) => Center(
child: Text(
countryOptions[index]
.tr, // Display translated if not English
style: AppStyle.title,
),
),
),
),
),
MyElevatedButton(
title:
'Select Country'.tr, // Use translated text for button
onPressed: () async {
// No conversion needed
box.write(
BoxName.countryCode, //
controller
.selectedCountry); // Already saved in English
Get.snackbar(controller.selectedCountry.toString().tr, '',
backgroundColor: AppColor.greenColor);
// Get.back();//
// Get.back();
},
)
],
),
);
})
],
isleading: true)),
);
}
class CountryPickerFromSetting extends StatelessWidget {
final ProfileController controller = Get.put(ProfileController());
final LoginController loginController = Get.put(LoginController());
@@ -462,8 +548,7 @@ class CountryPickerFromSetting extends StatelessWidget {
MyElevatedButton(
title: 'Select Country'.tr, // Use translated text for button
onPressed: () async {
loginController.saveCountryCode(controller.selectedCountry
.toString()); // No conversion needed
// No conversion needed
box.write(
BoxName.countryCode, //
controller.selectedCountry); // Already saved in English