From a0008c91046fed88dea1e7b9862edee52c7f82cc Mon Sep 17 00:00:00 2001 From: haroon amjad Date: Tue, 13 Jan 2026 13:13:21 +0300 Subject: [PATCH] Nearest Appointment sorting fixed --- lib/core/dependencies.dart | 2 +- .../book_appointments_view_model.dart | 19 ++++++- .../hmg_services/hmg_services_view_model.dart | 4 ++ .../search_doctor_by_name.dart | 1 - .../book_appointment/select_doctor_page.dart | 3 +- .../book_appointment/widgets/doctor_card.dart | 55 +++++++++++++------ .../profile_settings/profile_settings.dart | 12 ++-- 7 files changed, 69 insertions(+), 27 deletions(-) diff --git a/lib/core/dependencies.dart b/lib/core/dependencies.dart index 6e203da..6c7d358 100644 --- a/lib/core/dependencies.dart +++ b/lib/core/dependencies.dart @@ -292,7 +292,7 @@ class AppDependencies { getIt.registerLazySingleton(() => WaterMonitorViewModel(waterMonitorRepo: getIt(), errorHandlerService: getIt())); //commenting this because its already define there was on run time error because of this. - // getIt.registerLazySingleton(() => MyInvoicesViewModel(myInvoicesRepo: getIt(), errorHandlerService: getIt(), navServices: getIt())); + getIt.registerLazySingleton(() => MyInvoicesViewModel(myInvoicesRepo: getIt(), errorHandlerService: getIt(), navServices: getIt())); getIt.registerLazySingleton(() => MonthlyReportViewModel(errorHandlerService: getIt(), monthlyReportRepo: getIt())); diff --git a/lib/features/book_appointments/book_appointments_view_model.dart b/lib/features/book_appointments/book_appointments_view_model.dart index a225c1d..3f5517a 100644 --- a/lib/features/book_appointments/book_appointments_view_model.dart +++ b/lib/features/book_appointments/book_appointments_view_model.dart @@ -289,9 +289,24 @@ class BookAppointmentsViewModel extends ChangeNotifier { this.isNearestAppointmentSelected = isNearestAppointmentSelected; if (isNearestAppointmentSelected) { - doctorsList.sort((a, b) => DateUtil.convertStringToDate(a.nearestFreeSlot!).compareTo(DateUtil.convertStringToDate(b.nearestFreeSlot!))); + for (var group in doctorsListGrouped) { + group.sort((a, b) { + var aSlot = a.nearestFreeSlot; + var bSlot = b.nearestFreeSlot; + if (aSlot == null || bSlot == null) return 0; + return DateUtil.convertStringToDate(aSlot).compareTo(DateUtil.convertStringToDate(bSlot)); + }); + } } else { - doctorsList.sort((a, b) => b.decimalDoctorRate!.compareTo(a.decimalDoctorRate!)); + for (var group in doctorsListGrouped) { + group.sort((a, b) { + var aSlot = a.decimalDoctorRate; + var bSlot = b.decimalDoctorRate; + if (aSlot == null || bSlot == null) return 0; + return bSlot.compareTo(aSlot); + }); + } + // doctorsList.sort((a, b) => b.decimalDoctorRate!.compareTo(a.decimalDoctorRate!)); } notifyListeners(); diff --git a/lib/features/hmg_services/hmg_services_view_model.dart b/lib/features/hmg_services/hmg_services_view_model.dart index c55a11c..daddbff 100644 --- a/lib/features/hmg_services/hmg_services_view_model.dart +++ b/lib/features/hmg_services/hmg_services_view_model.dart @@ -40,6 +40,8 @@ class HmgServicesViewModel extends ChangeNotifier { bool isHospitalListLoading = false; bool isVitalSignLoading = false; + bool hasVitalSignDataLoaded = false; + // HHC specific loading states bool isHhcOrdersLoading = false; bool isHhcServicesLoading = false; @@ -878,6 +880,7 @@ class HmgServicesViewModel extends ChangeNotifier { Function(dynamic)? onSuccess, Function(String)? onError, }) async { + if (hasVitalSignDataLoaded) return; isVitalSignLoading = true; notifyListeners(); @@ -896,6 +899,7 @@ class HmgServicesViewModel extends ChangeNotifier { isVitalSignLoading = false; if (apiResponse.messageStatus == 1) { vitalSignList = apiResponse.data ?? []; + hasVitalSignDataLoaded = true; notifyListeners(); if (onSuccess != null) { onSuccess(apiResponse); diff --git a/lib/presentation/book_appointment/search_doctor_by_name.dart b/lib/presentation/book_appointment/search_doctor_by_name.dart index eb6d06f..9f2da16 100644 --- a/lib/presentation/book_appointment/search_doctor_by_name.dart +++ b/lib/presentation/book_appointment/search_doctor_by_name.dart @@ -262,7 +262,6 @@ class _SearchDoctorByNameState extends State { final doctorIndex = entry.key; final doctor = entry.value; final isLastDoctor = doctorIndex == groupedDoctors[index].length - 1; - return Column( children: [ DoctorCard( diff --git a/lib/presentation/book_appointment/select_doctor_page.dart b/lib/presentation/book_appointment/select_doctor_page.dart index 28b0f61..2f8747d 100644 --- a/lib/presentation/book_appointment/select_doctor_page.dart +++ b/lib/presentation/book_appointment/select_doctor_page.dart @@ -198,7 +198,8 @@ class _SelectDoctorPageState extends State { physics: NeverScrollableScrollPhysics(), itemCount: bookAppointmentsVM.isDoctorsListLoading ? 5 : (bookAppointmentsVM.doctorsListGrouped.isNotEmpty ? bookAppointmentsVM.doctorsListGrouped.length : 1), itemBuilder: (context, index) { - final isExpanded = bookAppointmentsVM.expandedGroupIndex == index; + // final isExpanded = bookAppointmentsVM.expandedGroupIndex == index; + final isExpanded = true; return bookAppointmentsVM.isDoctorsListLoading ? DoctorCard( doctorsListResponseModel: DoctorsListResponseModel(), diff --git a/lib/presentation/book_appointment/widgets/doctor_card.dart b/lib/presentation/book_appointment/widgets/doctor_card.dart index 278c100..d2e1c0b 100644 --- a/lib/presentation/book_appointment/widgets/doctor_card.dart +++ b/lib/presentation/book_appointment/widgets/doctor_card.dart @@ -43,15 +43,44 @@ class DoctorCard extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( + crossAxisAlignment: CrossAxisAlignment.start, children: [ - Image.network( - isLoading - ? "https://hmgwebservices.com/Images/MobileImages/OALAY/1439.png" - : doctorsListResponseModel.doctorImageURL ?? "https://hmgwebservices.com/Images/MobileImages/OALAY/1439.png", - width: 63.h, - height: 63.h, - fit: BoxFit.cover, - ).circle(100).toShimmer2(isShow: isLoading), + Column( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Image.network( + isLoading + ? "https://hmgwebservices.com/Images/MobileImages/OALAY/1439.png" + : doctorsListResponseModel.doctorImageURL ?? "https://hmgwebservices.com/Images/MobileImages/OALAY/1439.png", + width: 63.h, + height: 63.h, + fit: BoxFit.cover, + ).circle(100).toShimmer2(isShow: isLoading), + Transform.translate( + offset: Offset(0.0, -20.h), + child: Container( + width: 40.w, + height: 40.h, + decoration: BoxDecoration( + color: AppColors.whiteColor, + shape: BoxShape.circle, // Makes the container circular + border: Border.all( + color: AppColors.scaffoldBgColor, // Color of the border + width: 1.5.w, // Width of the border + ), + ), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Utils.buildSvgWithAssets(icon: AppAssets.rating_icon, width: 15.w, height: 15.h), + SizedBox(height: 2.h), + "${isLoading ? 4.78 : doctorsListResponseModel.decimalDoctorRate}".toText11(isBold: true, color: AppColors.textColor), + ], + ), + ).circle(100).toShimmer2(isShow: isLoading), + ), + ], + ), SizedBox(width: 8.h), Expanded( flex: 9, @@ -102,23 +131,17 @@ class DoctorCard extends StatelessWidget { ), ], ), - SizedBox(height: 12.h), Wrap( direction: Axis.horizontal, spacing: 3.h, runSpacing: 4.h, children: [ AppCustomChipWidget( - labelText: "Clinic: ${isLoading ? "Cardiologist" : doctorsListResponseModel.clinicName}".needTranslation, + labelText: "${isLoading ? "Cardiologist" : doctorsListResponseModel.clinicName}".needTranslation, ).toShimmer2(isShow: isLoading), AppCustomChipWidget( - labelText: "Branch: ${isLoading ? "Olaya Hospital" : doctorsListResponseModel.projectName}".needTranslation, + labelText: "${isLoading ? "Olaya Hospital" : doctorsListResponseModel.projectName}".needTranslation, ).toShimmer2(isShow: isLoading), - doctorsListResponseModel.decimalDoctorRate != null ? AppCustomChipWidget( - icon: AppAssets.rating_icon, - iconColor: AppColors.ratingColorYellow, - labelText: "Rating: ${isLoading ? 4.78 : doctorsListResponseModel.decimalDoctorRate}".needTranslation, - ).toShimmer2(isShow: isLoading) : SizedBox(), bookAppointmentsViewModel.isNearestAppointmentSelected ? doctorsListResponseModel.nearestFreeSlot != null ? AppCustomChipWidget( diff --git a/lib/presentation/profile_settings/profile_settings.dart b/lib/presentation/profile_settings/profile_settings.dart index e463ae7..62f090e 100644 --- a/lib/presentation/profile_settings/profile_settings.dart +++ b/lib/presentation/profile_settings/profile_settings.dart @@ -217,12 +217,12 @@ class ProfileSettingsState extends State { child: Column( children: [ actionItem(AppAssets.email_transparent, "Update Email Address".needTranslation, () {}), - 1.divider, - actionItem(AppAssets.smart_phone_fill, "Phone Number".needTranslation, () {}), - 1.divider, - actionItem(AppAssets.my_address, "My Addresses".needTranslation, () {}), - 1.divider, - actionItem(AppAssets.emergency, "Emergency Contact".needTranslation, () {}), + // 1.divider, + // actionItem(AppAssets.smart_phone_fill, "Phone Number".needTranslation, () {}), + // 1.divider, + // actionItem(AppAssets.my_address, "My Addresses".needTranslation, () {}), + // 1.divider, + // actionItem(AppAssets.emergency, "Emergency Contact".needTranslation, () {}), ], ), ),