This commit is contained in:
Hamza-Ayed
2024-05-06 13:30:09 +03:00
parent f7c48e61f2
commit c5ac5c2b22
15 changed files with 489 additions and 55 deletions

View File

@@ -55,8 +55,8 @@ android {
// For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration. // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration.
minSdkVersion 23 minSdkVersion 23
targetSdkVersion flutter.targetSdkVersion targetSdkVersion flutter.targetSdkVersion
versionCode 22 versionCode 25
versionName '1.4.6' versionName '1.4.8'
// manifestPlaceholders = [mapsApiKey: 'android/app/src/main/AndroidManifest.xml'] // manifestPlaceholders = [mapsApiKey: 'android/app/src/main/AndroidManifest.xml']
} }

View File

@@ -12,7 +12,6 @@ import 'package:SEFER/main.dart';
import 'package:SEFER/views/auth/verify_email_page.dart'; import 'package:SEFER/views/auth/verify_email_page.dart';
import 'package:SEFER/views/home/map_page_passenger.dart'; import 'package:SEFER/views/home/map_page_passenger.dart';
import 'package:location/location.dart'; import 'package:location/location.dart';
// import 'package:permission_handler/permission_handler.dart';
class LoginController extends GetxController { class LoginController extends GetxController {
final formKey = GlobalKey<FormState>(); final formKey = GlobalKey<FormState>();

View File

@@ -57,7 +57,7 @@ class MapPassengerController extends GetxController {
List wayPoint2 = []; List wayPoint2 = [];
List wayPoint3 = []; List wayPoint3 = [];
List wayPoint4 = []; List wayPoint4 = [];
final textToSpeechController = Get.put(TextToSpeechController());
List<List<dynamic>> placeListResponseAll = []; List<List<dynamic>> placeListResponseAll = [];
List<Widget> placeListResponse = [ List<Widget> placeListResponse = [
@@ -846,6 +846,8 @@ class MapPassengerController extends GetxController {
children: [ children: [
IconButton( IconButton(
onPressed: () async { onPressed: () async {
final textToSpeechController =
Get.find<TextToSpeechController>();
await textToSpeechController.speakText(midTitle); await textToSpeechController.speakText(midTitle);
}, },
icon: const Icon(Icons.headphones)), icon: const Icon(Icons.headphones)),
@@ -1090,6 +1092,7 @@ class MapPassengerController extends GetxController {
startTimerFromDriverToPassengerAfterApplied(); startTimerFromDriverToPassengerAfterApplied();
// startTimer(); // startTimer();
} else if (res.toString() == 'Refused') { } else if (res.toString() == 'Refused') {
statusRide = 'Refused';
// isDriversTokensSend = false; // isDriversTokensSend = false;
if (isDriversTokensSend == false) { if (isDriversTokensSend == false) {
confirmRideForAllDriverAvailable(); confirmRideForAllDriverAvailable();
@@ -1434,6 +1437,10 @@ class MapPassengerController extends GetxController {
isMarkersShown = false; isMarkersShown = false;
haveSteps = false; haveSteps = false;
isMarkersShown = false; isMarkersShown = false;
driverToken = '';
driverId = '';
driverPhone = '';
driverName = '';
// totalStepDurations = 0; // totalStepDurations = 0;
timeToPassengerFromDriverAfterApplied = 0; timeToPassengerFromDriverAfterApplied = 0;
remainingTime = 0; remainingTime = 0;
@@ -1454,6 +1461,10 @@ class MapPassengerController extends GetxController {
isWayPointStopsSheetUtilGetMap = false; isWayPointStopsSheetUtilGetMap = false;
rideConfirm = false; rideConfirm = false;
shouldFetch = false; shouldFetch = false;
driverToken = '';
driverId = '';
driverPhone = '';
driverName = '';
isCashConfirmPageShown = false; isCashConfirmPageShown = false;
isSearchingWindow = false; isSearchingWindow = false;
isPassengerChosen = false; isPassengerChosen = false;
@@ -2517,7 +2528,8 @@ class MapPassengerController extends GetxController {
late List recentPlaces = []; late List recentPlaces = [];
getFavioratePlaces() async { getFavioratePlaces() async {
recentPlaces = await sql.getAllData(TableName.recentLocations); recentPlaces = await sql.getCustomQuery(
'SELECT DISTINCT latitude, longitude, name, rate FROM ${TableName.recentLocations}');
} }
double passengerRate = 5; double passengerRate = 5;
@@ -2571,7 +2583,7 @@ class MapPassengerController extends GetxController {
await getPassengerRate(); await getPassengerRate();
await getRideStatusFromStartApp(); await getRideStatusFromStartApp();
startMarkerReloading(); startMarkerReloading();
Get.put(TextToSpeechController());
// await getNearestDriverByPassengerLocation(); // await getNearestDriverByPassengerLocation();
initilizeGetStorage(); initilizeGetStorage();

View File

@@ -4,8 +4,44 @@ class MyTranslation extends Translations {
@override @override
Map<String, Map<String, String>> get keys => { Map<String, Map<String, String>> get keys => {
"ar": { "ar": {
'How do I request a ride?': 'كيف يمكنني طلب رحلة؟',
'Step-by-step instructions on how to request a ride through the Sefer app.':
'تعليمات خطوة بخطوة حول كيفية طلب رحلة من خلال تطبيق Sefer.',
'What types of vehicles are available?':
'ما هي أنواع السيارات المتاحة؟',
'Sefer offers a variety of vehicle options to suit your needs, including economy, comfort, and luxury. Choose the option that best fits your budget and passenger count.':
'يقدم Sefer مجموعة متنوعة من خيارات السيارات لتناسب احتياجاتك، بما في ذلك الاقتصادية والراحة والفخامة. اختر الخيار الذي يناسب ميزانيتك وعدد الركاب بشكل أفضل.',
'How can I pay for my ride?': 'كيف يمكنني الدفع لرحلتي؟',
'Sefer offers multiple payment methods for your convenience. Choose between cash payment or credit/debit card payment during ride confirmation.':
'يقدم Sefer طرق دفع متعددة لراحتك. اختر بين الدفع النقدي أو الدفع ببطاقة الائتمان/الخصم أثناء تأكيد الرحلة.',
'Can I cancel my ride?': 'هل يمكنني إلغاء رحلتي؟',
'Yes, you can cancel your ride under certain conditions (e.g., before driver is assigned). See the Sefer cancellation policy for details.':
'نعم، يمكنك إلغاء رحلتك في ظل ظروف معينة (على سبيل المثال، قبل تعيين السائق). اطلع على سياسة إلغاء Sefer لمزيد من التفاصيل.',
'Driver Registration & Requirements': 'تسجيل السائق والمتطلبات',
'How can I register as a driver?': 'كيف يمكنني التسجيل كسائق؟',
'What are the requirements to become a driver?':
'ما هي الشروط لتصبح سائق؟',
'Visit our website or contact Sefer support for information on driver registration and requirements.':
'قم بزيارة موقعنا على الويب أو اتصل بدعم Sefer للحصول على معلومات حول تسجيل السائق والمتطلبات.',
'How do I communicate with the other party (passenger/driver)?':
'كيف يمكنني التواصل مع الطرف الآخر (الراكب/السائق)؟',
'Sefer provides in-app chat functionality to allow you to communicate with your driver or passenger during your ride.':
'يوفر Sefer وظيفة الدردشة داخل التطبيق للسماح لك بالتواصل مع سائقك أو راكبك أثناء رحلتك.',
'What safety measures does Sefer offer?':
'ما هي التدابير الأمنية التي يقدمها Sefer؟',
'Sefer prioritizes your safety. We offer features like driver verification, in-app trip tracking, and emergency contact options.':
'يعمل Sefer على أولوية سلامتك. نحن نقدم ميزات مثل التحقق من السائق، وتتبع الرحلة داخل التطبيق، وخيارات الاتصال بالطوارئ.',
'Frequently questions': 'الأسئلة المتكررة ',
'About Us': 'عننا',
'SEFER is a ride-sharing app designed with your safety and affordability in mind. We connect you with reliable drivers in your area, ensuring a convenient and stress-free travel experience.\n\nHere are some of the key features that set us apart:':
"سفر هو تطبيق مشاركة رحلات مصمم مع وضع سلامتك وإمكانياتك المادية في الاعتبار. نوفر لك اتصالًا بسائقين موثوقين في منطقتك ، مما يضمن تجربة سفر مريحة وخالية من التوتر.\n\n فيما يلي بعض الميزات الرئيسية التي تميزنا:",
"Choose Language": "اخْتَر اللُّغَة", "Choose Language": "اخْتَر اللُّغَة",
"Login": "تَسْجِيل الدُّخُول", "Login": "تَسْجِيل الدُّخُول",
'\nWe also prioritize affordability, offering competitive pricing to make your rides accessible.':
"\nكما نضع في اعتبار القدرة على تحمل التكاليف ، ونقدم أسعارًا تنافسية لجعل رحلاتك في متناول الجميع.",
'Most Secure Methods': 'أساليب الأمان الأكثر',
'In-App VOIP Calls': 'مكالمات VOIP داخل التطبيق',
'Recorded Trips for Safety': 'تسجيل الرحلات من أجل السلامة',
"Pay with Wallet": 'ادْفَع بِاسْتِخْدَام المَحْفَظَة', "Pay with Wallet": 'ادْفَع بِاسْتِخْدَام المَحْفَظَة',
"Invalid MPIN": 'رَمْز PIN غَيْر صَحِيح', "Invalid MPIN": 'رَمْز PIN غَيْر صَحِيح',
"Invalid OTP": 'كود التَّحَقُّق خَاطِئ', "Invalid OTP": 'كود التَّحَقُّق خَاطِئ',

View File

@@ -9,10 +9,6 @@ import 'package:SEFER/constant/style.dart';
import 'package:SEFER/main.dart'; import 'package:SEFER/main.dart';
import 'package:SEFER/views/widgets/elevated_btn.dart'; import 'package:SEFER/views/widgets/elevated_btn.dart';
import 'package:SEFER/views/widgets/my_scafold.dart'; import 'package:SEFER/views/widgets/my_scafold.dart';
import 'package:SEFER/views/widgets/my_textField.dart';
import 'package:location/location.dart';
import 'package:permission_handler/permission_handler.dart';
// import 'package:permission_handler/permission_handler.dart';
import '../../constant/info.dart'; import '../../constant/info.dart';
import '../../controller/auth/login_controller.dart'; import '../../controller/auth/login_controller.dart';

View File

@@ -0,0 +1,101 @@
import 'package:SEFER/constant/box_name.dart';
import 'package:SEFER/constant/style.dart';
import 'package:SEFER/main.dart';
import 'package:SEFER/views/widgets/my_scafold.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
class AboutPage extends StatelessWidget {
const AboutPage({super.key});
@override
Widget build(BuildContext context) {
return MyScafolld(
title: 'About Us'.tr,
body: [
// Company Logo (consider adding an image asset)
ListView(
children: [
Center(
child: Image.asset(
'assets/images/logo.png', // Replace with your logo image asset path
height: 100.0,
width: 100.0,
),
), // Company Name and Location
Padding(
padding: const EdgeInsets.all(16.0),
child: Text(
'SEFER LLC\n${box.read(BoxName.countryCode).toString().tr}',
style: AppStyle.headTitle2,
textAlign: TextAlign.center,
),
),
Padding(
padding: const EdgeInsets.symmetric(horizontal: 16.0),
child: Text(
'SEFER is a ride-sharing app designed with your safety and affordability in mind. We connect you with reliable drivers in your area, ensuring a convenient and stress-free travel experience.\n\nHere are some of the key features that set us apart:'
.tr,
style: AppStyle.title,
textAlign: TextAlign.center,
),
), // Security Features List
const SizedBox(
height: 20,
),
Padding(
padding: const EdgeInsets.symmetric(horizontal: 24.0),
child: Column(
children: [
Row(
children: [
const Icon(Icons.lock, color: Colors.blue),
const SizedBox(width: 8.0),
Text(
'Most Secure Methods'.tr,
style: AppStyle.title,
),
],
),
const SizedBox(height: 8.0),
Row(
children: [
const Icon(Icons.phone, color: Colors.blue),
const SizedBox(width: 8.0),
Text(
'In-App VOIP Calls'.tr,
style: AppStyle.title,
),
],
),
const SizedBox(height: 8.0),
Row(
children: [
const Icon(Icons.videocam, color: Colors.blue),
const SizedBox(width: 8.0),
Text(
'Recorded Trips for Safety'.tr,
style: AppStyle.title,
),
],
),
],
),
), // Affordability Highlight
Padding(
padding: const EdgeInsets.symmetric(horizontal: 16.0),
child: Text(
'\nWe also prioritize affordability, offering competitive pricing to make your rides accessible.'
.tr,
style: AppStyle.title,
textAlign: TextAlign.center,
),
),
],
),
// About Us Text
],
isleading: true);
}
}

View File

@@ -0,0 +1,147 @@
import 'package:SEFER/controller/home/map_passenger_controller.dart';
import 'package:SEFER/views/widgets/my_scafold.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import '../../../constant/style.dart';
class FrequentlyQuestionsPage extends StatelessWidget {
const FrequentlyQuestionsPage({super.key});
@override
Widget build(BuildContext context) {
String selectedPayment = 'cash'; // Replace with your initial selection
bool canCancelRide = false;
return MyScafolld(
title: 'Frequently Questions'.tr,
body: [
Padding(
padding: const EdgeInsets.all(8.0),
child: ListView(
children: [
// Question 1: How do I request a ride?
ExpansionTile(
title: Text(
'How do I request a ride?'.tr,
style: AppStyle.title,
),
children: [
Text(
'Step-by-step instructions on how to request a ride through the Sefer app.'
.tr,
style: AppStyle.title,
),
],
),
// Question 2: What types of vehicles are available?
ExpansionTile(
title: Text(
'What types of vehicles are available?'.tr,
style: AppStyle.title,
),
children: [
Text(
'Sefer offers a variety of vehicle options to suit your needs, including economy, comfort, and luxury. Choose the option that best fits your budget and passenger count.'
.tr,
style: AppStyle.title,
),
],
),
// Question 3: How can I pay for my ride?
ExpansionTile(
title: Text(
'How can I pay for my ride?'.tr,
style: AppStyle.title,
),
children: [
Text(
'Sefer offers multiple payment methods for your convenience. Choose between cash payment or credit/debit card payment during ride confirmation.'
.tr,
style: AppStyle.title,
),
],
),
// Question 4: Can I cancel my ride? (if applicable)
ExpansionTile(
title: Text(
'Can I cancel my ride?'.tr,
style: AppStyle.title,
),
children: [
Text(
'Yes, you can cancel your ride under certain conditions (e.g., before driver is assigned). See the Sefer cancellation policy for details.'
.tr,
style: AppStyle.title,
),
],
),
// Question 5 & 6: Driver-specific questions
ExpansionTile(
title: Text(
'Driver Registration & Requirements'.tr,
style: AppStyle.title,
),
children: [
Text(
'${'How can I register as a driver?'.tr}\n${'What are the requirements to become a driver?'.tr}',
style: AppStyle.title,
),
InkWell(
onTap: () {
Get.find<MapPassengerController>()
.getDialog('title', 'midTitle', () {
print(
'dd'); //todo add in this dialog papers for driver
});
},
child: Text(
'Visit our website or contact Sefer support for information on driver registration and requirements.'
.tr,
style: AppStyle.title,
),
),
],
),
// Question 7: How do I communicate with the other party?
ExpansionTile(
title: Text(
'How do I communicate with the other party (passenger/driver)?'
.tr,
style: AppStyle.title,
),
children: [
Text(
'Sefer provides in-app chat functionality to allow you to communicate with your driver or passenger during your ride.'
.tr,
style: AppStyle.title,
),
],
),
// Question 8: What safety measures does Sefer offer?
ExpansionTile(
title: Text(
'What safety measures does Sefer offer?'.tr,
style: AppStyle.title,
),
children: [
Text(
'Sefer prioritizes your safety. We offer features like driver verification, in-app trip tracking, and emergency contact options.'
.tr,
style: AppStyle.title,
),
],
),
],
),
)
],
isleading: true);
}
}

View File

@@ -10,6 +10,8 @@ import 'package:path/path.dart' as path;
import 'package:share/share.dart'; import 'package:share/share.dart';
import '../../controller/functions/audio_record1.dart'; import '../../controller/functions/audio_record1.dart';
import 'HomePage/about_page.dart';
import 'HomePage/frequentlyQuestionsPage.dart';
import 'profile/passenger_profile_page.dart'; import 'profile/passenger_profile_page.dart';
class HomePage extends StatelessWidget { class HomePage extends StatelessWidget {
@@ -55,6 +57,16 @@ class HomePage extends StatelessWidget {
body: [CountryPickerFromSetting()], body: [CountryPickerFromSetting()],
isleading: true)), isleading: true)),
), ),
ListTile(
leading: const Icon(Icons.question_answer),
title: Text(
'Frequently questions'.tr,
style: AppStyle.headTitle2,
),
subtitle:
Text('You can change the Country to get all features'.tr),
onTap: () => Get.to(() => const FrequentlyQuestionsPage()),
),
ListTile( ListTile(
leading: const Icon(Icons.record_voice_over_outlined), leading: const Icon(Icons.record_voice_over_outlined),
title: Text( title: Text(
@@ -179,6 +191,16 @@ class HomePage extends StatelessWidget {
}), }),
); );
}), }),
ListTile(
leading: const Icon(Icons.account_balance_outlined),
title: Text(
'About Us'.tr,
style: AppStyle.headTitle2,
),
subtitle:
Text('You can change the Country to get all features'.tr),
onTap: () => Get.to(() => const AboutPage()),
),
], ],
), ),
], ],

View File

@@ -42,10 +42,10 @@ class MapPagePassenger extends StatelessWidget {
const MainBottomMenuMap(), const MainBottomMenuMap(),
// NewMainBottomSheet(), // NewMainBottomSheet(),
const MapMenuWidget(), const MapMenuWidget(),
const MenuIconMapPageWidget(),
buttomSheetMapPage(), buttomSheetMapPage(),
CarDetailsTypeToChoose(), CarDetailsTypeToChoose(),
const Burc(), const HeaderDestination(),
const BurcMoney(),
const ApplyOrderWidget(), const ApplyOrderWidget(),
// hexagonClipper(), // hexagonClipper(),
const CancelRidePageShow(), const CancelRidePageShow(),
@@ -55,10 +55,11 @@ class MapPagePassenger extends StatelessWidget {
// timerForCancelTripFromPassenger(), // timerForCancelTripFromPassenger(),
// const DriverTimeArrivePassengerPage(), // const DriverTimeArrivePassengerPage(),
// const TimerToPassengerFromDriver(), // const TimerToPassengerFromDriver(),
PassengerRideLocationWidget(), const PassengerRideLocationWidget(),
const RideBeginPassenger(), const RideBeginPassenger(),
const RideFromStartApp(), const RideFromStartApp(),
cancelRidePage(), cancelRidePage(),
const MenuIconMapPageWidget(),
PointsPageForRider() PointsPageForRider()
], ],
), ),
@@ -82,7 +83,7 @@ class CancelRidePageShow extends StatelessWidget {
? Positioned( ? Positioned(
right: box.read(BoxName.lang) != 'ar' ? 10 : null, right: box.read(BoxName.lang) != 'ar' ? 10 : null,
left: box.read(BoxName.lang) == 'ar' ? 10 : null, left: box.read(BoxName.lang) == 'ar' ? 10 : null,
top: 30, top: Get.height * .013,
child: GestureDetector( child: GestureDetector(
onTap: () { onTap: () {
controller.changeCancelRidePageShow(); controller.changeCancelRidePageShow();

View File

@@ -54,13 +54,7 @@ class CarDetailsTypeToChoose extends StatelessWidget {
left: 5, left: 5,
right: 5, right: 5,
child: Container( child: Container(
decoration: const BoxDecoration( decoration: AppStyle.boxDecoration1,
color: Color.fromARGB(255, 255, 255, 255),
borderRadius: BorderRadius.only(
topLeft: Radius.circular(8),
topRight: Radius.circular(8),
),
),
height: Get.height * .4, height: Get.height * .4,
child: Column( child: Column(
children: [ children: [
@@ -406,8 +400,8 @@ class CarDetailsTypeToChoose extends StatelessWidget {
} }
} }
class Burc extends StatelessWidget { class BurcMoney extends StatelessWidget {
const Burc({super.key}); const BurcMoney({super.key});
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
@@ -467,6 +461,66 @@ class Burc extends StatelessWidget {
} }
} }
class HeaderDestination extends StatelessWidget {
const HeaderDestination({super.key});
@override
Widget build(BuildContext context) {
return GetBuilder<MapPassengerController>(
builder: (mapPassengerController) {
return mapPassengerController.data.isNotEmpty &&
mapPassengerController.isBottomSheetShown &&
mapPassengerController.rideConfirm == false
? Positioned(
top: Get.height * .1,
left: 5,
right: 5,
child: Container(
decoration: AppStyle.boxDecoration1,
height: Get.height * .16,
width: Get.width * .8,
child: InkWell(
onTap: () {
mapPassengerController
.getDialog('Are you want to change'.tr, '', () {
Get.back();
mapPassengerController.cancelRide();
});
},
child: Padding(
padding: const EdgeInsets.all(8.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: [
Text(
'🤢 ${mapPassengerController.startNameAddress}',
style: AppStyle.subtitle,
),
Text(
'😡 ${mapPassengerController.endNameAddress}',
style: AppStyle.subtitle,
),
Row(
children: [
Text(
'📍 ${mapPassengerController.distance} ${'KM'.tr}${mapPassengerController.hours > 0 ? '${'Your Ride Duration is '.tr}${mapPassengerController.hours} ${'H and'.tr} ${mapPassengerController.minutes} ${'m'.tr}' : '${'Your Ride Duration is '.tr} ${mapPassengerController.minutes} m'}',
style: AppStyle.subtitle,
),
],
),
],
),
),
),
),
)
: const SizedBox();
},
);
}
}
class CarDialogue extends StatelessWidget { class CarDialogue extends StatelessWidget {
const CarDialogue({ const CarDialogue({
super.key, super.key,

View File

@@ -110,7 +110,26 @@ GetBuilder<MapPassengerController> formSearchPlacesDestenation() {
box.read(BoxName.addWork).split(',')[1]), box.read(BoxName.addWork).split(',')[1]),
); );
print(latLng); print(latLng);
controller.newMyLocation = latLng; controller.newMyLocation =
controller.newStartPointLocation;
controller.changeMainBottomMenuMap();
controller.getMap(
'${controller.passengerLocation.latitude},${controller.passengerLocation.longitude}',
'${latLng.latitude},${latLng.longitude}',
);
controller.currentLocationToFormPlaces = false;
controller.placesDestination = [];
// controller.isCancelRidePageShown = true;
controller.clearPlacesStart();
controller.clearPlacesDestination();
controller.passengerStartLocationFromMap =
false;
controller.isPickerShown = false;
// controller.showBottomSheet1();
// Get.back();
controller.showBottomSheet1();
// controller.newMyLocation = latLng;
controller.update(); controller.update();
} }
}, },
@@ -128,11 +147,16 @@ GetBuilder<MapPassengerController> formSearchPlacesDestenation() {
})); }));
}, },
child: Container( child: Container(
width: Get.width * .25,
decoration: BoxDecoration( decoration: BoxDecoration(
color: AppColor.greenColor.withOpacity(.4), color: AppColor.greenColor.withOpacity(.4),
border: Border.all()), border: Border.all()),
child: Text( child: Text(
'${'Work :'.tr} ${box.read(BoxName.addWork).toString() == 'addWork' ? 'Add Work' : box.read(BoxName.addWork).toString().split(',')[0] + box.read(BoxName.addWork).toString().split(',')[1]} '), ' ${box.read(BoxName.addWork)}' == 'addWork'
? 'Add Work'
: 'Work',
textAlign: TextAlign.center,
),
), ),
), ),
InkWell( InkWell(
@@ -165,16 +189,37 @@ GetBuilder<MapPassengerController> formSearchPlacesDestenation() {
box.read(BoxName.addHome).split(',')[1]), box.read(BoxName.addHome).split(',')[1]),
); );
print(latLng); print(latLng);
controller.newMyLocation = latLng; controller.changeMainBottomMenuMap();
// controller.newMyLocation = latLng;
controller.getMap(
'${controller.passengerLocation.latitude},${controller.passengerLocation.longitude}',
'${latLng.latitude},${latLng.longitude}',
);
controller.currentLocationToFormPlaces = false;
controller.placesDestination = [];
// controller.isCancelRidePageShown = true;
controller.clearPlacesStart();
controller.clearPlacesDestination();
controller.passengerStartLocationFromMap =
false;
controller.isPickerShown = false;
// controller.showBottomSheet1();
// Get.back();
controller.showBottomSheet1();
// controller.newMyLocation = latLng;
controller.update();
controller.update(); controller.update();
} }
}, },
child: Container( child: Container(
width: Get.width * .25,
decoration: BoxDecoration( decoration: BoxDecoration(
color: AppColor.yellowColor.withOpacity(.4), color: AppColor.yellowColor.withOpacity(.4),
border: Border.all()), border: Border.all()),
child: Text( child: Text(
'Home : ${box.read(BoxName.addHome) == 'addHome' ? 'Add Home' : box.read(BoxName.addHome)} '), textAlign: TextAlign.center,
'${box.read(BoxName.addHome) == 'addHome' ? 'Add Home' : 'Home'} '),
), ),
), ),
], ],

