From 4b710523e838147ec64781b47036d1643fe7298e Mon Sep 17 00:00:00 2001 From: haroon amjad Date: Thu, 12 Feb 2026 13:14:33 +0300 Subject: [PATCH] Feedback status implemented --- assets/images/svg/livecare_audio.svg | 4 ++ assets/images/svg/livecare_phone.svg | 4 ++ assets/images/svg/livecare_video.svg | 4 ++ assets/langs/ar-SA.json | 1 + assets/langs/en-US.json | 1 + lib/core/api/api_client.dart | 4 ++ lib/core/api_consts.dart | 6 +-- lib/core/app_assets.dart | 4 ++ lib/core/utils/utils.dart | 6 +++ lib/extensions/string_extensions.dart | 8 +-- .../contact_us/contact_us_view_model.dart | 1 + lib/generated/locale_keys.g.dart | 1 + .../immediate_livecare_payment_details.dart | 15 +++++- .../widgets/select_livecare_call_type.dart | 8 +-- .../contact_us/feedback_page.dart | 52 ++++++++++++++++++- 15 files changed, 106 insertions(+), 13 deletions(-) create mode 100644 assets/images/svg/livecare_audio.svg create mode 100644 assets/images/svg/livecare_phone.svg create mode 100644 assets/images/svg/livecare_video.svg diff --git a/assets/images/svg/livecare_audio.svg b/assets/images/svg/livecare_audio.svg new file mode 100644 index 00000000..339d5347 --- /dev/null +++ b/assets/images/svg/livecare_audio.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/images/svg/livecare_phone.svg b/assets/images/svg/livecare_phone.svg new file mode 100644 index 00000000..1722f0fc --- /dev/null +++ b/assets/images/svg/livecare_phone.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/images/svg/livecare_video.svg b/assets/images/svg/livecare_video.svg new file mode 100644 index 00000000..bab506f8 --- /dev/null +++ b/assets/images/svg/livecare_video.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/langs/ar-SA.json b/assets/langs/ar-SA.json index eeabdcac..9d5b1e96 100644 --- a/assets/langs/ar-SA.json +++ b/assets/langs/ar-SA.json @@ -945,6 +945,7 @@ "offline": "غير متصل", "videoCall": "مكالمة فيديو", "liveVideoCallWithHMGDoctors": "مكالمة فيديو مباشرة مع أطباء مجموعة الحبيب الطبية", + "liveAudioCallWithHMGDoctors": "مكالمة صوتية مباشرة مع أطباء مجموعة الحبيب الطبية", "audioCall": "مكالمة صوتية", "phoneCall": "مكالمة هاتفية", "livePhoneCallWithHMGDoctors": "مكالمة هاتفية مباشرة مع أطباء مجموعة الحبيب الطبية", diff --git a/assets/langs/en-US.json b/assets/langs/en-US.json index 49095042..4bd9ae9e 100644 --- a/assets/langs/en-US.json +++ b/assets/langs/en-US.json @@ -937,6 +937,7 @@ "offline": "Offline", "videoCall": "Video Call", "liveVideoCallWithHMGDoctors": "Live Video Call with HMG Doctors", + "liveAudioCallWithHMGDoctors": "Live Audio Call with HMG Doctors", "audioCall": "Audio Call", "phoneCall": "Phone Call", "livePhoneCallWithHMGDoctors": "Live Phone Call with HMG Doctors", diff --git a/lib/core/api/api_client.dart b/lib/core/api/api_client.dart index ef50254a..3dd26384 100644 --- a/lib/core/api/api_client.dart +++ b/lib/core/api/api_client.dart @@ -197,6 +197,10 @@ class ApiClientImp implements ApiClient { // body['PatientTypeID'] = 1; // body['PatientOutSA'] = 0; // body['SessionID'] = "45786230487560q"; + + body['IdentificationNo'] = "2235558844"; + body['MobileNo'] = "966533147722"; + body['PatientID'] = 809289; } if(!url.contains("/paymentApi")) { diff --git a/lib/core/api_consts.dart b/lib/core/api_consts.dart index 03e1f7ea..c1981be6 100644 --- a/lib/core/api_consts.dart +++ b/lib/core/api_consts.dart @@ -4,7 +4,7 @@ import 'package:hmg_patient_app_new/core/enums.dart'; class ApiConsts { static const maxSmallScreen = 660; - static AppEnvironmentTypeEnum appEnvironmentType = AppEnvironmentTypeEnum.uat; + static AppEnvironmentTypeEnum appEnvironmentType = AppEnvironmentTypeEnum.preProd; // static String baseUrl = 'https://uat.hmgwebservices.com/'; // HIS API URL UAT @@ -229,8 +229,8 @@ class ApiConsts { static String getAiOverViewLabOrder = "Services/Patients.svc/REST/HMGAI_Lab_Analyzer_API"; // ************ static values for Api **************** - // static final double appVersionID = 19.7; - static final double appVersionID = 50.7; + static final double appVersionID = 19.7; + // static final double appVersionID = 50.7; static final int appChannelId = 3; static final String appIpAddress = "10.20.10.20"; static final String appGeneralId = "Cs2020@2016\$2958"; diff --git a/lib/core/app_assets.dart b/lib/core/app_assets.dart index 96c7cc09..942eb46b 100644 --- a/lib/core/app_assets.dart +++ b/lib/core/app_assets.dart @@ -295,6 +295,10 @@ class AppAssets { static const String bulb = '$svgBasePath/bulb.svg'; static const String switchBtn = '$svgBasePath/switch.svg'; + static const String livecare_video = '$svgBasePath/livecare_video.svg'; + static const String livecare_audio = '$svgBasePath/livecare_audio.svg'; + static const String livecare_phone = '$svgBasePath/livecare_phone.svg'; + //Health Trackers static const String bloodPressureIcon = '$svgBasePath/blood_pressure_icon.svg'; static const String bloodSugarOnlyIcon = '$svgBasePath/blood_sugar_only_icon.svg'; diff --git a/lib/core/utils/utils.dart b/lib/core/utils/utils.dart index ee032590..d436370f 100644 --- a/lib/core/utils/utils.dart +++ b/lib/core/utils/utils.dart @@ -990,6 +990,12 @@ class Utils { return isAllowed; } + static bool containsArabic(String text) { + // Using Unicode range for Arabic characters + final RegExp arabicRegex = RegExp(r'[\u0600-\u06FF\u0750-\u077F\u08A0-\u08FF\uFB50-\uFDFF\uFE70-\uFEFF]'); + return arabicRegex.hasMatch(text); + } + static String toEnglishNumbers(String input) { const english = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']; const arabic = ['٠', '١', '٢', '٣', '٤', '٥', '٦', '٧', '٨', '٩']; diff --git a/lib/extensions/string_extensions.dart b/lib/extensions/string_extensions.dart index f087f748..792bff50 100644 --- a/lib/extensions/string_extensions.dart +++ b/lib/extensions/string_extensions.dart @@ -192,6 +192,7 @@ extension EmailValidator on String { int? maxlines, double? letterSpacing = 0, double? height, + String? fontFamily, TextOverflow? textOverflow, }) => Text( @@ -206,7 +207,7 @@ extension EmailValidator on String { height: height, fontWeight: weight ?? (isBold ? FontWeight.bold : FontWeight.normal), decoration: isUnderLine ? TextDecoration.underline : null, - fontFamily: isEnglishOnly ? "Poppins" : getIt.get().getLanguageCode() == "ar" ? 'GESSTwo' : 'Poppins', + fontFamily: fontFamily ?? (isEnglishOnly ? "Poppins" : getIt.get().getLanguageCode() == "ar" ? 'GESSTwo' : 'Poppins'), decorationColor: color ?? AppColors.blackColor), ); @@ -231,12 +232,13 @@ extension EmailValidator on String { TextAlign? textAlign, FontWeight? weight, TextOverflow? textOverflow, + String? fontFamily, double? letterSpacing = -0.4, Color decorationColor = AppColors.errorColor}) => Text( this, maxLines: maxlines, - textAlign: isCenter ? TextAlign.center : null, + textAlign: isCenter ? textAlign ?? TextAlign.center : null, // locale: Locale('en', 'US'), style: TextStyle( color: color ?? AppColors.blackColor, @@ -246,7 +248,7 @@ extension EmailValidator on String { overflow: textOverflow, fontWeight: weight ?? (isBold ? FontWeight.bold : FontWeight.normal), decoration: isUnderLine ? TextDecoration.underline : null, - fontFamily: isEnglishOnly ? "Poppins" : getIt.get().getLanguageCode() == "ar" ? 'GESSTwo' : 'Poppins', + fontFamily: fontFamily ?? (isEnglishOnly ? "Poppins" : getIt.get().getLanguageCode() == "ar" ? 'GESSTwo' : 'Poppins'), decorationColor: decorationColor), ); diff --git a/lib/features/contact_us/contact_us_view_model.dart b/lib/features/contact_us/contact_us_view_model.dart index 5162aa04..72bcff76 100644 --- a/lib/features/contact_us/contact_us_view_model.dart +++ b/lib/features/contact_us/contact_us_view_model.dart @@ -256,6 +256,7 @@ class ContactUsViewModel extends ChangeNotifier { } } else if (apiResponse.messageStatus == 1) { cocItemsList = apiResponse.data!; + cocItemsList.sort((a, b) => a.date!.compareTo(b.date!)); isCOCItemsListLoading = false; notifyListeners(); if (onSuccess != null) { diff --git a/lib/generated/locale_keys.g.dart b/lib/generated/locale_keys.g.dart index ac4ad585..46ae0ba2 100644 --- a/lib/generated/locale_keys.g.dart +++ b/lib/generated/locale_keys.g.dart @@ -941,6 +941,7 @@ abstract class LocaleKeys { static const offline = 'offline'; static const videoCall = 'videoCall'; static const liveVideoCallWithHMGDoctors = 'liveVideoCallWithHMGDoctors'; + static const liveAudioCallWithHMGDoctors = 'liveAudioCallWithHMGDoctors'; static const audioCall = 'audioCall'; static const phoneCall = 'phoneCall'; static const livePhoneCallWithHMGDoctors = 'livePhoneCallWithHMGDoctors'; 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 4992d850..fb6ebe72 100644 --- a/lib/presentation/book_appointment/livecare/immediate_livecare_payment_details.dart +++ b/lib/presentation/book_appointment/livecare/immediate_livecare_payment_details.dart @@ -110,7 +110,7 @@ class ImmediateLiveCarePaymentDetails extends StatelessWidget { children: [ Row( children: [ - Utils.buildSvgWithAssets(icon: AppAssets.livecare_clinic_icon, width: 32.h, height: 32.h, fit: BoxFit.contain), + Utils.buildSvgWithAssets(icon: getLiveCareTypeIcon(immediateLiveCareVM.liveCareSelectedCallType), width: 32.h, height: 32.h, fit: BoxFit.contain), SizedBox(width: 8.h), getLiveCareType(context, immediateLiveCareVM.liveCareSelectedCallType).toText16(isBold: true), ], @@ -429,6 +429,19 @@ class ImmediateLiveCarePaymentDetails extends StatelessWidget { // // } // } + String getLiveCareTypeIcon(int callType) { + switch (callType) { + case 1: + return AppAssets.livecare_video; + case 2: + return AppAssets.livecare_audio; + case 3: + return AppAssets.livecare_phone; + default: + return AppAssets.livecare_video; + } + } + String getLiveCareType(BuildContext context, int callType) { switch (callType) { case 1: diff --git a/lib/presentation/book_appointment/livecare/widgets/select_livecare_call_type.dart b/lib/presentation/book_appointment/livecare/widgets/select_livecare_call_type.dart index a1c3f43b..e0f6c5c0 100644 --- a/lib/presentation/book_appointment/livecare/widgets/select_livecare_call_type.dart +++ b/lib/presentation/book_appointment/livecare/widgets/select_livecare_call_type.dart @@ -22,7 +22,7 @@ class SelectLiveCareCallType extends StatelessWidget { return Column( children: [ checkInOptionCard( - AppAssets.checkin_location_icon, + AppAssets.livecare_video, LocaleKeys.videoCall.tr(context: context), LocaleKeys.liveVideoCallWithHMGDoctors.tr(context: context), ).onPress(() { @@ -31,16 +31,16 @@ class SelectLiveCareCallType extends StatelessWidget { }), SizedBox(height: 16.h), checkInOptionCard( - AppAssets.checkin_location_icon, + AppAssets.livecare_audio, LocaleKeys.audioCall.tr(context: context), - LocaleKeys.liveVideoCallWithHMGDoctors.tr(context: context), + LocaleKeys.liveAudioCallWithHMGDoctors.tr(context: context), ).onPress(() { Navigator.of(context).pop(); immediateLiveCareViewModel.setLiveCareSelectedCallType(2); }), SizedBox(height: 16.h), checkInOptionCard( - AppAssets.checkin_location_icon, + AppAssets.livecare_phone, LocaleKeys.phoneCall.tr(context: context), LocaleKeys.livePhoneCallWithHMGDoctors.tr(context: context), ).onPress(() { diff --git a/lib/presentation/contact_us/feedback_page.dart b/lib/presentation/contact_us/feedback_page.dart index 4944355c..93954af9 100644 --- a/lib/presentation/contact_us/feedback_page.dart +++ b/lib/presentation/contact_us/feedback_page.dart @@ -26,6 +26,7 @@ import 'package:hmg_patient_app_new/widgets/input_widget.dart'; import 'package:hmg_patient_app_new/widgets/loader/bottomsheet_loader.dart'; import 'package:hmg_patient_app_new/widgets/routes/custom_page_route.dart'; import 'package:provider/provider.dart'; +import 'dart:ui' as ui; class FeedbackPage extends StatelessWidget { FeedbackPage({super.key}); @@ -36,10 +37,13 @@ class FeedbackPage extends StatelessWidget { final TextEditingController subjectTextController = TextEditingController(); final TextEditingController messageTextController = TextEditingController(); + late AppState appState; + @override Widget build(BuildContext context) { contactUsViewModel = Provider.of(context, listen: false); medicalFileViewModel = Provider.of(context, listen: false); + appState = getIt.get(); return Scaffold( backgroundColor: AppColors.bgScaffoldColor, body: Consumer(builder: (context, contactUsVM, child) { @@ -425,13 +429,57 @@ class FeedbackPage extends StatelessWidget { duration: Duration(milliseconds: 300), curve: Curves.easeInOut, child: Container( - height: 200.h, - width: 300.w, + padding: EdgeInsets.all(16.h), decoration: RoundedRectangleBorder().toSmoothCornerDecoration( color: AppColors.whiteColor, borderRadius: 20.h, hasShadow: true, ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + AppCustomChipWidget( + labelText: appState.isArabic() ? contactUsViewModel.cocItemsList[index].statusAr : contactUsViewModel.cocItemsList[index].status, + // backgroundColor: AppColors.warningColorYellow, + backgroundColor: (contactUsViewModel.cocItemsList[index].statusId == 7 || contactUsViewModel.cocItemsList[index].statusId == 8) + ? AppColors.primaryRedColor + : (contactUsViewModel.cocItemsList[index].statusId == 10 || + contactUsViewModel.cocItemsList[index].statusId == 6 || + contactUsViewModel.cocItemsList[index].statusId == 9) + ? AppColors.successColor + : AppColors.warningColorYellow, + textColor: AppColors.whiteColor, + ), + SizedBox(height: 8.h), + "${LocaleKeys.requestID.tr(context: context)} ${contactUsViewModel.cocItemsList[index].itemID}".toText16(weight: FontWeight.bold), + SizedBox(height: 8.h), + Wrap( + direction: Axis.horizontal, + spacing: 4.h, + runSpacing: 4.h, + children: [ + AppCustomChipWidget( + labelText: contactUsViewModel.cocItemsList[index].date!.split(" ")[0], + icon: AppAssets.calendarGrey, + labelPadding: EdgeInsetsDirectional.only(start: -4.w, end: 6.w), + ), + AppCustomChipWidget( + labelText: contactUsViewModel.cocItemsList[index].formType, + icon: AppAssets.ask_doctor_icon, + labelPadding: EdgeInsetsDirectional.only(start: -4.w, end: 6.w), + ), + ], + ), + SizedBox(height: 8.h), + "${contactUsViewModel.cocItemsList[index].cOCTitle}" + .toText16(weight: FontWeight.bold, fontFamily: Utils.isArabicText(contactUsViewModel.cocItemsList[index].cOCTitle ?? "") ? "GESSTwo" : "Poppins"), + SizedBox(height: 8.h), + "${contactUsViewModel.cocItemsList[index].detail}".toText14( + weight: FontWeight.w500, + color: AppColors.textColorLight, + fontFamily: Utils.isArabicText(contactUsViewModel.cocItemsList[index].detail ?? "") ? "GESSTwo" : "Poppins"), + ], + ), ).paddingOnly(bottom: 16.h), ), ),