diff --git a/assets/images/car.png b/assets/images/car.png new file mode 100644 index 0000000..fbc44e5 Binary files /dev/null and b/assets/images/car.png differ diff --git a/assets/images/notepad.png b/assets/images/notepad.png new file mode 100644 index 0000000..9536a4d Binary files /dev/null and b/assets/images/notepad.png differ diff --git a/lib/constant/box_name.dart b/lib/constant/box_name.dart index 1a127ed..95465d6 100644 --- a/lib/constant/box_name.dart +++ b/lib/constant/box_name.dart @@ -2,4 +2,5 @@ class BoxName { static const String driverID = "driverID"; static const String lang = "lang"; + static const String agreeTerms = "agreeTerms"; } diff --git a/lib/constant/links.dart b/lib/constant/links.dart index a66836f..0fac7c5 100644 --- a/lib/constant/links.dart +++ b/lib/constant/links.dart @@ -1,5 +1,5 @@ class AppLink { - static const String server = 'https://ride.mobile-app.store/'; + static const String server = 'https://ride.mobile-app.store'; static const String googleMapsLink = 'https://maps.googleapis.com/maps/api/'; static const String test = "$server/test.php"; @@ -9,12 +9,11 @@ class AppLink { static const String uploadImageType = "$server/uploadImageType.php"; //==================certifcate========== - static const String certifcate = - 'https://portfolio.mobile-app.store/hamzaayed/certifications'; - static const String getCertificate = "$certifcate/get.php"; - static const String addCertificate = "$certifcate/add.php"; - static const String deleteCertificate = "$certifcate/delete.php"; - static const String updateCertificate = "$certifcate/update.php"; + static const String location = '$server/ride/location'; + static const String getCarsLocationByPassenger = "$location/get.php"; + static const String addCarsLocationByPassenger = "$location/add.php"; + static const String deleteCarsLocationByPassenger = "$location/delete.php"; + static const String updateCarsLocationByPassenger = "$location/update.php"; //==================Blog============= static const String blog = @@ -23,4 +22,8 @@ class AppLink { static const String addBlog = "$blog/add.php"; static const String deleteBlog = "$blog/delete.php"; static const String updateBlog = "$blog/update.php"; + + //===================Auth============ + static const String auth = 'https://ride.mobile-app.store/auth/'; + static const String login = "$auth/login.php"; } diff --git a/lib/constant/style.dart b/lib/constant/style.dart index c504617..e688c25 100644 --- a/lib/constant/style.dart +++ b/lib/constant/style.dart @@ -7,25 +7,25 @@ class AppStyle { fontWeight: FontWeight.bold, fontSize: 40, color: AppColor.accentColor, - fontFamily: GoogleFonts.pacifico().fontFamily); + fontFamily: GoogleFonts.josefinSans().fontFamily); static TextStyle headtitle2 = TextStyle( fontWeight: FontWeight.bold, fontSize: 26, color: AppColor.primaryColor, - fontFamily: GoogleFonts.eduSaBeginner().fontFamily); + fontFamily: GoogleFonts.josefinSans().fontFamily); static TextStyle title = TextStyle( fontWeight: FontWeight.bold, fontSize: 16, color: AppColor.primaryColor, - fontFamily: GoogleFonts.roboto().fontFamily); + fontFamily: GoogleFonts.josefinSans().fontFamily); static TextStyle subtitle = TextStyle( fontWeight: FontWeight.bold, fontSize: 13, color: AppColor.primaryColor, - fontFamily: GoogleFonts.roboto().fontFamily); + fontFamily: GoogleFonts.josefinSans().fontFamily); static TextStyle number = TextStyle( fontWeight: FontWeight.bold, fontSize: 20, color: AppColor.primaryColor, - fontFamily: GoogleFonts.roboto().fontFamily); + fontFamily: GoogleFonts.josefinSans().fontFamily); } diff --git a/lib/controller/auth/login_controller.dart b/lib/controller/auth/login_controller.dart index b7abb56..2009419 100644 --- a/lib/controller/auth/login_controller.dart +++ b/lib/controller/auth/login_controller.dart @@ -1,13 +1,50 @@ +import 'dart:convert'; + import 'package:flutter/material.dart'; import 'package:get/get.dart'; +import 'package:ride/constant/box_name.dart'; +import 'package:ride/constant/links.dart'; +import 'package:ride/controller/functions/crud.dart'; +import 'package:ride/main.dart'; class LoginController extends GetxController { + final formKey = GlobalKey(); TextEditingController emailController = TextEditingController(); TextEditingController phoneController = TextEditingController(); - TextEditingController firstNameController = TextEditingController(); - TextEditingController lastNameController = TextEditingController(); + TextEditingController passwordController = TextEditingController(); + bool isAgreeTerms = false; - void login() { - //TODO: Implement login logic + void changeAgreeTerm() { + isAgreeTerms = !isAgreeTerms; + print(isAgreeTerms); + update(); + } + + void saveAgreementTerms() { + box.write(BoxName.agreeTerms, 'agreed'); + update(); + } + + void login() async { + Map res = await CRUD().post(link: AppLink.login, payload: { + 'email': emailController.text, + 'phone': phoneController.text, + 'password': passwordController.text + }); + + if (res.isNotEmpty) { + if (res['status'] == 'success1') { + print(res); + } else { + print('noooooooooooooooo'); + } + } else { + print('res is null'); + } + } + + @override + void onInit() { + super.onInit(); } } diff --git a/lib/controller/auth/register_controller.dart b/lib/controller/auth/register_controller.dart new file mode 100644 index 0000000..dc16390 --- /dev/null +++ b/lib/controller/auth/register_controller.dart @@ -0,0 +1,48 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +class RegisterController extends GetxController { + final formKey = GlobalKey(); + + TextEditingController firstNameController = TextEditingController(); + TextEditingController lastNameController = TextEditingController(); + TextEditingController emailController = TextEditingController(); + TextEditingController phoneController = TextEditingController(); + TextEditingController passwordController = TextEditingController(); + + String birthDate = 'Birth Date'.tr; + @override + void onInit() { + super.onInit(); + } + + getBirthDate() { + Get.defaultDialog( + title: 'Select Date', + content: SizedBox( + width: 300, + child: CalendarDatePicker( + initialDate: DateTime.now().subtract(const Duration(days: 14 * 365)), + firstDate: DateTime.parse('1940-06-01'), + lastDate: DateTime.now().subtract(const Duration(days: 14 * 365)), + onDateChanged: (date) { + // Get the selected date and convert it to a DateTime object + DateTime dateTime = date; + // Call the getOrders() function from the controller + birthDate = dateTime.toString().split(' ')[0]; + update(); + Get.back(); + }, + + // onDateChanged: (DateTime value) {}, + ), + ), + ); + } + + void register() { + if (formKey.currentState!.validate()) { + // Do something with the data + } + } +} diff --git a/lib/controller/functions/crud.dart b/lib/controller/functions/crud.dart index 427628d..c216515 100644 --- a/lib/controller/functions/crud.dart +++ b/lib/controller/functions/crud.dart @@ -9,17 +9,26 @@ class CRUD { required String link, Map? payload, }) async { - var url = Uri.parse(link); - var response = await http.get( + var url = Uri.parse( + link, + ); + var response = await http.post( url, + body: payload, headers: { + "Content-Type": "application/x-www-form-urlencoded", 'Authorization': 'Basic ${base64Encode(utf8.encode(AppCredintials.basicAuthCredentials))}', }, ); - List data = jsonDecode(response.body)['data']; - print(data); - return data; + // print("--------------" + response.body.toString()); + if (response.statusCode == 200) { + var jsonData = jsonDecode(response.body); + if (jsonData['status'] == 'success') { + print(jsonData['message']); + return jsonData['message']; + } + } } Future post({ @@ -50,7 +59,7 @@ class CRUD { return response.body; } else if (jsonData['status'] == 'success1') { print(jsonData['data']); - return jsonData['data']; + return jsonData; } } return (response.body); diff --git a/lib/controller/home/map_page_controller.dart b/lib/controller/home/map_page_controller.dart index 3a98b30..6af1609 100644 --- a/lib/controller/home/map_page_controller.dart +++ b/lib/controller/home/map_page_controller.dart @@ -1,13 +1,10 @@ import 'package:flutter/material.dart'; import 'package:get/get.dart'; -import 'dart:math' as math; import 'package:google_maps_flutter/google_maps_flutter.dart'; import 'package:google_polyline_algorithm/google_polyline_algorithm.dart'; import 'package:location/location.dart'; -import 'package:ride/constant/colors.dart'; import 'package:ride/constant/credential.dart'; import 'package:ride/constant/links.dart'; -import 'package:ride/constant/style.dart'; import 'package:ride/controller/functions/crud.dart'; import 'package:ride/views/home/map_widget.dart/buttom_sheet_map_show.dart'; @@ -24,7 +21,9 @@ class MapController extends GetxController { late LatLng newMylocation = const LatLng(32.115295, 36.064773); LatLng mydestination = const LatLng(32.115295, 36.064773); final List polylineCoordinates = []; + final List carsLocationByPassenger = []; BitmapDescriptor markerIcon = BitmapDescriptor.defaultMarker; + BitmapDescriptor carIcon = BitmapDescriptor.defaultMarker; double height = 200; final location = Location(); late LocationData currentLocation; @@ -110,7 +109,21 @@ class MapController extends GetxController { }); } + void addCustomCarIcon() { + ImageConfiguration config = const ImageConfiguration( + size: Size(50, 50), + // scale: 1.0, + ); + BitmapDescriptor.fromAssetImage(config, 'assets/images/car.png') + .then((value) { + carIcon = value; + update(); + }); + } + Future getLocation() async { + isloading = true; + update(); bool serviceEnabled; PermissionStatus permissionGranted; @@ -134,16 +147,33 @@ class MapController extends GetxController { } } + // Configure location accuracy + LocationAccuracy desiredAccuracy = LocationAccuracy.high; + // Get the current location LocationData _locationData = await location.getLocation(); mylocation = (_locationData.latitude != null && _locationData.longitude != null ? LatLng(_locationData.latitude!, _locationData.longitude!) : null)!; - // print('accuracy' + _locationData.accuracy.toString()); - // print(_locationData.latitude); - // print(_locationData.time); - // print('//////////////////////////////////////'); + + // Print location details + print('Accuracy: ${_locationData.accuracy}'); + print('Latitude: ${_locationData.latitude}'); + print('Longitude: ${_locationData.longitude}'); + print('Time: ${_locationData.time}'); + isloading = false; + update(); + } + + Future getCarsLocationByPassenger() async { + List data = + await CRUD().get(link: AppLink.getCarsLocationByPassenger, payload: {}); + for (var i = 0; i < data.length; i++) { + carsLocationByPassenger.add(LatLng(double.parse(data[i]['latitude']), + double.parse(data[i]['longitude']))); + } + update(); } @@ -357,11 +387,13 @@ class MapController extends GetxController { List polylineCoordinate = []; @override - void onInit() { + void onInit() async { // getPolyLine(); // getMap(); getLocation(); + await getCarsLocationByPassenger(); addCustomPicker(); + addCustomCarIcon(); super.onInit(); } diff --git a/lib/main.dart b/lib/main.dart index f8942a6..753a995 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -4,6 +4,7 @@ import 'package:firebase_core/firebase_core.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:get_storage/get_storage.dart'; +import 'package:ride/views/auth/login_page.dart'; import 'package:ride/views/lang/languages.dart'; import 'constant/box_name.dart'; @@ -45,6 +46,6 @@ class MyApp extends StatelessWidget { home: box.read(BoxName.lang).toString() != 'ar' && box.read(BoxName.lang).toString() != 'en' ? const Language() - : const MapPage()); + : LoginPage()); } } diff --git a/lib/views/auth/login_page.dart b/lib/views/auth/login_page.dart index 48b79e6..68a65bf 100644 --- a/lib/views/auth/login_page.dart +++ b/lib/views/auth/login_page.dart @@ -1,7 +1,15 @@ +import 'package:animated_text_kit/animated_text_kit.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; +import 'package:ride/constant/box_name.dart'; +import 'package:ride/constant/colors.dart'; +import 'package:ride/constant/style.dart'; +import 'package:ride/main.dart'; +import 'package:ride/views/widgets/elevated_btn.dart'; +import 'package:ride/views/widgets/my_scafold.dart'; import '../../controller/auth/login_controller.dart'; +import 'register_page.dart'; class LoginPage extends StatelessWidget { final controller = Get.put(LoginController()); @@ -10,49 +18,202 @@ class LoginPage extends StatelessWidget { @override Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - title: Text('Login'), - ), - body: Center( - child: Padding( - padding: const EdgeInsets.all(22), + Get.put(LoginController()); + return MyScafolld(title: 'Login', isleading: false, body: [ + if (box.read(BoxName.agreeTerms) != 'agreed') + agreedpage() + else + SingleChildScrollView( child: Column( - mainAxisAlignment: MainAxisAlignment.center, children: [ - TextFormField( - controller: controller.emailController, - decoration: InputDecoration( - labelText: 'Email', - ), + Padding( + padding: const EdgeInsets.all(25), + child: Container( + decoration: const BoxDecoration( + boxShadow: [ + BoxShadow( + offset: Offset(3, 3), + color: AppColor.accentColor, + blurRadius: 3) + ], + color: AppColor.secondaryColor, + ), + child: Form( + key: controller.formKey, + child: Padding( + padding: const EdgeInsets.all(16.0), + child: SingleChildScrollView( + child: Column( + children: [ + TextFormField( + keyboardType: TextInputType.emailAddress, + controller: controller.emailController, + decoration: InputDecoration( + fillColor: AppColor.accentColor, + hoverColor: AppColor.accentColor, + focusColor: AppColor.accentColor, + border: const OutlineInputBorder( + borderRadius: BorderRadius.all( + Radius.circular(12))), + labelText: 'Email'.tr, + hintText: 'Enter your email address'.tr, + ), + validator: (value) { + if (value!.isEmpty || + (!value.contains('@') || + !value.contains('.'))) { + return 'Please enter Your Email.'.tr; + } + return null; + }, + ), + const SizedBox( + height: 30, + ), + TextFormField( + keyboardType: TextInputType.phone, + cursorColor: AppColor.accentColor, + controller: controller.phoneController, + decoration: InputDecoration( + focusColor: AppColor.accentColor, + fillColor: AppColor.accentColor, + border: const OutlineInputBorder( + borderRadius: BorderRadius.all( + Radius.circular(12))), + labelText: 'Phone'.tr, + hintText: 'Enter your phone number'.tr, + ), + validator: (value) { + if (value!.isEmpty || value.length != 10) { + return 'Please enter your phone number.'.tr; + } + return null; + }, + ), + const SizedBox( + height: 15, + ), + TextFormField( + obscureText: true, + keyboardType: TextInputType.emailAddress, + controller: controller.passwordController, + decoration: InputDecoration( + fillColor: AppColor.accentColor, + hoverColor: AppColor.accentColor, + focusColor: AppColor.accentColor, + border: const OutlineInputBorder( + borderRadius: BorderRadius.all( + Radius.circular(12))), + labelText: 'Password'.tr, + hintText: 'Enter your Password'.tr, + ), + validator: (value) { + if (value!.isEmpty || (value.length > 6)) { + return 'Please enter Your Password.'.tr; + } + return null; + }, + ), + MyElevatedButton( + onPressed: () { + if (controller.formKey.currentState! + .validate()) { + controller.login(); + } + }, + title: 'Submit', + ), + ], + ), + ), + ), + ), + )), + Text( + 'if you dont have account'.tr, + style: AppStyle.subtitle, ), - TextFormField( - controller: controller.phoneController, - decoration: InputDecoration( - labelText: 'Phone', - ), + AnimatedTextKit( + onTap: () => Get.to(() => RegisterPage()), + animatedTexts: [ + TypewriterAnimatedText( + 'Register', + textStyle: AppStyle.headtitle2, + speed: const Duration(milliseconds: 200), + ), + ], + totalRepeatCount: 4, + pause: const Duration(milliseconds: 200), + displayFullTextOnTap: true, + stopPauseOnTap: true, + ) + ], + ), + ) + ]); + } + + Padding agreedpage() { + return Padding( + padding: const EdgeInsets.all(16), + child: Column( + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Image.asset( + 'assets/images/notepad.png', + width: Get.width * .2, ), - TextFormField( - controller: controller.firstNameController, - decoration: InputDecoration( - labelText: 'First Name', + SizedBox( + width: Get.width * .7, + child: Text( + 'Accept Ride\'s Terms & Review Privacy Notice'.tr, + style: AppStyle.headtitle2, ), ), - TextFormField( - controller: controller.lastNameController, - decoration: InputDecoration( - labelText: 'Last Name', - ), - ), - ElevatedButton( - onPressed: () { - controller.login(); - }, - child: Text('Login'), - ), ], ), - ), + const SizedBox( + height: 30, + ), + Text( + 'By selecting "I Agree" below, I have reviewed and agree to the Terms of Use and acknowledge the Privacy Notice. I am at least 18 years of age.' + .tr, + style: AppStyle.title, + ), + const SizedBox( + height: 100, + ), + GetBuilder( + builder: (controller) => Column( + children: [ + Row( + children: [ + Checkbox.adaptive( + autofocus: true, + tristate: true, + splashRadius: 25, + activeColor: AppColor.primaryColor, + value: controller.isAgreeTerms, + onChanged: (value) => controller.changeAgreeTerm(), + ), + Text( + 'I Agree'.tr, + style: controller.isAgreeTerms + ? AppStyle.title + : AppStyle.title + .copyWith(color: AppColor.accentColor), + ), + ], + ), + MyElevatedButton( + title: 'Submit', + onPressed: () => controller.saveAgreementTerms()) + ], + ), + ) + ], ), ); } diff --git a/lib/views/auth/register_page.dart b/lib/views/auth/register_page.dart new file mode 100644 index 0000000..b87459f --- /dev/null +++ b/lib/views/auth/register_page.dart @@ -0,0 +1,194 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:ride/constant/style.dart'; +import 'package:ride/controller/auth/register_controller.dart'; +import 'package:ride/views/widgets/elevated_btn.dart'; +import 'package:ride/views/widgets/my_scafold.dart'; + +import '../../constant/colors.dart'; + +class RegisterPage extends StatelessWidget { + const RegisterPage({super.key}); + + @override + Widget build(BuildContext context) { + Get.put(RegisterController()); + return MyScafolld( + title: 'Register', + body: [ + GetBuilder( + builder: (controller) => Form( + key: controller.formKey, + child: Padding( + padding: const EdgeInsets.all(16.0), + child: SingleChildScrollView( + child: Container( + decoration: const BoxDecoration( + boxShadow: [ + BoxShadow( + offset: Offset(3, 3), + color: AppColor.accentColor, + blurRadius: 3) + ], + color: AppColor.secondaryColor, + ), + child: Padding( + padding: const EdgeInsets.all(16), + child: Column(children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + SizedBox( + width: Get.width * .4, + child: TextFormField( + keyboardType: TextInputType.text, + controller: controller.firstNameController, + decoration: InputDecoration( + fillColor: AppColor.accentColor, + hoverColor: AppColor.accentColor, + focusColor: AppColor.accentColor, + border: const OutlineInputBorder( + borderRadius: BorderRadius.all( + Radius.circular(12))), + labelText: 'First name'.tr, + hintText: 'Enter your first name'.tr, + ), + validator: (value) { + if (value!.isEmpty) { + return 'Please enter your first name.'.tr; + } + return null; + }, + ), + ), + SizedBox( + width: Get.width * .4, + child: TextFormField( + keyboardType: TextInputType.text, + controller: controller.lastNameController, + decoration: InputDecoration( + focusColor: AppColor.accentColor, + fillColor: AppColor.accentColor, + border: const OutlineInputBorder( + borderRadius: BorderRadius.all( + Radius.circular(12))), + labelText: 'Last name'.tr, + hintText: 'Enter your last name'.tr, + ), + validator: (value) { + if (value!.isEmpty) { + return 'Please enter your last name.'.tr; + } + return null; + }, + ), + ), + ], + ), + const SizedBox( + height: 15, + ), + TextFormField( + keyboardType: TextInputType.emailAddress, + controller: controller.emailController, + decoration: InputDecoration( + fillColor: AppColor.accentColor, + hoverColor: AppColor.accentColor, + focusColor: AppColor.accentColor, + border: const OutlineInputBorder( + borderRadius: + BorderRadius.all(Radius.circular(12))), + labelText: 'Email'.tr, + hintText: 'Enter your email address'.tr, + ), + validator: (value) { + if (value!.isEmpty || + (!value.contains('@') || + !value.contains('.'))) { + return 'Please enter Your Email.'.tr; + } + return null; + }, + ), + const SizedBox( + height: 15, + ), + TextFormField( + obscureText: true, + keyboardType: TextInputType.emailAddress, + controller: controller.passwordController, + decoration: InputDecoration( + fillColor: AppColor.accentColor, + hoverColor: AppColor.accentColor, + focusColor: AppColor.accentColor, + border: const OutlineInputBorder( + borderRadius: + BorderRadius.all(Radius.circular(12))), + labelText: 'Password'.tr, + hintText: 'Enter your Password'.tr, + ), + validator: (value) { + if (value!.isEmpty || (value.length > 6)) { + return 'Please enter Your Password.'.tr; + } + return null; + }, + ), + const SizedBox( + height: 15, + ), + TextFormField( + keyboardType: TextInputType.phone, + cursorColor: AppColor.accentColor, + controller: controller.phoneController, + decoration: InputDecoration( + focusColor: AppColor.accentColor, + fillColor: AppColor.accentColor, + border: const OutlineInputBorder( + borderRadius: + BorderRadius.all(Radius.circular(12))), + labelText: 'Phone'.tr, + hintText: 'Enter your phone number'.tr, + ), + validator: (value) { + if (value!.isEmpty || value.length != 10) { + return 'Please enter your phone number.'.tr; + } + return null; + }, + ), + const SizedBox( + height: 15, + ), + InkWell( + onTap: () => controller.getBirthDate(), + child: Container( + height: 50, + width: Get.width, + decoration: BoxDecoration( + border: Border.all(), + borderRadius: BorderRadius.circular(13)), + child: Padding( + padding: + const EdgeInsets.symmetric(horizontal: 20), + child: Text( + controller.birthDate, + style: AppStyle.title, + ), + ), + ), + ), + MyElevatedButton( + title: 'Register'.tr, + onPressed: () => controller.register()) + ]), + ), + ), + ), + ), + ), + ) + ], + isleading: true); + } +} diff --git a/lib/views/home/home_page.dart b/lib/views/home/home_page.dart index b87c48d..e044eb5 100644 --- a/lib/views/home/home_page.dart +++ b/lib/views/home/home_page.dart @@ -8,7 +8,15 @@ class HomePage extends StatelessWidget { @override Widget build(BuildContext context) { return MyScafolld( - title: 'Home Page', - body: Center(child: CircleContainer(child: const Icon(Icons.clear)))); + isleading: true, + title: 'Home Page', + body: [ + Center( + child: CircleContainer( + child: const Icon(Icons.clear), + ), + ), + ], + ); } } diff --git a/lib/views/home/map_page.dart b/lib/views/home/map_page.dart index d70fb8f..f07eb80 100644 --- a/lib/views/home/map_page.dart +++ b/lib/views/home/map_page.dart @@ -4,7 +4,6 @@ import 'package:google_maps_flutter/google_maps_flutter.dart'; import 'package:ride/constant/colors.dart'; import 'package:ride/controller/home/map_page_controller.dart'; -import '../../constant/style.dart'; import '../../controller/home/menu_controller.dart'; import 'map_widget.dart/buttom_sheet_map_show.dart'; import 'map_widget.dart/map_menu_widget.dart'; @@ -22,88 +21,99 @@ class MapPage extends StatelessWidget { body: Stack( children: [ GetBuilder( - builder: (controller) => GoogleMap( - onMapCreated: controller.onMapCreated, - cameraTargetBounds: CameraTargetBounds(controller.boundsdata), - minMaxZoomPreference: const MinMaxZoomPreference(6, 18), - onLongPress: (argument) { - Get.defaultDialog( - title: 'Are you want to go to this site', - content: Column( - children: [ - Text('${argument.latitude},${argument.longitude}'), - ], + builder: (controller) => controller.isloading + ? const Center( + child: CircularProgressIndicator.adaptive(), + ) + : GoogleMap( + onMapCreated: controller.onMapCreated, + cameraTargetBounds: + CameraTargetBounds(controller.boundsdata), + minMaxZoomPreference: const MinMaxZoomPreference(6, 18), + onLongPress: (argument) { + Get.defaultDialog( + title: 'Are you want to go to this site', + content: Column( + children: [ + Text('${argument.latitude},${argument.longitude}'), + ], + ), + onConfirm: () async { + controller.clearpolyline(); + await controller.getMap( + '${controller.mylocation.latitude},${controller.mylocation.longitude}', + '${argument.latitude.toString()},${argument.longitude.toString()}'); + + Get.back(); + controller.changeButtomSheetShown(); + controller.bottomSheet(); + }, + ); + }, + onTap: (argument) { + controller.hidePlaces(); + + controller.changeButtomSheetShown(); + controller.bottomSheet(); + }, + initialCameraPosition: CameraPosition( + target: controller.mylocation, + zoom: 15, + ), + markers: { + for (var carLocation + in controller.carsLocationByPassenger) + Marker( + position: carLocation, + icon: controller.carIcon, + markerId: MarkerId(carLocation.toString())), + Marker( + markerId: const MarkerId('MyLocation'), + position: controller.mylocation, + draggable: true, + icon: controller.markerIcon, + onDragEnd: (value) { + print(value); + }, + infoWindow: const InfoWindow(title: 'my location'), + ), + Marker( + markerId: const MarkerId('destination'), + position: controller.mydestination, + draggable: true, + onDragEnd: (v) { + print(v); + }, + ), + }, + polylines: { + Polyline( + zIndex: 2, + consumeTapEvents: true, + geodesic: true, + endCap: Cap.buttCap, + startCap: Cap.buttCap, + visible: true, + polylineId: const PolylineId('route'), + points: controller.polylineCoordinates, + color: AppColor.primaryColor, + width: 5, + ), + }, + mapType: MapType.normal, + myLocationButtonEnabled: true, + indoorViewEnabled: true, + trafficEnabled: true, + buildingsEnabled: true, + mapToolbarEnabled: true, + onCameraMove: (position) { + controller.newMylocation = position.target; + // print('my' + controller.mylocation.toString()); + // print('new' + controller.newMylocation.toString()); + }, + myLocationEnabled: true, + // liteModeEnabled: true, ), - onConfirm: () async { - controller.clearpolyline(); - await controller.getMap( - '${controller.mylocation.latitude},${controller.mylocation.longitude}', - '${argument.latitude.toString()},${argument.longitude.toString()}'); - - Get.back(); - controller.changeButtomSheetShown(); - controller.bottomSheet(); - }, - ); - }, - onTap: (argument) { - controller.hidePlaces(); - - controller.changeButtomSheetShown(); - controller.bottomSheet(); - }, - initialCameraPosition: CameraPosition( - target: controller.mylocation, - zoom: 15, - ), - markers: { - Marker( - markerId: const MarkerId('MyLocation'), - position: controller.mylocation, - draggable: true, - icon: controller.markerIcon, - onDragEnd: (value) { - print(value); - }, - infoWindow: const InfoWindow(title: 'my location'), - ), - Marker( - markerId: const MarkerId('destination'), - position: controller.mydestination, - draggable: true, - onDragEnd: (v) { - print(v); - }, - ), - }, - polylines: { - Polyline( - zIndex: 2, - consumeTapEvents: true, - geodesic: true, - endCap: Cap.buttCap, - startCap: Cap.buttCap, - visible: true, - polylineId: const PolylineId('route'), - points: controller.polylineCoordinates, - color: AppColor.primaryColor, - width: 5, - ), - }, - mapType: MapType.normal, - myLocationButtonEnabled: true, - indoorViewEnabled: true, - trafficEnabled: true, - buildingsEnabled: true, - mapToolbarEnabled: true, - onCameraMove: (position) { - controller.newMylocation = position.target; - // print('my' + controller.mylocation.toString()); - // print('new' + controller.newMylocation.toString()); - }, - myLocationEnabled: true, - // liteModeEnabled: true, - ), ), const PickerIconOnMap(), PickerAnimtionContainer(), diff --git a/lib/views/home/map_widget.dart/buttom_sheet_map_show.dart b/lib/views/home/map_widget.dart/buttom_sheet_map_show.dart index 92648f0..328d522 100644 --- a/lib/views/home/map_widget.dart/buttom_sheet_map_show.dart +++ b/lib/views/home/map_widget.dart/buttom_sheet_map_show.dart @@ -26,7 +26,8 @@ GetBuilder buttomSheetMapPage() { controller.data.isEmpty ? const SizedBox() : Container( - // height: 100, + // width: Get.width * .9, + height: 100, decoration: BoxDecoration( color: AppColor.secondaryColor, boxShadow: [ @@ -47,7 +48,7 @@ GetBuilder buttomSheetMapPage() { padding: const EdgeInsets.all(8.0), child: Image.asset( 'assets/images/jeep.png', - width: 88, + width: 50, fit: BoxFit.fill, repeat: ImageRepeat.repeatX, ), @@ -58,7 +59,9 @@ GetBuilder buttomSheetMapPage() { Text( '${'Your Ride Duration is '.tr}${controller.duration} minutes'), Text( - 'You will be thier in ${DateFormat('h:mm a').format(controller.newTime)}') + 'You will be thier in ${DateFormat('h:mm a').format(controller.newTime)}'), + Text( + 'You trip distance is ${controller.distance} KM') ], ), Text( diff --git a/lib/views/home/map_widget.dart/map_menu_widget.dart b/lib/views/home/map_widget.dart/map_menu_widget.dart index b448756..d0a1206 100644 --- a/lib/views/home/map_widget.dart/map_menu_widget.dart +++ b/lib/views/home/map_widget.dart/map_menu_widget.dart @@ -1,6 +1,5 @@ import 'package:flutter/material.dart'; import 'package:get/get.dart'; -import 'package:sqflite/sqflite.dart'; import '../../../constant/colors.dart'; import '../../../controller/home/map_page_controller.dart'; diff --git a/lib/views/home/profile/passenger_profile_page.dart b/lib/views/home/profile/passenger_profile_page.dart index 40f6410..d43d532 100644 --- a/lib/views/home/profile/passenger_profile_page.dart +++ b/lib/views/home/profile/passenger_profile_page.dart @@ -7,6 +7,13 @@ class PassengerProfilePage extends StatelessWidget { @override Widget build(BuildContext context) { return const MyScafolld( - title: 'My Profile', body: Center(child: Text('ddd'))); + isleading: true, + title: 'My Profile', + body: [ + Center( + child: Text('ddd'), + ), + ], + ); } } diff --git a/lib/views/lang/languages.dart b/lib/views/lang/languages.dart index a8a21c1..9276e5b 100644 --- a/lib/views/lang/languages.dart +++ b/lib/views/lang/languages.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:get/get.dart'; +import 'package:ride/main.dart'; import 'package:ride/views/widgets/elevated_btn.dart'; import '../../controller/local/local_controller.dart'; @@ -24,14 +25,16 @@ class Language extends GetView { title: 'Ar', onPressed: () { controller.changeLang("ar"); - Get.offAll(() => HomePage()); + main(); + // Get.offAll(() => HomePage()); }, ), MyElevatedButton( title: "En", onPressed: () { controller.changeLang("en"); - Get.offAll(() => HomePage()); + main(); + // Get.offAll(() => HomePage()); }, ), ], diff --git a/lib/views/notification/notification_page.dart b/lib/views/notification/notification_page.dart index 09bea8b..8dc3e35 100644 --- a/lib/views/notification/notification_page.dart +++ b/lib/views/notification/notification_page.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:get/get.dart'; import 'package:ride/constant/colors.dart'; import '../widgets/my_scafold.dart'; @@ -9,6 +10,7 @@ class NotificationPage extends StatelessWidget { @override Widget build(BuildContext context) { return MyScafolld( + isleading: true, title: 'Notifications', action: IconButton( onPressed: () {}, @@ -17,14 +19,21 @@ class NotificationPage extends StatelessWidget { color: AppColor.primaryColor, ), ), - body: Center( - child: TextButton( - onPressed: () {}, - child: Text( - "Text Button", - ), + body: [ + Container( + color: AppColor.accentColor.withOpacity(.7), ), - ), + Positioned( + top: 100, + bottom: 100, + left: 50, + right: 50, + child: Container( + height: Get.height * .6, + color: AppColor.secondaryColor, + ), + ) + ], ); } } diff --git a/lib/views/widgets/elevated_btn.dart b/lib/views/widgets/elevated_btn.dart index e1377b4..db14ef3 100644 --- a/lib/views/widgets/elevated_btn.dart +++ b/lib/views/widgets/elevated_btn.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:ride/constant/style.dart'; import '../../constant/colors.dart'; @@ -21,7 +22,7 @@ class MyElevatedButton extends StatelessWidget { onPressed: onPressed, child: Text( title, - style: const TextStyle(color: AppColor.accentColor), + style: AppStyle.title.copyWith(color: AppColor.secondaryColor), ), ); } diff --git a/lib/views/widgets/my_scafold.dart b/lib/views/widgets/my_scafold.dart index 3951770..cfd6d65 100644 --- a/lib/views/widgets/my_scafold.dart +++ b/lib/views/widgets/my_scafold.dart @@ -10,11 +10,13 @@ class MyScafolld extends StatelessWidget { required this.title, required this.body, this.action = const Icon(Icons.clear), + required this.isleading, }); final String title; - final Widget body; + final List body; final Widget action; + final bool isleading; @override Widget build(BuildContext context) { @@ -23,21 +25,23 @@ class MyScafolld extends StatelessWidget { appBar: AppBar( backgroundColor: AppColor.secondaryColor, elevation: 0, - leading: IconButton( - onPressed: () { - Get.back(); - }, - icon: const Icon( - Icons.arrow_back_ios_new, - color: AppColor.primaryColor, - ), - ), + leading: isleading + ? IconButton( + onPressed: () { + Get.back(); + }, + icon: const Icon( + Icons.arrow_back_ios_new, + color: AppColor.primaryColor, + ), + ) + : const SizedBox(), actions: [action], title: Text( title, style: AppStyle.title.copyWith(fontSize: 30), ), ), - body: SafeArea(child: Stack(children: [body]))); + body: SafeArea(child: Stack(children: body))); } } diff --git a/pubspec.lock b/pubspec.lock index 9eb847f..4fe3c8b 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -9,6 +9,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.3.4" + animated_text_kit: + dependency: "direct main" + description: + name: animated_text_kit + sha256: "37392a5376c9a1a503b02463c38bc0342ef814ddbb8f9977bc90f2a84b22fa92" + url: "https://pub.dev" + source: hosted + version: "4.2.2" archive: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 96eb025..de61050 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -52,6 +52,7 @@ dependencies: location: ^5.0.2+1 google_polyline_algorithm: ^3.1.0 custom_searchable_dropdown: ^2.1.1 + animated_text_kit: ^4.2.2 dev_dependencies: flutter_test: