From 8b46545fbc65f2c6cb16a307a67e6e1a9e488612 Mon Sep 17 00:00:00 2001 From: Hamza-Ayed Date: Sun, 13 Aug 2023 02:19:18 +0300 Subject: [PATCH] 8-12/ --- assets/images/car.png | Bin 0 -> 5648 bytes assets/images/notepad.png | Bin 0 -> 23624 bytes lib/constant/box_name.dart | 1 + lib/constant/links.dart | 17 +- lib/constant/style.dart | 10 +- lib/controller/auth/login_controller.dart | 45 +++- lib/controller/auth/register_controller.dart | 48 ++++ lib/controller/functions/crud.dart | 21 +- lib/controller/home/map_page_controller.dart | 48 +++- lib/main.dart | 3 +- lib/views/auth/login_page.dart | 231 +++++++++++++++--- lib/views/auth/register_page.dart | 194 +++++++++++++++ lib/views/home/home_page.dart | 12 +- lib/views/home/map_page.dart | 174 ++++++------- .../buttom_sheet_map_show.dart | 9 +- .../home/map_widget.dart/map_menu_widget.dart | 1 - .../home/profile/passenger_profile_page.dart | 9 +- lib/views/lang/languages.dart | 7 +- lib/views/notification/notification_page.dart | 23 +- lib/views/widgets/elevated_btn.dart | 3 +- lib/views/widgets/my_scafold.dart | 26 +- pubspec.lock | 8 + pubspec.yaml | 1 + 23 files changed, 715 insertions(+), 176 deletions(-) create mode 100644 assets/images/car.png create mode 100644 assets/images/notepad.png create mode 100644 lib/controller/auth/register_controller.dart create mode 100644 lib/views/auth/register_page.dart diff --git a/assets/images/car.png b/assets/images/car.png new file mode 100644 index 0000000000000000000000000000000000000000..fbc44e59a02924aebab9d0018d900878f8381f93 GIT binary patch literal 5648 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 literal 0 HcmV?d00001 diff --git a/assets/images/notepad.png b/assets/images/notepad.png new file mode 100644 index 0000000000000000000000000000000000000000..9536a4df646363bacb602d243fdc3bf525393649 GIT binary patch literal 23624 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 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: