From 65ade9c874d3acef9a773867656dab6f04139338 Mon Sep 17 00:00:00 2001 From: Hamza-Ayed Date: Tue, 15 Aug 2023 14:12:20 +0300 Subject: [PATCH] 8-15/1 --- android/app/src/main/AndroidManifest.xml | 3 + android/app/src/main/res/values/strings.xml | 4 + assets/images/education.png | Bin 0 -> 11572 bytes assets/images/employmentType.png | Bin 0 -> 22979 bytes assets/images/gender.png | Bin 0 -> 10288 bytes assets/images/maritalStatus.png | Bin 0 -> 7745 bytes lib/constant/box_name.dart | 1 + lib/constant/links.dart | 11 +- lib/controller/auth/login_controller.dart | 28 +- lib/controller/functions/crud.dart | 6 +- lib/controller/home/map_page_controller.dart | 42 ++- .../profile/profile_controller.dart | 93 ++++++ lib/main.dart | 9 +- lib/models/db_sql.dart | 57 ++++ lib/models/model/locations.dart | 28 ++ lib/views/auth/login_page.dart | 276 +++++++++--------- lib/views/home/map_page.dart | 26 +- .../picker_animation_container.dart | 1 - .../home/profile/passenger_profile_page.dart | 200 ++++++++++++- 19 files changed, 619 insertions(+), 166 deletions(-) create mode 100644 android/app/src/main/res/values/strings.xml create mode 100644 assets/images/education.png create mode 100644 assets/images/employmentType.png create mode 100644 assets/images/gender.png create mode 100644 assets/images/maritalStatus.png create mode 100644 lib/controller/profile/profile_controller.dart create mode 100644 lib/models/db_sql.dart create mode 100644 lib/models/model/locations.dart diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 7a9e91d..dfe4339 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -17,6 +17,9 @@ + + + diff --git a/android/app/src/main/res/values/strings.xml b/android/app/src/main/res/values/strings.xml new file mode 100644 index 0000000..77d0e4c --- /dev/null +++ b/android/app/src/main/res/values/strings.xml @@ -0,0 +1,4 @@ + + My App + ride_channel + \ No newline at end of file diff --git a/assets/images/education.png b/assets/images/education.png new file mode 100644 index 0000000000000000000000000000000000000000..fcadd1b7f42f0ab885d631245bf21d96ae71b7b9 GIT binary patch literal 11572 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 BSULaz literal 0 HcmV?d00001 diff --git a/assets/images/employmentType.png b/assets/images/employmentType.png new file mode 100644 index 0000000000000000000000000000000000000000..8fdcf14e0925d533abd002978dbcf2cb24ee47ff GIT binary patch literal 22979 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 U$N9?OyMJfpq?9E~#Ek>~13?HO?EnA( literal 0 HcmV?d00001 diff --git a/lib/constant/box_name.dart b/lib/constant/box_name.dart index 0da7d8e..e2b12fe 100644 --- a/lib/constant/box_name.dart +++ b/lib/constant/box_name.dart @@ -5,6 +5,7 @@ class BoxName { static const String agreeTerms = "agreeTerms"; static const String pasengerID = "pasengerID"; static const String phone = "phone"; + static const String name = "name"; static const String email = "email"; static const String tokens = "tokens"; static const String tokenFCM = "tokenFCM"; diff --git a/lib/constant/links.dart b/lib/constant/links.dart index e582bbf..92586f8 100644 --- a/lib/constant/links.dart +++ b/lib/constant/links.dart @@ -19,12 +19,11 @@ class AppLink { static const String updateCarsLocationByPassenger = "$location/update.php"; //==================Blog============= - static const String blog = - 'https://portfolio.mobile-app.store/hamzaayed/blogs'; - static const String getBlog = "$blog/get.php"; - static const String addBlog = "$blog/add.php"; - static const String deleteBlog = "$blog/delete.php"; - static const String updateBlog = "$blog/update.php"; + static const String profile = 'https://ride.mobile-app.store/ride/profile'; + static const String getprofile = "$profile/get.php"; + static const String addprofile = "$profile/add.php"; + static const String deleteprofile = "$profile/delete.php"; + static const String updateprofile = "$profile/update.php"; //===================Auth============ static const String auth = 'https://ride.mobile-app.store/auth'; diff --git a/lib/controller/auth/login_controller.dart b/lib/controller/auth/login_controller.dart index c23f44d..a8bbe82 100644 --- a/lib/controller/auth/login_controller.dart +++ b/lib/controller/auth/login_controller.dart @@ -51,18 +51,22 @@ class LoginController extends GetxController { // print(jsonDecoeded); if (jsonDecoeded.isNotEmpty) { if (jsonDecoeded['status'] == 'success') { - box.write(BoxName.pasengerID, jsonDecoeded['data'][0]['id']); - box.write(BoxName.email, jsonDecoeded['data'][0]['email']); - box.write(BoxName.phone, jsonDecoeded['data'][0]['phone']); - Get.offAll(() => MapPage()); - - isloading = false; - update(); - print(box.read(BoxName.pasengerID).toString()); - await CRUD().post(link: AppLink.addTokens, payload: { - 'token': box.read(BoxName.tokenFCM.toString()), - 'passengerID': box.read(BoxName.pasengerID).toString() - }).then((value) => print('cccc')); + if (jsonDecoeded['data'][0]['verified'] == '1') { + box.write(BoxName.pasengerID, jsonDecoeded['data'][0]['id']); + box.write(BoxName.email, jsonDecoeded['data'][0]['email']); + box.write(BoxName.phone, jsonDecoeded['data'][0]['phone']); + Get.offAll(() => MapPage()); + isloading = false; + update(); + print(box.read(BoxName.pasengerID).toString()); + await CRUD().post(link: AppLink.addTokens, payload: { + 'token': box.read(BoxName.tokenFCM.toString()), + 'passengerID': box.read(BoxName.pasengerID).toString() + }).then((value) => print('cccc')); + } else { + Get.snackbar('You must Verify email !.'.tr, '', + backgroundColor: Colors.yellow[300]); + } } else if (jsonDecoeded['status'] == 'Failure') { Get.snackbar(jsonDecoeded['status'], jsonDecoeded['data'], backgroundColor: Colors.redAccent); diff --git a/lib/controller/functions/crud.dart b/lib/controller/functions/crud.dart index a3442ef..280743d 100644 --- a/lib/controller/functions/crud.dart +++ b/lib/controller/functions/crud.dart @@ -21,14 +21,14 @@ class CRUD { 'Basic ${base64Encode(utf8.encode(AppCredintials.basicAuthCredentials))}', }, ); - // print("--------------" + response.body.toString()); + // print("--------------" + response.request.toString()); if (response.statusCode == 200) { var jsonData = jsonDecode(response.body); if (jsonData['status'] == 'success') { - print(jsonData['data']); + print(jsonData); return response.body; } - return response.body; + return jsonData['status']; } } diff --git a/lib/controller/home/map_page_controller.dart b/lib/controller/home/map_page_controller.dart index c0a5109..1de8611 100644 --- a/lib/controller/home/map_page_controller.dart +++ b/lib/controller/home/map_page_controller.dart @@ -1,5 +1,5 @@ import 'dart:convert'; - +import 'dart:math' show sqrt, pi, cos, sin; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:google_maps_flutter/google_maps_flutter.dart'; @@ -10,6 +10,8 @@ import 'package:ride/constant/links.dart'; import 'package:ride/controller/functions/crud.dart'; import 'package:ride/views/home/map_widget.dart/buttom_sheet_map_show.dart'; +import '../../models/model/locations.dart'; + class MapController extends GetxController { bool isloading = true; TextEditingController placeController = TextEditingController(); @@ -35,6 +37,9 @@ class MapController extends GetxController { bool isPickerShown = false; bool isButtomSheetShown = false; double heightButtomSheetShown = 240; + late final LatLng southwest; + late final LatLng northeast; + List carLocations = []; void changeButtomSheetShown() { isButtomSheetShown = !isButtomSheetShown; @@ -169,10 +174,22 @@ class MapController extends GetxController { } Future getCarsLocationByPassenger() async { + LatLngBounds bounds = + calculateBounds(mylocation.latitude, mylocation.longitude, 10); + print( + 'Southwest: ${bounds.southwest.latitude}, ${bounds.southwest.longitude}'); + print( + 'Northeast: ${bounds.northeast.latitude}, ${bounds.northeast.longitude}'); + var res = - await CRUD().get(link: AppLink.getCarsLocationByPassenger, payload: {}); + await CRUD().get(link: AppLink.getCarsLocationByPassenger, payload: { + 'southwestLat': southwest.latitude.toString(), + 'southwestLon': southwest.longitude.toString(), + 'northeastLat': northeast.latitude.toString(), + 'northeastLon': northeast.longitude.toString(), + }); var data = jsonDecode(res); - print(data); + // print(data); for (var i = 0; i < data.length; i++) { carsLocationByPassenger.add(LatLng( double.parse(data['message'][i]['latitude']), @@ -182,6 +199,23 @@ class MapController extends GetxController { update(); } + LatLngBounds calculateBounds( + double centerLat, double centerLng, double radius) { + double radius = 2000; // 10 km in meters + + southwest = LatLng( + centerLat - (radius / 111000), + centerLng - (radius / (111000 * cos(centerLat))), + ); + + northeast = LatLng( + centerLat + (radius / 111000), + centerLng + (radius / (111000 * cos(centerLat))), + ); + + return LatLngBounds(southwest: southwest, northeast: northeast); + } + GoogleMapController? mapController; void onMapCreated(GoogleMapController controller) { mapController = controller; @@ -395,7 +429,7 @@ class MapController extends GetxController { void onInit() async { // getPolyLine(); // getMap(); - getLocation(); + await getLocation(); await getCarsLocationByPassenger(); addCustomPicker(); addCustomCarIcon(); diff --git a/lib/controller/profile/profile_controller.dart b/lib/controller/profile/profile_controller.dart new file mode 100644 index 0000000..dad32ce --- /dev/null +++ b/lib/controller/profile/profile_controller.dart @@ -0,0 +1,93 @@ +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'; + +import '../../views/widgets/elevated_btn.dart'; + +class ProfileController extends GetxController { + bool isloading = false; + Map prfoileData = {}; + TextEditingController txtController = TextEditingController(); + List genders = ['Male', 'Female', 'Non-binary']; + + String gender = ''; + + void setGender(String value) { + gender = value; + } + + String? selectedDegree; + + void setDegree(String? degree) { + selectedDegree = degree; + update(); + } + + updateColumn(Map payload) async { + isloading = true; + update(); + await CRUD().post(link: AppLink.updateprofile, payload: payload); + await getProfile(); + isloading = false; + update(); + } + + updatField(String columnName) async { + Get.defaultDialog( + title: '${'Update'.tr} $columnName', + content: Column( + children: [ + SizedBox( + width: Get.width * .7, + child: TextField( + controller: txtController, + decoration: const InputDecoration( + border: OutlineInputBorder(), hintText: 'type here'), + ), + ), + MyElevatedButton( + title: 'Update'.tr, + onPressed: () { + updateColumn({ + 'id': prfoileData['id'].toString(), + columnName: txtController.text, + }); + Get.back(); + txtController.clear(); + }, + ) + ], + ), + ); + } + + getProfile() async { + isloading = true; + update(); + var res = await CRUD().get(link: AppLink.getprofile, payload: { + 'id': box.read(BoxName.pasengerID).toString(), + }); + + if (res.toString() == 'failure') { + Get.snackbar('failure', 'message'); + isloading = false; + update(); + } else { + var jsonDecoded = jsonDecode(res); + prfoileData = jsonDecoded['data']; + isloading = false; + update(); + } + } + + @override + void onInit() { + getProfile(); + super.onInit(); + } +} diff --git a/lib/main.dart b/lib/main.dart index 2fdc601..0e0e9cb 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -39,7 +39,8 @@ void main() async { FirebasMessagesController().getToken(); await FirebasMessagesController().getTokens(); FirebaseMessaging.onBackgroundMessage(backgroundMessageHandler); - + FirebasMessagesController().getNotificationSettings(); + FirebasMessagesController().requestPermission(); runApp(const MyApp()); } @@ -63,8 +64,8 @@ class MyApp extends StatelessWidget { home: box.read(BoxName.lang).toString() != 'ar' && box.read(BoxName.lang).toString() != 'en' ? const Language() - : box.read(BoxName.email).toString() != null - ? const MapPage() - : LoginPage()); + : box.read(BoxName.email) == null + ? LoginPage() + : const MapPage()); } } diff --git a/lib/models/db_sql.dart b/lib/models/db_sql.dart new file mode 100644 index 0000000..897048e --- /dev/null +++ b/lib/models/db_sql.dart @@ -0,0 +1,57 @@ +import 'package:sqflite/sqflite.dart'; +import 'package:path/path.dart'; + +class DbSql { + static final DbSql instance = DbSql._(); + + static Database? _database; + + DbSql._(); + + Future get database async { + if (_database != null) return _database!; + _database = await _initDatabase(); + return _database!; + } + + Future _initDatabase() async { + String path = join(await getDatabasesPath(), 'my_database.db'); + return await openDatabase( + path, + version: 1, + onCreate: (db, version) async { + await db.execute(''' + CREATE TABLE IF NOT EXISTS car_locations( + id INTEGER PRIMARY KEY AUTOINCREMENT, + driver_id INTEGER, + latitude REAL, + longitude REAL, + created_at TEXT, + updated_at TEXT + ) + '''); + }, + ); + } + + Future>> getAllData(String table) async { + Database db = await instance.database; + return await db.query(table); + } + + Future insertData(Map map, String table) async { + Database db = await instance.database; + return await db.insert(table, map); + } + + Future updateData(Map map, String table, int id) async { + Database db = await instance.database; + + return await db.update(table, map, where: 'id = ?', whereArgs: [id]); + } + + Future deleteData(String table, int id) async { + Database db = await instance.database; + return await db.delete(table, where: 'id = ?', whereArgs: [id]); + } +} diff --git a/lib/models/model/locations.dart b/lib/models/model/locations.dart new file mode 100644 index 0000000..b88264d --- /dev/null +++ b/lib/models/model/locations.dart @@ -0,0 +1,28 @@ +class CarLocationModel { + int id; + int driverId; + double latitude; + double longitude; + DateTime createdAt; + DateTime updatedAt; + + CarLocationModel({ + required this.id, + required this.driverId, + required this.latitude, + required this.longitude, + required this.createdAt, + required this.updatedAt, + }); + + factory CarLocationModel.fromJson(Map json) { + return CarLocationModel( + id: json['id'], + driverId: json['driver_id'], + latitude: json['latitude'], + longitude: json['longitude'], + createdAt: DateTime.parse(json['created_at']), + updatedAt: DateTime.parse(json['updated_at']), + ); + } +} diff --git a/lib/views/auth/login_page.dart b/lib/views/auth/login_page.dart index 076e08c..f379148 100644 --- a/lib/views/auth/login_page.dart +++ b/lib/views/auth/login_page.dart @@ -20,142 +20,156 @@ class LoginPage extends StatelessWidget { @override Widget build(BuildContext context) { Get.put(LoginController()); - return MyScafolld(title: 'Login', isleading: false, body: [ - if (box.read(BoxName.agreeTerms) != 'agreed') - agreedpage() - else - SingleChildScrollView( - child: Column( - children: [ - 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; - }, - ), - GetBuilder( - builder: (controller) => controller.isloading - ? const MyCircularProgressIndicator() - : MyElevatedButton( - onPressed: () { - if (controller.formKey.currentState! - .validate()) { - controller.login(); + return GetBuilder( + builder: (controller) => + MyScafolld(title: 'Login', isleading: false, body: [ + if (box.read(BoxName.agreeTerms) != 'agreed') + agreedpage() + else + SingleChildScrollView( + child: Column( + children: [ + 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; }, - title: 'Submit', ), - ) - ], - ), - ), + 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; + }, + ), + GetBuilder( + builder: (controller) => controller + .isloading + ? const MyCircularProgressIndicator() + : MyElevatedButton( + onPressed: () { + if (controller + .formKey.currentState! + .validate()) { + controller.login(); + } + }, + title: 'Submit', + ), + ) + ], + ), + ), + ), + ), + )), + Text( + 'if you dont have account'.tr, + style: AppStyle.subtitle, ), - ), - )), - Text( - 'if you dont have account'.tr, - style: AppStyle.subtitle, - ), - AnimatedTextKit( - onTap: () => Get.to(() => const RegisterPage()), - animatedTexts: [ - TypewriterAnimatedText( - 'Register', - textStyle: AppStyle.headtitle2, - speed: const Duration(milliseconds: 200), + AnimatedTextKit( + onTap: () => Get.to(() => const RegisterPage()), + animatedTexts: [ + TypewriterAnimatedText( + 'Register', + textStyle: AppStyle.headtitle2, + speed: const Duration(milliseconds: 200), + ), + ], + totalRepeatCount: 4, + pause: const Duration(milliseconds: 200), + displayFullTextOnTap: true, + stopPauseOnTap: true, + ) + ], ), - ], - totalRepeatCount: 4, - pause: const Duration(milliseconds: 200), - displayFullTextOnTap: true, - stopPauseOnTap: true, - ) - ], - ), - ) - ]); + ) + ])); } Padding agreedpage() { diff --git a/lib/views/home/map_page.dart b/lib/views/home/map_page.dart index f07eb80..572eb46 100644 --- a/lib/views/home/map_page.dart +++ b/lib/views/home/map_page.dart @@ -50,6 +50,7 @@ class MapPage extends StatelessWidget { }, ); }, + onTap: (argument) { controller.hidePlaces(); @@ -99,11 +100,34 @@ class MapPage extends StatelessWidget { color: AppColor.primaryColor, width: 5, ), + // Polyline( + // zIndex: 2, + // consumeTapEvents: true, + // geodesic: true, + // endCap: Cap.buttCap, + // startCap: Cap.buttCap, + // visible: true, + // polylineId: PolylineId('g'), + // points: [ + // LatLng(controller.southwest.latitude, + // controller.southwest.longitude), + // LatLng(controller.northeast.latitude, + // controller.northeast.longitude) + // ], + // color: AppColor.primaryColor, + // width: 5, + // ), }, + // circles: { + // Circle( + // circleId: const CircleId('kk'), + // center: controller.mylocation, + // radius: 2000) + // }, mapType: MapType.normal, myLocationButtonEnabled: true, indoorViewEnabled: true, - trafficEnabled: true, + trafficEnabled: false, buildingsEnabled: true, mapToolbarEnabled: true, onCameraMove: (position) { diff --git a/lib/views/home/map_widget.dart/picker_animation_container.dart b/lib/views/home/map_widget.dart/picker_animation_container.dart index 67c20be..f45171c 100644 --- a/lib/views/home/map_widget.dart/picker_animation_container.dart +++ b/lib/views/home/map_widget.dart/picker_animation_container.dart @@ -5,7 +5,6 @@ import '../../../constant/colors.dart'; import '../../../constant/style.dart'; import '../../../controller/home/map_page_controller.dart'; import '../../widgets/elevated_btn.dart'; -import 'buttom_sheet_map_show.dart'; import 'form_search_places.dart'; class PickerAnimtionContainer extends StatelessWidget { diff --git a/lib/views/home/profile/passenger_profile_page.dart b/lib/views/home/profile/passenger_profile_page.dart index d43d532..240a218 100644 --- a/lib/views/home/profile/passenger_profile_page.dart +++ b/lib/views/home/profile/passenger_profile_page.dart @@ -1,19 +1,211 @@ +import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:ride/constant/colors.dart'; +import 'package:ride/constant/style.dart'; +import 'package:ride/controller/profile/profile_controller.dart'; +import 'package:ride/views/widgets/elevated_btn.dart'; import 'package:ride/views/widgets/my_scafold.dart'; +import 'package:ride/views/widgets/mycircular.dart'; class PassengerProfilePage extends StatelessWidget { const PassengerProfilePage({super.key}); @override Widget build(BuildContext context) { - return const MyScafolld( + Get.put(ProfileController()); + return MyScafolld( isleading: true, title: 'My Profile', body: [ - Center( - child: Text('ddd'), - ), + GetBuilder( + builder: (controller) => controller.isloading + ? const MyCircularProgressIndicator() + : Padding( + padding: const EdgeInsets.symmetric(horizontal: 15), + child: SingleChildScrollView( + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + 'Edit Profile'.tr, + style: AppStyle.headtitle2, + ), + ListTile( + title: Text( + 'Name'.tr, + style: AppStyle.title, + ), + leading: const Icon( + Icons.person_pin_rounded, + size: 35, + ), + trailing: const Icon(Icons.arrow_forward_ios), + subtitle: Text( + '${controller.prfoileData['first_name']} ${controller.prfoileData['last_name']}'), + onTap: () { + controller.updatField('first_name'); + }, + ), + ListTile( + title: Text( + 'Gender'.tr, + style: AppStyle.title, + ), + leading: Image.asset( + 'assets/images/gender.png', + width: 35, + ), + trailing: const Icon(Icons.arrow_forward_ios), + subtitle: Text( + controller.prfoileData['gender'].toString()), + onTap: () { + Get.defaultDialog( + title: 'Update Gender'.tr, + content: Column( + children: [ + GenderPicker(), + MyElevatedButton( + title: 'Update'.tr, + onPressed: () { + controller.updateColumn({ + 'id': controller.prfoileData['id'] + .toString(), + 'gender': controller.gender, + }); + Get.back(); + }, + ) + ], + )); + // controller.updatField('gender'); + }, + ), + ListTile( + title: Text( + 'Education'.tr, + style: AppStyle.title, + ), + leading: Image.asset( + 'assets/images/education.png', + width: 35, + ), + trailing: const Icon(Icons.arrow_forward_ios), + subtitle: Text( + controller.prfoileData['education'].toString()), + onTap: () { + Get.defaultDialog( + title: 'Update Education'.tr, + content: Column( + children: [ + EducationDegreePicker(), + MyElevatedButton( + title: 'Update Education'.tr, + onPressed: () { + controller.updateColumn({ + 'id': controller.prfoileData['id'] + .toString(), + 'education': + controller.selectedDegree, + }); + Get.back(); + }, + ) + ], + )); + }, + ), + ListTile( + title: Text( + 'Employment Type'.tr, + style: AppStyle.title, + ), + leading: Image.asset( + 'assets/images/employmentType.png', + width: 35, + ), + trailing: const Icon(Icons.arrow_forward_ios), + subtitle: Text(controller + .prfoileData['employmentType'] + .toString()), + onTap: () { + controller.updatField('employmentType'); + }, + ), + ListTile( + title: Text( + 'Marital Status'.tr, + style: AppStyle.title, + ), + leading: Image.asset( + 'assets/images/maritalStatus.png', + width: 35, + ), + trailing: const Icon(Icons.arrow_forward_ios), + subtitle: Text(controller + .prfoileData['maritalStatus'] + .toString()), + onTap: () { + controller.updatField('maritalStatus'); + }, + ), + ], + ), + ), + )) ], ); } } + +class GenderPicker extends StatelessWidget { + final ProfileController controller = Get.put(ProfileController()); + + final List genderOptions = ['Male', 'Female', 'Other']; + + GenderPicker({super.key}); + + @override + Widget build(BuildContext context) { + return CupertinoPicker( + itemExtent: 32.0, + onSelectedItemChanged: (int index) { + controller.setGender(genderOptions[index]); + }, + children: genderOptions.map((String value) { + return Text(value); + }).toList(), + ); + } +} + +class EducationDegreePicker extends StatelessWidget { + final ProfileController controller = Get.put(ProfileController()); + + final List degreeOptions = [ + 'High School Diploma', + 'Associate Degree', + 'Bachelor\'s Degree', + 'Master\'s Degree', + 'Doctoral Degree', + ]; + + EducationDegreePicker({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return CupertinoPicker( + // backgroundColor: AppColor.accentColor, + looping: true, + squeeze: 2, diameterRatio: 2, + itemExtent: 32.0, + onSelectedItemChanged: (int index) { + controller.setDegree(degreeOptions[index]); + }, + children: degreeOptions.map((String value) { + return Text(value); + }).toList(), + ); + } +}