From e8ce22501001f089ecf4f69c222b39c75be07a63 Mon Sep 17 00:00:00 2001 From: orangdeso Date: Mon, 12 May 2025 17:47:54 +0700 Subject: [PATCH] Feat: complete logic get data for features information users and slicing UI for change password screen --- .dart_tool/package_config.json | 2 +- .idea/libraries/Dart_Packages.xml | 550 +++++++++++++++++- .idea/libraries/Flutter_Plugins.xml | 33 +- .../text_input/text_field_component.dart | 2 +- .../repositories/profil_repository_impl.dart | 38 +- lib/domain/bindings/profil_binding.dart | 15 +- .../repositories/profil_repository.dart | 1 + lib/domain/usecases/profil_usecase.dart | 11 +- .../controllers/profil_controller.dart | 41 +- .../screens/auth/component/Input_form.dart | 10 +- .../auth/component/Input_password.dart | 33 +- .../profile/component/header_information.dart | 37 ++ .../profile/pages/change_password_screen.dart | 106 ++++ .../pages/information_users_screen.dart | 85 ++- .../screens/profile/pages/profile_screen.dart | 4 +- .../screens/routes/app_rountes.dart | 25 +- 16 files changed, 850 insertions(+), 143 deletions(-) create mode 100644 lib/presentation/screens/profile/component/header_information.dart create mode 100644 lib/presentation/screens/profile/pages/change_password_screen.dart diff --git a/.dart_tool/package_config.json b/.dart_tool/package_config.json index ec4594a..2cff169 100644 --- a/.dart_tool/package_config.json +++ b/.dart_tool/package_config.json @@ -680,7 +680,7 @@ "languageVersion": "3.4" } ], - "generated": "2025-05-10T18:42:15.590215Z", + "generated": "2025-05-12T05:36:15.239350Z", "generator": "pub", "generatorVersion": "3.5.0", "flutterRoot": "file:///D:/Flutter/flutter_sdk/flutter_3.24.0", diff --git a/.idea/libraries/Dart_Packages.xml b/.idea/libraries/Dart_Packages.xml index 4b10246..7f439b8 100644 --- a/.idea/libraries/Dart_Packages.xml +++ b/.idea/libraries/Dart_Packages.xml @@ -2,10 +2,24 @@ - + + + + + + + + + + + + - - + + + + - + + + + + + + - + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + + + - + + + + + + + + + + + + + + - + + + + diff --git a/.idea/libraries/Flutter_Plugins.xml b/.idea/libraries/Flutter_Plugins.xml index a30f63f..8b4570c 100644 --- a/.idea/libraries/Flutter_Plugins.xml +++ b/.idea/libraries/Flutter_Plugins.xml @@ -1,20 +1,33 @@ - + - - - - - + + - + + - - - + + + + + + + + + + + + + + + + + + diff --git a/lib/_core/component/text_field/text_input/text_field_component.dart b/lib/_core/component/text_field/text_input/text_field_component.dart index d2557fc..83254e0 100644 --- a/lib/_core/component/text_field/text_input/text_field_component.dart +++ b/lib/_core/component/text_field/text_input/text_field_component.dart @@ -47,7 +47,7 @@ class TextFieldComponent extends StatelessWidget { ), focusedBorder: OutlineInputBorder( borderRadius: BorderRadius.circular(10.r), - borderSide: BorderSide(width: 1.5.w, color: PrimaryColors.primary800), + borderSide: BorderSide(width: 2.w, color: PrimaryColors.primary800), ), contentPadding: EdgeInsets.symmetric(vertical: 16.h), ), diff --git a/lib/data/repositories/profil_repository_impl.dart b/lib/data/repositories/profil_repository_impl.dart index 6d5b769..85cccca 100644 --- a/lib/data/repositories/profil_repository_impl.dart +++ b/lib/data/repositories/profil_repository_impl.dart @@ -4,20 +4,17 @@ import '../../_core/service/logger_service.dart'; import '../../domain/models/user_entity.dart'; class ProfilRepositoryImpl implements ProfilRepository { - final FirebaseFirestore _firestore = FirebaseFirestore.instance; + final FirebaseFirestore _firestore = FirebaseFirestore.instance; @override Future createPassenger({ required String userId, required PassengerModel passenger, }) async { - try { - DocumentReference docRef = await _firestore - .collection('users') - .doc(userId) - .collection('passenger') - .add(passenger.toMap()); - logger.d("Passenger doc id: ${docRef.id}"); + try { + DocumentReference docRef = + await _firestore.collection('users').doc(userId).collection('passenger').add(passenger.toMap()); + logger.d("Passenger doc id: ${docRef.id}"); } catch (e) { rethrow; } @@ -26,16 +23,23 @@ class ProfilRepositoryImpl implements ProfilRepository { @override Future> getPassengerById(String userId) async { try { - QuerySnapshot querySnapshot = await _firestore - .collection('users') - .doc(userId) - .collection('passenger') - .get(); - return querySnapshot.docs - .map((doc) => PassengerModel.fromMap(doc.data() as Map)) - .toList(); + QuerySnapshot querySnapshot = await _firestore.collection('users').doc(userId).collection('passenger').get(); + return querySnapshot.docs.map((doc) => PassengerModel.fromMap(doc.data() as Map)).toList(); } catch (e) { rethrow; } } -} \ No newline at end of file + + @override + Future getUserById(String userId) async { + try { + final doc = await _firestore.collection('users').doc(userId).get(); + if (!doc.exists) { + throw Exception("User with id $userId not found"); + } + return UserData.fromMap(doc.data()!); + } catch (e) { + rethrow; + } + } +} diff --git a/lib/domain/bindings/profil_binding.dart b/lib/domain/bindings/profil_binding.dart index 96ccad8..8f961e8 100644 --- a/lib/domain/bindings/profil_binding.dart +++ b/lib/domain/bindings/profil_binding.dart @@ -8,17 +8,18 @@ import '../usecases/profil_usecase.dart'; class ProfilBinding extends Bindings { @override void dependencies() { - // Injeksi repository Get.lazyPut(() => ProfilRepositoryImpl()); - // Injeksi use case, menggunakan repository yang telah di-inject Get.lazyPut(() => CreatePassengerUseCase(Get.find())); Get.lazyPut(() => GetPassengerByIdUseCase(Get.find())); + Get.lazyPut(() => GetUserByIdUseCase(Get.find())); - // Injeksi controller, menggunakan use case yang sudah tersedia - Get.lazyPut(() => ProfilController( - createPassengerUseCase: Get.find(), - getPassengerByIdUseCase: Get.find(), - )); + Get.lazyPut( + () => ProfilController( + createPassengerUseCase: Get.find(), + getPassengerByIdUseCase: Get.find(), + getUserByIdUseCase: Get.find(), + ), + ); } } diff --git a/lib/domain/repositories/profil_repository.dart b/lib/domain/repositories/profil_repository.dart index 6863c17..017e54f 100644 --- a/lib/domain/repositories/profil_repository.dart +++ b/lib/domain/repositories/profil_repository.dart @@ -7,4 +7,5 @@ abstract class ProfilRepository { }); Future> getPassengerById(String userId); + Future getUserById(String userId); } diff --git a/lib/domain/usecases/profil_usecase.dart b/lib/domain/usecases/profil_usecase.dart index 365ebb9..03448ed 100644 --- a/lib/domain/usecases/profil_usecase.dart +++ b/lib/domain/usecases/profil_usecase.dart @@ -19,10 +19,17 @@ class CreatePassengerUseCase { class GetPassengerByIdUseCase { final ProfilRepository profilRepository; - + GetPassengerByIdUseCase(this.profilRepository); - + Future> call(String userId) async { return await profilRepository.getPassengerById(userId); } } + +class GetUserByIdUseCase { + final ProfilRepository profilRepository; + GetUserByIdUseCase(this.profilRepository); + + Future call(String userId) => profilRepository.getUserById(userId); +} diff --git a/lib/presentation/controllers/profil_controller.dart b/lib/presentation/controllers/profil_controller.dart index 3d7ac71..8553797 100644 --- a/lib/presentation/controllers/profil_controller.dart +++ b/lib/presentation/controllers/profil_controller.dart @@ -1,4 +1,8 @@ +import 'dart:developer'; + import 'package:e_porter/_core/service/logger_service.dart'; +import 'package:e_porter/_core/service/preferences_service.dart'; +import 'package:firebase_auth/firebase_auth.dart'; import 'package:get/get.dart'; import '../../domain/models/user_entity.dart'; @@ -7,10 +11,45 @@ import '../../domain/usecases/profil_usecase.dart'; class ProfilController extends GetxController { final CreatePassengerUseCase createPassengerUseCase; final GetPassengerByIdUseCase getPassengerByIdUseCase; + final GetUserByIdUseCase getUserByIdUseCase; var passengerList = [].obs; + var userData = Rxn(); + var isLoading = false.obs; - ProfilController({required this.createPassengerUseCase, required this.getPassengerByIdUseCase}); + ProfilController({ + required this.createPassengerUseCase, + required this.getPassengerByIdUseCase, + required this.getUserByIdUseCase, + }); + + @override + void onInit() { + super.onInit(); + _loadProfile(); + } + + Future _loadProfile() async { + isLoading.value = true; + try { + final cached = await PreferencesService.getUserData(); + String? uid = cached?.uid; + uid ??= FirebaseAuth.instance.currentUser?.uid; + + if (uid == null) { + log("Tidak ditemukan user yang sedang login"); + return; + } + + final fresh = await getUserByIdUseCase(uid); + userData.value = fresh; + await PreferencesService.saveUserData(fresh); + } catch (e) { + log("Error fetching profile: $e"); + } finally { + isLoading.value = false; + } + } Future addPassenger({ required String userId, diff --git a/lib/presentation/screens/auth/component/Input_form.dart b/lib/presentation/screens/auth/component/Input_form.dart index 291cfe7..2417fab 100644 --- a/lib/presentation/screens/auth/component/Input_form.dart +++ b/lib/presentation/screens/auth/component/Input_form.dart @@ -40,10 +40,8 @@ class _InputFormState extends State { controller: widget.controller, validator: widget.validator, keyboardType: widget.textInputType, - inputFormatters: widget.inputFormatters ?? - [ - FilteringTextInputFormatter.singleLineFormatter - ], + inputFormatters: + widget.inputFormatters ?? [FilteringTextInputFormatter.singleLineFormatter], decoration: InputDecoration( hintText: widget.hintText, hintStyle: TextStyle( @@ -69,8 +67,8 @@ class _InputFormState extends State { focusedBorder: OutlineInputBorder( borderRadius: BorderRadius.circular(10.r), borderSide: BorderSide( - width: 1.w, - color: GrayColors.gray200, + width: 2.w, + color: PrimaryColors.primary800, ), ), border: OutlineInputBorder( diff --git a/lib/presentation/screens/auth/component/Input_password.dart b/lib/presentation/screens/auth/component/Input_password.dart index 0559342..db534a4 100644 --- a/lib/presentation/screens/auth/component/Input_password.dart +++ b/lib/presentation/screens/auth/component/Input_password.dart @@ -55,24 +55,14 @@ class _InputPasswordState extends State { letterSpacing: 1.w, ), prefixIcon: Padding( - padding: EdgeInsets.symmetric( - vertical: 14.h, - horizontal: 13.w, - ), - child: SvgPicture.asset( - widget.svgIconPath, - color: GrayColors.gray500, - ), + padding: EdgeInsets.symmetric(vertical: 14.h, horizontal: 13.w), + child: SvgPicture.asset(widget.svgIconPath, color: GrayColors.gray500), ), suffixIcon: Padding( - padding: EdgeInsets.symmetric( - horizontal: 16.w, - ), + padding: EdgeInsets.symmetric(horizontal: 16.w), child: IconButton( icon: Icon( - _isObscure - ? Icons.visibility_off_outlined - : Icons.visibility_outlined, + _isObscure ? Icons.visibility_off_outlined : Icons.visibility_outlined, color: GrayColors.gray500, ), onPressed: () { @@ -84,24 +74,15 @@ class _InputPasswordState extends State { ), enabledBorder: OutlineInputBorder( borderRadius: BorderRadius.circular(10.r), - borderSide: BorderSide( - width: 1.w, - color: GrayColors.gray200, - ), + borderSide: BorderSide(width: 1.w, color: GrayColors.gray200), ), focusedBorder: OutlineInputBorder( borderRadius: BorderRadius.circular(10.r), - borderSide: BorderSide( - width: 1.w, - color: GrayColors.gray200, - ), + borderSide: BorderSide(width: 2.w, color: PrimaryColors.primary800), ), border: OutlineInputBorder( borderRadius: BorderRadius.circular(10.r), - borderSide: BorderSide( - width: 1.w, - color: GrayColors.gray200, - ), + borderSide: BorderSide(width: 1.w, color: GrayColors.gray200), ), ), ), diff --git a/lib/presentation/screens/profile/component/header_information.dart b/lib/presentation/screens/profile/component/header_information.dart new file mode 100644 index 0000000..8a79d9e --- /dev/null +++ b/lib/presentation/screens/profile/component/header_information.dart @@ -0,0 +1,37 @@ +import 'package:e_porter/_core/constants/colors.dart'; +import 'package:e_porter/_core/constants/typography.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; + +class HeaderInformation extends StatelessWidget { + final String title; + + const HeaderInformation({ + Key? key, + required this.title, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + return Row( + children: [ + Icon( + Icons.info_outline_rounded, + color: GrayColors.gray500, + size: 24.sp, + ), + Expanded( + child: Padding( + padding: EdgeInsets.only(left: 16.w), + child: TypographyStyles.caption( + title, + color: GrayColors.gray500, + maxlines: 5, + fontWeight: FontWeight.w400, + ), + ), + ) + ], + ); + } +} diff --git a/lib/presentation/screens/profile/pages/change_password_screen.dart b/lib/presentation/screens/profile/pages/change_password_screen.dart new file mode 100644 index 0000000..0f1ac09 --- /dev/null +++ b/lib/presentation/screens/profile/pages/change_password_screen.dart @@ -0,0 +1,106 @@ +import 'package:e_porter/_core/component/appbar/appbar_component.dart'; +import 'package:e_porter/_core/component/button/button_fill.dart'; +import 'package:e_porter/_core/component/card/custome_shadow_cotainner.dart'; +import 'package:e_porter/_core/constants/colors.dart'; +import 'package:e_porter/_core/constants/typography.dart'; +import 'package:e_porter/_core/validators/validators.dart'; +import 'package:e_porter/presentation/screens/auth/component/Input_password.dart'; +import 'package:e_porter/presentation/screens/profile/component/header_information.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:get/get.dart'; + +class ChangePasswordScreen extends StatefulWidget { + const ChangePasswordScreen({super.key}); + + @override + State createState() => _ChangePasswordScreenState(); +} + +class _ChangePasswordScreenState extends State { + final _formKey = GlobalKey(); + final _oldPassword = TextEditingController(); + final _newPassword = TextEditingController(); + final _confirmPassword = TextEditingController(); + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: GrayColors.gray50, + appBar: DefaultAppbarComponent( + title: 'Ganti Kata Sandi', + textColor: Colors.white, + backgroundColors: PrimaryColors.primary800, + onTab: () { + Get.back(); + }, + ), + body: SafeArea( + child: Padding( + padding: EdgeInsets.symmetric(horizontal: 16.w, vertical: 20.h), + child: SingleChildScrollView( + child: Form( + key: _formKey, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + HeaderInformation( + title: + 'Apakah anda yakin ingin mengganti kata sandi? Silahkan masukkan kata sandi lama anda dan kata sandi baru anda', + ), + SizedBox(height: 32.h), + textTitle(title: 'Password Lama'), + SizedBox(height: 16.h), + InputPassword( + controller: _oldPassword, + hintText: '••••••••••', + svgIconPath: 'assets/icons/ic_padlock.svg', + validator: Validators.validatorPassword, + ), + SizedBox(height: 20.h), + textTitle(title: 'Password Baru'), + SizedBox(height: 16.h), + InputPassword( + controller: _newPassword, + hintText: '••••••••••', + svgIconPath: 'assets/icons/ic_padlock.svg', + validator: Validators.validatorPassword, + ), + SizedBox(height: 20.h), + textTitle(title: 'Konfirmasi Password'), + SizedBox(height: 16.h), + InputPassword( + controller: _confirmPassword, + hintText: '••••••••••', + svgIconPath: 'assets/icons/ic_padlock.svg', + validator: Validators.validatorPassword, + ), + ], + ), + ), + ), + ), + ), + bottomNavigationBar: CustomeShadowCotainner( + child: ButtonFill( + text: 'Simpan', + textColor: Colors.white, + onTap: () { + if (_formKey.currentState!.validate()) {} + }, + ), + ), + ); + } + + Widget textTitle({required String title}) { + return Padding( + padding: EdgeInsets.symmetric(horizontal: 8.w), + child: TypographyStyles.body( + title, + color: GrayColors.gray800, + fontWeight: FontWeight.w500, + ), + ); + } +} diff --git a/lib/presentation/screens/profile/pages/information_users_screen.dart b/lib/presentation/screens/profile/pages/information_users_screen.dart index 8cd9e4e..a5b14c1 100644 --- a/lib/presentation/screens/profile/pages/information_users_screen.dart +++ b/lib/presentation/screens/profile/pages/information_users_screen.dart @@ -3,6 +3,9 @@ import 'package:e_porter/_core/component/button/button_outline.dart'; import 'package:e_porter/_core/component/card/custome_shadow_cotainner.dart'; import 'package:e_porter/_core/constants/colors.dart'; import 'package:e_porter/_core/constants/typography.dart'; +import 'package:e_porter/domain/models/user_entity.dart'; +import 'package:e_porter/presentation/controllers/profil_controller.dart'; +import 'package:e_porter/presentation/screens/profile/component/header_information.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; @@ -15,6 +18,8 @@ class InformationUsersScreen extends StatefulWidget { } class _InformationUsersScreenState extends State { + final ProfilController _profilController = Get.find(); + @override Widget build(BuildContext context) { return Scaffold( @@ -27,22 +32,30 @@ class _InformationUsersScreenState extends State { Get.back(); }, ), - body: SafeArea( - child: Padding( - padding: EdgeInsets.symmetric(horizontal: 16.w, vertical: 20.h), - child: SingleChildScrollView( - child: Form( - child: Column( - children: [ - _buildHeaderInformation(), - _buildCardMain(), - _buildCardSecondary(), - ], + body: Obx(() { + final fetchData = _profilController.userData.value; + if (fetchData == null) { + return Center(child: CircularProgressIndicator(color: PrimaryColors.primary800)); + } + return SafeArea( + child: Padding( + padding: EdgeInsets.symmetric(horizontal: 16.w, vertical: 20.h), + child: SingleChildScrollView( + child: Form( + child: Column( + children: [ + HeaderInformation( + title: + 'Semua informasi mengenai data diri Anda, akan ditampilkan di halaman ini. Lengkapi data diri anda untuk menikmati semua layanan E-Porter'), + _buildCardMain(fetchData), + _buildCardSecondary(fetchData), + ], + ), ), ), ), - ), - ), + ); + }), bottomNavigationBar: CustomeShadowCotainner( child: ButtonOutline( text: 'Hapus Akun', @@ -54,68 +67,46 @@ class _InformationUsersScreenState extends State { ); } - Widget _buildHeaderInformation() { - return Row( - children: [ - Icon( - Icons.info_outline_rounded, - color: GrayColors.gray500, - size: 24.sp, - ), - Expanded( - child: Padding( - padding: EdgeInsets.only(left: 16.w), - child: TypographyStyles.caption( - 'Semua informasi mengenai data diri Anda, akan ditampilkan di halaman ini. Lengkapi data diri anda untuk menikmati semua layanan E-Porter', - color: GrayColors.gray500, - maxlines: 5, - fontWeight: FontWeight.w400, - ), - ), - ) - ], - ); - } - - Widget _buildCardMain() { + Widget _buildCardMain(UserData userData) { return Padding( padding: EdgeInsets.only(top: 32.h), child: CustomeShadowCotainner( child: Column( children: [ - itemWithButton(label: 'Nomor Telepon', value: 'value'), + itemWithButton(label: 'Nomor Telepon', value: userData.phone ?? '-'), SizedBox(height: 24.h), - itemWithButton(label: 'Email', value: 'ahmadzaqi98mmmmmm@gmail.com'), + itemWithButton(label: 'Email', value: userData.email ?? '-'), SizedBox(height: 24.h), - itemDoubleWithButton(label1: 'Tipe ID', value2: 'value', label2: 'No ID', value1: 'value'), + itemDoubleWithButton( + label1: 'Tipe ID', value1: userData.tipeId ?? '-', label2: 'No ID', value2: userData.noId ?? '-'), ], ), ), ); } - Widget _buildCardSecondary() { + Widget _buildCardSecondary(UserData userData) { return Padding( padding: EdgeInsets.only(top: 20.h), child: CustomeShadowCotainner( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - itemWithButton(label: 'Nama Lengkap', value: 'Ahmad Zaqi', isDivider: false), + itemWithButton(label: 'Nama Lengkap', value: userData.name ?? '-', isDivider: false), SizedBox(height: 24.h), Row( children: [ - infoDoubleItem(label: 'Jenis Kelamin', value: 'value'), + infoDoubleItem(label: 'Jenis Kelamin', value: userData.gender ?? '-'), SizedBox(width: 20.w), - infoDoubleItem(label: 'Tanggal Lahir', value: 'value'), + infoDoubleItem(label: 'Tanggal Lahir', value: userData.birthDate ?? '-'), ], ), SizedBox(height: 24.h), - infoDoubleItem(label: 'Alamat', value: 'value'), + infoDoubleItem(label: 'Alamat', value: userData.address ?? '-'), SizedBox(height: 24.h), - infoDoubleItem(label: 'Kota / Kabupaten', value: 'value'), + infoDoubleItem(label: 'Kota / Kabupaten', value: userData.city ?? '-'), SizedBox(height: 24.h), - infoDoubleItem(label: 'Pekerjaan', value: 'value') + infoDoubleItem(label: 'Pekerjaan', value: userData.work ?? '-'), ], ), ), diff --git a/lib/presentation/screens/profile/pages/profile_screen.dart b/lib/presentation/screens/profile/pages/profile_screen.dart index e525d50..8d3e729 100644 --- a/lib/presentation/screens/profile/pages/profile_screen.dart +++ b/lib/presentation/screens/profile/pages/profile_screen.dart @@ -96,7 +96,9 @@ class _ProfileScreenState extends State { ProfileMenu( label: 'Ganti Kata Sandi', svgIcon: 'assets/icons/ic_lock.svg', - onTap: () {}, + onTap: () { + Get.toNamed(Routes.CHANGEPASSWORD); + }, ), Padding( padding: EdgeInsets.symmetric(vertical: 20.h), diff --git a/lib/presentation/screens/routes/app_rountes.dart b/lib/presentation/screens/routes/app_rountes.dart index c384df7..4622177 100644 --- a/lib/presentation/screens/routes/app_rountes.dart +++ b/lib/presentation/screens/routes/app_rountes.dart @@ -34,6 +34,7 @@ import 'package:e_porter/presentation/screens/home/pages/ticket_booking_step4_sc import 'package:e_porter/presentation/screens/home/pages/upload_file_screen.dart'; import 'package:e_porter/presentation/screens/navigation/main_navigation.dart'; import 'package:e_porter/presentation/screens/onboarding/onboarding_screen.dart'; +import 'package:e_porter/presentation/screens/profile/pages/change_password_screen.dart'; import 'package:e_porter/presentation/screens/profile/pages/information_users_screen.dart'; import 'package:e_porter/presentation/screens/profile/pages/profile_screen.dart'; import 'package:e_porter/presentation/screens/profile/pages/add_passenger_screen.dart'; @@ -197,22 +198,30 @@ class AppRoutes { GetPage( name: Routes.INFORMATIONS, page: () => InformationUsersScreen(), + binding: ProfilBinding(), + ), + GetPage( + name: Routes.CHANGEPASSWORD, + page: () => ChangePasswordScreen(), ), ]; } class Routes { - static const NAVBAR = '/navigation'; + // Auth static const SPLASH = '/splash'; static const ONBOARDING = '/onboarding'; static const LOGIN = '/login'; - static const VERIFICATION = '/verification'; - static const HOME = '/home'; - static const BOARDINGPASS = '/boarding_pass'; - static const PROFILE = '/profile'; static const REGISTER = '/register'; static const FORGETPASSWORD = '/forget_password'; + static const VERIFICATION = '/verification'; static const STATESUCCES = '/state_succes'; + + // Navbar + static const NAVBAR = '/navigation'; + + // Home + static const HOME = '/home'; static const OURSERVICE = '/our_service'; static const BOOKINGTICKETS = '/booking_tickets'; static const SEARCHFLIGHT = '/search_flight'; @@ -224,6 +233,9 @@ class Routes { static const CHOOSECHAIR = '/choose_chair'; static const PAYMENT = '/payment'; static const UPLOADFILE = '/upload_file'; + + // Boarding Pass + static const BOARDINGPASS = '/boarding_pass'; static const TRANSACTIONHISTORY = '/transaction_history'; static const DETAILTICKET = '/detail_ticket'; static const PRINTBOARDINGPASS = '/print_boarding_pass'; @@ -232,6 +244,9 @@ class Routes { static const HISTORYPORTER = '/history_porter'; static const DETAILHISTORYPORTER = '/detail_history_porter'; + // Profile + static const PROFILE = '/profile'; static const ADDPASSENGER = '/add_passenger'; static const INFORMATIONS = '/informations'; + static const CHANGEPASSWORD = '/change_password'; }