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

@@ -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 '../../controller/functions/audio_record1.dart';
import 'HomePage/about_page.dart';
import 'HomePage/frequentlyQuestionsPage.dart';
import 'profile/passenger_profile_page.dart';
class HomePage extends StatelessWidget {
@@ -55,6 +57,16 @@ class HomePage extends StatelessWidget {
body: [CountryPickerFromSetting()],
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(
leading: const Icon(Icons.record_voice_over_outlined),
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(),
// NewMainBottomSheet(),
const MapMenuWidget(),
const MenuIconMapPageWidget(),
buttomSheetMapPage(),
CarDetailsTypeToChoose(),
const Burc(),
const HeaderDestination(),
const BurcMoney(),
const ApplyOrderWidget(),
// hexagonClipper(),
const CancelRidePageShow(),
@@ -55,10 +55,11 @@ class MapPagePassenger extends StatelessWidget {
// timerForCancelTripFromPassenger(),
// const DriverTimeArrivePassengerPage(),
// const TimerToPassengerFromDriver(),
PassengerRideLocationWidget(),
const PassengerRideLocationWidget(),
const RideBeginPassenger(),
const RideFromStartApp(),
cancelRidePage(),
const MenuIconMapPageWidget(),
PointsPageForRider()
],
),
@@ -82,7 +83,7 @@ class CancelRidePageShow extends StatelessWidget {
? Positioned(
right: box.read(BoxName.lang) != 'ar' ? 10 : null,
left: box.read(BoxName.lang) == 'ar' ? 10 : null,
top: 30,
top: Get.height * .013,
child: GestureDetector(
onTap: () {
controller.changeCancelRidePageShow();

View File

@@ -54,13 +54,7 @@ class CarDetailsTypeToChoose extends StatelessWidget {
left: 5,
right: 5,
child: Container(
decoration: const BoxDecoration(
color: Color.fromARGB(255, 255, 255, 255),
borderRadius: BorderRadius.only(
topLeft: Radius.circular(8),
topRight: Radius.circular(8),
),
),
decoration: AppStyle.boxDecoration1,
height: Get.height * .4,
child: Column(
children: [
@@ -406,8 +400,8 @@ class CarDetailsTypeToChoose extends StatelessWidget {
}
}
class Burc extends StatelessWidget {
const Burc({super.key});
class BurcMoney extends StatelessWidget {
const BurcMoney({super.key});
@override
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 {
const CarDialogue({
super.key,

View File

@@ -110,7 +110,26 @@ GetBuilder<MapPassengerController> formSearchPlacesDestenation() {
box.read(BoxName.addWork).split(',')[1]),
);
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();
}
},
@@ -128,11 +147,16 @@ GetBuilder<MapPassengerController> formSearchPlacesDestenation() {
}));
},
child: Container(
width: Get.width * .25,
decoration: BoxDecoration(
color: AppColor.greenColor.withOpacity(.4),
border: Border.all()),
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(
@@ -165,16 +189,37 @@ GetBuilder<MapPassengerController> formSearchPlacesDestenation() {
box.read(BoxName.addHome).split(',')[1]),
);
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();
}
},
child: Container(
width: Get.width * .25,
decoration: BoxDecoration(
color: AppColor.yellowColor.withOpacity(.4),
border: Border.all()),
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/table_names.dart';
import 'package:SEFER/controller/functions/crud.dart';
import 'package:SEFER/main.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:google_maps_flutter/google_maps_flutter.dart';
@@ -15,10 +17,10 @@ GetBuilder<MapPassengerController> leftMainMenuIcons() {
final textToSpeechController = Get.put(TextToSpeechController());
return GetBuilder<MapPassengerController>(
builder: (controller) => Positioned(
top: 85,
left: 6,
top: Get.height * .008,
left: Get.width * .2,
child: Builder(builder: (context) {
return Column(
return Row(
children: [
AnimatedContainer(
duration: const Duration(microseconds: 200),
@@ -39,7 +41,7 @@ GetBuilder<MapPassengerController> leftMainMenuIcons() {
),
),
const SizedBox(
height: 5,
width: 5,
),
AnimatedContainer(
duration: const Duration(microseconds: 200),
@@ -60,7 +62,7 @@ GetBuilder<MapPassengerController> leftMainMenuIcons() {
),
),
const SizedBox(
height: 5,
width: 5,
),
// if (Platform.isIOS)
AnimatedContainer(
@@ -84,25 +86,25 @@ GetBuilder<MapPassengerController> leftMainMenuIcons() {
),
),
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(
// duration: const Duration(microseconds: 200),
// width: controller.widthMapTypeAndTraffic,

View File

@@ -145,7 +145,7 @@ class MainBottomMenuMap extends StatelessWidget {
SizedBox recentPlacesWidget(MapPassengerController controller) {
final textToSpeechController = Get.put(TextToSpeechController());
return SizedBox(
height: 50,
height: controller.recentPlaces.isEmpty ? 0 : 50,
child: ListView.builder(
itemCount: controller.recentPlaces.length,
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_font_icons/flutter_font_icons.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/promos_passenger_page.dart';
import 'package:SEFER/views/home/profile/taarif_page.dart';
import 'package:url_launcher/url_launcher.dart';
import '../../../constant/colors.dart';
import '../../../controller/home/map_passenger_controller.dart';
@@ -160,9 +164,24 @@ class MapMenuWidget extends StatelessWidget {
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: [
IconMainPageMap(
onTap: () {
// Get.to(const RegisterCaptin());
//todo use url to use driver app
onTap: () async {
final String driverAppUrl;
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,
icon: WeatherIcons.wi_moon_14,

View File

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