From f929bd9017f947b8370aa3910f745147b9e54654 Mon Sep 17 00:00:00 2001 From: haroon amjad Date: Mon, 6 Apr 2026 12:46:55 +0300 Subject: [PATCH] Updates --- assets/images/svg/calendar_filled_icon.svg | 9 + assets/langs/ar-SA.json | 5 +- assets/langs/en-US.json | 7 +- lib/core/api/api_client.dart | 4 +- lib/core/app_assets.dart | 1 + .../immediate_livecare_repo.dart | 47 ++++ .../immediate_livecare_view_model.dart | 30 +++ ...vecare_clinic_schedule_response_model.dart | 71 ++++++ lib/generated/locale_keys.g.dart | 1 + .../immediate_livecare_payment_details.dart | 31 +-- ...mediate_livecare_pending_request_page.dart | 67 +++--- ...select_immediate_livecare_clinic_page.dart | 4 +- .../widgets/livecare_clinic_card.dart | 202 +++++++++++++++++- lib/presentation/home/landing_page.dart | 41 ++-- 14 files changed, 447 insertions(+), 73 deletions(-) create mode 100644 assets/images/svg/calendar_filled_icon.svg create mode 100644 lib/features/immediate_livecare/models/resp_models/get_livecare_clinic_schedule_response_model.dart diff --git a/assets/images/svg/calendar_filled_icon.svg b/assets/images/svg/calendar_filled_icon.svg new file mode 100644 index 00000000..116ce8ef --- /dev/null +++ b/assets/images/svg/calendar_filled_icon.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/assets/langs/ar-SA.json b/assets/langs/ar-SA.json index f9cc3035..faa65060 100644 --- a/assets/langs/ar-SA.json +++ b/assets/langs/ar-SA.json @@ -936,7 +936,7 @@ "hospitalInformation": "معلومات المستشفى", "fetchingAppointmentShare": "جاري جلب تفاصيل الموعد...", "bookingYourAppointment": "جاري حجز موعدك...", - "selectLiveCareClinic": "اختر عيادة لايف كير", + "selectLiveCareClinic": "عيادة لايف كير", "checkingForExistingDentalPlan": "جاري التحقق من وجود خطة أسنان حالية، يرجى الانتظار...", "dentalTreatmentPlan": "خطة علاج الأسنان", "youHaveExistingTreatmentPlan": "لديك خطة علاج حالية: ", @@ -1653,5 +1653,6 @@ "oneWaySubtitle": "نقل من الموقع إلى المستشفى", "twoWaySubtitle": "نقل من الموقع إلى المستشفى والعودة مرة أخرى", "toHospitalSubtitle": "نقل من موقعك الحالي إلى المستشفى", - "fromHospitalSubtitle": "نقل من المستشفى إلى منزلك" + "fromHospitalSubtitle": "نقل من المستشفى إلى منزلك", + "clinicSchedule": "جدول العيادة" } diff --git a/assets/langs/en-US.json b/assets/langs/en-US.json index 1bbd7cb7..4b944e5b 100644 --- a/assets/langs/en-US.json +++ b/assets/langs/en-US.json @@ -930,7 +930,7 @@ "hospitalInformation": "Hospital Information", "fetchingAppointmentShare": "Fetching Appointment Share...", "bookingYourAppointment": "Booking your appointment...", - "selectLiveCareClinic": "Select LiveCare Clinic", + "selectLiveCareClinic": "LiveCare Clinic", "checkingForExistingDentalPlan": "Checking for an existing dental plan, Please wait...", "dentalTreatmentPlan": "Dental treatment plan", "youHaveExistingTreatmentPlan": "You have an existing treatment plan: ", @@ -1241,7 +1241,7 @@ "quickLinks": "Quick Links", "viewMedicalFileLandingPage": "View medical file", "immediateLiveCareRequest": "Immediate LiveCare Request", - "yourTurnIsAfterPatients": "Your turn is after {count} patients.", + "yourTurnIsAfterPatients": "Your turn is after {count} patients. Please wait for your turn, The doctor will call you shortly.", "dontHaveHHCOrders": "You don't have any Home Health Care orders yet.", "hhcOrders": "HHC Orders", "requestedServices": "Requested Services", @@ -1645,5 +1645,6 @@ "oneWaySubtitle": "Pickup from location to hospital", "twoWaySubtitle": "Round trip from location to hospital and back", "toHospitalSubtitle": "Transfer from your current location to the hospital", - "fromHospitalSubtitle": "Transfer from the hospital back to your home" + "fromHospitalSubtitle": "Transfer from the hospital back to your home", + "clinicSchedule": "Clinic Schedule" } diff --git a/lib/core/api/api_client.dart b/lib/core/api/api_client.dart index 374ac9d1..709d0166 100644 --- a/lib/core/api/api_client.dart +++ b/lib/core/api/api_client.dart @@ -199,8 +199,8 @@ class ApiClientImp implements ApiClient { body['TokenID'] = "@dm!n"; } - // body['TokenID'] = "@dm!n"; - // body['PatientID'] = 1018977; + body['TokenID'] = "@dm!n"; + body['PatientID'] = 1018977; // body['PatientTypeID'] = 1; // body['PatientOutSA'] = 0; // body['SessionID'] = "45786230487560q"; diff --git a/lib/core/app_assets.dart b/lib/core/app_assets.dart index d90cd40c..6d36098e 100644 --- a/lib/core/app_assets.dart +++ b/lib/core/app_assets.dart @@ -236,6 +236,7 @@ class AppAssets { static const String forward_top_nav_icon = '$svgBasePath/forward_top_nav_icon.svg'; static const String back_top_nav_icon = '$svgBasePath/back_top_nav_icon.svg'; static const String bluetooth = '$svgBasePath/bluetooth.svg'; + static const String calendar_filled_icon = '$svgBasePath/calendar_filled_icon.svg'; //smartwatch static const String watchActivity = '$svgBasePath/watch_activity.svg'; diff --git a/lib/features/immediate_livecare/immediate_livecare_repo.dart b/lib/features/immediate_livecare/immediate_livecare_repo.dart index cbce4ea2..8775378b 100644 --- a/lib/features/immediate_livecare/immediate_livecare_repo.dart +++ b/lib/features/immediate_livecare/immediate_livecare_repo.dart @@ -5,6 +5,7 @@ import 'package:hmg_patient_app_new/core/api/api_client.dart'; import 'package:hmg_patient_app_new/core/api_consts.dart'; import 'package:hmg_patient_app_new/core/common_models/generic_api_model.dart'; import 'package:hmg_patient_app_new/core/exceptions/api_failure.dart'; +import 'package:hmg_patient_app_new/features/immediate_livecare/models/resp_models/get_livecare_clinic_schedule_response_model.dart'; import 'package:hmg_patient_app_new/features/immediate_livecare/models/resp_models/get_livecare_immediate_clinics_response_model.dart'; import 'package:hmg_patient_app_new/features/immediate_livecare/models/resp_models/get_livecare_immediate_fees_response_model.dart'; import 'package:hmg_patient_app_new/features/immediate_livecare/models/resp_models/get_patient_livecare_history_response_model.dart'; @@ -13,6 +14,9 @@ import 'package:hmg_patient_app_new/services/logger_service.dart'; abstract class ImmediateLiveCareRepo { Future>>> getLiveCareImmediateClinicsList(int age, int genderID, {Function(dynamic)? onSuccess, Function(String)? onError}); + Future>>> getLiveCareImmediateClinicSchedule(int age, int genderID, int serviceID, + {Function(dynamic)? onSuccess, Function(String)? onError}); + Future>> getLiveCareImmediateAppointmentFees(int age, int genderID, int serviceID, {Function(dynamic)? onSuccess, Function(String)? onError}); @@ -203,4 +207,47 @@ class ImmediateLiveCareRepoImp implements ImmediateLiveCareRepo { return Left(UnknownFailure(e.toString())); } } + + @override + Future>>> getLiveCareImmediateClinicSchedule(int age, int genderID, int serviceID, + {Function(dynamic p1)? onSuccess, Function(String p1)? onError}) async { + Map mapDevice = { + "Age": age, + "Gender": genderID, + "ServiceID": serviceID, + }; + + try { + GenericApiModel>? apiResponse; + Failure? failure; + await apiClient.post( + GET_LIVECARE_CLINIC_TIMING, + body: mapDevice, + onFailure: (error, statusCode, {messageStatus, failureType}) { + failure = failureType; + // onError!(error); + }, + onSuccess: (response, statusCode, {messageStatus, errorMessage}) { + try { + final respObject = response['PatientER_GetClinicsServiceTimingsList']; + final liveCareScheduleObj = respObject.map((item) => LiveCareClinicScheduleResponse.fromJson(item as Map)).toList().cast(); + + apiResponse = GenericApiModel>( + messageStatus: messageStatus, + statusCode: statusCode, + errorMessage: null, + data: liveCareScheduleObj, + ); + } catch (e) { + failure = DataParsingFailure(e.toString()); + } + }, + ); + if (failure != null) return Left(failure!); + if (apiResponse == null) return Left(ServerFailure("Unknown error")); + return Right(apiResponse!); + } catch (e) { + return Left(UnknownFailure(e.toString())); + } + } } diff --git a/lib/features/immediate_livecare/immediate_livecare_view_model.dart b/lib/features/immediate_livecare/immediate_livecare_view_model.dart index 46f5a652..6613b481 100644 --- a/lib/features/immediate_livecare/immediate_livecare_view_model.dart +++ b/lib/features/immediate_livecare/immediate_livecare_view_model.dart @@ -11,6 +11,7 @@ import 'package:hmg_patient_app_new/core/enums.dart'; import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; import 'package:hmg_patient_app_new/core/utils/utils.dart'; import 'package:hmg_patient_app_new/features/immediate_livecare/immediate_livecare_repo.dart'; +import 'package:hmg_patient_app_new/features/immediate_livecare/models/resp_models/get_livecare_clinic_schedule_response_model.dart'; import 'package:hmg_patient_app_new/features/immediate_livecare/models/resp_models/get_livecare_immediate_clinics_response_model.dart'; import 'package:hmg_patient_app_new/features/immediate_livecare/models/resp_models/get_livecare_immediate_fees_response_model.dart'; import 'package:hmg_patient_app_new/features/immediate_livecare/models/resp_models/get_patient_livecare_history_response_model.dart'; @@ -46,6 +47,8 @@ class ImmediateLiveCareViewModel extends ChangeNotifier { List patientLiveCareHistoryList = []; bool patientHasPendingLiveCareRequest = false; + List liveCareClinicScheduleList = []; + late AppState _appState; Duration countdownDuration = Duration(minutes: 1, seconds: 0); @@ -265,6 +268,33 @@ class ImmediateLiveCareViewModel extends ChangeNotifier { ); } + Future getLiveCareImmediateClinicSchedule({int? serviceID, Function(dynamic)? onSuccess, Function(String)? onError}) async { + liveCareClinicScheduleList.clear(); + notifyListeners(); + + final result = + await immediateLiveCareRepo.getLiveCareImmediateClinicSchedule(_appState.getAuthenticatedUser()!.age!, _appState.getAuthenticatedUser()!.gender!, serviceID!); + + result.fold( + (failure) async => await errorHandlerService.handleError(failure: failure), + (apiResponse) { + if (apiResponse.messageStatus == 2) { + // dialogService.showErrorDialog(message: apiResponse.errorMessage!, onOkPressed: () {}); + } else if (apiResponse.messageStatus == 1) { + liveCareClinicScheduleList = apiResponse.data!; + + // immediateLiveCareClinicsList.sort((a, b) => b.isOnline!.compareTo(a.isOnline!)); + + // isImmediateLiveCareClinicsLoading = false; + notifyListeners(); + if (onSuccess != null) { + onSuccess(apiResponse); + } + } + }, + ); + } + void startTimer() { timer = Timer.periodic(const Duration(seconds: 1), (_) => addTime()); notifyListeners(); diff --git a/lib/features/immediate_livecare/models/resp_models/get_livecare_clinic_schedule_response_model.dart b/lib/features/immediate_livecare/models/resp_models/get_livecare_clinic_schedule_response_model.dart new file mode 100644 index 00000000..787167de --- /dev/null +++ b/lib/features/immediate_livecare/models/resp_models/get_livecare_clinic_schedule_response_model.dart @@ -0,0 +1,71 @@ +class LiveCareClinicScheduleResponse { + int? iD; + int? serviceID; + int? dayOfWeek; + String? dayOfWeekStr; + bool? isActive; + String? createdOn; + String? createdBy; + bool? projectOutSA; + String? dayOfWeekStrN; + List? shiftTimings; + + LiveCareClinicScheduleResponse({this.iD, this.serviceID, this.dayOfWeek, this.dayOfWeekStr, this.isActive, this.createdOn, this.createdBy, this.projectOutSA, this.dayOfWeekStrN, this.shiftTimings}); + + LiveCareClinicScheduleResponse.fromJson(Map json) { + iD = json['ID']; + serviceID = json['ServiceID']; + dayOfWeek = json['DayOfWeek']; + dayOfWeekStr = json['DayOfWeekStr']; + isActive = json['IsActive']; + createdOn = json['CreatedOn']; + createdBy = json['CreatedBy']; + projectOutSA = json['ProjectOutSA']; + dayOfWeekStrN = json['DayOfWeekStrN']; + if (json['ShiftTimings'] != null) { + shiftTimings = []; + json['ShiftTimings'].forEach((v) { + shiftTimings!.add(new ShiftTimings.fromJson(v)); + }); + } + } + + Map toJson() { + final Map data = new Map(); + data['ID'] = this.iD; + data['ServiceID'] = this.serviceID; + data['DayOfWeek'] = this.dayOfWeek; + data['DayOfWeekStr'] = this.dayOfWeekStr; + data['IsActive'] = this.isActive; + data['CreatedOn'] = this.createdOn; + data['CreatedBy'] = this.createdBy; + data['ProjectOutSA'] = this.projectOutSA; + data['DayOfWeekStrN'] = this.dayOfWeekStrN; + if (this.shiftTimings != null) { + data['ShiftTimings'] = this.shiftTimings!.map((v) => v.toJson()).toList(); + } + return data; + } +} + +class ShiftTimings { + String? endTime; + int? shiftID; + String? startTime; + + ShiftTimings({this.endTime, this.shiftID, this.startTime}); + + ShiftTimings.fromJson(Map json) { + endTime = json['EndTime']; + shiftID = json['ShiftID']; + startTime = json['StartTime']; + } + + Map toJson() { + final Map data = new Map(); + data['EndTime'] = this.endTime; + data['ShiftID'] = this.shiftID; + data['StartTime'] = this.startTime; + return data; + } +} diff --git a/lib/generated/locale_keys.g.dart b/lib/generated/locale_keys.g.dart index e9f60f5c..f9bcef45 100644 --- a/lib/generated/locale_keys.g.dart +++ b/lib/generated/locale_keys.g.dart @@ -1646,5 +1646,6 @@ abstract class LocaleKeys { static const twoWaySubtitle = 'twoWaySubtitle'; static const toHospitalSubtitle = 'toHospitalSubtitle'; static const fromHospitalSubtitle = 'fromHospitalSubtitle'; + static const clinicSchedule = 'clinicSchedule'; } diff --git a/lib/presentation/book_appointment/livecare/immediate_livecare_payment_details.dart b/lib/presentation/book_appointment/livecare/immediate_livecare_payment_details.dart index 673532ac..12b09041 100644 --- a/lib/presentation/book_appointment/livecare/immediate_livecare_payment_details.dart +++ b/lib/presentation/book_appointment/livecare/immediate_livecare_payment_details.dart @@ -384,20 +384,20 @@ class ImmediateLiveCarePaymentDetails extends StatelessWidget { } // Show one combined retry dialog for all missing permissions - final missingNames = missing.map((p) => LiveCarePermissionService.instance.friendlyName(p)).join(' and '); - final retry = await showDialog( - context: context, - builder: (c) => AlertDialog( - title: const Text('Permissions required'), - content: Text('$missingNames permission${missing.length > 1 ? 's are' : ' is'} required to start the video call. Retry now?'), - actions: [ - TextButton(onPressed: () => Navigator.of(c).pop(false), child: const Text('Cancel')), - TextButton(onPressed: () => Navigator.of(c).pop(true), child: const Text('Retry')), - ], - ), - ); - - if (retry != true) return false; + // final missingNames = missing.map((p) => LiveCarePermissionService.instance.friendlyName(p)).join(' and '); + // final retry = await showDialog( + // context: context, + // builder: (c) => AlertDialog( + // title: const Text('Permissions required'), + // content: Text('$missingNames permission${missing.length > 1 ? 's are' : ' is'} required to start the video call. Retry now?'), + // actions: [ + // TextButton(onPressed: () => Navigator.of(c).pop(false), child: const Text('Cancel')), + // TextButton(onPressed: () => Navigator.of(c).pop(true), child: const Text('Retry')), + // ], + // ), + // ); + // + // if (retry != true) return false; // Request only the missing permissions final newStatuses = {}; @@ -425,7 +425,8 @@ class ImmediateLiveCarePaymentDetails extends StatelessWidget { return false; } - return cameraGranted && micGranted && notifGranted && alertWindowGranted; + // return cameraGranted && micGranted && notifGranted && alertWindowGranted; + return cameraGranted && micGranted && notifGranted; } // Future askVideoCallPermission() async { diff --git a/lib/presentation/book_appointment/livecare/immediate_livecare_pending_request_page.dart b/lib/presentation/book_appointment/livecare/immediate_livecare_pending_request_page.dart index da12f3ef..0ea348e0 100644 --- a/lib/presentation/book_appointment/livecare/immediate_livecare_pending_request_page.dart +++ b/lib/presentation/book_appointment/livecare/immediate_livecare_pending_request_page.dart @@ -82,20 +82,34 @@ class _ImmediateLiveCarePendingRequestPageState extends State( - valueListenable: immediateLiveCareVM.durationNotifier, - builder: (context, duration, child) { - return Column( - mainAxisAlignment: MainAxisAlignment.center, + LocaleKeys.immediateLiveCareRequest.tr(context: context).toText16(isBold: true), + SizedBox(height: 10.h), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Wrap( children: [ - buildTime(duration), + AppCustomChipWidget( + labelText: immediateLiveCareViewModel.patientLiveCareHistoryList.isNotEmpty ? immediateLiveCareViewModel.patientLiveCareHistoryList[0].stringCallStatus : "", + backgroundColor: AppColors.warningColorYellow.withValues(alpha: 0.20), + textColor: AppColors.alertColor, + ), + SizedBox(width: 8.w), + AppCustomChipWidget( + icon: AppAssets.appointment_calendar_icon, + labelText: DateUtil.formatDateToDate(DateUtil.convertStringToDate(immediateLiveCareViewModel.patientLiveCareHistoryList[0].arrivalTime), false)), ], - ); - }, + ), + Utils.buildSvgWithAssets(icon: AppAssets.waiting_icon, width: 24.h, height: 24.h), + // Lottie.asset(AppAnimations.pending_loading_animation, repeat: true, reverse: false, frameRate: FrameRate(60), width: 80.h, height: 80.h, fit: BoxFit.cover), + ], ), SizedBox(height: 8.h), + SizedBox(height: 8.h), + LocaleKeys.yourTurnIsAfterPatients + .tr(namedArgs: {'count': (immediateLiveCareViewModel.patientLiveCareHistoryList[0].patCount ?? 0).toString()}, context: context).toText14(weight: FontWeight.w500), + // "Your turn is after ${immediateLiveCareViewModel.patientLiveCareHistoryList[0].patCount} patients.".toText16(isBold: true), + SizedBox(height: 8.h), ], ), ), @@ -113,31 +127,24 @@ class _ImmediateLiveCarePendingRequestPageState extends State( + valueListenable: immediateLiveCareVM.durationNotifier, + builder: (context, duration, child) { + return Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + buildTime(duration), + ], + ); + }, + ), SizedBox(height: 8.h), ], ), ), - ) + ), ], ), ), diff --git a/lib/presentation/book_appointment/livecare/select_immediate_livecare_clinic_page.dart b/lib/presentation/book_appointment/livecare/select_immediate_livecare_clinic_page.dart index a83dfa05..870c8ad8 100644 --- a/lib/presentation/book_appointment/livecare/select_immediate_livecare_clinic_page.dart +++ b/lib/presentation/book_appointment/livecare/select_immediate_livecare_clinic_page.dart @@ -96,7 +96,9 @@ class _SelectImmediateLiveCareClinicPageState extends State().navigatorKey.currentContext!, + child: ListView.separated( + shrinkWrap: true, + itemBuilder: (_, index) { + return DecoratedBox( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 20.h, + hasShadow: false, + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + spacing: 8.h, + children: [ + checkInOptionCard(AppAssets.calendarGrey, immediateLiveCareViewModel.liveCareClinicScheduleList[index].dayOfWeekStr!, + "${immediateLiveCareViewModel.liveCareClinicScheduleList[index].shiftTimings!.first.startTime} to ${immediateLiveCareViewModel.liveCareClinicScheduleList[index].shiftTimings!.first.endTime}"), + ], + ), + ), + ], + ), + ).paddingSymmetrical(0.h, 0.h).onPress(() {}); + }, + separatorBuilder: (_, __) => SizedBox(height: 16.h), + itemCount: immediateLiveCareViewModel.liveCareClinicScheduleList.length), + title: LocaleKeys.clinicSchedule.tr(), + isCloseButtonVisible: true, + useSafeArea: true, + isFullScreen: true); + }); + } + + onImmediateLiveCareClinicSelected(GetLiveCareClinicListResponseModel liveCareClinic) { + //TODO: add implementation to show clinic schedule + // if (liveCareClinic.isOnline == 1) { + showCommonBottomSheetWithoutHeight(GetIt.instance().navigatorKey.currentContext!, child: SelectLiveCareCallType(immediateLiveCareViewModel: immediateLiveCareViewModel), + callBackFunc: () async { + if (immediateLiveCareViewModel.liveCareSelectedCallType != 0) { + immediateLiveCareViewModel.setImmediateLiveCareSelectedClinic(liveCareClinic); + LoaderBottomSheet.showLoader(loadingText: LocaleKeys.fetchingFeesPleaseWait.tr()); + await immediateLiveCareViewModel.getLiveCareImmediateAppointmentFees(onSuccess: (val) { + LoaderBottomSheet.hideLoader(); + Navigator.of(GetIt.instance().navigatorKey.currentContext!).push( + CustomPageRoute( + page: ImmediateLiveCarePaymentDetails(), + ), + ); + }, onError: (err) { + LoaderBottomSheet.hideLoader(); + showCommonBottomSheetWithoutHeight( + GetIt.instance().navigatorKey.currentContext!, + child: Utils.getErrorWidget(loadingText: err), + callBackFunc: () {}, + isFullScreen: false, + isCloseButtonVisible: true, + ); + }); + } + }, title: LocaleKeys.selectLiveCareCallType.tr(), isCloseButtonVisible: true, isFullScreen: false); + } + + Widget checkInOptionCard(String icon, String title, String subTitle) { + return Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 20.h, + hasShadow: false, + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + title.toText16(isBold: true, color: AppColors.textColor), + SizedBox(height: 8.h), + Row( + children: [ + AppCustomChipWidget( + icon: AppAssets.appointment_time_icon, + iconColor: AppColors.textColor, + labelText: subTitle.split("to").first.trim(), + ), + SizedBox(width: 8.w), + Utils.buildSvgWithAssets( + icon: AppAssets.arrow_forward, + height: 24.h, + width: 24.h, + iconColor: AppColors.textColor, + ), + SizedBox(width: 8.w), + AppCustomChipWidget( + icon: AppAssets.appointment_time_icon, + iconColor: AppColors.textColor, + labelText: subTitle.split("to")[1].trim(), + ), + ], + ), + ], + ), + ), + ], + ), + ], + ).paddingAll(16.h), + ); + } } diff --git a/lib/presentation/home/landing_page.dart b/lib/presentation/home/landing_page.dart index 32525234..eae47675 100644 --- a/lib/presentation/home/landing_page.dart +++ b/lib/presentation/home/landing_page.dart @@ -1006,15 +1006,33 @@ class _LandingPageState extends State { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - LocaleKeys.immediateLiveCareRequest.tr(context: context).toText16(isBold: true), - SizedBox(height: 10.h), - _buildLiveCareHeader(liveCareData), - SizedBox(height: 10.h), - _buildLiveCareGreeting(), - SizedBox(height: 8.h), - _buildLiveCareQueueInfo(liveCareData.patCount), - SizedBox(height: 8.h), - _buildLiveCareWaitingTime(), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + LocaleKeys.immediateLiveCareRequest.tr(context: context).toText16(isBold: true), + SizedBox(height: 10.h), + _buildLiveCareHeader(liveCareData), + SizedBox(height: 10.h), + SizedBox(height: 8.h), + _buildLiveCareQueueInfo(liveCareData.patCount), + SizedBox(height: 25.h), + ], + ), + CustomButton( + text: LocaleKeys.viewDetails.tr(context: context), + onPressed: () {}, + backgroundColor: AppColors.warningColorYellow.withValues(alpha: 0.20), + textColor: AppColors.alertColor, + borderColor: AppColors.infoBannerBgColor, + fontSize: 12.f, + fontWeight: FontWeight.w600, + borderRadius: 12.r, + padding: EdgeInsets.symmetric(horizontal: 10.w), + height: 40.h, + iconColor: AppColors.whiteColor, + iconSize: 18.h, + ), + // _buildLiveCareWaitingTime(), ], ), ), @@ -1069,10 +1087,7 @@ class _LandingPageState extends State { // LiveCare Card: Queue position info Widget _buildLiveCareQueueInfo(int? patCount) { - return LocaleKeys.yourTurnIsAfterPatients.tr( - namedArgs: {'count': (patCount ?? 0).toString()}, - context: context, - ).toText14(isBold: true); + return LocaleKeys.yourTurnIsAfterPatients.tr(namedArgs: {'count': (patCount ?? 0).toString()}, context: context).toText14(weight: FontWeight.w500); } // LiveCare Card: Waiting time counter