View File

@@ -1,5 +1,7 @@
import 'package:SEFER/constant/style.dart'; import 'package:SEFER/constant/style.dart';
import 'package:SEFER/constant/table_names.dart';
import 'package:SEFER/controller/functions/crud.dart'; import 'package:SEFER/controller/functions/crud.dart';
import 'package:SEFER/main.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:google_maps_flutter/google_maps_flutter.dart'; import 'package:google_maps_flutter/google_maps_flutter.dart';
@@ -15,10 +17,10 @@ GetBuilder<MapPassengerController> leftMainMenuIcons() {
final textToSpeechController = Get.put(TextToSpeechController()); final textToSpeechController = Get.put(TextToSpeechController());
return GetBuilder<MapPassengerController>( return GetBuilder<MapPassengerController>(
builder: (controller) => Positioned( builder: (controller) => Positioned(
top: 85, top: Get.height * .008,
left: 6, left: Get.width * .2,
child: Builder(builder: (context) { child: Builder(builder: (context) {
return Column( return Row(
children: [ children: [
AnimatedContainer( AnimatedContainer(
duration: const Duration(microseconds: 200), duration: const Duration(microseconds: 200),
@@ -39,7 +41,7 @@ GetBuilder<MapPassengerController> leftMainMenuIcons() {
), ),
), ),
const SizedBox( const SizedBox(
height: 5, width: 5,
), ),
AnimatedContainer( AnimatedContainer(
duration: const Duration(microseconds: 200), duration: const Duration(microseconds: 200),
@@ -60,7 +62,7 @@ GetBuilder<MapPassengerController> leftMainMenuIcons() {
), ),
), ),
const SizedBox( const SizedBox(
height: 5, width: 5,
), ),
// if (Platform.isIOS) // if (Platform.isIOS)
AnimatedContainer( AnimatedContainer(
@@ -84,25 +86,25 @@ GetBuilder<MapPassengerController> leftMainMenuIcons() {
), ),
), ),
const SizedBox( const SizedBox(
height: 5, width: 5,
),
AnimatedContainer(
duration: const Duration(microseconds: 200),
width: controller.widthMapTypeAndTraffic,
decoration: BoxDecoration(
color: AppColor.secondaryColor,
border: Border.all(),
borderRadius: BorderRadius.circular(15)),
child: IconButton(
onPressed: () async {
sql.deleteAllData(TableName.recentLocations);
},
icon: const Icon(
Icons.voice_chat,
size: 29,
),
),
), ),
// AnimatedContainer(
// duration: const Duration(microseconds: 200),
// width: controller.widthMapTypeAndTraffic,
// decoration: BoxDecoration(
// color: AppColor.secondaryColor,
// border: Border.all(),
// borderRadius: BorderRadius.circular(15)),
// child: IconButton(
// onPressed: () async {
// await Get.find<AudioRecorderController>().stopRecording();
// },
// icon: const Icon(
// Icons.voice_chat,
// size: 29,
// ),
// ),
// ),
// AnimatedContainer( // AnimatedContainer(
// duration: const Duration(microseconds: 200), // duration: const Duration(microseconds: 200),
// width: controller.widthMapTypeAndTraffic, // width: controller.widthMapTypeAndTraffic,

View File

@@ -145,7 +145,7 @@ class MainBottomMenuMap extends StatelessWidget {
SizedBox recentPlacesWidget(MapPassengerController controller) { SizedBox recentPlacesWidget(MapPassengerController controller) {
final textToSpeechController = Get.put(TextToSpeechController()); final textToSpeechController = Get.put(TextToSpeechController());
return SizedBox( return SizedBox(
height: 50, height: controller.recentPlaces.isEmpty ? 0 : 50,
child: ListView.builder( child: ListView.builder(
itemCount: controller.recentPlaces.length, itemCount: controller.recentPlaces.length,
scrollDirection: Axis.horizontal, scrollDirection: Axis.horizontal,

View File

@@ -1,3 +1,6 @@
import 'dart:io';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_font_icons/flutter_font_icons.dart'; import 'package:flutter_font_icons/flutter_font_icons.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
@@ -8,6 +11,7 @@ import 'package:SEFER/views/home/profile/feed_back_page.dart';
import 'package:SEFER/views/home/profile/order_history.dart'; import 'package:SEFER/views/home/profile/order_history.dart';
import 'package:SEFER/views/home/profile/promos_passenger_page.dart'; import 'package:SEFER/views/home/profile/promos_passenger_page.dart';
import 'package:SEFER/views/home/profile/taarif_page.dart'; import 'package:SEFER/views/home/profile/taarif_page.dart';
import 'package:url_launcher/url_launcher.dart';
import '../../../constant/colors.dart'; import '../../../constant/colors.dart';
import '../../../controller/home/map_passenger_controller.dart'; import '../../../controller/home/map_passenger_controller.dart';
@@ -160,9 +164,24 @@ class MapMenuWidget extends StatelessWidget {
mainAxisAlignment: MainAxisAlignment.spaceAround, mainAxisAlignment: MainAxisAlignment.spaceAround,
children: [ children: [
IconMainPageMap( IconMainPageMap(
onTap: () { onTap: () async {
// Get.to(const RegisterCaptin()); final String driverAppUrl;
//todo use url to use driver app if (defaultTargetPlatform == TargetPlatform.android) {
driverAppUrl =
'https://play.google.com/store/apps/details?id=id6458734951'; // Replace with your driver app's Play Store URL
} else if (defaultTargetPlatform == TargetPlatform.iOS) {
driverAppUrl =
'https://apps.apple.com/app/id6458734951'; // Replace with your driver app's App Store ID
} else {
// Handle other platforms or unknown platform (optional)
return;
}
if (await canLaunch(driverAppUrl)) {
await launch(driverAppUrl);
} else {
throw 'Could not launch app store URL';
}
}, },
title: 'Driver'.tr, title: 'Driver'.tr,
icon: WeatherIcons.wi_moon_14, icon: WeatherIcons.wi_moon_14,

View File

@@ -15,7 +15,7 @@ class MenuIconMapPageWidget extends StatelessWidget {
Widget build(BuildContext context) { Widget build(BuildContext context) {
return GetBuilder<MapPassengerController>( return GetBuilder<MapPassengerController>(
builder: (controller) => Positioned( builder: (controller) => Positioned(
top: 30, top: Get.height * .008,
left: box.read(BoxName.lang) != 'ar' ? 5 : null, left: box.read(BoxName.lang) != 'ar' ? 5 : null,
right: box.read(BoxName.lang) == 'ar' ? 5 : null, right: box.read(BoxName.lang) == 'ar' ? 5 : null,
child: Container( child: Container(