From 2c7c71c566eda628019e5efbd3c4de0db0c030fc Mon Sep 17 00:00:00 2001 From: aamir-csol Date: Sun, 12 Apr 2026 09:47:47 +0300 Subject: [PATCH 01/45] codegen --- lib/generated/codegen_loader.g.dart | 3202 +++++++++++++++++++++++++++ 1 file changed, 3202 insertions(+) create mode 100644 lib/generated/codegen_loader.g.dart diff --git a/lib/generated/codegen_loader.g.dart b/lib/generated/codegen_loader.g.dart new file mode 100644 index 00000000..3e3bee02 --- /dev/null +++ b/lib/generated/codegen_loader.g.dart @@ -0,0 +1,3202 @@ +// DO NOT EDIT. This is code generated via package:easy_localization/generate.dart + +// ignore_for_file: prefer_single_quotes, avoid_renaming_method_parameters, constant_identifier_names + +import 'dart:ui'; + +import 'package:easy_localization/easy_localization.dart' show AssetLoader; + +class CodegenLoader extends AssetLoader{ + const CodegenLoader(); + + @override + Future?> load(String path, Locale locale) { + return Future.value(mapLocales[locale.toString()]); + } + + static const Map _ar_SA = { + "english": "الإنجليزية", + "arabic": "العربية", + "login": "تسجيل الدخول", + "noDataAvailable": "لا توجد بيانات متاحة", + "confirm": "تأكيد", + "loadingText": "جاري التحميل، يرجى الانتظار...", + "kilometerUnit": "كم", + "dashboardScreenToolbarTitle": "الرئيسية", + "settings": "الإعدادات", + "language": "لغة التطبيق", + "lanEnglish": "الإنجليزية", + "lanArabic": "العربية", + "cancel": "إلغاء", + "done": "تم", + "replay2": "إعادة التشغيل", + "home": "الرئيسية", + "services": "الخدمات", + "mySchedule": "جدولي", + "logout": "تسجيل الخروج", + "respirationRate": "معدل التنفس", + "bookAppo": "حجز موعد", + "searchBy": "البحث بواسطة:", + "clinic": "عيادة", + "byClinic": "حسب العيادة", + "hospital": "مستشفى", + "byHospital": "حسب المستشفى", + "name": "الاسم", + "doctor": "طبيب", + "clinicName": "اسم العيادة", + "hospitalName": "اسم المستشفى", + "noClinicFound": "لم يتم العثور على عيادة", + "doctorName": "اسم الطبيب", + "nearestAppo": "أقرب موعد", + "searchByDocText": "اكتب اسم الطبيب لمساعدتك في العثور عليه", + "enterDocName": "أدخل اسم الطبيب", + "search": "بحث", + "noResultFound": "لم يتم العثور على نتائج", + "noSearchResultFound": "لم يتم العثور على نتائج", + "pleaseEnterProductName": "يرجى إدخال اسم المنتج", + "bookNow": "احجز الآن", + "docInfo": "معلومات الطبيب", + "appoInfo": "معلومات الموعد", + "availableAppo": "المواعيد المتاحة", + "gender": "الجنس", + "nationality": "الجنسية", + "neverWait": "لا تنتظر في الطابور أبدًا", + "reminderTitle": "لديك موعد مع الدكتور.", + "appointmentCalendar": "هل ترغب في تعيين تذكير لهذا الموعد في التقويم الخاص بك؟", + "appointmentSuccess": "تم حجز الموعد بنجاح", + "docQualifications": "مؤهلات الطبيب", + "pressAgain": "اضغط مرة أخرى للخروج من التطبيق", + "laserMaxLimitReach": "الحد الأقصى هو 90 دقيقة", + "confirmAppoHeading": "يرجى مراجعة موعدك", + "patientInfo": "معلومات المريض", + "doctorFilter": "سيتم تصفية الأطباء بناءً على جنسك وعمرك", + "bookSuccess": "تم الحجز بنجاح", + "patientShare": "نسبة المريض", + "patientShareWithTax": "نسبة المريض مع الضريبة", + "confirmAppo": "تأكيد الموعد", + "confirmLiveCare": "تأكيد ال لايف كير", + "waitingForDoctor": "في انتظار الطبيب", + "appointment": "موعد", + "confirmLater": "تأكيد لاحقًا", + "todoList": "قائمة المهام", + "appoActions": "إجراءات الموعد", + "date": "التاريخ", + "time": "الوقت", + "pendingPayment": "معلق للدفع", + "payNow": "ادفع الآن", + "viewQR": "عرض رمز الاستجابة السريعة", + "instruction": "تعليمات", + "livecare": "لايف كير", + "livecareAppo": "موعد لايف كير", + "agreeTo": "أوافق على", + "termsConditoins": "الشروط والأحكام", + "cancelAppoMsg": "هل أنت متأكد أنك تريد إلغاء هذا الموعد؟", + "changePayment": "تغيير طريقة الدفع", + "upcomingNoAction": "لا يتطلب أي إجراء", + "upcomingConfirm": "يرجى تأكيد الموعد لتجنب الإلغاء", + "bookSuccessConfirmMore2412": "ستكون عملية الدفع عبر الإنترنت متاحة قبل 24 ساعة ��ن الموعد.", + "upcomingPaymentPending": "سيتم تفعيل الدفع عبر الإنترنت قبل 24 ساعة من موعد الموعد", + "upcomingPaymentNow": "ادفع عبر الإنترنت الآن لتجنب الانتظار الطويل", + "upcomingQR": "استخدم رمز الاستجابة السريعة لتسجيل الوصول في المستشفى", + "upcomingVirtual": "هذا موعد افتراضي، يرجى الالتزام بالتعليمات لتجربة سلسة.", + "upcomingLivecare": "هذا موعد لايف كير", + "upcomingDetails": "المزيد من التفاصيل", + "reschedule": "إعادة جدولة", + "raise": "رفع", + "complaint": "شكوى", + "add": "إضافة", + "reminder": "تذكير", + "location": "المواقع", + "online": "عبر الإنترنت", + "payment": "الدفع", + "onlinePayment": "عبر الإنترنت", + "onlinePaymentSubtitle": "الدفع", + "cancelNocaps": "إلغاء", + "setReminder": "ضبط تذكير", + "nationalIdNumber": "رقم الهوية الوطنية", + "medicalFileNumber": "رقم الملف الطبي", + "loginregister": "تسجيل الدخول / التسجيل", + "poweredBy": "مدعوم من", + "welcome": "مرحبًا", + "welcomeToDrSulaiman": "مرحباً بكم في مجموعة الدكتور سليمان الحبيب الطبية", + "patientApp": "تطبيق المريض", + "welcomeText": "تطبيق الدكتور سليمان الحبيب للهاتف المحمول", + "drSulaimanText": "الدكتور سليمان الحبيب", + "welcomeText2": "هل زرت مستشفيات أو مراكز الدكتور سليمان الحبيب من قبل؟", + "yes": "نعم", + "no": "لا", + "logintyperadio": "اختر من الخيارات أدناه لتسجيل الدخول إلى ملفك الطبي.", + "registernow": "سجل الآن", + "nationalID": "أدخل رقم الهوية", + "nationalId": "الهوية الوطنية", + "fileNo": "رقم الملف", + "fileno": "رقم الملف", + "forgotFileNo": "نسيت رقم الملف؟", + "forgotFileNoTitle": "نسيت الملف الطبي", + "enterNationalId": "يرجى إدخال رقم الهاتف المحمول ورقم الهوية", + "profileInfo": "يرجى إدخال معلومات الملف الشخصي", + "submit": "إرسال", + "forgotDesc": "أدخل رقم الهاتف المحمول لاستلام رقم الملف الطبي عبر الرسائل القصيرة", + "dob": "تاريخ الميلاد:", + "hijriDate": "الت��ريخ الهجري", + "gregorianDate": "التاريخ الميلادي", + "verifyLoginWith": "يرجى اختيار واحدة من الخيارات التالية للتحقق", + "registerUser": "تسجيل", + "verifyWithFingerprint": "البيومترية", + "verifyWithFaceid": "معرف الوجه", + "verifyWithSms": "رسالة قصيرة", + "verifyWithWhatsapp": "واتساب", + "verifyThrough": "التحقق من خلال", + "lastLogin": "آخر تسجيل دخول في:", + "lastLoginWith": "نوع التحقق:", + "verifyFingerprint": "لتفعيل خدمة تسجيل الدخول ببصمة الإصبع، يرجى التحقق من البيانات باستخدام واحدة من الخيارات التالية.", + "searchMedicine": "ابحث عن دواء", + "pharmaciesList": "قائمة الصيدليات", + "searchMedicineHere": "ابحث عن دواء هنا", + "description": "الوصف", + "howToUse": "كيفية الاستخدام", + "price": "السعر", + "youCanFindItIn": "يمكنك العثور عليه في", + "pleaseEnterMedicineName": "يرجى إدخال اسم الدواء", + "verificationMessage": "يرجى إدخال رمز التحقق المرسل إلى", + "validationMessage": "ينتهي رمز التحقق في", + "notification": "الإشعارات", + "appSettings": "إعدادات التطبيق", + "rateApp": "قيم تطبيقنا", + "before": "قبل", + "minute": "دقائق", + "hour": "ساعة", + "reminderSuccess": "تمت إضافة التذكير بنجاح", + "reminderCancelSuccess": "تم إلغاء التذكير بنجاح", + "patientShareToDo": "المبلغ قبل الضريبة: ", + "patientTaxToDo": "قيمة الضريبة: ", + "patientShareTotalToDo": "إجمالي المبلغ المستحق: ", + "paymentMethod": "طريقة الدفع", + "noNeedToWaitInLine": "لا حاجة للانتظار في الطابور.", + "useQRAppoAttend": "استخدم رمز الاستجابة السريعة لتسجيل حضور الموعد.", + "passQRAppoAttend": "مرر رمز الاستجابة السريعة عبر أجهزة الحضور المتاحة في المستشفى.", + "sitWaitingQR": "اجلس في غرف الانتظار حتى يتم استدعاؤك من قبل الممرضة.", + "attendRegisterCode": "رمز تسجيل الحضور", + "scanQRHospital": "توجّه إلى لوحة تسجيل الوصول الإلكتروني في المستشفى، وقم بالمسح عبر تقنية NFC أو رمز الاستجابة السريعة (QR) لإتمام تسجيل الوصول.", + "scanNFC": "امسح NFC لتسجيل الوصول", + "sendEmail": "إرسال بريد إلكتروني", + "success": "تم بنجاح", + "emailSentSuccessfully": "تم إرسال البريد الإلكتروني بنجاح", + "emailSentError": "خطأ في إرسال البريد الإلكتروني", + "close": "إغلاق", + "closeIt": "أغلق", + "booked": "محجوز", + "confirmed": "مؤكد", + "arrived": "وصل", + "payNowBookSuccess": "ادفع الآن عبر تطبيق الحبيب", + "payNowBookSuccesstext1": "ادفع الآن باستخدام خدمة الدفع عبر الإنترنت من بوابات الدفع الآمنة", + "payNowBookSuccesstext2": "يمكنك أيضًا الدفع لاحقًا عبر الدفع الإلكتروني أو في المستشفى.", + "payLater": "ادفع لاحقًا", + "askDocNotAllowed": "هذه الخدمة ستكون متاحة فقط لزيارة الطبيب قبل 15 يومًا", + "moreVerify": "خيارات تحقق إضافية", + "welcomeBack": "مرحبًا بعودتك!", + "accountInfo": "هل ترغب في تسجيل الدخول باستخدام اسم المستخدم الحالي؟", + "anotherAcc": "استخدم حسابًا آخر", + "next": "التالي", + "firstName": "الاسم الأول", + "middleName": "اسم الأب", + "lastName": "اسم العائلة", + "female": "أنثى", + "male": "ذكر", + "preferredLanguage": "اللغة المفضلة *", + "locationsRegister": "أين ترغب في إنشاء هذا الملف؟", + "ksa": "السعودية", + "dubai": "دبي", + "enterEmail": "يرجى إدخال البريد الإلكتروني", + "family": "عائلتي", + "familyTitle": "ملفات عائلتي", + "myFamily": "عائلتي", + "addNewMember": "إضافة فرد جديد للعائلة", + "sentRequests": "الطلبات المرسلة", + "recievedRequests": "الطلبات المستلمة", + "manageFiles": "إدارة ملفات العائلة", + "oxygenation": "تشبع الأكسجين", + "bodyMeasurements": "مؤشر كتلة الجسم", + "temperature": "درجة الحرارة", + "pulse": "النبض", + "respiration": "التنفس", + "bloodPressure": "ضغط الدم", + "painScale": "مقياس الألم", + "weight": "الوزن", + "height": "الطول", + "heart": "معدل ضربات القلب", + "heightUnit": "وحدة الطول", + "weightUnit": "وحدة الوزن", + "unit": "الوحدة", + "request": "طلب", + "memberName": "اسم العضو", + "switchLogin": "تبديل", + "removeMember": "إزالة", + "allowView": "السماح", + "rejectView": "رفض", + "deleteView": "حذف", + "approvals": "الموافقات", + "approvalNo": "رقم الموافقة:", + "companyName": "اسم الشركة:", + "receiptOn": "الإيصال على:", + "expiryDate": "تاريخ الانتهاء:", + "expiryPoints": "منتهي الصلاحية", + "expiryOn": "ينتهي في:", + "procedureName": "اسم الإجراء:", + "procedure": "الإجراء", + "procedureStatus": "حالة الإجراء: ", + "usageStatus": "حالة الاستخدام", + "unusedCount": "عدد غير المستخدم:", + "totalApproval": "إجمالي الموافقة غير المستخدمة", + "category": "الفئة: ", + "expirationDate": "تاريخ انتهاء الصلاحية: ", + "patientCard": "رقم بطاقة المريض: ", + "policyNumber": "رقم الوثيقة: ", + "seeDetails": "عرض التفاصيل", + "insuranceCards": "بطاقات التأمين", + "requestType": "نوع الطلب", + "registerInfoFamily": "كيف تود إضافة عضو جديد؟", + "removeFamilyMember": "هل تريد إزالة هذا العضو؟", + "myMedicalFile": "ملفي الطبي", + "myMedicalFileSubTitle": "جميع سجلاتك الطبية", + "viewMore": "عرض المزيد", + "homeHealthCareService": "خدمة الرعاية الصحية المنزلية", + "onlinePharmacy": "الصيدلية الإلكترونية", + "emergencyService": "خدمة الطوارئ", + "onlinePaymentService": "خدمة الدفع عبر الإنترنت", + "offersAndPackages": "طلب تحويل عبر الإنترنت", + "comprehensiveMedicalCheckup": "فحص طبي شامل", + "hmgService": "خدمة HMG", + "viewAllHabibMedicalService": "عرض جميع خدمات الحبيب الطبية", + "viewAll": "عرض الكل", + "view": "عرض", + "contactUs": "اتصل بنا", + "contactUsLocation": "ص.ب: 91877 - الرياض 11643، طريق الملك فهد - العليا - المملكة العربية السعودية", + "contactUsTime": "السبت - الأربعاء 8:00 صباحًا - 10 مساءً، الخميس 8:00 صباحًا- 8:00 مساءً، الجمعة 2:00 مساءً - 8:00 مساءً", + "viewAllWaysReachUs": "عرض جميع طرق التواصل معنا", + "medicalProfile": "الملف الطبي", + "consultation": "استشارة", + "logs": "السجلات", + "textToSpeech": "كيف يمكنني مساعدتك؟", + "locationDialogMessage": "السماح لتطبيق HMG بالوصول إلى موقعك سيساعدك في عرض المستشفيات الأقرب إليك.", + "userViewRequester": "يريد المستخدم عرض ملفك الطبي", + "userView": "يمكن للمستخدم عرض ملفك الطبي", + "parking": "موقف السيارات", + "alhabiServices": "خدمة HMG", + "parkingTitle": "خدمة السيارة، خدمة السيارة، خدمة لحفظ معلومات الموقف، العودة إليها لاحقًا، 1- من خلال النقر على (قراءة الرمز)، حفظ بيانات الموقف. 2- من خلال النقر على زر (عرض موقف سيارتي)، يظهر لك موقع السيارة في خرائط Google. 3- قراءة موضع آخر بالضغط على زر مسح بيانات الموضع.", + "parkingDescription": "خدمة المواقف هي لك لمسح موقع السيارة حتى تتمكن من العثور عليها بسهولة عند مغادرتك. انقر على زر (مسح الموقف) لحفظ موقع الموقف، ثم سيظهر زر (عرض موقفي) لإظهار الطريق إلى الموقف. إذا كنت ترغب في إعادة مسح موقف السيارة QR فقط انقر على (مسح بياناتي).", + "appointments": "المواعيد", + "all2": "الكل", + "checkinOption": "تسجيل الوصول", + "readBarcode": "قراءة الكود", + "showMyPark": "عرض الموقف", + "clearMyData": "امسح البيانات", + "floor": "الطابق:", + "gate": "البوابة:", + "building": "المبنى:", + "branch": "الفرع:", + "emergencyServices": "خدمات الطوارئ", + "nearester": "أقرب طوارئ", + "locationa": "الموقع", + "callNow": "اتصل الآن", + "ambulancerequest": "طلب إسعاف", + "requestA": "طلب", + "noBookedAppointments": "لا توجد مواعيد محجوزة", + "noConfirmedAppointments": "لا توجد مواعيد مؤكدة", + "noArrivedAppointments": "لا توجد مواعيد تم تسجيل الوصول إليها", + "myAppointmentsList": "المواعيد", + "myAppointments": "مواعيدي", + "radiology": "الأشعة", + "radiologySubtitle": "النتيجة", + "lab": "المختبر", + "labSubtitle": "النتائج", + "medicines": "الأدوية", + "medicinesSubtitle": "الوصفات", + "vitalSigns": "علامات حيوية", + "vitalSignsSubTitle": "التقارير", + "myMedical": "نشط", + "myMedicalSubtitle": "الأدوية", + "myDoctor": "طبيبي", + "myDoctorSubtitle": "القائمة", + "eye": "العين", + "eyeSubtitle": "القياس", + "insurance": "التأمين", + "insuranceSubtitle": "البطاقة", + "updateInsurance": "تحديث", + "updateInsuranceSubtitle": "التأمين", + "insuranceApproval": "التأمين", + "insuranceApprovalSubtitle": "الموافقات", + "allergies": "الحساسية", + "allergiesSubtitle": "القائمة", + "myVaccines": "لقاحاتي", + "myVaccinesSubtitle": "القائمة", + "medical": "طبي", + "medicalSubtitle": "التقرير", + "monthly": "شهري", + "monthlySubtitle": "التقرير", + "sick": "مريض", + "sickSubtitle": "الإجازات", + "myBalance": "رصيدي", + "myBalanceSubtitle": "الرصيد", + "patientCall": "مكالمة المريض", + "patientCallSubtitle": "الخدمة", + "smartWatches": "الساعات الذكية", + "smartWatchesSubtitle": "الاقتران", + "myTrackers": "متعقباتي", + "myTrackersSubtitle": "الخدمة", + "askYour": "اسأل", + "askYourSubtitle": "طبيبك", + "internet": "الإنترنت", + "internetSubtitle": "الاقتران", + "chatbot": "الدرد��ة الآلية", + "chatbotSubtitle": "", + "timeLine": "الخط الزمني", + "labOrders": "طلبات المختبر", + "billNo": "رقم الفاتورة:", + "prescriptions": "الوصفات", + "history": "التاريخ", + "orderNo": "رقم الطلب", + "orderDetails": "تفاصيل الطلب", + "deliveryDriverTrack": "تتبع السائق", + "deliveryLocation": "موقع التسليم", + "driver": "السائق", + "vitalSign": "علامة حيوية", + "monthlyReports": "تقارير شهرية", + "km": "كم:", + "km_": "كم", + "patientHealthSummaryReport": "تقرير ملخص صحة المريض", + "toViewTheTermsAndConditions": "لعرض الشروط والأحكام", + "clickHere": "انقر هنا", + "iAgreeToTheTermsAndConditions": "أوافق على الشروط والأحكام ", + "iAgreeToTheTermsAndConditionsSubtitle": "أوافق على الشروط والأحكام ", + "save": "حفظ", + "userAgreement": "اتفاقية المستخدم", + "updateSuccessfully": "تم التحديث بنجاح", + "checkVaccineAvailability": "تحقق من توفر اللقاح", + "myVaccinesAvailability": "توفر اللقاحات الخاصة بي", + "paymentService": "خدمة الدفع", + "paymentOnline": "الخدمة", + "onlineCheckIn": "تسجيل الوصول عبر الإنترنت", + "myBalances": "رصيدي", + "myWallet": "محف��تي", + "balanceAmount": "مبلغ المحفظة", + "totalBalance": "إجمالي الرصيد", + "createAdvancedPayment": "إعادة شحن المحفظة", + "advancePayment": "دفع مسبق", + "advancePaymentLabel": "يمكنك إنشاء وإضافة دفعة مقدمة لحسابك أو حسابات أخرى.", + "fileNumber": "رقم الملف", + "amount": "المبلغ *", + "depositorEmail": "البريد الإلكتروني للودائع *", + "notes": "ملاحظات", + "selectPatientName": "اختر اسم المريض", + "selectFamilyPatientName": "أفراد العائلة", + "selectHospital": "اختر المستشفى", + "selectCity": "اختر المدينة", + "city": "المدينة", + "distance": "المسافة", + "myAccount": "حسابي", + "otherAccount": "حساب آخر", + "selectBeneficiary": "اختر المستفيد", + "confirmThePayment": "تأكيد الدفع", + "depositorName": "اسم مُقدِّم الإيداع", + "mobileNumber": "رقم الجوال", + "phoneNumber": "رقم الهاتف", + "country": "البلد", + "ok": "حسنا", + "averageWaitingTime": "متوسط وقت الانتظار:", + "waitingTime": "وقت الانتظار المتوقع:", + "waterConsumedInWeek": "الماء المستهلك في أسبوع", + "waterConsumedInMonth": "الماء المستهلك في شهر", + "theVerificationCodeExpiresIn": "ينتهي رمز التحقق في", + "pleaseEnterTheVerificationCode": "يرجى إدخال رمز التحقق المرسل إلى", + "eyeMeasurements": "قياسات العين", + "measurements": "قياسات", + "classes": "نظارات", + "contactLens": "عدسات لاصقة", + "rightEye": "العين اليمنى", + "sphere": "الكرة", + "cylinder": "الأسطوانة", + "axis": "المحور", + "prism": "الهرم", + "va": "VA", + "leftEye": "العين اليسرى", + "brand": "العلامة التجارية", + "power": "القوة", + "diameter": "القطر", + "remarks": "ملاحظات: ", + "activeMedications": "الأدوية النشطة", + "expDate": "تاريخ انتهاء الصلاحية:", + "route": "الطريق", + "frequency": "التكرار", + "dailyQuantity": "��لكمية اليومية:", + "addReminder": "إضافة تذكير", + "cancelReminder": "إلغاء التذكير", + "reminderDes": "يرجى تحديد يوم ووقت بدء العلاج ليتم إعلامك عندما يحين وقت تناول الدواء", + "pleaseSelectAllQuestionToContinue": "يرجى الإجابة على جميع الأسئلة للمتابعة...", + "startDay": "يوم البدء", + "endDay": "يوم الانتهاء", + "days": "أيام ", + "pleaseVerify": "يرجى التحقق ", + "scheduleTime": "وقت الجدولة", + "askDoctor": "اسأل الطبيب", + "doctorResponses": "ردود الطبيب", + "ne_w": "جديد", + "all": "الكل", + "dailyWater": "متابعة الماء اليومية", + "questionHere": "أدخل السؤال هنا...", + "viewDoctorResponses": "عرض ردود الطبيب", + "serviceInformationButton": "تسجيل الدخول / التسجيل", + "serviceInformationTitle": "معلومات الخدمة", + "serviceInformation": "معلومات الخدمة", + "homeHealthCare": "الرعاية الصحية المنزلية", + "noAppointmentAvailable": "لا توجد مواعيد متاحة", + "loginRegister": "تسجيل الدخول / التسجيل", + "orderLog": "سجل الطلب", + "infoLab": "تتيح لك هذه الخدمة عرض نتائج جميع الفحوصات المخبرية التي أجريت في مجموعة الحبيب الطبية بالإضافة إلى إرسال التقرير عبر البريد الإلكتروني.", + "infoRadiology": "تتيح لك هذه الخدمة عرض تقارير وصور الأشعة في مجموعة الحبيب الطبية بالإضافة إلى إرسال التقرير عبر البريد الإلكتروني.", + "noReviewsAvailable": "لا توجد تقييمات متاحة", + "noLocationAvailable": "لا توجد مواقع متاحة", + "orders": "الطلبات", + "lakum": "لكم", + "lakumMsg": "لا توجد تفاصيل عن النقاط", + "lakumPoint": "نقاط لكم", + "wishlist": "قائمة الرغبات", + "products": "المنتجات", + "reviews": "التعليقات", + "brands": "العلامات التجارية", + "productDetails": "تفاصيل المنتج", + "medicationRefill": "إعادة تعبئة الدواء", + "pillReminder": "تذكير الأدوية", + "shippingAddresses": "عناوين الشحن", + "reachUs": "تواصل معنا", + "ourLocations": "مواقعنا", + "edit": "تعديل", + "whatsApp": "واتساب", + "phone": "الهاتف", + "delete": "حذف", + "deleteAddress": "هل أنت متأكد أنك تريد الحذف", + "deletedAddres": "تم حذف العنوان", + "addAddress": "إضافة عنوان جديد", + "addNewAddress": "إضافة عنوان جديد", + "order": "طلبي", + "delivered": "تم التوصيل", + "pending": "قيد الانتظار", + "enterNameHere": "أدخل اسمك هنا", + "processing": "جاري المعالجة", + "cancelled": "ملغى", + "writeReview": "اكتب تقييمًا", + "shareReview": "شارك التقييم", + "review": " التقييمات", + "viewMedicalFile": "عرض التفاصيل", + "viewAllServices": "عرض جميع الخدمات", + "medicalFile": "الملف الطبي", + "verified": "تم التحقق", + "checkup": "فحص", + "hhcHome": "الرئيسية", + "refferal": "إحالة إلكترونية", + "refferalTitle": "إحالة إلكترونية", + "refferalSubTitle": "الخدمة", + "healthCare": "الرعاية الصحية", + "emergency": "حالة طوارئ", + "erservices": "خدمات الطوارئ", + "services2": "الخدمات", + "cantSeeProfile": "لرؤية ملفك الطبي، يرجى تسجيل الدخول أو التسجيل الآن", + "loginRegisterNow": "تسجيل الدخول أو التسجيل الآن", + "hmgPharmacy": "صيدلية مجموعة الحبيب الطبية", + "ecommerceSolution": "حلول التجارة الإلكترونية", + "comprehensive": "شامل", + "onlineConsulting": "استشارات عبر الإنترنت", + "pendingOrder": " قيد الانتظار", + "deliveredOrder": " تم التوصيل", + "processingOrder": " جارٍ المعالجة", + "cancelledOrder": " ملغى", + "compare": " قارن", + "medicationsRefill": " إعادة تعبئة الأدوية", + "recommended": " موصى به لك", + "myPrescription": " وصفتي", + "quantity": " الكمية ", + "reviewAppointment": " مراجعة الموعد ", + "backMyAccount": "العودة إلى حسابي ", + "reviewSuccessful": "تمت مراجعة الطلب بنجاح", + "reviewShared": "تمت مشاركة تقييمك في قسم تقييم المنتج", + "reviewComment": "تساعد تقييماتك الآخرين على اختيار منتج أفضل", + "shippedMethod": "الشحن بواسطة:", + "orderDetail": "تفاصيل الطلب", + "orderSummary": "ملخص الطلب", + "subtotal": "المجموع الفرعي", + "shipping": "الشحن", + "shipBy": "الشحن بواسطة:", + "lakumPoints": "نقاط لكم", + "useLakumPoints": "استخدم نقاط لكم", + "use": "استخدم", + "proceedPay": "المتابعة للدفع", + "vat": "ضريبة القيمة المضافة (15%)", + "inclusiveVat": "(شاملة ضريبة القيمة المضافة)", + "items": "عنصر(عناصر)", + "checkOut": "الدفع", + "sar": "ريال سعودي", + "aed": "درهم إماراتي", + "payOnline": "الدفع عبر الإنترنت", + "cancelOrder": "إلغاء الطلب", + "confirmAddress": "تأكيد العنوان ", + "confirmLocation": "أكد الموقع ", + "conditionsHMG": "الشروط والأحكام ", + "conditions": "الشروط والأحكام لكوم", + "confirmDeleteMsg": "هل أنت متأكد! تريد الحذف ", + "confirmDelete": "حذف", + "confirmCancellation": "هل أنت متأكد! تريد إلغاء هذا الطلب ", + "orderNumber": "رقم الطلب: ", + "orderDate": "التاريخ", + "itemsNo": "عنصر(عناصر)", + "noOrder": "ليس لديك أي طلبات.", + "noResult": "لا توجد نتيجة.", + "nonRecommended": "لا توجد منتجات موصى بها.", + "termsService": "شروط الخدمة", + "beforeusing": "قبل استخدام الفحص، يرجى قراءة شروط الخدمة.", + "accept": "أقرأ وأقبل شروط الخدمة وسياسة الخصوصية", + "dataSafeInfo": "المعلومات التي تقدمها مجهولة الهوية وليست مشتركة مع أي شخص.", + "dataSafe": " بياناتك آمنة.", + "informational": "الفحص لأغراض معلوماتية وليس رأيًا طبيًا مؤهلاً", + "notUseInEmerbency": "لا تستخدم في حالات الطوارئ.", + "notUseInEmerbencyDetails": "في حالة الطوارئ الصحية، ", + "notUseInEmerbencyDetailsCall": "اتصل بأقرب رقم طوارئ على الفور", + "checkDiagnosis": "الفحص ليس تشخيصًا.", + "remeberthat": "تذكر أن", + "loginToUseService": "تحتاج إلى تسجيل الدخول لاستخدام هذه الخدمة", + "offersAndPromotions": "عروض وترويجيات خاصة", + "offers": "عروض", + "myPrescriptions": "وصفاتي", + "searchAndScanMedication": "البحث والمسح الضوئي للدواء", + "shopByBrands": "تسوق حسب العلامات التجارية", + "recentlyViewed": "تمت مشاهدته مؤخرًا", + "bestSellers": "الأكثر مبيعًا", + "deleteAllItems": "حذف جميع العناصر", + "total": "الإجمالي", + "totalWithColonRight": "الإجمالي:", + "selectAddress": "اختر العنوان", + "shippingAddress": "عنوان الشحن", + "changeAddress": "تغيير العنوان", + "selectPaymentOption": "اختر طريقة الدفع", + "selectTamaraPlan": "اختر خطة دفع تمارا", + "changeMethod": "تغيير الطريقة", + "reviewOrder": "مراجعة الطلب", + "active": "نشط", + "inactive": "غير نشط", + "balance": "الرصيد", + "gained": "المكتسب", + "consumed": "المستهلك", + "transferred": "المحول", + "riyal": "ريال", + "membersince": "عضو منذ", + "identification": "رقم الهوية", + "lakumMobile": "رقم الجوال", + "waitinggained": "انتظار المكتسب", + "expired": "منتهي", + "willBeExpired": "سينتهي", + "activateLAKUMAccount": "تفعيل حساب لكم", + "checkBeneficiary": "تحقق من المستفيد", + "beneficiaryName": "اسم المستفيد", + "accountActivation": "تفعيل الحساب", + "lakumTransfer": "تحويل لكم", + "acceptLbl": "قبول", + "declineLbl": "رفض", + "selectGender": "اختر الجنس", + "iAmA": "أنا ...", + "selectAge": "اختر عمرك", + "select": "اختر", + "iAm": "أنا", + "yearsOld": "سنوات", + "dragPoint": "اسحب النقطة لتغيير عمرك", + "refine": "تنقيح", + "subGroup": "مجموعة فرعية", + "max": "الحد الأقصى", + "compeleteOrderMsg": "تم تقديم الطلب بنجاح!!", + "addToCompareMsg": "لقد أضفت منتجًا إلى قائمة المقارنة", + "itInListMsg": "العنصر موجود بالفعل في القائمة", + "compareListFull": "قائمة المقارنة ممتلئة", + "addQuantity": "يجب عليك إضافة الكمية", + "addToCartMsg": "لقد أضفت منتجًا إلى عربة التسوق", + "addToWishlistMsg": "لقد أضفت منتجًا إلى قائمة الرغبات", + "notifyMeMsg": "سوف يتم إبلاغك عند توفر المنتج", + "removeFromWishlistMsg": "لقد أزلت منتجًا من قائمة الرغبات", + "min": "الحد الأدنى", + "reset": "إعادة تعيين", + "apply": "تطبيق", + "viewCategorise": "عرض جميع الفئات", + "viewSubCategorise": "عرض جميع الفئات الفرعية", + "categorise": "الفئات", + "wishList": "قائمة الرغبات", + "cart": "عربة التسوق", + "alhabibapp": "تطبيق الحبيب", + "searchProductHere": "ابحث عن المنتج هنا", + "hhcNotAuthMsg": "تقدم هذه الخدمة مجموعة من خدمات الرعاية الصحية المنزلية، والمتابعة المستمرة والشاملة في أماكن إقامتهم لأولئك الذين لا يمكنهم الوصول إلى المرافق الصحية، مثل (تحليلات المختبر - الأشعة - التطعيمات - العلاج الطبيعي)، إلخ.", + "email": "البريد الإلكتروني *", + "book": "احجز", + "appointmentLabel": "موعد", + "bloodType": "فصيلة الدم", + "maritalStatus": "الحالة الاجتماعية", + "general": "عام", + "profile": "ملفي", + "notifications": "إشعارات", + "notificationDetails": "تفاصيل الإشعار", + "notificationDetailsa": "تفاصيل الإشعار", + "infoMyDoctorPoints": "", + "infoMyDoctor": "تتيح لك هذه الخدمة رؤية جميع الأطباء الذين زرتهم في مجموعة الحبيب الطبية، ومن خلال هذه الخدمة:", + "infoPrescriptions": "تتيح لك هذه الخدمة عرض جميع الوصفات الطبية التي أصدرتها مجموعة الحبيب الطبية، ومن خلال هذه الخدمة، يمكنك:", + "infoMyPrescriptionPoints": "", + "infoInsuranceCards": "تتيح لك هذه الخدمة عرض جميع بطاقات التأمين التي تم تسجيلها خلال زياراتك لمجموعة الحبيب الطبية بالإضافة إلى:", + "infoInsuranceCardsPoints": "", + "infoAllergies": "تتيح لك هذه الخدمة عرض جميع أنواع الحساسية المسجلة خلال زياراتك لمجموعة الحبيب الطبية.", + "infoSickLeaves": "تتيح لك هذه الخدمة عرض جميع الاجازات المرضيه التي تم أخذها في مجموعة الحبيب الطبية بالإضافة إلى:", + "infoSickLeavePoints": "", + "infoApprovals": "تتيح لك هذه الخدمة عرض جميع طلبات الموافقة التي تم إرسالها إلى شركات التأمين بالإضافة إلى:", + "infoApprovalPoints": "", + "infoMonthReport": "عند تفعيل هذه الخدمة، سيقوم النظام بإرسال تقرير شهري تلقائيًا إلى البريد الإلكتروني المسجل يتضمن العلامات الحيوية والنتائج لآخر الزيارات التي تمت في مجموعة الحبيب الطبية.", + "languageSetting": "الرسائل القصيرة، واتساب، لغة مكالمات التأكيد", + "alert": "تنبيهات", + "emailAlert": "تنبيه عبر البريد الإلكتروني", + "smsAlert": "تنبيه عبر الرسائل القصيرة", + "contactInfo": "معلومات الاتصال", + "emrgName": "اسم جهة الاتصال في حالات الطوارئ", + "emrgNo": "رقم جهة الاتصال في حالات الطوارئ", + "modes": "الأوضاع", + "vibration": "اهتزاز عند اللمس", + "blindModes": "أوضاع للمكفوفين جزئيًا", + "invertTheme": "عكس", + "offTheme": "إيقاف", + "dimTheme": "خافت", + "bwTheme": "أسود وأبيض", + "permissions": "إذن", + "cameraPermission": "الكاميرا", + "locationPermission": "الموقع", + "needPrescription": "يتطلب هذا المنتج وصفة طبية", + "outOfStockMsg": "لقد أضفت منتجًا غير متوفر حاليًا، يرجى إزالته!", + "noArabicLetters": "لا يُسمح باستخدام الحروف العربية", + "noOffersAvailable": "لا توجد عروض متاحة!", + "accessibility": "وضع الوصول", + "orderStatus": "حالة الطلب", + "findUs": "اعثر علينا", + "liveChat": "دردشة مباشرة", + "service": "خدمة", + "hmgServiceLabel": "خدمة مجموعة الحبيب الطبية", + "healthWeatherIndicators": "مؤشرات الطقس الصحية", + "healthTipsBasedOnCurrentWeather": "نصائح صحية بناءً على الطقس الحالي", + "moreDetails": "المزيد من التفاصيل", + "resendOrder": "إعادة التعبئة والتوصيل", + "ports": "المنافذ", + "way": "الطريقة", + "dailyDoses": "الجرعات اليومية", + "period": "الفترة", + "duration": "المدة", + "cm": "سم", + "ft": "قدم", + "kg": "كجم", + "lb": "رطل", + "birthDate": "تاريخ الميلاد", + "dateOfBirth": "تاريخ الميلاد", + "mass": "الكتلة", + "tempC": "°م", + "bpm": "نبضة في الدقيقة", + "respirationSigns": "التنفس", + "sysDias": "SBP/DBP", + "body": "مؤشر كتلة الجسم", + "bodyString": "الجسم", + "face": "وجه", + "retouch": "روتوش", + "bikini": "بيكيني", + "totalMinutes": "إجمالي الدقائق", + "feedback": "ملاحظات", + "likeToHear": "نود سماع ملاحظاتك، ومخاوفك بشأن خدمات الرعاية الصحية وتجربة الخدمات الإلكترونية. يرجى استخدام النموذج أدناه", + "emptySubject": "يرجى إدخال الموضوع", + "emptyMessage": "يرجى إدخال الرسالة", + "selectAttachment": "اختر المرفق", + "complainAppo": "شكوى بخصوص الموعد", + "complainAppoAlt": "شكوى بدون موعد", + "messageType": "نوع الرسالة", + "feedbackType": "نوع الملاحظات", + "compliment": "تقدير", + "suggestion": "اقتراح", + "yourFeedback": "تم إرسال ملاحظاتك", + "selectPart": "يرجى اختيار الجزء الذي تشتكي منه", + "number": "رقم", + "notClassified": "غير مصنف", + "selectClinic": "اختر العيادة", + "selectProject": "اختر المستشفى", + "searchItemError": "يجب أن يكون اسم العنصر أكثر من 3 أحرف", + "youCanFind": "يمكنك العثور على ", + "itemInSearch": " عنصر في البحث", + "bloodDonation": "التبرع بالدم", + "bloodDonationInfo": "من خلال هذه الخدمة، يمكنك تسجيل اسمك كمتبرع بالدم حيث سيتواصل معك بنك الدم في مجموعة الحبيب الطبية في حالة الحاجة إلى فصيلة الدم.", + "bloodInstruction": "أدخل المعلومات المطلوبة، من أجل التسجيل في خدمة التبرع بالدم", + "viewTerms": "لعرض الشروط والأحكام", + "wantConnectHmgNetwork": "عزيزي العميل، لا يوجد وصول إلى الإنترنت، هل ترغب في الاتصال بشبكة مجموعة الحبيب الطبية لاستخدام تطبيقنا، تأكد من أنك في نطاق شبكة مجموعة الحبيب الطبية", + "failedToAccessHmgServices": "متصل بشبكة مجموعة الحبيب الطبية،\n\nلكن فشل في الوصول إلى خدمات مجموعة الحبيب الطبية", + "offerAndPackages": "عروض وباقات", + "offerAndPackagesDetails": "تتيح لك هذه الخدمة عرض جميع عروض مجموعة الحبيب الطبية:", + "invoiceNo": "رقم الفاتورة", + "invoiceDate": "تاريخ الفاتورة", + "specialResult": "نتيجة خاصة", + "generalResult": "نتيجة عامة", + "showMoreBtn": "مخطط التدفق", + "value": "القيمة", + "report": "تقرير الأشعة", + "openRad": "فتح الصورة", + "sendCopy": "إرسال التقرير عبر البريد الإلكتروني", + "appoSurvey": "استطلاع", + "appoSurveySubtitle": "استطلاع", + "labResults": "نتائج المختبر", + "doctorRating": "تقييم الطبيب", + "good": "جيد", + "vGood": "جيد جدًا", + "excellent": "ممتاز", + "average": "متوسط", + "infoSigns": "تتيح لك هذه الخدمة عرض جميع العلامات الحيوية التي تم قياسها في مجموعة الحبيب الطبية، مثل (الطول، الوزن، مؤشر كتلة الجسم، معدل ضربات القلب، إلخ.) بالإضافة إلى عرض بعض الرسوم البيانية الإحصائية.", + "infoAdvancePayment": "تم تصميم هذه الخدمة بحيث يمكنك إيداع مبلغ مقدم إما في حسابك أو في حساب شخص آخر، في مجموعة الحبيب الطبية.", + "infoMyBalance": "تتيح لك هذه الخدمة التحقق من رصيدك في جميع الفروع", + "erContant": "تظهر هذه الخدمة أقرب فرع من بين جميع فروع مجموعة الحبيب الطبية بناءً على موقعك الحالي.", + "infoAmbulance": "من خلال هذه الخدمة، يمكنك طلب الإخلاء بواسطة سيارة إسعاف، سواء من المنزل أو إلى المنزل، بالإضافة إلى مجموعة من الخدمات الأخرى", + "infoMyAppointments": "تتيح لك هذه الخدمة رؤية جميع المواعيد التي زرتها في مجموعة الحبيب الطبية، ومن خلال هذه الخدمة:", + "infoTodo": "تم تصميم هذه الخدمة لتمكينك من الحصول على رابط سريع لقائمة المهام التي تحتاج القيام بها", + "familyInfo": "من خلال هذه الخدمة، ستتمكن من ربط ملفات عائلتك الطبية بملفك الطبي حتى تتمكن من إدارة سجلاتهم عن طريق تسجيل الدخول إلى ملفك الطبي.", + "rrtdDetails": "تقدم فريق الاستجابة السريعة خدمة طبية شاملة لجميع أنواع الحالات العاجلة والمستقرة من جميع الأعمار، بما في ذلك البالغين والمرضى الأطفال، وتغطي الخدمة فريق طبي مدرب تدريبًا عاليًا ومجهز تجهيزًا كاملاً قادرًا على تقديم أفضل رعاية طبية في منزل المريض.", + "homeHealthCareText": "تقدم هذه الخدمة مجموعة من خدمات الرعاية الصحية المنزلية، والمتابعة المستمرة والشاملة في أماكن إقامتهم لأولئك الذين لا يمكنهم الوصول إلى المرافق الصحية، مثل (تحليلات المختبر - الأشعة - التطعيمات - العلاج الطبيعي)، إلخ.", + "onlineCheckInAgreement": "تسجيل الوصول عبر الإنترنت مخصص للحالات التي لا تهدد الحياة. اتصل بالهلال الأحمر (997) أو اذهب إلى أقرب قسم طوارئ إذا كان هناك: \n\nعلامات السكتة الدماغية أو النوبة القلبية \nhالة من النوبات أو الإغماء \nهناك إصابة تهدد الطرف أو الحياة \nصورة لإصابات خطيرة", + "infoEreferral": "تتيح لك هذه الخدمة تقديم طلب إحالة من أي مقدم رعاية صحية سواء داخل أو خارج المملكة العربية السعودية إلى أي من مستشفيات HMG، عن طريق ملء بعض بيانات المريض وإرفاق التقارير الطبية، علاوة على ذلك يمكنك تتبع حالة الطلب (قيد المعالجة، مقبول أو مرفوض)", + "erConsultation": "تتيح لك هذه الخدمة إجراء استشارة افتراضية عبر الإنترنت عبر مكالمة فيديو مباشرة مع الطبيب من أي مكان وفي أي وقت.", + "myInvoice": "القائمة", + "invoiceList": "فواتيري", + "allInvoices": "كل الفواتير", + "hospitals": "المستشفيات", + "clinics": "العيادات", + "doctors": "الأطباء", + "selectDoctor": "اختر الطبيب", + "thisItemIsNotAvailable": "هذا العنصر غير متوفر", + "beforeAfterImages": "صور قبل وبعد", + "clinicAcceptLivecare": "لا حاجة للانتظار أو الزيارة يمكنك الآن الحصول على استشارة طبية عبر مكالمة فيديو (لايف كير) في اسم العيادة وسيتصل بك الطبيب على الفور", + "livecareModalTop": "تقبل هذه العيادة خدمات ال لايف كير", + "livecarePoint2": "سوف يتصل بك طبيب متخصص", + "livecarePoint3": "سيكون لدى الطبيب القدرة على رؤية تاريخ ملفك الطبي الكامل", + "livecarePoint4": "تتوفر خدمة توصيل الأدوية المجانية", + "livecarePoint5": "لا حاجة للزيارة، الخدمة في مكانك", + "bookImmediateLivecare": "أوافق على الحصول على الخدمة على الفور", + "bookVideoLivecare2": "لا أحتاج لزيارة العيادة", + "noThankyou": "لا شكرًا", + "visitClinic": "جدولة موعد مع الطبيب", + "generateCovidCertificate": "إصدار شهادة كوفيد-19", + "isReportOutsideKsa": "هل الشهادة مطلوبة خارج المملكة العربية السعودية؟", + "passportNumber": "رقم جواز السفر", + "enterPassportNumber": "يرجى تأكيد أو تحديث رقم جواز السفر الخاص بك:", + "validPassportNumber": "يرجى إدخال رقم جواز سفر صالح", + "continuePlan": "متابعة خطة العلاج؟", + "aboutApp": "حول التطبيق", + "dontHaveAccount": "ليس لديك حساب؟", + "loginOrRegister": "تسجيل الدخول أو التسجيل", + "myFiles": "ملفاتي", + "resultsPending": "النتائج معلقة", + "resultsAvailable": "النتائج متاحة", + "viewReport": "عرض التقرير", + "checkAvailability": "التحقق من التوفر", + "readInstructions": "قراءة التعليمات", + "searchLabReport": "ابحث عن تقرير المختبر", + "prescriptionDeliveryError": "هذه العيادة لا تدعم إعادة التعبئة والتسليم.", + "receiveOtpToast": "أين تود تلقي رمز التحقق OTP؟", + "enterPhoneNumber": "أدخل رقم الهاتف", + "enterEmailDesc": "أدخل عنوان بريدك الإلكتروني لإكمال عملية إنشاء ملف طبي", + "enterPhoneDesc": "أدخل رقم هاتفك لتلقي رمز التحقق ", + "pleaseChooseOption": "الرجاء اختيار من الخيارات أدناه لتلقي رمز التحقق OTP", + "prepareToElevate": "هل أنت مستعد لتحسين صحتك ورفاهيتك؟", + "iAcceptTermsConditions": "أوافق على الشروط والأحكام", + "alreadyHaveAccount": "هل لديك حساب بالفعل؟", + "loginNow": "تسجيل الدخول الآن", + "notice": "إشعار", + "oR": "أو", + "sendOTPWHATSAPP": "أرسل لي OTP عبر واتساب", + "sendOTPSMS": "أرسل لي OTP عبر الرسائل القصيرة", + "fullName": "الاسم الكامل", + "married": "متزوج", + "uae": "الإمارات العربية المتحدة", + "malE": "ذكر", + "loginBy": "تسجيل الدخول بواسطة", + "loginByOTP": "تسجيل الدخول بواسطة OTP", + "guest": "زائر", + "switchAccount": "تبديل الحساب", + "lastLoginBy": "آخر تسجيل دخول بواسطة", + "allSet": "جاهز! الآن يمكنك تسجيل الدخول باستخدام Face ID أو البصمة", + "enableQuickLogin": "تمكين تسجيل الدخول السريع", + "enableMsg": "تمكين تسجيل الدخول السريع سيسمح بالتحقق من خلال Face ID / Biometric الخاص بجهازك الحالي", + "notNow": "ليس الآن", + "pendingActivation": "في انتظار التنشيط", + "awaitingApproval": "انتظر القبول", + "news": "أخبار", + "ready": "جاهز", + "enterValidNationalId": "رقم الهوية أو رقم الملف غير صحيح", + "enterValidPhoneNumber": "الرجاء إدخال رقم هاتف صالح", + "cannotEnterSaudiOrUAENumber": "لا يمكنك إدخال أرقام هواتف السعودية (00966) أو الإمارات (00971) عند اختيار دولة 'أخرى'", + "medicalCentersWithCount": "{count} مراكز طبية", + "medicalCenters": "مراكز طبية", + "hospitalsWithCount": "{count} مستشفيات", + "selectRegion": "اختر المنطقة", + "selectFacility": "اختر المرافق", + "selectFacilitiesSubTitle": "يرجى اختيار المرفق للموعد", + "selectHospitalSubTitle": "يرجى اختيار المستشفى للموعد", + "iAcceptThe": "أوافق على", + "personalDetailsVerification": "التحقق من التفاصيل الشخصية", + "otpVerification": "التحقق من OTP", + "weHaveSendOTP": "لقد أرسلنا OTP إلى", + "via": "عبر", + "forRegistrationVerification": "للتحقق من التسجيل", + "didntReceiveIt": "لم تستلمه؟", + "resendOTP": "إعادة إرسال", + "resendIn": "إعادة الإرسال في", + "pleaseEnterAnationalID": "يرجى إدخال رقم الهوية الوطنية", + "pleaseEnterAFileNumber": "يرجى إدخال رقم الملف", + "pleaseEnterAValidEmail": "يرجى إدخال بريد إلكتروني صالح", + "pleaseEnterFullName": "يرجى إدخال الاسم الكامل", + "pleaseAcceptTermsConditions": "يرجى قبول الشروط والأحكام", + "pleaseEnterAValidIqamaID": "يرجى إدخال رقم إقامة صالح", + "pleaseEnterAValidNationalID": "يرجى إدخال رقم هوية وطنية صالح", + "pleaseEnterAValidDateOfBirth": "يرجى إدخال تاريخ ميلاد صالح", + "pleaseEnterAValidName": "يرجى إدخال اسم صالح", + "pleaseSelectAGender": "يرجى اختيار الجنس", + "pleaseSelectAMaritalStatus": "يرجى اختيار الحالة الاجتماعية", + "pleaseSelectACountry": "يرجى اختيار الدولة", + "pleaseEnterEmail": "يرجى إدخال البريد الإلكتروني", + "pleaseEnterAValidEmailFormat": "يرجى إدخال تنسيق بريد إلكتروني صالح", + "selectCountry": "اختر الدولة", + "forLoginVerification": "للتحقق من تسجيل الدخول", + "searchHospital": "بحث في المستشفى", + "skip": "تخطي", + "getStarted": "ابدأ الآن", + "onboardingHeading1": "حجز المواعيد لم يكن أسهل من الآن.", + "onboardingBody1": "ببضع نقرات فقط يمكنك استشارة الطبيب الذي تختاره.", + "onboardingHeading2": "الوصول إلى السجل الطبي بين يديك", + "onboardingBody2": "تتبع تاريخك الطبي بما في ذلك الفحوصات المخبرية، الوصفات الطبية، التأمين، وغيرها.", + "hmgHospitals": "مستشفيات مجموعة الحبيب الطبية", + "hmcMedicalClinic": "مراكز مجموعة الحبيب الطبية", + "applyFilter": "تطبيق الفلتر", + "facilityAndLocation": "المرفق والموقع", + "regionAndLocation": "المنطقة والمواقع", + "clearAllFilters": "مسح جميع الفلاتر", + "filters": "فلاتر", + "searchClinic": "بحث عن عيادة", + "normal": "عادي", + "attention": "انتباه", + "monitor": "مراقبة", + "noSpecialResult": "لا توجد نتائج خاصة", + "setTheDateRange": "تعيين النطاق الزمني", + "historyFlowchart": "مخطط تدفق التاريخ", + "to": "إلى", + "startDate": "تاريخ البدء", + "endDate": "تاريخ الانتهاء", + "walkin": "زيارة بدون موعد", + "laserClinic": "عيادة الليزر", + "continueString": "يكمل", + "covid_info": "تجري مستشفيات د. سليمان الحبيب فحص فيروس كورونا المستجد وتصدر شهادات السفر على مدار الساعة، طوال أيام الأسبوع، وبسرعة ودقة عالية. يمكن للراغبين في الاستفادة من هذه الخدمة زيارة أحد فروع مستشفيات د. سليمان الحبيب وإجراء فحص كورونا خلال بضع دقائق والحصول على النتائج خلال عدة ساعات خدمة فحص فيروس كورونا Covid 19 بتقنية PCR للكشف عن الفيروس وفقاً لأعلى المعايير العالمية وبأحدث أجهزة RT-PCR عالية الدقة (GeneXpert الأمريكي وغيره)، وهي طرق معتمدة من قبل هيئة الغذاء والدواء وكذلك من قبل المركز السعودي للوقاية من الأمراض المُعدية", + "appointmentDetails": "تفاصيل الموعد", + "checkingDoctorAvailability": "جاري التحقق من توفر الطبيب...", + "cancellingAppointmentPleaseWait": "جاري إلغاء الموعد، يرجى الانتظار...", + "appointmentCancelledSuccessfully": "تم إلغاء الموعد بنجاح", + "notConfirmed": "غير مؤكد", + "appointmentStatus": "حالة الموعد", + "doctorWillCallYou": "سيتصل بك الطبيب عندما يقترب موعدك.", + "getDirections": "الحصول على الاتجاهات", + "notifyMeBeforeAppointment": "أبلغني قبل الموعد", + "fetchingLabResults": "جاري جلب نتائج المختبر...", + "fetchingRadiologyResults": "جاري جلب نتائج الأشعة...", + "fetchingAppointmentPrescriptions": "جاري جلب وصفات الموعد...", + "noPrescriptionsForAppointment": "ليس لديك أي وصفات طبية لهذا الموعد.", + "amountBeforeTax": "المبلغ قبل الضريبة", + "rebookAppointment": "إعادة حجز الموعد", + "fetchingDoctorSchedulePleaseWait": "جاري جلب جدول الطبيب، يرجى الانتظار...", + "pickADate": "اختر تاريخاً", + "confirmingAppointmentPleaseWait": "جاري تأكيد الموعد، يرجى الانتظار...", + "appointmentConfirmedSuccessfully": "تم تأكيد الموعد بنجاح", + "appointmentPayment": "دفع الموعد", + "checkingPaymentStatusPleaseWait": "جاري التحقق من حالة الدفع، يرجى الانتظار...", + "paymentFailedPleaseTryAgain": "فشل الدفع! يرجى المحاولة مرة أخرى.", + "appointmentCheckIn": "تسجيل حضور الموعد", + "insuranceExpiredOrInactive": "التأمين منتهي الصلاحية أو غير نشط", + "totalAmountToPay": "المبلغ الإجمالي المستحق", + "vat15": "ضريبة القيمة المضافة 15%", + "liveCare": "لايف كير", + "recentVisits": "الزيارات الأخيرة", + "searchByClinic": "البحث حسب العيادة", + "tapToSelectClinic": "انقر لاختيار العيادة", + "searchByDoctor": "البحث حسب الطبيب", + "tapToSelect": "انقر للاختيار", + "searchByRegion": "البحث حسب المنطقة", + "centralRegion": "المنطقة الوسطى", + "immediateConsultation": "استشارة فورية", + "scheduledConsultation": "استشارة مجدولة", + "pharmaLiveCare": "لايف كير الصيدلية", + "notSureHelpMeChooseClinic": "غير متأكد؟ ساعدني في اختيار عيادة!", + "mentionYourSymptomsAndFindDoctors": "اذكر أعراضك واعثر على قائمة الأطباء وفقاً لذلك", + "immediateService": "خدمة فورية", + "noNeedToWaitGetMedicalConsultation": "لا حاجة للانتظار، ستحصل على استشارة طبية فورية عبر مكالمة فيديو", + "noVisitRequired": "لا حاجة للزيارة", + "doctorWillContact": "سيتصل بك الطبيب", + "specialisedDoctorWillContactYou": "سيتصل بك طبيب متخصص وسيكون قادراً على الاطلاع على تاريخك الطبي", + "freeMedicineDelivery": "توصيل مجاني للأدوية", + "offersFreeMedicineDelivery": "يوفر توصيل مجاني للأدوية لموعد لايف كير", + "dentalChiefComplaints": "الشكاوى الرئيسة للأسنان", + "viewAvailableAppointments": "عرض المواعيد المتاحة", + "doctorProfile": " ملف الطبيب", + "waitingAppointment": "موعد الانتظار", + "hospitalInformation": "معلومات المستشفى", + "fetchingAppointmentShare": "جاري جلب تفاصيل الموعد...", + "bookingYourAppointment": "جاري حجز موعدك...", + "selectLiveCareClinic": "اختر عيادة لايف كير", + "checkingForExistingDentalPlan": "جاري التحقق من وجود خطة أسنان حالية، يرجى الانتظار...", + "dentalTreatmentPlan": "خطة علاج الأسنان", + "youHaveExistingTreatmentPlan": "لديك خطة علاج حالية: ", + "mins": "دقيقة", + "totalTimeRequired": "إجمالي الوقت المطلوب", + "wouldYouLikeToContinue": "هل تريد متابعتها؟", + "chooseDoctor": "اختر الطبيب", + "viewNearestAppos": "عرض أقرب المواعيد المتاحة", + "noDoctorFound": "لم يتم العثور على طبيب مطابق للمعايير المحددة...", + "yesPleasImInAHurry": "نعم من فضلك، أنا في عجلة من أمري", + "fetchingFeesPleaseWait": "جاري جلب الرسوم، يرجى الانتظار...", + "noThanksPhysicalVisit": "لا، شكراً. أفضل الزيارة الشخصية", + "offline": "غير متصل", + "videoCall": "مكالمة فيديو", + "liveVideoCallWithHMGDoctors": "مكالمة فيديو مباشرة مع أطباء مجموعة الحبيب الطبية", + "liveAudioCallWithHMGDoctors": "مكالمة صوتية مباشرة مع أطباء مجموعة الحبيب الطبية", + "audioCall": "مكالمة صوتية", + "phoneCall": "مكالمة هاتفية", + "livePhoneCallWithHMGDoctors": "مكالمة هاتفية مباشرة مع أطباء مجموعة الحبيب الطبية", + "reviewLiveCareRequest": "مراجعة طلب لايف كير", + "selectedLiveCareType": "نوع لايف كير المحدد", + "selectLiveCareCallType": "اختر نوع مكالمة لايف كير", + "confirmingLiveCareRequest": "جاري تأكيد طلب لايف كير، يرجى الانتظار...", + "unknownErrorOccurred": "حدث خطأ غير معروف...", + "liveCarePermissionsMessage": "يتطلب لايف كير أذونات الكاميرا والميكروفون والموقع والإشعارات لتمكين الاستشارة الافتراضية بين المريض والطبيب، يرجى السماح بهذه الأذونات للمتابعة.", + "liveCarePayment": "دفع لايف كير", + "mada": "مدى", + "visaOrMastercard": "فيزا أو ماستركارد", + "tamara": "تمارا", + "fetchingApplePayDetails": "جاري جلب تفاصيل Apple Pay، يرجى الانتظار...", + "liveCarePendingRequest": "طلب لايف كير قيد الانتظار", + "callLiveCareSupport": "اتصل بدعم لايف كير", + "whatIsWaitingAppointment": "ما هو موعد الانتظار؟", + "waitingAppointmentsFeature": "تتيح لك ميزة مواعيد الانتظار حجز موعد أثناء تواجدك داخل مبنى المستشفى، وفي حال عدم توفر مواعيد متاحة في جدول الطبيب.", + "appointmentWithDoctorConfirmed": "الموعد مع الطبيب مؤكد، ولكن وقت الدخول غير محدد.", + "paymentWithinTenMinutes": "ملاحظة: يجب عليك الدفع خلال 10 دقائق من الحجز، وإلا سيتم إلغاء موعدك تلقائياً", + "liveLocation": "الموقع المباشر", + "verifyYourLocationAtHospital": "تحقق من موقعك في المستشفى لتسجيل الحضور", + "error": "خطأ", + "ensureWithinHospitalLocation": "يرجى التأكد من أنك داخل موقع المستشفى لإجراء تسجيل الحضور عبر الإنترنت.", + "nfcNearFieldCommunication": "NFC (الاتصال قريب المدى)", + "scanPhoneViaNFC": "امسح هاتفك عبر لوحة NFC لتسجيل الحضور", + "qrCode": "رمز QR", + "scanQRCodeToCheckIn": "امسح رمز QR بالكاميرا لتسجيل الحضور", + "processingCheckIn": "جاري معالجة تسجيل الحضور...", + "bookingWaitingAppointment": "جاري حجز موعد الانتظار، يرجى الانتظار...", + "enterValidIDorIqama": "يرجى إدخال رقم هوية وطنية أو رقم ملف صالح", + "selectAppointment": "حدد الموعد", + "rebookSameDoctor": "أعد الحجز مع نفس الطبيب", + "queueing": "قائمة الانتظار", + "inQueue": "في قائمة الانتظار", + "yourTurn": "دورك", + "halaFirstName": "هلا {firstName}!!!", + "thankYouForPatience": "شكراً لصبرك، هذا هو رقم قائمة الانتظار الخاص بك.", + "servingNow": "يُخدم الآن", + "callForVitalSigns": "نداء للعلامات الحيوية", + "callForDoctor": "نداء للطبيب", + "thingsToAskDoctor": "أشياء تسأل طبيبك عنها اليوم", + "improveOverallHealth": "ماذا يمكنني أن أفعل لتحسين صحتي العامة؟", + "routineScreenings": "هل هناك أي فحوصات روتينية يجب أن أجريها؟", + "whatIsThisMedicationFor": "لماذا هذا الدواء؟", + "sideEffectsToKnow": "هل هناك أي آثار جانبية يجب أن أعرفها؟", + "whenFollowUp": "متى يجب أن أعود للمتابعة؟", + "goToHomepage": "الذهاب إلى الصفحة الرئيسية", + "appointmentsList": "قائمة المواعيد", + "allAppt": "جميع المواعيد", + "upcoming": "القادمة", + "completed": "المكتملة", + "noAppointmentsYet": "ليس لديك أي مواعيد بعد.", + "viewProfile": "عرض الملف الشخصي", + "choosePreferredHospitalForService": "اختر المستشفى المفضل لديك للخدمة", + "noHospitalsFound": "لم يتم العثور على مستشفيات", + "cancelOrderConfirmation": "هل أنت متأكد أنك تريد إلغاء هذا الطلب؟", + "orderCancelledSuccessfully": "تم إلغاء الطلب بنجاح", + "requestID": "معرف الطلب:", + "noCMCOrdersYet": "ليس لديك أي طلبات فحص شامل بعد.", + "cmcOrders": "طلبات الفحص الشامل", + "summary": "الملخص", + "selectedService": "الخدمة المحددة", + "requestSubmittedSuccessfully": "تم إرسال طلبك بنجاح.", + "hereIsYourRequestNumber": "هذا هو رقم طلبك #: ", + "pleaseSelectHospitalToContinue": "يرجى اختيار مستشفى للمتابعة", + "confirmSubmitRequest": "هل أنت متأكد أنك تريد إرسال هذا الطلب؟", + "pendingOrderWait": "لديك طلب معلق. يرجى الانتظار حتى تتم معالجته.", + "noServicesAvailable": "لا توجد خدمات متاحة", + "selectAService": "اختر خدمة", + "comprehensiveCheckup": "الفحص الشامل", + "viewNearestHMGLocations": "عرض أقرب مواقع مجموعة الحبيب الطبية", + "provideFeedbackOnServices": "قدم ملاحظاتك على خدماتنا", + "liveChatWithHMG": "خيار الدردشة المباشرة مع مجموعة الحبيب الطبية", + "send": "إرسال", + "status": "الحالة", + "sendingFeedback": "جاري إرسال الملاحظات...", + "selectFeedbackType": "اختر نوع الملاحظات", + "loadingAppointmentsList": "جاري تحميل قائمة المواعيد...", + "noAppointmentsForFeedback": "ليس لديك أي مواعيد لتقديم ملاحظات عنها.", + "selectedAppointment": "الموعد المحدد:", + "subject": "الموضوع", + "enterSubjectHere": "أدخل الموضوع هنا", + "message": "الرسالة", + "enterMessageHere": "أدخل الرسالة هنا", + "filesSelected": "تم تحديد {count} ملف(ات)", + "otherDetails": "تفاصيل أخرى", + "medicalReport": "التقرير الطبي", + "medicalReportNumber": "التقرير الطبي {number}", + "patientIsInsured": "المريض مؤمن عليه", + "insuranceDocument": "وثيقة التأمين", + "selectBranch": "اختر الفرع", + "patientInformation": "معلومات المريض", + "patientLocation": "أين يتواجد المريض", + "identificationNumber": "رقم الهوية", + "enterIdentificationNumber": "أدخل رقم الهوية*", + "patientName": "اسم المريض*", + "referralRequesterInformation": "معلومات مقدم طلب الإحالة", + "enterReferralRequesterName": "أدخل اسم مقدم طلب الإحالة*", + "requesterName": "اسم مقدم الطلب", + "relationship": "العلاقة", + "selectRelation": "اختر العلاقة", + "otherName": "اسم آخر", + "otherNameHint": "اسم آخر*", + "requesterNameRequired": "اسم مقدم طلب الإحالة مطلوب", + "selectRelationshipRequired": "يرجى اختيار العلاقة", + "otherRelationshipNameRequired": "اسم العلاقة الأخرى مطلوب", + "identificationNumberRequired": "رقم الهوية مطلوب", + "patientNameRequired": "اسم المريض مطلوب", + "enterPatientPhoneRequired": "يرجى إدخال رقم هاتف المريض", + "selectPatientCityRequired": "يرجى اختيار مدينة المريض", + "medicalReportRequired": "مطلوب تقرير طبي واحد على الأقل", + "selectBranchRequired": "يرجى اختيار الفرع", + "insuranceDocumentRequired": "وثيقة التأمين مطلوبة للمرضى المؤمن عليهم", + "searchResult": "نتيجة البحث", + "referralNo": "رقم الإحالة {number}", + "eReferral": "الإحالة الإلكترونية", + "referralCreatedSuccessfully": "تم إنشاء إحالتك بنجاح.", + "hereIsYourReferralNumber": "هذا هو رقم الإحالة الخاص بك #: ", + "searchEReferral": "البحث عن إحالة إلكترونية", + "enterRequiredInfoToSearch": "يرجى إدخال المعلومات المطلوبة للبحث عن إحالة إلكترونية", + "selectPickupDirection": "اختر اتجاه الاستلام", + "selectDirection": "اختر الاتجاه", + "toHospital": "إلى المستشفى", + "fromHospital": "من المستشفى", + "selectWay": "اختر الطريقة", + "oneWay": "اتجاه واحد", + "twoWay": "اتجاهين", + "selectPickupDetails": "اختر تفاصيل الاستلام", + "pleaseSelectDetailsOfPickup": " يرجى تحديد تفاصيل الاستلام", + "selectDetails": "اختر التفاصيل", + "work": "العمل", + "pick": "استلام", + "insideTheHome": "داخل المنزل", + "haveAnyAppointment": "هل لديك أي موعد", + "amountPaidAtHospital": "سيتم دفع المبلغ في المستشفى", + "submitRequest": "إرسال الطلب", + "enterPickupLocationManually": "أدخل موقع الاستلام يدوياً", + "enterPickupLocation": "أدخل موقع الاستلام", + "trackingDetails": "تفاصيل التتبع", + "cancelRequest": "إلغاء الطلب", + "shareLocationWhatsapp": "مشاركة موقعك المباشر على واتساب", + "pleaseWaitForCall": "يرجى انتظار المكالمة", + "toHospitalLower": "إلى المستشفى", + "contact": "اتصال", + "failed": "فشل", + "confirmationCall": "مكالمة التأكيد", + "pickupFromHome": "الاستلام من المنزل", + "onTheWayToHospital": " في الطريق إلى المستشفى", + "arrivedAtHospital": "وصل إلى المستشفى", + "orderCancel": "إلغاء الطلب", + "emergencyCheckIn": "تسجيل الطوارئ الإلكتروني", + "erOnlineCheckInDescription": "تتيح هذه الخدمة للمرضى تسجيل موعد الطوارئ قبل الوصول.", + "erOnlineCheckInSuccess": "تم تسجيل وصول الطوارئ بنجاح. الرجاء التوجه إلى منطقة الانتظار.", + "erOnlineCheckInError": "حدث خطأ غير متوقع أثناء عملية التسجيل. يرجى التواصل مع الدعم.", + "fetchingHospitalsList": "جاري جلب قائمة المستشفيات...", + "fetchingPaymentInformation": "جاري جلب معلومات الدفع...", + "erVisitDetails": "تفاصيل زيارة الطوارئ", + "erClinic": "عيادة الطوارئ", + "vatWithAmount": "الضريبة 15% ({amount})", + "erAppointmentBookedSuccess": "تم حجز موعدك بنجاح. يرجى إتمام إجراءات تسجيل الوصول عند وصولك إلى المستشفى.", + "underProcessing": "قيد المعالجة", + "canceledByPatient": "ملغى بواسطة المريض", + "rapidResponseTeam": "فريق الاستجابة السريع", + "allFacilities": "جميع المرافق", + "selectLocation": "اختر الموقع", + "pleaseSelectTheLocation": "يرجى اختيار الموقع", + "viewLocationGoogleMaps": "عرض الموقع على خرائط جوجل", + "callAmbulance": "استدعاء سيارة إسعاف", + "requestAmbulanceInEmergency": "طلب سيارة إسعاف في حالة الطوارئ من المنزل أو المستشفى", + "confirmation": "تأكيد", + "areYouSureYouWantToCallAmbulance": "هل أنت متأكد أنك تريد استدعاء سيارة إسعاف؟", + "getDetailsOfNearestBranch": "احصل على تفاصيل أقرب فرع بما في ذلك الاتجاهات", + "areYouSureYouWantToCallRRT": "هل أنت متأكد أنك تريد استدعاء فريق الاستجابة السريعة (RRT)؟", + "priorERCheckInToSkipLine": "تسجيل الوصول المسبق في الطوارئ لتجاوز الطابور والدفع في الاستقبال.", + "areYouSureYouWantToMakeERCheckIn": "هل أنت متأكد أنك تريد إجراء تسجيل وصول الطوارئ؟", + "checkingYourERAppointmentStatus": "جاري التحقق من حالة موعد الطوارئ الخاص بك...", + "transportOptions": "خيارات النقل", + "selectHospitalForAdvancePayment": "يرجى اختيار المستشفى الذي ترغب في دفع مبلغ مقدم له.", + "recharge": "إعادة الشحن", + "activityLevel": "مستوى النشاط", + "selectActivityLevel": "حدد مستوى النشاط", + "caloriesPerDay": "السعرات الحرارية في اليوم الواحد", + "dietType": "نوع النظام الغذائي", + "selectDietType": "حدد نوع النظام الغذائي", + "bodyFrameSize": "حجم إطار الجسم", + "selectBodyFrameSize": "حدد حجم إطار الجسم", + "averageCycleLength": "متوسط طول الدورة الشهرية (عادةً 28 يومًا)", + "averageLutealPhase": "متوسط طول المرحلة الأصفرية (عادةً 14 يومًا)", + "convert": "يتحول", + "calculate": "احسب", + "healthCalculators": "حاسبات الصحة", + "healthConverters": "محولات الصحة", + "generalHealth": "الصحة العامة", + "relatedToBMICalories": "متعلق بمؤشر كتلة الجسم والسعرات الحرارية ودهون الجسم وما إلى ذلك للبقاء على اطلاع دائم بصحتك.", + "selectCalculator": "اختر الآلة الحاسبة", + "womensHealth": "صحة المرأة", + "relatedToPeriodsOvulation": "متعلق بالدورة الشهرية والإباضة والحمل ومواضيع أخرى.", + "bloodSugar": "سكر الدم", + "trackYourGlucoseLevels": "تتبع مستويات الجلوكوز لديك، وفهم الاتجاهات، واحصل على رؤى مخصصة لصحة أفضل.", + "bloodCholesterol": "كوليسترول الدم", + "monitorCholesterolLevels": "راقب مستويات الكوليسترول، وقيّم مخاطر صحة القلب، واتخذ خطوات استباقية للرفاهية.", + "triglyceridesFatBlood": "الدهون الثلاثية في الدم", + "understandTriglyceridesImpact": "افهم تأثير الدهون الثلاثية على صحة القلب مع رؤى مخصصة وتوصيات الخبراء.", + "bmiCalculator": "حاسبة\nمؤشر كتلة الجسم", + "caloriesCalculator": "حاسبة\nالسعرات الحرارية", + "bmrCalculator": "حاسبة\nمعدل الأيض الأساسي", + "idealBodyWeight": "الوزن المثالي\nللجسم", + "bodyFatCalculator": "حاسبة\nدهون الجسم", + "carbsProteinFat": "الكربوهيدرات\nالبروتين والدهون", + "ovulationPeriod": "فترة\nالإباضة", + "deliveryDueDate": "تاريخ الولادة\nالمتوقع", + "low": "منخفض", + "preDiabetic": "ما قبل السكري", + "high": "مرتفع", + "elevated": "مرتفع قليلاً", + "recorded": "مسجل", + "noRecordsYet": "لا توجد سجلات بعد", + "lastRecord": "آخر سجل", + "addBloodSugar": "إضافة سكر الدم", + "addBloodPressure": "إضافة ضغط الدم", + "addWeight": "إضافة الوزن", + "bloodSugarDataSavedSuccessfully": "تم حفظ بيانات سكر الدم بنجاح", + "bloodPressureDataSavedSuccessfully": "تم حفظ بيانات ضغط الدم بنجاح", + "weightDataSavedSuccessfully": "تم حفظ بيانات الوزن بنجاح", + "pleaseWait": "يرجى الانتظار", + "selectUnit": "اختر الوحدة", + "selectMeasureTime": "اختر وقت القياس", + "selectArm": "اختر الذراع", + "enterBloodSugar": "أدخل سكر الدم", + "enterSystolicValue": "أدخل القيمة الانقباضية", + "enterDiastolicValue": "أدخل القيمة الانبساطية", + "enterWeight": "أدخل الوزن", + "selectDuration": "اختر المدة", + "systolic": "الانقباضي", + "diastolic": "الانبساطي", + "sendReportByEmail": "إرسال التقرير عبر البريد الإلكتروني", + "enterYourEmailToReceiveReport": "أدخل عنوان بريدك الإلكتروني لاستلام التقرير", + "addNewRecord": "إضافة سجل جديد", + "healthTrackers": "متتبعات الصحة", + "monitorBloodPressureLevels": "راقب مستويات ضغط الدم لديك، وتتبع القراءات الانقباضية والانبساطية، وحافظ على صحة قلبك.", + "trackWeightProgress": "تتبع تقدم وزنك، وضع الأهداف، وحافظ على كتلة جسم صحية من أجل العافية الشاملة.", + "bookAppointment": "احجز موعد", + "completeCheckup": "الفحص الشامل", + "indoorNavigation": "الملاحة الداخلية", + "eReferralServices": "خدمات الإحالة الإلكترونية", + "dailyWaterMonitor": "مراقب الماء اليومي", + "fetchingYourWaterIntakeDetails": "جاري جلب تفاصيل استهلاك الماء الخاص بك.", + "healthCalculatorsServices": "حاسبات\nالصحة", + "healthConvertersServices": "محولات\nالصحة", + "smartWatchesServices": "الساعات\nالذكية", + "exploreServices": "استكشف الخدمات", + "medicalAndCareServices": "الخدمات الطبية والرعاية", + "hmgServices": "خدمات مجموعة الحبيب الطبية", + "personalServices": "الخدمات الشخصية", + "habibWallet": "محفظة الحبيب", + "loginToViewWalletBalance": "سجل الدخول لعرض رصيد محفظتك", + "loginToViewMedicalFile": "سجل الدخول لعرض ملفك الطبي", + "addMember": "إضافة عضو", + "addFamilyMember": "إضافة فرد من العائلة", + "pleaseFillBelowFieldToAddNewFamilyMember": "يرجى ملء الحقل أدناه لإضافة فرد جديد من العائلة إلى ملفك الشخصي", + "healthTools": "أدوات الصحة", + "supportServices": "خدمات الدعم", + "virtualTour": "جولة افتراضية", + "carParking": "موقف السيارات", + "latestNews": "آخر الأخبار", + "hmgContact": "اتصل بمجموعة الحبيب الطبية", + "durationCannotExceed90": "لا يجوز أن تتجاوز المدة 90 دقيقة", + "unexpectedError": "حدث خطأ غير متوقع", + "gettingAmbulanceTransportOption": "جاري الحصول على خيارات نقل الإسعاف", + "fetchingAppointment": "جاري جلب الموعد", + "doYouWantToCancelTheRequest": "هل تريد إلغاء الطلب", + "cancellingRequest": "جاري إلغاء الطلب", + "fetchingTermsAndConditions": "جاري جلب الشروط والأحكام", + "selectLocationPrescriptionDelivery": "يرجى تحديد موقع توصيل الوصفة الطبية", + "noRadiologyOrders": "لم يتم العثور على أي طلبات تصوير شعاعي", + "ageIsRequired": "العمر مطلوب", + "invalidAge": "العمر غير صالح", + "ageMustBeBetween11And120": "يجب أن يكون العمر بين 11 و 120", + "heightIsRequired": "الطول مطلوب", + "invalidHeight": "الطول غير صالح", + "weightIsRequired": "الوزن مطلوب", + "invalidWeight": "الوزن غير صالح", + "timeToDrinkWater": "حان وقت شرب الماء! 💧", + "stayHydratedDrinkWater": "ابق رطبًا! اشرب {amount} مل من الماء.", + "visitPharmacyOnline": "زيارة الصيدلية على الانترنت", + "howAreYouFeelingToday": "كيف حالك اليوم؟", + "checkYourSymptomsWithScale": "تحقق من أعراضك باستخدام ذا المقياس", + "checkYourSymptoms": "تحقق من أعراضك", + "noUpcomingAppointmentPleaseBook": "ليس لديك أي مواعيد قادمة. يرجى حجز موعد", + "youHaveEROnlineCheckInRequest": "لديك طلب تسجيل وصول عبر الإنترنت للطوارئ", + "quickLinks": "روابط سريعة", + "viewMedicalFileLandingPage": "عرض الملف الطبي", + "immediateLiveCareRequest": "طلب لايف كير فوري", + "yourTurnIsAfterPatients": "دورك بعد {count} مريض.", + "dontHaveHHCOrders": "ليس لديك أي أوامر رعاية صحية منزلية حتى الآن.", + "hhcOrders": "أوامر الرعاية الصحية المنزلية", + "requestedServices": "الخدمات المطلوبة", + "selectServices": "اختر الخدمات", + "selectedServices": "الخدمات المختارة", + "createNewRequest": "إنشاء طلب جديد", + "youHaveNoPendingRequests": "ليس لديك أي طلبات معلقة.", + "noInsuranceDataFound": "لم يتم العثور على بيانات التأمين...", + "noInsuranceUpdateRequest": "لم يتم العثور على أي طلبات لتحديث بيانات التأمين.", + "policyNumberInsurancePage": "الوثيقة: {number}", + "insuranceExpired": "التأمين منتهي الصلاحية", + "insuranceActive": "التأمين نشط", + "patientCardID": "رقم بطاقة المريض: {id}", + "noInsuranceApprovals": "لم تحصل على أي موافقات تأمينية حتى الآن.", + "noInsuranceWithHMG": "ليس لديك تأمين مسجل لدى مجموعة الحبيب الطبية.", + "referenceRange": "النطاق المرجعي", + "downloadReport": "تنزيل التقرير", + "generatingReport": "جارٍ إنشاء التقرير، يرجى الانتظار...", + "noLabResults": "ليس لديك أي نتائج مختبرية حتى الآن.", + "labResultDetails": "تفاصيل نتائج المختبر", + "resultOf": "نتيجة {date}", + "whatIsThisResult": "ما هي هذه النتيجة؟", + "lastTested": "آخر اختبار", + "byVisit": "حسب الزيارة", + "byTest": "حسب التحليل", + "results": "نتائج", + "viewResults": "عرض النتائج", + "rebook": "إعادة الحجز", + "noOphthalmologyAppointments": "لم يتم العثور على أي مواعيد في قسم طب العيون...", + "noVitalSignsRecordedYet": "لا توجد علامات حيوية مسجلة بعد", + "appointmentsAndVisits": "المواعيد والزيارات", + "labAndRadiology": "المختبر والأشعة", + "activeMedicationsAndPrescriptions": "الوصفات الطبية", + "allPrescriptions": "جميع الوصفات", + "allMedications": "جميع الأدوية", + "youDontHaveAnyPrescriptionsYet": "ليس لديك أي وصفات طبية بعد.", + "youDontHaveAnyCompletedVisitsYet": "ليس لديك أي زيارات مكتملة بعد", + "others": "أخرى", + "allergyInfo": "معلومات الحساسية", + "vaccineInfo": "معلومات اللقاحات", + "updateInsuranceInfo": "تحديث التأمين", + "myInvoicesList": "قائمة فواتيري", + "ancillaryOrdersList": "قائمة الطلبات المساعدة", + "youDontHaveAnySickLeavesYet": "ليس لديك أي إجازات مرضية بعد.", + "medicalReports": "التقارير الطبية", + "sickLeaveReport": "تقرير الإجازة المرضية", + "weightTracker": "متتبع الوزن", + "askYourDoctor": "اسأل طبيبك", + "internetPairing": "الاقتران بالإنترنت", + "requested": "مطلوب", + "youDontHaveAnyMedicalReportsYet": "ليس لديك أي تقارير طبية بعد.", + "requestMedicalReport": "طلب تقرير طبي", + "youDoNotHaveAnyAppointmentsToRequestMedicalReport": "ليس لديك أي مواعيد لطلب تقرير طبي.", + "areYouSureYouWantToRequestMedicalReport": "هل أنت متأكد أنك تريد طلب تقرير طبي لهذا الموعد؟", + "yourMedicalReportRequestSubmittedSuccessfully": "تم إرسال طلب التقرير الطبي بنجاح.", + "monthlyHealthSummaryReportDisclaimer": "يعكس تقرير الملخص الصحي الشهري هذا المؤشرات الصحية ونتائج التحليل لأحدث الزيارات. يرجى ملاحظة أن هذا سيتم إرساله تلقائيًا من النظام ولا يعتبر تقريرًا رسميًا لذا لا ينبغي اتخاذ أي قرار طبي بناءً عليه", + "updatingMonthlyReportStatus": "جاري تحديث حالة التقرير الشهري...", + "monthlyReportStatusUpdatedSuccessfully": "تم تحديث حالة التقرير الشهري بنجاح", + "whoCanViewMyMedicalFile": "من يمكنه عرض ملفي الطبي؟", + "acceptedYourRequestToBeYourFamilyMember": "{status} طلب الانضمام الى أفراد عائلتك", + "canViewYourFile": "يمكنه عرض ملفك", + "hasARequestPendingToBeYourFamilyMember": "لديه طلب {status} ليكون فردًا من عائلتك", + "wantsToAddYouAsTheirFamilyMember": "يرغب في إضافتك كفرد من أفراد العائلة", + "rejectedYourRequestToBeYourFamilyMember": "{status} طلب الانضمام إلى عائلتك", + "rejectedYourFamilyMemberRequest": "{status} طلب أحد أفراد عائلتك", + "notAvailable": "غير متاح", + "selectAProfile": "الرجاء تحديد ملف تعريف", + "switchFamilyFile": "قم بالتبديل من قائمة الملفات الطبية أدناه", + "medicalFiles": "الملفات الطبية", + "addANewFamilyMember": "إضافة فرد جديد من العائلة", + "viewInvoiceDetails": "عرض تفاصيل الفاتورة", + "outPatient": "مريض خارجي", + "invoiceDetails": "تفاصيل الفاتورة", + "sendingEmailPleaseWait": "جاري إرسال ال��ريد الإلكتروني، يرجى الانتظار...", + "emailSentSuccessfullyMessage": "تم إرسال البريد الإلكتروني بنجاح.", + "discount": "خصم", + "paid": "مدفوع", + "fetchingInvoiceDetails": "جارٍ جلب تفاصيل الفاتورة، يرجى الانتظار...", + "scanQRCode": "مسح رمز الاستجابة السريعة", + "parkingSlotDetails": "تفاصيل موقف السيارة", + "slotNumber": "رقم الموقف: {code}", + "basement": "الطابق: {description}", + "parkingDate": "التاريخ: {date}", + "parkedSince": "متوقف منذ: {time}", + "resetDirection": "إعادة تعيين الاتجاه", + "noPrescriptionOrdersYet": "ليس لديك أي طلبات وصفات طبية حتى الآن.", + "fetchingPrescriptionPDFPleaseWait": "جاري جلب ملف الوصفة الطبية، يرجى الانتظار...", + "ratingValue": "التقييم: {rating}", + "downloadPrescription": "تحميل الوصفة الطبية", + "fetchingPrescriptionDetails": "جاري جلب تفاصيل الوصفة الطبية...", + "switchBackFamilyFile": "العودة إلى ملف العائلة", + "profileAndSettings": "الملف الشخصي والإعدادات", + "quickActions": "إجراءات سريعة", + "notificationsSettings": "إعدادات الإشعارات", + "touchIDFaceIDServices": "خدمات Touch ID / Face ID", + "personalInformation": "المعلومات الشخصية", + "updateEmailAddress": "تحديث عنوان البريد الإلكتروني", + "helpAndSupport": "المساعدة والدعم", + "permissionsProfile": "الأذونات", + "privacyPolicy": "سياسة الخصوصية", + "deactivateAccount": "إلغاء تنشيط الحساب", + "ageYearsOld": "{age} {yearsOld}", + "youDontHaveRadiologyOrders": "ليس لديك أي نتائج للأشعة حتى الآن.", + "radiologyResult": "نتيجة الأشعة", + "viewRadiologyImage": "عرض صورة الأشعة", + "rateClinic": "تقييم العيادة", + "back": "رجوع", + "rateDoctor": "تقييم الطبيب", + "howWasYourLastVisitWithDoctor": "كيف كانت زيارتك الأخيرة مع الطبيب؟", + "dateOfBirthSymptoms": "ما هو تاريخ ميلادك؟", + "genderSymptoms": "ما هو جنسك؟", + "heightSymptoms": "كم طولك؟", + "weightSymptoms": "ما هو وزنك؟", + "femaleGender": "أنثى", + "previous": "سابق", + "selectedOrgans": "الهيئات المختارة", + "noOrgansSelected": "لم يتم تحديد أي أعضاء بعد", + "organSelector": "محدد الأعضاء", + "noPredictionsAvailable": "لا توجد تنبؤات متاحة", + "areYouSureYouWantToRestartOrganSelection": "هل أنت متأكد أنك تريد إعادة تشغيل اختيار الأعضاء؟", + "possibleConditions": "الحالات المحتملة", + "pleaseSelectAtLeastOneRiskBeforeProceeding": "يرجى اختيار عامل خطر واحد على الأقل قبل المتابعة", + "aboveYouSeeCommonRiskFactors": "أعلاه ترى عوامل الخطر الأكثر شيوعًا. على الرغم من أن /diagnosis قد تعيد أسئلة حول عوامل الخطر، ", + "readMore": "اقرأ المزيد", + "riskFactors": "عوامل الخطر", + "noRiskFactorsFound": "لم يتم العثور على عوامل خطر", + "basedOnYourSelectedSymptomsNoRiskFactors": "بناءً على الأعراض المحددة، لم يتم تحديد عوامل خطر إضافية.", + "messageNotification": "الرسالة", + "attachedImage": "الصورة المرفقة", + "failedToLoadImage": "فشل تحميل الصورة", + "typeNotification": "النوع", + "pleaseSelectAtLeastOneOptionBeforeProceeding": "يرجى اختيار خيار واحد على الأقل قبل المتابعة", + "suggestions": "الاقتراحات", + "pleaseGoBackAndSelectOrgansFirst": "يرجى العودة واختيار الأعضاء أولاً", + "symptomsSelector": "محدد الأعراض", + "possibleSymptomsRelatedTo": "الأعراض المحتملة المتعلقة بـ", + "suggestionAIListDescription": "هذه قائمة بالأعراض المقترحة من قبل الذكاء الاصطناعي، بناءً على المعلومات التي تم جمعها حتى الآن خلال المقابلة", + "analyzing": "جاري التحليل...", + "seekMedicalAdvice": "اطلب المشورة الطبية", + "monitorDescription": "لا حاجة لطلب المشورة الطبية. فقط حافظ على روتين صحي.", + "seekMedicalAdviceDescription": "ليست حالة طوارئ ولكن من الأفضل مراقبة الأعراض.", + "emergencyDescription": "تحتاج إلى استشارة الطبيب في أقرب وقت ممكن قبل فوات الأوان.", + "colorScience": "دلالات الألوان", + "noNeedToVisitDoctor": "لا حاجة لزيارة الطبيب", + "commonSymptom": "الأعراض الشائعة", + "notApplicable": "لا ينطبق", + "emergencyTriage": "طوارئ", + "emergencyEvidenceDetected": "تم اكتشاف دليل طوارئ. يرجى طلب العناية الطبية.", + "noQuestionItemsAvailable": "لا توجد عناصر أسئلة متاحة", + "pleaseAnswerAllQuestionsBeforeProceeding": "يرجى الإجابة على جميع الأسئلة قبل المتابعة", + "triage": "الفرز", + "areYouSureYouWantToExitProgress": "هل أنت متأكد أنك تريد الخروج؟ سيتم فقدان تقدمك.", + "noQuestionAvailable": "لا يوجد سؤال متاح", + "possibleSymptom": "عرض محتمل: ", + "symptomsCheckerFindingScore": "- درجة نتائج فاحص الأعراض", + "notSet": "غير محدد", + "years": "سنوات", + "symptomsChecker": "فاحص الأعراض", + "helloIsYourInformationUpToDate": "مرحباً {name}، هل معلوماتك محدثة؟", + "noEditAll": "لا، تعديل الكل", + "yesItIs": "نعم، إنها كذلك", + "age": "العمر", + "youDontHaveAnyAncillaryOrdersYet": "ليس لديك أي طلبات مساعدة بعد.", + "invoiceWithNumber": "الفاتورة: {invoiceNo}", + "queued": "في قائمة الانتظار", + "checkInReady": "جاهز للتسجيل", + "checkIn": "تسجيل الوصول", + "viewDetails": "عرض التفاصيل", + "selectPaymentMethod": "اختر طريقة الدفع", + "processingPaymentPleaseWait": "جاري معالجة الدفع، يرجى الانتظار...", + "finalizingPaymentPleaseWait": "جاري إتمام الدفع، يرجى الانتظار...", + "generatingInvoicePleaseWait": "جاري إنشاء الفاتورة، يرجى الانتظار...", + "hereIsYourInvoiceNumber": "هذا هو رقم فاتورتك #: ", + "paymentCompletedSuccessfully": "تم الدفع بنجاح", + "failedToInitializeApplePay": "فشل في تهيئة Apple Pay. يرجى المحاولة مرة أخرى.", + "cash": "نقدي", + "approved": "موافق عليه", + "approvalRejectedPleaseVisitReceptionist": "تم رفض الموافقة - يرجى زيارة موظف الاستقبال", + "sentForApproval": "تم إرساله للموافقة", + "ancillaryOrderDetails": "تفاصيل الطلبات المساندة", + "noProceduresAvailableForSelectedOrder": "لا توجد إجراءات متاحة للطلب المحدد.", + "procedures": "الإجراءات", + "totalAmount": "المبلغ الإجمالي", + "covered": "مغطى", + "vatPercent": "ضريبة القيمة المضافة (15%)", + "proceedToPayment": "المتابعة للدفع", + "supportedSmartWatches": "الساعات الذكية المدعومة", + "pleaseMakeSureSamsungWatchConnected": "يرجى التأكد من أن ساعة Samsung الخاصة بك متصلة بهاتفك، ومتزامنة ومحدثة بشكل نشط.", + "beforeSyncingDataFollowInstructions": "قبل مزامنة البيانات، يرجى التأكد من اتباع التعليمات بشكل صحيح.", + "viewWatchInstructions": "عرض تعليمات الساعة", + "healthConnectAppNotInstalled": "يبدو أنه ليس لديك تطبيق Health Connect مثبتًا. يرجى تثبيته من متجر Play لمزامنة بيانات صحتك.", + "setTimerOfReminder": "ضبط مؤقت التذكير", + "youHaveAppointmentWithDr": "لديك موعد مع د. ", + "hours": "ساعات", + "secs": "ثواني", + "noAllergiesDataFound": "لم يتم العثور على بيانات الحساسية...", + "heartRateDescription": "معدل ضربات قلبك يشير إلى عدد المرات التي ينبض فيها قلبك في الدقيقة", + "bloodOxygenDescription": "مستوى الأكسجين في الدم يشير إلى كمية الأكسجين التي تحملها خلايا الدم الحمراء", + "stepsDescription": "عدد الخطوات المتخذة على مدار اليوم", + "caloriesDescription": "السعرات الحرارية المحروقة أثناء النشاط البدني", + "distanceDescription": "المسافة المقطوعة على مدار اليوم", + "overview": "نظرة عامة", + "details": "التفاصيل", + "healthy": "صحي", + "warning": "تحذير", + "vitalSignDetails": "تفاصيل العلامات الحيوية", + "resultOfNoDate": "نتيجة --", + "referenceRangeBetween": "النطاق المرجعي: {low} – {high} {unit}", + "referenceRangeMin": "النطاق المرجعي: ≥ {low} {unit}", + "referenceRangeMax": "النطاق المرجعي: ≤ {high} {unit}", + "noHistoryAvailable": "لا يوجد تاريخ متاح", + "bmiDescription": "مؤشر كتلة الجسم هو قياس يعتمد على الطول والوزن لتقدير دهون الجسم.", + "heightDescription": "يقاس الطول بالسنتيمتر ويستخدم لحساب مؤشر كتلة الجسم وتوصيات الجرعات.", + "weightDescription": "الوزن يساعد في تتبع الصحة العامة والتغذية والتغيرات مع مرور الوقت.", + "bloodPressureDescription": "ضغط الدم يعكس قوة الدم على جدران الشرايين. يظهر كانقباضي/انبساطي.", + "temperatureDescription": "درجة حرارة الجسم تعكس مدى سخونة جسمك وقد تتغير مع العدوى أو الالتهاب.", + "heartRateDescriptionVital": "معدل ضربات القلب يشير إلى عدد نبضات القلب في الدقيقة.", + "respiratoryRateDescription": "معدل التنفس هو عدد الأنفاس المأخوذة في الدقيقة.", + "bmiAdvice": "حافظ على نظام غذائي متوازن ونشاط منتظم. إذا كان مؤشر كتلة جسمك مرتفعًا أو منخفضًا، فكر في استشارة طبيبك.", + "heightAdvice": "لا حاجة لاتخاذ أي إجراء إلا إذا بدا قياسك غير صحيح. قم بتحديثه في زيارتك القادمة.", + "weightAdvice": "راقب تغيرات الوزن. الزيادة أو الخسارة المفاجئة قد تتطلب استشارة طبية.", + "bloodPressureAdvice": "استمر في تتبع ضغط دمك. يجب مناقشة القراءات المرتفعة أو المنخفضة مع طبيبك.", + "temperatureAdvice": "إذا كان لديك حمى مستمرة أو أعراض، اتصل بمقدم الرعاية الصحية.", + "heartRateAdvice": "تتبع اتجاهات معدل ضربات قلبك. إذا شعرت بدوار أو ألم في الصدر، اطلب الرعاية الطبية.", + "respiratoryRateAdvice": "إذا لاحظت ضيقًا في التنفس أو تنفسًا غير طبيعي، اطلب المشورة الطبية.", + "whatShouldIDoNext": "ماذا يجب أن أفعل بعد ذلك؟", + "customizeDrinkCup": "قم بتخصيص كوب مشروبك", + "tipsToStayHydrated": "نصائح للبقاء رطبًا", + "drinkBeforeYouFeelThirsty": "اشرب قبل أن تشعر بالعطش", + "keepRefillableBottleNextToYou": "احتفظ بزجاجة قابلة لإعادة التعبئة بجانبك", + "trackYourDailyIntakeToStayMotivated": "تتبع كمية الماء اليومية للحفاظ على الحافز", + "chooseSparklingWaterInsteadOfSoda": "اختر الماء الفوار بدلاً من الصودا", + "switchCup": "تبديل الكوب", + "plainWater": "ماء عادي", + "yourGoal": "هدفك", + "remaining": "المتبقي", + "hydrationStatus": "حالة الترطيب", + "areYouSureYouWantToCancelAllWaterReminders": "هل أنت متأكد أنك تريد إلغاء جميع تذكيرات الماء؟", + "remindersSet": "تم ضبط التذكيرات!", + "dailyWaterRemindersScheduledAt": "تم جدولة تذكيرات الماء اليومية في:", + "waterConsumption": "استهلاك المياه", + "selectNumberOfReminders": "حدد عدد التذكيرات", + "h2oSettings": "إعدادات H20", + "settingsSavedSuccessfully": "تم حفظ الإعدادات بنجاح", + "yourName": "اسمك", + "ageYears": "العمر (11-120) سنة", + "numberOfRemindersInADay": "عدد التذكيرات في اليوم", + "medications": "الأدوية", + "someRemarksAboutPrescription": "ستجدون هنا بعض الملاحظات حول الوصفة الطبية", + "notifyMeBeforeConsumptionTime": "أبلغني قبل وقت الاستهلاك", + "noMedicationsToday": "لا أدوية اليوم", + "reminders": "تذكيرات", + "reminderAddedToCalendar": "تمت إضافة تذكير إلى التقويم ✅", + "errorWhileSettingCalendar": "حدث خطأ أثناء ضبط التقويم:{error}", + "instructions": "التعليمات", + "requests": "الطلبات", + "thisWeek": "هذا الأسبوع", + "lastMonth": "الشهر الماضي", + "lastSixMonths": "آخر 6 أشهر", + "selectTime": "حدد الوقت", + "pleaseWaitYouWillBeCalledForVitalSigns": "يرجى الانتظار! سيتم استدعاؤك لقياس العلامات الحيوية", + "pleaseVisitRoomForVitalSigns": "يرجى زيارة الغرفة {roomNumber} لقياس العلامات الحيوية", + "pleaseVisitRoomToTheDoctor": "يرجى زيارة الغرفة {roomNumber} لمقابلة الطبيب", + "erOnlineCheckInRequest": "طلب تسجيل الوصول عبر الإنترنت لقسم الطوارئ", + "indoor": "داخلي", + "navigation": "الملاحة", + "health": "الصحة", + "calculators": "الحاسبات", + "converters": "المحولات", + "guide": "الدليل", + "liveCareServiceDesc": "احصل على استشارة طبية من طبيب متخصص عبر مكالمة فيديو", + "bloodGroup": "فصيلة الدم: {bloodType}", + "medicalServices": "الخدمات الطبية", + "insuranceAndPayments": "التأمين والمدفوعات", + "trackerAndOthers": "المتتبع وأخرى", + "bmi": "مؤشر كتلة الجسم", + "yesPleaseINeedHelp": "نعم، من فضلك أريد المساعدة", + "aiOverView": "AI ملخص", + "generateAiAnalysis": "قم بإجراء تحليل لهذا الطلب AI", + "aiAnalysis": "AI تحليل", + "prediction": "تنبؤ", + "prevention": "وقاية", + "disclaimer": "تنصل", + "thisAboveInfo": "المعلومات المذكورة أعلاه مُولّدة بواسطة AI بناءً على نتائج تحاليلك المخبرية، وهي لأغراض إعلامية فقط. لا ينبغي اعتبارها تشخيصًا طبيًا أو خطة علاجية. استشر طبيبك دائمًا للحصول على نصيحة طبية مُخصصة قبل اتخاذ أي قرارات تتعلق بصحتك.", + "aiDisclaimer": "سيتم مشاركة بيانات نتائج تحاليلك المخبرية بشكل آمن مع خدمة الذكاء الاصطناعي لدينا لتحليلها. يساعد هذا في تقديم رؤى صحية مُخصصة. هل ترغب في المتابعة؟", + "consent": "موافقة", + "bmiNormalDescription": "مؤشر كتلة جسمك ضمن المعدل الصحي. استمر في اتباع نظام غذائي متوازن، وممارسة النشاط البدني بانتظام، وإجراء الفحوصات الدورية للحفاظ على صحة جيدة. راقب أي تغييرات ملحوظة مع مرور الوقت.", + "bmiUnderweightDescription": "يشير مؤشر كتلة الجسم إلى أنك تعاني من نقص الوزن. لذا، يُنصح بزيادة السعرات الحرارية المتناولة من خلال تناول الأطعمة الغنية بالعناصر الغذائية، وممارسة تمارين المقاومة لبناء العضلات، واستشارة أخصائي رعاية صحية للتحقق من وجود أسباب كامنة.", + "bmiOverweightDescription": "يشير مؤشر كتلة الجسم إلى زيادة الوزن. لذا، يُنصح بالسعي إلى إنقاص الوزن تدريجياً وبشكل مستدام من خلال تقليل السعرات الحرارية بشكل معتدل، وممارسة النشاط البدني بانتظام، واختيار الأطعمة الصحية. استشر طبيبك قبل إجراء أي تغييرات جذرية في نمط حياتك.", + "caloriesMaintenanceDescription": "السعرات الحرارية اليومية المُقدَّرة للحفاظ على وزنك الحالي بناءً على مستوى نشاطك ومعدل الأيض لديك. استخدم هذه الكمية كخط أساس: زدها قليلاً لزيادة الكتلة العضلية، أو قللها قليلاً لإنقاص الوزن تدريجياً. تابع تقدمك وعدّل الخطة كل أسبوعين إلى أربعة أسابيع.", + "caloriesModerateDeficitDescription": "نظام غذائي معتدل لتقليل السعرات الحرارية مصمم لإنقاص الوزن بشكل ثابت ومستدام (عادةً من 0.25 إلى 0.5 كيلوغرام أسبوعيًا). يُنصح بدمجه مع تمارين المقاومة وتناول كمية كافية من البروتين للحفاظ على الكتلة العضلية. تجنب التخفيضات الحادة في السعرات الحرارية واستشر طبيبًا مختصًا إذا كنت تعاني من أي حالة صحية.", + "caloriesAggressiveDeficitDescription": "يؤدي خفض السعرات الحرارية بشكل كبير إلى فقدان الوزن بشكل أسرع، ولكنه قد يصعب الاستمرار عليه ويزيد من خطر نقص العناصر الغذائية والإرهاق وفقدان الكتلة العضلية. لا يُنصح باتباعه على المدى الطويل؛ استشر طبيبًا أو أخصائي تغذية قبل الاستمرار.", + "bodyFatEssentialDescription": "نسبة الدهون في جسمك ضمن النطاق الأساسي/الرياضي. هذا المستوى شائع لدى الرياضيين ويشير إلى انخفاض نسبة الدهون في الجسم. مع أن هذا قد يكون مثاليًا للأداء، تأكد من الحفاظ على تغذية سليمة ووظائف هرمونية متوازنة. استشر طبيبًا إذا شعرت بالتعب، أو واجهت مشاكل هرمونية، أو أي مخاوف صحية أخرى.", + "bodyFatFitnessDescription": "نسبة الدهون في جسمك ضمن النطاق الصحي. وهذا يدل على مستوى صحي من الدهون في الجسم يرتبط بلياقة بدنية جيدة. حافظ على نمط حياتك الحالي، بما في ذلك ممارسة الرياضة بانتظام واتباع نظام غذائي متوازن، للحفاظ على هذا المستوى الصحي.", + "bodyFatAverageDescription": "نسبة الدهون في جسمك ضمن المعدل الطبيعي/المقبول، وهي نسبة تُعتبر صحية لعموم الناس. لتحسين تكوين جسمك، يُنصح بممارسة تمارين القوة، وتمارين القلب والأوعية الدموية، واتباع نظام غذائي متوازن. ركّز على التغييرات التدريجية والمستدامة للحفاظ على صحتك على المدى الطويل.", + "bodyFatObeseDescription": "نسبة الدهون في جسمك أعلى من المعدل الصحي الموصى به. قد يزيد هذا من المخاطر الصحية، بما في ذلك أمراض القلب والأوعية الدموية، والسكري، ومشاكل المفاصل. يُنصح باستشارة طبيب أو أخصائي تغذية معتمد لوضع خطة علاجية شخصية تشمل التغذية المتوازنة، والنشاط البدني المنتظم، وتعديلات نمط الحياة لتحقيق إدارة مستدامة للوزن.", + "bmrNormalDescription": "معدل الأيض الأساسي لديك ضمن النطاق المتوقع لحالتك. معدل الأيض الأساسي هو الطاقة التي يحتاجها جسمك في حالة الراحة للحفاظ على وظائفه الحيوية (التنفس، الدورة الدموية، درجة الحرارة). استخدم هذه القيمة كأساس لتقدير إجمالي احتياجاتك اليومية من الطاقة من خلال تطبيق مُعامل النشاط. حافظ على نظام غذائي متوازن وممارسة النشاط البدني بانتظام لدعم صحة التمثيل الغذائي.", + "bmrLowDescription": "معدل الأيض الأساسي لديك أقل من المعدل الطبيعي لحالتك. تشمل الأسباب المحتملة انخفاض كتلة العضلات، أو تراجع التمثيل الغذائي المرتبط بالتقدم في السن، أو التكيف الأيضي الناتج عن تقييد السعرات الحرارية لفترة طويلة. يُنصح بالتركيز على تمارين المقاومة لبناء العضلات والحفاظ عليها، والتأكد من تناول كميات كافية من البروتين والمغذيات الدقيقة، واستشارة أخصائي رعاية صحية إذا كان هذا الأمر غير متوقع.", + "bmrHighDescription": "معدل الأيض الأساسي لديك أعلى من المتوسط ​​بالنسبة لحالتك. قد يعكس هذا زيادة في كتلة العضلات، أو صغر السن، أو ارتفاع معدل الأيض لديك بشكل طبيعي، مما يعني أنك تحرق طاقة أكبر أثناء الراحة. استخدم هذه المعلومات لتحديد احتياجاتك من السعرات الحرارية: احتياجات أعلى للحفاظ على الوزن أو بناء العضلات، ونقص معتدل في السعرات الحرارية لإنقاص الوزن. استشر طبيبك إذا لاحظت أي تغيرات سريعة غير مبررة.", + "ibwAtTargetDescription": "وزنك في النطاق المثالي. حافظ على عاداتك الحالية — نظام غذائي متوازن ونشاط بدني منتظم — للاستمرار على هذا المستوى.", + "ibwBelowTargetDescription": "أنتِ أقل من الوزن المثالي بمقدار {kg} كجم. يُنصح بزيادة الوزن تدريجيًا من خلال فائضٍ بسيط في السعرات الحرارية، وتناول أطعمة غنية بالعناصر الغذائية، مع ممارسة تمارين المقاومة.", + "ibwAboveTargetDescription": "أنتِ أعلى من الوزن المثالي بمقدار {kg} كجم. يُنصح باتباع خفضٍ تدريجي ومستدام للوزن من خلال عجزٍ معتدل في السعرات الحرارية، وزيادة مستوى النشاط البدني، واتباع تغذية متوازنة.", + "ibwCloseToRangeDescription": "وزنك قريب من النطاق المثالي. حافظ على نظام غذائي متوازن ونشاط بدني منتظم، مع اتباع إرشادات شخصية من مختص صحي عند الحاجة.", + "ibwUnderweightDescription": "أنت أقل من الوزن المثالي بمقدار {kg} كجم. ركّز على زيادة السعرات الحرارية من خلال أطعمة غنية بالعناصر الغذائية، وأعط الأولوية للبروتين وتمارين المقاومة لبناء كتلة صحية، مع اتباع إرشادات شخصية من مختص صحي.", + "ibwUnderweightGenericDescription": "يبدو أنكِ أقل من الوزن المثالي. يُنصح بزيادة السعرات الحرارية من خلال أطعمة غنية بالعناصر الغذائية وممارسة تمارين المقاومة؛ مع الحصول على استشارة مختص صحي عند الحاجة.", + "ibwOverweightDescription": "أنت أعلى من الوزن المثالي بمقدار {kg} كجم. يُنصح باتباع استراتيجية تدريجية ومستدامة لفقدان الوزن — من خلال عجزٍ معتدل في السعرات الحرارية، وممارسة نشاط بدني منتظم، وتغذية متوازنة. يُفضّل استشارة مختص صحي قبل إجراء تغييرات كبيرة.", + "ibwOverweightGenericDescription": "يبدو أنك أعلى من الوزن المثالي. يُنصح باتباع عجزٍ تدريجي ومستدام في السعرات الحرارية مع ممارسة النشاط البدني واتباع تغذية متوازنة؛ مع الحصول على استشارة مختص صحي عند الحاجة.", + "dietVeryLowCarbsDescription": "نهج منخفض الكربوهيدرات جدًا (الكيتوني): تقليل الكربوهيدرات إلى الحد الأدنى مع زيادة الدهون وبروتين معتدل. قد يساعد على فقدان الوزن بسرعة وتحسين التحكم في سكر الدم لدى بعض الأشخاص، لكنه قد يكون صعب الاستمرار عليه وقد يسبب نقصًا في بعض العناصر الغذائية. يجب مراقبة الترطيب ، والحصول على استشارة مختص صحي عند استخدامه لفترة طويلة.", + "dietLowCarbsDescription": "خطة منخفضة الكربوهيدرات وعالية البروتين: تقليل الكربوهيدرات مع زيادة البروتين لدعم الشعور بالشبع والحفاظ على الكتلة العضلية. مفيدة لإدارة الوزن وضبط سكر الدم عند موازنتها مع الخضروات والدهون الصحية. احرص على الحصول على كمية كافية من الألياف والعناصر الدقيقة (الفيتامينات والمعادن).", + "dietModerateCarbsDescription": "تناول معتدل للكربوهيدرات مع توازن في البروتين والدهون: يوفر طاقة مستقرة للأنشطة اليومية والتمارين مع قدر من المرونة. مناسب لكثير من الأشخاص الذين يسعون لإدارة وزن مستدامة وتحسين الأداء.", + "dietUSDAGuidelinesDescription": "نمط متوازن مستند إلى (USDA): يركز على الفواكه والخضروات والحبوب الكاملة والبروتينات قليلة الدهن، مع الحد من السكريات المضافة والدهون المشبعة. يُعد إطارًا قائمًا على الأدلة لدعم الصحة العامة، وكفاية العناصر الغذائية، والوقاية من الأمراض المزمنة.", + "dietZoneDietDescription": "حمية الزون (~40٪ كربوهيدرات / 30٪ بروتين / 30٪ دهون): تركز على التوازن الهرموني وضبط الحصص الغذائية. قد تُحسّن تركيب الجسم ومستوى الطاقة لدى بعض الأشخاص، لكنها تتطلب تخطيطًا جيدًا؛ ويُفضّل تخصيصها بالتعاون مع مختص تغذية.", + "contextDependent": "يعتمد السياق", + "calculatedValue": "القيمة المحسوبة", + "calculationFormula": "صيغة الحساب", + "confirmYourLocation": "قم بتأكيد موقعك", + "confirmYourLocationDesc": "يرجى تأكيد موقعك الحالي لعرض الاتجاهات المناسبة.", + "insideHospital": "أنا داخل المستشفى", + "outsideHospital": "أنا خارج المستشفى", + "servicePriceList": "قائمة أسعار الخدمات", + "servicePriceListDesc": "توضح قائمة أسعار الخدمات أدناه رسوم الخدمات الصحية المقدمة للمرضى بنظام الدفع النقدي. أما فيما يتعلق بالخدمات المشمولة بالتأمين، فسيتم تطبيق التغطية التأمينية والتحقق من الأهلية واحتساب نسب التحمل وفقًا لشروط وثيقة التأمين وجدول المنافع المعتمد لكل شركة تأمين.", + "servicePriceListRights": "يحق للمريض الحصول على متابعة مجانية في غضون 14 يومًا من الزيارة الأولى", + "serviceName": "اسم الخدمة", + "noFreeSlot": "لا توجد مواعيد متاحة في التاريخ المحدد. يرجى اختيار تاريخ آخر أو إعادة المحاولة لاحقاً.", + "noThanksIKnowTheClinic": "لا، شكراً. أنا أعرف العيادة.", + "unableToSendOTP": "تعذر إرسال رمز التحقق لمرة واحدة", + "loadingAIAnalysis": "جارٍ تحليل نتائج المختبر، يرجى التحلي بالصبر والسماح للذكاء الاصطناعي بالقيام بالمهمة، قد يستغرق هذا بعض الوقت.", + "symptoms": "أعراض", + "insuranceInActive": "التأمين غير نشط", + "insuranceInActiveContactSupport": "لديك تأمين ساري المفعول، ولكنه غير مُفعّل حاليًا في مجموعة حبيب الطبية. يُرجى التواصل مع خدمة عملاء مجموعة حبيب الطبية.", + "updateAppNow": "تحديث التطبيق الآن", + "Dr": "الدكتور.", + "reschedulingAppo": "إعادة جدولة الموعد، يرجى الانتظار...", + "invalidEligibility": "لا يمكنك إجراء الدفع عبر الإنترنت لأنك غير مؤهل لاستخدام الخدمة المقدمة.", + "invalidInsurance": "لا يمكنك إجراء الدفع عبر الإنترنت لأنه ليس لديك تأمين صالح.", + "continueCash": "متابعة الدفع نقدًا", + "timeFor": "الوقت", + "hmgPolicies": "سياسات مجموعة الحبيب الطبية", + "darkMode": "المظهر الداكن", + "generateAiAnalysisResult": "قم بإجراء تحليل لهذا المختبر AI", + "ratings": "التقييمات", + "hmgPharmacyText": "صيدلية الحبيب، المتجر الصيدلاني الإلكتروني المتكامل الذي تقدمه لكم مجموعة خدمات الدكتور سليمان الحبيب الطبية.", + "insuranceRequestSubmittedSuccessfully": "تم إرسال طلب تحديث بيانات التأمين بنجاح. سيتم إعلامك بمجرد الانتهاء.", + "updatingEmailAddress": "جارٍ تحديث عنوان البريد الإلكتروني، يرجى الانتظار...", + "verifyInsurance": "التحقق من التأمين", + "tests": "تحليل", + "calendarPermissionAlert": "يرجى منح إذن الوصول إلى التقويم من إعدادات التطبيق لضبط تذكير تناول الدواء.", + "sortByLocation": "الترتيب حسب الموقع" +}; +static const Map _en_US = { + "english": "English", + "arabic": "Arabic", + "login": "Login", + "noDataAvailable": "No Data Available", + "confirm": "Confirm", + "loadingText": "Loading, please wait...", + "kilometerUnit": "KM", + "dashboardScreenToolbarTitle": "Home", + "settings": "Settings", + "language": "App Language", + "lanEnglish": "English", + "lanArabic": "العربية", + "cancel": "Cancel", + "done": "Done", + "replay2": "Replay", + "home": "Home", + "services": "SERVICES", + "mySchedule": "My Schedule", + "logout": "Logout", + "respirationRate": "Respiration Rate", + "bookAppo": "Book Appointment", + "searchBy": "Search By:", + "clinic": "Clinic", + "byClinic": "By Clinic", + "hospital": "Hospital", + "byHospital": "By Hospital", + "name": "Name", + "doctor": "Doctor", + "clinicName": "Clinic Name", + "hospitalName": "Hospital Name", + "noClinicFound": "No Clinic Found", + "doctorName": "Doctor Name", + "nearestAppo": "Nearest Appointment", + "searchByDocText": "Type the name of the doctor to help you find him", + "enterDocName": "Enter Doctor name", + "search": "Search", + "noResultFound": "No Result Found", + "noSearchResultFound": "No Result Found", + "pleaseEnterProductName": "Please Enter Product Name", + "bookNow": "Book Now", + "docInfo": "Doctor Information", + "appoInfo": "Appointment Information", + "availableAppo": "Available Appointments", + "gender": "Gender", + "nationality": "Nationality", + "neverWait": "Never wait in queue", + "reminderTitle": "You have appointment with Dr. ", + "appointmentCalendar": "Would you like to set a reminder for this appointment in your calendar?", + "appointmentSuccess": "Appointment is successfully booked", + "docQualifications": "Doctor Qualifications", + "pressAgain": "Press again to exit the app", + "laserMaxLimitReach": "Maximum limit is 90 minutes", + "confirmAppoHeading": "Kindly review your Appointment", + "patientInfo": "Patient Information", + "doctorFilter": "Doctors will be filtered based on your gender and age", + "bookSuccess": "Book Success", + "patientShare": "Patient Share", + "patientShareWithTax": "Patient Share with Tax", + "confirmAppo": "Confirm Appointment", + "confirmLiveCare": "Confirm LiveCare", + "waitingForDoctor": "Waiting for doctor", + "appointment": "Appointment", + "confirmLater": "Confirm Later", + "todoList": "Todo List", + "appoActions": "Appointment Actions", + "date": "Date", + "time": "Time", + "pendingPayment": "Pending for payment", + "payNow": "Pay Now", + "viewQR": "View QR Code", + "instruction": "Instructions", + "livecare": "LiveCare", + "livecareAppo": "LiveCare Appointment", + "agreeTo": "I agree to the", + "termsConditoins": "Terms and Conditions", + "cancelAppoMsg": "Are you sure you want to cancel this appointment?", + "changePayment": "Change Payment Method", + "upcomingNoAction": "No Action Required", + "upcomingConfirm": "Please confirm the appointment to avoid cancellation", + "bookSuccessConfirmMore2412": "The online payment process will be available 24 hours before the appointment.", + "upcomingPaymentPending": "Online Payment will be Activated before 24 Hours of Appointment Time", + "upcomingPaymentNow": "Pay Online now to avoid long waiting queue", + "upcomingQR": "Use the QR Code to Check-In in hospital", + "upcomingVirtual": "This is a virtual appointment, Please adhere to the instructions for a seamless experience.", + "upcomingLivecare": "This is a LiveCare appointment", + "upcomingDetails": "More Details", + "reschedule": "Reschedule", + "raise": "Raise", + "complaint": "Complaint", + "add": "Add", + "reminder": "Reminder", + "location": "Locations", + "online": "Online", + "payment": "Payment", + "onlinePayment": "Online", + "onlinePaymentSubtitle": "Payment", + "cancelNocaps": "Cancel", + "setReminder": "Set Reminder", + "nationalIdNumber": "National ID Number", + "medicalFileNumber": "Medical File Number", + "loginregister": "Login / Register", + "poweredBy": "Powered by", + "welcome": "Welcome", + "welcomeToDrSulaiman": "Welcome to Dr. Sulaiman Al Habib Medical Group", + "patientApp": "Patient App", + "welcomeText": "Dr. Sulaiman Al Habib Mobile Application", + "drSulaimanText": "Dr. Sulaiman Al Habib", + "welcomeText2": "Have you previously visited the hospitals or medical centers of Dr. Sulaiman Al Habib?", + "yes": "Yes", + "no": "No", + "logintyperadio": " Choose from the below options to login to your medical file.", + "registernow": "Register Now", + "nationalID": "Enter the Identification Number", + "nationalId": "National ID", + "fileNo": "File Number", + "fileno": "File No", + "forgotFileNo": "Forgot file Number?", + "forgotFileNoTitle": "Forgot medical file", + "enterNationalId": "Please enter mobile number and identification number", + "profileInfo": "Please enter profile information", + "submit": "Submit", + "forgotDesc": "Enter the mobile number to receive the Medical File Number via SMS", + "dob": "Birth Date:", + "hijriDate": "Hijri Date", + "gregorianDate": "Gregorian Date", + "verifyLoginWith": "Please choose one of the following options to verify", + "registerUser": "Register", + "verifyWithFingerprint": "Biometric", + "verifyWithFaceid": "Face ID", + "verifyWithSms": "SMS", + "verifyWithWhatsapp": "Whatsapp", + "verifyThrough": "Verify Through", + "lastLogin": "LAST LOGIN AT:", + "lastLoginWith": "VERIFICATION TYPE:", + "verifyFingerprint": "To activate the fingerprint login service, please verify data by using one of the following options.", + "searchMedicine": "Search Medicine", + "pharmaciesList": "Pharmacies List", + "searchMedicineHere": "Search Medicine Here", + "description": "Description", + "howToUse": "How to Use", + "price": "Price", + "youCanFindItIn": "You can find it in", + "pleaseEnterMedicineName": "Please Enter Medicine Name", + "verificationMessage": "Please enter the Verification Code sent to", + "validationMessage": "The verification code expires in", + "notification": "Notifications", + "appSettings": "App Settings", + "rateApp": "Rate Our App", + "before": "Before", + "minute": "Minutes", + "hour": "Hour", + "reminderSuccess": "The reminder has been added successfully", + "reminderCancelSuccess": "The reminder has been cancelled successfully", + "patientShareToDo": "Amount before tax: ", + "patientTaxToDo": "Tax amount: ", + "patientShareTotalToDo": "Total amount due: ", + "paymentMethod": "Payment Method", + "noNeedToWaitInLine": "No need to stand in line.", + "useQRAppoAttend": "Use the QR code to register the appointment attendance.", + "passQRAppoAttend": "Pass the QR code through the attendance devices available in the Hospital.", + "sitWaitingQR": "Sit in the waiting rooms until called by the nurse.", + "attendRegisterCode": "Attendance registration code", + "scanQRHospital": "Approach the Online Check-In board in the hospital & scan via NFC or QR Code to Check-In", + "scanNFC": "Scan NFC to Check-In", + "sendEmail": "Send Email", + "success": "Done successfully", + "emailSentSuccessfully": "Email Sent Successfully", + "emailSentError": "Error Sending Email", + "close": "Close", + "closeIt": "Close", + "booked": "Booked", + "confirmed": "Confirmed", + "arrived": "Arrived", + "payNowBookSuccess": "Pay now via Al Habib App", + "payNowBookSuccesstext1": "Pay Now using online payment service from secure payment gateways", + "payNowBookSuccesstext2": "You can also Pay Later via online payment or in Hospital", + "payLater": "Pay Later", + "askDocNotAllowed": "This service will be available for last 15 days’ doctor Visit only", + "moreVerify": "More Verification Options", + "welcomeBack": "Welcome back!", + "accountInfo": "Would you like to login with current username?", + "anotherAcc": "Use Another Account", + "next": "Next", + "firstName": "First Name", + "middleName": "Middle Name", + "lastName": "Last Name", + "female": "Female", + "male": "Male", + "preferredLanguage": "Preferred Language *", + "locationsRegister": "Where do you want to create this file?", + "ksa": "KSA", + "dubai": "Dubai", + "enterEmail": "Please Enter Email", + "family": "My Family", + "familyTitle": "My Family Files", + "addNewMember": "Add Family Member", + "sentRequests": "Sent Requests", + "recievedRequests": "Recieved Requests", + "manageFiles": "Manage Family Files", + "oxygenation": "Oxygenation", + "bodyMeasurements": "body Mass Index", + "temperature": "Temperature", + "pulse": "Pulse", + "respiration": "Respiration", + "bloodPressure": "Blood Pressure", + "painScale": "Pain Scale", + "weight": "Weight", + "height": "Height", + "heart": "Heart Rate", + "heightUnit": "height unit", + "weightUnit": "Weight Unit", + "unit": "Unit", + "request": "Request", + "memberName": "Member Name", + "switchLogin": "Switch", + "removeMember": "Remove", + "allowView": "Allow", + "rejectView": "Reject", + "deleteView": "Delete", + "myFamily": "MY FAMILY", + "approvals": "Approvals", + "approvalNo": "Approval No:", + "companyName": "Company Name:", + "receiptOn": "Receipt on:", + "expiryDate": "Expiry Date:", + "expiryPoints": "Expired", + "expiryOn": "Expiry on:", + "procedureName": "Procedure Name:", + "procedure": "Procedure", + "procedureStatus": "Procedure Status: ", + "usageStatus": "Usage Status", + "unusedCount": "Unused Count:", + "totalApproval": "Total approval unused", + "category": "Category: ", + "expirationDate": "Expiration Date: ", + "patientCard": "Patient Card ID: ", + "policyNumber": "Policy Number: ", + "seeDetails": "SEE DETAILS", + "insuranceCards": "Insurance Cards", + "requestType": "Request Type", + "registerInfoFamily": "How would like to add the new member?", + "removeFamilyMember": "Remove this member?", + "myMedicalFile": "My Medical File", + "myMedicalFileSubTitle": "All your medical records", + "viewMore": "View More", + "homeHealthCareService": "Home Health Care Service", + "onlinePharmacy": "Online Pharmacy", + "emergencyService": "Emergency Service", + "onlinePaymentService": "Online Payment Service", + "offersAndPackages": "Online transfer request", + "comprehensiveMedicalCheckup": "Comprehensive Medical Check-up", + "hmgService": "HMG Service", + "viewAllHabibMedicalService": "View All Habib Medical Service", + "viewAll": "View All", + "view": "View", + "contactUs": "Contact Us", + "contactUsLocation": "P.O.Box: 91877 - Riyadh 11643, King Fahad Road - Olaya - Kingdom of Saudi Arabia", + "contactUsTime": "Saturday - Wednesday 8:00 AM - 10 PM, Thursday 8:00 AM- 8:00 PM, Friday 2:00 PM - 8:00 PM", + "viewAllWaysReachUs": "View All Ways Reach Us", + "medicalProfile": "Medical Profile", + "consultation": "Consultation", + "logs": "Logs", + "textToSpeech": "How May I Help You?", + "locationDialogMessage": "Allow the HMG app to access your location will assist you in showing the hospitals according to the nearest to you.", + "userViewRequester": "User Wants to View Your Medical File", + "userView": "User Can View Your Medical File", + "parking": "Parking", + "alhabiServices": "HMG Service", + "parkingTitle": "Car service, car service, service to save parking information, return to it later, 1- By clicking on (Read the code), save the parking data. 2- By clicking on the button (view my car park), it shows you the car’s location in Google Maps. 3- Read another position by pressing the Clear Position Data button.", + "parkingDescription": "Parking service is for you to scan the car location so you can find it easy on you way out. click on (scan parking) button to save the parking location, then (show my park) button will appear to show you the way for the parking. if you want to rescan parking QR just click on (Clear My Data).", + "appointments": "Appointments", + "all2": "All", + "checkinOption": "Check-In", + "readBarcode": "Read Barcode", + "showMyPark": "Show My Park", + "clearMyData": "Clear My Data", + "floor": "Floor:", + "gate": "Gate:", + "building": "Building:", + "branch": "Branch:", + "emergencyServices": "Emergency Services", + "nearester": "Nearest ER", + "locationa": "Location", + "callNow": "Call now", + "ambulancerequest": "Ambulance", + "requestA": "Request", + "noBookedAppointments": "No Booked Appointments", + "noConfirmedAppointments": "No Confirmed Appointments", + "noArrivedAppointments": "No Arrived Appointments", + "myAppointmentsList": "Appointments", + "myAppointments": "My", + "radiology": "Radiology", + "radiologySubtitle": "Result", + "lab": "Lab", + "labSubtitle": "Results", + "medicines": "Medicines", + "medicinesSubtitle": "Prescriptions", + "vitalSigns": "Vital Signs", + "vitalSignsSubTitle": "Reports", + "myMedical": "Active", + "myMedicalSubtitle": "Medications", + "myDoctor": "My Doctor", + "myDoctorSubtitle": "List", + "eye": "Eye", + "eyeSubtitle": "Measurement", + "insurance": "Insurance", + "insuranceSubtitle": "Card", + "updateInsurance": "Update", + "updateInsuranceSubtitle": "Insurance", + "insuranceApproval": "Insurance", + "insuranceApprovalSubtitle": "Approvals", + "allergies": "Allergies", + "allergiesSubtitle": "List", + "myVaccines": "My Vaccines", + "myVaccinesSubtitle": "List", + "medical": "Medical", + "medicalSubtitle": "Report", + "monthly": "Monthly", + "monthlySubtitle": "Report", + "sick": "Sick", + "sickSubtitle": "Leaves", + "myBalance": "My Balance", + "myBalanceSubtitle": "Credit", + "patientCall": "Patient Call", + "patientCallSubtitle": "Service", + "smartWatches": "Smart Watches", + "smartWatchesSubtitle": "Pairing", + "myTrackers": "My Trackers", + "myTrackersSubtitle": "Service", + "askYour": "Ask Your", + "askYourSubtitle": "Doctor", + "internet": "Internet", + "internetSubtitle": "Pairing", + "chatbot": "Chatbot", + "chatbotSubtitle": "", + "timeLine": "Timeline", + "labOrders": "Lab Orders", + "billNo": "Bill No:", + "prescriptions": "Prescriptions", + "history": "History", + "orderNo": "Order No", + "orderDetails": "Order Details", + "deliveryDriverTrack": "Driver Tracking", + "deliveryLocation": "Delivery Location", + "driver": "Driver", + "vitalSign": "Vital Sign", + "monthlyReports": "Monthly Reports", + "km": "KMs:", + "km_": "KM", + "patientHealthSummaryReport": "Patient Health Summary Report", + "toViewTheTermsAndConditions": "To View the Terms and Conditions Report", + "clickHere": "Click here", + "iAgreeToTheTermsAndConditions": "I agree to the terms and conditions ", + "iAgreeToTheTermsAndConditionsSubtitle": "I agree to the terms and conditions ", + "save": "Save", + "userAgreement": "User Agreement", + "updateSuccessfully": "Update Successfully", + "checkVaccineAvailability": "CHECK VACCINE AVAILABILITY", + "myVaccinesAvailability": "My Vaccines Availability", + "paymentService": "Payment Service", + "paymentOnline": "Service", + "onlineCheckIn": "Online Check-In", + "myBalances": "My Balances", + "myWallet": "My Wallet", + "balanceAmount": "Wallet Amount", + "totalBalance": "Total Balance", + "createAdvancedPayment": "Recharge Wallet", + "advancePayment": "Advance Payment", + "advancePaymentLabel": "You can create and add an Advanced Payment for your account or other accounts.", + "fileNumber": "File Number", + "amount": "Amount *", + "depositorEmail": "Depositor Email *", + "notes": "Notes", + "selectPatientName": "Select Patient Name", + "selectFamilyPatientName": "Family Members", + "selectHospital": "Select Hospital", + "selectCity": "Select City", + "city": "City", + "distance": "Distance", + "otherAccount": "Other Account", + "selectBeneficiary": "Select Beneficiary", + "confirmThePayment": "Confirm The Payment", + "depositorName": "Depositor Name", + "mobileNumber": "Mobile Number", + "phoneNumber": "Phone Number", + "country": "Country", + "ok": "Ok", + "averageWaitingTime": "Average Waiting Time:", + "waitingTime": "Expected waiting time:", + "waterConsumedInWeek": "Water consumed in a week", + "waterConsumedInMonth": "Water consumed in a month", + "theVerificationCodeExpiresIn": "The Verification Code Expires in", + "pleaseEnterTheVerificationCode": "Please enter the verification code send to", + "eyeMeasurements": "Eye Measurements", + "measurements": "Measurements", + "classes": "Glasses", + "contactLens": "Contact Lens", + "rightEye": "Right Eye", + "sphere": "Sphere", + "cylinder": "Cylinder", + "axis": "Axis", + "prism": "Prism", + "va": "VA", + "leftEye": "Left Eye", + "brand": "Brand", + "power": "Power", + "diameter": "Diameter", + "activeMedications": "Active Medications", + "expDate": "Active Exp Date :", + "dailyQuantity": "Daily Quantity :", + "addReminder": "Add Reminder", + "cancelReminder": "Cancel Reminder", + "reminderDes": "Please select treatment start day and time to be notified when it's time to take the medicine", + "pleaseSelectAllQuestionToContinue": "Please answer all questions to continue...", + "startDay": "Start Day", + "endDay": "End Day", + "days": "Days ", + "pleaseVerify": "Please Verify ", + "scheduleTime": "Schedule time", + "askDoctor": "Ask Doctor", + "doctorResponses": "Doctor Responses", + "ne_w": "New", + "all": "All", + "dailyWater": "Daily Water Check", + "questionHere": "Enter the question here...", + "viewDoctorResponses": "View Doctor Responses", + "serviceInformationButton": "LOGIN / REGISTER", + "serviceInformationTitle": "Service Information", + "serviceInformation": "Service Information", + "homeHealthCare": "Home Health Care", + "noAppointmentAvailable": "No Available Appointments", + "homeHealthCareText": "This service provides a set of home health care services, continuous and comprehensive follow-up in their places of residence for those who cannot access health facilities, such as (laboratory analyzes - radiology - vaccinations - physical therapy), etc.", + "loginRegister": "Login/Register", + "orderLog": "Order Log", + "infoLab": "This service allows you to view the results of all laboratory tests performed in Al Habib Medical Group as well as sending the report via e-mail.", + "infoRadiology": "This service allows you to view the reports and photos of radiology in Al Habib Medical Group as well as send the report by e-mail.", + "noReviewsAvailable": "No Reviews Available", + "noLocationAvailable": "No Location Available", + "orders": "Orders", + "wishlist": "Wishlist", + "products": "Products", + "reviews": "Reviews", + "brands": "Brands", + "productDetails": "Product Details", + "medicationRefill": "Medication Refill", + "pillReminder": "Pill Reminder", + "shippingAddresses": "Shipping Addresses", + "reachUs": "Reach Us", + "ourLocations": "Our Locations", + "edit": "Edit", + "whatsApp": "Whats App", + "phone": "Phone", + "delete": "Delete", + "deleteAddress": "Are you sure want to delete", + "deletedAddres": "Address has been deleted", + "addAddress": "ADD A NEW ADDRESS", + "addNewAddress": "Add New Address", + "order": "My Order", + "delivered": "Delivered", + "pending": "Pending", + "enterNameHere": "Enter Your Name", + "processing": "Processing", + "cancelled": "Cancelled", + "writeReview": "Write Review", + "shareReview": "SHARE REVIEW", + "review": " reviews", + "viewMedicalFile": "View Details", + "viewAllServices": "View All Services", + "medicalFile": "Medical File", + "verified": "Verified", + "checkup": "Checkup", + "hhcHome": "Home", + "refferal": "E-Refferal", + "refferalTitle": "E-Refferal", + "refferalSubTitle": "Service", + "healthCare": "Health Care", + "emergency": "Emergency", + "erservices": "Emergency", + "services2": "Services", + "cantSeeProfile": "To view your medical profile, please log in or register now", + "loginRegisterNow": "Login or Register Now", + "hmgPharmacy": "HMG Pharmacy", + "ecommerceSolution": "Ecommerce Solution", + "comprehensive": "Comprehensive", + "onlineConsulting": "Online Consulting", + "pendingOrder": " PENDING", + "deliveredOrder": " DELIVERED", + "processingOrder": " PROCESSING", + "cancelledOrder": " CANCELLED", + "compare": " Compare", + "medicationsRefill": " Medication Refill", + "recommended": " Recommended for You", + "myPrescription": " My Prescriptions", + "quantity": " QTY ", + "reviewAppointment": " Review Appointment ", + "backMyAccount": "BACK TO MY ACCOUNT ", + "reviewSuccessful": "Review Successful", + "reviewShared": "Your review has been shared on product review section", + "reviewComment": "Your reviews help other to choose better product", + "shippedMethod": "SHIP BY:", + "orderDetail": "Order Details", + "orderSummary": "Order Summary", + "subtotal": "Subtotal", + "shipping": "Shipping", + "shipBy": "SHIP BY:", + "lakumPoints": "Lakum Points", + "useLakumPoints": "Use Lakum points", + "use": "USE", + "proceedPay": "PROCEED TO PAY", + "vat": "VAT (15%)", + "inclusiveVat": "(inclusive VAT)", + "items": "item(s)", + "checkOut": "CHECK OUT", + "sar": "SAR", + "aed": "AED", + "payOnline": "PAY ONLINE", + "cancelOrder": "CANCEL ORDER", + "confirmAddress": "CONFIRM ADDRESS ", + "confirmLocation": "CONFIRM LOCATION ", + "conditionsHMG": "Terms & Conditions ", + "conditions": "Terms & Conditions of Lakum", + "confirmDeleteMsg": "Are you sure! want to delete ", + "confirmDelete": "DELETE", + "confirmCancellation": "Are you sure! want to cancel this order ", + "orderNumber": "Order#: ", + "orderDate": "Date", + "itemsNo": "items(s)", + "noOrder": "You Don't have any orders.", + "noResult": "No Result.", + "nonRecommended": "No Recommended Products.", + "termsService": "Terms of Service", + "beforeusing": "Before using the checkup, please read Terms of Service.", + "accept": "I read and accept Terms of Service and Privacy Policy", + "dataSafeInfo": "Information that you provide is anonymous and not shared with anyone.", + "dataSafe": " Your data is safe.", + "informational": "Checkup is for informational purposes and is not a qualified medical opinion", + "notUseInEmerbency": "Do not use in emergencies.", + "notUseInEmerbencyDetails": "In case of health emergency, ", + "notUseInEmerbencyDetailsCall": "call the nearest emergency number immediately", + "checkDiagnosis": "Checkup is not a diagnosis.", + "remeberthat": "Remember that", + "loginToUseService": "You need to login to use this service", + "offersAndPromotions": "OFFERS & SPECIAL PROMOTIONS", + "offers": "OFFERS", + "myPrescriptions": "MY PRESCRIPTIONS", + "searchAndScanMedication": "SEARCH & SCAN FOR MEDICATION", + "shopByBrands": "Shop by Brands", + "recentlyViewed": "Recently Viewed", + "bestSellers": "Best Seller", + "deleteAllItems": "Delete All Items", + "total": "Total", + "totalWithColonRight": "Total:", + "selectAddress": "Select Address", + "shippingAddress": "SHIPPING ADDRESS", + "changeAddress": "Change Address", + "selectPaymentOption": "Select Payment Option", + "selectTamaraPlan": "Select Tamara Payment Plan", + "changeMethod": "Change Method", + "reviewOrder": "Review Order", + "active": "Active", + "inactive": "InActive", + "balance": "Balance", + "gained": "GAINED", + "consumed": "Consumed", + "transferred": "Transferred", + "riyal": "RIYAL", + "membersince": "MEMBER SINCE", + "identification": "Identification Number", + "lakumMobile": "Mobile Number", + "waitinggained": "Waiting gained", + "expired": "Expired", + "willBeExpired": "Will Be Expired", + "lakumPoint": "Lakum Points", + "activateLAKUMAccount": "Activate LAKUM Account", + "checkBeneficiary": "CHECK BENEFICIARY", + "beneficiaryName": "Beneficiary Name", + "accountActivation": "Account Activation", + "lakumTransfer": "Lakum Transfer", + "acceptLbl": "Accept", + "declineLbl": "Decline", + "selectGender": "Select Gender", + "iAmA": "I am a ...", + "selectAge": "Select Your Age", + "select": "Select", + "iAm": "I am", + "yearsOld": "years old", + "dragPoint": "Drag point to change your age", + "refine": "Refine", + "subGroup": "Subgroup", + "max": "Max", + "compeleteOrderMsg": "Order has been placed successfully!!", + "addToCompareMsg": "You have added a product to the Compare list", + "itInListMsg": "Item is already in the list", + "compareListFull": "Your compare list is full", + "addQuantity": "You should add quantity", + "addToCartMsg": "You have added a product to the cart", + "addToWishlistMsg": "You have added a product to the Wishlist", + "notifyMeMsg": "You will be notified when product available", + "removeFromWishlistMsg": "You have removed a product from the Wishlist", + "min": "Min", + "reset": "Reset", + "apply": "Apply", + "viewCategorise": "View All Categories", + "viewSubCategorise": "View All Sub Categories", + "categorise": "Categories", + "wishList": "WishList", + "myAccount": "My Account", + "cart": "Cart", + "alhabibapp": "Al Habib app", + "searchProductHere": "Search Product here", + "hhcNotAuthMsg": "This service provides a set of home health care services, continuous and comprehensive follow-up in their places of residence for those who cannot access health facilities, such as (laboratory analyzes - radiology - vaccinations - physical therapy), etc.", + "email": "Email *", + "book": "Book", + "appointmentLabel": "Appointment", + "bloodType": "Blood Type", + "maritalStatus": "Marital status", + "general": "General", + "profile": "My Profile", + "notifications": "Notifications", + "notificationDetails": "Notification Details", + "notificationDetailsa": "Notification Details", + "infoMyDoctorPoints": "", + "infoMyDoctor": "This service allows you to see all the doctors you have visited in Al Habib Medical Group, and through this service:", + "infoPrescriptions": "This service allows you to view all the medical prescriptions issued by Al Habib Medical Group, and through this service, you can:", + "infoMyPrescriptionPoints": "", + "infoInsuranceCards": "This service allows you to view all the insurance cards that recorded during your visits to Al Habib Medical Group in addition to:", + "infoInsuranceCardsPoints": "", + "infoAllergies": "This service allows you to view all types of allergies recorded during your visits to Al Habib Medical Group.", + "infoSickLeaves": "This service allows you to view all sick leaves that were taken in Al Habib Medical Group in addition to:", + "infoSickLeavePoints": "", + "infoApprovals": "This service allows you to view all approvals requests that have been sent to the insurance companies in addition to:", + "infoApprovalPoints": "", + "infoMonthReport": "Upon activation of this service, the system will send a monthly report automatically to the registered email which lists the vital signs and the results for the last visits made in AlHabib Medical Group.", + "languageSetting": "SMS, WhatsApp and Confirmation Calls Language", + "alert": "Alerts", + "emailAlert": "Alert by Email", + "smsAlert": "Alert by SMS", + "contactInfo": "Contact Information", + "emrgName": "Emergency Contact Name", + "emrgNo": "Emergency Contact Number", + "modes": "Modes", + "vibration": "Vibration Touch Feedback", + "blindModes": "Modes for Partially Blind", + "invertTheme": "Invert", + "offTheme": "Off", + "dimTheme": "Dim", + "bwTheme": "Black and White", + "permissions": "Permission", + "cameraPermission": "Camera", + "locationPermission": "Location", + "needPrescription": "This product requires a prescription", + "outOfStockMsg": "You have added product which is out of stock now, Please remove that!", + "noArabicLetters": "It Is Not Allow to Use Arabic Letters", + "noOffersAvailable": "No Offers Available!", + "accessibility": "Accessibility Mode", + "orderStatus": "Order Status", + "findUs": "Find Us", + "liveChat": "Live Chat", + "service": "Service", + "hmgServiceLabel": "HMG Service", + "healthWeatherIndicators": "Health Weather Indicators", + "healthTipsBasedOnCurrentWeather": "Health Tips Based On Current Weather", + "moreDetails": "More details", + "resendOrder": "Refill and Delivery", + "ports": "Ports", + "way": "Way", + "dailyDoses": "Daily Doses", + "period": "Period", + "duration": "المدة", + "cm": "CM", + "ft": "ft", + "kg": "kg", + "lb": "lb", + "birthDate": "Birth Date", + "dateOfBirth": "Date of Birth", + "mass": "Mass", + "tempC": "°C", + "bpm": "bpm", + "respirationSigns": "Respiration", + "sysDias": "SBP/DBP", + "body": "Body Mass", + "bodyString": "Body", + "face": "Face", + "retouch": "Re-touch", + "bikini": "Bikini", + "totalMinutes": "Total Minutes", + "feedback": "Feedback", + "likeToHear": "We would love to hear the feedback, concerns on healthcare services and eServices experience. Please use the below form", + "emptySubject": "Please enter the subject", + "emptyMessage": "Please enter message", + "selectAttachment": "Select Attachment", + "complainAppo": "Complaint for appointment", + "complainAppoAlt": "Complaint without appointment", + "messageType": "Message Type", + "feedbackType": "Feedback Type", + "compliment": "Appreciation", + "suggestion": "Suggestion", + "yourFeedback": "Your feedback was sent", + "selectPart": "Please select the part that complain about", + "number": "Number", + "notClassified": "Not classified", + "selectClinic": "Select Clinic", + "selectProject": "Select Hospital", + "searchItemError": "Item name should be more than 3 character", + "youCanFind": "You Can Find ", + "itemInSearch": " Item in Search", + "bloodDonation": "Blood Donation", + "bloodDonationInfo": "Through this service, you can register your name as a blood donor where the blood bank in the Habib Medical Group will communicate you in case of need for blood type.", + "bloodInstruction": "Enter the required information, in order to register for Blood Donation Service", + "viewTerms": "To view the terms and conditions", + "wantConnectHmgNetwork": "Dear customer there is no internet access, do you want to connect with HMG network to use our app, make sure you are in range of HMG network", + "failedToAccessHmgServices": "Connected with HMG Network,\n\nBut failed to access HMG services", + "offerAndPackages": "Offers and Packages", + "offerAndPackagesDetails": "This service allows you to view all HMG Offers:", + "invoiceNo": "Invoice No", + "invoiceDate": "Invoice Date", + "specialResult": "Special Result", + "generalResult": "General Result", + "showMoreBtn": "Flow Chart", + "value": "Value", + "report": "Radiology Report", + "openRad": "Open Image", + "sendCopy": "Email the Report", + "appoSurvey": "Survey", + "appoSurveySubtitle": "Survey", + "labResults": "Lab Results", + "doctorRating": "Doctor Rating", + "good": "Good", + "vGood": "Very Good", + "excellent": "Excellent", + "average": "Average", + "infoSigns": "This service allows you to view all vital signs were performed in the Habib Medical Group, e.x (height, weight, body mass index, heart rate, etc.) as well shows some statistics charts.", + "infoAdvancePayment": "This service designed so that you can deposit an amount in advance either in your account or in someone else's account with Al Habib Medical Group.", + "infoMyBalance": "This service allows you to check your balance in all branchs", + "erContant": "This service displays nearest branch among all the branches of Al Habib Medical Group based on your current location.", + "infoAmbulance": "Through this service, you can request evacuation by ambulance, whether from home or to home, in addition to a set of other services", + "infoMyAppointments": "This service allows you to see all the appointment you have visited in Al Habib Medical Group, and through this service:", + "infoTodo": "This service is designed to enable you to have a quick link to the list of tasks that need to be done", + "familyInfo": "Through this service, you will be able to link your family medical files to your medical file so that you can manage their records by login to your medical file.", + "rrtdDetails": "The Rapid response team provides a comprehensive medical service for all sorts of urgent and stable cases of all ages, including adult and paediatric patients, the service is covered by a fully equipped and highly trained medical team capable of providing the best medical care at the patient’s home.", + "onlineCheckInAgreement": "The online check-in is for non-life threatening situation. Call the red crescent (997) or go to the nearest emergency department if there are: \n\nsigns of stroke or heart attack \nhistory of seizure or syncope \nthere is limb or life threatening injury \npicture of severe injuries", + "infoEreferral": "This service allows you to submit a Referral request from any health care providers either inside or outside the kingdom of Saudi Arabia to any of HMG Hospitals, by filling some of the patient's data and attaching the medical reports, moreover you can track the request status (Under process, Accepted or Rejected)", + "erConsultation": "This service allows you to make an online virtual consultation via video call directly with the doctor from anywhere at any time.", + "myInvoice": "List", + "invoiceList": "My Invoice", + "allInvoices": "All Invoices", + "hospitals": "Hospitals", + "clinics": "Clinics", + "doctors": "Doctors", + "selectDoctor": "Select Doctor", + "thisItemIsNotAvailable": "This item is not available", + "beforeAfterImages": "Before & After Images", + "clinicAcceptLivecare": "No need to wait or visit You can now get medical consultation via Video call (LiveCare service) in The name of the clinic clinic and the doctor will contact you immediately", + "livecareModalTop": "This Clinic is Accepting LiveCare services", + "livecarePoint2": "A Specialized doctor will contact you", + "livecarePoint3": "A Doctor will be able to see your full medical file history", + "livecarePoint4": "Free Medicine Delivery Available", + "livecarePoint5": "No need to visit the service is in your place", + "bookImmediateLivecare": "I accept to get the service immediately", + "bookVideoLivecare2": "I don't need to visit the clinic", + "noThankyou": "No Thanks", + "visitClinic": "Schedule appointment with the doctor", + "generateCovidCertificate": "Generate Covid-19 Certificate", + "isReportOutsideKsa": "Is the certificate needed for outside KSA?", + "passportNumber": "Passport Number", + "enterPassportNumber": "Please confirm or update your passport number:", + "validPassportNumber": "Please enter valid passport number", + "continuePlan": "Continue with the treatment plan?", + "aboutApp": "About the app", + "aboutPoints": "Online Appointment Booking & rescheduling, Insurance approval status, Find A doctor, Ask your doctor, Medical prescriptions, Lab results, Hospitals contact numbers, Doctor profiles, Hospitals locations, Pharmacies Locations, Hospital's Virtual Tour, Official Social Media, Vaccines Schedule, Health Calculators, Other Services", + "termsConditions": "These Online Services Terms of Use (Service Terms) govern certain online services provided by Dr Sulaiman Al Habib Medical Services Group Company (HMG, we, us, our)...", + "receiveOtpToast": "Where would you like to receive OTP?", + "enterPhoneNumber": "Enter Phone Number", + "enterEmailDesc": "Enter your email address to complete the process of creating a medical file", + "enterPhoneDesc": "Enter your phone number to receive OTP verification code", + "pleaseChooseOption": "Please select from the below options to receive OTP", + "dontHaveAccount": "Don't have an account?", + "loginOrRegister": "Login or Register", + "myFiles": "My Files", + "resultsPending": "Results Pending", + "resultsAvailable": "Results Available", + "viewReport": "View Report", + "checkAvailability": "Check Availability", + "readInstructions": "Read Instructions", + "searchLabReport": "Search Lab Report", + "prescriptionDeliveryError": "This clinic doesn't support refill", + "prepareToElevate": "Prepared to elevate your health and well-being?", + "iAcceptTermsConditions": "I Accept the Terms and Conditions", + "alreadyHaveAccount": "Already have an account?", + "loginNow": "Login Now", + "notice": "Notice", + "oR": "OR", + "sendOTPWHATSAPP": "Send me OTP on Whatsapp", + "sendOTPSMS": "Send me OTP on SMS", + "fullName": "Full Name", + "married": "Married", + "uae": "United Arab Emirates", + "malE": "Male", + "loginBy": "Login By", + "loginByOTP": "Login By OTP", + "guest": "Guest", + "switchAccount": "Switch Account", + "allSet": "All Set! Now you can login with Face ID or Biometric", + "enableQuickLogin": "Enable Quick Login", + "enableMsg": "Enabling the quick login will verify through your existing device Face ID / Biometric", + "notNow": "Not Now", + "pendingActivation": "Pending Activation", + "awaitingApproval": "Awaiting Approval", + "enterValidNationalId": "Invalid Identification or file number", + "enterValidPhoneNumber": "Please enter a valid phone number", + "cannotEnterSaudiOrUAENumber": "You cannot enter Saudi Arabia (00966) or UAE (00971) phone numbers when 'Others' country is selected", + "ready": "Ready", + "medicalCentersWithCount": "{count} Medical Centers", + "medicalCenters": " Medical Centers", + "hospitalsWithCount": "{count} Hospitals", + "selectRegion": "Select Region", + "selectFacility": "Select Facilities", + "selectFacilitiesSubTitle": "Please select the facility for the appointment", + "selectHospitalSubTitle": "Please select the hospital for the appointment", + "news": "News", + "iAcceptThe": "I Accept the", + "personalDetailsVerification": "Personal Details Verification", + "otpVerification": "OTP Verification", + "weHaveSendOTP": "We have sent you the OTP code on", + "via": "via", + "forRegistrationVerification": "for registration verification", + "didntReceiveIt": "Didn't receive it?", + "resendOTP": "Resend", + "resendIn": "resend in", + "pleaseEnterAnationalID": "Please enter a national ID", + "pleaseEnterAFileNumber": "Please enter a file number", + "pleaseEnterAValidEmail": "Please enter a valid email", + "pleaseEnterFullName": "Please enter full name", + "pleaseAcceptTermsConditions": "Please accept the terms and conditions", + "pleaseEnterAValidIqamaID": "Please enter a valid Iqama ID", + "pleaseEnterAValidNationalID": "Please enter a valid national ID", + "pleaseEnterAValidDateOfBirth": "Please enter a valid date of birth", + "pleaseEnterAValidName": "Please enter a valid name", + "pleaseSelectAGender": "Please select a gender", + "pleaseSelectAMaritalStatus": "Please select a marital status", + "pleaseSelectACountry": "Please select a country", + "pleaseEnterEmail": "Please enter email", + "pleaseEnterAValidEmailFormat": "Please enter a valid email format", + "selectCountry": "Select Country", + "forLoginVerification": "for login verification", + "lastLoginBy": "Last login by", + "searchHospital": "Search Hospital", + "skip": "Skip", + "getStarted": "Get Started", + "onboardingHeading1": "Booking appointment has never been easy", + "onboardingBody1": "In few clicks find yourself having consultation with the doctor of your choice.", + "onboardingHeading2": "Access the medical history on finger tips", + "onboardingBody2": "Keep track on your medical history including labs, prescription, insurance, etc", + "normal": "Normal", + "attention": "Attention", + "monitor": "Monitor", + "noSpecialResult": "No Special Results", + "setTheDateRange": "Set The Date Range", + "historyFlowchart": "History FlowChart", + "to": "to", + "startDate": "Start Date", + "endDate": "End Date", + "hmgHospitals": "HMG Hospitals", + "hmcMedicalClinic": "HMC Medical Centers", + "applyFilter": "Apply Filter", + "facilityAndLocation": "Facility and Location", + "regionAndLocation": "Region And Locations", + "clearAllFilters": "Clear all filters", + "filters": "Filters", + "searchClinic": "Search Clinic", + "walkin": "Walk In", + "continueString": "Continue", + "laserClinic": "Laser Clinic", + "covid_info": "Dr. Sulaiman Al Habib hospitals are conducting a test for the emerging corona virus and issuing travel certificates 24/7 in a short time and with high accuracy. Those wishing to benefit from this service can visit one of Dr. Sulaiman Al Habib branches to conduct a corona test within few minutes, and obtain the result within several hours. Corona Virus Covid 19 testing service with PCR technology to detect the virus according to the highest international standards and with the latest high-precision RT-PCR devices (American GeneXpert and others), That is approved by the Food and Drug Authority as well as by the Saudi Center for Infectious Diseases Prevention.", + "appointmentDetails": "Appointment Details", + "checkingDoctorAvailability": "Checking doctor availability...", + "cancellingAppointmentPleaseWait": "Cancelling Appointment, Please Wait...", + "appointmentCancelledSuccessfully": "Appointment Cancelled Successfully", + "notConfirmed": "Not Confirmed", + "appointmentStatus": "Appointment Status", + "doctorWillCallYou": "The doctor will call you once the appointment time approaches.", + "getDirections": "Get Directions", + "notifyMeBeforeAppointment": "Notify me before the appointment", + "fetchingLabResults": "Fetching Lab Results...", + "fetchingRadiologyResults": "Fetching Radiology Results...", + "fetchingAppointmentPrescriptions": "Fetching Appointment Prescriptions...", + "noPrescriptionsForAppointment": "You don't have any prescriptions for this appointment.", + "amountBeforeTax": "Amount before tax", + "rebookAppointment": "Re-book Appointment", + "fetchingDoctorSchedulePleaseWait": "Fetching Doctor Schedule, Please Wait...", + "pickADate": "Pick a Date", + "confirmingAppointmentPleaseWait": "Confirming Appointment, Please Wait...", + "appointmentConfirmedSuccessfully": "Appointment Confirmed Successfully", + "appointmentPayment": "Appointment Payment", + "checkingPaymentStatusPleaseWait": "Checking payment status, Please wait...", + "paymentFailedPleaseTryAgain": "Payment Failed! Please try again.", + "appointmentCheckIn": "Appointment check in", + "insuranceExpiredOrInactive": "Insurance expired or inactive", + "totalAmountToPay": "Total amount to pay", + "vat15": "VAT 15%", + "liveCare": "LiveCare", + "recentVisits": "Recent Visits", + "searchByClinic": "Search By Clinic", + "tapToSelectClinic": "Tap to select clinic", + "searchByDoctor": "Search By Doctor", + "tapToSelect": "Tap to select", + "searchByRegion": "Search By Region", + "centralRegion": "Central Region", + "immediateConsultation": "Immediate Consultation", + "scheduledConsultation": "Scheduled Consultation", + "pharmaLiveCare": "Pharma LiveCare", + "notSureHelpMeChooseClinic": "Not sure? help me choose a clinic!", + "mentionYourSymptomsAndFindDoctors": "Mention your symptoms and find the list of doctors accordingly", + "immediateService": "Immediate service", + "noNeedToWaitGetMedicalConsultation": "No need to wait, you will get medical consultation immediately via video call", + "noVisitRequired": "No visit required", + "doctorWillContact": "Doctor will contact", + "specialisedDoctorWillContactYou": "A specialised doctor will contact you and will be able to view your medical history", + "freeMedicineDelivery": "Free medicine delivery", + "offersFreeMedicineDelivery": "Offers free medicine delivery for the LiveCare appointment", + "dentalChiefComplaints": "Dental Chief Complaints", + "viewAvailableAppointments": "View available appointments", + "doctorProfile": "Doctor Profile", + "waitingAppointment": "Waiting Appointment", + "hospitalInformation": "Hospital Information", + "fetchingAppointmentShare": "Fetching Appointment Share...", + "bookingYourAppointment": "Booking your appointment...", + "selectLiveCareClinic": "Select LiveCare Clinic", + "checkingForExistingDentalPlan": "Checking for an existing dental plan, Please wait...", + "dentalTreatmentPlan": "Dental treatment plan", + "youHaveExistingTreatmentPlan": "You have an existing treatment plan: ", + "mins": "Mins", + "totalTimeRequired": "Total time required", + "wouldYouLikeToContinue": "Would you like to continue it?", + "chooseDoctor": "Choose Doctor", + "viewNearestAppos": "View nearest available appointments", + "noDoctorFound": "No Doctor found for selected criteria...", + "yesPleasImInAHurry": "Yes please, I am in a hurry", + "fetchingFeesPleaseWait": "Fetching fees, Please wait...", + "noThanksPhysicalVisit": "No, Thanks. I would like a physical visit", + "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", + "reviewLiveCareRequest": "Review LiveCare Request", + "selectedLiveCareType": "Selected LiveCare Type", + "selectLiveCareCallType": "Select LiveCare call type", + "confirmingLiveCareRequest": "Confirming LiveCare request, Please wait...", + "unknownErrorOccurred": "Unknown error occurred...", + "liveCarePermissionsMessage": "LiveCare requires Camera, Microphone, Location & Notifications permissions to enable virtual consultation between patient & doctor, Please allow these to proceed.", + "liveCarePayment": "LiveCare Payment", + "mada": "Mada", + "visaOrMastercard": "Visa or Mastercard", + "tamara": "Tamara", + "fetchingApplePayDetails": "Fetching Apple Pay details, Please wait...", + "liveCarePendingRequest": "LiveCare Pending Request", + "callLiveCareSupport": "Call LiveCare Support", + "whatIsWaitingAppointment": "What is Waiting Appointment?", + "waitingAppointmentsFeature": "The waiting appointments feature allows you to book an appointment while you are inside the hospital building, and in case there is no available slot in the doctor's schedule.", + "appointmentWithDoctorConfirmed": "The appointment with the doctor is confirmed, but the time of entry is uncertain.", + "paymentWithinTenMinutes": "Note: You must have to pay within 10 minutes of booking, otherwise your appointment will be cancelled automatically", + "liveLocation": "Live Location", + "verifyYourLocationAtHospital": "Verify your location to be at hospital to check in", + "error": "Error", + "ensureWithinHospitalLocation": "Please ensure you're within the hospital location to perform online check-in.", + "nfcNearFieldCommunication": "NFC (Near Field Communication)", + "scanPhoneViaNFC": "Scan your phone via NFC board to check in", + "qrCode": "QR Code", + "scanQRCodeToCheckIn": "Scan QR code with your camera to check in", + "processingCheckIn": "Processing Check-In...", + "bookingWaitingAppointment": "Booking Waiting Appointment, Please wait...", + "enterValidIDorIqama": "Please enter a valid national ID or file number", + "selectAppointment": "Select Appointment", + "rebookSameDoctor": "Rebook with same doctor", + "queueing": "Queueing", + "inQueue": "In Queue", + "yourTurn": "Your Turn", + "halaFirstName": "Hala {firstName}!!!", + "thankYouForPatience": "Thank you for your patience, here is your queue number.", + "servingNow": "Serving Now", + "callForVitalSigns": "Call for vital signs", + "callForDoctor": "Call for Doctor", + "thingsToAskDoctor": "Things to ask your doctor today", + "improveOverallHealth": "What can I do to improve my overall health?", + "routineScreenings": "Are there any routine screenings I should get?", + "whatIsThisMedicationFor": "What is this medication for?", + "sideEffectsToKnow": "Are there any side effects I should know about?", + "whenFollowUp": "When should I come back for a follow-up?", + "goToHomepage": "Go to homepage", + "appointmentsList": "Appointments List", + "allAppt": "All Appt.", + "upcoming": "Upcoming", + "completed": "Completed", + "noAppointmentsYet": "You don't have any appointments yet.", + "viewProfile": "View Profile", + "choosePreferredHospitalForService": "Choose your preferred hospital for the service", + "noHospitalsFound": "No hospitals Found", + "cancelOrderConfirmation": "Are you sure you want to cancel this order?", + "orderCancelledSuccessfully": "Order has been cancelled successfully", + "requestID": "Request ID:", + "noCMCOrdersYet": "You don't have any CMC orders yet.", + "cmcOrders": "CMC Orders", + "summary": "Summary", + "selectedService": "Selected Service", + "requestSubmittedSuccessfully": "Your request has been successfully submitted.", + "hereIsYourRequestNumber": "Here is your request #: ", + "pleaseSelectHospitalToContinue": "Please select a hospital to continue", + "confirmSubmitRequest": "Are you sure you want to submit this request?", + "pendingOrderWait": "You have a pending order. Please wait for it to be processed.", + "noServicesAvailable": "No services available", + "selectAService": "Select a Service", + "comprehensiveCheckup": "Comprehensive Checkup", + "viewNearestHMGLocations": "View your nearest HMG locations", + "provideFeedbackOnServices": "Provide your feedback on our services", + "liveChatWithHMG": "Live chat option with HMG", + "send": "Send", + "status": "Status", + "sendingFeedback": "Sending Feedback...", + "selectFeedbackType": "Select Feedback Type", + "loadingAppointmentsList": "Loading appointments list...", + "noAppointmentsForFeedback": "You do not have any appointments to submit a feedback.", + "selectedAppointment": "Selected Appointment:", + "subject": "Subject", + "enterSubjectHere": "Enter subject here", + "message": "Message", + "enterMessageHere": "Enter message here", + "filesSelected": "{count} file(s) selected", + "otherDetails": "Other Details", + "medicalReport": "Medical Report", + "medicalReportNumber": "Medical Report {number}", + "patientIsInsured": "Patient is Insured", + "insuranceDocument": "Insurance Document", + "selectBranch": "Select Branch", + "patientInformation": "Patient information", + "patientLocation": "Where the patient located", + "identificationNumber": "Identification Number", + "enterIdentificationNumber": "Enter Identification Number*", + "patientName": "Patient Name*", + "referralRequesterInformation": "Referral requester information", + "enterReferralRequesterName": "Enter Referral Requester Name*", + "requesterName": "Requester Name", + "relationship": "Relationship", + "selectRelation": "Select Relation", + "otherName": "Other Name", + "otherNameHint": "Other Name*", + "requesterNameRequired": "Referral requester name is required", + "selectRelationshipRequired": "Please select a relationship", + "otherRelationshipNameRequired": "Other relationship name is required", + "identificationNumberRequired": "Identification number is required", + "patientNameRequired": "Patient name is required", + "enterPatientPhoneRequired": "Please Enter patient phone number", + "selectPatientCityRequired": "Please select patient city", + "medicalReportRequired": "At least one medical report is required", + "selectBranchRequired": "Please select a branch", + "insuranceDocumentRequired": "Insurance document is required for insured patients", + "searchResult": "Search Result", + "referralNo": "Referral No {number}", + "eReferral": "E Referral", + "referralCreatedSuccessfully": "Your Referral has been created Successfully.", + "hereIsYourReferralNumber": "Here is your Referral #: ", + "searchEReferral": "Search E-Referral", + "enterRequiredInfoToSearch": "Please enter the required information to search for an e-referral", + "selectPickupDirection": "Select Pickup Direction", + "selectDirection": "Select Direction", + "toHospital": "To Hospital", + "fromHospital": "From Hospital", + "selectWay": "Select Way", + "oneWay": "One Way", + "twoWay": "Two Way", + "selectPickupDetails": "Select Pickup Details", + "pleaseSelectDetailsOfPickup": " Please select the details of pickup", + "selectDetails": "Select Details", + "work": "Work", + "pick": "Pick", + "insideTheHome": "Inside the home", + "haveAnyAppointment": "Have any appointment", + "amountPaidAtHospital": "Amount will be paid at the hospital", + "submitRequest": "Submit Request", + "enterPickupLocationManually": "Enter Pickup Location Manually", + "enterPickupLocation": "Enter Pickup Location", + "trackingDetails": "Tracking Details", + "cancelRequest": "Cancel Request", + "shareLocationWhatsapp": "Share Your Live Location on Whatsapp", + "pleaseWaitForCall": "Please wait for the call", + "toHospitalLower": "to hospital", + "contact": "Contact", + "failed": "Failed", + "confirmationCall": "Confirmation Call", + "pickupFromHome": "Pickup Up from Home", + "onTheWayToHospital": " On The Way To Hospital", + "arrivedAtHospital": "Arrived at Hospital", + "orderCancel": "Order Cancel", + "emergencyCheckIn": "Emergency Check-In", + "erOnlineCheckInDescription": "This service lets patients register their ER appointment prior to arrival.", + "erOnlineCheckInSuccess": "Your ER Online Check-In has been successfully done. Please proceed to the waiting area.", + "erOnlineCheckInError": "Unexpected error occurred during check-in. Please contact support.", + "fetchingHospitalsList": "Fetching hospitals list...", + "fetchingPaymentInformation": "Fetching payment information...", + "erVisitDetails": "ER Visit Details", + "erClinic": "ER Clinic", + "vatWithAmount": "VAT 15% ({amount})", + "erAppointmentBookedSuccess": "Your appointment has been booked successfully. Please perform Check-In once you arrive at the hospital.", + "underProcessing": "Under processing", + "canceledByPatient": "Cancelled by patient", + "rapidResponseTeam": "Rapid Response Team", + "allFacilities": "All Facilities", + "selectLocation": "Select Location", + "pleaseSelectTheLocation": "Please select the location", + "viewLocationGoogleMaps": "View Location on Google Maps", + "callAmbulance": "Call Ambulance", + "requestAmbulanceInEmergency": "Request an ambulance in emergency from home or hospital", + "confirmation": "Confirmation", + "areYouSureYouWantToCallAmbulance": "Are you sure you want to call an ambulance?", + "getDetailsOfNearestBranch": "Get the details of nearest branch including directions", + "areYouSureYouWantToCallRRT": "Are you sure you want to call Rapid Response Team (RRT)?", + "priorERCheckInToSkipLine": "Prior ER Check-In to skip the line & payment at the reception.", + "areYouSureYouWantToMakeERCheckIn": "Are you sure you want to make ER Check-In?", + "checkingYourERAppointmentStatus": "Checking your ER Appointment status...", + "transportOptions": "Transport Options", + "selectHospitalForAdvancePayment": "Please select the hospital you want to make an advance payment for.", + "recharge": "Recharge", + "activityLevel": "Activity Level", + "selectActivityLevel": "Select Activity Level", + "caloriesPerDay": "Calories Per Day", + "dietType": "Diet Type", + "selectDietType": "Select Diet Type", + "bodyFrameSize": "Body Frame Size", + "selectBodyFrameSize": "Select Body Frame Size", + "averageCycleLength": "Average Cycle Length (Usually 28 days)", + "averageLutealPhase": "Average Luteal Phase Length(Usually 14 days)", + "convert": "Convert", + "calculate": "Calculate", + "healthCalculators": "Health Calculators", + "healthConverters": "Health Converters", + "generalHealth": "General Health", + "relatedToBMICalories": "Related To BMI, calories, body fat, etc to stay updated with your health.", + "selectCalculator": "Select Calculator", + "womensHealth": "Women's Health", + "relatedToPeriodsOvulation": "Related To periods, ovulation, pregnancy, and other topics.", + "bloodSugar": "Blood Sugar", + "trackYourGlucoseLevels": "Track your glucose levels, understand trends, and get personalized insights for better health.", + "bloodCholesterol": "Blood Cholesterol", + "monitorCholesterolLevels": "Monitor cholesterol levels, assess heart health risks, and take proactive steps for well-being.", + "triglyceridesFatBlood": "Triglycerides Fat Blood", + "understandTriglyceridesImpact": "Understand triglycerides' impact on heart health with personalized insights and expert recommendations.", + "bmiCalculator": "BMI\nCalculator", + "caloriesCalculator": "Calories\nCalculator", + "bmrCalculator": "BMR\nCalculator", + "idealBodyWeight": "Ideal Body\nWeight", + "bodyFatCalculator": "Body Fat\nCalculator", + "carbsProteinFat": "Carbs\nProtein & Fat", + "ovulationPeriod": "Ovulation\nPeriod", + "deliveryDueDate": "Delivery\nDue Date", + "low": "Low", + "preDiabetic": "Pre-diabetic", + "high": "High", + "elevated": "Elevated", + "recorded": "Recorded", + "noRecordsYet": "No records yet", + "lastRecord": "Last Record", + "addBloodSugar": "Add Blood Sugar", + "addBloodPressure": "Add Blood Pressure", + "addWeight": "Add Weight", + "bloodSugarDataSavedSuccessfully": "Blood Sugar Data saved successfully", + "bloodPressureDataSavedSuccessfully": "Blood Pressure Data saved successfully", + "weightDataSavedSuccessfully": "Weight Data saved successfully", + "pleaseWait": "Please wait", + "selectUnit": "Select Unit", + "selectMeasureTime": "Select Measure Time", + "selectArm": "Select Arm", + "enterBloodSugar": "Enter Blood Sugar", + "enterSystolicValue": "Enter Systolic Value", + "enterDiastolicValue": "Enter Diastolic Value", + "enterWeight": "Enter Weight", + "selectDuration": "Select Duration", + "systolic": "Systolic", + "diastolic": "Diastolic", + "sendReportByEmail": "Send Report by Email", + "enterYourEmailToReceiveReport": "Enter your email address to receive the report", + "addNewRecord": "Add new Record", + "healthTrackers": "Health Trackers", + "monitorBloodPressureLevels": "Monitor your blood pressure levels, track systolic and diastolic readings, and maintain a healthy heart.", + "trackWeightProgress": "Track your weight progress, set goals, and maintain a healthy body mass for overall wellness.", + "bookAppointment": "Book Appointment", + "completeCheckup": "Complete Checkup", + "indoorNavigation": "Indoor Navigation", + "eReferralServices": "E-Referral Services", + "dailyWaterMonitor": "Daily Water Monitor", + "fetchingYourWaterIntakeDetails": "Fetching your water intake details.", + "healthCalculatorsServices": "Health\nCalculators", + "healthConvertersServices": "Health\nConverters", + "smartWatchesServices": "Smart\nWatches", + "exploreServices": "Explore Services", + "medicalAndCareServices": "Medical & Care Services", + "hmgServices": "HMG Services", + "personalServices": "Personal Services", + "habibWallet": "Habib Wallet", + "loginToViewWalletBalance": "Login to view your wallet balance", + "loginToViewMedicalFile": "Login to view your medical file", + "addMember": "Add Member", + "addFamilyMember": "Add Family Member", + "pleaseFillBelowFieldToAddNewFamilyMember": "Please fill the below field to add a new family member to your profile", + "healthTools": "Health Tools", + "supportServices": "Support Services", + "virtualTour": "Virtual Tour", + "carParking": "Car Parking", + "latestNews": "Latest News", + "hmgContact": "HMG Contact", + "durationCannotExceed90": "Duration can not exceed 90 mins", + "unexpectedError": "Unexpected Error Occurred", + "gettingAmbulanceTransportOption": "Getting Ambulance Transport Option", + "fetchingAppointment": "Fetching Appointment", + "doYouWantToCancelTheRequest": "Do you want to cancel the request", + "cancellingRequest": "Cancelling request", + "fetchingTermsAndConditions": "Fetching Terms And Conditions", + "selectLocationPrescriptionDelivery": "Please select the location for prescription delivery", + "noRadiologyOrders": "No Radiology Orders Found", + "ageIsRequired": "Age is required", + "invalidAge": "Invalid age", + "ageMustBeBetween11And120": "Age must be between 11 and 120", + "heightIsRequired": "Height is required", + "invalidHeight": "Invalid height", + "weightIsRequired": "Weight is required", + "invalidWeight": "Invalid weight", + "timeToDrinkWater": "Time to Drink Water! 💧", + "stayHydratedDrinkWater": "Stay hydrated! Drink {amount}ml of water.", + "visitPharmacyOnline": "Visit Pharmacy Online", + "howAreYouFeelingToday": "How are you feeling today?", + "checkYourSymptomsWithScale": "Check your symptoms with this scale", + "checkYourSymptoms": "Check your symptoms", + "noUpcomingAppointmentPleaseBook": "You do not have any upcoming appointment. Please book an appointment", + "youHaveEROnlineCheckInRequest": "You have ER Online Check-In Request", + "quickLinks": "Quick Links", + "viewMedicalFileLandingPage": "View medical file", + "immediateLiveCareRequest": "Immediate LiveCare Request", + "yourTurnIsAfterPatients": "Your turn is after {count} patients.", + "dontHaveHHCOrders": "You don't have any Home Health Care orders yet.", + "hhcOrders": "HHC Orders", + "requestedServices": "Requested Services", + "selectServices": "Select Services", + "selectedServices": "Selected Services", + "createNewRequest": "Create new request", + "youHaveNoPendingRequests": "You have no pending requests.", + "noInsuranceDataFound": "No insurance data found...", + "noInsuranceUpdateRequest": "No insurance update requests found.", + "policyNumberInsurancePage": "Policy: {number}", + "insuranceExpired": "Insurance Expired", + "insuranceActive": "Insurance Active", + "patientCardID": "Patient Card ID: {id}", + "noInsuranceApprovals": "You don't have any insurance approvals yet.", + "noInsuranceWithHMG": "You don't have insurance registered with HMG.", + "referenceRange": "Reference Range", + "downloadReport": "Download report", + "generatingReport": "Generating report, Please wait...", + "noLabResults": "You don't have any lab results yet.", + "labResultDetails": "Lab Result Details", + "resultOf": "Result of", + "whatIsThisResult": "What is this result?", + "lastTested": "Last Tested", + "byVisit": "By Visit", + "byTest": "By Test", + "results": "results", + "viewResults": "View Results", + "rebook": "Rebook", + "noOphthalmologyAppointments": "No Ophthalmology appointments found...", + "noVitalSignsRecordedYet": "No vital signs recorded yet", + "appointmentsAndVisits": "Appointments & visits", + "labAndRadiology": "Lab & Radiology", + "activeMedicationsAndPrescriptions": "Recent Prescriptions", + "allPrescriptions": "All Prescriptions", + "allMedications": "All Medications", + "youDontHaveAnyPrescriptionsYet": "You don't have any prescriptions yet.", + "youDontHaveAnyCompletedVisitsYet": "You don't have any completed visits yet", + "others": "Others", + "allergyInfo": "Allergy Info", + "vaccineInfo": "Vaccine Info", + "updateInsuranceInfo": "Update Insurance", + "myInvoicesList": "My Invoices List", + "ancillaryOrdersList": "Ancillary Orders List", + "youDontHaveAnySickLeavesYet": "You don't have any sick leaves yet.", + "medicalReports": "Medical Reports", + "sickLeaveReport": "Sick Leave Report", + "weightTracker": "Weight Tracker", + "askYourDoctor": "Ask Your Doctor", + "internetPairing": "Internet Pairing", + "requested": "Requested", + "youDontHaveAnyMedicalReportsYet": "You don't have any medical reports yet.", + "requestMedicalReport": "Request medical report", + "youDoNotHaveAnyAppointmentsToRequestMedicalReport": "You do not have any appointments to request a medical report.", + "areYouSureYouWantToRequestMedicalReport": "Are you sure you want to request a medical report for this appointment?", + "yourMedicalReportRequestSubmittedSuccessfully": "Your medical report request has been successfully submitted.", + "monthlyHealthSummaryReportDisclaimer": "This monthly health summary report reflects the health indicators and analysis results of the latest visits. Please note that this will be sent automatically from the system and it's not considered as a official report so no medical decision should be taken based on it", + "updatingMonthlyReportStatus": "Updating Monthly Report Status...", + "monthlyReportStatusUpdatedSuccessfully": "Monthly Report Status Updated Successfully", + "whoCanViewMyMedicalFile": "Who can view my medical file?", + "acceptedYourRequestToBeYourFamilyMember": "{status} your request to be your family member", + "canViewYourFile": "can view your file", + "hasARequestPendingToBeYourFamilyMember": "has a request {status} to be your family member", + "wantsToAddYouAsTheirFamilyMember": "wants to add you as their family member", + "rejectedYourRequestToBeYourFamilyMember": "{status} your request to be your family member", + "rejectedYourFamilyMemberRequest": "{status} your family member request", + "notAvailable": "N/A", + "selectAProfile": "Please select a profile", + "switchFamilyFile": "Switch from the below list of medical file", + "medicalFiles": "Medical Files", + "addANewFamilyMember": "Add a new family member", + "viewInvoiceDetails": "View invoice details", + "outPatient": "OutPatient", + "invoiceDetails": "Invoice Details", + "sendingEmailPleaseWait": "Sending email, Please wait...", + "emailSentSuccessfullyMessage": "Email sent successfully.", + "discount": "Discount", + "paid": "Paid", + "fetchingInvoiceDetails": "Fetching invoice details, Please wait...", + "scanQRCode": "Scan QR code", + "parkingSlotDetails": "Parking Slot Details", + "slotNumber": "Slot: {code}", + "basement": "Basement: {description}", + "parkingDate": "Date: {date}", + "parkedSince": "Parked Since: {time}", + "resetDirection": "Reset Direction", + "noPrescriptionOrdersYet": "You don't have any prescription orders yet.", + "fetchingPrescriptionPDFPleaseWait": "Fetching prescription PDF, Please wait...", + "ratingValue": "Rating: {rating}", + "downloadPrescription": "Download Prescription", + "fetchingPrescriptionDetails": "Fetching prescription details...", + "switchBackFamilyFile": "Switch Back To Family File", + "profileAndSettings": "Profile & Settings", + "quickActions": "Quick Actions", + "notificationsSettings": "Notifications Settings", + "touchIDFaceIDServices": "Touch ID / Face ID Services", + "personalInformation": "Personal Information", + "updateEmailAddress": "Update Email Address", + "helpAndSupport": "Help & Support", + "permissionsProfile": "Permissions", + "privacyPolicy": "Privacy Policy", + "deactivateAccount": "Deactivate account", + "ageYearsOld": "{age} {yearsOld}", + "youDontHaveRadiologyOrders": "You don't have any radiology results yet.", + "radiologyResult": "Radiology Result", + "viewRadiologyImage": "View Radiology Image", + "rateClinic": "Rate Clinic", + "back": "Back", + "rateDoctor": "Rate Doctor", + "howWasYourLastVisitWithDoctor": "How was your last visit with doctor?", + "dateOfBirthSymptoms": "What is your Date of Birth?", + "genderSymptoms": "What is your gender?", + "heightSymptoms": "How tall are you?", + "weightSymptoms": "What is your weight?", + "femaleGender": "Female", + "previous": "Previous", + "selectedOrgans": "Selected Organs", + "noOrgansSelected": "No organs selected yet", + "organSelector": "Organ Selector", + "noPredictionsAvailable": "No Predictions available", + "areYouSureYouWantToRestartOrganSelection": "Are you sure you want to restart the organ selection?", + "possibleConditions": "Possible Conditions", + "pleaseSelectAtLeastOneRiskBeforeProceeding": "Please select at least one risk before proceeding", + "aboveYouSeeCommonRiskFactors": "Above you see the most common risk factors. Although /diagnosis may return questions about risk factors, ", + "readMore": "Read more", + "riskFactors": "Risk Factors", + "noRiskFactorsFound": "No risk factors found", + "basedOnYourSelectedSymptomsNoRiskFactors": "Based on your selected symptoms, no additional risk factors were identified.", + "messageNotification": "Message", + "attachedImage": "Attached Image", + "failedToLoadImage": "Failed to load image", + "typeNotification": "Type", + "pleaseSelectAtLeastOneOptionBeforeProceeding": "Please select at least one option before proceeding", + "suggestions": "Suggestions", + "pleaseGoBackAndSelectOrgansFirst": "Please go back and select organs first", + "symptomsSelector": "Symptoms Selector", + "possibleSymptomsRelatedTo": "Possible symptoms related to", + "suggestionAIListDescription": "This is a list of symptoms suggested by our AI, based on the information gathered so far during the interview", + "analyzing": "Analyzing...", + "seekMedicalAdvice": "Seek Medical Advice", + "monitorDescription": "No need to seek medical advice. Just keep healthy routine.", + "seekMedicalAdviceDescription": "Not emergency but better to monitor the symptoms.", + "emergencyDescription": "Need to consult doctor as soon as possible before getting too late.", + "colorScience": "Color Science", + "noNeedToVisitDoctor": "No need to visit doctor", + "commonSymptom": "Common Symptom", + "notApplicable": "Not Applicable", + "emergencyTriage": "Emergency", + "emergencyEvidenceDetected": "Emergency evidence detected. Please seek medical attention.", + "noQuestionItemsAvailable": "No question items available", + "pleaseAnswerAllQuestionsBeforeProceeding": "Please answer all questions before proceeding", + "triage": "Triage", + "areYouSureYouWantToExitProgress": "Are you sure you want to exit? Your progress will be lost.", + "noQuestionAvailable": "No question available", + "possibleSymptom": "Possible symptom: ", + "symptomsCheckerFindingScore": "- Symptoms checker finding score", + "notSet": "Not set", + "years": "Years", + "symptomsChecker": "Symptoms Checker", + "helloIsYourInformationUpToDate": "Hello {name}, Is your information up to date?", + "noEditAll": "No, Edit all", + "yesItIs": "Yes, It is", + "age": "Age", + "youDontHaveAnyAncillaryOrdersYet": "You don't have any ancillary orders yet.", + "invoiceWithNumber": "Invoice: {invoiceNo}", + "queued": "Queued", + "checkInReady": "Check-in Ready", + "checkIn": "Check In", + "viewDetails": "View Details", + "selectPaymentMethod": "Select Payment Method", + "processingPaymentPleaseWait": "Processing payment, Please wait...", + "finalizingPaymentPleaseWait": "Finalizing payment, Please wait...", + "generatingInvoicePleaseWait": "Generating invoice, Please wait...", + "hereIsYourInvoiceNumber": "Here is your invoice #: ", + "paymentCompletedSuccessfully": "Payment Completed Successfully", + "failedToInitializeApplePay": "Failed to initialize Apple Pay. Please try again.", + "cash": "Cash", + "approved": "Approved", + "approvalRejectedPleaseVisitReceptionist": "Approval Rejected - Please visit receptionist", + "sentForApproval": "Sent For Approval", + "ancillaryOrderDetails": "Ancillary Order Details", + "noProceduresAvailableForSelectedOrder": "No Procedures available for the selected order.", + "procedures": "Procedures", + "totalAmount": "Total Amount", + "covered": "Covered", + "vatPercent": "VAT (15%)", + "proceedToPayment": "Proceed to Payment", + "supportedSmartWatches": "Supported Smart Watches", + "pleaseMakeSureSamsungWatchConnected": "Please make sure that your Samsung Watch is connected to your Phone, is actively synced & updated.", + "beforeSyncingDataFollowInstructions": "Before syncing data, please make sure that you have followed the instructions properly.", + "viewWatchInstructions": "View watch instructions", + "healthConnectAppNotInstalled": "Seems like you do not have Health Connect App installed. Please install it from the Play Store to sync your health data.", + "setTimerOfReminder": "Set the timer of reminder", + "youHaveAppointmentWithDr": "You have appointment with Dr. ", + "hours": "Hours", + "secs": "Secs", + "noAllergiesDataFound": "No allergies data found...", + "heartRateDescription": "Your heart rate indicates how many times your heart beats per minute", + "bloodOxygenDescription": "Blood oxygen level indicates how much oxygen your red blood cells are carrying", + "stepsDescription": "Number of steps taken throughout the day", + "caloriesDescription": "Calories burned during physical activity", + "distanceDescription": "Distance covered throughout the day", + "overview": "Overview", + "details": "Details", + "healthy": "Healthy", + "warning": "Warning", + "vitalSignDetails": "Vital Sign Details", + "resultOfNoDate": "Result of --", + "referenceRangeBetween": "Reference range: {low} – {high} {unit}", + "referenceRangeMin": "Reference range: ≥ {low} {unit}", + "referenceRangeMax": "Reference range: ≤ {high} {unit}", + "noHistoryAvailable": "No history available", + "bmiDescription": "BMI is a measurement based on height and weight that estimates body fat.", + "heightDescription": "Height is measured in centimeters and is used to calculate BMI and dosage recommendations.", + "weightDescription": "Weight helps track overall health, nutrition, and changes over time.", + "bloodPressureDescription": "Blood pressure reflects the force of blood against artery walls. It is shown as systolic/diastolic.", + "temperatureDescription": "Body temperature reflects how hot your body is and may change with infection or inflammation.", + "heartRateDescriptionVital": "Heart rate refers to the number of heart beats per minute.", + "respiratoryRateDescription": "Respiratory rate is the number of breaths taken per minute.", + "bmiAdvice": "Maintain a balanced diet and regular activity. If your BMI is high or low, consider consulting your doctor.", + "heightAdvice": "No action is needed unless your measurement looks incorrect. Update it during your next visit.", + "weightAdvice": "Monitor weight changes. Sudden gain or loss may require medical advice.", + "bloodPressureAdvice": "Keep tracking your blood pressure. High or low readings should be discussed with your doctor.", + "temperatureAdvice": "If you have a persistent fever or symptoms, contact your healthcare provider.", + "heartRateAdvice": "Track your heart rate trends. If you feel dizziness or chest pain, seek medical care.", + "respiratoryRateAdvice": "If you notice shortness of breath or abnormal breathing, seek medical advice.", + "whatShouldIDoNext": "What should I do next?", + "customizeDrinkCup": "Customize your drink cup", + "tipsToStayHydrated": "Tips to stay hydrated", + "drinkBeforeYouFeelThirsty": "Drink before you feel thirsty", + "keepRefillableBottleNextToYou": "Keep a refillable bottle next to you", + "trackYourDailyIntakeToStayMotivated": "Track your daily intake to stay motivated", + "chooseSparklingWaterInsteadOfSoda": "Choose sparkling water instead of soda", + "switchCup": "Switch Cup", + "plainWater": "Plain Water", + "yourGoal": "Your Goal", + "remaining": "Remaining", + "hydrationStatus": "Hydration Status", + "areYouSureYouWantToCancelAllWaterReminders": "Are you sure you want to cancel all water reminders?", + "remindersSet": "Reminders Set!", + "dailyWaterRemindersScheduledAt": "Daily water reminders scheduled at:", + "waterConsumption": "Water Consumption", + "selectNumberOfReminders": "Select Number of Reminders", + "h2oSettings": "H20 Settings", + "settingsSavedSuccessfully": "Settings saved successfully", + "yourName": "Your Name", + "ageYears": "Age (11-120) yrs", + "numberOfRemindersInADay": "Number of reminders in a day", + "medications": "Medications", + "remarks": "Remarks: ", + "someRemarksAboutPrescription": "some remarks about the prescription will be here", + "notifyMeBeforeConsumptionTime": "Notify me before the consumption time", + "noMedicationsToday": "No medications today", + "route": "Route", + "frequency": "Frequency", + "reminders": "Reminders", + "reminderAddedToCalendar": "Reminder added to calendar ✅", + "errorWhileSettingCalendar": "Error while setting calendar: {error}", + "instructions": "Instructions", + "requests": "Requests", + "thisWeek": "This Week", + "lastMonth": "Last Month", + "lastSixMonths": "Last 6 Months", + "selectTime": "Select Time", + "pleaseWaitYouWillBeCalledForVitalSigns": "Please wait! you will be called for vital signs", + "pleaseVisitRoomForVitalSigns": "Please visit Room {roomNumber} for vital signs", + "pleaseVisitRoomToTheDoctor": "Please visit Room {roomNumber} to the Doctor", + "erOnlineCheckInRequest": "ER Online Check-In Request", + "indoor": "Indoor", + "navigation": "Navigation", + "health": "Health", + "calculators": "Calculators", + "converters": "Converters", + "guide": "Guide", + "liveCareServiceDesc": "Get medical advice with a specialist doctor Via a video call", + "bloodGroup": "Blood: {bloodType}", + "medicalServices": "Medical Services", + "insuranceAndPayments": "Insurance & Payments", + "trackerAndOthers": "Tracker & Others", + "bmi": "BMI", + "yesPleaseINeedHelp": "Yes, Please I need help", + "confirmYourLocation": "Confirm Your Location", + "confirmYourLocationDesc": "Please confirm your present location to view appropriate directions.", + "insideHospital": "I am inside the hospital", + "outsideHospital": "I am outside the hospital", + "servicePriceList": "Services Price List", + "servicePriceListDesc": "Below is the services price list outline the healthcare services fees for cash payments, where the insurance coverage, eligibility, and co-payment deductions will be processed in accordance with the insurance policy terms and the table of benefits of each insurance providers:", + "servicePriceListRights": "The patient has the right to a free follow-up within 14 days of initial visit", + "serviceName": "Service Name", + "noFreeSlot": "No free slot available for the selected date. Please select another date or check back later.", + "noThanksIKnowTheClinic": "No, Thanks. I Know the clinic", + "unableToSendOTP": "Unable to send Verification OTP", + "aiOverView": "AI Overview", + "generateAiAnalysis": "Generate AI analysis for this order", + "aiAnalysis": "AI Analysis", + "prediction": "Prediction", + "prevention": "Prevention", + "disclaimer": "Disclaimer", + "thisAboveInfo": "The above information is generated by AI based on your lab results and is intended for informational purposes only. It should not be considered a medical diagnosis or treatment plan. Always consult with your healthcare provider for personalized medical advice and before making any health-related decisions.", + "aiDisclaimer": "Your lab result data will be securely shared with our AI Analyzer for analysis. This helps provide personalized health insights. Do you want to proceed?", + "consent": "Consent", + "bmiNormalDescription": "Your BMI is within the healthy range. Continue a balanced diet, regular physical activity, and routine checkups to maintain good health. Monitor any significant changes over time.", + "bmiUnderweightDescription": "BMI suggests you are underweight. Consider increasing calorie intake with nutrient-dense foods, include resistance training to build muscle, and consult a healthcare professional to check for underlying causes.", + "bmiOverweightDescription": "BMI indicates overweight. Aim for gradual, sustainable weight loss through a modest calorie deficit, regular physical activity, and healthier food choices. Seek medical advice before major lifestyle changes.", + "caloriesMaintenanceDescription": "Estimated daily calories to maintain your current weight given your activity level and metabolism. Use this as a baseline: increase slightly for muscle gain, or create a small deficit for gradual weight loss. Track progress and adjust every 2–4 weeks.", + "caloriesModerateDeficitDescription": "A moderate calorie reduction designed for steady, sustainable weight loss (typically 0.25–0.5 kg per week). Combine with resistance training and adequate protein to preserve muscle. Avoid extreme cuts and consult a professional if you have medical conditions.", + "caloriesAggressiveDeficitDescription": "A large calorie reduction that may produce faster weight loss but can be hard to sustain and increase risk of nutrient deficiencies, fatigue, or muscle loss. Not recommended long-term; seek guidance from a healthcare or nutrition professional before continuing.", + "bodyFatEssentialDescription": "Your body fat percentage is in the essential/athletic range. This level is typical for athletes and indicates very low body fat. While this may be optimal for performance, ensure you maintain adequate nutrition and hormone function. Consult a healthcare professional if you experience fatigue, hormonal issues, or other health concerns.", + "bodyFatFitnessDescription": "Your body fat percentage is in the fitness range. This indicates a healthy level of body fat associated with good physical conditioning. Maintain your current lifestyle habits including regular exercise and balanced nutrition to sustain this healthy range.", + "bodyFatAverageDescription": "Your body fat percentage is in the average/acceptable range. This is considered a healthy range for general population. To improve body composition, consider incorporating strength training, cardiovascular exercise, and a balanced diet. Focus on gradual, sustainable changes for long-term health.", + "bodyFatObeseDescription": "Your body fat percentage is above the recommended healthy range. This may increase health risks including cardiovascular disease, diabetes, and joint problems. Consider consulting a healthcare provider or registered dietitian to develop a personalized plan that includes balanced nutrition, regular physical activity, and lifestyle modifications for sustainable weight management.", + "bmrNormalDescription": "Your Basal Metabolic Rate (BMR) is within the expected range for your profile. BMR is the energy your body needs at rest to maintain vital functions (breathing, circulation, temperature). Use this value as the baseline for estimating total daily energy needs by applying an activity multiplier. Maintain a balanced diet and regular physical activity to support metabolic health.", + "bmrLowDescription": "Your BMR is lower than typical for your profile. Possible causes include lower lean muscle mass, age-related metabolic decline, or metabolic adaptation from prolonged calorie restriction. Consider focusing on resistance training to build/maintain muscle, ensure adequate protein and micronutrient intake, and consult a healthcare professional if this is unexpected.", + "bmrHighDescription": "Your BMR is higher than average for your profile. This can reflect greater lean mass, younger age, or a naturally higher metabolic rate, meaning you burn more energy at rest. Use this information to tailor calorie targets: higher needs for maintenance or muscle gain, moderate deficit for weight loss. Seek medical advice if you notice rapid unexplained changes.", + "ibwAtTargetDescription": "Your weight is at the ideal target. Maintain your current habits — balanced diet and regular activity — to keep this.", + "ibwBelowTargetDescription": "You are below the ideal weight by {kg} kg. Aim to gradually increase weight with a modest calorie surplus, nutrient-dense foods, and resistance training.", + "ibwAboveTargetDescription": "You are above the ideal weight by {kg} kg. Aim for a gradual, sustainable weight reduction through a moderate calorie deficit, increased activity, and balanced nutrition.", + "ibwCloseToRangeDescription": "Your weight is close to the ideal range. Maintain a balanced diet and regular activity; follow personalized advice from a healthcare professional if needed.", + "ibwUnderweightDescription": "You are below the ideal weight by {kg} kg. Focus on increasing calorie intake with nutrient-dense foods, prioritize protein and resistance training to build healthy mass, and consider consulting a healthcare professional.", + "ibwUnderweightGenericDescription": "You appear underweight compared to the ideal. Consider increasing calorie intake with nutrient-dense foods and resistance training; seek professional guidance if needed.", + "ibwOverweightDescription": "You are above the ideal weight by {kg} kg. Aim for a gradual, sustainable weight loss strategy — moderate calorie deficit, regular physical activity, and balanced nutrition. Consult a professional before major changes.", + "ibwOverweightGenericDescription": "You appear above the ideal weight. Consider a gradual, sustainable calorie deficit combined with activity and balanced nutrition; consult a professional if needed.", + "dietVeryLowCarbsDescription": "Very low‑carb (ketogenic) approach: minimal carbohydrates, higher fat and moderate protein. May support rapid weight loss and improved blood sugar control for some, but can be hard to sustain and may cause nutrient gaps. Monitor hydration/electrolytes and consult a professional for long‑term use.", + "dietLowCarbsDescription": "Low‑carb, higher‑protein plan: reduced carbohydrates with increased protein to support satiety and muscle maintenance. Helpful for weight management and glycemic control when balanced with vegetables and healthy fats. Ensure adequate fiber and micronutrients.", + "dietModerateCarbsDescription": "Moderate carbohydrate intake with balanced protein and fats: provides steady energy for daily activity and exercise while allowing flexibility. Suitable for many people aiming for sustainable weight management and performance.", + "dietUSDAGuidelinesDescription": "USDA‑based balanced pattern: emphasizes fruits, vegetables, whole grains, lean proteins, and limited added sugars and saturated fats. Evidence‑based framework for general health, nutrient adequacy, and chronic disease prevention.", + "dietZoneDietDescription": "Zone Diet (~40% carbs / 30% protein / 30% fat): emphasizes hormonal balance and portion control. May improve body composition and energy for some, but requires planning; personalize with a nutrition professional.", + "contextDependent": "Context Dependent", + "calculatedValue": "Calculated Value", + "calculationFormula": "Calculation Formula", + "loadingAIAnalysis": "Analysing your lab results, Please be patient and let the AI do the magic, This might take some time.", + "symptoms": "Symptoms", + "insuranceInActive": "Insurance Inactive", + "insuranceInActiveContactSupport": "You have a valid insurance but it is currently inactive in HMG. Please contact HMG customer support to activate it.", + "updateAppNow": "Update App Now", + "Dr": "Dr.", + "reschedulingAppo": "Rescheduling Appointment, Please wait...", + "invalidEligibility": "You cannot make online payment because you are not eligible to use the provided service.", + "invalidInsurance": "You cannot make online payment because you do not have a valid insurance.", + "continueCash": "Continue as cash", + "timeFor": "Time For", + "hmgPolicies": "HMG Policies", + "darkMode": "Dark Mode", + "generateAiAnalysisResult": "Generate AI analysis for this result", + "ratings": "Ratings", + "hmgPharmacyText": "Al Habib Pharmacy, the complete online Pharmaceutical store brought to you by Dr. Sulaiman Al Habib Medical Services Group.", + "insuranceRequestSubmittedSuccessfully": "Your insurance update request has been successfully submitted. You will be notified once completed.", + "updatingEmailAddress": "Updating email address, Please wait...", + "verifyInsurance": "Verify Insurance", + "tests": "tests", + "calendarPermissionAlert": "Please grant calendar access permission from app settings to set medication reminder.", + "sortByLocation": "Sort by location" +}; +static const Map> mapLocales = {"ar_SA": _ar_SA, "en_US": _en_US}; +} From ebfefefec0c6c3c1c054cce0bd58962f3c8ac53c Mon Sep 17 00:00:00 2001 From: tahaalam Date: Sun, 12 Apr 2026 10:57:06 +0300 Subject: [PATCH 02/45] issue fix for the projects having distance not found if the permission for the application --- .../emergency_services/emergency_services_view_model.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/features/emergency_services/emergency_services_view_model.dart b/lib/features/emergency_services/emergency_services_view_model.dart index c8a16455..8c2dd6ba 100644 --- a/lib/features/emergency_services/emergency_services_view_model.dart +++ b/lib/features/emergency_services/emergency_services_view_model.dart @@ -274,7 +274,6 @@ class EmergencyServicesViewModel extends ChangeNotifier { void navigateTOAmbulancePage() { placeValueInController(); - getProjects(); flushData(); selectedFacility = FacilitySelection.ALL; @@ -282,6 +281,7 @@ class EmergencyServicesViewModel extends ChangeNotifier { locationUtils!.getLocation( isShowConfirmDialog: true, onSuccess: (position) { + getProjects(); updateBottomSheetState(BottomSheetType.FIXED); navServices.push( CustomPageRoute(page: CallAmbulancePage(), direction: AxisDirection.down), From 12b611500de0aec7ce010b908d93661ce9c9d4d9 Mon Sep 17 00:00:00 2001 From: tahaalam Date: Sun, 12 Apr 2026 10:58:12 +0300 Subject: [PATCH 03/45] application to get the fine location permission added to the manifest to get the accurate location --- android/app/src/main/AndroidManifest.xml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 0e1749d6..fef05b1a 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -39,7 +39,6 @@ - @@ -52,7 +51,7 @@ - + From fb93aa109214f580b972c169afc2361195adf70f Mon Sep 17 00:00:00 2001 From: tahaalam Date: Sun, 12 Apr 2026 12:34:15 +0300 Subject: [PATCH 04/45] ambulance call page changes: 1. icon change for the success of ambulance call and rrt. 2. flow changed to first select the appoiintment then hospital. 3. location accorate enabled. --- assets/images/png/ambulance_section.png | Bin 0 -> 297087 bytes assets/images/png/rrt_section.png | Bin 0 -> 267118 bytes lib/core/app_assets.dart | 5 + lib/core/utils/utils.dart | 22 ++++ .../emergency_services_view_model.dart | 38 ++++--- .../call_ambulance/call_ambulance_page.dart | 103 ++++++++++-------- .../call_ambulance/tracking_screen.dart | 21 +++- .../order_tracking/request_tracking.dart | 5 - 8 files changed, 124 insertions(+), 70 deletions(-) create mode 100644 assets/images/png/ambulance_section.png create mode 100644 assets/images/png/rrt_section.png diff --git a/assets/images/png/ambulance_section.png b/assets/images/png/ambulance_section.png new file mode 100644 index 0000000000000000000000000000000000000000..62ca1716ba6cf0a6a0f6e13170068dde7f926d98 GIT binary patch literal 297087 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�LW{R*r>|Y$QdwG`h4_g%13^zm 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 zģ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
    OtfGAt-lm~dT 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 z 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�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�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 z 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%0APOU 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Μr@eU+00pb~w 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

    gSIu1~v-wV_J{5I$X*fel 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 G8TLPZ?HgYJ literal 0 HcmV?d00001 diff --git a/assets/langs/ar-SA.json b/assets/langs/ar-SA.json index 5304cc8f..eaf844e7 100644 --- a/assets/langs/ar-SA.json +++ b/assets/langs/ar-SA.json @@ -83,6 +83,8 @@ "bookSuccessConfirmMore2412": "ستكون عملية الدفع عبر الإنترنت متاحة قبل 24 ساعة ��ن الموعد.", "upcomingPaymentPending": "سيتم تفعيل الدفع عبر الإنترنت قبل 24 ساعة من موعد الموعد", "upcomingPaymentNow": "ادفع عبر الإنترنت الآن لتجنب الانتظار الطويل", + "timeUntilAppointment": "الوقت المتبقي حتى الموعد", + "appointmentTimePassed": "انتهى وقت الموعد", "upcomingQR": "استخدم رمز الاستجابة السريعة لتسجيل الوصول في المستشفى", "upcomingVirtual": "هذا موعد افتراضي، يرجى الالتزام بالتعليمات لتجربة سلسة.", "upcomingLivecare": "هذا موعد لايف كير", @@ -1457,6 +1459,8 @@ "setTimerOfReminder": "ضبط مؤقت التذكير", "youHaveAppointmentWithDr": "لديك موعد مع د. ", "hours": "ساعات", + "minutes": "دقائق", + "seconds": "ثواني", "secs": "ثواني", "noAllergiesDataFound": "لم يتم العثور على بيانات الحساسية...", "heartRateDescription": "معدل ضربات قلبك يشير إلى عدد المرات التي ينبض فيها قلبك في الدقيقة", diff --git a/assets/langs/en-US.json b/assets/langs/en-US.json index febd8632..9d685cb3 100644 --- a/assets/langs/en-US.json +++ b/assets/langs/en-US.json @@ -1449,6 +1449,8 @@ "setTimerOfReminder": "Set the timer of reminder", "youHaveAppointmentWithDr": "You have appointment with Dr. ", "hours": "Hours", + "minutes": "Minutes", + "seconds": "Seconds", "secs": "Secs", "noAllergiesDataFound": "No allergies data found...", "heartRateDescription": "Your heart rate indicates how many times your heart beats per minute", diff --git a/lib/core/api/api_client.dart b/lib/core/api/api_client.dart index 30ea3eba..374ac9d1 100644 --- a/lib/core/api/api_client.dart +++ b/lib/core/api/api_client.dart @@ -198,9 +198,9 @@ class ApiClientImp implements ApiClient { url = "https://hmgwebservices.com/Services/NHIC.svc/REST/GetPatientInfo"; 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/api_consts.dart b/lib/core/api_consts.dart index bf9144fa..2b5abbe9 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.prod; + static AppEnvironmentTypeEnum appEnvironmentType = AppEnvironmentTypeEnum.preProd; // static String baseUrl = 'https://uat.hmgwebservices.com/'; // HIS API URL UAT diff --git a/lib/core/app_assets.dart b/lib/core/app_assets.dart index 44ca3b10..eae42b71 100644 --- a/lib/core/app_assets.dart +++ b/lib/core/app_assets.dart @@ -400,6 +400,7 @@ class AppAssets { static const String fullBodyFrontFemale = '$pngBasePath/full_body_front_female.png'; static const String fullBodyBackFemale = '$pngBasePath/full_body_back_female.png'; static const String bmiFullBody = '$pngBasePath/bmi_image_1.png'; + static const String bmiFullBodyFemale = '$pngBasePath/female_bmi.png'; static const String defaultMEP = '$pngBasePath/default_MEP.png'; } diff --git a/lib/features/emergency_services/emergency_services_repo.dart b/lib/features/emergency_services/emergency_services_repo.dart index 10c5541a..582c4a58 100644 --- a/lib/features/emergency_services/emergency_services_repo.dart +++ b/lib/features/emergency_services/emergency_services_repo.dart @@ -183,7 +183,7 @@ class EmergencyServicesRepoImp implements EmergencyServicesRepo { @override Future>>> getProjectList() async { - Map request = {'IsOnlineCheckIn': true, 'IsAdvancePayment': false, 'IsForER': true}; + Map request = {"IsEROnlineCheckIn":true,'IsOnlineCheckIn': false, 'IsAdvancePayment': false, 'IsForER': true}; try { GenericApiModel>? apiResponse; diff --git a/lib/features/my_appointments/models/resp_models/patient_appointment_history_response_model.dart b/lib/features/my_appointments/models/resp_models/patient_appointment_history_response_model.dart index cea2e64b..420c0482 100644 --- a/lib/features/my_appointments/models/resp_models/patient_appointment_history_response_model.dart +++ b/lib/features/my_appointments/models/resp_models/patient_appointment_history_response_model.dart @@ -75,6 +75,7 @@ class PatientAppointmentHistoryResponseModel { num? patientShareWithTax; num? patientTaxAmount; String? doctorNationalityFlagURL; + bool? isClinicReBookingAllowed; PatientAppointmentHistoryResponseModel({ this.setupID, @@ -152,6 +153,7 @@ class PatientAppointmentHistoryResponseModel { this.patientShareWithTax, this.patientTaxAmount, this.doctorNationalityFlagURL, + this.isClinicReBookingAllowed, }); PatientAppointmentHistoryResponseModel.fromJson(Map json) { @@ -241,6 +243,7 @@ class PatientAppointmentHistoryResponseModel { patientShareWithTax = json['PatientShareWithTax']; patientTaxAmount = json['PatientTaxAmount']; doctorNationalityFlagURL = json['DoctorNationalityFlagURL']; + isClinicReBookingAllowed = json['IsClinicReBookingAllowed']; } Map toJson() { @@ -313,6 +316,7 @@ class PatientAppointmentHistoryResponseModel { data['RemaniningHoursTocanPay'] = this.remaniningHoursTocanPay; data['SMSButtonVisable'] = this.sMSButtonVisable; data['ServiceID'] = this.serviceID; + data['IsClinicReBookingAllowed'] = this.isClinicReBookingAllowed; return data; } } diff --git a/lib/generated/codegen_loader.g.dart b/lib/generated/codegen_loader.g.dart index 7287071a..7722c8d8 100644 --- a/lib/generated/codegen_loader.g.dart +++ b/lib/generated/codegen_loader.g.dart @@ -1466,6 +1466,8 @@ class CodegenLoader extends AssetLoader{ "setTimerOfReminder": "ضبط مؤقت التذكير", "youHaveAppointmentWithDr": "لديك موعد مع د. ", "hours": "ساعات", + "minutes": "دقائق", + "seconds": "ثواني", "secs": "ثواني", "noAllergiesDataFound": "لم يتم العثور على بيانات الحساسية...", "heartRateDescription": "معدل ضربات قلبك يشير إلى عدد المرات التي ينبض فيها قلبك في الدقيقة", @@ -3176,6 +3178,8 @@ static const Map _en_US = { "setTimerOfReminder": "Set the timer of reminder", "youHaveAppointmentWithDr": "You have appointment with Dr. ", "hours": "Hours", + "minutes": "Minutes", + "seconds": "Seconds", "secs": "Secs", "noAllergiesDataFound": "No allergies data found...", "heartRateDescription": "Your heart rate indicates how many times your heart beats per minute", diff --git a/lib/generated/locale_keys.g.dart b/lib/generated/locale_keys.g.dart index c2cac71e..103da04c 100644 --- a/lib/generated/locale_keys.g.dart +++ b/lib/generated/locale_keys.g.dart @@ -87,6 +87,8 @@ abstract class LocaleKeys { static const bookSuccessConfirmMore2412 = 'bookSuccessConfirmMore2412'; static const upcomingPaymentPending = 'upcomingPaymentPending'; static const upcomingPaymentNow = 'upcomingPaymentNow'; + static const timeUntilAppointment = 'timeUntilAppointment'; + static const appointmentTimePassed = 'appointmentTimePassed'; static const upcomingQR = 'upcomingQR'; static const upcomingVirtual = 'upcomingVirtual'; static const upcomingLivecare = 'upcomingLivecare'; @@ -1452,6 +1454,8 @@ abstract class LocaleKeys { static const setTimerOfReminder = 'setTimerOfReminder'; static const youHaveAppointmentWithDr = 'youHaveAppointmentWithDr'; static const hours = 'hours'; + static const minutes = 'minutes'; + static const seconds = 'seconds'; static const secs = 'secs'; static const noAllergiesDataFound = 'noAllergiesDataFound'; static const heartRateDescription = 'heartRateDescription'; diff --git a/lib/presentation/appointments/appointment_details_page.dart b/lib/presentation/appointments/appointment_details_page.dart index ef3b0c94..5344fead 100644 --- a/lib/presentation/appointments/appointment_details_page.dart +++ b/lib/presentation/appointments/appointment_details_page.dart @@ -74,6 +74,12 @@ class _AppointmentDetailsPageState extends State { bool isAppointmentWithin4Hours = false; + // Countdown timer variables + Timer? _countdownTimer; + Duration? _timeRemaining; + String _countdownText = ""; + Function(void Function())? _modalSetState; // Callback for modal state updates + @override void initState() { scheduleMicrotask(() async { @@ -92,9 +98,114 @@ class _AppointmentDetailsPageState extends State { } } }); + + // Initialize countdown timer for payment + if (widget.patientAppointmentHistoryResponseModel.nextAction == 15 || + widget.patientAppointmentHistoryResponseModel.nextAction == 20) { + _startCountdownTimer(); + } + super.initState(); } + void _startCountdownTimer() { + final appointmentDate = DateUtil.convertStringToDate(widget.patientAppointmentHistoryResponseModel.appointmentDate); + _updateTimeRemaining(); + + _countdownTimer = Timer.periodic(const Duration(seconds: 1), (timer) { + if (mounted) { + _updateTimeRemaining(); + } else { + timer.cancel(); + } + }); + } + + void _updateTimeRemaining() { + final appointmentDate = DateUtil.convertStringToDate(widget.patientAppointmentHistoryResponseModel.appointmentDate); + final now = DateTime.now(); + final difference = appointmentDate.difference(now); + + if (difference.isNegative) { + if (mounted) { + setState(() { + _timeRemaining = Duration.zero; + _countdownText = LocaleKeys.appointmentTimePassed.tr(context: context); + }); + } + // Also update modal if callback is available + _modalSetState?.call(() { + _timeRemaining = Duration.zero; + _countdownText = LocaleKeys.appointmentTimePassed.tr(context: context); + }); + _countdownTimer?.cancel(); + } else { + if (mounted) { + setState(() { + _timeRemaining = difference; + _countdownText = _formatDuration(difference); + }); + } + // Also update modal if callback is available + _modalSetState?.call(() { + _timeRemaining = difference; + _countdownText = _formatDuration(difference); + }); + } + } + + String _formatDuration(Duration duration) { + final days = duration.inDays; + final hours = duration.inHours.remainder(24); + final minutes = duration.inMinutes.remainder(60); + final seconds = duration.inSeconds.remainder(60); + + // Format: DD : HH : MM : SS + return '${days.toString().padLeft(2, '0')} : ${hours.toString().padLeft(2, '0')} : ${minutes.toString().padLeft(2, '0')} : ${seconds.toString().padLeft(2, '0')}'; + } + + @override + void dispose() { + _countdownTimer?.cancel(); + super.dispose(); + } + + // Helper method to build each time unit (number + label) + Widget _buildTimeUnit(String value, String label) { + return Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Container( + alignment: Alignment.center, + child: value.toText32( + isBold: true, + color: AppColors.blackColor, + isEnglishOnly: true, + ), + ), + SizedBox(height: 4.h), + Container( + alignment: Alignment.center, + child: label.toText12( + color: AppColors.greyTextColor, + ), + ), + ], + ); + } + + // Helper method to build time separator (:) + Widget _buildTimeSeparator() { + return Padding( + padding: EdgeInsets.only(bottom: 16.h, left: 6.w, right: 6.w), + child: ':'.toText32( + isBold: true, + color: AppColors.blackColor, + ), + ); + } + @override Widget build(BuildContext context) { myAppointmentsViewModel = Provider.of(context, listen: false); @@ -934,6 +1045,7 @@ class _AppointmentDetailsPageState extends State { ? (!(widget.patientAppointmentHistoryResponseModel.isActiveDoctor ?? true) || widget.patientAppointmentHistoryResponseModel.isLiveCareAppointment! || widget.patientAppointmentHistoryResponseModel.isExecludeDoctor! || + widget.patientAppointmentHistoryResponseModel.isClinicReBookingAllowed == false || !Utils.isClinicAllowedForRebook(widget.patientAppointmentHistoryResponseModel.clinicID)) ? SizedBox.shrink() : CustomButton( @@ -1126,14 +1238,86 @@ class _AppointmentDetailsPageState extends State { }); // LoaderBottomSheet.hideLoader(); case 15: - getIt.get().showCommonBottomSheetWithoutH( - message: LocaleKeys.upcomingPaymentPending.tr(context: context), - label: LocaleKeys.notice.tr(), - onOkPressed: () {}, - okLabel: "confirm", - cancelLabel: LocaleKeys.acknowledged.tr(context: context), - isConfirmButton: true, - ); + // Ensure timer is running before showing modal + if (_countdownTimer == null || !_countdownTimer!.isActive) { + _startCountdownTimer(); + } + + showCommonBottomSheetWithoutHeight( + context, + title: LocaleKeys.notice.tr(), + child: StatefulBuilder( + builder: (context, setModalState) { + // Store the modal setState callback + _modalSetState = setModalState; + + return Column( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + // Message text + LocaleKeys.upcomingPaymentPending.tr(context: context).toText14( + color: AppColors.textColor, + isCenter: true, + ), + SizedBox(height: 24.h), + // Countdown Timer - DD : HH : MM : SS format with labels + Row( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + // Days + _buildTimeUnit( + _timeRemaining != null ? _timeRemaining!.inDays.toString().padLeft(2, '0') : '00', + LocaleKeys.days.tr(context: context), + ), + _buildTimeSeparator(), + // Hours + _buildTimeUnit( + _timeRemaining != null ? _timeRemaining!.inHours.remainder(24).toString().padLeft(2, '0') : '00', + LocaleKeys.hours.tr(context: context), + ), + _buildTimeSeparator(), + // Minutes + _buildTimeUnit( + _timeRemaining != null ? _timeRemaining!.inMinutes.remainder(60).toString().padLeft(2, '0') : '00', + LocaleKeys.minutes.tr(context: context), + ), + _buildTimeSeparator(), + // Seconds + _buildTimeUnit( + _timeRemaining != null ? _timeRemaining!.inSeconds.remainder(60).toString().padLeft(2, '0') : '00', + LocaleKeys.seconds.tr(context: context), + ), + ], + ), + SizedBox(height: 24.h), + // Green Acknowledge button with checkmark icon + CustomButton( + text: LocaleKeys.acknowledged.tr(context: context), + onPressed: () { + _modalSetState = null; // Clear callback when closing + Navigator.of(context).pop(); + }, + backgroundColor: AppColors.successColor, + borderColor: AppColors.successColor, + textColor: Colors.white, + fontSize: 16.f, + fontWeight: FontWeight.w600, + borderRadius: 12.r, + height: 50.h, + icon: AppAssets.checkmark_icon, + iconColor: Colors.white, + ), + ], + ); + }, + ), + callBackFunc: () { + _modalSetState = null; // Clear callback when closing + }, + isFullScreen: false, + isCloseButtonVisible: true, + ); case 20: myAppointmentsViewModel.setIsPatientAppointmentShareLoading(true); Navigator.of(context).push( diff --git a/lib/presentation/appointments/widgets/appointment_card.dart b/lib/presentation/appointments/widgets/appointment_card.dart index db08c923..d551c444 100644 --- a/lib/presentation/appointments/widgets/appointment_card.dart +++ b/lib/presentation/appointments/widgets/appointment_card.dart @@ -392,58 +392,62 @@ class AppointmentCard extends StatelessWidget { } } return (patientAppointmentHistoryResponseModel.isActiveDoctor ?? true) - ? Row( - children: [ - Expanded( - flex: 6, - child: (AppointmentType.isArrived(patientAppointmentHistoryResponseModel) - ? _getArrivedButton(context) - : CustomButton( - text: AppointmentType.getNextActionText(patientAppointmentHistoryResponseModel.nextAction), - onPressed: () => _goToDetails(context), - backgroundColor: AppointmentType.getNextActionButtonColor(patientAppointmentHistoryResponseModel.nextAction).withValues(alpha: 0.15), - borderColor: AppointmentType.getNextActionButtonColor(patientAppointmentHistoryResponseModel.nextAction).withValues(alpha: 0.01), - textColor: AppointmentType.getNextActionTextColor(patientAppointmentHistoryResponseModel.nextAction), - fontSize: (isFoldable || isTablet) ? 12.f : 14.f, - fontWeight: FontWeight.w600, - borderRadius: 12.r, - padding: EdgeInsets.symmetric(horizontal: 10.w), - height: 40.h, - icon: AppointmentType.getNextActionIcon(patientAppointmentHistoryResponseModel.nextAction), - iconColor: AppointmentType.getNextActionTextColor(patientAppointmentHistoryResponseModel.nextAction), - iconSize: 15.h, - )) - .toShimmer2(isShow: isLoading), - ), - SizedBox(width: 8.h), - Expanded( - flex: 1, - child: Container( - height: (isFoldable || isTablet) ? 50.h : 40.h, - decoration: RoundedRectangleBorder().toSmoothCornerDecoration( - color: AppColors.transparent, - borderRadius: 10.h, - side: BorderSide( - color: AppColors.textColor, - width: 1.2, - ), - ), - child: Transform.flip( - flipX: appState.isArabic(), - child: Utils.buildSvgWithAssets( - icon: AppAssets.forward_arrow_icon, - iconColor: AppColors.textColor, - width: 24.w, - height: 24.h, - fit: BoxFit.contain, - ), - ), - ).toShimmer2(isShow: isLoading).onPress(() { - _goToDetails(context); - }), - ), - ], - ) + ? (AppointmentType.isArrived(patientAppointmentHistoryResponseModel) && + patientAppointmentHistoryResponseModel.isClinicReBookingAllowed == false) + ? // Show only View Details button without arrow when rebooking not allowed + _getArrivedButton(context) + : Row( + children: [ + Expanded( + flex: 6, + child: (AppointmentType.isArrived(patientAppointmentHistoryResponseModel) + ? _getArrivedButton(context) + : CustomButton( + text: AppointmentType.getNextActionText(patientAppointmentHistoryResponseModel.nextAction), + onPressed: () => _goToDetails(context), + backgroundColor: AppointmentType.getNextActionButtonColor(patientAppointmentHistoryResponseModel.nextAction).withValues(alpha: 0.15), + borderColor: AppointmentType.getNextActionButtonColor(patientAppointmentHistoryResponseModel.nextAction).withValues(alpha: 0.01), + textColor: AppointmentType.getNextActionTextColor(patientAppointmentHistoryResponseModel.nextAction), + fontSize: (isFoldable || isTablet) ? 12.f : 14.f, + fontWeight: FontWeight.w600, + borderRadius: 12.r, + padding: EdgeInsets.symmetric(horizontal: 10.w), + height: 40.h, + icon: AppointmentType.getNextActionIcon(patientAppointmentHistoryResponseModel.nextAction), + iconColor: AppointmentType.getNextActionTextColor(patientAppointmentHistoryResponseModel.nextAction), + iconSize: 15.h, + )) + .toShimmer2(isShow: isLoading), + ), + SizedBox(width: 8.h), + Expanded( + flex: 1, + child: Container( + height: (isFoldable || isTablet) ? 50.h : 40.h, + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.transparent, + borderRadius: 10.h, + side: BorderSide( + color: AppColors.textColor, + width: 1.2, + ), + ), + child: Transform.flip( + flipX: appState.isArabic(), + child: Utils.buildSvgWithAssets( + icon: AppAssets.forward_arrow_icon, + iconColor: AppColors.textColor, + width: 24.w, + height: 24.h, + fit: BoxFit.contain, + ), + ), + ).toShimmer2(isShow: isLoading).onPress(() { + _goToDetails(context); + }), + ), + ], + ) : CustomButton( text: LocaleKeys.viewDetails.tr(context: context), onPressed: () { @@ -475,54 +479,22 @@ class AppointmentCard extends StatelessWidget { } Widget _getArrivedButton(BuildContext context) { - // final isRecent = DateTime.now().difference(DateUtil.convertStringToDate(patientAppointmentHistoryResponseModel.appointmentDate)).inDays <= 15; - // - // if (isRecent) { - // return CustomButton( - // text: LocaleKeys.askDoctor.tr(context: context), - // onPressed: () async { - // LoaderBottomSheet.showLoader(loadingText: LocaleKeys.checkingDoctorAvailability.tr(context: context)); - // await myAppointmentsViewModel.isDoctorAvailable( - // projectID: patientAppointmentHistoryResponseModel.projectID, - // doctorId: patientAppointmentHistoryResponseModel.doctorID, - // clinicId: patientAppointmentHistoryResponseModel.clinicID, - // onSuccess: (value) async { - // if (value) { - // await myAppointmentsViewModel.getAskDoctorRequestTypes(onSuccess: (val) { - // LoaderBottomSheet.hideLoader(); - // showCommonBottomSheetWithoutHeight( - // context, - // title: LocaleKeys.askDoctor.tr(context: context), - // child: AskDoctorRequestTypeSelect( - // askDoctorRequestTypeList: myAppointmentsViewModel.askDoctorRequestTypeList, - // myAppointmentsViewModel: myAppointmentsViewModel, - // patientAppointmentHistoryResponseModel: patientAppointmentHistoryResponseModel, - // ), - // callBackFunc: () {}, - // isFullScreen: false, - // isCloseButtonVisible: true, - // ); - // }); - // } else { - // print("Doctor is not available"); - // } - // }); - // }, - // backgroundColor: AppColors.secondaryLightRedColor, - // borderColor: AppColors.secondaryLightRedColor, - // textColor: AppColors.primaryRedColor, - // fontSize: (isFoldable || isTablet) ? 12.f : 14.f, - // fontWeight: FontWeight.w600, - // borderRadius: 12.r, - // padding: EdgeInsets.symmetric(horizontal: 10.w), - // // height: isTablet || isFoldable ? 46.h : 40.h, - // height: 40.h, - // icon: AppAssets.ask_doctor_icon, - // iconColor: AppColors.primaryRedColor, - // iconSize: 16.h, - // ); - // } + if (patientAppointmentHistoryResponseModel.isClinicReBookingAllowed == false) { + return CustomButton( + text: LocaleKeys.viewDetails.tr(context: context), + onPressed: () => _goToDetails(context), + backgroundColor: AppColors.secondaryLightRedColor, + borderColor: AppColors.secondaryLightRedColor, + textColor: AppColors.primaryRedColor, + fontSize: (isFoldable || isTablet) ? 12.f : 14.f, + fontWeight: FontWeight.w600, + borderRadius: 12.r, + padding: EdgeInsets.symmetric(horizontal: 10.w), + height: 40.h, + ); + } + // Show Rebook button return CustomButton( borderSide: BorderSide( color: AppColors.textColor, diff --git a/lib/presentation/symptoms_checker/triage_screen.dart b/lib/presentation/symptoms_checker/triage_screen.dart index da35a805..76fad545 100644 --- a/lib/presentation/symptoms_checker/triage_screen.dart +++ b/lib/presentation/symptoms_checker/triage_screen.dart @@ -80,7 +80,7 @@ class _TriagePageState extends State { } // Case 2: Should stop flag is true OR Case 3: Probability >= 70% OR Case 4: 7 or more questions answered - if (viewModel.shouldStopTriage || highestProbability >= 70.0 || viewModel.triageQuestionCount >= 7) { + if (viewModel.shouldStopTriage || highestProbability >= 70.0 || viewModel.triageQuestionCount >= 15) { // Navigate to results/possible conditions screen context.navigateWithName(AppRoutes.possibleConditionsPage); return; diff --git a/lib/presentation/vital_sign/vital_sign_page.dart b/lib/presentation/vital_sign/vital_sign_page.dart index 255ba606..fb3f1a58 100644 --- a/lib/presentation/vital_sign/vital_sign_page.dart +++ b/lib/presentation/vital_sign/vital_sign_page.dart @@ -237,8 +237,8 @@ class _VitalSignPageState extends State { children: [ Image.asset( getIt.get().getAuthenticatedUser()?.gender == 1 - ? AppAssets.fullBodyFrontMale - : AppAssets.fullBodyFrontFemale, + ? AppAssets.bmiFullBody + : AppAssets.bmiFullBodyFemale, fit: BoxFit.cover, alignment: Alignment.topCenter, ), From fcf990bc0038861a04244f2a061bbe8ceca57937 Mon Sep 17 00:00:00 2001 From: tahaalam Date: Sun, 12 Apr 2026 18:20:47 +0300 Subject: [PATCH 08/45] hot fixes --- assets/langs/ar-SA.json | 27 ++-- assets/langs/en-US.json | 8 +- lib/core/api_consts.dart | 5 +- .../health_trackers/health_trackers_repo.dart | 111 +++++++++++++++++ .../health_trackers_view_model.dart | 115 ++++++++++++++++++ .../immediate_livecare_view_model.dart | 20 ++- lib/generated/locale_keys.g.dart | 7 ++ ...select_immediate_livecare_clinic_page.dart | 30 +++++ .../health_tracker_detail_page.dart | 28 ++++- .../home/data/landing_page_data.dart | 30 ++--- lib/presentation/home/landing_page.dart | 18 +-- .../lab_order_result_item.dart | 60 +++++---- .../bottom_navigation/bottom_navigation.dart | 4 +- lib/widgets/buttons/custom_button.dart | 3 +- 14 files changed, 397 insertions(+), 69 deletions(-) diff --git a/assets/langs/ar-SA.json b/assets/langs/ar-SA.json index 08adc616..e2e96449 100644 --- a/assets/langs/ar-SA.json +++ b/assets/langs/ar-SA.json @@ -69,7 +69,7 @@ "date": "التاريخ", "time": "الوقت", "pendingPayment": "معلق للدفع", - "payNow": "ادفع الآن", + "payNow": "الدفع", "viewQR": "عرض رمز الاستجابة السريعة", "instruction": "تعليمات", "livecare": "لايف كير", @@ -171,9 +171,9 @@ "emailSentError": "خطأ في إرسال البريد الإلكتروني", "close": "إغلاق", "closeIt": "أغلق", - "booked": "محجوز", + "booked": "تم الحجز", "confirmed": "مؤكد", - "arrived": "وصل", + "arrived": " تم الوصول", "payNowBookSuccess": "ادفع الآن عبر تطبيق الحبيب", "payNowBookSuccesstext1": "ادفع الآن باستخدام خدمة الدفع عبر الإنترنت من بوابات الدفع الآمنة", "payNowBookSuccesstext2": "يمكنك أيضًا الدفع لاحقًا عبر الدفع الإلكتروني أو في المستشفى.", @@ -274,7 +274,7 @@ "parkingDescription": "خدمة المواقف هي لك لمسح موقع السيارة حتى تتمكن من العثور عليها بسهولة عند مغادرتك. انقر على زر (مسح الموقف) لحفظ موقع الموقف، ثم سيظهر زر (عرض موقفي) لإظهار الطريق إلى الموقف. إذا كنت ترغب في إعادة مسح موقف السيارة QR فقط انقر على (مسح بياناتي).", "appointments": "المواعيد", "all2": "الكل", - "checkinOption": "تسجيل الوصول", + "checkinOption": "تسجيل الحضور", "readBarcode": "قراءة الكود", "showMyPark": "عرض الموقف", "clearMyData": "امسح البيانات", @@ -296,7 +296,7 @@ "radiology": "الأشعة", "radiologySubtitle": "النتيجة", "lab": "المختبر", - "labSubtitle": "النتائج", + "labSubtitle": "نتائج", "medicines": "الأدوية", "medicinesSubtitle": "الوصفات", "vitalSigns": "علامات حيوية", @@ -311,9 +311,11 @@ "myMedicalSubtitle": "الأدوية", "myDoctor": "أطبائي", "myDoctorSubtitle": "القائمة", + "myDoctorSubtitle2": "قائمة", "eye": "العين", "eyeSubtitle": "القياس", "insurance": "التأمين", + "insurance2": "تأمين", "insuranceSubtitle": "البطاقة", "updateInsurance": "تحديث", "updateInsuranceSubtitle": "التأمين", @@ -328,6 +330,7 @@ "monthly": "شهري", "monthlySubtitle": "التقرير", "sick": "مريض", + "sick2": "المريضة", "sickSubtitle": "الإجازات", "myBalance": "رصيدي", "myBalanceSubtitle": "الرصيد", @@ -490,9 +493,11 @@ "refferalTitle": "إحالة إلكترونية", "refferalSubTitle": "الخدمة", "healthCare": "الرعاية الصحية", - "emergency": "حالة طوارئ", + "emergency": "طوارئ", + "emergency2": "الطوارئ", "erservices": "خدمات الطوارئ", "services2": "الخدمات", + "services3": "خدمات", "cantSeeProfile": "لرؤية ملفك الطبي، يرجى تسجيل الدخول أو التسجيل الآن", "loginRegisterNow": "تسجيل الدخول أو التسجيل الآن", "hmgPharmacy": "صيدلية الحبيب", @@ -765,6 +770,7 @@ "erConsultation": "تتيح لك هذه الخدمة إجراء استشارة افتراضية عبر الإنترنت عبر مكالمة فيديو مباشرة مع الطبيب من أي مكان وفي أي وقت.", "myInvoice": "القائمة", "invoiceList": "فواتيري", + "invoiceList2": "فواتيري", "allInvoices": "كل الفواتير", "hospitals": "المستشفيات", "clinics": "العيادات", @@ -888,7 +894,7 @@ "to": "إلى", "startDate": "تاريخ البدء", "endDate": "تاريخ الانتهاء", - "walkin": "زيارة بدون موعد", + "walkin": "بدون موعد", "laserClinic": "عيادة الليزر", "continueString": "يكمل", "covid_info": "تجري مستشفيات د. سليمان الحبيب فحص فيروس كورونا المستجد وتصدر شهادات السفر على مدار الساعة، طوال أيام الأسبوع، وبسرعة ودقة عالية. يمكن للراغبين في الاستفادة من هذه الخدمة زيارة أحد فروع مستشفيات د. سليمان الحبيب وإجراء فحص كورونا خلال بضع دقائق والحصول على النتائج خلال عدة ساعات خدمة فحص فيروس كورونا Covid 19 بتقنية PCR للكشف عن الفيروس وفقاً لأعلى المعايير العالمية وبأحدث أجهزة RT-PCR عالية الدقة (GeneXpert الأمريكي وغيره)، وهي طرق معتمدة من قبل هيئة الغذاء والدواء وكذلك من قبل المركز السعودي للوقاية من الأمراض المُعدية", @@ -931,7 +937,7 @@ "immediateConsultation": "استشارة فورية", "scheduledConsultation": "استشارة مجدولة", "pharmaLiveCare": "لايف كير الصيدلية", - "notSureHelpMeChooseClinic": "غير متأكد؟ ساعدني في اختيار عيادة!", + "notSureHelpMeChooseClinic": "هل تريد مساعدة في اختيار العياة؟", "mentionYourSymptomsAndFindDoctors": "اذكر أعراضك واعثر على قائمة الأطباء وفقاً لذلك", "immediateService": "خدمة فورية", "noNeedToWaitGetMedicalConsultation": "لا حاجة للانتظار، ستحصل على استشارة طبية فورية عبر مكالمة فيديو", @@ -995,7 +1001,7 @@ "processingCheckIn": "جاري معالجة تسجيل الحضور...", "bookingWaitingAppointment": "جاري حجز موعد الانتظار، يرجى الانتظار...", "enterValidIDorIqama": "يرجى إدخال رقم هوية وطنية أو رقم ملف صالح", - "selectAppointment": "حدد الموعد", + "selectAppointment": "اختر الموعد", "rebookSameDoctor": "أعد الحجز مع نفس الطبيب", "queueing": "قائمة الانتظار", "inQueue": "في قائمة الانتظار", @@ -1291,7 +1297,7 @@ "rebook": "إعادة الحجز", "noOphthalmologyAppointments": "لم يتم العثور على أي مواعيد في قسم طب العيون...", "noVitalSignsRecordedYet": "لا توجد علامات حيوية مسجلة بعد", - "appointmentsAndVisits": "المواعيد والزيارات", + "appointmentsAndVisits": "المواعيد", "labAndRadiology": "المختبر والأشعة", "activeMedicationsAndPrescriptions": "الوصفات الطبية", "allPrescriptions": "جميع الوصفات", @@ -1465,6 +1471,7 @@ "distanceDescription": "المسافة المقطوعة على مدار اليوم", "overview": "نظرة عامة", "details": "التفاصيل", + "details2": "تفاصيل", "healthy": "صحي", "warning": "تحذير", "vitalSignDetails": "تفاصيل العلامات الحيوية", diff --git a/assets/langs/en-US.json b/assets/langs/en-US.json index 18484fc1..0f108ade 100644 --- a/assets/langs/en-US.json +++ b/assets/langs/en-US.json @@ -69,7 +69,7 @@ "date": "Date", "time": "Time", "pendingPayment": "Pending for payment", - "payNow": "Pay Now", + "payNow": "Payment", "viewQR": "View QR Code", "instruction": "Instructions", "livecare": "LiveCare", @@ -310,6 +310,7 @@ "myMedicalSubtitle": "Medications", "myDoctor": "My Doctors", "myDoctorSubtitle": "List", + "myDoctorSubtitle2": "List", "eye": "Eye", "eyeSubtitle": "Measurement", "insurance": "Insurance", @@ -327,6 +328,7 @@ "monthly": "Monthly", "monthlySubtitle": "Report", "sick": "Sick", + "sick2": "Sick", "sickSubtitle": "Leaves", "myBalance": "My Balance", "myBalanceSubtitle": "Credit", @@ -484,8 +486,10 @@ "refferalSubTitle": "Service", "healthCare": "Health Care", "emergency": "Emergency", + "emergency2": "Emergency", "erservices": "Emergency", "services2": "Services", + "services3": "Services", "cantSeeProfile": "To view your medical profile, please log in or register now", "loginRegisterNow": "Login or Register Now", "hmgPharmacy": "HMG Pharmacy", @@ -757,6 +761,7 @@ "erConsultation": "This service allows you to make an online virtual consultation via video call directly with the doctor from anywhere at any time.", "myInvoice": "List", "invoiceList": "My Invoice", + "invoiceList2": "My Invoice", "allInvoices": "All Invoices", "hospitals": "Hospitals", "clinics": "Clinics", @@ -1457,6 +1462,7 @@ "distanceDescription": "Distance covered throughout the day", "overview": "Overview", "details": "Details", + "details2": "Details", "healthy": "Healthy", "warning": "Warning", "vitalSignDetails": "Vital Sign Details", diff --git a/lib/core/api_consts.dart b/lib/core/api_consts.dart index bf9144fa..ef1cd36a 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.prod; + static AppEnvironmentTypeEnum appEnvironmentType = AppEnvironmentTypeEnum.preProd; // static String baseUrl = 'https://uat.hmgwebservices.com/'; // HIS API URL UAT @@ -205,6 +205,9 @@ class ApiConsts { static String updateDiabeticResult = 'Services/Patients.svc/REST/Patient_UpdateDiabtecResult'; static String deactivateDiabeticStatus = 'Services/Patients.svc/REST/Patient_DeactivateDiabeticStatus'; static String sendAverageBloodSugarReport = 'Services/Notifications.svc/REST/SendAverageBloodSugarReport'; + static String averageBloodSugarReportDownload = 'Services/Notifications.svc/REST/SendAverageBloodSugarReportDownload'; + static String averageWeightReportDownload = 'Services/Notifications.svc/REST/SendAverageBodyWeightReportDownload'; + static String averageBloodPressureReportDownload = 'Services/Notifications.svc/REST/SendAverageBloodPressureReportDownload'; // Blood Pressure static String getBloodPressureResultAverage = 'Services/Patients.svc/REST/Patient_GetBloodPressureResultAverage'; diff --git a/lib/features/health_trackers/health_trackers_repo.dart b/lib/features/health_trackers/health_trackers_repo.dart index 2a64fc46..52bc40f6 100644 --- a/lib/features/health_trackers/health_trackers_repo.dart +++ b/lib/features/health_trackers/health_trackers_repo.dart @@ -15,6 +15,9 @@ abstract class HealthTrackersRepo { /// Get blood sugar results (week, month, year). Future>> getDiabeticResults(); + Future>> downloadBloodSugarReport(); + Future>> downloadWeightReport(); + Future>> downloadBloodPressureReport(); /// Add new blood sugar result. Future>> addDiabeticResult({ @@ -211,6 +214,114 @@ class HealthTrackersRepoImp implements HealthTrackersRepo { } } + @override + Future>> downloadBloodSugarReport() async { + try { + GenericApiModel? apiResponse; + Failure? failure; + + await apiClient.post( + ApiConsts.averageBloodSugarReportDownload, + body: {}, + onFailure: (error, statusCode, {messageStatus, failureType}) { + failure = failureType; + }, + onSuccess: (response, statusCode, {messageStatus, errorMessage}) { + try { + dynamic pdf = response['ReportPDFContent']; + + apiResponse = GenericApiModel( + messageStatus: messageStatus, + statusCode: statusCode, + errorMessage: errorMessage, + data: pdf, + ); + } 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())); + } + } + + + @override + Future>> downloadWeightReport() async { + try { + GenericApiModel? apiResponse; + Failure? failure; + + await apiClient.post( + ApiConsts.averageWeightReportDownload, + body: {}, + onFailure: (error, statusCode, {messageStatus, failureType}) { + failure = failureType; + }, + onSuccess: (response, statusCode, {messageStatus, errorMessage}) { + try { + dynamic pdf = response['ReportPDFContent']; + + apiResponse = GenericApiModel( + messageStatus: messageStatus, + statusCode: statusCode, + errorMessage: errorMessage, + data: pdf, + ); + } 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())); + } + } + @override + Future>> downloadBloodPressureReport() async { + try { + GenericApiModel? apiResponse; + Failure? failure; + + await apiClient.post( + ApiConsts.averageBloodPressureReportDownload, + body: {}, + onFailure: (error, statusCode, {messageStatus, failureType}) { + failure = failureType; + }, + onSuccess: (response, statusCode, {messageStatus, errorMessage}) { + try { + dynamic pdf = response['ReportPDFContent']; + + apiResponse = GenericApiModel( + messageStatus: messageStatus, + statusCode: statusCode, + errorMessage: errorMessage, + data: pdf, + ); + } 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())); + } + } + @override Future>> addDiabeticResult({ required String bloodSugarDateChart, diff --git a/lib/features/health_trackers/health_trackers_view_model.dart b/lib/features/health_trackers/health_trackers_view_model.dart index ab54f595..8f7e0ffa 100644 --- a/lib/features/health_trackers/health_trackers_view_model.dart +++ b/lib/features/health_trackers/health_trackers_view_model.dart @@ -1,6 +1,8 @@ import 'dart:developer'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/cupertino.dart'; +import 'package:hmg_patient_app_new/core/enums.dart'; import 'package:hmg_patient_app_new/features/health_trackers/health_trackers_repo.dart'; import 'package:hmg_patient_app_new/features/health_trackers/models/blood_pressure/blood_pressure_result.dart'; import 'package:hmg_patient_app_new/features/health_trackers/models/blood_pressure/month_blood_pressure_result_average.dart'; @@ -14,7 +16,9 @@ import 'package:hmg_patient_app_new/features/health_trackers/models/weight/month import 'package:hmg_patient_app_new/features/health_trackers/models/weight/week_weight_measurement_result_average.dart'; import 'package:hmg_patient_app_new/features/health_trackers/models/weight/weight_measurement_result.dart'; import 'package:hmg_patient_app_new/features/health_trackers/models/weight/year_weight_measurement_result_average.dart'; +import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; import 'package:hmg_patient_app_new/services/error_handler_service.dart'; +import 'package:hmg_patient_app_new/widgets/loader/bottomsheet_loader.dart'; class HealthTrackersViewModel extends ChangeNotifier { HealthTrackersRepo healthTrackersRepo; @@ -425,6 +429,91 @@ class HealthTrackersViewModel extends ChangeNotifier { } } + + Future downloadBloodSugerReport({ + Function(String)? onSuccess, + }) async { + LoaderBottomSheet.showLoader(loadingText: LocaleKeys.generatingReport.tr()); + try { + final result = await healthTrackersRepo.downloadBloodSugarReport(); + LoaderBottomSheet.hideLoader(); + bool success = false; + + result.fold( + (failure) { + errorHandlerService.handleError(failure: failure); + }, + (apiModel) { + success = true; + if (onSuccess != null) onSuccess(apiModel.data??""); + }, + ); + + notifyListeners(); + + return success; + } catch (e) { + log('Error in sendWeightReportByEmail: $e'); + return false; + } + } + + Future downloadBloodPressureReport({ + Function(String)? onSuccess, + }) async { + LoaderBottomSheet.showLoader(loadingText: LocaleKeys.generatingReport.tr()); + try { + final result = await healthTrackersRepo.downloadBloodPressureReport(); + LoaderBottomSheet.hideLoader(); + bool success = false; + + result.fold( + (failure) { + errorHandlerService.handleError(failure: failure); + }, + (apiModel) { + success = true; + if (onSuccess != null) onSuccess(apiModel.data??""); + }, + ); + + notifyListeners(); + + return success; + } catch (e) { + log('Error in sendWeightReportByEmail: $e'); + return false; + } + } + Future downloadWeightReport({ + Function(String)? onSuccess, + }) async { + LoaderBottomSheet.showLoader(loadingText: LocaleKeys.generatingReport.tr()); + try { + final result = await healthTrackersRepo.downloadWeightReport(); + LoaderBottomSheet.hideLoader(); + bool success = false; + + result.fold( + (failure) { + errorHandlerService.handleError(failure: failure); + }, + (apiModel) { + success = true; + if (onSuccess != null) onSuccess(apiModel.data??""); + }, + ); + + notifyListeners(); + + return success; + } catch (e) { + log('Error in sendWeightReportByEmail: $e'); + return false; + } + } + + // ==================== BLOOD PRESSURE TRACKING METHODS ==================== /// Fetch blood pressure averages and results @@ -1118,4 +1207,30 @@ class HealthTrackersViewModel extends ChangeNotifier { diastolicController.dispose(); super.dispose(); } + + Future downloadReport(HealthTrackerTypeEnum trackerType, {required Function(dynamic report) onSuccess}) async { + switch (trackerType) { + case HealthTrackerTypeEnum.bloodSugar: + await downloadBloodSugerReport( + onSuccess : (value){ + onSuccess(value); + } + ); + break; + case HealthTrackerTypeEnum.bloodPressure: + await downloadBloodPressureReport( + onSuccess : (value){ + onSuccess(value); + } + ); + break; + case HealthTrackerTypeEnum.weightTracker: + await downloadWeightReport( + onSuccess : (value){ + onSuccess(value); + } + ); + break; + } + } } diff --git a/lib/features/immediate_livecare/immediate_livecare_view_model.dart b/lib/features/immediate_livecare/immediate_livecare_view_model.dart index 6613b481..e61292d6 100644 --- a/lib/features/immediate_livecare/immediate_livecare_view_model.dart +++ b/lib/features/immediate_livecare/immediate_livecare_view_model.dart @@ -39,6 +39,7 @@ class ImmediateLiveCareViewModel extends ChangeNotifier { MyAppointmentsViewModel myAppointmentsViewModel; List immediateLiveCareClinicsList = []; + List mainLiveCareClinicList = []; bool isImmediateLiveCareClinicsLoading = false; int liveCareSelectedCallType = 0; // 1- Video, 2- Audio, 3- Phone late GetLiveCareClinicListResponseModel immediateLiveCareSelectedClinic; @@ -61,6 +62,7 @@ class ImmediateLiveCareViewModel extends ChangeNotifier { initImmediateLiveCare() { _appState = getIt(); immediateLiveCareClinicsList = []; + mainLiveCareClinicList = []; isImmediateLiveCareClinicsLoading = true; liveCareSelectedCallType = 0; // 1- Video, 2- Audio, 3- Phone immediateLiveCareSelectedClinic = GetLiveCareClinicListResponseModel(); @@ -90,9 +92,11 @@ class ImmediateLiveCareViewModel extends ChangeNotifier { if (apiResponse.messageStatus == 2) { // dialogService.showErrorDialog(message: apiResponse.errorMessage!, onOkPressed: () {}); } else if (apiResponse.messageStatus == 1) { - immediateLiveCareClinicsList = apiResponse.data!; + mainLiveCareClinicList = apiResponse.data!; - immediateLiveCareClinicsList.sort((a, b) => b.isOnline!.compareTo(a.isOnline!)); + mainLiveCareClinicList.sort((a, b) => b.isOnline!.compareTo(a.isOnline!)); + immediateLiveCareClinicsList.clear(); + immediateLiveCareClinicsList.addAll(mainLiveCareClinicList); isImmediateLiveCareClinicsLoading = false; notifyListeners(); @@ -103,6 +107,18 @@ class ImmediateLiveCareViewModel extends ChangeNotifier { }, ); } + void filterClinic(String query){ + if(query.isEmpty){ + immediateLiveCareClinicsList.clear(); + immediateLiveCareClinicsList.addAll(mainLiveCareClinicList); + }else{ + + // bool isArabic = getIt.get().isArabic(); + immediateLiveCareClinicsList = mainLiveCareClinicList.where((clinic) => clinic.serviceName!.toLowerCase().contains(query.toLowerCase()) || clinic.serviceNameN!.toLowerCase().contains(query.toLowerCase() + )).toList(); + } + notifyListeners(); + } Future getLiveCareImmediateAppointmentFees({Function(dynamic)? onSuccess, Function(String)? onError}) async { final result = diff --git a/lib/generated/locale_keys.g.dart b/lib/generated/locale_keys.g.dart index 1bd8019d..fbe9bef9 100644 --- a/lib/generated/locale_keys.g.dart +++ b/lib/generated/locale_keys.g.dart @@ -312,9 +312,11 @@ abstract class LocaleKeys { static const myMedicalSubtitle = 'myMedicalSubtitle'; static const myDoctor = 'myDoctor'; static const myDoctorSubtitle = 'myDoctorSubtitle'; + static const myDoctorSubtitle2 = 'myDoctorSubtitle2'; static const eye = 'eye'; static const eyeSubtitle = 'eyeSubtitle'; static const insurance = 'insurance'; + static const insurance2 = 'insurance2'; static const insuranceSubtitle = 'insuranceSubtitle'; static const updateInsurance = 'updateInsurance'; static const updateInsuranceSubtitle = 'updateInsuranceSubtitle'; @@ -329,6 +331,7 @@ abstract class LocaleKeys { static const monthly = 'monthly'; static const monthlySubtitle = 'monthlySubtitle'; static const sick = 'sick'; + static const sick2 = 'sick2'; static const sickSubtitle = 'sickSubtitle'; static const myBalance = 'myBalance'; static const myBalanceSubtitle = 'myBalanceSubtitle'; @@ -492,8 +495,10 @@ abstract class LocaleKeys { static const refferalSubTitle = 'refferalSubTitle'; static const healthCare = 'healthCare'; static const emergency = 'emergency'; + static const emergency2 = 'emergency2'; static const erservices = 'erservices'; static const services2 = 'services2'; + static const services3 = 'services3'; static const cantSeeProfile = 'cantSeeProfile'; static const loginRegisterNow = 'loginRegisterNow'; static const hmgPharmacy = 'hmgPharmacy'; @@ -764,6 +769,7 @@ abstract class LocaleKeys { static const erConsultation = 'erConsultation'; static const myInvoice = 'myInvoice'; static const invoiceList = 'invoiceList'; + static const invoiceList2 = 'invoiceList2'; static const allInvoices = 'allInvoices'; static const hospitals = 'hospitals'; static const clinics = 'clinics'; @@ -1460,6 +1466,7 @@ abstract class LocaleKeys { static const distanceDescription = 'distanceDescription'; static const overview = 'overview'; static const details = 'details'; + static const details2 = 'details2'; static const healthy = 'healthy'; static const warning = 'warning'; static const vitalSignDetails = 'vitalSignDetails'; 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 870c8ad8..16c7d421 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 @@ -3,6 +3,7 @@ import 'dart:async'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_staggered_animations/flutter_staggered_animations.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; import 'package:hmg_patient_app_new/core/app_state.dart'; import 'package:hmg_patient_app_new/core/dependencies.dart'; import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; @@ -22,6 +23,7 @@ import 'package:hmg_patient_app_new/presentation/book_appointment/livecare/widge import 'package:hmg_patient_app_new/theme/colors.dart'; import 'package:hmg_patient_app_new/widgets/appbar/collapsing_list_view.dart'; import 'package:hmg_patient_app_new/widgets/common_bottom_sheet.dart'; +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'; @@ -68,6 +70,34 @@ class _SelectImmediateLiveCareClinicPageState extends State(builder: (context, immediateLiveCareVM, child) { return Column( children: [ + TextInputWidget( + labelText: LocaleKeys.search.tr(context: context), + hintText: LocaleKeys.clinicName.tr(context: context), + controller: searchEditingController, + isEnable: true, + prefix: null, + autoFocus: false, + isBorderAllowed: false, + keyboardType: TextInputType.text, + focusNode: textFocusNode, + suffix: searchEditingController.text.isNotEmpty + ? GestureDetector( + onTap: () { + searchEditingController.clear(); + immediateLiveCareVM.filterClinic(""); + textFocusNode.unfocus(); + }, + child: Utils.buildSvgWithAssets(icon: AppAssets.close_bottom_sheet_icon, width: 20.h, height: 20.h, fit: BoxFit.scaleDown), + ) + : null, + onChange: (value) { + immediateLiveCareVM.filterClinic(value!); + }, + padding: EdgeInsets.symmetric( + vertical: ResponsiveExtension(10).h, + horizontal: ResponsiveExtension(15).h, + ), + ), ListView.separated( padding: EdgeInsets.only(top: 16.h), shrinkWrap: true, diff --git a/lib/presentation/health_trackers/health_tracker_detail_page.dart b/lib/presentation/health_trackers/health_tracker_detail_page.dart index 737a150f..28e035b0 100644 --- a/lib/presentation/health_trackers/health_tracker_detail_page.dart +++ b/lib/presentation/health_trackers/health_tracker_detail_page.dart @@ -27,6 +27,7 @@ import 'package:hmg_patient_app_new/widgets/common_bottom_sheet.dart'; import 'package:hmg_patient_app_new/widgets/graph/custom_graph.dart'; import 'package:hmg_patient_app_new/widgets/input_widget.dart'; import 'package:hmg_patient_app_new/widgets/loader/bottomsheet_loader.dart'; +import 'package:open_filex/open_filex.dart'; import 'package:provider/provider.dart'; import 'package:shimmer/shimmer.dart'; @@ -1250,7 +1251,32 @@ class _HealthTrackerDetailPageState extends State { return Scaffold( backgroundColor: AppColors.bgScaffoldColor, body: CollapsingListView( - sendEmail: () async => onSendEmailPressed(context), + downloadReport: () async { + + + + await context.read().downloadReport(widget.trackerType, + onSuccess: (report) async { + + if (report.isEmpty) {} + String path = await Utils.createFileFromString(report, "pdf"); + try { + OpenFilex.open(path); + } catch (ex) { + showCommonBottomSheetWithoutHeight( + context, + child: Utils.getErrorWidget(loadingText: "Cannot open file"), + callBackFunc: () {}, + isFullScreen: false, + isCloseButtonVisible: true, + ); + } + }); + + + + // .downloadBloodSugerReport(); + }, title: _getPageTitle(), bottomChild: Consumer( builder: (context, viewModel, child) { diff --git a/lib/presentation/home/data/landing_page_data.dart b/lib/presentation/home/data/landing_page_data.dart index a60a7c18..fbf7043d 100644 --- a/lib/presentation/home/data/landing_page_data.dart +++ b/lib/presentation/home/data/landing_page_data.dart @@ -71,12 +71,12 @@ class LandingPageData { ), ]; - static List get getLoggedInServiceCardsList => [ + List get getLoggedInServiceCardsList => [ ServiceCardData( serviceName: "emergency", icon: AppAssets.emergency_services_icon, - title: LocaleKeys.emergency, - subtitle: LocaleKeys.services2, + title: getIt.get().isArabic()?LocaleKeys.services3 :LocaleKeys.emergency2, + subtitle: getIt.get().isArabic()?LocaleKeys.emergency2:LocaleKeys.services3, backgroundColor: AppColors.primaryRedColor, iconColor: Colors.white, textColor: Colors.white, @@ -85,8 +85,8 @@ class LandingPageData { ServiceCardData( serviceName: "lab_results", icon: AppAssets.home_lab_result_icon, - title: LocaleKeys.lab, - subtitle: LocaleKeys.labSubtitle, + title: getIt.get().isArabic()?LocaleKeys.labSubtitle:LocaleKeys.lab, + subtitle: getIt.get().isArabic()?LocaleKeys.lab:LocaleKeys.labSubtitle , backgroundColor: AppColors.whiteColor, iconColor: AppColors.blackColor, textColor: AppColors.blackColor, @@ -95,8 +95,8 @@ class LandingPageData { ServiceCardData( serviceName: "radiology_results", icon: AppAssets.my_radiology_icon, - title: LocaleKeys.radiology, - subtitle: LocaleKeys.radiologySubtitle, + title: getIt.get().isArabic()?LocaleKeys.labSubtitle:LocaleKeys.radiology, + subtitle: getIt.get().isArabic()?LocaleKeys.radiology:LocaleKeys.labSubtitle , backgroundColor: AppColors.whiteColor, iconColor: AppColors.blackColor, textColor: AppColors.blackColor, @@ -105,8 +105,8 @@ class LandingPageData { ServiceCardData( serviceName: "prescriptions", icon: AppAssets.my_prescription_icon, - title: LocaleKeys.medicinesSubtitle, - subtitle: LocaleKeys.details, + title: getIt.get().isArabic()?LocaleKeys.details2:LocaleKeys.medicinesSubtitle, + subtitle: getIt.get().isArabic()?LocaleKeys.medicinesSubtitle:LocaleKeys.details2, backgroundColor: AppColors.whiteColor, iconColor: AppColors.blackColor, textColor: AppColors.blackColor, @@ -115,8 +115,8 @@ class LandingPageData { ServiceCardData( serviceName: "insurance_update", icon: AppAssets.insurance_update_icon, - title: LocaleKeys.insurance, - subtitle: LocaleKeys.details, + title: getIt.get().isArabic()?LocaleKeys.details2: LocaleKeys.insurance2, + subtitle: getIt.get().isArabic()?LocaleKeys.insurance2: LocaleKeys.details2, backgroundColor: AppColors.whiteColor, iconColor: AppColors.blackColor, textColor: AppColors.blackColor, @@ -135,8 +135,8 @@ class LandingPageData { ServiceCardData( serviceName: "sick_leaves", icon: AppAssets.my_sick_leave_icon, - title: LocaleKeys.sick, - subtitle: LocaleKeys.sickSubtitle, + title: getIt.get().isArabic()?LocaleKeys.sickSubtitle:LocaleKeys.sick2, + subtitle: getIt.get().isArabic()?LocaleKeys.sick2:LocaleKeys.sickSubtitle, backgroundColor: AppColors.whiteColor, iconColor: AppColors.blackColor, textColor: AppColors.blackColor, @@ -145,8 +145,8 @@ class LandingPageData { ServiceCardData( serviceName: "my_invoice", icon: AppAssets.invoiceListIcon, - title: LocaleKeys.invoiceList, - subtitle: LocaleKeys.myDoctorSubtitle, + title: getIt.get().isArabic()?LocaleKeys.myDoctorSubtitle2:LocaleKeys.invoiceList2, + subtitle: getIt.get().isArabic()?LocaleKeys.invoiceList2:LocaleKeys.myDoctorSubtitle2, backgroundColor: AppColors.whiteColor, iconColor: AppColors.blackColor, textColor: AppColors.blackColor, diff --git a/lib/presentation/home/landing_page.dart b/lib/presentation/home/landing_page.dart index f103bd3f..fc5924ca 100644 --- a/lib/presentation/home/landing_page.dart +++ b/lib/presentation/home/landing_page.dart @@ -696,7 +696,7 @@ class _LandingPageState extends State { .width / 2.5 - 10), child: ListView.separated( scrollDirection: Axis.horizontal, - itemCount: LandingPageData.getLoggedInServiceCardsList.length, + itemCount: LandingPageData().getLoggedInServiceCardsList.length, shrinkWrap: true, controller: _horizontalScrollController, padding: EdgeInsets.only(left: 0.h, right: 0.h, top: 16.h, bottom: 12.h), @@ -708,14 +708,14 @@ class _LandingPageState extends State { horizontalOffset: 100.0, child: FadeInAnimation( child: SmallServiceCard( - icon: LandingPageData.getLoggedInServiceCardsList[index].icon, - title: LandingPageData.getLoggedInServiceCardsList[index].title, - subtitle: LandingPageData.getLoggedInServiceCardsList[index].subtitle, - iconColor: LandingPageData.getLoggedInServiceCardsList[index].iconColor!, - textColor: LandingPageData.getLoggedInServiceCardsList[index].textColor, - backgroundColor: LandingPageData.getLoggedInServiceCardsList[index].backgroundColor, - isBold: LandingPageData.getLoggedInServiceCardsList[index].isBold, - serviceName: LandingPageData.getLoggedInServiceCardsList[index].serviceName, + icon: LandingPageData().getLoggedInServiceCardsList[index].icon, + title: LandingPageData().getLoggedInServiceCardsList[index].title, + subtitle: LandingPageData().getLoggedInServiceCardsList[index].subtitle, + iconColor: LandingPageData().getLoggedInServiceCardsList[index].iconColor!, + textColor: LandingPageData().getLoggedInServiceCardsList[index].textColor, + backgroundColor: LandingPageData().getLoggedInServiceCardsList[index].backgroundColor, + isBold: LandingPageData().getLoggedInServiceCardsList[index].isBold, + serviceName: LandingPageData().getLoggedInServiceCardsList[index].serviceName, ), ), ), diff --git a/lib/presentation/lab/lab_result_via_clinic/lab_order_result_item.dart b/lib/presentation/lab/lab_result_via_clinic/lab_order_result_item.dart index 7ae38db1..52dba2dd 100644 --- a/lib/presentation/lab/lab_result_via_clinic/lab_order_result_item.dart +++ b/lib/presentation/lab/lab_result_via_clinic/lab_order_result_item.dart @@ -91,35 +91,41 @@ class LabOrderResultItem extends StatelessWidget { Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Visibility( - visible: tests?.checkIfGraphShouldBeDisplayed() == true, - child: Column( - spacing: 6.h, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - severityText.tr().toText10(isBold: true, color: AppColors.greyTextColor), - Utils.buildSvgWithAssets(icon: AppAssets.lab_result_indicator, width: 21, height: 23, iconColor: iconColor), - ], + Flexible( + flex: 2, + child: Visibility( + visible: tests?.checkIfGraphShouldBeDisplayed() == true, + child: Column( + spacing: 6.h, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + severityText.tr().toText10(isBold: true, color: AppColors.greyTextColor), + Utils.buildSvgWithAssets(icon: AppAssets.lab_result_indicator, width: 21, height: 23, iconColor: iconColor), + ], + ), ), ), - Visibility( - visible: tests?.checkIfGraphShouldBeDisplayed() == true, - child: CustomButton( - icon: AppAssets.view_report_icon, - iconColor: AppColors.infoColor, - iconSize: 16.h, - text: LocaleKeys.viewReport.tr(context: context), - onPressed: () { - onTap(); - }, - backgroundColor: AppColors.infoColor.withAlpha(20), - borderColor: AppColors.infoColor.withAlpha(0), - textColor: AppColors.infoColor, - fontSize: 14, - fontWeight: FontWeight.w600, - borderRadius: 12, - padding: EdgeInsets.fromLTRB(10, 0, 10, 0), - height: 40.h, + Flexible( + flex:2, + child: Visibility( + visible: tests?.checkIfGraphShouldBeDisplayed() == true, + child: CustomButton( + icon: AppAssets.view_report_icon, + iconColor: AppColors.infoColor, + iconSize: 16.h, + text: LocaleKeys.viewReport.tr(context: context), + onPressed: () { + onTap(); + }, + backgroundColor: AppColors.infoColor.withAlpha(20), + borderColor: AppColors.infoColor.withAlpha(0), + textColor: AppColors.infoColor, + fontSize: 14, + fontWeight: FontWeight.w600, + borderRadius: 12, + padding: EdgeInsets.fromLTRB(10, 0, 10, 0), + height: 40.h, + ), ), ), ], diff --git a/lib/widgets/bottom_navigation/bottom_navigation.dart b/lib/widgets/bottom_navigation/bottom_navigation.dart index 2518375a..fe586fe4 100644 --- a/lib/widgets/bottom_navigation/bottom_navigation.dart +++ b/lib/widgets/bottom_navigation/bottom_navigation.dart @@ -27,7 +27,7 @@ class BottomNavigation extends StatelessWidget { BottomNavItem( icon: AppAssets.bookAppoBottom, fillIcon: AppAssets.bookAppoBottom, - label: LocaleKeys.appointment.tr(context: context), + label: LocaleKeys.appointments.tr(context: context), iconSize: 32, isSpecial: true), appState.isAuthenticated // ? BottomNavItem(icon: AppAssets.toDoBottom, label: LocaleKeys.todoList.tr(context: context)) @@ -80,7 +80,7 @@ class BottomNavigation extends StatelessWidget { ), // const SizedBox(height: 10), SizedBox(height: item.isSpecial ? 0 : 8.h), - item.label.toText11(isBold: true), + item.label.toText10(isBold: true), // SizedBox(height: item.isSpecial ? 5 : 0) ], ), diff --git a/lib/widgets/buttons/custom_button.dart b/lib/widgets/buttons/custom_button.dart index d2534587..d868755a 100644 --- a/lib/widgets/buttons/custom_button.dart +++ b/lib/widgets/buttons/custom_button.dart @@ -86,7 +86,8 @@ class CustomButton extends StatelessWidget { ), if (text.isNotEmpty && icon != null) Flexible( - child: Text( + child: + Text( text, overflow: textOverflow ?? TextOverflow.ellipsis, maxLines: 1, From 16e898bb6cf353ee44ff916412d736f831c85142 Mon Sep 17 00:00:00 2001 From: Sultan khan Date: Mon, 13 Apr 2026 16:06:09 +0300 Subject: [PATCH 09/45] updates and fixes --- lib/core/api_consts.dart | 2 +- lib/extensions/string_extensions.dart | 4 +- .../medical_file/medical_file_view_model.dart | 39 ++ .../models/family_file_response_model.dart | 6 +- .../profile_settings_view_model.dart | 14 +- .../appointment_details_page.dart | 2 +- .../widgets/appointment_card.dart | 395 +++++++++++++----- .../widgets/appointment_doctor_card.dart | 2 +- lib/presentation/authentication/login.dart | 2 +- .../doctor_filter/doctors_filter.dart | 8 +- .../contact_us/feedback_page.dart | 4 +- .../lab_order_result_item.dart | 6 +- .../lab/lab_results/lab_result_details.dart | 6 +- .../lab/lab_results/lab_result_list_item.dart | 6 +- .../medical_file_appointment_card.dart | 336 ++++++++++++--- .../medical_report/medical_reports_page.dart | 8 +- .../my_family/widget/family_cards.dart | 389 ++++++++++++++++- .../profile_settings/profile_settings.dart | 111 ++++- .../widgets/family_card_widget.dart | 5 +- .../widgets/profile_picture_widget.dart | 119 +++++- .../radiology/radiology_orders_page.dart | 26 +- .../symptoms_checker/risk_factors_screen.dart | 2 +- .../symptoms_checker/triage_screen.dart | 8 +- .../vital_sign/vital_sign_details_page.dart | 45 +- lib/widgets/input_widget.dart | 5 +- lib/widgets/user_avatar_widget.dart | 16 +- 26 files changed, 1301 insertions(+), 265 deletions(-) diff --git a/lib/core/api_consts.dart b/lib/core/api_consts.dart index ef1cd36a..819691be 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.preProd; + static AppEnvironmentTypeEnum appEnvironmentType = AppEnvironmentTypeEnum.prod; // static String baseUrl = 'https://uat.hmgwebservices.com/'; // HIS API URL UAT diff --git a/lib/extensions/string_extensions.dart b/lib/extensions/string_extensions.dart index 5db5b289..7a71b345 100644 --- a/lib/extensions/string_extensions.dart +++ b/lib/extensions/string_extensions.dart @@ -322,8 +322,10 @@ extension EmailValidator on String { Widget toText32({bool isEnglishOnly = false, FontWeight? weight, Color? color, bool isBold = false, bool isCenter = false}) => Text( this, textAlign: isCenter ? TextAlign.center : null, + style: TextStyle( - height: 32 / 32, color: color ?? AppColors.blackColor, fontSize: 32.f, letterSpacing: -1, fontFamily: getIt.get().getLanguageCode() == "ar" ? 'CairoArabic' : 'Poppins', fontWeight: isBold ? FontWeight.bold : weight ?? FontWeight.normal), + + height: getIt.get().getLanguageCode() == "ar" ? 1.2 : 32 / 32, color: color ?? AppColors.blackColor, fontSize: 32.f, letterSpacing: -1, fontFamily: getIt.get().getLanguageCode() == "ar" ? 'CairoArabic' : 'Poppins', fontWeight: isBold ? FontWeight.bold : weight ?? FontWeight.normal,), ); Widget toText44({Color? color, bool isBold = false, bool isEnglishOnly = false,}) => Text( diff --git a/lib/features/medical_file/medical_file_view_model.dart b/lib/features/medical_file/medical_file_view_model.dart index 05f82208..b94d1103 100644 --- a/lib/features/medical_file/medical_file_view_model.dart +++ b/lib/features/medical_file/medical_file_view_model.dart @@ -456,6 +456,7 @@ class MedicalFileViewModel extends ChangeNotifier { patientIdenficationNumber: currentUser.patientIdentificationNo, emaiLAddress: currentUser.emailAddress, genderDescription: currentUser.genderDescription, + patientImageData: _appState.getProfileImageData, // Set main user's profile image ); // Clear and start fresh with current user @@ -499,6 +500,7 @@ class MedicalFileViewModel extends ChangeNotifier { genderDescription: element.genderDescription, genderImage: element.genderImage, emaiLAddress: element.emaiLAddress, + patientImageData: element.patientImageData, // Include profile image data ); if (isPending) { @@ -774,4 +776,41 @@ class MedicalFileViewModel extends ChangeNotifier { }, ); } + + /// Update family member's profile image in cached family files + void updateFamilyMemberProfileImage(int patientID, String imageData) { + try { + bool updated = false; + + // Update in patientFamilyFiles list + for (var i = 0; i < patientFamilyFiles.length; i++) { + if (patientFamilyFiles[i].patientId == patientID || + patientFamilyFiles[i].responseId == patientID) { + patientFamilyFiles[i].patientImageData = imageData; + updated = true; + print("✅ Updated profile image for family member in patientFamilyFiles (index: $i, patientID: $patientID)"); + break; + } + } + + // Update in pendingFamilyFiles list if exists + for (var i = 0; i < pendingFamilyFiles.length; i++) { + if (pendingFamilyFiles[i].patientId == patientID || + pendingFamilyFiles[i].responseId == patientID) { + pendingFamilyFiles[i].patientImageData = imageData; + print("✅ Updated profile image for pending family member (index: $i, patientID: $patientID)"); + break; + } + } + + if (updated) { + // Notify listeners to update UI + notifyListeners(); + } else { + print("⚠️ Family member not found in cache for patientID: $patientID"); + } + } catch (e) { + print("❌ Error updating family member profile image in cache: $e"); + } + } } diff --git a/lib/features/medical_file/models/family_file_response_model.dart b/lib/features/medical_file/models/family_file_response_model.dart index f4aa557d..59aa2bd2 100644 --- a/lib/features/medical_file/models/family_file_response_model.dart +++ b/lib/features/medical_file/models/family_file_response_model.dart @@ -25,6 +25,7 @@ class FamilyFileResponseModelLists { String? statusDescription; bool? isSuperUser = false; bool? isRequestFromMySide; + String? patientImageData; FamilyFileResponseModelLists( {this.id, @@ -50,7 +51,8 @@ class FamilyFileResponseModelLists { this.patientName, this.statusDescription, this.isSuperUser, - this.isRequestFromMySide}); + this.isRequestFromMySide, + this.patientImageData}); factory FamilyFileResponseModelLists.fromRawJson(String str) => FamilyFileResponseModelLists.fromJson(json.decode(str)); @@ -81,6 +83,7 @@ class FamilyFileResponseModelLists { statusDescription: json["StatusDescription"], isSuperUser: json["isSuperUser"] ?? false, isRequestFromMySide: json["isRequestFromMySide"] ?? false, + patientImageData: json["PatientImageData"], ); Map toJson() => { @@ -108,5 +111,6 @@ class FamilyFileResponseModelLists { "StatusDescription": statusDescription, "isSuperUser": isSuperUser, "isRequestFromMySide": isRequestFromMySide, + "PatientImageData": patientImageData, }; } diff --git a/lib/features/profile_settings/profile_settings_view_model.dart b/lib/features/profile_settings/profile_settings_view_model.dart index 77960569..b208494a 100644 --- a/lib/features/profile_settings/profile_settings_view_model.dart +++ b/lib/features/profile_settings/profile_settings_view_model.dart @@ -3,6 +3,7 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/foundation.dart'; import 'package:get_it/get_it.dart'; import 'package:hmg_patient_app_new/core/app_state.dart'; +import 'package:hmg_patient_app_new/features/medical_file/medical_file_view_model.dart'; import 'package:hmg_patient_app_new/features/profile_settings/models/get_patient_info_response_model.dart'; import 'package:hmg_patient_app_new/features/profile_settings/profile_settings_repo.dart'; import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; @@ -219,9 +220,10 @@ class ProfileSettingsViewModel extends ChangeNotifier { if (response.data != null && response.data['Patient_GetProfileImageDataList'] != null) { var imageList = response.data['Patient_GetProfileImageDataList']; if (imageList is List && imageList.isNotEmpty) { - profileImageData = imageList[0]['PatientsProfileImageData']; + profileImageData = imageList[0]['ImageData']; // Store in AppState for global access GetIt.instance().setProfileImageData = profileImageData; + } else { profileImageData = null; GetIt.instance().setProfileImageData = null; @@ -286,6 +288,16 @@ class ProfileSettingsViewModel extends ChangeNotifier { profileImageData = imageData; // Store in AppState for global access GetIt.instance().setProfileImageData = imageData; + + // Update the family files cache with the new profile image + try { + final medicalFileViewModel = GetIt.instance.get(); + medicalFileViewModel.updateFamilyMemberProfileImage(patientID, imageData); + print("✅ Updated profile image in family files cache for patient: $patientID"); + } catch (e) { + print("⚠️ Could not update family files cache: $e"); + } + notifyListeners(); onSuccess?.call(response.data); }, diff --git a/lib/presentation/appointments/appointment_details_page.dart b/lib/presentation/appointments/appointment_details_page.dart index 5344fead..78532cce 100644 --- a/lib/presentation/appointments/appointment_details_page.dart +++ b/lib/presentation/appointments/appointment_details_page.dart @@ -1072,7 +1072,7 @@ class _AppointmentDetailsPageState extends State { }, backgroundColor: AppointmentType.getNextActionButtonColor(widget.patientAppointmentHistoryResponseModel.nextAction), borderColor: - AppointmentType.getNextActionButtonColor(widget.patientAppointmentHistoryResponseModel.nextAction).withOpacity(0.01), + AppointmentType.getNextActionButtonColor(widget.patientAppointmentHistoryResponseModel.nextAction).withValues(alpha: 0.01), textColor: widget.patientAppointmentHistoryResponseModel.nextAction == 15 ? AppColors.textColor : Colors.white, fontSize: 16.f, fontWeight: FontWeight.w600, diff --git a/lib/presentation/appointments/widgets/appointment_card.dart b/lib/presentation/appointments/widgets/appointment_card.dart index d551c444..8923e9fa 100644 --- a/lib/presentation/appointments/widgets/appointment_card.dart +++ b/lib/presentation/appointments/widgets/appointment_card.dart @@ -1,3 +1,4 @@ +import 'dart:async'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:hmg_patient_app_new/core/app_assets.dart'; @@ -17,7 +18,6 @@ import 'package:hmg_patient_app_new/features/my_appointments/my_appointments_vie import 'package:hmg_patient_app_new/features/my_appointments/utils/appointment_type.dart'; import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; import 'package:hmg_patient_app_new/presentation/appointments/appointment_details_page.dart'; -import 'package:hmg_patient_app_new/presentation/appointments/widgets/ask_doctor_request_type_select.dart'; import 'package:hmg_patient_app_new/presentation/book_appointment/widgets/appointment_calendar.dart'; import 'package:hmg_patient_app_new/presentation/medical_file/eye_measurement_details_page.dart'; import 'package:hmg_patient_app_new/theme/colors.dart'; @@ -27,8 +27,9 @@ import 'package:hmg_patient_app_new/widgets/common_bottom_sheet.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 'dart:ui' as ui; +import 'package:hmg_patient_app_new/presentation/appointments/appointment_payment_page.dart'; -class AppointmentCard extends StatelessWidget { +class AppointmentCard extends StatefulWidget { final PatientAppointmentHistoryResponseModel patientAppointmentHistoryResponseModel; final MyAppointmentsViewModel myAppointmentsViewModel; final bool isLoading; @@ -56,6 +57,97 @@ class AppointmentCard extends StatelessWidget { this.contactUsViewModel, this.isForRate = false}); + @override + State createState() => _AppointmentCardState(); +} + +class _AppointmentCardState extends State { + Timer? _countdownTimer; + Duration? _timeRemaining; + Function(void Function())? _modalSetState; + + @override + void initState() { + super.initState(); + // Start countdown timer if appointment requires payment + if (widget.patientAppointmentHistoryResponseModel.nextAction == 15) { + _startCountdownTimer(); + } + } + + @override + void dispose() { + _countdownTimer?.cancel(); + super.dispose(); + } + + void _startCountdownTimer() { + final appointmentDate = DateUtil.convertStringToDate(widget.patientAppointmentHistoryResponseModel.appointmentDate!); + final expiryDate = appointmentDate.subtract(const Duration(hours: 4)); + + setState(() { + _timeRemaining = expiryDate.difference(DateTime.now()); + }); + + _countdownTimer?.cancel(); + _countdownTimer = Timer.periodic(const Duration(seconds: 1), (timer) { + final newTimeRemaining = expiryDate.difference(DateTime.now()); + + if (newTimeRemaining.isNegative) { + timer.cancel(); + setState(() { + _timeRemaining = Duration.zero; + }); + _modalSetState?.call(() { + _timeRemaining = Duration.zero; + }); + } else { + setState(() { + _timeRemaining = newTimeRemaining; + }); + _modalSetState?.call(() { + _timeRemaining = newTimeRemaining; + }); + } + }); + } + + // Helper method to build each time unit (number + label) + Widget _buildTimeUnit(String value, String label) { + return Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Container( + alignment: Alignment.center, + child: value.toText32( + isBold: true, + color: AppColors.blackColor, + isEnglishOnly: true, + ), + ), + SizedBox(height: 4.h), + Container( + alignment: Alignment.center, + child: label.toText12( + color: AppColors.greyTextColor, + ), + ), + ], + ); + } + + // Helper method to build time separator (:) + Widget _buildTimeSeparator() { + return Padding( + padding: EdgeInsets.only(bottom: 16.h, left: 6.w, right: 6.w), + child: ':'.toText32( + isBold: true, + color: AppColors.blackColor, + ), + ); + } + @override Widget build(BuildContext context) { final appState = getIt.get(); @@ -66,11 +158,11 @@ class AppointmentCard extends StatelessWidget { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - isForRate ? SizedBox() : _buildHeader(context, appState), + widget.isForRate ? SizedBox() : _buildHeader(context, appState), SizedBox(height: 16.h), _buildDoctorRow(context), SizedBox(height: 16.h), - isForRate ? SizedBox() : _buildActionArea(context, appState), + widget.isForRate ? SizedBox() : _buildActionArea(context, appState), ], ), ), @@ -87,7 +179,7 @@ class AppointmentCard extends StatelessWidget { } Widget _buildChips(BuildContext context, AppState appState) { - final isLiveCare = !isLoading && patientAppointmentHistoryResponseModel.isLiveCareAppointment!; + final isLiveCare = !widget.isLoading && widget.patientAppointmentHistoryResponseModel.isLiveCareAppointment!; return Wrap( alignment: WrapAlignment.start, @@ -96,25 +188,25 @@ class AppointmentCard extends StatelessWidget { runSpacing: 6.h, children: [ AppCustomChipWidget( - icon: isLoading ? AppAssets.walkin_appointment_icon : (isLiveCare ? AppAssets.small_livecare_icon : AppAssets.walkin_appointment_icon), - iconColor: isLoading ? AppColors.textColor : (isLiveCare ? Colors.white : AppColors.textColor), - labelText: isLoading ? LocaleKeys.walkin.tr(context: context) : (isLiveCare ? LocaleKeys.livecare.tr(context: context) : LocaleKeys.walkin.tr(context: context)), - backgroundColor: isLoading ? AppColors.greyColor : (isLiveCare ? AppColors.successColor : AppColors.greyColor), - textColor: isLoading ? AppColors.textColor : (isLiveCare ? Colors.white : AppColors.textColor), - ).toShimmer2(isShow: isLoading), + icon: widget.isLoading ? AppAssets.walkin_appointment_icon : (isLiveCare ? AppAssets.small_livecare_icon : AppAssets.walkin_appointment_icon), + iconColor: widget.isLoading ? AppColors.textColor : (isLiveCare ? Colors.white : AppColors.textColor), + labelText: widget.isLoading ? LocaleKeys.walkin.tr(context: context) : (isLiveCare ? LocaleKeys.livecare.tr(context: context) : LocaleKeys.walkin.tr(context: context)), + backgroundColor: widget.isLoading ? AppColors.greyColor : (isLiveCare ? AppColors.successColor : AppColors.greyColor), + textColor: widget.isLoading ? AppColors.textColor : (isLiveCare ? Colors.white : AppColors.textColor), + ).toShimmer2(isShow: widget.isLoading), AppCustomChipWidget( labelText: - isLoading ? 'OutPatient' : (appState.isArabic() ? patientAppointmentHistoryResponseModel.isInOutPatientDescriptionN! : patientAppointmentHistoryResponseModel.isInOutPatientDescription!), + widget.isLoading ? 'OutPatient' : (appState.isArabic() ? widget.patientAppointmentHistoryResponseModel.isInOutPatientDescriptionN! : widget.patientAppointmentHistoryResponseModel.isInOutPatientDescription!), backgroundColor: AppColors.warningColorYellow.withValues(alpha: 0.1), textColor: AppColors.warningColorYellow, - ).toShimmer2(isShow: isLoading), + ).toShimmer2(isShow: widget.isLoading), AppCustomChipWidget( - labelText: isLoading ? 'Booked' : AppointmentType.getAppointmentStatusType(patientAppointmentHistoryResponseModel.patientStatusType!), + labelText: widget.isLoading ? 'Booked' : AppointmentType.getAppointmentStatusType(widget.patientAppointmentHistoryResponseModel.patientStatusType!), backgroundColor: AppColors.successColor.withValues(alpha: 0.1), textColor: AppColors.successColor, - ).toShimmer2(isShow: isLoading), + ).toShimmer2(isShow: widget.isLoading), ], - ).toShimmer2(isShow: isLoading); + ).toShimmer2(isShow: widget.isLoading); } Widget _buildDoctorRow(BuildContext context) { @@ -125,11 +217,11 @@ class AppointmentCard extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.center, children: [ Image.network( - isLoading ? 'https://hmgwebservices.com/Images/MobileImages/DUBAI/unkown_female.png' : patientAppointmentHistoryResponseModel.doctorImageURL!, + widget.isLoading ? 'https://hmgwebservices.com/Images/MobileImages/DUBAI/unkown_female.png' : widget.patientAppointmentHistoryResponseModel.doctorImageURL!, width: 63.h, height: 63.h, fit: BoxFit.cover, - ).circle(100.r).toShimmer2(isShow: isLoading), + ).circle(100.r).toShimmer2(isShow: widget.isLoading), Transform.translate( offset: Offset(0.0, -20.h), child: Container( @@ -149,11 +241,11 @@ class AppointmentCard extends StatelessWidget { Utils.buildSvgWithAssets(icon: AppAssets.rating_icon, width: 15.w, height: 15.h, iconColor: AppColors.ratingColorYellow), SizedBox(height: 2.h), (isFoldable || isTablet) - ? "${patientAppointmentHistoryResponseModel.decimalDoctorRate}".toText9(isBold: true, color: AppColors.textColor, isEnglishOnly: true) - : "${patientAppointmentHistoryResponseModel.decimalDoctorRate ?? "0.0"}".toText11(isBold: true, color: AppColors.textColor, isEnglishOnly: true), + ? "${widget.patientAppointmentHistoryResponseModel.decimalDoctorRate}".toText9(isBold: true, color: AppColors.textColor, isEnglishOnly: true) + : "${widget.patientAppointmentHistoryResponseModel.decimalDoctorRate ?? "0.0"}".toText11(isBold: true, color: AppColors.textColor, isEnglishOnly: true), ], ), - ).circle(100).toShimmer2(isShow: isLoading), + ).circle(100).toShimmer2(isShow: widget.isLoading), ), ], ), @@ -164,20 +256,20 @@ class AppointmentCard extends StatelessWidget { children: [ Row( children: [ - (isLoading ? 'Dr' : "${patientAppointmentHistoryResponseModel.doctorTitle}").toText16(isBold: true, maxlines: 1), - (isLoading ? 'John Doe' : " ${patientAppointmentHistoryResponseModel.doctorNameObj!.truncate(20)}") - .toText16(isBold: true, maxlines: 1, isEnglishOnly: !Utils.isArabicText(patientAppointmentHistoryResponseModel.doctorNameObj ?? "John Doe")), + (widget.isLoading ? 'Dr' : "${widget.patientAppointmentHistoryResponseModel.doctorTitle}").toText16(isBold: true, maxlines: 1), + (widget.isLoading ? 'John Doe' : " ${widget.patientAppointmentHistoryResponseModel.doctorNameObj!.truncate(20)}") + .toText16(isBold: true, maxlines: 1, isEnglishOnly: !Utils.isArabicText(widget.patientAppointmentHistoryResponseModel.doctorNameObj ?? "John Doe")), SizedBox(width: 12.w), - (patientAppointmentHistoryResponseModel.doctorNationalityFlagURL != null && patientAppointmentHistoryResponseModel.doctorNationalityFlagURL!.isNotEmpty) + (widget.patientAppointmentHistoryResponseModel.doctorNationalityFlagURL != null && widget.patientAppointmentHistoryResponseModel.doctorNationalityFlagURL!.isNotEmpty) ? Image.network( - patientAppointmentHistoryResponseModel.doctorNationalityFlagURL ?? "https://hmgwebservices.com/Images/flag/SAU.png", + widget.patientAppointmentHistoryResponseModel.doctorNationalityFlagURL ?? "https://hmgwebservices.com/Images/flag/SAU.png", width: 20.h, height: 15.h, fit: BoxFit.cover, ) : SizedBox.shrink(), ], - ).toShimmer2(isShow: isLoading), + ).toShimmer2(isShow: widget.isLoading), SizedBox(height: 8.h), Wrap( direction: Axis.horizontal, @@ -185,29 +277,29 @@ class AppointmentCard extends StatelessWidget { runSpacing: 4.h, children: [ AppCustomChipWidget( - labelText: isLoading + labelText: widget.isLoading ? 'Cardiology' - : (patientAppointmentHistoryResponseModel.clinicName!.length > 20 - ? '${patientAppointmentHistoryResponseModel.clinicName!.substring(0, 20)}...' - : patientAppointmentHistoryResponseModel.clinicName!), - ).toShimmer2(isShow: isLoading), + : (widget.patientAppointmentHistoryResponseModel.clinicName!.length > 20 + ? '${widget.patientAppointmentHistoryResponseModel.clinicName!.substring(0, 20)}...' + : widget.patientAppointmentHistoryResponseModel.clinicName!), + ).toShimmer2(isShow: widget.isLoading), AppCustomChipWidget( - labelText: isLoading + labelText: widget.isLoading ? 'Olaya' - : (patientAppointmentHistoryResponseModel.projectName ?? "Habib Hospital").length > 15 - ? '${(patientAppointmentHistoryResponseModel.projectName ?? "Habib Hospital").substring(0, 15)}...' - : patientAppointmentHistoryResponseModel.projectName ?? "Habib Hospital") - .toShimmer2(isShow: isLoading), + : (widget.patientAppointmentHistoryResponseModel.projectName ?? "Habib Hospital").length > 15 + ? '${(widget.patientAppointmentHistoryResponseModel.projectName ?? "Habib Hospital").substring(0, 15)}...' + : widget.patientAppointmentHistoryResponseModel.projectName ?? "Habib Hospital") + .toShimmer2(isShow: widget.isLoading), Directionality( textDirection: ui.TextDirection.ltr, child: AppCustomChipWidget( labelPadding: EdgeInsetsDirectional.only(start: -4.w, end: 6.w), icon: AppAssets.appointment_calendar_icon, - richText: isLoading - ? 'Cardiology'.toText10().toShimmer2(isShow: isLoading) - : "${DateUtil.formatDateToDate(DateUtil.convertStringToDate(patientAppointmentHistoryResponseModel.appointmentDate), false)} ${DateUtil.formatDateToTimeLang(DateUtil.convertStringToDate(patientAppointmentHistoryResponseModel.appointmentDate), false)}" + richText: widget.isLoading + ? 'Cardiology'.toText10().toShimmer2(isShow: widget.isLoading) + : "${DateUtil.formatDateToDate(DateUtil.convertStringToDate(widget.patientAppointmentHistoryResponseModel.appointmentDate), false)} ${DateUtil.formatDateToTimeLang(DateUtil.convertStringToDate(widget.patientAppointmentHistoryResponseModel.appointmentDate), false)}" .toText10(isEnglishOnly: true, isBold: true), - ).toShimmer2(isShow: isLoading), + ).toShimmer2(isShow: widget.isLoading), ), // AppCustomChipWidget( @@ -240,10 +332,10 @@ class AppointmentCard extends StatelessWidget { } Widget _buildActionArea(BuildContext context, AppState appState) { - if ((((patientAppointmentHistoryResponseModel.isLiveCareAppointment ?? false) || - (patientAppointmentHistoryResponseModel.isExecludeDoctor ?? false) || - !Utils.isClinicAllowedForRebook(patientAppointmentHistoryResponseModel.clinicID ?? 0))) && - AppointmentType.isArrived(patientAppointmentHistoryResponseModel)) { + if ((((widget.patientAppointmentHistoryResponseModel.isLiveCareAppointment ?? false) || + (widget.patientAppointmentHistoryResponseModel.isExecludeDoctor ?? false) || + !Utils.isClinicAllowedForRebook(widget.patientAppointmentHistoryResponseModel.clinicID ?? 0))) && + AppointmentType.isArrived(widget.patientAppointmentHistoryResponseModel)) { // if (((patientAppointmentHistoryResponseModel.isLiveCareAppointment ?? false) && // DateTime.now().difference(DateUtil.convertStringToDate(patientAppointmentHistoryResponseModel.appointmentDate)).inDays <= 15)) { // return Row( @@ -325,25 +417,25 @@ class AppointmentCard extends StatelessWidget { // ); // } else { return CustomButton( - text: isFromMedicalReport ? LocaleKeys.selectAppointment.tr(context: context) : LocaleKeys.viewDetails.tr(context: context), + text: widget.isFromMedicalReport ? LocaleKeys.selectAppointment.tr(context: context) : LocaleKeys.viewDetails.tr(context: context), onPressed: () { - if (isFromMedicalReport) { - if (isForFeedback) { - contactUsViewModel!.setPatientFeedbackSelectedAppointment(patientAppointmentHistoryResponseModel); + if (widget.isFromMedicalReport) { + if (widget.isForFeedback) { + widget.contactUsViewModel!.setPatientFeedbackSelectedAppointment(widget.patientAppointmentHistoryResponseModel); } else { - medicalFileViewModel!.setSelectedMedicalReportAppointment(patientAppointmentHistoryResponseModel); + widget.medicalFileViewModel!.setSelectedMedicalReportAppointment(widget.patientAppointmentHistoryResponseModel); } Navigator.pop(context, false); } else { Navigator.of(context) .push( CustomPageRoute( - page: AppointmentDetailsPage(patientAppointmentHistoryResponseModel: patientAppointmentHistoryResponseModel), + page: AppointmentDetailsPage(patientAppointmentHistoryResponseModel: widget.patientAppointmentHistoryResponseModel), ), ) .then((_) { - myAppointmentsViewModel.initAppointmentsViewModel(); - myAppointmentsViewModel.getPatientAppointments(true, false); + widget.myAppointmentsViewModel.initAppointmentsViewModel(); + widget.myAppointmentsViewModel.getPatientAppointments(true, false); }); } }, @@ -356,23 +448,23 @@ class AppointmentCard extends StatelessWidget { padding: EdgeInsets.symmetric(horizontal: 10.w), // height: isTablet || isFoldable ? 46.h : 40.h, height: 40.h, - icon: isFromMedicalReport ? AppAssets.checkmark_icon : null, + icon: widget.isFromMedicalReport ? AppAssets.checkmark_icon : null, iconColor: AppColors.primaryRedColor, iconSize: 16.h, ); // } } else { - if (isFromMedicalReport) { - if (isForEyeMeasurements) { + if (widget.isFromMedicalReport) { + if (widget.isForEyeMeasurements) { return SizedBox.shrink(); } else { return CustomButton( text: LocaleKeys.selectAppointment.tr(context: context), onPressed: () { - if (isForFeedback) { - contactUsViewModel!.setPatientFeedbackSelectedAppointment(patientAppointmentHistoryResponseModel); + if (widget.isForFeedback) { + widget.contactUsViewModel!.setPatientFeedbackSelectedAppointment(widget.patientAppointmentHistoryResponseModel); } else { - medicalFileViewModel!.setSelectedMedicalReportAppointment(patientAppointmentHistoryResponseModel); + widget.medicalFileViewModel!.setSelectedMedicalReportAppointment(widget.patientAppointmentHistoryResponseModel); } Navigator.pop(context, false); }, @@ -391,33 +483,33 @@ class AppointmentCard extends StatelessWidget { ); } } - return (patientAppointmentHistoryResponseModel.isActiveDoctor ?? true) - ? (AppointmentType.isArrived(patientAppointmentHistoryResponseModel) && - patientAppointmentHistoryResponseModel.isClinicReBookingAllowed == false) + return (widget.patientAppointmentHistoryResponseModel.isActiveDoctor ?? true) + ? (AppointmentType.isArrived(widget.patientAppointmentHistoryResponseModel) && + widget.patientAppointmentHistoryResponseModel.isClinicReBookingAllowed == false) ? // Show only View Details button without arrow when rebooking not allowed _getArrivedButton(context) : Row( children: [ Expanded( flex: 6, - child: (AppointmentType.isArrived(patientAppointmentHistoryResponseModel) + child: (AppointmentType.isArrived(widget.patientAppointmentHistoryResponseModel) ? _getArrivedButton(context) : CustomButton( - text: AppointmentType.getNextActionText(patientAppointmentHistoryResponseModel.nextAction), - onPressed: () => _goToDetails(context), - backgroundColor: AppointmentType.getNextActionButtonColor(patientAppointmentHistoryResponseModel.nextAction).withValues(alpha: 0.15), - borderColor: AppointmentType.getNextActionButtonColor(patientAppointmentHistoryResponseModel.nextAction).withValues(alpha: 0.01), - textColor: AppointmentType.getNextActionTextColor(patientAppointmentHistoryResponseModel.nextAction), + text: AppointmentType.getNextActionText(widget.patientAppointmentHistoryResponseModel.nextAction), + onPressed: () => handleAppointmentNextAction(widget.patientAppointmentHistoryResponseModel.nextAction, context), + backgroundColor: AppointmentType.getNextActionButtonColor(widget.patientAppointmentHistoryResponseModel.nextAction).withValues(alpha: 0.15), + borderColor: AppointmentType.getNextActionButtonColor(widget.patientAppointmentHistoryResponseModel.nextAction).withValues(alpha: 0.01), + textColor: AppointmentType.getNextActionTextColor(widget.patientAppointmentHistoryResponseModel.nextAction), fontSize: (isFoldable || isTablet) ? 12.f : 14.f, fontWeight: FontWeight.w600, borderRadius: 12.r, padding: EdgeInsets.symmetric(horizontal: 10.w), height: 40.h, - icon: AppointmentType.getNextActionIcon(patientAppointmentHistoryResponseModel.nextAction), - iconColor: AppointmentType.getNextActionTextColor(patientAppointmentHistoryResponseModel.nextAction), + icon: AppointmentType.getNextActionIcon(widget.patientAppointmentHistoryResponseModel.nextAction), + iconColor: AppointmentType.getNextActionTextColor(widget.patientAppointmentHistoryResponseModel.nextAction), iconSize: 15.h, )) - .toShimmer2(isShow: isLoading), + .toShimmer2(isShow: widget.isLoading), ), SizedBox(width: 8.h), Expanded( @@ -442,7 +534,7 @@ class AppointmentCard extends StatelessWidget { fit: BoxFit.contain, ), ), - ).toShimmer2(isShow: isLoading).onPress(() { + ).toShimmer2(isShow: widget.isLoading).onPress(() { _goToDetails(context); }), ), @@ -454,12 +546,12 @@ class AppointmentCard extends StatelessWidget { Navigator.of(context) .push( CustomPageRoute( - page: AppointmentDetailsPage(patientAppointmentHistoryResponseModel: patientAppointmentHistoryResponseModel), + page: AppointmentDetailsPage(patientAppointmentHistoryResponseModel: widget.patientAppointmentHistoryResponseModel), ), ) .then((_) { - myAppointmentsViewModel.initAppointmentsViewModel(); - myAppointmentsViewModel.getPatientAppointments(true, false); + widget.myAppointmentsViewModel.initAppointmentsViewModel(); + widget.myAppointmentsViewModel.getPatientAppointments(true, false); }); }, backgroundColor: AppColors.secondaryLightRedColor, @@ -471,7 +563,7 @@ class AppointmentCard extends StatelessWidget { padding: EdgeInsets.symmetric(horizontal: 10.w), // height: isTablet || isFoldable ? 46.h : 40.h, height: 40.h, - icon: isFromMedicalReport ? AppAssets.checkmark_icon : null, + icon: widget.isFromMedicalReport ? AppAssets.checkmark_icon : null, iconColor: AppColors.primaryRedColor, iconSize: 16.h, ); @@ -479,7 +571,7 @@ class AppointmentCard extends StatelessWidget { } Widget _getArrivedButton(BuildContext context) { - if (patientAppointmentHistoryResponseModel.isClinicReBookingAllowed == false) { + if (widget.patientAppointmentHistoryResponseModel.isClinicReBookingAllowed == false) { return CustomButton( text: LocaleKeys.viewDetails.tr(context: context), onPressed: () => _goToDetails(context), @@ -518,21 +610,21 @@ class AppointmentCard extends StatelessWidget { } void _goToDetails(BuildContext context) { - if (isFromMedicalReport) return; - if (isForEyeMeasurements) { + if (widget.isFromMedicalReport) return; + if (widget.isForEyeMeasurements) { Navigator.of(context).push( CustomPageRoute( - page: EyeMeasurementDetailsPage(patientAppointmentHistoryResponseModel: patientAppointmentHistoryResponseModel), + page: EyeMeasurementDetailsPage(patientAppointmentHistoryResponseModel: widget.patientAppointmentHistoryResponseModel), ), ); } else { - if (!AppointmentType.isArrived(patientAppointmentHistoryResponseModel)) { - bookAppointmentsViewModel.getAppointmentNearestGate(projectID: patientAppointmentHistoryResponseModel.projectID, clinicID: patientAppointmentHistoryResponseModel.clinicID); + if (!AppointmentType.isArrived(widget.patientAppointmentHistoryResponseModel)) { + widget.bookAppointmentsViewModel.getAppointmentNearestGate(projectID: widget.patientAppointmentHistoryResponseModel.projectID, clinicID: widget.patientAppointmentHistoryResponseModel.clinicID); } Navigator.of(context) .push( CustomPageRoute( - page: AppointmentDetailsPage(patientAppointmentHistoryResponseModel: patientAppointmentHistoryResponseModel), + page: AppointmentDetailsPage(patientAppointmentHistoryResponseModel: widget.patientAppointmentHistoryResponseModel), ), ) .then((_) { @@ -544,22 +636,22 @@ class AppointmentCard extends StatelessWidget { void openDoctorScheduleCalendar(BuildContext context) async { final doctor = DoctorsListResponseModel( - clinicID: patientAppointmentHistoryResponseModel.clinicID, - projectID: patientAppointmentHistoryResponseModel.projectID, - doctorID: patientAppointmentHistoryResponseModel.doctorID, - doctorImageURL: patientAppointmentHistoryResponseModel.doctorImageURL, - doctorTitle: patientAppointmentHistoryResponseModel.doctorTitle, - name: patientAppointmentHistoryResponseModel.doctorNameObj, + clinicID: widget.patientAppointmentHistoryResponseModel.clinicID, + projectID: widget.patientAppointmentHistoryResponseModel.projectID, + doctorID: widget.patientAppointmentHistoryResponseModel.doctorID, + doctorImageURL: widget.patientAppointmentHistoryResponseModel.doctorImageURL, + doctorTitle: widget.patientAppointmentHistoryResponseModel.doctorTitle, + name: widget.patientAppointmentHistoryResponseModel.doctorNameObj, nationalityFlagURL: '', speciality: [], - clinicName: patientAppointmentHistoryResponseModel.clinicName, - projectName: patientAppointmentHistoryResponseModel.projectName, + clinicName: widget.patientAppointmentHistoryResponseModel.clinicName, + projectName: widget.patientAppointmentHistoryResponseModel.projectName, ); - bookAppointmentsViewModel.setSelectedDoctor(doctor); + widget.bookAppointmentsViewModel.setSelectedDoctor(doctor); LoaderBottomSheet.showLoader(); - await bookAppointmentsViewModel.getDoctorFreeSlots( + await widget.bookAppointmentsViewModel.getDoctorFreeSlots( isBookingForLiveCare: false, onSuccess: (respData) async { LoaderBottomSheet.hideLoader(); @@ -584,4 +676,121 @@ class AppointmentCard extends StatelessWidget { }, ); } + + Future handleAppointmentNextAction(nextAction, BuildContext context) async { + switch (nextAction) { + case 0: + // No action needed + _goToDetails(context); + break; + case 10: + // Confirm appointment - go to details + _goToDetails(context); + break; + case 15: + // Pending payment - show waiting modal + // Ensure timer is running before showing modal + if (_countdownTimer == null || !_countdownTimer!.isActive) { + _startCountdownTimer(); + } + + showCommonBottomSheetWithoutHeight( + context, + title: LocaleKeys.notice.tr(), + child: StatefulBuilder( + builder: (context, setModalState) { + // Store the modal setState callback + _modalSetState = setModalState; + + return Column( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + // Message text + LocaleKeys.upcomingPaymentPending.tr(context: context).toText14( + color: AppColors.textColor, + isCenter: true, + ), + SizedBox(height: 24.h), + // Countdown Timer - DD : HH : MM : SS format with labels + Row( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + // Days + _buildTimeUnit( + _timeRemaining != null ? _timeRemaining!.inDays.toString().padLeft(2, '0') : '00', + LocaleKeys.days.tr(context: context), + ), + _buildTimeSeparator(), + // Hours + _buildTimeUnit( + _timeRemaining != null ? _timeRemaining!.inHours.remainder(24).toString().padLeft(2, '0') : '00', + LocaleKeys.hours.tr(context: context), + ), + _buildTimeSeparator(), + // Minutes + _buildTimeUnit( + _timeRemaining != null ? _timeRemaining!.inMinutes.remainder(60).toString().padLeft(2, '0') : '00', + LocaleKeys.minutes.tr(context: context), + ), + _buildTimeSeparator(), + // Seconds + _buildTimeUnit( + _timeRemaining != null ? _timeRemaining!.inSeconds.remainder(60).toString().padLeft(2, '0') : '00', + LocaleKeys.seconds.tr(context: context), + ), + ], + ), + SizedBox(height: 24.h), + // Green Acknowledge button with checkmark icon + CustomButton( + text: LocaleKeys.acknowledged.tr(context: context), + onPressed: () { + _modalSetState = null; // Clear callback when closing + Navigator.of(context).pop(); + }, + backgroundColor: AppColors.successColor, + borderColor: AppColors.successColor, + textColor: Colors.white, + fontSize: 16.f, + fontWeight: FontWeight.w600, + borderRadius: 12.r, + height: 50.h, + icon: AppAssets.checkmark_icon, + iconColor: Colors.white, + ), + ], + ); + }, + ), + callBackFunc: () { + _modalSetState = null; // Clear callback when closing + }, + isFullScreen: false, + isCloseButtonVisible: true, + ); + break; + case 20: + // Pay now - navigate to payment page + widget.myAppointmentsViewModel.setIsPatientAppointmentShareLoading(true); + Navigator.of(context).push( + CustomPageRoute( + page: AppointmentPaymentPage(patientAppointmentHistoryResponseModel: widget.patientAppointmentHistoryResponseModel), + ), + ); + break; + case 50: + // Confirm livecare - go to details + _goToDetails(context); + break; + case 90: + // Check-in - go to details + _goToDetails(context); + break; + default: + // Default - go to details + _goToDetails(context); + } + } } + diff --git a/lib/presentation/appointments/widgets/appointment_doctor_card.dart b/lib/presentation/appointments/widgets/appointment_doctor_card.dart index 4b5df07b..293f58ac 100644 --- a/lib/presentation/appointments/widgets/appointment_doctor_card.dart +++ b/lib/presentation/appointments/widgets/appointment_doctor_card.dart @@ -142,7 +142,7 @@ class AppointmentDoctorCard extends StatelessWidget { ], ), ), - patientAppointmentHistoryResponseModel.isLiveCareAppointment! + patientAppointmentHistoryResponseModel.isLiveCareAppointment! || patientAppointmentHistoryResponseModel.isClinicReBookingAllowed! ==false ? SizedBox.shrink() : Utils.buildSvgWithAssets(icon: AppAssets.doctor_profile_icon, width: 20.h, height: 20.h, fit: BoxFit.scaleDown).onPress(() async { DoctorsListResponseModel selectedDoctor = DoctorsListResponseModel(); diff --git a/lib/presentation/authentication/login.dart b/lib/presentation/authentication/login.dart index d559ebbc..b2979235 100644 --- a/lib/presentation/authentication/login.dart +++ b/lib/presentation/authentication/login.dart @@ -71,7 +71,7 @@ class LoginScreenState extends State { children: [ Utils.showLottie(context: context, assetPath: AppAnimations.login, width: 200.h, height: 200.h, repeat: true, fit: BoxFit.cover), SizedBox(height: 130.h), // Adjusted to sizer unit - LocaleKeys.welcomeToDrSulaiman.tr(context: context).toText32(isBold: true, color: AppColors.textColor), + LocaleKeys.welcomeToDrSulaiman.tr(context: context).toText32(isBold: true, color: AppColors.textColor ), SizedBox(height: 32.h), Localizations.override(context: context, locale: Locale('en', 'US'), child: Container()), // Force English locale for this widget TextInputWidget( diff --git a/lib/presentation/book_appointment/doctor_filter/doctors_filter.dart b/lib/presentation/book_appointment/doctor_filter/doctors_filter.dart index 02dd9b97..c09fbfef 100644 --- a/lib/presentation/book_appointment/doctor_filter/doctors_filter.dart +++ b/lib/presentation/book_appointment/doctor_filter/doctors_filter.dart @@ -1,6 +1,8 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/app_state.dart'; +import 'package:hmg_patient_app_new/core/dependencies.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/extensions/string_extensions.dart'; @@ -59,7 +61,7 @@ class DoctorsFilters extends StatelessWidget{ Text( LocaleKeys.filters.tr(), style:TextStyle( - fontFamily: 'Poppins', + fontFamily: getIt.get().isArabic() ? 'CairoArabic' : 'Poppins', fontWeight: FontWeight.w600, fontSize: 27.f, color: AppColors.textColor, @@ -69,7 +71,7 @@ class DoctorsFilters extends StatelessWidget{ Text( LocaleKeys.clearAllFilters.tr(), style:TextStyle( - fontFamily: 'Poppins', + fontFamily: getIt.get().isArabic() ? 'CairoArabic' : 'Poppins', fontWeight: FontWeight.w600, fontSize: 14.f, color: AppColors.errorColor @@ -199,7 +201,7 @@ class DoctorsFilters extends StatelessWidget{ Text( title, style:TextStyle( - fontFamily: 'Poppins', + fontFamily: getIt.get().isArabic() ? 'CairoArabic' : 'Poppins', fontWeight: FontWeight.w600, fontSize: 16.f, color: AppColors.textColor, diff --git a/lib/presentation/contact_us/feedback_page.dart b/lib/presentation/contact_us/feedback_page.dart index cc70f28e..8ca6619c 100644 --- a/lib/presentation/contact_us/feedback_page.dart +++ b/lib/presentation/contact_us/feedback_page.dart @@ -475,12 +475,12 @@ class FeedbackPage extends StatelessWidget { ), SizedBox(height: 8.h), "${contactUsViewModel.cocItemsList[index].cOCTitle}" - .toText16(weight: FontWeight.bold, fontFamily: Utils.isArabicText(contactUsViewModel.cocItemsList[index].cOCTitle ?? "") ? "GESSTwo" : "Poppins"), + .toText16(weight: FontWeight.bold, fontFamily: Utils.isArabicText(contactUsViewModel.cocItemsList[index].cOCTitle ?? "") ? "CairoArabic" : "Poppins"), SizedBox(height: 8.h), "${contactUsViewModel.cocItemsList[index].detail}".toText14( weight: FontWeight.w600, color: AppColors.textColorLight, - fontFamily: Utils.isArabicText(contactUsViewModel.cocItemsList[index].detail ?? "") ? "GESSTwo" : "Poppins"), + fontFamily: Utils.isArabicText(contactUsViewModel.cocItemsList[index].detail ?? "") ? "CairoArabic" : "Poppins"), ], ), ).paddingOnly(bottom: 16.h), diff --git a/lib/presentation/lab/lab_result_via_clinic/lab_order_result_item.dart b/lib/presentation/lab/lab_result_via_clinic/lab_order_result_item.dart index 52dba2dd..ad2ad77f 100644 --- a/lib/presentation/lab/lab_result_via_clinic/lab_order_result_item.dart +++ b/lib/presentation/lab/lab_result_via_clinic/lab_order_result_item.dart @@ -2,6 +2,8 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:hmg_patient_app_new/core/app_assets.dart'; import 'package:hmg_patient_app_new/core/app_export.dart'; +import 'package:hmg_patient_app_new/core/app_state.dart'; +import 'package:hmg_patient_app_new/core/dependencies.dart'; import 'package:hmg_patient_app_new/core/utils/utils.dart'; import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; @@ -58,7 +60,7 @@ class LabOrderResultItem extends StatelessWidget { style: TextStyle( fontSize: 24.f, fontWeight: FontWeight.w600, - fontFamily: 'Poppins', + fontFamily: getIt.get().isArabic() ? 'CairoArabic' : 'Poppins', color: tests!.checkIfGraphShouldBeDisplayed() ? context.read().getColor( tests?.calculatedResultFlag ?? "", @@ -77,7 +79,7 @@ class LabOrderResultItem extends StatelessWidget { style: TextStyle( fontSize: 12.f, fontWeight: FontWeight.w600, - fontFamily: 'Poppins', + fontFamily: getIt.get().isArabic() ? 'CairoArabic' : 'Poppins', color: AppColors.greyTextColor, ), softWrap: true, diff --git a/lib/presentation/lab/lab_results/lab_result_details.dart b/lib/presentation/lab/lab_results/lab_result_details.dart index fb5fd583..9fbb49a8 100644 --- a/lib/presentation/lab/lab_results/lab_result_details.dart +++ b/lib/presentation/lab/lab_results/lab_result_details.dart @@ -286,7 +286,7 @@ class _LabResultDetailsState extends State { style: TextStyle( fontSize: 12.f, fontWeight: FontWeight.w600, - fontFamily: 'Poppins', + fontFamily: getIt.get().isArabic() ? 'CairoArabic' : 'Poppins', color: AppColors.greyTextColor, ), softWrap: true, @@ -364,7 +364,7 @@ class _LabResultDetailsState extends State { value, style: TextStyle( fontWeight: FontWeight.w600, - fontFamily: 'Poppins', + fontFamily: getIt.get().isArabic() ? 'CairoArabic' : 'Poppins', fontSize: 8.f, color: AppColors.textColor, ), @@ -376,7 +376,7 @@ class _LabResultDetailsState extends State { padding: const EdgeInsets.only(top: 8.0), child: Text( label, - style: TextStyle(fontSize: 8.f, fontFamily: 'Poppins', fontWeight: FontWeight.w600, color: AppColors.labelTextColor), + style: TextStyle(fontSize: 8.f, fontFamily: getIt.get().isArabic() ? 'CairoArabic' : 'Poppins', fontWeight: FontWeight.w600, color: AppColors.labelTextColor), ), ); } diff --git a/lib/presentation/lab/lab_results/lab_result_list_item.dart b/lib/presentation/lab/lab_results/lab_result_list_item.dart index 908d129d..78369463 100644 --- a/lib/presentation/lab/lab_results/lab_result_list_item.dart +++ b/lib/presentation/lab/lab_results/lab_result_list_item.dart @@ -1,5 +1,7 @@ import 'package:flutter/material.dart' ; import 'package:hmg_patient_app_new/core/app_export.dart'; +import 'package:hmg_patient_app_new/core/app_state.dart'; +import 'package:hmg_patient_app_new/core/dependencies.dart'; import 'package:hmg_patient_app_new/core/utils/utils.dart'; import 'package:hmg_patient_app_new/theme/colors.dart'; @@ -25,7 +27,7 @@ class LabHistoryItem extends StatelessWidget{ style: TextStyle( fontSize: 14.f, fontWeight: FontWeight.w600, - fontFamily: 'Poppins', + fontFamily: getIt.get().isArabic() ? 'CairoArabic' : 'Poppins', color: AppColors.labelTextColor ), ), @@ -34,7 +36,7 @@ class LabHistoryItem extends StatelessWidget{ style: TextStyle( fontSize: 18.f, fontWeight: FontWeight.w600, - fontFamily: 'Poppins', + fontFamily: getIt.get().isArabic() ? 'CairoArabic' : 'Poppins', color: AppColors.textColor ), ) diff --git a/lib/presentation/medical_file/widgets/medical_file_appointment_card.dart b/lib/presentation/medical_file/widgets/medical_file_appointment_card.dart index 13ea39dd..2e769609 100644 --- a/lib/presentation/medical_file/widgets/medical_file_appointment_card.dart +++ b/lib/presentation/medical_file/widgets/medical_file_appointment_card.dart @@ -1,3 +1,4 @@ +import 'dart:async'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:hmg_patient_app_new/core/app_assets.dart'; @@ -13,14 +14,16 @@ import 'package:hmg_patient_app_new/features/my_appointments/my_appointments_vie import 'package:hmg_patient_app_new/features/my_appointments/utils/appointment_type.dart'; import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; import 'package:hmg_patient_app_new/presentation/appointments/appointment_details_page.dart'; +import 'package:hmg_patient_app_new/presentation/appointments/appointment_payment_page.dart'; import 'package:hmg_patient_app_new/theme/colors.dart'; import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart'; import 'package:hmg_patient_app_new/widgets/chip/app_custom_chip_widget.dart'; import 'package:hmg_patient_app_new/widgets/routes/custom_page_route.dart'; +import 'package:hmg_patient_app_new/widgets/common_bottom_sheet.dart'; import 'dart:ui' as ui; -class MedicalFileAppointmentCard extends StatelessWidget { +class MedicalFileAppointmentCard extends StatefulWidget { final PatientAppointmentHistoryResponseModel patientAppointmentHistoryResponseModel; final MyAppointmentsViewModel myAppointmentsViewModel; final Function onRescheduleTap; @@ -34,6 +37,97 @@ class MedicalFileAppointmentCard extends StatelessWidget { required this.onAskDoctorTap, }); + @override + State createState() => _MedicalFileAppointmentCardState(); +} + +class _MedicalFileAppointmentCardState extends State { + Timer? _countdownTimer; + Duration? _timeRemaining; + Function(void Function())? _modalSetState; + + @override + void initState() { + super.initState(); + // Start countdown timer if appointment requires payment + if (widget.patientAppointmentHistoryResponseModel.nextAction == 15) { + _startCountdownTimer(); + } + } + + @override + void dispose() { + _countdownTimer?.cancel(); + super.dispose(); + } + + void _startCountdownTimer() { + final appointmentDate = DateUtil.convertStringToDate(widget.patientAppointmentHistoryResponseModel.appointmentDate!); + final expiryDate = appointmentDate.subtract(const Duration(hours: 4)); + + setState(() { + _timeRemaining = expiryDate.difference(DateTime.now()); + }); + + _countdownTimer?.cancel(); + _countdownTimer = Timer.periodic(const Duration(seconds: 1), (timer) { + final newTimeRemaining = expiryDate.difference(DateTime.now()); + + if (newTimeRemaining.isNegative) { + timer.cancel(); + setState(() { + _timeRemaining = Duration.zero; + }); + _modalSetState?.call(() { + _timeRemaining = Duration.zero; + }); + } else { + setState(() { + _timeRemaining = newTimeRemaining; + }); + _modalSetState?.call(() { + _timeRemaining = newTimeRemaining; + }); + } + }); + } + + // Helper method to build each time unit (number + label) + Widget _buildTimeUnit(String value, String label) { + return Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Container( + alignment: Alignment.center, + child: value.toText32( + isBold: true, + color: AppColors.blackColor, + isEnglishOnly: true, + ), + ), + SizedBox(height: 4.h), + Container( + alignment: Alignment.center, + child: label.toText12( + color: AppColors.greyTextColor, + ), + ), + ], + ); + } + + // Helper method to build time separator (:) + Widget _buildTimeSeparator() { + return Padding( + padding: EdgeInsets.only(bottom: 16.h, left: 6.w, right: 6.w), + child: ':'.toText32( + isBold: true, + color: AppColors.blackColor, + ), + ); + } + @override Widget build(BuildContext context) { AppState appState = getIt.get(); @@ -43,17 +137,17 @@ class MedicalFileAppointmentCard extends StatelessWidget { AppCustomChipWidget( richText: Directionality( textDirection: ui.TextDirection.ltr, - child: DateUtil.formatDateToDate(DateUtil.convertStringToDate(patientAppointmentHistoryResponseModel.appointmentDate), false) - .toText12(color: AppointmentType.isArrived(patientAppointmentHistoryResponseModel) ? AppColors.textColor : AppColors.primaryRedColor, isBold: true, isEnglishOnly: true) + child: DateUtil.formatDateToDate(DateUtil.convertStringToDate(widget.patientAppointmentHistoryResponseModel.appointmentDate), false) + .toText12(color: AppointmentType.isArrived(widget.patientAppointmentHistoryResponseModel) ? AppColors.textColor : AppColors.primaryRedColor, isBold: true, isEnglishOnly: true) .paddingSymmetrical(8.w, 0), ), - icon: AppointmentType.isArrived(patientAppointmentHistoryResponseModel) ? AppAssets.appointment_calendar_icon : AppAssets.alarm_clock_icon, - iconColor: AppointmentType.isArrived(patientAppointmentHistoryResponseModel) ? AppColors.textColor : AppColors.primaryRedColor, + icon: AppointmentType.isArrived(widget.patientAppointmentHistoryResponseModel) ? AppAssets.appointment_calendar_icon : AppAssets.alarm_clock_icon, + iconColor: AppointmentType.isArrived(widget.patientAppointmentHistoryResponseModel) ? AppColors.textColor : AppColors.primaryRedColor, iconSize: 16.w, - backgroundColor: AppointmentType.isArrived(patientAppointmentHistoryResponseModel) ? AppColors.greyColor : AppColors.secondaryLightRedColor, - textColor: AppointmentType.isArrived(patientAppointmentHistoryResponseModel) ? AppColors.textColor : AppColors.primaryRedColor, + backgroundColor: AppointmentType.isArrived(widget.patientAppointmentHistoryResponseModel) ? AppColors.greyColor : AppColors.secondaryLightRedColor, + textColor: AppointmentType.isArrived(widget.patientAppointmentHistoryResponseModel) ? AppColors.textColor : AppColors.primaryRedColor, padding: EdgeInsets.only(top: 12.h, bottom: 12.h, left: 8.w, right: 8.w), - ).toShimmer2(isShow: myAppointmentsViewModel.isMyAppointmentsLoading), + ).toShimmer2(isShow: widget.myAppointmentsViewModel.isMyAppointmentsLoading), SizedBox(height: 16.h), Container( decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 24.r, hasShadow: false), @@ -64,20 +158,20 @@ class MedicalFileAppointmentCard extends StatelessWidget { Row( children: [ Image.network( - patientAppointmentHistoryResponseModel.doctorImageURL ?? "https://hmgwebservices.com/Images/MobileImages/DUBAI/unkown_female.png", + widget.patientAppointmentHistoryResponseModel.doctorImageURL ?? "https://hmgwebservices.com/Images/MobileImages/DUBAI/unkown_female.png", width: 25.w, height: 27.h, fit: BoxFit.fill, - ).circle(100).toShimmer2(isShow: myAppointmentsViewModel.isMyAppointmentsLoading), + ).circle(100).toShimmer2(isShow: widget.myAppointmentsViewModel.isMyAppointmentsLoading), SizedBox(width: 8.w), Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - (patientAppointmentHistoryResponseModel.doctorNameObj ?? "").toText14(isBold: true, maxlines: 1, isEnglishOnly: !Utils.isArabicText(patientAppointmentHistoryResponseModel.doctorNameObj ?? "")).toShimmer2(isShow: myAppointmentsViewModel.isMyAppointmentsLoading), - (patientAppointmentHistoryResponseModel.clinicName ?? "") + (widget.patientAppointmentHistoryResponseModel.doctorNameObj ?? "").toText14(isBold: true, maxlines: 1, isEnglishOnly: !Utils.isArabicText(widget.patientAppointmentHistoryResponseModel.doctorNameObj ?? "")).toShimmer2(isShow: widget.myAppointmentsViewModel.isMyAppointmentsLoading), + (widget.patientAppointmentHistoryResponseModel.clinicName ?? "") .toText12(maxLine: 1, isBold: true, color: AppColors.greyTextColor) - .toShimmer2(isShow: myAppointmentsViewModel.isMyAppointmentsLoading), + .toShimmer2(isShow: widget.myAppointmentsViewModel.isMyAppointmentsLoading), ], ), ), @@ -86,42 +180,35 @@ class MedicalFileAppointmentCard extends StatelessWidget { SizedBox(height: 12.h), Row( children: [ - myAppointmentsViewModel.isMyAppointmentsLoading + widget.myAppointmentsViewModel.isMyAppointmentsLoading ? Container().toShimmer2(isShow: true, height: 40.h, width: 100.w, radius: 12.r) : Expanded( flex: 7, - child: AppointmentType.isArrived(patientAppointmentHistoryResponseModel) - ? getArrivedAppointmentButton(context).toShimmer2(isShow: myAppointmentsViewModel.isMyAppointmentsLoading) + child: AppointmentType.isArrived(widget.patientAppointmentHistoryResponseModel) + ? getArrivedAppointmentButton(context).toShimmer2(isShow: widget.myAppointmentsViewModel.isMyAppointmentsLoading) : CustomButton( - text: AppointmentType.getNextActionText(patientAppointmentHistoryResponseModel.nextAction), + text: AppointmentType.getNextActionText(widget.patientAppointmentHistoryResponseModel.nextAction), onPressed: () { - Navigator.of(context) - .push(CustomPageRoute( - page: AppointmentDetailsPage(patientAppointmentHistoryResponseModel: patientAppointmentHistoryResponseModel), - )) - .then((val) { - // widget.myAppointmentsViewModel.initAppointmentsViewModel(); - // widget.myAppointmentsViewModel.getPatientAppointments(true, false); - }); + handleAppointmentNextAction(widget.patientAppointmentHistoryResponseModel.nextAction, context); }, - backgroundColor: AppointmentType.getNextActionButtonColor(patientAppointmentHistoryResponseModel.nextAction).withOpacity(0.15), - borderColor: AppointmentType.getNextActionButtonColor(patientAppointmentHistoryResponseModel.nextAction).withOpacity(0.01), - textColor: AppointmentType.getNextActionTextColor(patientAppointmentHistoryResponseModel.nextAction), + backgroundColor: AppointmentType.getNextActionButtonColor(widget.patientAppointmentHistoryResponseModel.nextAction).withValues(alpha: 0.15), + borderColor: AppointmentType.getNextActionButtonColor(widget.patientAppointmentHistoryResponseModel.nextAction).withValues(alpha: 0.01), + textColor: AppointmentType.getNextActionTextColor(widget.patientAppointmentHistoryResponseModel.nextAction), fontSize: 14.f, fontWeight: FontWeight.w600, borderRadius: 12.r, padding: EdgeInsets.symmetric(horizontal: 10.w), height: 40.h, - icon: AppointmentType.getNextActionIcon(patientAppointmentHistoryResponseModel.nextAction), - iconColor: AppointmentType.getNextActionTextColor(patientAppointmentHistoryResponseModel.nextAction), + icon: AppointmentType.getNextActionIcon(widget.patientAppointmentHistoryResponseModel.nextAction), + iconColor: AppointmentType.getNextActionTextColor(widget.patientAppointmentHistoryResponseModel.nextAction), iconSize: 14.h, - ).toShimmer2(isShow: myAppointmentsViewModel.isMyAppointmentsLoading), + ).toShimmer2(isShow: widget.myAppointmentsViewModel.isMyAppointmentsLoading), ), SizedBox(width: 8.w), - ((((patientAppointmentHistoryResponseModel.isLiveCareAppointment ?? false) || - (patientAppointmentHistoryResponseModel.isExecludeDoctor ?? false) || - !Utils.isClinicAllowedForRebook(patientAppointmentHistoryResponseModel.clinicID ?? 0))) && - AppointmentType.isArrived(patientAppointmentHistoryResponseModel)) + ((((widget.patientAppointmentHistoryResponseModel.isLiveCareAppointment ?? false) || + (widget.patientAppointmentHistoryResponseModel.isExecludeDoctor ?? false) || + !Utils.isClinicAllowedForRebook(widget.patientAppointmentHistoryResponseModel.clinicID ?? 0))) && + AppointmentType.isArrived(widget.patientAppointmentHistoryResponseModel)) ? SizedBox.shrink() : Expanded( flex: 2, @@ -145,11 +232,11 @@ class MedicalFileAppointmentCard extends StatelessWidget { ), ), ), - ).toShimmer2(isShow: myAppointmentsViewModel.isMyAppointmentsLoading).onPress(() { + ).toShimmer2(isShow: widget.myAppointmentsViewModel.isMyAppointmentsLoading).onPress(() { Navigator.of(context) .push( CustomPageRoute( - page: AppointmentDetailsPage(patientAppointmentHistoryResponseModel: patientAppointmentHistoryResponseModel), + page: AppointmentDetailsPage(patientAppointmentHistoryResponseModel: widget.patientAppointmentHistoryResponseModel), ), ) .then((val) { @@ -168,22 +255,22 @@ class MedicalFileAppointmentCard extends StatelessWidget { } Widget getArrivedAppointmentButton(BuildContext context) { - if ((((patientAppointmentHistoryResponseModel.isLiveCareAppointment ?? false) || - (patientAppointmentHistoryResponseModel.isExecludeDoctor ?? false) || - !Utils.isClinicAllowedForRebook(patientAppointmentHistoryResponseModel.clinicID ?? 0))) && - AppointmentType.isArrived(patientAppointmentHistoryResponseModel)) { + if ((((widget.patientAppointmentHistoryResponseModel.isLiveCareAppointment ?? false) || + (widget.patientAppointmentHistoryResponseModel.isExecludeDoctor ?? false) || + !Utils.isClinicAllowedForRebook(widget.patientAppointmentHistoryResponseModel.clinicID ?? 0))) && + AppointmentType.isArrived(widget.patientAppointmentHistoryResponseModel)) { return CustomButton( text: LocaleKeys.viewDetails.tr(context: context), onPressed: () { Navigator.of(context) .push( CustomPageRoute( - page: AppointmentDetailsPage(patientAppointmentHistoryResponseModel: patientAppointmentHistoryResponseModel), + page: AppointmentDetailsPage(patientAppointmentHistoryResponseModel: widget.patientAppointmentHistoryResponseModel), ), ) .then((_) { - myAppointmentsViewModel.initAppointmentsViewModel(); - myAppointmentsViewModel.getPatientAppointments(true, false); + widget.myAppointmentsViewModel.initAppointmentsViewModel(); + widget.myAppointmentsViewModel.getPatientAppointments(true, false); }); }, backgroundColor: AppColors.secondaryLightRedColor, @@ -200,30 +287,10 @@ class MedicalFileAppointmentCard extends StatelessWidget { iconSize: 16.h, ); } else { - return - // DateTime.now().difference(DateUtil.convertStringToDate(patientAppointmentHistoryResponseModel.appointmentDate)).inDays <= 15 - // ? CustomButton( - // text: LocaleKeys.askDoctor.tr(context: context), - // onPressed: () { - // onAskDoctorTap(); - // }, - // backgroundColor: AppColors.secondaryLightRedColor, - // borderColor: AppColors.secondaryLightRedColor, - // textColor: AppColors.primaryRedColor, - // fontSize: 14.f, - // fontWeight: FontWeight.w600, - // borderRadius: 12.r, - // padding: EdgeInsets.symmetric(horizontal: 10.w), - // height: 40.h, - // icon: AppAssets.ask_doctor_icon, - // iconColor: AppColors.primaryRedColor, - // iconSize: 16.h, - // ) - // : - CustomButton( + return CustomButton( text: LocaleKeys.rebook.tr(context: context), onPressed: () { - onRescheduleTap(); + widget.onRescheduleTap(); }, backgroundColor: AppColors.greyColor, borderColor: AppColors.greyColor, @@ -239,4 +306,141 @@ class MedicalFileAppointmentCard extends StatelessWidget { ); } } + + Future handleAppointmentNextAction(nextAction, BuildContext context) async { + switch (nextAction) { + case 0: + // No action needed - go to details + Navigator.of(context) + .push(CustomPageRoute( + page: AppointmentDetailsPage(patientAppointmentHistoryResponseModel: widget.patientAppointmentHistoryResponseModel), + )) + .then((val) {}); + break; + case 10: + // Confirm appointment - go to details + Navigator.of(context) + .push(CustomPageRoute( + page: AppointmentDetailsPage(patientAppointmentHistoryResponseModel: widget.patientAppointmentHistoryResponseModel), + )) + .then((val) {}); + break; + case 15: + // Pending payment - show waiting modal + // Ensure timer is running before showing modal + if (_countdownTimer == null || !_countdownTimer!.isActive) { + _startCountdownTimer(); + } + + showCommonBottomSheetWithoutHeight( + context, + title: LocaleKeys.notice.tr(), + child: StatefulBuilder( + builder: (context, setModalState) { + // Store the modal setState callback + _modalSetState = setModalState; + + return Column( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + // Message text + LocaleKeys.upcomingPaymentPending.tr(context: context).toText14( + color: AppColors.textColor, + isCenter: true, + ), + SizedBox(height: 24.h), + // Countdown Timer - DD : HH : MM : SS format with labels + Row( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + // Days + _buildTimeUnit( + _timeRemaining != null ? _timeRemaining!.inDays.toString().padLeft(2, '0') : '00', + LocaleKeys.days.tr(context: context), + ), + _buildTimeSeparator(), + // Hours + _buildTimeUnit( + _timeRemaining != null ? _timeRemaining!.inHours.remainder(24).toString().padLeft(2, '0') : '00', + LocaleKeys.hours.tr(context: context), + ), + _buildTimeSeparator(), + // Minutes + _buildTimeUnit( + _timeRemaining != null ? _timeRemaining!.inMinutes.remainder(60).toString().padLeft(2, '0') : '00', + LocaleKeys.minutes.tr(context: context), + ), + _buildTimeSeparator(), + // Seconds + _buildTimeUnit( + _timeRemaining != null ? _timeRemaining!.inSeconds.remainder(60).toString().padLeft(2, '0') : '00', + LocaleKeys.seconds.tr(context: context), + ), + ], + ), + SizedBox(height: 24.h), + // Green Acknowledge button with checkmark icon + CustomButton( + text: LocaleKeys.acknowledged.tr(context: context), + onPressed: () { + _modalSetState = null; // Clear callback when closing + Navigator.of(context).pop(); + }, + backgroundColor: AppColors.successColor, + borderColor: AppColors.successColor, + textColor: Colors.white, + fontSize: 16.f, + fontWeight: FontWeight.w600, + borderRadius: 12.r, + height: 50.h, + icon: AppAssets.checkmark_icon, + iconColor: Colors.white, + ), + ], + ); + }, + ), + callBackFunc: () { + _modalSetState = null; // Clear callback when closing + }, + isFullScreen: false, + isCloseButtonVisible: true, + ); + break; + case 20: + // Pay now - navigate to payment page + widget.myAppointmentsViewModel.setIsPatientAppointmentShareLoading(true); + Navigator.of(context).push( + CustomPageRoute( + page: AppointmentPaymentPage(patientAppointmentHistoryResponseModel: widget.patientAppointmentHistoryResponseModel), + ), + ); + break; + case 50: + // Confirm livecare - go to details + Navigator.of(context) + .push(CustomPageRoute( + page: AppointmentDetailsPage(patientAppointmentHistoryResponseModel: widget.patientAppointmentHistoryResponseModel), + )) + .then((val) {}); + break; + case 90: + // Check-in - go to details + Navigator.of(context) + .push(CustomPageRoute( + page: AppointmentDetailsPage(patientAppointmentHistoryResponseModel: widget.patientAppointmentHistoryResponseModel), + )) + .then((val) {}); + break; + default: + // Default - go to details + Navigator.of(context) + .push(CustomPageRoute( + page: AppointmentDetailsPage(patientAppointmentHistoryResponseModel: widget.patientAppointmentHistoryResponseModel), + )) + .then((val) {}); + } + } } + diff --git a/lib/presentation/medical_report/medical_reports_page.dart b/lib/presentation/medical_report/medical_reports_page.dart index f1b55e02..ee287662 100644 --- a/lib/presentation/medical_report/medical_reports_page.dart +++ b/lib/presentation/medical_report/medical_reports_page.dart @@ -398,14 +398,18 @@ class _MedicalReportsPageState extends State { onConfirmTap: () async { Navigator.pop(context); LoaderBottomSheet.showLoader(); - await medicalFileViewModel.insertRequestForMedicalReport(onSuccess: (val) { + await medicalFileViewModel.insertRequestForMedicalReport(onSuccess: (val) async{ LoaderBottomSheet.hideLoader(); showCommonBottomSheetWithoutHeight(context, child: Utils.getSuccessWidget(loadingText: LocaleKeys.yourMedicalReportRequestSubmittedSuccessfully.tr(context: context)), - callBackFunc: () { + callBackFunc: () async{ medicalFileViewModel.setIsPatientMedicalReportsLoading(true); medicalFileViewModel.onMedicalReportTabChange(0); medicalFileViewModel.getPatientMedicalReportList(); + + }); + await Future.delayed(Duration(milliseconds: 2000)).then((value) { + if (mounted) Navigator.pop(context); }); }, onError: (err) { LoaderBottomSheet.hideLoader(); diff --git a/lib/presentation/my_family/widget/family_cards.dart b/lib/presentation/my_family/widget/family_cards.dart index c8553207..84406aad 100644 --- a/lib/presentation/my_family/widget/family_cards.dart +++ b/lib/presentation/my_family/widget/family_cards.dart @@ -1,5 +1,6 @@ import 'dart:async'; import 'dart:convert'; +import 'dart:io'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; @@ -9,11 +10,13 @@ import 'package:hmg_patient_app_new/core/app_state.dart'; import 'package:hmg_patient_app_new/core/dependencies.dart'; import 'package:hmg_patient_app_new/core/enums.dart'; import 'package:hmg_patient_app_new/core/utils/utils.dart'; +import 'package:hmg_patient_app_new/core/utils/image_compression_helper.dart'; import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; import 'package:hmg_patient_app_new/features/habib_wallet/habib_wallet_view_model.dart'; import 'package:hmg_patient_app_new/features/insurance/insurance_view_model.dart'; import 'package:hmg_patient_app_new/features/medical_file/models/family_file_response_model.dart'; +import 'package:hmg_patient_app_new/features/profile_settings/profile_settings_view_model.dart'; import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; import 'package:hmg_patient_app_new/presentation/insurance/widgets/insurance_update_details_card.dart'; import 'package:hmg_patient_app_new/services/dialog_service.dart'; @@ -24,6 +27,8 @@ import 'package:hmg_patient_app_new/widgets/chip/app_custom_chip_widget.dart'; import 'package:hmg_patient_app_new/widgets/chip/custom_chip_widget.dart'; import 'package:hmg_patient_app_new/widgets/common_bottom_sheet.dart'; import 'package:hmg_patient_app_new/widgets/user_avatar_widget.dart'; +import 'package:hmg_patient_app_new/widgets/image_picker.dart'; +import 'package:permission_handler/permission_handler.dart'; import 'package:provider/provider.dart'; class FamilyCards extends StatefulWidget { @@ -58,6 +63,9 @@ class FamilyCards extends StatefulWidget { class _FamilyCardsState extends State { AppState appState = getIt(); late InsuranceViewModel insuranceViewModel; + late ProfileSettingsViewModel profileSettingsViewModel; + File? _selectedImage; + bool _isUploadingImage = false; @override void initState() { @@ -67,6 +75,321 @@ class _FamilyCardsState extends State { super.initState(); } + void _pickImage() { + // Show image picker options without checking permissions first + ImageOptions.showImageOptionsNew( + context, + false, // Don't show files option, only camera and gallery + (base64String, file) async { + try { + print('=== Starting image processing ==='); + print('File path: ${file.path}'); + print('File exists: ${await file.exists()}'); + print('Original file size: ${await file.length() / 1024} KB'); + + // Compress and resize the image + print('Calling compressAndResizeImage...'); + final compressedFile = await ImageCompressionHelper.compressAndResizeImage(file); + + File finalFile; + String finalBase64; + + if (compressedFile == null) { + print('⚠️ Compression failed - using original file as fallback'); + + // Fallback: use original image if compression fails + final originalSize = await file.length(); + final maxSize = 1048576; // 1MB + + if (originalSize > maxSize) { + print('❌ Original file is too large: ${originalSize / 1024} KB'); + if (mounted) { + Utils.showToast( + LocaleKeys.imageSizeTooLarge.tr(context: context), + ); + } + return; + } + + print('✅ Using original file (${originalSize / 1024} KB)'); + finalFile = file; + var bytes = await file.readAsBytes(); + finalBase64 = base64.encode(bytes); + } else { + // Check compressed file size + final fileSize = await compressedFile.length(); + final maxSize = 1048576; // 1MB + print('✅ Compression successful: ${fileSize / 1024} KB'); + + if (fileSize > maxSize) { + print('❌ Compressed file still too large'); + if (mounted) { + Utils.showToast( + LocaleKeys.imageSizeTooLarge.tr(context: context), + ); + } + return; + } + + finalFile = compressedFile; + var bytes = await compressedFile.readAsBytes(); + finalBase64 = base64.encode(bytes); + } + + print('Converting to base64... Length: ${finalBase64.length}'); + + if (mounted) { + setState(() { + _selectedImage = finalFile; + }); + + print('📤 Starting upload...'); + // Upload the image + _uploadImage(finalBase64); + } + + print('=== Image processing complete ==='); + } catch (e, stackTrace) { + print('❌ Error in _pickImage: $e'); + print('Stack trace: $stackTrace'); + if (mounted) { + Utils.showToast( + LocaleKeys.failedToProcessImage.tr(context: context), + ); + } + } + }, + checkCameraPermission: _checkCameraPermission, + checkGalleryPermission: _checkGalleryPermission, + ); + } + + Future _checkCameraPermission() async { + try { + print('=== Checking camera permission ==='); + + // First check current status + PermissionStatus currentStatus = await Permission.camera.status; + print('Current camera permission status: $currentStatus'); + + // If already granted, return true + if (currentStatus.isGranted) { + print('✅ Camera permission already granted'); + return true; + } + + // If denied or permanently denied, show settings dialog + if (currentStatus.isDenied || currentStatus.isPermanentlyDenied) { + // Request permission first + PermissionStatus newStatus = await Permission.camera.request(); + print('Camera permission after request: $newStatus'); + + if (newStatus.isGranted) { + print('✅ Camera permission granted'); + return true; + } + + // Still denied - show settings dialog + print('⚠️ Camera permission denied - showing settings dialog'); + if (mounted) { + showCommonBottomSheetWithoutHeight( + title: LocaleKeys.notice.tr(context: context), + context, + child: Utils.getWarningWidget( + loadingText: LocaleKeys.cameraPermissionMessage.tr(context: context), + isShowActionButtons: true, + onCancelTap: () { + Navigator.pop(context); + }, + onConfirmTap: () async { + openAppSettings(); + }, + ), + callBackFunc: () {}, + isFullScreen: false, + isCloseButtonVisible: true, + ); + } + return false; + } + + // Request permission for the first time + PermissionStatus newStatus = await Permission.camera.request(); + print('Camera permission after request: $newStatus'); + + if (newStatus.isGranted) { + print('✅ Camera permission granted'); + return true; + } + + // Denied - show settings dialog + print('❌ Camera permission denied - showing settings dialog'); + if (mounted) { + showCommonBottomSheetWithoutHeight( + title: LocaleKeys.notice.tr(context: context), + context, + child: Utils.getWarningWidget( + loadingText: LocaleKeys.cameraPermissionMessage.tr(context: context), + isShowActionButtons: true, + onCancelTap: () { + Navigator.pop(context); + }, + onConfirmTap: () async { + openAppSettings(); + }, + ), + callBackFunc: () {}, + isFullScreen: false, + isCloseButtonVisible: true, + ); + } + return false; + } catch (e) { + print('❌ Error checking camera permission: $e'); + if (mounted) { + Utils.showToast( + LocaleKeys.failedToCheckPermissions.tr(context: context), + ); + } + return false; + } + } + + Future _checkGalleryPermission() async { + try { + print('=== Checking gallery permission ==='); + + // Determine which permission to check based on platform and Android version + Permission galleryPermission; + + if (Platform.isIOS) { + galleryPermission = Permission.photos; + } else { + // Android: use photos permission which handles API level differences automatically + galleryPermission = Permission.photos; + } + + // First check current status + PermissionStatus currentStatus = await galleryPermission.status; + print('Current gallery permission status: $currentStatus'); + + // If already granted, return true + if (currentStatus.isGranted || currentStatus.isLimited) { + print('✅ Gallery permission already granted'); + return true; + } + + // If denied or permanently denied, request permission first + if (currentStatus.isDenied || currentStatus.isPermanentlyDenied) { + // Request permission first + PermissionStatus newStatus = await galleryPermission.request(); + print('Gallery permission after request: $newStatus'); + + if (newStatus.isGranted || newStatus.isLimited) { + print('✅ Gallery permission granted'); + return true; + } + + // Still denied - show settings dialog + print('⚠️ Gallery permission denied - showing settings dialog'); + if (mounted) { + showCommonBottomSheetWithoutHeight( + title: LocaleKeys.notice.tr(context: context), + context, + child: Utils.getWarningWidget( + loadingText: LocaleKeys.galleryPermissionMessage.tr(context: context), + isShowActionButtons: true, + onCancelTap: () { + Navigator.pop(context); + }, + onConfirmTap: () async { + openAppSettings(); + }, + ), + callBackFunc: () {}, + isFullScreen: false, + isCloseButtonVisible: true, + ); + } + return false; + } + + // Request permission for the first time + PermissionStatus newStatus = await galleryPermission.request(); + print('Gallery permission after request: $newStatus'); + + if (newStatus.isGranted || newStatus.isLimited) { + print('✅ Gallery permission granted'); + return true; + } + + // Denied - show settings dialog + print('❌ Gallery permission denied - showing settings dialog'); + if (mounted) { + showCommonBottomSheetWithoutHeight( + title: LocaleKeys.notice.tr(context: context), + context, + child: Utils.getWarningWidget( + loadingText: LocaleKeys.galleryPermissionMessage.tr(context: context), + isShowActionButtons: true, + onCancelTap: () { + Navigator.pop(context); + }, + onConfirmTap: () async { + openAppSettings(); + }, + ), + callBackFunc: () {}, + isFullScreen: false, + isCloseButtonVisible: true, + ); + } + return false; + } catch (e) { + print('❌ Error checking gallery permission: $e'); + if (mounted) { + Utils.showToast( + LocaleKeys.failedToCheckPermissions.tr(context: context), + ); + } + return false; + } + } + + void _uploadImage(String base64String) { + final patientID = appState.getAuthenticatedUser()?.patientId; + + if (patientID != null) { + setState(() { + _isUploadingImage = true; + }); + + profileSettingsViewModel.uploadProfileImage( + patientID: patientID, + imageData: base64String, + onSuccess: (data) { + if (mounted) { + setState(() { + _selectedImage = null; // Clear selected image after successful upload + _isUploadingImage = false; + }); + Utils.showToast( + LocaleKeys.profileImageUpdatedSuccessfully.tr(context: context), + ); + } + }, + onError: (error) { + if (mounted) { + setState(() { + _isUploadingImage = false; + }); + } + Utils.showToast(error); + }, + ); + } + } + double _calculateAspectRatio(BuildContext context) { final screenWidth = MediaQuery.of(context).size.width; @@ -96,6 +419,7 @@ class _FamilyCardsState extends State { widget.profileViewList!.addAll(widget.profiles); widget.profileViewList!.removeWhere((element) => element.responseId == appState.getAuthenticatedUser()?.patientId); insuranceViewModel = Provider.of(context, listen: false); + profileSettingsViewModel = Provider.of(context, listen: false); DialogService dialogService = getIt.get(); if (widget.isRequestDesign) { return Column( @@ -192,17 +516,61 @@ class _FamilyCardsState extends State { decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 12.r), child: Padding( padding: EdgeInsets.all(16.w), - child: Column( + child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ - UserAvatarWidget( - width: 56.w, - height: 56.h, - fit: BoxFit.cover, - isCircular: true, + Stack( + children: [ + UserAvatarWidget( + width: 56.w, + height: 56.h, + fit: BoxFit.cover, + isCircular: true, + ), + // Camera/Edit button + Positioned( + right: 0, + bottom: 0, + child: GestureDetector( + onTap: () { + if (!_isUploadingImage) { + _pickImage(); + } + }, + child: Container( + width: 20.w, + height: 20.h, + decoration: BoxDecoration( + color: AppColors.primaryRedColor, + shape: BoxShape.circle, + border: Border.all( + color: AppColors.whiteColor, + width: 1.5.w, + ), + ), + child: _isUploadingImage + ? SizedBox( + width: 10.w, + height: 10.h, + child: CircularProgressIndicator( + strokeWidth: 1.5.w, + valueColor: AlwaysStoppedAnimation( + AppColors.whiteColor, + ), + ).paddingAll(4.w), + ) + : Icon( + Icons.camera_alt, + color: AppColors.whiteColor, + size: 10.w, + ), + ), + ), + ), + ], ), SizedBox(width: 8.w), Column( @@ -311,10 +679,10 @@ class _FamilyCardsState extends State { } }, backgroundColor: insuranceVM.isInsuranceExpired - ? AppColors.primaryRedColor.withOpacity(0.1) + ? AppColors.primaryRedColor.withValues(alpha: 0.1) : insuranceVM.isInsuranceActive - ? AppColors.successColor.withOpacity(0.1) - : AppColors.warningColorYellow.withOpacity(0.1), + ? AppColors.successColor.withValues(alpha: 0.1) + : AppColors.warningColorYellow.withValues(alpha: 0.1), labelPadding: EdgeInsetsDirectional.only(start: -4.w, end: insuranceVM.isInsuranceActive ? 6.w : 0.w), ).toShimmer2(isShow: insuranceVM.isInsuranceLoading); }), @@ -360,8 +728,9 @@ class _FamilyCardsState extends State { gender: profile.gender, age: profile.age, fit: BoxFit.cover, - customProfileImageData: "", // Prevent showing logged-in user's image for family members + customProfileImageData: profile.patientImageData, isCircular: true, + isFamilyMember: true, // Prevent AppState fallback ), SizedBox(height: 8.h), (profile.patientName ?? "Unknown").toText14(isBold: true, isCenter: true, maxlines: 1), diff --git a/lib/presentation/profile_settings/profile_settings.dart b/lib/presentation/profile_settings/profile_settings.dart index 377014ac..750ea8c4 100644 --- a/lib/presentation/profile_settings/profile_settings.dart +++ b/lib/presentation/profile_settings/profile_settings.dart @@ -422,7 +422,7 @@ class ProfileSettingsState extends State { } } -class FamilyCardWidget extends StatelessWidget { +class FamilyCardWidget extends StatefulWidget { final Function() onAddFamilyMemberPress; final Function(FamilyFileResponseModelLists member) onFamilySwitchPress; final FamilyFileResponseModelLists profile; @@ -434,12 +434,62 @@ class FamilyCardWidget extends StatelessWidget { required this.onFamilySwitchPress(FamilyFileResponseModelLists member), }); + @override + State createState() => _FamilyCardWidgetState(); +} + +class _FamilyCardWidgetState extends State { + @override + void initState() { + super.initState(); + // Sync ProfileSettingsViewModel with AppState when widget is created + WidgetsBinding.instance.addPostFrameCallback((_) { + if (mounted) { + _syncProfileImageFromAppState(); + } + }); + } + + @override + void didChangeDependencies() { + super.didChangeDependencies(); + // Also sync when dependencies change (e.g., after user switch) + WidgetsBinding.instance.addPostFrameCallback((_) { + if (mounted) { + _syncProfileImageFromAppState(); + } + }); + } + + void _syncProfileImageFromAppState() { + try { + final profileVm = context.read(); + final appState = getIt.get(); + + final appStateImageData = appState.getProfileImageData; + + // Sync profile image from AppState if it's different + if (appStateImageData != null && appStateImageData.isNotEmpty) { + if (profileVm.profileImageData != appStateImageData) { + print("🔄 Syncing profile image from AppState to ProfileSettingsViewModel"); + profileVm.syncProfileImageFromAppState(); + } + } else if (profileVm.profileImageData != null) { + // AppState is null but ViewModel has data - clear it + print("🧹 Clearing ProfileSettingsViewModel image data (AppState is null)"); + profileVm.clearProfileImageCache(); + } + } catch (e) { + print("⚠️ Error syncing profile image: $e"); + } + } + @override Widget build(BuildContext context) { AppState appState = getIt.get(); - final isActive = (profile.responseId == appState.getAuthenticatedUser()?.patientId); + final isActive = (widget.profile.responseId == appState.getAuthenticatedUser()?.patientId); // final isParentUser = appState.getAuthenticatedUser()?.isParentUser ?? false; - // final canSwitch = isParentUser || (!isParentUser && profile.responseId == appState.getSuperUserID); + // final canSwitch = isParentUser || (!isParentUser && widget.profile.responseId == appState.getSuperUserID); return Container( decoration: RoundedRectangleBorder().toSmoothCornerDecoration( color: AppColors.whiteColor, @@ -453,19 +503,44 @@ class FamilyCardWidget extends StatelessWidget { Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ - UserAvatarWidget( - width: 56.w, - height: 56.h, - gender: profile.gender, - age: profile.age, - fit: BoxFit.cover, - isCircular: true, + // Wrap in Consumer to rebuild when ProfileSettingsViewModel changes + Consumer( + builder: (context, profileVm, _) { + final currentUserId = appState.getAuthenticatedUser()?.patientId; + final isCurrentUser = widget.profile.responseId == currentUserId; + + if (isCurrentUser) { + // Current user - use AppState directly (like home screen profile icon) + return UserAvatarWidget( + width: 56.w, + height: 56.h, + gender: widget.profile.gender, + age: widget.profile.age, + fit: BoxFit.cover, + // Don't pass customProfileImageData - let it use AppState + isCircular: true, + // Don't pass isFamilyMember - allow AppState fallback + ); + } else { + // Family member - use their specific image data + return UserAvatarWidget( + width: 56.w, + height: 56.h, + gender: widget.profile.gender, + age: widget.profile.age, + fit: BoxFit.cover, + customProfileImageData: widget.profile.patientImageData, + isCircular: true, + isFamilyMember: true, // Prevent AppState fallback + ); + } + }, ), Column( crossAxisAlignment: CrossAxisAlignment.start, mainAxisSize: MainAxisSize.min, children: [ - "${profile.patientName}".toText18(isBold: true, textOverflow: TextOverflow.ellipsis, maxlines: 1, isEnglishOnly: true), + "${widget.profile.patientName}".toText18(isBold: true, textOverflow: TextOverflow.ellipsis, maxlines: 1, isEnglishOnly: true), Wrap( direction: Axis.horizontal, spacing: 4.w, @@ -474,7 +549,7 @@ class FamilyCardWidget extends StatelessWidget { AppCustomChipWidget( labelPadding: EdgeInsetsDirectional.only(start: -6.w, end: 6.w), icon: AppAssets.file_icon, - labelText: "${LocaleKeys.fileno.tr(context: context)}: ${profile.responseId}", + labelText: "${LocaleKeys.fileno.tr(context: context)}: ${widget.profile.responseId}", iconSize: 12.w, ), isActive ? AppCustomChipWidget( @@ -488,7 +563,7 @@ class FamilyCardWidget extends StatelessWidget { ], ).expanded, // Icon(Icons.qr_code, size: 56.h) - Image.network("https://api.qrserver.com/v1/create-qr-code/?size=250x250&data=${profile.responseId.toString()}", fit: BoxFit.contain, height: 56.h, width: 56.w) + Image.network("https://api.qrserver.com/v1/create-qr-code/?size=250x250&data=${widget.profile.responseId.toString()}", fit: BoxFit.contain, height: 56.h, width: 56.w) ], ), SizedBox(height: 4.h), @@ -499,7 +574,7 @@ class FamilyCardWidget extends StatelessWidget { runSpacing: 4.h, children: [ AppCustomChipWidget( - labelText: LocaleKeys.ageYearsOld.tr(namedArgs: {'age': profile.age.toString(), 'yearsOld': LocaleKeys.yearsOld.tr(context: context)}), + labelText: LocaleKeys.ageYearsOld.tr(namedArgs: {'age': widget.profile.age.toString(), 'yearsOld': LocaleKeys.yearsOld.tr(context: context)}), ), // isActive && appState.getAuthenticatedUser()!.bloodGroup != null // ? @@ -598,12 +673,12 @@ class FamilyCardWidget extends StatelessWidget { } Widget _buildParentUserButton(int? currentUserId) { - final canSwitch = profile.responseId != currentUserId; + final canSwitch = widget.profile.responseId != currentUserId; return CustomButton( icon: canSwitch ? AppAssets.switch_user : AppAssets.add_family, text: canSwitch ? LocaleKeys.switchAccount.tr() : LocaleKeys.addANewFamilyMember.tr(), - onPressed: canSwitch ? () => onFamilySwitchPress(profile) : onAddFamilyMemberPress, + onPressed: canSwitch ? () => widget.onFamilySwitchPress(widget.profile) : widget.onAddFamilyMemberPress, backgroundColor: canSwitch ? AppColors.secondaryLightRedColor : AppColors.primaryRedColor, borderColor: canSwitch ? AppColors.secondaryLightRedColor : AppColors.primaryRedColor, textColor: canSwitch ? AppColors.primaryRedColor : Colors.white, @@ -614,7 +689,7 @@ class FamilyCardWidget extends StatelessWidget { } Widget _buildNonParentUserButton(int? superUserId) { - final canSwitchBack = superUserId != null && superUserId == profile.responseId; + final canSwitchBack = superUserId != null && superUserId == widget.profile.responseId; return CustomButton( icon: AppAssets.switch_user, @@ -623,7 +698,7 @@ class FamilyCardWidget extends StatelessWidget { borderColor: canSwitchBack ? AppColors.primaryRedColor : Colors.grey.shade200, textColor: canSwitchBack ? AppColors.whiteColor : AppColors.greyTextColor, iconColor: canSwitchBack ? AppColors.whiteColor : AppColors.greyTextColor, - onPressed: canSwitchBack ? () => onFamilySwitchPress(profile) : () {}, + onPressed: canSwitchBack ? () => widget.onFamilySwitchPress(widget.profile) : () {}, height: isFoldable ? 50.h : 40.h, fontSize: 14.f, ).paddingOnly(top: 12.h, right: 16.w, left: 16.w, bottom: 16.h); diff --git a/lib/presentation/profile_settings/widgets/family_card_widget.dart b/lib/presentation/profile_settings/widgets/family_card_widget.dart index 768fe538..fbd1d58b 100644 --- a/lib/presentation/profile_settings/widgets/family_card_widget.dart +++ b/lib/presentation/profile_settings/widgets/family_card_widget.dart @@ -56,8 +56,9 @@ class FamilyCardWidget extends StatelessWidget { gender: profile.gender, age: profile.age, fit: BoxFit.cover, - customProfileImageData: "", - isCircular: true,// Prevent showing logged-in user's image for family members + customProfileImageData: profile.patientImageData, + isCircular: true, + isFamilyMember: true, // Prevent AppState fallback ), Column( crossAxisAlignment: CrossAxisAlignment.start, diff --git a/lib/presentation/profile_settings/widgets/profile_picture_widget.dart b/lib/presentation/profile_settings/widgets/profile_picture_widget.dart index 1b63fef3..b057591a 100644 --- a/lib/presentation/profile_settings/widgets/profile_picture_widget.dart +++ b/lib/presentation/profile_settings/widgets/profile_picture_widget.dart @@ -28,34 +28,100 @@ class ProfilePictureWidget extends StatefulWidget { class _ProfilePictureWidgetState extends State { final AppState _appState = getIt.get(); File? _selectedImage; + int? _currentPatientId; @override void initState() { super.initState(); + _currentPatientId = _appState.getAuthenticatedUser()?.patientId; + print('🎬 ProfilePictureWidget initState - patient: $_currentPatientId'); + // Use addPostFrameCallback to ensure widget is built before loading WidgetsBinding.instance.addPostFrameCallback((_) { if (!mounted) return; final profileVm = context.read(); + final patientID = _appState.getAuthenticatedUser()?.patientId; - // Only sync if AppState has data and ViewModel doesn't - if (_appState.getProfileImageData != null && - _appState.getProfileImageData!.isNotEmpty && - (profileVm.profileImageData == null || profileVm.profileImageData!.isEmpty)) { - profileVm.syncProfileImageFromAppState(); + if (patientID == null) { + print('⚠️ No authenticated user found'); + return; } - // Only load if no data exists in both AppState and ViewModel - if ((_appState.getProfileImageData == null || _appState.getProfileImageData!.isEmpty) && - (profileVm.profileImageData == null || profileVm.profileImageData!.isEmpty)) { - _loadProfileImage(); + // Check if we have data in AppState that matches current user + final appStateImageData = _appState.getProfileImageData; + + if (appStateImageData != null && appStateImageData.isNotEmpty) { + // Sync to ViewModel if it doesn't have data + if (profileVm.profileImageData == null || profileVm.profileImageData!.isEmpty) { + print('🔄 Syncing AppState data to ViewModel'); + profileVm.syncProfileImageFromAppState(); + } + } else { + // No cached data - load from API + print('📥 No cached data - loading from API for patient: $patientID'); + _loadProfileImage(forceRefresh: false); } }); } - void _loadProfileImage() { - // Check if profile image is already loaded in AppState - if (_appState.getProfileImageData != null && _appState.getProfileImageData!.isNotEmpty) { + @override + void didChangeDependencies() { + super.didChangeDependencies(); + _checkAndUpdateUserImage(); + } + + @override + void didUpdateWidget(ProfilePictureWidget oldWidget) { + super.didUpdateWidget(oldWidget); + _checkAndUpdateUserImage(); + } + + void _checkAndUpdateUserImage() { + // Check if the authenticated user has changed (family member switch) + final currentPatientId = _appState.getAuthenticatedUser()?.patientId; + + if (currentPatientId != null && currentPatientId != _currentPatientId) { + print('🔄 User switched detected: $_currentPatientId -> $currentPatientId'); + + // Update patient ID IMMEDIATELY before any other operations + final oldPatientId = _currentPatientId; + _currentPatientId = currentPatientId; + + // Clear the old profile image data + try { + final profileVm = context.read(); + + print('🧹 Clearing cache for old user: $oldPatientId'); + profileVm.clearProfileImageCache(); + + print('📥 Loading profile image for new user: $currentPatientId'); + // Load the new user's profile image immediately + profileVm.getProfileImage( + patientID: currentPatientId, + forceRefresh: true, + onSuccess: (data) { + print('✅ Profile image loaded successfully for user: $currentPatientId'); + if (mounted) { + setState(() {}); // Force rebuild to show new data + } + }, + onError: (error) { + print('❌ Error loading profile image: $error'); + if (mounted) { + setState(() {}); // Force rebuild to show default avatar + } + }, + ); + } catch (e) { + print('❌ Error in _checkAndUpdateUserImage: $e'); + } + } + } + + void _loadProfileImage({bool forceRefresh = false}) { + // Check if profile image is already loaded in AppState (skip if forcing refresh) + if (!forceRefresh && _appState.getProfileImageData != null && _appState.getProfileImageData!.isNotEmpty) { // Image already loaded, no need to call API return; } @@ -64,12 +130,16 @@ class _ProfilePictureWidgetState extends State { final patientID = _appState.getAuthenticatedUser()?.patientId; if (patientID != null) { + print('📥 Loading profile image for patient: $patientID (forceRefresh: $forceRefresh)'); profileVm.getProfileImage( patientID: patientID, + forceRefresh: forceRefresh, onSuccess: (data) { + print('✅ Profile image loaded successfully'); // Image loaded successfully }, onError: (error) { + print('❌ Error loading profile image: $error'); // Error loading image }, ); @@ -383,8 +453,10 @@ class _ProfilePictureWidgetState extends State { } Widget _buildProfileImage(ProfileSettingsViewModel profileVm) { - final gender = _appState.getAuthenticatedUser()?.gender ?? 1; - final age = _appState.getAuthenticatedUser()?.age ?? 0; + // Always get fresh user data + final currentUser = _appState.getAuthenticatedUser(); + final gender = currentUser?.gender ?? 1; + final age = currentUser?.age ?? 0; // Determine the default image based on gender and age final String defaultImage; @@ -396,7 +468,7 @@ class _ProfilePictureWidgetState extends State { defaultImage = age < 7 ? AppAssets.babyGirlImg : AppAssets.femaleImg; } - // Show selected image if available + // Show selected image if available (only during upload) if (_selectedImage != null) { return ClipOval( child: Image.file( @@ -408,9 +480,12 @@ class _ProfilePictureWidgetState extends State { ); } - // Check both ViewModel and AppState for profile image + // Use ViewModel data if available, otherwise fall back to AppState + // This ensures we show the current logged-in user's image (same as homepage profile icon) final String? imageData = profileVm.profileImageData ?? _appState.getProfileImageData; + print('🖼️ Building profile image - has data: ${imageData != null && imageData.isNotEmpty}, patient: ${currentUser?.patientId}'); + // Show uploaded image if available if (imageData != null && imageData.isNotEmpty) { try { @@ -424,7 +499,7 @@ class _ProfilePictureWidgetState extends State { ), ); } catch (e) { - print('Error decoding profile image: $e'); + print('❌ Error decoding profile image: $e'); // If decoding fails, show default image return Image.asset( defaultImage, @@ -434,7 +509,8 @@ class _ProfilePictureWidgetState extends State { } } - // Show default image + // Show default image (no image data or user has no uploaded image) + print('📷 Showing default avatar for user ${currentUser?.patientId}'); return Image.asset( defaultImage, width: 136.w, @@ -444,6 +520,13 @@ class _ProfilePictureWidgetState extends State { @override Widget build(BuildContext context) { + // Check for user change on every build (handles navigation scenarios) + WidgetsBinding.instance.addPostFrameCallback((_) { + if (mounted) { + _checkAndUpdateUserImage(); + } + }); + return Consumer( builder: (context, profileVm, _) { return Center( diff --git a/lib/presentation/radiology/radiology_orders_page.dart b/lib/presentation/radiology/radiology_orders_page.dart index 80f6aed5..e8c1cedc 100644 --- a/lib/presentation/radiology/radiology_orders_page.dart +++ b/lib/presentation/radiology/radiology_orders_page.dart @@ -21,6 +21,7 @@ import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart'; import 'package:hmg_patient_app_new/widgets/chip/app_custom_chip_widget.dart'; import 'package:hmg_patient_app_new/widgets/routes/custom_page_route.dart'; import 'package:provider/provider.dart'; +import 'package:url_launcher/url_launcher.dart'; import '../../features/radiology/radiology_view_model.dart'; import 'package:hmg_patient_app_new/core/app_assets.dart'; @@ -439,12 +440,25 @@ class _RadiologyOrdersPageState extends State { SizedBox(height: 16.h), CustomButton( text: LocaleKeys.viewReport.tr(), - onPressed: () { - model.navigationService.push( - CustomPageRoute( - page: RadiologyResultPage(patientRadiologyResponseModel: group), - ), - ); + onPressed: () async { + // Check if reportData is empty or null + if (group.reportData == null || group.reportData!.trim().isEmpty) { + // Open image directly + await model.getRadiologyImage(patientRadiologyResponseModel: group); + if (model.radiologyImageURL.isNotEmpty) { + Uri uri = Uri.parse(model.radiologyImageURL); + await launchUrl(uri, mode: LaunchMode.platformDefault, webOnlyWindowName: ""); + } else { + Utils.showToast(LocaleKeys.noDataAvailable.tr()); + } + } else { + // Navigate to details page + model.navigationService.push( + CustomPageRoute( + page: RadiologyResultPage(patientRadiologyResponseModel: group), + ), + ); + } }, backgroundColor: AppColors.infoColor.withAlpha(20), borderColor: AppColors.infoColor.withAlpha(0), diff --git a/lib/presentation/symptoms_checker/risk_factors_screen.dart b/lib/presentation/symptoms_checker/risk_factors_screen.dart index 969a884d..49aa5150 100644 --- a/lib/presentation/symptoms_checker/risk_factors_screen.dart +++ b/lib/presentation/symptoms_checker/risk_factors_screen.dart @@ -125,7 +125,7 @@ class _RiskFactorsScreenState extends State { fontSize: 13.f, fontWeight: FontWeight.w600, color: AppColors.greyInfoTextColor, - fontFamily: isArabic ? 'GESSTwo' : 'Poppins' + fontFamily: isArabic ? 'CairoArabic' : 'Poppins' ), children: [ TextSpan( diff --git a/lib/presentation/symptoms_checker/triage_screen.dart b/lib/presentation/symptoms_checker/triage_screen.dart index 76fad545..c9291275 100644 --- a/lib/presentation/symptoms_checker/triage_screen.dart +++ b/lib/presentation/symptoms_checker/triage_screen.dart @@ -468,14 +468,14 @@ class _TriagePageState extends State { text: TextSpan( text: LocaleKeys.possibleSymptom.tr(context: context), style: TextStyle( - color: AppColors.greyTextColor, fontWeight: FontWeight.w600, fontSize: 14.f, fontFamily: isArabic ? 'GESSTwo' : 'Poppins'), + color: AppColors.greyTextColor, fontWeight: FontWeight.w600, fontSize: 14.f, fontFamily: isArabic ? 'CairoArabic' : 'Poppins'), children: [ TextSpan( text: suggestedCondition, style: TextStyle( color: AppColors.textColor, fontWeight: FontWeight.w600, - fontSize: 14.f, fontFamily: isArabic ? 'GESSTwo' : 'Poppins'), + fontSize: 14.f, fontFamily: isArabic ? 'CairoArabic' : 'Poppins'), ), ], ), @@ -491,7 +491,7 @@ class _TriagePageState extends State { text: TextSpan( text: "${probability.toStringAsFixed(1)}% ", style: TextStyle( - fontFamily: 'Poppins', + fontFamily: isArabic ? 'CairoArabic' : 'Poppins', color: AppColors.primaryRedColor, fontWeight: FontWeight.w600, fontSize: 14.f, @@ -503,7 +503,7 @@ class _TriagePageState extends State { color: AppColors.textColor, fontWeight: FontWeight.w600, fontSize: 13.f, - fontFamily: isArabic ? 'GESSTwo' : 'Poppins', + fontFamily: isArabic ? 'CairoArabic' : 'Poppins', ), ), ], diff --git a/lib/presentation/vital_sign/vital_sign_details_page.dart b/lib/presentation/vital_sign/vital_sign_details_page.dart index eb137e47..63b21291 100644 --- a/lib/presentation/vital_sign/vital_sign_details_page.dart +++ b/lib/presentation/vital_sign/vital_sign_details_page.dart @@ -196,7 +196,7 @@ class _VitalSignDetailsPageState extends State { style: TextStyle( fontSize: 12.f, fontWeight: FontWeight.w600, - fontFamily: 'Poppins', + fontFamily: getIt.get().isArabic() ? 'CairoArabic' : 'Poppins', color: AppColors.greyTextColor, ), softWrap: true, @@ -335,7 +335,6 @@ class _VitalSignDetailsPageState extends State { Widget _buildHistoryGraph(List history, {List? secondaryHistory}) { final minY = _minY(history, secondaryHistory: secondaryHistory); final maxY = _maxY(history, secondaryHistory: secondaryHistory); - final scheme = VitalSignUiModel.scheme(status: _statusForLatest(null), label: args.title); final isRTL = getIt.get().isArabic(); return CustomGraph( @@ -344,44 +343,43 @@ class _VitalSignDetailsPageState extends State { makeGraphBasedOnActualValue: true, leftLabelReservedSize: 40, showGridLines: true, - showShadow: true, + showShadow: false, isRTL: isRTL, leftLabelInterval: _leftInterval(history, secondaryHistory: secondaryHistory), maxY: maxY, minY: minY, maxX: history.length.toDouble() - .75, - horizontalInterval: _leftInterval(history, secondaryHistory: secondaryHistory), + horizontalInterval: .01, leftLabelFormatter: (value) { - // Show only numeric labels at regular intervals - return _axisLabel(value.toStringAsFixed(0)); + // Format value to 2 decimal places for consistency + value = double.parse(value.toStringAsFixed(2)); + return _axisLabel(value.toStringAsFixed(2)); }, getDrawingHorizontalLine: (value) { - // Draw reference lines for high/low bounds + value = double.parse(value.toStringAsFixed(2)); + // Draw solid reference lines for high/low bounds (matching lab result style) if (args.high != null && (value - args.high!).abs() < 0.1) { return FlLine( - color: AppColors.bgGreenColor.withOpacity(0.2), + color: AppColors.bgGreenColor.withValues(alpha: 0.6), strokeWidth: 1, - dashArray: [5, 5], ); } if (args.low != null && (value - args.low!).abs() < 0.1) { return FlLine( - color: AppColors.bgGreenColor.withOpacity(0.2), + color: AppColors.bgGreenColor.withValues(alpha: 0.6), strokeWidth: 1, - dashArray: [5, 5], ); } - // Draw grid lines at intervals + // Hide other grid lines return FlLine( - color: AppColors.bgGreenColor.withOpacity(0.2), + color: Colors.transparent, strokeWidth: 1, - dashArray: [5, 5], ); }, - graphColor: AppColors.bgGreenColor, - secondaryGraphColor: AppColors.blueColor, - graphShadowColor: AppColors.lightGreenColor.withOpacity(.4), - graphGridColor: scheme.iconFg, + graphColor: AppColors.textColor.withValues(alpha: 90 / 255), + secondaryGraphColor: AppColors.textColor.withValues(alpha: 90 / 255), + graphShadowColor: AppColors.greyColor.withValues(alpha: 0.5), + graphGridColor: AppColors.textColor.withValues(alpha: 0.4), bottomLabelFormatter: (value, data) { if (data.isEmpty) return const SizedBox.shrink(); if (value == 0) return _bottomLabel(data[value.toInt()].label); @@ -497,32 +495,35 @@ class _VitalSignDetailsPageState extends State { final List ranges = []; + // Below low reference (transparent - matching lab result style) if (args.low != null) { ranges.add( HorizontalRangeAnnotation( y1: minY, y2: args.low!, - color: AppColors.highAndLow.withOpacity(0.05), + color: Colors.transparent, ), ); } + // Normal range (light green shading - matching lab result style) if (args.low != null && args.high != null) { ranges.add( HorizontalRangeAnnotation( y1: args.low!, y2: args.high!, - color: AppColors.bgGreenColor.withOpacity(0.05), + color: AppColors.bgGreenColor.withValues(alpha: 0.05), ), ); } + // Above high reference (transparent - matching lab result style) if (args.high != null) { ranges.add( HorizontalRangeAnnotation( y1: args.high!, y2: maxY, - color: AppColors.criticalLowAndHigh.withOpacity(0.05), + color: Colors.transparent, ), ); } @@ -755,7 +756,7 @@ class _VitalSignDetailsPageState extends State { value, style: TextStyle( fontWeight: FontWeight.w600, - fontFamily: 'Poppins', + fontFamily: getIt.get().isArabic() ? 'CairoArabic' : 'Poppins', fontSize: 8.f, color: AppColors.textColor, ), diff --git a/lib/widgets/input_widget.dart b/lib/widgets/input_widget.dart index a134ac79..d8a74d17 100644 --- a/lib/widgets/input_widget.dart +++ b/lib/widgets/input_widget.dart @@ -301,9 +301,11 @@ class TextInputWidget extends StatelessWidget { return Directionality( textDirection: isArabic ? TextDirection.rtl : TextDirection.ltr, child: Localizations.override( + context: context, locale: const Locale('en', 'US'), // Force English locale for TextField child: TextField( + hintLocales: const [Locale('en', 'US')], enabled: isEnable, scrollPadding: EdgeInsets.zero, @@ -344,6 +346,7 @@ class TextInputWidget extends StatelessWidget { isDense: true, hintText: hintText, hintStyle: TextStyle( + fontFamily: isArabic ? 'CairoArabic' : 'Poppins', fontSize: 14.f, height: 21 / 16, @@ -353,7 +356,7 @@ class TextInputWidget extends StatelessWidget { ), prefixIconConstraints: BoxConstraints(minWidth: 30.h), prefixIcon: prefix == null ? null : "+${prefix!}".toText14(letterSpacing: -1, color: AppColors.textColor, isBold: true), - contentPadding: EdgeInsets.zero, + contentPadding: EdgeInsets.only(right:isArabic ? 10.w :0), border: InputBorder.none, focusedBorder: InputBorder.none, enabledBorder: InputBorder.none, diff --git a/lib/widgets/user_avatar_widget.dart b/lib/widgets/user_avatar_widget.dart index 6132401c..3271adf4 100644 --- a/lib/widgets/user_avatar_widget.dart +++ b/lib/widgets/user_avatar_widget.dart @@ -14,6 +14,7 @@ class UserAvatarWidget extends StatelessWidget { final bool isCircular; final double? borderRadius; final String? customProfileImageData; // For family members or other users + final bool isFamilyMember; // New flag to prevent AppState fallback const UserAvatarWidget({ Key? key, @@ -25,6 +26,7 @@ class UserAvatarWidget extends StatelessWidget { this.isCircular = false, this.borderRadius, this.customProfileImageData, + this.isFamilyMember = false, // Default to false for backward compatibility }) : super(key: key); @override @@ -33,9 +35,17 @@ class UserAvatarWidget extends StatelessWidget { final userGender = gender ?? appState.getAuthenticatedUser()?.gender ?? 1; final userAge = age ?? appState.getAuthenticatedUser()?.age ?? 0; - // Use custom profile image data if provided, otherwise use AppState data - final profileImageData = customProfileImageData ?? appState.getProfileImageData; - + // Determine which profile image data to use: + // - For family members: ONLY use customProfileImageData (no AppState fallback) + // - For main user: Use customProfileImageData if provided, otherwise AppState + final String? profileImageData; + if (isFamilyMember) { + // Family member mode: only use their specific image data, no fallback + profileImageData = customProfileImageData; + } else { + // Main user mode: use custom data or fall back to AppState + profileImageData = customProfileImageData ?? appState.getProfileImageData; + } // Determine the default image based on gender and age final String defaultImage; From 04d14a4d8290970039d7fb5be26cbf1cbe5957f6 Mon Sep 17 00:00:00 2001 From: tahaalam Date: Mon, 13 Apr 2026 16:41:50 +0300 Subject: [PATCH 10/45] langauge regarding changes --- assets/langs/ar-SA.json | 96 ++++++++++--------- assets/langs/en-US.json | 10 +- lib/core/enums.dart | 10 +- lib/generated/codegen_loader.g.dart | 14 +-- lib/generated/locale_keys.g.dart | 6 +- .../book_appointment_page.dart | 2 +- .../widgets/bmi.dart | 61 ++++++++---- .../home/data/landing_page_data.dart | 20 ++-- .../prescription_detail_page.dart | 2 +- .../symptoms_checker/user_info_selection.dart | 6 +- 10 files changed, 132 insertions(+), 95 deletions(-) diff --git a/assets/langs/ar-SA.json b/assets/langs/ar-SA.json index 5df2dcbd..76481987 100644 --- a/assets/langs/ar-SA.json +++ b/assets/langs/ar-SA.json @@ -81,7 +81,7 @@ "upcomingNoAction": "لا يتطلب أي إجراء", "upcomingConfirm": "يرجى تأكيد الموعد لتجنب الإلغاء", "bookSuccessConfirmMore2412": "ستكون عملية الدفع عبر الإنترنت متاحة قبل 24 ساعة ��ن الموعد.", - "upcomingPaymentPending": "سيتم تفعيل الدفع عبر الإنترنت قبل 24 ساعة من موعد الموعد", + "upcomingPaymentPending": "سيتم تفعيل الدفع عبر الإنترنت قبل 24 ساعة من وقت الموعد", "upcomingPaymentNow": "ادفع عبر الإنترنت الآن لتجنب الانتظار الطويل", "timeUntilAppointment": "الوقت المتبقي حتى الموعد", "appointmentTimePassed": "انتهى وقت الموعد", @@ -100,7 +100,7 @@ "onlinePayment": "عبر الإنترنت", "onlinePaymentSubtitle": "الدفع", "cancelNocaps": "إلغاء", - "setReminder": "ضبط تذكير", + "setReminder": "تذكير", "nationalIdNumber": "رقم الهوية الوطنية", "medicalFileNumber": "رقم الملف الطبي", "loginregister": "تسجيل الدخول / التسجيل", @@ -178,7 +178,7 @@ "arrived": " تم الوصول", "payNowBookSuccess": "ادفع الآن عبر تطبيق الحبيب", "payNowBookSuccesstext1": "ادفع الآن باستخدام خدمة الدفع عبر الإنترنت من بوابات الدفع الآمنة", - "payNowBookSuccesstext2": "يمكنك أيضًا الدفع لاحقًا عبر الدفع الإلكتروني أو في المستشفى.", + "payNowBookSuccesstext2": "يمكنك أيضًا الدفع لاحقًا عبر الدفع الإلكت§روني أو في المستشفى.", "payLater": "ادفع لاحقًا", "askDocNotAllowed": "هذه الخدمة ستكون متاحة فقط لزيارة الطبيب قبل 15 يومًا", "moreVerify": "خيارات تحقق إضافية", @@ -271,6 +271,7 @@ "userViewRequester": "يريد المستخدم عرض ملفك الطبي", "userView": "يمكن للمستخدم عرض ملفك الطبي", "parking": "موقف السيارات", + "parking2": " المواقف", "alhabiServices": "خدمة HMG", "parkingTitle": "خدمة السيارة، خدمة السيارة، خدمة لحفظ معلومات الموقف، العودة إليها لاحقًا، 1- من خلال النقر على (قراءة الرمز)، حفظ بيانات الموقف. 2- من خلال النقر على زر (عرض موقف سيارتي)، يظهر لك موقع السيارة في خرائط Google. 3- قراءة موضع آخر بالضغط على زر مسح بيانات الموضع.", "parkingDescription": "خدمة المواقف هي لك لمسح موقع السيارة حتى تتمكن من العثور عليها بسهولة عند مغادرتك. انقر على زر (مسح الموقف) لحفظ موقع الموقف، ثم سيظهر زر (عرض موقفي) لإظهار الطريق إلى الموقف. إذا كنت ترغب في إعادة مسح موقف السيارة QR فقط انقر على (مسح بياناتي).", @@ -693,8 +694,8 @@ "duration": "المدة", "cm": "سم", "ft": "قدم", - "kg": "كجم", - "lb": "رطل", + "kg": "كغ", + "lb": "باوند", "birthDate": "تاريخ الميلاد", "dateOfBirth": "تاريخ الميلاد", "mass": "الكتلة", @@ -767,7 +768,7 @@ "infoTodo": "تم تصميم هذه الخدمة لتمكينك من الحصول على رابط سريع لقائمة المهام التي تحتاج القيام بها", "familyInfo": "من خلال هذه الخدمة، ستتمكن من ربط ملفات عائلتك الطبية بملفك الطبي حتى تتمكن من إدارة سجلاتهم عن طريق تسجيل الدخول إلى ملفك الطبي.", "rrtdDetails": "تقدم فريق الاستجابة السريعة خدمة طبية شاملة لجميع أنواع الحالات العاجلة والمستقرة من جميع الأعمار، بما في ذلك البالغين والمرضى الأطفال، وتغطي الخدمة فريق طبي مدرب تدريبًا عاليًا ومجهز تجهيزًا كاملاً قادرًا على تقديم أفضل رعاية طبية في منزل المريض.", - "homeHealthCareText": "تقدم هذه الخدمة مجموعة من خدمات الرعاية الصحية المنزلية، والمتابعة المستمرة والشاملة في أماكن إقامتهم لأولئك الذين لا يمكنهم الوصول إلى المرافق الصحية، مثل (تحليلات المختبر - الأشعة - التطعيمات - العلاج الطبيعي)، إلخ.", + "homeHealthCareText": "تقدم هذه الخدمة مجموعة من خدمات الرعاية الصحية المنزلية.", "onlineCheckInAgreement": "تسجيل الوصول عبر الإنترنت مخصص للحالات التي لا تهدد الحياة. اتصل بالهلال الأحمر (997) أو اذهب إلى أقرب قسم طوارئ إذا كان هناك: \n\nعلامات السكتة الدماغية أو النوبة القلبية \nhالة من النوبات أو الإغماء \nهناك إصابة تهدد الطرف أو الحياة \nصورة لإصابات خطيرة", "infoEreferral": "تتيح لك هذه الخدمة تقديم طلب إحالة من أي مقدم رعاية صحية سواء داخل أو خارج المملكة العربية السعودية إلى أي من مستشفيات HMG، عن طريق ملء بعض بيانات المريض وإرفاق التقارير الطبية، علاوة على ذلك يمكنك تتبع حالة الطلب (قيد المعالجة، مقبول أو مرفوض)", "erConsultation": "تتيح لك هذه الخدمة إجراء استشارة افتراضية عبر الإنترنت عبر مكالمة فيديو مباشرة مع الطبيب من أي مكان وفي أي وقت.", @@ -819,8 +820,8 @@ "loginNow": "تسجيل الدخول الآن", "notice": "إشعار", "oR": "أو", - "sendOTPWHATSAPP": "أرسل لي OTP عبر واتساب", - "sendOTPSMS": "أرسل لي OTP عبر الرسائل القصيرة", + "sendOTPWHATSAPP": "واتساب", + "sendOTPSMS": "االرسائل النصية", "fullName": "الاسم الكامل", "married": "متزوج", "uae": "الإمارات العربية المتحدة", @@ -836,10 +837,10 @@ "notNow": "ليس الآن", "pendingActivation": "في انتظار التنشيط", "awaitingApproval": "انتظر القبول", - "news": "أخبار", + "news": "الأخبار", "ready": "جاهز", "enterValidNationalId": "رقم الهوية أو رقم الملف غير صحيح", - "enterValidPhoneNumber": "الرجاء إدخال رقم هاتف صالح", + "enterValidPhoneNumber": "الرجاء ادخال رقم الهاتف", "cannotEnterSaudiOrUAENumber": "لا يمكنك إدخال أرقام هواتف السعودية (00966) أو الإمارات (00971) عند اختيار دولة 'أخرى'", "medicalCentersWithCount": "{count} مراكز طبية", "medicalCenters": "مراكز طبية", @@ -880,13 +881,13 @@ "onboardingBody1": "ببضع نقرات فقط يمكنك استشارة الطبيب الذي تختاره.", "onboardingHeading2": "الوصول إلى السجل الطبي بين يديك", "onboardingBody2": "تتبع تاريخك الطبي بما في ذلك الفحوصات المخبرية، الوصفات الطبية، التأمين، وغيرها.", - "hmgHospitals": "مستشفيات الحبيب", - "hmcMedicalClinic": "مراكز مجموعة الحبيب الطبية", - "applyFilter": "تطبيق الفلتر", + "hmgHospitals": "المستشفيات", + "hmcMedicalClinic": "المراكز الطبية", + "applyFilter": "تطبيق", "facilityAndLocation": "المرفق والموقع", "regionAndLocation": "المنطقة والمواقع", - "clearAllFilters": "مسح جميع الفلاتر", - "filters": "فلاتر", + "clearAllFilters": "اعادة تعيين", + "filters": "التخصيص", "searchClinic": "بحث عن عيادة", "normal": "عادي", "attention": "انتباه", @@ -908,8 +909,8 @@ "notConfirmed": "غير مؤكد", "appointmentStatus": "حالة الموعد", "doctorWillCallYou": "سيتصل بك الطبيب عندما يقترب موعدك.", - "getDirections": "الحصول على الاتجاهات", - "notifyMeBeforeAppointment": "أبلغني قبل الموعد", + "getDirections": "الاتجاهات", + "notifyMeBeforeAppointment": "تنبيه قبل الموعد", "fetchingLabResults": "جاري جلب نتائج المختبر...", "fetchingRadiologyResults": "جاري جلب نتائج الأشعة...", "fetchingAppointmentPrescriptions": "جاري جلب وصفات الموعد...", @@ -924,14 +925,14 @@ "checkingPaymentStatusPleaseWait": "جاري التحقق من حالة الدفع، يرجى الانتظار...", "paymentFailedPleaseTryAgain": "فشل الدفع! يرجى المحاولة مرة أخرى.", "appointmentCheckIn": "تسجيل حضور الموعد", - "insuranceExpiredOrInactive": "التأمين منتهي الصلاحية أو غير نشط", + "insuranceExpiredOrInactive": "التأمين غير ساري (منتهي او غير مفعل)", "totalAmountToPay": "المبلغ الإجمالي المستحق", "vat15": "ضريبة القيمة المضافة 15%", "general": "عام", "liveCare": "لايف كير", "recentVisits": "الزيارات الأخيرة", "favouriteDoctors": "الأطباء المفضلون", - "searchByClinic": "البحث حسب العيادة", + "searchByClinic": "العيادة", "tapToSelectClinic": "انقر لاختيار العيادة", "searchByDoctor": "البحث حسب الطبيب", "tapToSelect": "انقر للاختيار", @@ -1164,11 +1165,11 @@ "averageLutealPhase": "متوسط طول المرحلة الأصفرية (عادةً 14 يومًا)", "convert": "يتحول", "calculate": "احسب", - "healthCalculators": "حاسبات الصحة", - "healthConverters": "محولات الصحة", + "healthCalculators": "الحاسبات الصحية", + "healthConverters": "محول الوحدات الصحية", "generalHealth": "الصحة العامة", "relatedToBMICalories": "متعلق بمؤشر كتلة الجسم والسعرات الحرارية ودهون الجسم وما إلى ذلك للبقاء على اطلاع دائم بصحتك.", - "selectCalculator": "اختر الآلة الحاسبة", + "selectCalculator": "اختر الحاسبة", "womensHealth": "صحة المرأة", "relatedToPeriodsOvulation": "متعلق بالدورة الشهرية والإباضة والحمل ومواضيع أخرى.", "bloodSugar": "سكر الدم", @@ -1177,11 +1178,11 @@ "monitorCholesterolLevels": "راقب مستويات الكوليسترول، وقيّم مخاطر صحة القلب، واتخذ خطوات استباقية للرفاهية.", "triglyceridesFatBlood": "الدهون الثلاثية في الدم", "understandTriglyceridesImpact": "افهم تأثير الدهون الثلاثية على صحة القلب مع رؤى مخصصة وتوصيات الخبراء.", - "bmiCalculator": "حاسبة\nمؤشر كتلة الجسم", - "caloriesCalculator": "حاسبة\nالسعرات الحرارية", - "bmrCalculator": "حاسبة\nمعدل الأيض الأساسي", - "idealBodyWeight": "الوزن المثالي\nللجسم", - "bodyFatCalculator": "حاسبة\nدهون الجسم", + "bmiCalculator": "مؤشر\nكتلة الجسم", + "caloriesCalculator": "السعرات \nالحرارية", + "bmrCalculator": "معدل \nالايض", + "idealBodyWeight": "الوزن\n المثالي", + "bodyFatCalculator": "دهون\n الجسم", "carbsProteinFat": "الكربوهيدرات\nالبروتين والدهون", "ovulationPeriod": "فترة\nالإباضة", "deliveryDueDate": "تاريخ الولادة\nالمتوقع", @@ -1218,15 +1219,15 @@ "bookAppointment": "حجز\nموعد", "completeCheckup": "الفحص الشامل", "indoorNavigation": "الملاحة الداخلية", - "eReferralServices": "خدمات الإحالة الإلكترونية", + "eReferralServices": "الاحالة", "bloodDonation": "التبرع بالدم", "dailyWaterMonitor": "مراقب الماء اليومي", "fetchingYourWaterIntakeDetails": "جاري جلب تفاصيل استهلاك الماء الخاص بك.", "healthCalculatorsServices": "حاسبات\nالصحة", "healthConvertersServices": "محولات\nالصحة", "smartWatchesServices": "الساعات\nالذكية", - "exploreServices": "استكشف الخدمات", - "medicalAndCareServices": "الخدمات الطبية والرعاية", + "exploreServices": "قائمة الخدمات او الخدمات", + "medicalAndCareServices": "خدمات الرعاية الطبية", "hmgServices": "خدمات مجموعة الحبيب الطبية", "personalServices": "الخدمات الشخصية", "habibWallet": "محفظة الحبيب", @@ -1236,7 +1237,7 @@ "addMember": "إضافة عضو", "addFamilyMember": "إضافة فرد من العائلة", "pleaseFillBelowFieldToAddNewFamilyMember": "يرجى ملء الحقل أدناه لإضافة فرد جديد من العائلة إلى ملفك الشخصي", - "healthTools": "أدوات الصحة", + "healthTools": "الادوات الصحية", "supportServices": "خدمات الدعم", "virtualTour": "جولة افتراضية", "carParking": "موقف السيارات", @@ -1260,9 +1261,9 @@ "invalidWeight": "الوزن غير صالح", "timeToDrinkWater": "حان وقت شرب الماء! 💧", "stayHydratedDrinkWater": "ابق رطبًا! اشرب {amount} مل من الماء.", - "visitPharmacyOnline": "زيارة الصيدلية على الانترنت", + "visitPharmacyOnline": "زيارة الصيدلية", "howAreYouFeelingToday": "كيف حالك اليوم؟", - "checkYourSymptomsWithScale": "تحقق من أعراضك باستخدام ذا المقياس", + "checkYourSymptomsWithScale": "تحقق من حالتك الصحية", "checkYourSymptoms": "تحقق من أعراضك", "noUpcomingAppointmentPleaseBook": "ليس لديك أي مواعيد قادمة. يرجى حجز موعد", "youHaveEROnlineCheckInRequest": "لديك طلب تسجيل وصول عبر الإنترنت للطوارئ", @@ -1387,9 +1388,9 @@ "previous": "سابق", "selectedOrgans": "الهيئات المختارة", "noOrgansSelected": "لم يتم تحديد أي أعضاء بعد", - "organSelector": "محدد الأعضاء", + "organSelector": "اين تشعر بالالم", "noPredictionsAvailable": "لا توجد تنبؤات متاحة", - "areYouSureYouWantToRestartOrganSelection": "هل أنت متأكد أنك تريد إعادة تشغيل اختيار الأعضاء؟", + "areYouSureYouWantToRestartOrganSelection": "هل تريد الخروج؟", "possibleConditions": "الحالات المحتملة", "pleaseSelectAtLeastOneRiskBeforeProceeding": "يرجى اختيار عامل خطر واحد على الأقل قبل المتابعة", "aboveYouSeeCommonRiskFactors": "أعلاه ترى عوامل الخطر الأكثر شيوعًا. على الرغم من أن /diagnosis قد تعيد أسئلة حول عوامل الخطر، ", @@ -1431,7 +1432,7 @@ "symptomsChecker": "فاحص الأعراض", "helloIsYourInformationUpToDate": "مرحباً {name}، هل معلوماتك محدثة؟", "noEditAll": "لا، تعديل الكل", - "yesItIs": "نعم، إنها كذلك", + "yesItIs": "نعم", "age": "العمر", "youDontHaveAnyAncillaryOrdersYet": "ليس لديك أي طلبات مساعدة بعد.", "invoiceWithNumber": "الفاتورة: {invoiceNo}", @@ -1539,12 +1540,12 @@ "pleaseVisitRoomForVitalSigns": "يرجى زيارة الغرفة {roomNumber} لقياس العلامات الحيوية", "pleaseVisitRoomToTheDoctor": "يرجى زيارة الغرفة {roomNumber} لمقابلة الطبيب", "erOnlineCheckInRequest": "طلب تسجيل الوصول عبر الإنترنت لقسم الطوارئ", - "indoor": "داخلي", - "navigation": "الملاحة", - "health": "الصحة", + "indoor": "خريطة", + "thehospital": "المستشفى", + "health": " الصحية", "calculators": "الحاسبات", - "converters": "المحولات", - "guide": "الدليل", + "converters": "محول الوحدات", + "guide": "دليل", "liveCareServiceDesc": "احصل على استشارة طبية من طبيب متخصص عبر مكالمة فيديو", "bloodGroup": "فصيلة الدم: {bloodType}", "medicalServices": "الخدمات الطبية", @@ -1632,13 +1633,13 @@ "featureComingSoonDescription": "هذه الميزة ستتوفر قريباً. نحن نعمل جاهدين لإضافة ميزات أكثر تميزاً إلى التطبيق. انتظرونا لمتابعة التحديثات.", "generateAiAnalysisResult": "قم بإجراء تحليل لهذا المختبر AI", "ratings": "التقييمات", - "hmgPharmacyText": "صيدلية الحبيب، المتجر الصيدلاني الإلكتروني المتكامل الذي تقدمه لكم مجموعة خدمات الدكتور سليمان الحبيب الطبية.", + "hmgPharmacyText": "المتجر الالكتروني او تسوق من الصيدلية بسهوله", "insuranceRequestSubmittedSuccessfully": "تم إرسال طلب تحديث بيانات التأمين بنجاح. سيتم إعلامك بمجرد الانتهاء.", "updatingEmailAddress": "جارٍ تحديث عنوان البريد الإلكتروني، يرجى الانتظار...", "verifyInsurance": "التحقق من التأمين", "tests": "تحليل", "calendarPermissionAlert": "يرجى منح إذن الوصول إلى التقويم من إعدادات التطبيق لضبط تذكير تناول الدواء.", - "sortByNearestLocation": "فرز حسب الأقرب إلى موقعك", + "sortByNearestLocation": "حسب الأقرب الى موقعك", "giveLocationPermissionForNearestList": "يرجى منح إذن الوصول إلى الموقع من إعدادات التطبيق لعرض أقرب المواقع.", "sortByLocation": "الترتيب حسب الموقع", "timeForFirstReminder": "وقت التذكير الأول", @@ -1662,7 +1663,7 @@ "emergencyServiceHeader": "تسجيل الوصول إلى قسم الطوارئ، أسرع من أي وقت مضى. اتصل بالإسعاف / فريق الاستجابة السريعة على الفور", "emergencyServiceDescription": "هل تواجه حالة طبية طارئة؟ سيارات الإسعاف وفرق الاستجابة السريعة لدينا جاهزة على مدار الساعة. بالإضافة إلى ذلك، يمكنك تسجيل دخولك إلى قسم الطوارئ بسرعة لتلقي رعاية أسرع.", "homeHealthCareServiceHeader": "صحتك، في أبهى صورها. رعاية فائقة الجودة، تصلك إلى عتبة دارك.", - "homeHealthCareServiceDescription": "نقدم لكم رعاية صحية عالية الجودة تصلكم إلى عتبة منزلكم. ممرضات ذوات خبرة يقدمون رعاية حانية في راحة منزلكم.", + "homeHealthCareServiceDescription": "نقدم لكم رعاية صحية عالية الجودة تصلكم إلى عتبة منزلكم. ممرضات ذوات خبرةممرضات ذوات خبرة يقدمون لكم الرعاية اللازمة.", "profileOnlyText": "الملف الشخصي", "information": "معلومة", "noFavouriteDoctors": "ليس لديك أي قائمة مفضلة حتى الآن", @@ -1670,7 +1671,7 @@ "favouriteList": "قائمة المفضلة", "later": "لاحقاً", "cancelAppointmentConfirmMessage": "هل أنت متأكد من رغبتك في إلغاء هذا الموعد؟", - "acknowledged": "معترف به", + "acknowledged": "حسنا", "searchLabResults": "بحث نتائج المختبر", "callForAssistance": "اتصل للحصول على المساعدة الفورية", "oneWaySubtitle": "نقل من الموقع إلى المستشفى", @@ -1732,5 +1733,8 @@ "aiDisclaimerRad": "سيتم مشاركة بيانات نتائج الأشعة الخاصة بك بشكل آمن مع محلل الذكاء الاصطناعي لدينا لتحليلها. يساعد هذا في توفير رؤى صحية مخصصة. هل ترغب في المتابعة؟", "sendingAskDrRequest": "جارٍ إرسال الطلب...", "askDrRequestSentSuccess": "تم إرسال الطلب بنجاح، وسيتواصل معك الطبيب قريباً.", - "onlineCheckIn24HoursOnly": "لا تتوفر خدمة تسجيل الوصول عبر الإنترنت إلا خلال 4 ساعات من موعد الحجز.لا تتوفر خدمة تسجيل الوصول عبر الإنترنت إلا خلال 4 ساعات من موعد الحجز." + "onlineCheckIn24HoursOnly": "لا تتوفر خدمة تسجيل الوصول عبر الإنترنت إلا خلال 4 ساعات من موعد الحجز.لا تتوفر خدمة تسجيل الوصول عبر الإنترنت إلا خلال 4 ساعات من موعد الحجز.", + "searchFor" : "بحث عن", + "m": "متر", + "inch": "انش" } diff --git a/assets/langs/en-US.json b/assets/langs/en-US.json index ca64e0a9..163eb616 100644 --- a/assets/langs/en-US.json +++ b/assets/langs/en-US.json @@ -268,6 +268,7 @@ "userViewRequester": "User Wants to View Your Medical File", "userView": "User Can View Your Medical File", "parking": "Parking", + "parking2": "Parking", "alhabiServices": "HMG Service", "parkingTitle": "Car service, car service, service to save parking information, return to it later, 1- By clicking on (Read the code), save the parking data. 2- By clicking on the button (view my car park), it shows you the car’s location in Google Maps. 3- Read another position by pressing the Clear Position Data button.", "parkingDescription": "Parking service is for you to scan the car location so you can find it easy on you way out. click on (scan parking) button to save the parking location, then (show my park) button will appear to show you the way for the parking. if you want to rescan parking QR just click on (Clear My Data).", @@ -1251,7 +1252,7 @@ "stayHydratedDrinkWater": "Stay hydrated! Drink {amount}ml of water.", "visitPharmacyOnline": "Visit Pharmacy Online", "howAreYouFeelingToday": "How are you feeling today?", - "checkYourSymptomsWithScale": "Check your symptoms with this scale", + "checkYourSymptomsWithScale": "Check your symptoms or check your health", "checkYourSymptoms": "Check your symptoms", "noUpcomingAppointmentPleaseBook": "You do not have any upcoming appointment. Please book an appointment", "youHaveEROnlineCheckInRequest": "You have ER Online Check-In Request", @@ -1531,7 +1532,7 @@ "pleaseVisitRoomToTheDoctor": "Please visit Room {roomNumber} to the Doctor", "erOnlineCheckInRequest": "ER Online Check-In Request", "indoor": "Indoor", - "navigation": "Navigation", + "thehospital": "Navigation", "health": "Health", "calculators": "Calculators", "converters": "Converters", @@ -1721,5 +1722,8 @@ "aiDisclaimerRad": "Your radiology result data will be securely shared with our AI Analyzer for analysis. This helps provide personalized health insights. Do you want to proceed?", "sendingAskDrRequest": "Sending Request...", "askDrRequestSentSuccess": "Request has been sent successfully, The doctor will get back to you soon.", - "onlineCheckIn24HoursOnly": "Online Check-In is only available within 4 hours of the appointment time." + "onlineCheckIn24HoursOnly": "Online Check-In is only available within 4 hours of the appointment time.", + "searchFor": "Search For", + "m": "m", +"inch": "in" } diff --git a/lib/core/enums.dart b/lib/core/enums.dart index 8bb8330c..2d42a2ae 100644 --- a/lib/core/enums.dart +++ b/lib/core/enums.dart @@ -58,15 +58,15 @@ extension HealthCalculatorExtenshion on HealthCalculatorsTypeEnum { bool isArabic = appState.getLanguageID() == 1 ? true : false; switch (this) { case HealthCalculatorsTypeEnum.bmi: - return isArabic ? "حاسبة مؤشر كتلة الجسم" : "BMI Calculator"; + return isArabic ? "مؤشر كتلة الجسم" : "BMI Calculator"; case HealthCalculatorsTypeEnum.calories: - return isArabic ? "حاسبة السعرات الحرارية" : "Calories Calculator"; + return isArabic ? "السعرات الحرارية" : "Calories Calculator"; case HealthCalculatorsTypeEnum.bmr: - return isArabic ? "حاسبة معدل الأيض الأساسي" : "BMR Calculator"; + return isArabic ? "معدل الايض" : "BMR Calculator"; case HealthCalculatorsTypeEnum.idealBodyWeight: - return isArabic ? "الوزن المثالي للجسم" : "Ideal Body Weight Calculator"; + return isArabic ? "الوزن المثالي" : "Ideal Body Weight Calculator"; case HealthCalculatorsTypeEnum.bodyFat: - return isArabic ? "حاسبة الدهون في الجسم" : "Body Fat Calculator"; + return isArabic ? "دهون الجسم" : "Body Fat Calculator"; case HealthCalculatorsTypeEnum.crabsProteinFat: return isArabic ? "حاسبة البروتين والدهون في سرطان البحر" : "Crabs Protein & Fat Calculator"; case HealthCalculatorsTypeEnum.ovulation: diff --git a/lib/generated/codegen_loader.g.dart b/lib/generated/codegen_loader.g.dart index 7722c8d8..12abda09 100644 --- a/lib/generated/codegen_loader.g.dart +++ b/lib/generated/codegen_loader.g.dart @@ -85,7 +85,7 @@ class CodegenLoader extends AssetLoader{ "date": "التاريخ", "time": "الوقت", "pendingPayment": "معلق للدفع", - "payNow": "ادفع الآن", + "payNow": "الدفع", "viewQR": "عرض رمز الاستجابة السريعة", "instruction": "تعليمات", "livecare": "لايف كير", @@ -187,9 +187,9 @@ class CodegenLoader extends AssetLoader{ "emailSentError": "خطأ في إرسال البريد الإلكتروني", "close": "إغلاق", "closeIt": "أغلق", - "booked": "محجوز", + "booked": "تم الحجز", "confirmed": "مؤكد", - "arrived": "وصل", + "arrived": "تم الحضور", "payNowBookSuccess": "ادفع الآن عبر تطبيق الحبيب", "payNowBookSuccesstext1": "ادفع الآن باستخدام خدمة الدفع عبر الإنترنت من بوابات الدفع الآمنة", "payNowBookSuccesstext2": "يمكنك أيضًا الدفع لاحقًا عبر الدفع الإلكتروني أو في المستشفى.", @@ -885,8 +885,8 @@ class CodegenLoader extends AssetLoader{ "onboardingBody1": "ببضع نقرات فقط يمكنك استشارة الطبيب الذي تختاره.", "onboardingHeading2": "الوصول إلى السجل الطبي بين يديك", "onboardingBody2": "تتبع تاريخك الطبي بما في ذلك الفحوصات المخبرية، الوصفات الطبية، التأمين، وغيرها.", - "hmgHospitals": "مستشفيات الحبيب", - "hmcMedicalClinic": "مراكز مجموعة الحبيب الطبية", + "hmgHospitals": "المستشفيات", + "hmcMedicalClinic": "المراكز الطبية", "applyFilter": "تطبيق الفلتر", "facilityAndLocation": "المرفق والموقع", "regionAndLocation": "المنطقة والمواقع", @@ -902,7 +902,7 @@ class CodegenLoader extends AssetLoader{ "to": "إلى", "startDate": "تاريخ البدء", "endDate": "تاريخ الانتهاء", - "walkin": "زيارة بدون موعد", + "walkin": "بدون حجز", "laserClinic": "عيادة الليزر", "continueString": "يكمل", "covid_info": "تجري مستشفيات د. سليمان الحبيب فحص فيروس كورونا المستجد وتصدر شهادات السفر على مدار الساعة، طوال أيام الأسبوع، وبسرعة ودقة عالية. يمكن للراغبين في الاستفادة من هذه الخدمة زيارة أحد فروع مستشفيات د. سليمان الحبيب وإجراء فحص كورونا خلال بضع دقائق والحصول على النتائج خلال عدة ساعات خدمة فحص فيروس كورونا Covid 19 بتقنية PCR للكشف عن الفيروس وفقاً لأعلى المعايير العالمية وبأحدث أجهزة RT-PCR عالية الدقة (GeneXpert الأمريكي وغيره)، وهي طرق معتمدة من قبل هيئة الغذاء والدواء وكذلك من قبل المركز السعودي للوقاية من الأمراض المُعدية", @@ -1229,7 +1229,7 @@ class CodegenLoader extends AssetLoader{ "healthConvertersServices": "محولات\nالصحة", "smartWatchesServices": "الساعات\nالذكية", "exploreServices": "استكشف الخدمات", - "medicalAndCareServices": "الخدمات الطبية والرعاية", + "medicalAndCareServices": "خدمات الرعاية الطبية", "hmgServices": "خدمات مجموعة الحبيب الطبية", "personalServices": "الخدمات الشخصية", "habibWallet": "محفظة الحبيب", diff --git a/lib/generated/locale_keys.g.dart b/lib/generated/locale_keys.g.dart index 64577cbb..d872f0c9 100644 --- a/lib/generated/locale_keys.g.dart +++ b/lib/generated/locale_keys.g.dart @@ -272,6 +272,7 @@ abstract class LocaleKeys { static const userViewRequester = 'userViewRequester'; static const userView = 'userView'; static const parking = 'parking'; + static const parking2 = 'parking2'; static const alhabiServices = 'alhabiServices'; static const parkingTitle = 'parkingTitle'; static const parkingDescription = 'parkingDescription'; @@ -1534,7 +1535,7 @@ abstract class LocaleKeys { static const pleaseVisitRoomToTheDoctor = 'pleaseVisitRoomToTheDoctor'; static const erOnlineCheckInRequest = 'erOnlineCheckInRequest'; static const indoor = 'indoor'; - static const navigation = 'navigation'; + static const thehospital = 'thehospital'; static const health = 'health'; static const calculators = 'calculators'; static const converters = 'converters'; @@ -1723,5 +1724,8 @@ abstract class LocaleKeys { static const sendingAskDrRequest = 'sendingAskDrRequest'; static const askDrRequestSentSuccess = 'askDrRequestSentSuccess'; static const onlineCheckIn24HoursOnly = 'onlineCheckIn24HoursOnly'; + static const searchFor = 'searchFor'; + static const m = 'm'; + static const inch = 'inch'; } diff --git a/lib/presentation/book_appointment/book_appointment_page.dart b/lib/presentation/book_appointment/book_appointment_page.dart index aff3e275..aa32782f 100644 --- a/lib/presentation/book_appointment/book_appointment_page.dart +++ b/lib/presentation/book_appointment/book_appointment_page.dart @@ -907,7 +907,7 @@ class _BookAppointmentPageState extends State { ), SizedBox(height: 36.h), CustomButton( - text: "Login to use this service", + text: LocaleKeys.loginToUseService.tr(), onPressed: () async { await authVM.onLoginPressed(); }, diff --git a/lib/presentation/health_calculators_and_converts/widgets/bmi.dart b/lib/presentation/health_calculators_and_converts/widgets/bmi.dart index 9e9d1bed..b982df0b 100644 --- a/lib/presentation/health_calculators_and_converts/widgets/bmi.dart +++ b/lib/presentation/health_calculators_and_converts/widgets/bmi.dart @@ -25,11 +25,29 @@ class BMIWidget extends StatefulWidget { class _BMIWidgetState extends State { final TextEditingController _heightController = TextEditingController(); final TextEditingController _weightController = TextEditingController(); - final List _heightUnits = ['cm', 'm', 'ft', 'in']; - final List _weightUnits = ['kg', 'lb']; + // Map keys are the localization keys (when available) or plain strings. + // Map values are the actual unit values used for calculations. + final Map _heightUnitsMap = { + LocaleKeys.cm: 'cm', + LocaleKeys.m: 'm', // no LocaleKeys entry found for meter, fallback to key 'm' + LocaleKeys.ft: 'ft', + LocaleKeys.inch: 'in', // no LocaleKeys entry for inches, fallback + }; + + final Map _weightUnitsMap = { + LocaleKeys.kg: 'kg', + LocaleKeys.lb: 'lb', + }; String selectedHeightUnit = 'cm'; String selectedWeightUnit = 'kg'; + // Helper to return a localized label for a given selected (value) unit. + String _getUnitLabel(Map map, String value) { + final entry = map.entries.firstWhere((e) => e.value == value, orElse: () => MapEntry(value, value)); + // tr() will return the localized string if available, otherwise it will return the key itself. + return entry.key.tr(context: context); + } + @override void initState() { super.initState(); @@ -75,7 +93,7 @@ class _BMIWidgetState extends State { crossAxisAlignment: CrossAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.start, children: [ - "Height".toText12(isBold: true, color: AppColors.inputLabelTextColor), + LocaleKeys.height.tr().toText12(isBold: true, color: AppColors.inputLabelTextColor), Container( height: 20.w, alignment: Alignment.centerLeft, @@ -110,8 +128,9 @@ class _BMIWidgetState extends State { crossAxisAlignment: CrossAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.start, children: [ - "Unit".toText12(isBold: true, color: AppColors.inputLabelTextColor), - selectedHeightUnit.toUpperCase().toText12(isBold: true, color: AppColors.textColor), + LocaleKeys.unit.tr().toText12(isBold: true, color: AppColors.inputLabelTextColor), + // Show localized label for the currently selected height unit + _getUnitLabel(_heightUnitsMap, selectedHeightUnit).toText12(isBold: true, color: AppColors.textColor), ], ), SizedBox(width: 12.w), @@ -126,9 +145,11 @@ class _BMIWidgetState extends State { decoration: BoxDecoration(color: AppColors.whiteColor, borderRadius: BorderRadius.circular(20.r)), child: ListView.separated( shrinkWrap: true, - itemCount: _heightUnits.length, + itemCount: _heightUnitsMap.length, itemBuilder: (context, index) { - final unit = _heightUnits[index]; + final entry = _heightUnitsMap.entries.elementAt(index); + final key = entry.key; + final value = entry.value; return Column( crossAxisAlignment: CrossAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.start, @@ -139,7 +160,7 @@ class _BMIWidgetState extends State { spacing: 8.h, children: [ Radio( - value: unit, + value: value, groupValue: selectedHeightUnit, activeColor: AppColors.errorColor, onChanged: (String? value) { @@ -152,11 +173,12 @@ class _BMIWidgetState extends State { }, materialTapTargetSize: MaterialTapTargetSize.shrinkWrap, ), - unit.toUpperCase().toText16(isBold: true, textOverflow: TextOverflow.ellipsis, maxlines: 1).expanded, + // show localized label (if available) otherwise show the key itself + key.tr(context: context).toText16(isBold: true, textOverflow: TextOverflow.ellipsis, maxlines: 1).expanded, ], ).onPress(() { setState(() { - selectedHeightUnit = unit; + selectedHeightUnit = value; }); Navigator.pop(context); }), @@ -187,7 +209,7 @@ class _BMIWidgetState extends State { crossAxisAlignment: CrossAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.start, children: [ - "Weight".toText12(isBold: true, color: AppColors.inputLabelTextColor), + LocaleKeys.weight.tr().toText12(isBold: true, color: AppColors.inputLabelTextColor), Container( height: 20.w, alignment: Alignment.centerLeft, @@ -227,8 +249,9 @@ class _BMIWidgetState extends State { crossAxisAlignment: CrossAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.start, children: [ - "Unit".toText12(isBold: true, color: AppColors.inputLabelTextColor), - selectedWeightUnit.toUpperCase().toText12(isBold: true, color: AppColors.textColor), + LocaleKeys.unit.tr().toText12(isBold: true, color: AppColors.inputLabelTextColor), + // Show localized label for the currently selected weight unit + _getUnitLabel(_weightUnitsMap, selectedWeightUnit).toText12(isBold: true, color: AppColors.textColor), ], ), SizedBox(width: 12.w), @@ -243,9 +266,11 @@ class _BMIWidgetState extends State { decoration: BoxDecoration(color: AppColors.whiteColor, borderRadius: BorderRadius.circular(20.r)), child: ListView.separated( shrinkWrap: true, - itemCount: _weightUnits.length, + itemCount: _weightUnitsMap.length, itemBuilder: (context, index) { - final unit = _weightUnits[index]; + final entry = _weightUnitsMap.entries.elementAt(index); + final key = entry.key; + final value = entry.value; return Column( crossAxisAlignment: CrossAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.start, @@ -256,7 +281,7 @@ class _BMIWidgetState extends State { spacing: 8.h, children: [ Radio( - value: unit, + value: value, groupValue: selectedWeightUnit, activeColor: AppColors.errorColor, onChanged: (String? value) { @@ -268,11 +293,11 @@ class _BMIWidgetState extends State { }, materialTapTargetSize: MaterialTapTargetSize.shrinkWrap, ), - unit.toUpperCase().toText16(isBold: true, textOverflow: TextOverflow.ellipsis, maxlines: 1).expanded, + key.tr(context: context).toText16(isBold: true, textOverflow: TextOverflow.ellipsis, maxlines: 1).expanded, ], ).onPress(() { setState(() { - selectedWeightUnit = unit; + selectedWeightUnit = value; _onInputChanged(); }); Navigator.pop(context); diff --git a/lib/presentation/home/data/landing_page_data.dart b/lib/presentation/home/data/landing_page_data.dart index fbf7043d..eb0bb500 100644 --- a/lib/presentation/home/data/landing_page_data.dart +++ b/lib/presentation/home/data/landing_page_data.dart @@ -12,8 +12,8 @@ class LandingPageData { ServiceCardData( serviceName: "emergency", icon: AppAssets.emergency_services_icon, - title: LocaleKeys.emergency, - subtitle: LocaleKeys.services2, + title: getIt.get().isArabic()?LocaleKeys.services3 :LocaleKeys.emergency2, + subtitle: getIt.get().isArabic()?LocaleKeys.emergency2:LocaleKeys.services3, backgroundColor: AppColors.primaryRedColor, iconColor: Colors.white, textColor: Colors.white, @@ -23,7 +23,7 @@ class LandingPageData { serviceName: "indoor_navigation", icon: AppAssets.indoor_nav_icon, title: LocaleKeys.indoor, - subtitle: LocaleKeys.navigation, + subtitle: LocaleKeys.thehospital, backgroundColor: AppColors.whiteColor, iconColor: AppColors.blackColor, textColor: AppColors.blackColor, @@ -32,7 +32,7 @@ class LandingPageData { ServiceCardData( serviceName: "search_doctor", icon: AppAssets.search_doctor_icon, - title: LocaleKeys.search, + title: LocaleKeys.searchFor, subtitle: LocaleKeys.doctor, backgroundColor: AppColors.whiteColor, iconColor: AppColors.blackColor, @@ -42,8 +42,8 @@ class LandingPageData { ServiceCardData( serviceName: "health_calculators_and_converts", icon: AppAssets.health_calculators_icon, - title: LocaleKeys.health, - subtitle: LocaleKeys.calculators, + title: getIt.get().isArabic()? LocaleKeys.calculators:LocaleKeys.health , + subtitle: getIt.get().isArabic()? LocaleKeys.health:LocaleKeys.calculators, backgroundColor: AppColors.whiteColor, iconColor: AppColors.blackColor, textColor: AppColors.blackColor, @@ -52,8 +52,8 @@ class LandingPageData { ServiceCardData( serviceName: "health_converters", icon: AppAssets.health_converters_icon, - title: LocaleKeys.health, - subtitle: LocaleKeys.converters, + title: getIt.get().isArabic()? LocaleKeys.converters:LocaleKeys.health, + subtitle: getIt.get().isArabic()? LocaleKeys.health:LocaleKeys.converters, backgroundColor: AppColors.whiteColor, iconColor: AppColors.blackColor, textColor: AppColors.blackColor, @@ -62,8 +62,8 @@ class LandingPageData { ServiceCardData( serviceName: "parking_guide", icon: AppAssets.car_parking_icon, - title: LocaleKeys.parking, - subtitle: LocaleKeys.guide, + title: getIt.get().isArabic()? LocaleKeys.guide:LocaleKeys.parking2, + subtitle: getIt.get().isArabic()? LocaleKeys.parking2:LocaleKeys.guide, backgroundColor: AppColors.whiteColor, iconColor: AppColors.blackColor, textColor: AppColors.blackColor, diff --git a/lib/presentation/prescriptions/prescription_detail_page.dart b/lib/presentation/prescriptions/prescription_detail_page.dart index 715b6e4d..f2ac16c9 100644 --- a/lib/presentation/prescriptions/prescription_detail_page.dart +++ b/lib/presentation/prescriptions/prescription_detail_page.dart @@ -113,7 +113,7 @@ class _PrescriptionDetailPageState extends State { children: [ AppCustomChipWidget( labelText: getIt.get().isArabic() - ? (widget.prescriptionsResponseModel.isInOutPatientDescriptionN ?? "مراجع للعيادات الخارجية") + ? (widget.prescriptionsResponseModel.isInOutPatientDescriptionN ?? "العيادات الخارجية") : (widget.prescriptionsResponseModel.isInOutPatientDescription ?? "OutPatient"), backgroundColor: AppColors.warningColorYellow.withOpacity(0.1), textColor: AppColors.warningColorYellow, diff --git a/lib/presentation/symptoms_checker/user_info_selection.dart b/lib/presentation/symptoms_checker/user_info_selection.dart index bd19f31b..9113487d 100644 --- a/lib/presentation/symptoms_checker/user_info_selection.dart +++ b/lib/presentation/symptoms_checker/user_info_selection.dart @@ -159,7 +159,7 @@ class _UserInfoSelectionPageState extends State { } } } else { - name = "Guest"; + name = ""; /// as per the mahmooud instruction, if user is not authenticated, we will not show any name in the greeting message } return Scaffold( @@ -176,11 +176,11 @@ class _UserInfoSelectionPageState extends State { String ageText = displayAge != null ? "$displayAge ${LocaleKeys.years.tr(context: context)}" : LocaleKeys.notSet.tr(context: context); String heightText = (viewModel.selectedHeight != null && viewModel.selectedHeight != 0) - ? "${viewModel.selectedHeight!.round()} ${viewModel.isHeightCm ? 'cm' : 'ft'}" + ? "${viewModel.selectedHeight!.round()} ${viewModel.isHeightCm ? LocaleKeys.cm.tr() : LocaleKeys.ft.tr()}" : LocaleKeys.notSet.tr(context: context); String weightText = (viewModel.selectedWeight != null && viewModel.selectedWeight != 0) - ? "${viewModel.selectedWeight!.round()} ${viewModel.isWeightKg ? 'kg' : 'lbs'}" + ? "${viewModel.selectedWeight!.round()} ${viewModel.isWeightKg ? LocaleKeys.kg.tr() : LocaleKeys.lb.tr()}" : LocaleKeys.notSet.tr(context: context); return Column( From ac6e96ad6c4233c7c5be56fbcd0b7ac85f665419 Mon Sep 17 00:00:00 2001 From: Sultan khan Date: Mon, 13 Apr 2026 16:43:00 +0300 Subject: [PATCH 11/45] no message --- assets/langs/ar-SA.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/assets/langs/ar-SA.json b/assets/langs/ar-SA.json index 5df2dcbd..01a53ed1 100644 --- a/assets/langs/ar-SA.json +++ b/assets/langs/ar-SA.json @@ -950,7 +950,7 @@ "freeMedicineDelivery": "توصيل مجاني للأدوية", "offersFreeMedicineDelivery": "يوفر توصيل مجاني للأدوية لموعد لايف كير", "dentalChiefComplaints": "الشكاوى الرئيسة للأسنان", - "viewAvailableAppointments": "عرض المواعيد المتاحة", + "viewAvailableAppointments": "المواعيد المتاحة", "doctorProfile": " ملف الطبيب", "waitingAppointment": "موعد الانتظار", "hospitalInformation": "معلومات المستشفى", @@ -1462,7 +1462,7 @@ "beforeSyncingDataFollowInstructions": "قبل مزامنة البيانات، يرجى التأكد من اتباع التعليمات بشكل صحيح.", "viewWatchInstructions": "عرض تعليمات الساعة", "healthConnectAppNotInstalled": "يبدو أنه ليس لديك تطبيق Health Connect مثبتًا. يرجى تثبيته من متجر Play لمزامنة بيانات صحتك.", - "setTimerOfReminder": "ضبط مؤقت التذكير", + "setTimerOfReminder": "ضبط التذكير", "youHaveAppointmentWithDr": "لديك موعد مع د. ", "hours": "ساعات", "minutes": "دقائق", @@ -1527,7 +1527,7 @@ "notifyMeBeforeConsumptionTime": "أبلغني قبل وقت الاستهلاك", "noMedicationsToday": "لا أدوية اليوم", "reminders": "تذكيرات", - "reminderAddedToCalendar": "تمت إضافة تذكير إلى التقويم ✅", + "reminderAddedToCalendar": "تمت إضافة تذكير إلى التقويم ", "errorWhileSettingCalendar": "حدث خطأ أثناء ضبط التقويم:{error}", "instructions": "التعليمات", "requests": "الطلبات", @@ -1664,7 +1664,7 @@ "homeHealthCareServiceHeader": "صحتك، في أبهى صورها. رعاية فائقة الجودة، تصلك إلى عتبة دارك.", "homeHealthCareServiceDescription": "نقدم لكم رعاية صحية عالية الجودة تصلكم إلى عتبة منزلكم. ممرضات ذوات خبرة يقدمون رعاية حانية في راحة منزلكم.", "profileOnlyText": "الملف الشخصي", - "information": "معلومة", + "information": "معلومه", "noFavouriteDoctors": "ليس لديك أي قائمة مفضلة حتى الآن", "addDoctors": "إضافة الأطباء", "favouriteList": "قائمة المفضلة", From 461fa11df37e34ca251494470887da3b016a25ba Mon Sep 17 00:00:00 2001 From: aamir-csol Date: Mon, 13 Apr 2026 16:48:50 +0300 Subject: [PATCH 12/45] health calculator design & timer & bell icon switch changes --- assets/images/svg/bfc.svg | 4 + assets/images/svg/bmi1.svg | 4 + assets/images/svg/bmr1.svg | 3 + assets/images/svg/cloudy_weather.svg | 9 + assets/images/svg/ddc.svg | 5 + assets/images/svg/ibwc.svg | 3 + assets/images/svg/op.svg | 8 + assets/images/svg/whitecalender.svg | 8 + assets/langs/ar-SA.json | 24 +- assets/langs/en-US.json | 24 +- lib/core/app_assets.dart | 8 + lib/core/utils/calender_utils_new.dart | 32 +- .../my_appointments/models/reminder_type.dart | 50 ++ .../my_appointments_view_model.dart | 367 +++++++++++++-- lib/generated/codegen_loader.g.dart | 16 +- lib/generated/locale_keys.g.dart | 8 + .../appointment_details_page.dart | 313 ++++++++++--- .../widgets/appointment_doctor_card.dart | 116 ++--- .../review_appointment_page.dart | 45 +- ...intment_success_reminder_bottom_sheet.dart | 441 ++++++++++++++++++ .../book_appointment/widgets/bell_switch.dart | 178 +++++++ .../health_calculators_page.dart | 285 ++++++----- .../widgets/health_card.dart | 61 ++- lib/theme/colors.dart | 20 + lib/widgets/common_bottom_sheet.dart | 7 +- 25 files changed, 1662 insertions(+), 377 deletions(-) create mode 100644 assets/images/svg/bfc.svg create mode 100644 assets/images/svg/bmi1.svg create mode 100644 assets/images/svg/bmr1.svg create mode 100644 assets/images/svg/cloudy_weather.svg create mode 100644 assets/images/svg/ddc.svg create mode 100644 assets/images/svg/ibwc.svg create mode 100644 assets/images/svg/op.svg create mode 100644 assets/images/svg/whitecalender.svg create mode 100644 lib/features/my_appointments/models/reminder_type.dart create mode 100644 lib/presentation/book_appointment/widgets/appointment_success_reminder_bottom_sheet.dart create mode 100644 lib/presentation/book_appointment/widgets/bell_switch.dart diff --git a/assets/images/svg/bfc.svg b/assets/images/svg/bfc.svg new file mode 100644 index 00000000..a6d2ef3a --- /dev/null +++ b/assets/images/svg/bfc.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/images/svg/bmi1.svg b/assets/images/svg/bmi1.svg new file mode 100644 index 00000000..c957dc8e --- /dev/null +++ b/assets/images/svg/bmi1.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/images/svg/bmr1.svg b/assets/images/svg/bmr1.svg new file mode 100644 index 00000000..7e403a81 --- /dev/null +++ b/assets/images/svg/bmr1.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/svg/cloudy_weather.svg b/assets/images/svg/cloudy_weather.svg new file mode 100644 index 00000000..bc7d54bf --- /dev/null +++ b/assets/images/svg/cloudy_weather.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/assets/images/svg/ddc.svg b/assets/images/svg/ddc.svg new file mode 100644 index 00000000..f671baf8 --- /dev/null +++ b/assets/images/svg/ddc.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/assets/images/svg/ibwc.svg b/assets/images/svg/ibwc.svg new file mode 100644 index 00000000..acfba187 --- /dev/null +++ b/assets/images/svg/ibwc.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/svg/op.svg b/assets/images/svg/op.svg new file mode 100644 index 00000000..ff400de8 --- /dev/null +++ b/assets/images/svg/op.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/assets/images/svg/whitecalender.svg b/assets/images/svg/whitecalender.svg new file mode 100644 index 00000000..ff400de8 --- /dev/null +++ b/assets/images/svg/whitecalender.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/assets/langs/ar-SA.json b/assets/langs/ar-SA.json index 5df2dcbd..3827d919 100644 --- a/assets/langs/ar-SA.json +++ b/assets/langs/ar-SA.json @@ -1177,14 +1177,22 @@ "monitorCholesterolLevels": "راقب مستويات الكوليسترول، وقيّم مخاطر صحة القلب، واتخذ خطوات استباقية للرفاهية.", "triglyceridesFatBlood": "الدهون الثلاثية في الدم", "understandTriglyceridesImpact": "افهم تأثير الدهون الثلاثية على صحة القلب مع رؤى مخصصة وتوصيات الخبراء.", - "bmiCalculator": "حاسبة\nمؤشر كتلة الجسم", - "caloriesCalculator": "حاسبة\nالسعرات الحرارية", - "bmrCalculator": "حاسبة\nمعدل الأيض الأساسي", - "idealBodyWeight": "الوزن المثالي\nللجسم", - "bodyFatCalculator": "حاسبة\nدهون الجسم", - "carbsProteinFat": "الكربوهيدرات\nالبروتين والدهون", - "ovulationPeriod": "فترة\nالإباضة", - "deliveryDueDate": "تاريخ الولادة\nالمتوقع", + "bmiCalculator": "حاسبة مؤشر كتلة الجسم", + "bmiCalculatorDesc": "احسب مؤشر كتلة جسمك لفهم نطاق وزنك الصحي.", + "caloriesCalculator": "حاسبةالسعرات الحرارية", + "caloriesCalculatorDesc": "اكتشف عدد السعرات الحرارية التي تحتاجها يومياً للحفاظ على الوزن أو فقدانه.", + "bmrCalculator": "حاسبة معدل الأيض الأساسي", + "bmrCalculatorDesc": "حدد معدل الأيض الأساسي ومتطلباتك اليومية من الطاقة.", + "idealBodyWeight": "الوزن المثالي للجسم", + "idealBodyWeightDesc": "اكتشف وزنك المثالي بناءً على الطول والعمر وبنية الجسم.", + "bodyFatCalculator": "حاسبة دهون الجسم", + "bodyFatCalculatorDesc": "قدّر نسبة دهون جسمك لتتبع أهداف اللياقة والصحة.", + "carbsProteinFat": "الكربوهيدرات البروتين والدهون", + "carbsProteinFatDesc": "وازن بين العناصر الغذائية مع النسب الصحيحة من الكربوهيدرات والبروتين والدهون.", + "ovulationPeriod": "فترة الإباضة", + "ovulationPeriodDesc": "تتبع فترة خصوبتك وخطط للحمل بدقة.", + "deliveryDueDate": "تاريخ الولادة المتوقع", + "deliveryDueDateDesc": "احسب تاريخ ولادتك المتوقع وراقب مراحل الحمل.", "low": "منخفض", "preDiabetic": "ما قبل السكري", "high": "مرتفع", diff --git a/assets/langs/en-US.json b/assets/langs/en-US.json index ca64e0a9..c2f6320c 100644 --- a/assets/langs/en-US.json +++ b/assets/langs/en-US.json @@ -1168,14 +1168,22 @@ "monitorCholesterolLevels": "Monitor cholesterol levels, assess heart health risks, and take proactive steps for well-being.", "triglyceridesFatBlood": "Triglycerides Fat Blood", "understandTriglyceridesImpact": "Understand triglycerides' impact on heart health with personalized insights and expert recommendations.", - "bmiCalculator": "BMI\nCalculator", - "caloriesCalculator": "Calories\nCalculator", - "bmrCalculator": "BMR\nCalculator", - "idealBodyWeight": "Ideal Body\nWeight", - "bodyFatCalculator": "Body Fat\nCalculator", - "carbsProteinFat": "Carbs\nProtein & Fat", - "ovulationPeriod": "Ovulation\nPeriod", - "deliveryDueDate": "Delivery\nDue Date", + "bmiCalculator": "BMI Calculator", + "bmiCalculatorDesc": "Calculate your body mass index to understand your healthy weight range.", + "caloriesCalculator": "Calories Calculator", + "caloriesCalculatorDesc": "Find out how many calories you need daily to maintain or lose weight.", + "bmrCalculator": "BMR Calculator", + "bmrCalculatorDesc": "Determine your basal metabolic rate and daily energy requirements.", + "idealBodyWeight": "Ideal Body Weight", + "idealBodyWeightDesc": "Discover your ideal weight based on height, age, and body structure.", + "bodyFatCalculator": "Body Fat Calculator", + "bodyFatCalculatorDesc": "Estimate your body fat percentage to track fitness and health goals.", + "carbsProteinFat": "Carbs Protein & Fat", + "carbsProteinFatDesc": "Balance your macros with the right carbs, protein, and fat ratios.", + "ovulationPeriod": "Ovulation Period", + "ovulationPeriodDesc": "Track your fertile window and plan for conception with accuracy.", + "deliveryDueDate": "Delivery Due Date", + "deliveryDueDateDesc": "Calculate your expected delivery date and monitor pregnancy milestones.", "low": "Low", "preDiabetic": "Pre-diabetic", "high": "High", diff --git a/lib/core/app_assets.dart b/lib/core/app_assets.dart index 743505b9..aab9e25d 100644 --- a/lib/core/app_assets.dart +++ b/lib/core/app_assets.dart @@ -363,6 +363,14 @@ class AppAssets { static const String files = '$svgBasePath/files.svg'; static const String online_checkin_icon = '$svgBasePath/online_checkin_icon.svg'; + //Health Calculators + static const String bodyfatcalc = '$svgBasePath/bfc.svg'; + static const String duedatecalc = '$svgBasePath/ddc.svg'; + static const String idealbodyweightcacl = '$svgBasePath/ibwc.svg'; + static const String ovluationperiod = '$svgBasePath/op.svg'; + static const String bmicalc = '$svgBasePath/bmi1.svg'; + static const String bmrcalc = '$svgBasePath/bmr1.svg'; + // PNGS // static const String hmgLogo = '$pngBasePath/hmg_logo.png'; static const String liveCareService = '$pngBasePath/livecare_service.png'; diff --git a/lib/core/utils/calender_utils_new.dart b/lib/core/utils/calender_utils_new.dart index 6f043e26..dfb400be 100644 --- a/lib/core/utils/calender_utils_new.dart +++ b/lib/core/utils/calender_utils_new.dart @@ -52,13 +52,7 @@ class CalenderUtilsNew { }); } - FutureOr createOrUpdateEvent( - {required String title, - required String description, - required String location, - DateTime? scheduleDateTime, - String? eventId, - int? reminderMinutes}) async { + FutureOr createOrUpdateEvent({required String title, required String description, required String location, DateTime? scheduleDateTime, String? eventId, int? reminderMinutes}) async { if (writableCalender.isEmpty) { await getCalenders(); } @@ -93,19 +87,19 @@ class CalenderUtilsNew { // return eventId.isNotEmpty; } - FutureOr createMultipleEvents( - {required int reminderMinutes, - int? frequencyNumber, - required int days, - required String orderDate, - required String itemDescriptionN, - required String route, - Function(String)? onFailure, - String? prescriptionNumber, - DateTime? scheduleDateTime, - }) async { + FutureOr createMultipleEvents({ + required int reminderMinutes, + int? frequencyNumber, + required int days, + required String orderDate, + required String itemDescriptionN, + required String route, + Function(String)? onFailure, + String? prescriptionNumber, + DateTime? scheduleDateTime, + }) async { DateTime currentDay = DateTime.now(); - DateTime actualDate = scheduleDateTime??DateTime(DateTime.now().year, DateTime.now().month, DateTime.now().day, 8, 0); + DateTime actualDate = scheduleDateTime ?? DateTime(DateTime.now().year, DateTime.now().month, DateTime.now().day, 8, 0); print("the frequency is $frequencyNumber"); frequencyNumber ??= 2; //Some time frequency number is null so by default will be 2 int interval = calculateIntervalAsPerFrequency(frequencyNumber); diff --git a/lib/features/my_appointments/models/reminder_type.dart b/lib/features/my_appointments/models/reminder_type.dart new file mode 100644 index 00000000..f13f20a0 --- /dev/null +++ b/lib/features/my_appointments/models/reminder_type.dart @@ -0,0 +1,50 @@ +/// Enum to define different types of reminders +enum ReminderType { + /// Reminder for appointment schedule + appointment, + + /// Reminder for payment due + payment, + + /// Reminder for check-in + checkIn, +} + +extension ReminderTypeExtension on ReminderType { + /// Get display name for the reminder type + String get displayName { + switch (this) { + case ReminderType.appointment: + return 'Appointment Reminder'; + case ReminderType.payment: + return 'Payment Reminder'; + case ReminderType.checkIn: + return 'Check-In Reminder'; + } + } + + /// Get description for the reminder type + String get description { + switch (this) { + case ReminderType.appointment: + return 'Appointment scheduled reminder'; + case ReminderType.payment: + return 'Payment due reminder'; + case ReminderType.checkIn: + return 'Check-in reminder'; + } + } + + /// Get event ID prefix for calendar events + String get eventIdPrefix { + switch (this) { + case ReminderType.appointment: + return 'APPT'; + case ReminderType.payment: + return 'PAY'; + case ReminderType.checkIn: + return 'CHKIN'; + } + } +} + diff --git a/lib/features/my_appointments/my_appointments_view_model.dart b/lib/features/my_appointments/my_appointments_view_model.dart index 842c4a61..942a51e6 100644 --- a/lib/features/my_appointments/my_appointments_view_model.dart +++ b/lib/features/my_appointments/my_appointments_view_model.dart @@ -8,6 +8,7 @@ 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/book_appointments/models/resp_models/get_favorite_doctors_list.dart'; import 'package:hmg_patient_app_new/features/my_appointments/models/appointemnet_filters.dart'; +import 'package:hmg_patient_app_new/features/my_appointments/models/reminder_type.dart'; import 'package:hmg_patient_app_new/features/my_appointments/models/resp_models/appointment_rated_response_model.dart'; import 'package:hmg_patient_app_new/features/my_appointments/models/resp_models/ask_doctor_request_type_response_model.dart'; import 'package:hmg_patient_app_new/features/my_appointments/models/resp_models/get_tamara_installments_details_response_model.dart'; @@ -20,6 +21,7 @@ import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; import 'package:hmg_patient_app_new/presentation/insurance/insurance_home_page.dart'; import 'package:hmg_patient_app_new/services/error_handler_service.dart'; import 'package:hmg_patient_app_new/services/navigation_service.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; import 'package:hmg_patient_app_new/widgets/common_bottom_sheet.dart'; import 'package:hmg_patient_app_new/widgets/loader/bottomsheet_loader.dart'; import 'package:hmg_patient_app_new/widgets/routes/custom_page_route.dart'; @@ -1113,9 +1115,13 @@ class MyAppointmentsViewModel extends ChangeNotifier { /// Creates a reminder for the appointment /// Shows a bottom sheet to select reminder time and creates calendar event + /// [reminderType] specifies the type of reminder (appointment, payment, or check-in) + /// For payment and check-in reminders, shows only 1, 2, 3 hours before appointment + /// Automatically removes previous reminders when creating a new one Future createReminder({ required BuildContext context, required PatientAppointmentHistoryResponseModel patientAppointmentHistoryResponseModel, + ReminderType reminderType = ReminderType.appointment, Function(bool)? onSuccess, Function(String)? onError, }) async { @@ -1123,39 +1129,329 @@ class MyAppointmentsViewModel extends ChangeNotifier { CalenderUtilsNew calender = CalenderUtilsNew.instance; DateTime endDate = DateUtil.convertStringToDate(patientAppointmentHistoryResponseModel.appointmentDate); - BottomSheetUtils().showReminderBottomSheet( - context, - endDate, - patientAppointmentHistoryResponseModel.doctorNameObj ?? "", - "${patientAppointmentHistoryResponseModel.appointmentNo}", - "", - "", - title: "Appointment with ${patientAppointmentHistoryResponseModel.doctorNameObj}", - description: "${patientAppointmentHistoryResponseModel.doctorNameObj} will be having an appointment on ${patientAppointmentHistoryResponseModel.appointmentDate}", - onSuccess: () { - setAppointmentReminder(true, patientAppointmentHistoryResponseModel); - if (onSuccess != null) { - onSuccess(true); - } - }, - isMultiAllowed: true, - onMultiDateSuccess: (int selectedIndex) async { - bool isEventAddedOrRemoved = await calender.createOrUpdateEvent( - title: "Appointment Reminder with ${patientAppointmentHistoryResponseModel.doctorNameObj} on ${DateUtil.convertStringToDate(patientAppointmentHistoryResponseModel.appointmentDate)}, Appointment #${patientAppointmentHistoryResponseModel.appointmentNo}", - description: "Appointment Reminder with ${patientAppointmentHistoryResponseModel.doctorNameObj} in ${patientAppointmentHistoryResponseModel.projectName}", - scheduleDateTime: DateUtil.convertStringToDate(patientAppointmentHistoryResponseModel.appointmentDate), - eventId: "${patientAppointmentHistoryResponseModel.appointmentNo}", - location: '', - reminderMinutes: selectedIndex, - ); - - setAppointmentReminder(isEventAddedOrRemoved, patientAppointmentHistoryResponseModel); + // Generate title and description based on reminder type + String title; + String description; + String eventIdPrefix = reminderType.eventIdPrefix; + + switch (reminderType) { + case ReminderType.appointment: + title = "Appointment with ${patientAppointmentHistoryResponseModel.doctorNameObj}"; + description = "${patientAppointmentHistoryResponseModel.doctorNameObj} will be having an appointment on ${patientAppointmentHistoryResponseModel.appointmentDate}"; + break; + case ReminderType.payment: + title = "Payment Due for Appointment #${patientAppointmentHistoryResponseModel.appointmentNo}"; + description = "Payment reminder for appointment with ${patientAppointmentHistoryResponseModel.doctorNameObj} at ${patientAppointmentHistoryResponseModel.projectName}"; + break; + case ReminderType.checkIn: + title = "Check-In Reminder for Appointment #${patientAppointmentHistoryResponseModel.appointmentNo}"; + description = "Don't forget to check in for your appointment with ${patientAppointmentHistoryResponseModel.doctorNameObj}"; + break; + } - if (onSuccess != null) { - onSuccess(isEventAddedOrRemoved); - } - }, + // For payment and check-in, remove existing reminders first + if (reminderType == ReminderType.payment || reminderType == ReminderType.checkIn) { + // Remove all existing reminder types + await _removeAllRemindersForAppointment(patientAppointmentHistoryResponseModel); + } + + // For payment and check-in reminders, use custom hour-based options + if (reminderType == ReminderType.payment || reminderType == ReminderType.checkIn) { + _showHourBasedReminderSheet( + context: context, + patientAppointmentHistoryResponseModel: patientAppointmentHistoryResponseModel, + reminderType: reminderType, + title: title, + description: description, + eventIdPrefix: eventIdPrefix, + endDate: endDate, + onSuccess: onSuccess, + onError: onError, + ); + } else { + // For appointment reminders, use the standard reminder sheet with all options + BottomSheetUtils().showReminderBottomSheet( + context, + endDate, + patientAppointmentHistoryResponseModel.doctorNameObj ?? "", + "${patientAppointmentHistoryResponseModel.appointmentNo}", + "", + "", + title: title, + description: description, + onSuccess: () { + setAppointmentReminder(true, patientAppointmentHistoryResponseModel); + if (onSuccess != null) { + onSuccess(true); + } + }, + isMultiAllowed: true, + onMultiDateSuccess: (int selectedIndex) async { + String eventTitle; + String eventDescription; + + switch (reminderType) { + case ReminderType.appointment: + eventTitle = "Appointment Reminder with ${patientAppointmentHistoryResponseModel.doctorNameObj} on ${DateUtil.convertStringToDate(patientAppointmentHistoryResponseModel.appointmentDate)}, Appointment #${patientAppointmentHistoryResponseModel.appointmentNo}"; + eventDescription = "Appointment Reminder with ${patientAppointmentHistoryResponseModel.doctorNameObj} in ${patientAppointmentHistoryResponseModel.projectName}"; + break; + case ReminderType.payment: + eventTitle = "Payment Due Reminder for Appointment #${patientAppointmentHistoryResponseModel.appointmentNo} with ${patientAppointmentHistoryResponseModel.doctorNameObj}"; + eventDescription = "Payment reminder for ${patientAppointmentHistoryResponseModel.doctorNameObj} at ${patientAppointmentHistoryResponseModel.projectName}"; + break; + case ReminderType.checkIn: + eventTitle = "Check-In Reminder for Appointment #${patientAppointmentHistoryResponseModel.appointmentNo} with ${patientAppointmentHistoryResponseModel.doctorNameObj}"; + eventDescription = "Check-in reminder for appointment with ${patientAppointmentHistoryResponseModel.doctorNameObj} at ${patientAppointmentHistoryResponseModel.projectName}"; + break; + } + + bool isEventAddedOrRemoved = await calender.createOrUpdateEvent( + title: eventTitle, + description: eventDescription, + scheduleDateTime: DateUtil.convertStringToDate(patientAppointmentHistoryResponseModel.appointmentDate), + eventId: "${eventIdPrefix}_${patientAppointmentHistoryResponseModel.appointmentNo}", + location: patientAppointmentHistoryResponseModel.projectName ?? '', + reminderMinutes: selectedIndex, + ); + + setAppointmentReminder(isEventAddedOrRemoved, patientAppointmentHistoryResponseModel); + + if (onSuccess != null) { + onSuccess(isEventAddedOrRemoved); + } + }, + ); + } + } catch (e) { + if (onError != null) { + onError(e.toString()); + } + } + } + + /// Removes all reminder types for an appointment (internal helper) + Future _removeAllRemindersForAppointment(PatientAppointmentHistoryResponseModel patientAppointmentHistoryResponseModel) async { + CalenderUtilsNew calender = CalenderUtilsNew.instance; + + // Remove all possible reminder types + for (var type in ReminderType.values) { + try { + await calender.checkAndRemove( + id: "${type.eventIdPrefix}_${patientAppointmentHistoryResponseModel.appointmentNo}", + ); + } catch (e) { + // Ignore errors if reminder doesn't exist + debugPrint("No existing ${type.displayName} to remove"); + } + } + } + + /// Shows hour-based reminder selection for payment and check-in reminders + void _showHourBasedReminderSheet({ + required BuildContext context, + required PatientAppointmentHistoryResponseModel patientAppointmentHistoryResponseModel, + required ReminderType reminderType, + required String title, + required String description, + required String eventIdPrefix, + required DateTime endDate, + Function(bool)? onSuccess, + Function(String)? onError, + }) { + showCommonBottomSheetWithoutHeight( + context, + title: "Select Reminder Time", + child: Padding( + padding: EdgeInsets.symmetric(horizontal: 16.w, vertical: 16.h), + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Center( + child: Text( + "When would you like to be reminded?", + style: TextStyle( + fontSize: 14.f, + color: AppColors.greyTextColor, + ), + textAlign: TextAlign.center, + ), + ), + SizedBox(height: 24.h), + _buildHourOption( + context: context, + hours: 1, + icon: Icons.alarm, + patientAppointmentHistoryResponseModel: patientAppointmentHistoryResponseModel, + reminderType: reminderType, + title: title, + description: description, + eventIdPrefix: eventIdPrefix, + endDate: endDate, + onSuccess: onSuccess, + onError: onError, + ), + SizedBox(height: 12.h), + _buildHourOption( + context: context, + hours: 2, + icon: Icons.alarm, + patientAppointmentHistoryResponseModel: patientAppointmentHistoryResponseModel, + reminderType: reminderType, + title: title, + description: description, + eventIdPrefix: eventIdPrefix, + endDate: endDate, + onSuccess: onSuccess, + onError: onError, + ), + SizedBox(height: 12.h), + _buildHourOption( + context: context, + hours: 3, + icon: Icons.alarm, + patientAppointmentHistoryResponseModel: patientAppointmentHistoryResponseModel, + reminderType: reminderType, + title: title, + description: description, + eventIdPrefix: eventIdPrefix, + endDate: endDate, + onSuccess: onSuccess, + onError: onError, + ), + ], + ), + ), + callBackFunc: () {}, + isFullScreen: false, + isCloseButtonVisible: true, + ); + } + + /// Builds an hour option button for payment/check-in reminders + Widget _buildHourOption({ + required BuildContext context, + required int hours, + required IconData icon, + required PatientAppointmentHistoryResponseModel patientAppointmentHistoryResponseModel, + required ReminderType reminderType, + required String title, + required String description, + required String eventIdPrefix, + required DateTime endDate, + Function(bool)? onSuccess, + Function(String)? onError, + }) { + return GestureDetector( + onTap: () async { + Navigator.of(context).pop(); // Close the selection sheet + + // Create reminder with selected hours (converted to minutes) + await _createReminderWithHours( + hours: hours, + patientAppointmentHistoryResponseModel: patientAppointmentHistoryResponseModel, + reminderType: reminderType, + title: title, + description: description, + eventIdPrefix: eventIdPrefix, + endDate: endDate, + onSuccess: onSuccess, + onError: onError, + ); + }, + child: Container( + padding: EdgeInsets.all(16.h), + decoration: BoxDecoration( + color: AppColors.whiteColor, + border: Border.all(color: AppColors.borderOnlyColor), + borderRadius: BorderRadius.circular(12.r), + ), + child: Row( + children: [ + Container( + padding: EdgeInsets.all(12.h), + decoration: BoxDecoration( + color: AppColors.primaryRedColor.withAlpha(26), + borderRadius: BorderRadius.circular(8.r), + ), + child: Icon( + icon, + color: AppColors.primaryRedColor, + size: 24.h, + ), + ), + SizedBox(width: 12.w), + Expanded( + child: Text( + "$hours ${hours == 1 ? 'Hour' : 'Hours'} Before Appointment", + style: TextStyle( + fontSize: 16.f, + fontWeight: FontWeight.w600, + color: AppColors.textColor, + ), + ), + ), + Icon( + Icons.arrow_forward_ios, + size: 16.h, + color: AppColors.greyTextColor, + ), + ], + ), + ), + ); + } + + /// Creates reminder with specific hours before appointment + Future _createReminderWithHours({ + required int hours, + required PatientAppointmentHistoryResponseModel patientAppointmentHistoryResponseModel, + required ReminderType reminderType, + required String title, + required String description, + required String eventIdPrefix, + required DateTime endDate, + Function(bool)? onSuccess, + Function(String)? onError, + }) async { + try { + CalenderUtilsNew calender = CalenderUtilsNew.instance; + + // Convert hours to minutes + int reminderMinutes = hours * 60; + + String eventTitle; + String eventDescription; + + switch (reminderType) { + case ReminderType.appointment: + eventTitle = "Appointment Reminder with ${patientAppointmentHistoryResponseModel.doctorNameObj} on ${DateUtil.convertStringToDate(patientAppointmentHistoryResponseModel.appointmentDate)}, Appointment #${patientAppointmentHistoryResponseModel.appointmentNo}"; + eventDescription = "Appointment Reminder with ${patientAppointmentHistoryResponseModel.doctorNameObj} in ${patientAppointmentHistoryResponseModel.projectName}"; + break; + case ReminderType.payment: + eventTitle = "Payment Due - $hours ${hours == 1 ? 'hour' : 'hours'} before Appointment #${patientAppointmentHistoryResponseModel.appointmentNo}"; + eventDescription = "Payment reminder for ${patientAppointmentHistoryResponseModel.doctorNameObj} at ${patientAppointmentHistoryResponseModel.projectName}"; + break; + case ReminderType.checkIn: + eventTitle = "Check-In Now - $hours ${hours == 1 ? 'hour' : 'hours'} before Appointment #${patientAppointmentHistoryResponseModel.appointmentNo}"; + eventDescription = "Check-in reminder for appointment with ${patientAppointmentHistoryResponseModel.doctorNameObj} at ${patientAppointmentHistoryResponseModel.projectName}"; + break; + } + + bool isEventAddedOrRemoved = await calender.createOrUpdateEvent( + title: eventTitle, + description: eventDescription, + scheduleDateTime: DateUtil.convertStringToDate(patientAppointmentHistoryResponseModel.appointmentDate), + eventId: "${eventIdPrefix}_${patientAppointmentHistoryResponseModel.appointmentNo}", + location: patientAppointmentHistoryResponseModel.projectName ?? '', + reminderMinutes: reminderMinutes, ); + + setAppointmentReminder(isEventAddedOrRemoved, patientAppointmentHistoryResponseModel); + + if (onSuccess != null) { + onSuccess(isEventAddedOrRemoved); + } } catch (e) { if (onError != null) { onError(e.toString()); @@ -1165,16 +1461,19 @@ class MyAppointmentsViewModel extends ChangeNotifier { /// Deletes the reminder for the appointment /// Removes the calendar event associated with the appointment + /// [reminderType] specifies the type of reminder to delete (appointment, payment, or check-in) Future deleteReminder({ required PatientAppointmentHistoryResponseModel patientAppointmentHistoryResponseModel, + ReminderType reminderType = ReminderType.appointment, Function(bool)? onSuccess, Function(String)? onError, }) async { try { CalenderUtilsNew calender = CalenderUtilsNew.instance; + String eventIdPrefix = reminderType.eventIdPrefix; bool isEventRemoved = await calender.checkAndRemove( - id: "${patientAppointmentHistoryResponseModel.appointmentNo}", + id: "${eventIdPrefix}_${patientAppointmentHistoryResponseModel.appointmentNo}", ); // Update the reminder status (inverted because we're removing) @@ -1192,10 +1491,12 @@ class MyAppointmentsViewModel extends ChangeNotifier { /// Toggle reminder for an appointment /// Creates or deletes reminder based on the current state + /// [reminderType] specifies the type of reminder (appointment, payment, or check-in) Future toggleReminder({ required BuildContext context, required bool shouldCreateReminder, required PatientAppointmentHistoryResponseModel patientAppointmentHistoryResponseModel, + required ReminderType reminderType , Function(bool)? onSuccess, Function(String)? onError, }) async { @@ -1203,12 +1504,14 @@ class MyAppointmentsViewModel extends ChangeNotifier { await createReminder( context: context, patientAppointmentHistoryResponseModel: patientAppointmentHistoryResponseModel, + reminderType: reminderType, onSuccess: onSuccess, onError: onError, ); } else { await deleteReminder( patientAppointmentHistoryResponseModel: patientAppointmentHistoryResponseModel, + reminderType: reminderType, onSuccess: onSuccess, onError: onError, ); diff --git a/lib/generated/codegen_loader.g.dart b/lib/generated/codegen_loader.g.dart index 7722c8d8..710b9d20 100644 --- a/lib/generated/codegen_loader.g.dart +++ b/lib/generated/codegen_loader.g.dart @@ -2893,14 +2893,14 @@ static const Map _en_US = { "monitorCholesterolLevels": "Monitor cholesterol levels, assess heart health risks, and take proactive steps for well-being.", "triglyceridesFatBlood": "Triglycerides Fat Blood", "understandTriglyceridesImpact": "Understand triglycerides' impact on heart health with personalized insights and expert recommendations.", - "bmiCalculator": "BMI\nCalculator", - "caloriesCalculator": "Calories\nCalculator", - "bmrCalculator": "BMR\nCalculator", - "idealBodyWeight": "Ideal Body\nWeight", - "bodyFatCalculator": "Body Fat\nCalculator", - "carbsProteinFat": "Carbs\nProtein & Fat", - "ovulationPeriod": "Ovulation\nPeriod", - "deliveryDueDate": "Delivery\nDue Date", + "bmiCalculator": "BMI Calculator", + "caloriesCalculator": "Calories Calculator", + "bmrCalculator": "BMR Calculator", + "idealBodyWeight": "Ideal Body Weight", + "bodyFatCalculator": "Body Fat Calculator", + "carbsProteinFat": "Carbs Protein & Fat", + "ovulationPeriod": "Ovulation Period", + "deliveryDueDate": "Delivery Due Date", "low": "Low", "preDiabetic": "Pre-diabetic", "high": "High", diff --git a/lib/generated/locale_keys.g.dart b/lib/generated/locale_keys.g.dart index 64577cbb..10528bb3 100644 --- a/lib/generated/locale_keys.g.dart +++ b/lib/generated/locale_keys.g.dart @@ -1176,13 +1176,21 @@ abstract class LocaleKeys { static const triglyceridesFatBlood = 'triglyceridesFatBlood'; static const understandTriglyceridesImpact = 'understandTriglyceridesImpact'; static const bmiCalculator = 'bmiCalculator'; + static const bmiCalculatorDesc = 'bmiCalculatorDesc'; static const caloriesCalculator = 'caloriesCalculator'; + static const caloriesCalculatorDesc = 'caloriesCalculatorDesc'; static const bmrCalculator = 'bmrCalculator'; + static const bmrCalculatorDesc = 'bmrCalculatorDesc'; static const idealBodyWeight = 'idealBodyWeight'; + static const idealBodyWeightDesc = 'idealBodyWeightDesc'; static const bodyFatCalculator = 'bodyFatCalculator'; + static const bodyFatCalculatorDesc = 'bodyFatCalculatorDesc'; static const carbsProteinFat = 'carbsProteinFat'; + static const carbsProteinFatDesc = 'carbsProteinFatDesc'; static const ovulationPeriod = 'ovulationPeriod'; + static const ovulationPeriodDesc = 'ovulationPeriodDesc'; static const deliveryDueDate = 'deliveryDueDate'; + static const deliveryDueDateDesc = 'deliveryDueDateDesc'; static const low = 'low'; static const preDiabetic = 'preDiabetic'; static const high = 'high'; diff --git a/lib/presentation/appointments/appointment_details_page.dart b/lib/presentation/appointments/appointment_details_page.dart index 29768c77..a0fdb2c9 100644 --- a/lib/presentation/appointments/appointment_details_page.dart +++ b/lib/presentation/appointments/appointment_details_page.dart @@ -1,5 +1,6 @@ import 'dart:async'; import 'dart:io'; +import 'dart:ui' as ui; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; @@ -7,6 +8,7 @@ import 'package:hmg_patient_app_new/core/api_consts.dart'; import 'package:hmg_patient_app_new/core/app_assets.dart'; import 'package:hmg_patient_app_new/core/app_state.dart'; import 'package:hmg_patient_app_new/core/dependencies.dart'; +import 'package:hmg_patient_app_new/core/utils/calender_utils_new.dart'; import 'package:hmg_patient_app_new/core/utils/date_util.dart'; import 'package:hmg_patient_app_new/core/utils/penguin_method_channel.dart'; import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; @@ -32,13 +34,11 @@ import 'package:hmg_patient_app_new/presentation/appointments/widgets/appointmen import 'package:hmg_patient_app_new/presentation/appointments/widgets/appointment_doctor_card.dart'; import 'package:hmg_patient_app_new/presentation/appointments/widgets/appointment_rating_widget.dart'; import 'package:hmg_patient_app_new/presentation/appointments/widgets/ask_doctor_request_type_select.dart'; -import 'package:hmg_patient_app_new/presentation/ask_doctor/ask_doctor_page.dart'; import 'package:hmg_patient_app_new/presentation/ask_doctor/doctor_response_page.dart'; import 'package:hmg_patient_app_new/presentation/book_appointment/widgets/appointment_calendar.dart'; +import 'package:hmg_patient_app_new/presentation/book_appointment/widgets/bell_switch.dart'; import 'package:hmg_patient_app_new/presentation/contact_us/feedback_page.dart'; -import 'package:hmg_patient_app_new/presentation/home/navigation_screen.dart'; import 'package:hmg_patient_app_new/presentation/prescriptions/prescription_detail_page.dart'; -import 'package:hmg_patient_app_new/services/dialog_service.dart'; import 'package:hmg_patient_app_new/theme/colors.dart'; import 'package:hmg_patient_app_new/widgets/appbar/collapsing_list_view.dart'; import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart'; @@ -95,18 +95,54 @@ class _AppointmentDetailsPageState extends State { } else { isAppointmentWithin4Hours = true; } + + // Check if reminder exists in calendar and update the flag + await _checkAndUpdateReminderStatus(); } }); // Initialize countdown timer for payment - if (widget.patientAppointmentHistoryResponseModel.nextAction == 15 || - widget.patientAppointmentHistoryResponseModel.nextAction == 20) { + if (widget.patientAppointmentHistoryResponseModel.nextAction == 15 || widget.patientAppointmentHistoryResponseModel.nextAction == 20) { _startCountdownTimer(); } super.initState(); } + /// Checks if a reminder exists in the calendar for this appointment + /// and updates the hasReminder flag accordingly + Future _checkAndUpdateReminderStatus() async { + try { + CalenderUtilsNew calender = CalenderUtilsNew.instance; + + // Check if reminder exists for this appointment + bool reminderExists = await calender.checkIfEventExist( + widget.patientAppointmentHistoryResponseModel.appointmentNo.toString() ?? "", + ); + + // Update the flag if it's different from current state + if (mounted && widget.patientAppointmentHistoryResponseModel.hasReminder != reminderExists) { + setState(() { + widget.patientAppointmentHistoryResponseModel.hasReminder = reminderExists; + }); + + // Also update in view model to keep data consistent + myAppointmentsViewModel.setAppointmentReminder(reminderExists, widget.patientAppointmentHistoryResponseModel); + } + + debugPrint("Reminder status for appointment ${widget.patientAppointmentHistoryResponseModel.appointmentNo}: $reminderExists"); + setState(() {}); + } catch (e) { + debugPrint("Error checking reminder status: $e"); + // If there's an error, default to false + if (mounted) { + setState(() { + widget.patientAppointmentHistoryResponseModel.hasReminder = false; + }); + } + } + } + void _startCountdownTimer() { final appointmentDate = DateUtil.convertStringToDate(widget.patientAppointmentHistoryResponseModel.appointmentDate); _updateTimeRemaining(); @@ -327,7 +363,58 @@ class _AppointmentDetailsPageState extends State { onRescheduleTap: () async { openDoctorScheduleCalendar(); }, + timerWidget: Column( + children: [ + SizedBox( + height: 16.w, + ), + Divider( + height: 1, + color: AppColors.dividerColor, + ), + SizedBox( + height: 16.w, + ), + Directionality( + textDirection: ui.TextDirection.ltr, + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Expanded( + child: _buildTimeUnit( + _timeRemaining != null ? _timeRemaining!.inDays.toString().padLeft(2, '0') : '00', + LocaleKeys.days.tr(context: context), + ), + ), + _buildTimeSeparator(), + Expanded( + child: _buildTimeUnit( + _timeRemaining != null ? _timeRemaining!.inHours.remainder(24).toString().padLeft(2, '0') : '00', + LocaleKeys.hours.tr(context: context), + ), + ), + _buildTimeSeparator(), + Expanded( + child: _buildTimeUnit( + _timeRemaining != null ? _timeRemaining!.inMinutes.remainder(60).toString().padLeft(2, '0') : '00', + LocaleKeys.minutes.tr(context: context), + ), + ), + _buildTimeSeparator(), + Expanded( + child: _buildTimeUnit( + _timeRemaining != null ? _timeRemaining!.inSeconds.remainder(60).toString().padLeft(2, '0') : '00', + LocaleKeys.seconds.tr(context: context), + ), + ), + ], + ), + ), + ], + ), ), + SizedBox(height: 16.h), !AppointmentType.isArrived(widget.patientAppointmentHistoryResponseModel) ? Column( @@ -514,47 +601,118 @@ class _AppointmentDetailsPageState extends State { ], ), const Spacer(), - Switch( - activeThumbColor: AppColors.successColor, - // activeTrackColor: AppColors.successColor.withValues(alpha: .15), - value: widget.patientAppointmentHistoryResponseModel.hasReminder!, + BellAnimatedSwitch( + initialValue: widget.patientAppointmentHistoryResponseModel.hasReminder ?? false, + activeColor: AppColors.successColor.withOpacity(0.2), + inactiveColor: AppColors.lightGrayBGColor, + activeCircleColor: AppColors.successColor, + inactiveCircleColor: AppColors.greyTextColor, + activeIconColor: AppColors.bgGreenColor, + inactiveIconColor: AppColors.greyTextColor, + activeIcon: Utils.buildSvgWithAssets(icon: AppAssets.bell, iconColor: AppColors.whiteColor, width: 15.w, height: 15.h), + inactiveIcon: Utils.buildSvgWithAssets(icon: AppAssets.bell, iconColor: AppColors.whiteColor, width: 15.w, height: 15.h), onChanged: (newValue) async { - await myAppointmentsViewModel.toggleReminder( - context: context, - shouldCreateReminder: newValue, - patientAppointmentHistoryResponseModel: widget.patientAppointmentHistoryResponseModel, - onSuccess: (result) { - showCommonBottomSheet( - context, - child: Utils.getSuccessWidget( - loadingText: newValue ? LocaleKeys.reminderSuccess.tr(context: context) : LocaleKeys.reminderCancelSuccess.tr(context: context), - ), - callBackFunc: (str) {}, - title: "", - isCloseButtonVisible: false, - isDismissible: true, - isFullScreen: false, - isAutoDismiss: true, - height: ResponsiveExtension.screenHeight * 0.3, - ); - }, - onError: (error) { - setState(() { - // Revert the switch if there was an error - widget.patientAppointmentHistoryResponseModel.hasReminder = !newValue; - }); - showCommonBottomSheetWithoutHeight( - context, - title: LocaleKeys.notice.tr(context: context), - child: Utils.getErrorWidget(loadingText: error), - callBackFunc: () {}, - isFullScreen: false, - isCloseButtonVisible: true, - ); - }, - ); + CalenderUtilsNew calender = CalenderUtilsNew.instance; + bool isEventAddedOrRemoved = false; + if (newValue == true) { + DateTime startDate = DateTime.now(); + DateTime endDate = DateUtil.convertStringToDate(widget.patientAppointmentHistoryResponseModel.appointmentDate); + BottomSheetUtils().showReminderBottomSheet( + context, + endDate, + widget.patientAppointmentHistoryResponseModel.doctorNameObj ?? "", + "${widget.patientAppointmentHistoryResponseModel.appointmentNo}" ?? "", + "", + "", + title: "Appointment with ${widget.patientAppointmentHistoryResponseModel.doctorNameObj}", + description: + "${widget.patientAppointmentHistoryResponseModel.doctorNameObj} will be having an appointment on ${widget.patientAppointmentHistoryResponseModel.appointmentDate}", + onSuccess: () { + setState(() { + myAppointmentsViewModel.setAppointmentReminder(newValue, widget.patientAppointmentHistoryResponseModel); + }); + }, + isMultiAllowed: true, + onMultiDateSuccess: (int selectedIndex) async { + isEventAddedOrRemoved = await calender.createOrUpdateEvent( + title: + "Appointment Reminder with ${widget.patientAppointmentHistoryResponseModel.doctorNameObj} on ${DateUtil.convertStringToDate(widget.patientAppointmentHistoryResponseModel.appointmentDate)}, Appointment #${widget.patientAppointmentHistoryResponseModel.appointmentNo}", + description: + "Appointment Reminder with ${widget.patientAppointmentHistoryResponseModel.doctorNameObj} in ${widget.patientAppointmentHistoryResponseModel.projectName}", + scheduleDateTime: DateUtil.convertStringToDate(widget.patientAppointmentHistoryResponseModel.appointmentDate), + eventId: "${widget.patientAppointmentHistoryResponseModel.appointmentNo}", + location: '', + reminderMinutes: selectedIndex); + setState(() { + myAppointmentsViewModel.setAppointmentReminder(isEventAddedOrRemoved, widget.patientAppointmentHistoryResponseModel); + }); + }, + ); + } else { + isEventAddedOrRemoved = await calender.checkAndRemove( + id: "${widget.patientAppointmentHistoryResponseModel.appointmentNo}", + ); + setState(() { + myAppointmentsViewModel.setAppointmentReminder(!isEventAddedOrRemoved, widget.patientAppointmentHistoryResponseModel); + }); + } }, - ), + ) + + // Switch( + // activeThumbColor: AppColors.successColor, + // // activeTrackColor: AppColors.successColor.withValues(alpha: .15), + // value: widget.patientAppointmentHistoryResponseModel.hasReminder!, + // onChanged: (newValue) async { + // CalenderUtilsNew calender = CalenderUtilsNew.instance; + // bool isEventAddedOrRemoved = false; + // if(newValue == true){ + // DateTime startDate = DateTime.now(); + // DateTime endDate = DateUtil.convertStringToDate(widget + // .patientAppointmentHistoryResponseModel.appointmentDate); + // BottomSheetUtils().showReminderBottomSheet( + // context, + // endDate, + // widget.patientAppointmentHistoryResponseModel.doctorNameObj??"", + // "${widget.patientAppointmentHistoryResponseModel.appointmentNo}"??"", + // "", + // "", + // title: "Appointment with ${widget.patientAppointmentHistoryResponseModel.doctorNameObj}", + // description: + // "${widget.patientAppointmentHistoryResponseModel.doctorNameObj} will be having an appointment on ${widget.patientAppointmentHistoryResponseModel.appointmentDate}", + // onSuccess: () { + // setState(() { + // myAppointmentsViewModel.setAppointmentReminder(newValue, widget.patientAppointmentHistoryResponseModel); + // }); + // }, + // isMultiAllowed: true, + // onMultiDateSuccess: (int selectedIndex) async { + // isEventAddedOrRemoved = await calender.createOrUpdateEvent( + // title: + // "Appointment Reminder with ${widget.patientAppointmentHistoryResponseModel.doctorNameObj} on ${DateUtil.convertStringToDate(widget.patientAppointmentHistoryResponseModel.appointmentDate)}, Appointment #${widget.patientAppointmentHistoryResponseModel.appointmentNo}", + // description: + // "Appointment Reminder with ${widget.patientAppointmentHistoryResponseModel.doctorNameObj} in ${widget.patientAppointmentHistoryResponseModel.projectName}", + // scheduleDateTime: DateUtil.convertStringToDate(widget + // .patientAppointmentHistoryResponseModel.appointmentDate), + // eventId: "${widget.patientAppointmentHistoryResponseModel.appointmentNo}", + // location: '', + // reminderMinutes: selectedIndex + // ); + // setState(() { + // myAppointmentsViewModel.setAppointmentReminder(isEventAddedOrRemoved, widget.patientAppointmentHistoryResponseModel); + // }); + // }, + // ); + // }else { + // isEventAddedOrRemoved = await calender.checkAndRemove( id:"${widget.patientAppointmentHistoryResponseModel.appointmentNo}", ); + // setState(() { + // myAppointmentsViewModel.setAppointmentReminder(!isEventAddedOrRemoved, widget.patientAppointmentHistoryResponseModel); + // }); + // } + // + // + // }, + // ), ], ).paddingSymmetrical(16.h, 16.h), ), @@ -1234,39 +1392,42 @@ class _AppointmentDetailsPageState extends State { children: [ // Message text LocaleKeys.upcomingPaymentPending.tr(context: context).toText14( - color: AppColors.textColor, - isCenter: true, - ), - SizedBox(height: 24.h), - // Countdown Timer - DD : HH : MM : SS format with labels - Row( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - // Days - _buildTimeUnit( - _timeRemaining != null ? _timeRemaining!.inDays.toString().padLeft(2, '0') : '00', - LocaleKeys.days.tr(context: context), - ), - _buildTimeSeparator(), - // Hours - _buildTimeUnit( - _timeRemaining != null ? _timeRemaining!.inHours.remainder(24).toString().padLeft(2, '0') : '00', - LocaleKeys.hours.tr(context: context), - ), - _buildTimeSeparator(), - // Minutes - _buildTimeUnit( - _timeRemaining != null ? _timeRemaining!.inMinutes.remainder(60).toString().padLeft(2, '0') : '00', - LocaleKeys.minutes.tr(context: context), - ), - _buildTimeSeparator(), - // Seconds - _buildTimeUnit( - _timeRemaining != null ? _timeRemaining!.inSeconds.remainder(60).toString().padLeft(2, '0') : '00', - LocaleKeys.seconds.tr(context: context), + color: AppColors.textColor, + isCenter: true, ), - ], + SizedBox(height: 24.h), + // Countdown Timer - DD : HH : MM : SS format with labels - Always LTR + Directionality( + textDirection: ui.TextDirection.ltr, + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + // Days + _buildTimeUnit( + _timeRemaining != null ? _timeRemaining!.inDays.toString().padLeft(2, '0') : '00', + LocaleKeys.days.tr(context: context), + ), + _buildTimeSeparator(), + // Hours + _buildTimeUnit( + _timeRemaining != null ? _timeRemaining!.inHours.remainder(24).toString().padLeft(2, '0') : '00', + LocaleKeys.hours.tr(context: context), + ), + _buildTimeSeparator(), + // Minutes + _buildTimeUnit( + _timeRemaining != null ? _timeRemaining!.inMinutes.remainder(60).toString().padLeft(2, '0') : '00', + LocaleKeys.minutes.tr(context: context), + ), + _buildTimeSeparator(), + // Seconds + _buildTimeUnit( + _timeRemaining != null ? _timeRemaining!.inSeconds.remainder(60).toString().padLeft(2, '0') : '00', + LocaleKeys.seconds.tr(context: context), + ), + ], + ), ), SizedBox(height: 24.h), // Green Acknowledge button with checkmark icon diff --git a/lib/presentation/appointments/widgets/appointment_doctor_card.dart b/lib/presentation/appointments/widgets/appointment_doctor_card.dart index 4b5df07b..cfc0420a 100644 --- a/lib/presentation/appointments/widgets/appointment_doctor_card.dart +++ b/lib/presentation/appointments/widgets/appointment_doctor_card.dart @@ -24,7 +24,13 @@ import 'package:hmg_patient_app_new/widgets/routes/custom_page_route.dart'; class AppointmentDoctorCard extends StatelessWidget { const AppointmentDoctorCard( - {super.key, required this.patientAppointmentHistoryResponseModel, required this.onRescheduleTap, required this.onCancelTap, required this.onAskDoctorTap, this.renderWidgetForERDisplay = false}); + {super.key, + required this.patientAppointmentHistoryResponseModel, + required this.onRescheduleTap, + required this.onCancelTap, + required this.onAskDoctorTap, + this.renderWidgetForERDisplay = false, + this.timerWidget}); final PatientAppointmentHistoryResponseModel patientAppointmentHistoryResponseModel; final VoidCallback onRescheduleTap; @@ -32,6 +38,8 @@ class AppointmentDoctorCard extends StatelessWidget { final VoidCallback onAskDoctorTap; final bool renderWidgetForERDisplay; + final Widget? timerWidget; + @override Widget build(BuildContext context) { return Container( @@ -146,39 +154,39 @@ class AppointmentDoctorCard extends StatelessWidget { ? SizedBox.shrink() : Utils.buildSvgWithAssets(icon: AppAssets.doctor_profile_icon, width: 20.h, height: 20.h, fit: BoxFit.scaleDown).onPress(() async { DoctorsListResponseModel selectedDoctor = DoctorsListResponseModel(); - selectedDoctor.doctorID = patientAppointmentHistoryResponseModel.doctorID; - selectedDoctor.doctorImageURL = patientAppointmentHistoryResponseModel.doctorImageURL; - selectedDoctor.name = patientAppointmentHistoryResponseModel.doctorNameObj; - selectedDoctor.doctorTitle = patientAppointmentHistoryResponseModel.doctorTitle; - selectedDoctor.nationalityFlagURL = ""; - selectedDoctor.speciality = patientAppointmentHistoryResponseModel.doctorSpeciality; - selectedDoctor.clinicName = patientAppointmentHistoryResponseModel.clinicName; - selectedDoctor.projectName = patientAppointmentHistoryResponseModel.projectName; - selectedDoctor.clinicID = patientAppointmentHistoryResponseModel.clinicID; - selectedDoctor.projectID = patientAppointmentHistoryResponseModel.projectID; + selectedDoctor.doctorID = patientAppointmentHistoryResponseModel.doctorID; + selectedDoctor.doctorImageURL = patientAppointmentHistoryResponseModel.doctorImageURL; + selectedDoctor.name = patientAppointmentHistoryResponseModel.doctorNameObj; + selectedDoctor.doctorTitle = patientAppointmentHistoryResponseModel.doctorTitle; + selectedDoctor.nationalityFlagURL = ""; + selectedDoctor.speciality = patientAppointmentHistoryResponseModel.doctorSpeciality; + selectedDoctor.clinicName = patientAppointmentHistoryResponseModel.clinicName; + selectedDoctor.projectName = patientAppointmentHistoryResponseModel.projectName; + selectedDoctor.clinicID = patientAppointmentHistoryResponseModel.clinicID; + selectedDoctor.projectID = patientAppointmentHistoryResponseModel.projectID; - getIt.get().setSelectedDoctor(selectedDoctor); - LoaderBottomSheet.showLoader(); - await getIt.get().getDoctorProfile(onSuccess: (dynamic respData) { - LoaderBottomSheet.hideLoader(); - Navigator.of(context).push( - CustomPageRoute( - page: DoctorProfilePage( - isDoctorAllowedToBook: !(patientAppointmentHistoryResponseModel.isLiveCareAppointment ?? false), - ), - ), - ); - }, onError: (err) { - LoaderBottomSheet.hideLoader(); - showCommonBottomSheetWithoutHeight( - context, - child: Utils.getErrorWidget(loadingText: err), - callBackFunc: () {}, - isFullScreen: false, - isCloseButtonVisible: true, - ); - }); - }) + getIt.get().setSelectedDoctor(selectedDoctor); + LoaderBottomSheet.showLoader(); + await getIt.get().getDoctorProfile(onSuccess: (dynamic respData) { + LoaderBottomSheet.hideLoader(); + Navigator.of(context).push( + CustomPageRoute( + page: DoctorProfilePage( + isDoctorAllowedToBook: !(patientAppointmentHistoryResponseModel.isLiveCareAppointment ?? false), + ), + ), + ); + }, onError: (err) { + LoaderBottomSheet.hideLoader(); + showCommonBottomSheetWithoutHeight( + context, + child: Utils.getErrorWidget(loadingText: err), + callBackFunc: () {}, + isFullScreen: false, + isCloseButtonVisible: true, + ); + }); + }) ], ), SizedBox(height: 8.h), @@ -188,6 +196,8 @@ class AppointmentDoctorCard extends StatelessWidget { AppointmentType.isArrived(patientAppointmentHistoryResponseModel), ), ), + if (timerWidget != null) + timerWidget ?? SizedBox() ], ), ), @@ -215,26 +225,26 @@ class AppointmentDoctorCard extends StatelessWidget { iconColor: AppColors.primaryRedColor, ) : - // !patientAppointmentHistoryResponseModel.isLiveCareAppointment! - // ? CustomButton( - // text: LocaleKeys.rebookSameDoctor.tr(), - // onPressed: () { - // onRescheduleTap(); - // }, - // backgroundColor: AppColors.greyColor, - // borderColor: AppColors.greyColor, - // textColor: AppColors.blackColor, - // fontSize: 12.f, - // isBold: true, - // borderRadius: 12.r, - // padding: EdgeInsets.fromLTRB(10.w, 0, 10.w, 0), - // height: 40.h, - // icon: AppAssets.rebook_appointment_icon, - // iconColor: AppColors.blackColor, - // iconSize: 14.h, - // ) - // : - SizedBox.shrink(); + // !patientAppointmentHistoryResponseModel.isLiveCareAppointment! + // ? CustomButton( + // text: LocaleKeys.rebookSameDoctor.tr(), + // onPressed: () { + // onRescheduleTap(); + // }, + // backgroundColor: AppColors.greyColor, + // borderColor: AppColors.greyColor, + // textColor: AppColors.blackColor, + // fontSize: 12.f, + // isBold: true, + // borderRadius: 12.r, + // padding: EdgeInsets.fromLTRB(10.w, 0, 10.w, 0), + // height: 40.h, + // icon: AppAssets.rebook_appointment_icon, + // iconColor: AppColors.blackColor, + // iconSize: 14.h, + // ) + // : + SizedBox.shrink(); } else { return patientAppointmentHistoryResponseModel.isLiveCareAppointment! ? CustomButton( diff --git a/lib/presentation/book_appointment/review_appointment_page.dart b/lib/presentation/book_appointment/review_appointment_page.dart index 6a1838f9..86702dbb 100644 --- a/lib/presentation/book_appointment/review_appointment_page.dart +++ b/lib/presentation/book_appointment/review_appointment_page.dart @@ -321,8 +321,8 @@ class _ReviewAppointmentPageState extends State { void initiateBookAppointment() async { // LoadingUtils.showFullScreenLoader(barrierDismissible: true, isSuccessDialog: false, loadingText: bookAppointmentsViewModel.isPatientRescheduleAppointment ? LocaleKeys.reschedulingAppo.tr(context: context) : LocaleKeys.bookingYourAppointment.tr(context: context)); - // LoaderBottomSheet.showLoader(loadingText: bookAppointmentsViewModel.isPatientRescheduleAppointment ? LocaleKeys.reschedulingAppo.tr(context: context) : LocaleKeys.bookingYourAppointment.tr(context: context)); - LoaderBottomSheet.showLoader(loadingText: LocaleKeys.loadingText.tr(context: context)); + LoaderBottomSheet.showLoader( + loadingText: bookAppointmentsViewModel.isPatientRescheduleAppointment ? LocaleKeys.reschedulingAppo.tr(context: context) : LocaleKeys.bookingYourAppointment.tr(context: context)); myAppointmentsViewModel.setIsAppointmentDataToBeLoaded(true); if (bookAppointmentsViewModel.isLiveCareSchedule) { @@ -365,47 +365,10 @@ class _ReviewAppointmentPageState extends State { }, onSuccess: (apiResp) async { LoaderBottomSheet.hideLoader(); await Future.delayed(Duration(milliseconds: 50)).then((value) async { - showCommonBottomSheetWithoutHeight(context, child: Utils.getSuccessWidget(loadingText: LocaleKeys.appointmentSuccess.tr()).paddingSymmetrical(0.h, 24.h), callBackFunc: () async { + showCommonBottomSheetWithoutHeight(context, child: Utils.getSuccessWidget(loadingText: LocaleKeys.appointmentSuccess.tr()).paddingSymmetrical(0.h, 24.h), callBackFunc: () { bookAppointmentsViewModel.setIsLiveCareSchedule(false); bookAppointmentsViewModel.setIsPatientRescheduleAppointment(false); - bool newValue = true; - await myAppointmentsViewModel.toggleReminder( - context: context, - shouldCreateReminder: newValue, - patientAppointmentHistoryResponseModel: apiResp.patientAppointmentHistoryResponseModel, - onSuccess: (result) { - showCommonBottomSheet( - context, - child: Utils.getSuccessWidget( - loadingText: newValue ? LocaleKeys.reminderSuccess.tr(context: context) : LocaleKeys.reminderCancelSuccess.tr(context: context), - ), - callBackFunc: (str) { - Navigator.pushAndRemoveUntil(context, CustomPageRoute(page: LandingNavigation()), (r) => false); - }, - title: "", - isCloseButtonVisible: false, - isDismissible: true, - isFullScreen: false, - isAutoDismiss: true, - height: ResponsiveExtension.screenHeight * 0.3, - ); - }, - onError: (error) { - setState(() { - apiResp.patientAppointmentHistoryResponseModel.hasReminder = !newValue; - }); - showCommonBottomSheetWithoutHeight( - context, - title: LocaleKeys.notice.tr(context: context), - child: Utils.getErrorWidget(loadingText: error), - callBackFunc: () { - Navigator.pushAndRemoveUntil(context, CustomPageRoute(page: LandingNavigation()), (r) => false); - }, - isFullScreen: false, - isCloseButtonVisible: true, - ); - }, - ); + Navigator.pushAndRemoveUntil(context, CustomPageRoute(page: LandingNavigation()), (r) => false); }, isFullScreen: false, isCloseButtonVisible: false, isAutoDismiss: true); }); }); diff --git a/lib/presentation/book_appointment/widgets/appointment_success_reminder_bottom_sheet.dart b/lib/presentation/book_appointment/widgets/appointment_success_reminder_bottom_sheet.dart new file mode 100644 index 00000000..ec3afc40 --- /dev/null +++ b/lib/presentation/book_appointment/widgets/appointment_success_reminder_bottom_sheet.dart @@ -0,0 +1,441 @@ +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.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/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/features/my_appointments/models/reminder_type.dart'; +import 'package:hmg_patient_app_new/features/my_appointments/models/resp_models/patient_appointment_history_response_model.dart'; +import 'package:hmg_patient_app_new/features/my_appointments/my_appointments_view_model.dart'; +import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; +import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart'; + +enum ReminderBottomSheetStep { + success, + reminderConfirmation, + reminderTypeSelection, + creatingReminder, + reminderSuccess, + reminderError, +} + +class AppointmentSuccessReminderBottomSheet extends StatefulWidget { + final PatientAppointmentHistoryResponseModel appointmentModel; + final MyAppointmentsViewModel myAppointmentsViewModel; + final VoidCallback onComplete; + + const AppointmentSuccessReminderBottomSheet({ + Key? key, + required this.appointmentModel, + required this.myAppointmentsViewModel, + required this.onComplete, + }) : super(key: key); + + @override + State createState() => _AppointmentSuccessReminderBottomSheetState(); +} + +class _AppointmentSuccessReminderBottomSheetState extends State { + ReminderBottomSheetStep currentStep = ReminderBottomSheetStep.success; + ReminderType? selectedReminderType; + String errorMessage = ''; + bool isProcessing = false; + + @override + void initState() { + super.initState(); + // Auto-progress to reminder confirmation after showing success + Future.delayed(Duration(milliseconds: 2000), () { + if (mounted) { + setState(() { + currentStep = ReminderBottomSheetStep.reminderConfirmation; + }); + } + }); + } + + void _handleNoReminder() { + Navigator.of(context).pop(); + widget.onComplete(); + } + + void _handleYesReminder() { + setState(() { + currentStep = ReminderBottomSheetStep.reminderTypeSelection; + }); + } + + void _selectReminderType(ReminderType type) { + setState(() { + selectedReminderType = type; + }); + } + + Future _createReminder() async { + if (selectedReminderType == null) return; + + setState(() { + currentStep = ReminderBottomSheetStep.creatingReminder; + isProcessing = true; + }); + + await widget.myAppointmentsViewModel.toggleReminder( + context: context, + shouldCreateReminder: true, + reminderType: selectedReminderType!, + patientAppointmentHistoryResponseModel: widget.appointmentModel, + onSuccess: (result) { + if (mounted) { + setState(() { + currentStep = ReminderBottomSheetStep.reminderSuccess; + isProcessing = false; + }); + // Auto-close after showing success + Future.delayed(Duration(milliseconds: 2000), () { + if (mounted) { + Navigator.of(context).pop(); + widget.onComplete(); + } + }); + } + }, + onError: (error) { + if (mounted) { + setState(() { + currentStep = ReminderBottomSheetStep.reminderError; + errorMessage = error; + isProcessing = false; + }); + } + }, + ); + } + + @override + Widget build(BuildContext context) { + return Container( + decoration: BoxDecoration( + color: AppColors.whiteColor, + borderRadius: BorderRadius.vertical(top: Radius.circular(24.r)), + ), + padding: EdgeInsets.symmetric(horizontal: 24.w, vertical: 24.h), + child: AnimatedSwitcher( + duration: Duration(milliseconds: 300), + child: _buildStepContent(), + ), + ); + } + + Widget _buildStepContent() { + switch (currentStep) { + case ReminderBottomSheetStep.success: + return _buildSuccessStep(); + case ReminderBottomSheetStep.reminderConfirmation: + return _buildReminderConfirmationStep(); + case ReminderBottomSheetStep.reminderTypeSelection: + return _buildReminderTypeSelectionStep(); + case ReminderBottomSheetStep.creatingReminder: + return _buildCreatingReminderStep(); + case ReminderBottomSheetStep.reminderSuccess: + return _buildReminderSuccessStep(); + case ReminderBottomSheetStep.reminderError: + return _buildReminderErrorStep(); + } + } + + Widget _buildSuccessStep() { + return Column( + key: ValueKey('success'), + mainAxisSize: MainAxisSize.min, + children: [ + Utils.getSuccessWidget(loadingText: LocaleKeys.appointmentSuccess.tr(context: context)), + SizedBox(height: 16.h), + Center( + child: "Your appointment has been booked successfully!".toText14( + color: AppColors.greyTextColor, + ), + ), + ], + ); + } + + Widget _buildReminderConfirmationStep() { + return Column( + key: ValueKey('confirmation'), + mainAxisSize: MainAxisSize.min, + children: [ + Icon( + Icons.notifications_active_outlined, + size: 56.h, + color: AppColors.primaryRedColor, + ), + SizedBox(height: 16.h), + Center(child: "Add Reminder?".toText20(isBold: true)), + SizedBox(height: 12.h), + Center( + child: "Would you like to add a reminder for this appointment?".toText14( + color: AppColors.greyTextColor, + ), + ), + SizedBox(height: 24.h), + Row( + children: [ + Expanded( + child: CustomButton( + text: LocaleKeys.cancel.tr(context: context), + onPressed: _handleNoReminder, + backgroundColor: AppColors.whiteColor, + borderColor: AppColors.greyTextColor, + textColor: AppColors.greyTextColor, + fontSize: 14.f, + fontWeight: FontWeight.w600, + borderRadius: 12, + height: 48.h, + ), + ), + SizedBox(width: 12.w), + Expanded( + child: CustomButton( + text: LocaleKeys.confirm.tr(context: context), + onPressed: _handleYesReminder, + backgroundColor: AppColors.primaryRedColor, + borderColor: AppColors.primaryRedColor, + textColor: Colors.white, + fontSize: 14.f, + fontWeight: FontWeight.w600, + borderRadius: 12, + height: 48.h, + ), + ), + ], + ), + ], + ); + } + + Widget _buildReminderTypeSelectionStep() { + return Column( + key: ValueKey('type_selection'), + mainAxisSize: MainAxisSize.min, + children: [ + Center(child: "Select Reminder Type".toText20(isBold: true)), + SizedBox(height: 8.h), + Center( + child: "Choose what type of reminder you want to set".toText14( + color: AppColors.greyTextColor, + ), + ), + SizedBox(height: 24.h), + _buildReminderTypeCard( + type: ReminderType.appointment, + icon: Icons.event_outlined, + title: "Appointment Reminder", + description: "Get reminded about your upcoming appointment", + ), + SizedBox(height: 12.h), + _buildReminderTypeCard( + type: ReminderType.payment, + icon: Icons.payment_outlined, + title: "Payment Reminder", + description: "Get reminded about payment for this appointment", + ), + SizedBox(height: 12.h), + _buildReminderTypeCard( + type: ReminderType.checkIn, + icon: Icons.check_circle_outline, + title: "Check-In Reminder", + description: "Get reminded to check in for your appointment", + ), + SizedBox(height: 24.h), + Row( + children: [ + Expanded( + child: CustomButton( + text: LocaleKeys.cancel.tr(context: context), + onPressed: () { + setState(() { + currentStep = ReminderBottomSheetStep.reminderConfirmation; + selectedReminderType = null; + }); + }, + backgroundColor: AppColors.whiteColor, + borderColor: AppColors.greyTextColor, + textColor: AppColors.greyTextColor, + fontSize: 14.f, + fontWeight: FontWeight.w600, + borderRadius: 12, + height: 48.h, + ), + ), + SizedBox(width: 12.w), + Expanded( + child: CustomButton( + text: "Continue", + onPressed: selectedReminderType != null ? _createReminder : null, + backgroundColor: selectedReminderType != null ? AppColors.primaryRedColor : AppColors.greyTextColor.withAlpha(76), + borderColor: selectedReminderType != null ? AppColors.primaryRedColor : AppColors.greyTextColor.withAlpha(76), + textColor: Colors.white, + fontSize: 14.f, + fontWeight: FontWeight.w600, + borderRadius: 12, + height: 48.h, + ), + ), + ], + ), + ], + ); + } + + Widget _buildReminderTypeCard({ + required ReminderType type, + required IconData icon, + required String title, + required String description, + }) { + final isSelected = selectedReminderType == type; + return GestureDetector( + onTap: () => _selectReminderType(type), + child: Container( + padding: EdgeInsets.all(16.h), + decoration: BoxDecoration( + color: isSelected ? AppColors.primaryRedColor.withAlpha(26) : AppColors.scaffoldBgColor, + border: Border.all( + color: isSelected ? AppColors.primaryRedColor : AppColors.borderOnlyColor, + width: isSelected ? 2 : 1, + ), + borderRadius: BorderRadius.circular(12.r), + ), + child: Row( + children: [ + Container( + padding: EdgeInsets.all(12.h), + decoration: BoxDecoration( + color: isSelected ? AppColors.primaryRedColor : AppColors.greyTextColor.withAlpha(26), + borderRadius: BorderRadius.circular(8.r), + ), + child: Icon( + icon, + color: isSelected ? Colors.white : AppColors.greyTextColor, + size: 24.h, + ), + ), + SizedBox(width: 12.w), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + title.toText16( + isBold: true, + color: isSelected ? AppColors.primaryRedColor : AppColors.textColor, + ), + SizedBox(height: 4.h), + description.toText12( + color: AppColors.greyTextColor, + ), + ], + ), + ), + if (isSelected) + Icon( + Icons.check_circle, + color: AppColors.primaryRedColor, + size: 24.h, + ), + ], + ), + ), + ); + } + + Widget _buildCreatingReminderStep() { + return Column( + key: ValueKey('creating'), + mainAxisSize: MainAxisSize.min, + children: [ + CircularProgressIndicator(color: AppColors.primaryRedColor), + SizedBox(height: 24.h), + Center( + child: "Creating your reminder...".toText16( + isBold: true, + ), + ), + SizedBox(height: 8.h), + Center( + child: "Please wait while we set up your reminder".toText14( + color: AppColors.greyTextColor, + ), + ), + ], + ); + } + + Widget _buildReminderSuccessStep() { + return Column( + key: ValueKey('reminder_success'), + mainAxisSize: MainAxisSize.min, + children: [ + Icon( + Icons.check_circle, + size: 64.h, + color: AppColors.successColor, + ), + SizedBox(height: 16.h), + Center( + child: LocaleKeys.reminderSuccess.tr(context: context).toText20( + isBold: true, + ), + ), + SizedBox(height: 8.h), + Center( + child: "Your ${selectedReminderType?.displayName ?? 'reminder'} has been set successfully!".toText14( + color: AppColors.greyTextColor, + ), + ), + ], + ); + } + + Widget _buildReminderErrorStep() { + return Column( + key: ValueKey('error'), + mainAxisSize: MainAxisSize.min, + children: [ + Icon( + Icons.error_outline, + size: 64.h, + color: AppColors.primaryRedColor, + ), + SizedBox(height: 16.h), + Center( + child: "Error".toText20( + isBold: true, + color: AppColors.primaryRedColor, + ), + ), + SizedBox(height: 8.h), + Center( + child: errorMessage.toText14( + color: AppColors.greyTextColor, + ), + ), + SizedBox(height: 24.h), + CustomButton( + text: "Close", + onPressed: () { + Navigator.of(context).pop(); + widget.onComplete(); + }, + backgroundColor: AppColors.primaryRedColor, + borderColor: AppColors.primaryRedColor, + textColor: Colors.white, + fontSize: 14.f, + fontWeight: FontWeight.w600, + borderRadius: 12, + height: 48.h, + ), + ], + ); + } +} + diff --git a/lib/presentation/book_appointment/widgets/bell_switch.dart b/lib/presentation/book_appointment/widgets/bell_switch.dart new file mode 100644 index 00000000..498ea6aa --- /dev/null +++ b/lib/presentation/book_appointment/widgets/bell_switch.dart @@ -0,0 +1,178 @@ +import 'package:flutter/material.dart'; + +class BellAnimatedSwitch extends StatefulWidget { + final bool initialValue; + final ValueChanged? onChanged; + final Color? activeColor; + final Color? inactiveColor; + final Color? activeIconColor; + final Color? inactiveIconColor; + final Color? activeCircleColor; + final Color? inactiveCircleColor; + final Widget? activeIcon; + final Widget? inactiveIcon; + final double width; + final double height; + final Duration animationDuration; + + const BellAnimatedSwitch({ + super.key, + this.initialValue = false, + this.onChanged, + this.activeColor, + this.inactiveColor, + this.activeIconColor, + this.inactiveIconColor, + this.activeCircleColor, + this.inactiveCircleColor, + this.activeIcon, + this.inactiveIcon, + this.width = 70, + this.height = 40, + this.animationDuration = const Duration(milliseconds: 300), + }); + + @override + State createState() => _BellAnimatedSwitchState(); +} + +class _BellAnimatedSwitchState extends State with SingleTickerProviderStateMixin { + late bool _isActive; + late AnimationController _animationController; + late Animation _circleAlignment; + late Animation _scaleAnimation; + + @override + void initState() { + super.initState(); + _isActive = widget.initialValue; + _animationController = AnimationController( + duration: widget.animationDuration, + vsync: this, + ); + + // Animation for the circle position (left/right) + _circleAlignment = AlignmentTween( + begin: Alignment.centerLeft, + end: Alignment.centerRight, + ).animate( + CurvedAnimation(parent: _animationController, curve: Curves.easeInOut), + ); + + // Scale animation for tap feedback + _scaleAnimation = Tween(begin: 1.0, end: 0.9).animate( + CurvedAnimation( + parent: _animationController, + curve: const Interval(0.0, 0.5, curve: Curves.easeOut), + ), + ); + + if (_isActive) { + _animationController.value = 1.0; + } + } + + @override + void dispose() { + _animationController.dispose(); + super.dispose(); + } + + void _toggle() { + setState(() { + _isActive = !_isActive; + if (_isActive) { + _animationController.forward(); + } else { + _animationController.reverse(); + } + widget.onChanged?.call(_isActive); + }); + } + + Color _getBackgroundColor() { + if (_isActive) { + return widget.activeColor ?? Colors.green.shade400; + } + return widget.inactiveColor ?? Colors.grey.shade300; + } + + Color _getCircleColor() { + if (_isActive) { + return widget.activeCircleColor ?? Colors.white; + } + return widget.inactiveCircleColor ?? Colors.white; + } + + Widget _getIcon() { + if (_isActive) { + return widget.activeIcon ?? Icon( + Icons.check, + size: 18, + color: widget.activeIconColor ?? Colors.green.shade400, + ); + } + return widget.inactiveIcon ?? Icon( + Icons.close, + size: 18, + color: widget.inactiveIconColor ?? Colors.grey.shade600, + ); + } + + @override + Widget build(BuildContext context) { + return GestureDetector( + onTap: _toggle, + child: AnimatedBuilder( + animation: _animationController, + builder: (context, child) { + return Transform.scale( + scale: _scaleAnimation.value, + child: Container( + width: widget.width, + height: widget.height, + decoration: BoxDecoration( + color: _getBackgroundColor(), + borderRadius: BorderRadius.circular(widget.height / 2), + // boxShadow: [ + // BoxShadow( + // color: Colors.black.withAlpha(26), + // blurRadius: 4, + // offset: const Offset(0, 2), + // ), + // ], + ), + child: Stack( + children: [ + // Animated circle with icon inside + Align( + alignment: _circleAlignment.value, + child: Container( + margin: const EdgeInsets.all(4), + width: widget.height - 8, + height: widget.height - 8, + decoration: BoxDecoration( + shape: BoxShape.circle, + color: _getCircleColor(), + boxShadow: [ + BoxShadow( + color: Colors.black.withAlpha(51), + blurRadius: 2, + offset: const Offset(0, 1), + ), + ], + ), + child: Center( + child: _getIcon(), + ), + ), + ), + ], + ), + ), + ); + }, + ), + ); + } +} diff --git a/lib/presentation/health_calculators_and_converts/health_calculators_page.dart b/lib/presentation/health_calculators_and_converts/health_calculators_page.dart index bba6f705..877a5d9b 100644 --- a/lib/presentation/health_calculators_and_converts/health_calculators_page.dart +++ b/lib/presentation/health_calculators_and_converts/health_calculators_page.dart @@ -14,6 +14,7 @@ import 'package:hmg_patient_app_new/presentation/health_calculators_and_converts import 'package:hmg_patient_app_new/services/dialog_service.dart'; import 'package:hmg_patient_app_new/theme/colors.dart'; import 'package:hmg_patient_app_new/widgets/appbar/collapsing_list_view.dart'; +import 'package:hmg_patient_app_new/widgets/expandable_list_widget.dart'; import 'package:hmg_patient_app_new/widgets/routes/custom_page_route.dart'; class HealthCalculatorsPage extends StatefulWidget { @@ -37,73 +38,89 @@ class _HealthCalculatorsPageState extends State { return CollapsingListView( title: widget.type == HealthCalConEnum.calculator ? LocaleKeys.healthCalculators.tr(context: context) : LocaleKeys.healthConverters.tr(), child: widget.type == HealthCalConEnum.calculator - ? Column( - children: [ - Container( - decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 20.r), - child: Row( - children: [ - Utils.buildSvgWithAssets(icon: AppAssets.general_health, height: 40.h, width: 40.w, fit: BoxFit.none, applyThemeColor: false), - SizedBox(width: 12.w), - Flexible( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisAlignment: MainAxisAlignment.center, - children: [ - LocaleKeys.generalHealth.tr().toText16(isBold: true), - LocaleKeys.relatedToBMICalories.tr().toText12(isBold: true, color: Color(0xFF8F9AA3)) - ], - ), - ), - SizedBox( - width: 12.w, - ), - Transform.flip( - flipX: getIt.get().isArabic(), - child: Utils.buildSvgWithAssets(icon: AppAssets.arrowRight, width: 24.w, height: 24.h, fit: BoxFit.contain, iconColor: AppColors.textColor)), - ], - ).paddingAll(16.w)) - .onPress(() { - dialogService.showFamilyBottomSheetWithoutHWithChild( - label: LocaleKeys.selectCalculator.tr(), - message: "", - child: showCalculatorsItems(type: HealthCalculatorEnum.general), - onOkPressed: () {}, - ); - }), - SizedBox(height: 16.h), - Container( - decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 20.r), - child: Row( - children: [ - Utils.buildSvgWithAssets(icon: AppAssets.women_health, height: 40.h, width: 40.w, fit: BoxFit.none, applyThemeColor: false), - SizedBox(width: 12.w), - Flexible( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisAlignment: MainAxisAlignment.center, - children: [ - LocaleKeys.womensHealth.tr().toText16(isBold: true), - LocaleKeys.relatedToPeriodsOvulation.tr().toText12(isBold: true, color: Color(0xFF8F9AA3)) - ], - ), - ), - SizedBox(width: 12.w), - Transform.flip( - flipX: getIt.get().isArabic(), - child: Utils.buildSvgWithAssets(icon: AppAssets.arrowRight, width: 24.w, height: 24.h, fit: BoxFit.contain, iconColor: AppColors.textColor)), - ], - ).paddingAll(16.w)) - .onPress(() { - dialogService.showFamilyBottomSheetWithoutHWithChild( - label: LocaleKeys.selectCalculator.tr(), - message: "", - child: showCalculatorsItems(type: HealthCalculatorEnum.women), - onOkPressed: () {}, - ); - }), + ? CustomExpandableList( + expansionMode: ExpansionMode.exactlyOne, + dividerColor: AppColors.dividerColor, + itemPadding: EdgeInsets.symmetric(vertical: 16.h, horizontal: 14.h), + items: [ + ExpandableListItem( + title: LocaleKeys.womensHealth.tr(context: context).toText18(isBold: true), + expandedBackgroundColor: Colors.transparent, + initiallyExpanded: true, + children: [showCalculatorsItems(type: HealthCalculatorEnum.women)], + ), + ExpandableListItem( + title: LocaleKeys.generalHealth.tr(context: context).toText18(isBold: true), + expandedBackgroundColor: Colors.transparent, + initiallyExpanded: true, + children: [showCalculatorsItems(type: HealthCalculatorEnum.general)], + ), ], - ).paddingSymmetrical(20.w, 24.h) + theme: ExpandableListTheme.custom( + defaultTrailingIcon: Utils.buildSvgWithAssets(icon: AppAssets.arrow_down, height: 22.h, width: 22.w, iconColor: AppColors.textColor), + ), + ).paddingSymmetrical(16.w, 0.0) + // ? Column( + // children: [ + // Container( + // decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 20.r), + // child: Row( + // children: [ + // Utils.buildSvgWithAssets(icon: AppAssets.general_health, height: 40.h, width: 40.w, fit: BoxFit.none, applyThemeColor: false), + // SizedBox(width: 12.w), + // Flexible( + // child: Column( + // crossAxisAlignment: CrossAxisAlignment.start, + // mainAxisAlignment: MainAxisAlignment.center, + // children: [LocaleKeys.generalHealth.tr().toText16(isBold: true), LocaleKeys.relatedToBMICalories.tr().toText12(isBold: true, color: Color(0xFF8F9AA3))], + // ), + // ), + // SizedBox( + // width: 12.w, + // ), + // Transform.flip( + // flipX: getIt.get().isArabic(), + // child: Utils.buildSvgWithAssets(icon: AppAssets.arrowRight, width: 24.w, height: 24.h, fit: BoxFit.contain, iconColor: AppColors.textColor)), + // ], + // ).paddingAll(16.w)) + // .onPress(() { + // dialogService.showFamilyBottomSheetWithoutHWithChild( + // label: LocaleKeys.selectCalculator.tr(), + // message: "", + // child: showCalculatorsItems(type: HealthCalculatorEnum.general), + // onOkPressed: () {}, + // ); + // }), + // SizedBox(height: 16.h), + // Container( + // decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 20.r), + // child: Row( + // children: [ + // Utils.buildSvgWithAssets(icon: AppAssets.women_health, height: 40.h, width: 40.w, fit: BoxFit.none, applyThemeColor: false), + // SizedBox(width: 12.w), + // Flexible( + // child: Column( + // crossAxisAlignment: CrossAxisAlignment.start, + // mainAxisAlignment: MainAxisAlignment.center, + // children: [LocaleKeys.womensHealth.tr().toText16(isBold: true), LocaleKeys.relatedToPeriodsOvulation.tr().toText12(isBold: true, color: Color(0xFF8F9AA3))], + // ), + // ), + // SizedBox(width: 12.w), + // Transform.flip( + // flipX: getIt.get().isArabic(), + // child: Utils.buildSvgWithAssets(icon: AppAssets.arrowRight, width: 24.w, height: 24.h, fit: BoxFit.contain, iconColor: AppColors.textColor)), + // ], + // ).paddingAll(16.w)) + // .onPress(() { + // dialogService.showFamilyBottomSheetWithoutHWithChild( + // label: LocaleKeys.selectCalculator.tr(), + // message: "", + // child: showCalculatorsItems(type: HealthCalculatorEnum.women), + // onOkPressed: () {}, + // ); + // }), + // ], + // ).paddingSymmetrical(20.w, 24.h) : Column( children: [ Container( @@ -151,11 +168,7 @@ class _HealthCalculatorsPageState extends State { child: Column( crossAxisAlignment: CrossAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.center, - children: [ - LocaleKeys.bloodCholesterol.tr().toText16(isBold: true), - LocaleKeys.monitorCholesterolLevels.tr() - .toText12(isBold: true, color: Color(0xFF8F9AA3)) - ], + children: [LocaleKeys.bloodCholesterol.tr().toText16(isBold: true), LocaleKeys.monitorCholesterolLevels.tr().toText12(isBold: true, color: Color(0xFF8F9AA3))], ), ), SizedBox(width: 12.w), @@ -183,8 +196,7 @@ class _HealthCalculatorsPageState extends State { mainAxisAlignment: MainAxisAlignment.center, children: [ LocaleKeys.triglyceridesFatBlood.tr().toText16(isBold: true), - LocaleKeys.understandTriglyceridesImpact.tr() - .toText12(isBold: true, color: Color(0xFF8F9AA3)) + LocaleKeys.understandTriglyceridesImpact.tr().toText12(isBold: true, color: Color(0xFF8F9AA3)) ], ), ), @@ -204,49 +216,104 @@ class _HealthCalculatorsPageState extends State { } Widget showCalculatorsItems({required HealthCalculatorEnum type}) { - return GridView.builder( - gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( - crossAxisCount: 3, // 4 icons per row - crossAxisSpacing: 16.w, - mainAxisSpacing: 16.w, - childAspectRatio: 0.85), - physics: NeverScrollableScrollPhysics(), - shrinkWrap: true, - itemCount: type == HealthCalculatorEnum.general ? generalHealthServices.length : womenHealthServices.length, - padding: EdgeInsets.zero, - itemBuilder: (BuildContext context, int index) { - return HealthCard( - icon: type == HealthCalculatorEnum.general ? generalHealthServices[index].icon : womenHealthServices[index].icon, - labelText: type == HealthCalculatorEnum.general ? generalHealthServices[index].title : womenHealthServices[index].title, - onTap: () { - Navigator.pop(context); - Navigator.of(context).push( - CustomPageRoute( - page: HealthCalculatorDetailedPage( - calculatorType: type == HealthCalculatorEnum.general ? generalHealthServices[index].type : womenHealthServices[index].type, - clinicID: type == HealthCalculatorEnum.general ? generalHealthServices[index].clinicID : womenHealthServices[index].clinicID, - calculationID: type == HealthCalculatorEnum.general ? generalHealthServices[index].calculationID : womenHealthServices[index].calculationID, + return ListView.separated( + physics: NeverScrollableScrollPhysics(), + shrinkWrap: true, + itemCount: type == HealthCalculatorEnum.general ? generalHealthServices.length : womenHealthServices.length, + padding: EdgeInsets.zero, + itemBuilder: (BuildContext context, int index) { + return HealthCard( + icon: type == HealthCalculatorEnum.general ? generalHealthServices[index].icon : womenHealthServices[index].icon, + labelText: type == HealthCalculatorEnum.general ? generalHealthServices[index].title : womenHealthServices[index].title, + subtitle: type == HealthCalculatorEnum.general ? generalHealthServices[index].subTitle ?? "" : womenHealthServices[index].subTitle ?? "", + iconColor: type == HealthCalculatorEnum.general ? generalHealthServices[index].iconColor : womenHealthServices[index].iconColor, + iconBgColor: type == HealthCalculatorEnum.general ? generalHealthServices[index].bgColor : womenHealthServices[index].bgColor, + onTap: () { + Navigator.of(context).push( + CustomPageRoute( + page: HealthCalculatorDetailedPage( + calculatorType: type == HealthCalculatorEnum.general ? generalHealthServices[index].type : womenHealthServices[index].type, + clinicID: type == HealthCalculatorEnum.general ? generalHealthServices[index].clinicID : womenHealthServices[index].clinicID, + calculationID: type == HealthCalculatorEnum.general ? generalHealthServices[index].calculationID : womenHealthServices[index].calculationID, + ), ), - ), - ); - }, - ); - }, - ); + ); + }, + ); + }, + separatorBuilder: (BuildContext context, int index) { + return SizedBox(height: 16.h); + }); } final List generalHealthServices = [ - HealthComponentModel(title: LocaleKeys.bmiCalculator.tr(), icon: AppAssets.bmi, type: HealthCalculatorsTypeEnum.bmi, clinicID: 108, calculationID: null), - HealthComponentModel(title: LocaleKeys.caloriesCalculator.tr(), icon: AppAssets.calories, type: HealthCalculatorsTypeEnum.calories, clinicID: null, calculationID: 2), - HealthComponentModel(title: LocaleKeys.bmrCalculator.tr(), icon: AppAssets.bmr, type: HealthCalculatorsTypeEnum.bmr, clinicID: null, calculationID: 3), - HealthComponentModel(title: LocaleKeys.idealBodyWeight.tr(), icon: AppAssets.ibw, type: HealthCalculatorsTypeEnum.idealBodyWeight, clinicID: null, calculationID: 4), - HealthComponentModel(title: LocaleKeys.bodyFatCalculator.tr(), icon: AppAssets.ibw, type: HealthCalculatorsTypeEnum.bodyFat, clinicID: null, calculationID: 5), - HealthComponentModel(title: LocaleKeys.carbsProteinFat.tr(), icon: AppAssets.ibw, type: HealthCalculatorsTypeEnum.crabsProteinFat, clinicID: null, calculationID: 11), + HealthComponentModel( + title: LocaleKeys.bmiCalculator.tr(), + subTitle: LocaleKeys.bmiCalculatorDesc.tr(), + icon: AppAssets.bmicalc, + type: HealthCalculatorsTypeEnum.bmi, + clinicID: 108, + bgColor: AppColors.bmiCalculatorColor, + calculationID: null), + HealthComponentModel( + title: LocaleKeys.caloriesCalculator.tr(), + subTitle: LocaleKeys.caloriesCalculatorDesc.tr(), + icon: AppAssets.bmicalc, + type: HealthCalculatorsTypeEnum.calories, + clinicID: null, + bgColor: AppColors.caloriesCalculatorColor, + calculationID: 2), + HealthComponentModel( + title: LocaleKeys.bmrCalculator.tr(), + subTitle: LocaleKeys.bmrCalculatorDesc.tr(), + icon: AppAssets.bmrcalc, + type: HealthCalculatorsTypeEnum.bmr, + clinicID: null, + bgColor: AppColors.bmrCalculatorColor, + calculationID: 3), + HealthComponentModel( + title: LocaleKeys.idealBodyWeight.tr(), + subTitle: LocaleKeys.idealBodyWeightDesc.tr(), + icon: AppAssets.idealbodyweightcacl, + type: HealthCalculatorsTypeEnum.idealBodyWeight, + bgColor: AppColors.idealBodyWeightColor, + clinicID: null, + calculationID: 4), + HealthComponentModel( + title: LocaleKeys.bodyFatCalculator.tr(), + subTitle: LocaleKeys.bodyFatCalculatorDesc.tr(), + icon: AppAssets.bodyfatcalc, + type: HealthCalculatorsTypeEnum.bodyFat, + clinicID: null, + bgColor: AppColors.bodyFatCalculatorColor, + calculationID: 5), + HealthComponentModel( + title: LocaleKeys.carbsProteinFat.tr(), + subTitle: LocaleKeys.carbsProteinFatDesc.tr(), + icon: AppAssets.bmicalc, + type: HealthCalculatorsTypeEnum.crabsProteinFat, + clinicID: null, + bgColor: AppColors.carbsProteinFatColor, + calculationID: 11), ]; final List womenHealthServices = [ - HealthComponentModel(title: LocaleKeys.ovulationPeriod.tr(), icon: AppAssets.locate_me, type: HealthCalculatorsTypeEnum.ovulation, clinicID: null, calculationID: 6 ), - HealthComponentModel(title: LocaleKeys.deliveryDueDate.tr(), icon: AppAssets.activeCheck, type: HealthCalculatorsTypeEnum.deliveryDueDate, clinicID: null, calculationID: 6), + HealthComponentModel( + title: LocaleKeys.ovulationPeriod.tr(), + subTitle: LocaleKeys.ovulationPeriodDesc.tr(), + icon: AppAssets.ovluationperiod, + type: HealthCalculatorsTypeEnum.ovulation, + clinicID: null, + calculationID: 6, + bgColor: AppColors.ovulationPeriodColor), + HealthComponentModel( + title: LocaleKeys.deliveryDueDate.tr(), + subTitle: LocaleKeys.deliveryDueDateDesc.tr(), + icon: AppAssets.duedatecalc, + type: HealthCalculatorsTypeEnum.deliveryDueDate, + clinicID: null, + bgColor: AppColors.deliveryDueDateColor, + calculationID: 6), ]; } diff --git a/lib/presentation/health_calculators_and_converts/widgets/health_card.dart b/lib/presentation/health_calculators_and_converts/widgets/health_card.dart index 21482e7c..e6c3d4d4 100644 --- a/lib/presentation/health_calculators_and_converts/widgets/health_card.dart +++ b/lib/presentation/health_calculators_and_converts/widgets/health_card.dart @@ -1,4 +1,7 @@ import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/app_state.dart'; +import 'package:hmg_patient_app_new/core/dependencies.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/extensions/string_extensions.dart'; @@ -9,41 +12,55 @@ class HealthCard extends StatelessWidget { const HealthCard({ super.key, required this.icon, + this.iconColor, + this.iconBgColor, required this.labelText, + required this.subtitle, this.onTap, }); final String icon; + final Color? iconColor; + final Color? iconBgColor; final String labelText; + final String subtitle; final VoidCallback? onTap; @override Widget build(BuildContext context) { + AppState appState = getIt.get(); return Container( - decoration: RoundedRectangleBorder().toSmoothCornerDecoration( - color: AppColors.whiteColor, - borderRadius: 20.r, - hasShadow: false, - ), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 20.r, hasShadow: false), + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.center, children: [ - Utils.buildSvgWithAssets( - icon: icon, + Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: iconBgColor ?? Colors.transparent, borderRadius: 10.r), + height: 40.w, width: 40.w, - height: 40.h, - fit: BoxFit.cover, - ).toShimmer2(isShow: false, radius: 12.r), - SizedBox(height: 14.h), - Row( - mainAxisAlignment: MainAxisAlignment.start, - children: [ - Flexible( - child: labelText.toText12( - isBold: true, - maxLine: 2, - )), - ], + child: Utils.buildSvgWithAssets(icon: icon, fit: BoxFit.none, height: 22.w, width: 22.w, iconColor: iconColor), + ), + SizedBox(width: 12.h), + Expanded( + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + labelText.toText16(weight: FontWeight.w600), + ], + ), + SizedBox(height: 4.h), + subtitle.toText12(maxLine: 2, color: AppColors.greyTextColor), + ], + ), + ), + SizedBox(width: 2.h), + Transform.flip( + flipX: appState.getLanguageCode() == "ar", + child: Utils.buildSvgWithAssets(icon: AppAssets.arrowRight, width: 24.w, height: 24.h, fit: BoxFit.cover, iconColor: AppColors.textColor), ), ], ).paddingAll(16.w).onPress(() { diff --git a/lib/theme/colors.dart b/lib/theme/colors.dart index e9cd83eb..1e39eac8 100644 --- a/lib/theme/colors.dart +++ b/lib/theme/colors.dart @@ -90,6 +90,16 @@ class AppColors { static Color get myChildVaccineCardColor => isDarkMode ? dark.myChildVaccineCardColor : const Color(0xFFFF2D78); static Color get bookAppointment => isDarkMode ? dark.bookAppointment : const Color(0xFF415364); + // ── Health Calculators Colors ───────────────────────────────────────────── + static Color get bmiCalculatorColor => isDarkMode ? dark.bmiCalculatorColor : const Color(0xFFF43333); + static Color get caloriesCalculatorColor => isDarkMode ? dark.caloriesCalculatorColor : const Color(0xFF0B85F7); + static Color get bmrCalculatorColor => isDarkMode ? dark.bmrCalculatorColor : const Color(0xFF18C273); + static Color get idealBodyWeightColor => isDarkMode ? dark.idealBodyWeightColor : const Color(0xFFFF8012); + static Color get bodyFatCalculatorColor => isDarkMode ? dark.bodyFatCalculatorColor : const Color(0xFFFF5662); + static Color get carbsProteinFatColor => isDarkMode ? dark.carbsProteinFatColor : const Color(0xFF18C273); + static Color get ovulationPeriodColor => isDarkMode ? dark.ovulationPeriodColor : const Color(0xFFFF47A9); + static Color get deliveryDueDateColor => isDarkMode ? dark.deliveryDueDateColor : const Color(0xFFFF2D78); + // ── Water Monitor ───────────────────────────────────────────────────────── static Color get blueColor => isDarkMode ? dark.blueColor : const Color(0xFF4EB5FF); static Color get blueGradientColorOne => isDarkMode ? dark.blueGradientColorOne : const Color(0xFFF1F7FD); @@ -217,6 +227,16 @@ class AppColorsDark { Color get myChildVaccineCardColor => const Color(0xFFFF2D78); Color get bookAppointment => const Color(0xFF415364); + // Health Calculators + Color get bmiCalculatorColor => const Color(0xFFF43333); + Color get caloriesCalculatorColor => const Color(0xFF0B85F7); + Color get bmrCalculatorColor => const Color(0xFF18C273); + Color get idealBodyWeightColor => const Color(0xFFFF8012); + Color get bodyFatCalculatorColor => const Color(0xFFFF5662); + Color get carbsProteinFatColor => const Color(0xFF18C273); + Color get ovulationPeriodColor => const Color(0xFFFF47A9); + Color get deliveryDueDateColor => const Color(0xFFFF2D78); + // Water Monitor Color get blueColor => const Color(0xFF4EB5FF); Color get blueGradientColorOne => const Color(0xFF101C2A); diff --git a/lib/widgets/common_bottom_sheet.dart b/lib/widgets/common_bottom_sheet.dart index d47971d7..267fb5c5 100644 --- a/lib/widgets/common_bottom_sheet.dart +++ b/lib/widgets/common_bottom_sheet.dart @@ -20,7 +20,12 @@ class BottomSheetUtils { showReminderBottomSheet(BuildContext context, DateTime dateTime, String doctorName, String eventId, String appoDateFormatted, String appoTimeFormatted, {required Function() onSuccess, String? title, String? description, Function(int)? onMultiDateSuccess, bool isMultiAllowed = false}) async { if (Platform.isAndroid) { - if (await PermissionService.isCalendarPermissionEnabled()) { + bool hasPermission = await PermissionService.isCalendarPermissionEnabled(); + if (!hasPermission) { + PermissionStatus status = await Permission.calendarFullAccess.request(); + hasPermission = status.isGranted; + } + if (hasPermission) { _showReminderBottomSheet(context, dateTime, doctorName, eventId, appoDateFormatted, appoTimeFormatted, onSuccess: onSuccess, title: title, description: description, onMultiDateSuccess: onMultiDateSuccess, isMultiAllowed: isMultiAllowed); } else { From f199fca85969d4054cc7fee4e9f3d60f789e8a2f Mon Sep 17 00:00:00 2001 From: aamir-csol Date: Mon, 13 Apr 2026 17:00:21 +0300 Subject: [PATCH 13/45] health calculator design & timer & bell icon switch changes --- .../appointment_details_page.dart | 78 +++++++++---------- 1 file changed, 39 insertions(+), 39 deletions(-) diff --git a/lib/presentation/appointments/appointment_details_page.dart b/lib/presentation/appointments/appointment_details_page.dart index a0fdb2c9..c5c82de1 100644 --- a/lib/presentation/appointments/appointment_details_page.dart +++ b/lib/presentation/appointments/appointment_details_page.dart @@ -46,6 +46,7 @@ import 'package:hmg_patient_app_new/widgets/chip/app_custom_chip_widget.dart'; import 'package:hmg_patient_app_new/widgets/common_bottom_sheet.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:lottie/lottie.dart'; import 'package:map_launcher/map_launcher.dart'; import 'package:permission_handler/permission_handler.dart'; import 'package:provider/provider.dart'; @@ -1390,46 +1391,45 @@ class _AppointmentDetailsPageState extends State { return Column( crossAxisAlignment: CrossAxisAlignment.center, children: [ - // Message text - LocaleKeys.upcomingPaymentPending.tr(context: context).toText14( - color: AppColors.textColor, - isCenter: true, - ), - SizedBox(height: 24.h), - // Countdown Timer - DD : HH : MM : SS format with labels - Always LTR - Directionality( - textDirection: ui.TextDirection.ltr, - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - // Days - _buildTimeUnit( - _timeRemaining != null ? _timeRemaining!.inDays.toString().padLeft(2, '0') : '00', - LocaleKeys.days.tr(context: context), - ), - _buildTimeSeparator(), - // Hours - _buildTimeUnit( - _timeRemaining != null ? _timeRemaining!.inHours.remainder(24).toString().padLeft(2, '0') : '00', - LocaleKeys.hours.tr(context: context), - ), - _buildTimeSeparator(), - // Minutes - _buildTimeUnit( - _timeRemaining != null ? _timeRemaining!.inMinutes.remainder(60).toString().padLeft(2, '0') : '00', - LocaleKeys.minutes.tr(context: context), - ), - _buildTimeSeparator(), - // Seconds - _buildTimeUnit( - _timeRemaining != null ? _timeRemaining!.inSeconds.remainder(60).toString().padLeft(2, '0') : '00', - LocaleKeys.seconds.tr(context: context), - ), - ], - ), - ), + Lottie.asset(AppAnimations.warningAnimation, + repeat: false, reverse: false, frameRate: FrameRate(60), width: 100.h, height: 100.h, fit: BoxFit.fill), + SizedBox(height: 12,), + LocaleKeys.upcomingPaymentPending.tr(context: context).toText14(color: AppColors.textColor, isCenter: true), SizedBox(height: 24.h), + // // Countdown Timer - DD : HH : MM : SS format with labels - Always LTR + // Directionality( + // textDirection: ui.TextDirection.ltr, + // child: Row( + // mainAxisAlignment: MainAxisAlignment.center, + // crossAxisAlignment: CrossAxisAlignment.start, + // children: [ + // // Days + // _buildTimeUnit( + // _timeRemaining != null ? _timeRemaining!.inDays.toString().padLeft(2, '0') : '00', + // LocaleKeys.days.tr(context: context), + // ), + // _buildTimeSeparator(), + // // Hours + // _buildTimeUnit( + // _timeRemaining != null ? _timeRemaining!.inHours.remainder(24).toString().padLeft(2, '0') : '00', + // LocaleKeys.hours.tr(context: context), + // ), + // _buildTimeSeparator(), + // // Minutes + // _buildTimeUnit( + // _timeRemaining != null ? _timeRemaining!.inMinutes.remainder(60).toString().padLeft(2, '0') : '00', + // LocaleKeys.minutes.tr(context: context), + // ), + // _buildTimeSeparator(), + // // Seconds + // _buildTimeUnit( + // _timeRemaining != null ? _timeRemaining!.inSeconds.remainder(60).toString().padLeft(2, '0') : '00', + // LocaleKeys.seconds.tr(context: context), + // ), + // ], + // ), + // ), + // SizedBox(height: 24.h), // Green Acknowledge button with checkmark icon CustomButton( text: LocaleKeys.acknowledged.tr(context: context), From 2f4db29a700d58d91ab5e9815a6c5d17dc9973ed Mon Sep 17 00:00:00 2001 From: Sultan khan Date: Mon, 13 Apr 2026 17:08:43 +0300 Subject: [PATCH 14/45] arabic updated. --- assets/langs/ar-SA.json | 20 +- assets/langs/en-US.json | 2 + lib/generated/codegen_loader.g.dart | 48 +- lib/generated/locale_kesy.g.dart | 1729 +++++++++++++++++ .../home/widgets/habib_wallet_card.dart | 4 +- 5 files changed, 1776 insertions(+), 27 deletions(-) create mode 100644 lib/generated/locale_kesy.g.dart diff --git a/assets/langs/ar-SA.json b/assets/langs/ar-SA.json index 01a53ed1..f491be4d 100644 --- a/assets/langs/ar-SA.json +++ b/assets/langs/ar-SA.json @@ -198,6 +198,7 @@ "enterEmail": "يرجى إدخال البريد الإلكتروني", "family": "عائلتي", "familyTitle": "ملفات عائلتي", + "familyTitle2": "ملفات العائلة", "myFamily": "عائلتي", "addNewMember": "إضافة فرد جديد للعائلة", "sentRequests": "الطلبات المرسلة", @@ -218,7 +219,7 @@ "unit": "الوحدة", "request": "طلب", "memberName": "اسم العضو", - "switchLogin": "تبديل", + "switchLogin": "عرض", "removeMember": "إزالة", "allowView": "السماح", "rejectView": "رفض", @@ -487,7 +488,7 @@ "shareReview": "شارك التقييم", "review": " التقييمات", "viewMedicalFile": "عرض التفاصيل", - "viewAllServices": "عرض جميع الخدمات", + "viewAllServices": "جميع الخدمات", "medicalFile": "الملف الطبي", "verified": "تم التحقق", "checkup": "فحص", @@ -929,7 +930,7 @@ "vat15": "ضريبة القيمة المضافة 15%", "general": "عام", "liveCare": "لايف كير", - "recentVisits": "الزيارات الأخيرة", + "recentVisits": "قائمة الزيارات", "favouriteDoctors": "الأطباء المفضلون", "searchByClinic": "البحث حسب العيادة", "tapToSelectClinic": "انقر لاختيار العيادة", @@ -1230,6 +1231,7 @@ "hmgServices": "خدمات مجموعة الحبيب الطبية", "personalServices": "الخدمات الشخصية", "habibWallet": "محفظة الحبيب", + "habibWallet2": "المحفظة", "loginToViewWalletBalance": "سجل الدخول لعرض رصيد محفظتك", "recharge": "إعادة الشحن", "loginToViewMedicalFile": "سجل الدخول لعرض ملفك الطبي", @@ -1288,7 +1290,7 @@ "referenceRange": "النطاق المرجعي", "downloadReport": "تنزيل التقرير", "generatingReport": "جارٍ إنشاء التقرير، يرجى الانتظار...", - "noLabResults": "ليس لديك أي نتائج مختبرية حتى الآن.", + "noLabResults": "لا يوجد نتائج", "labResultDetails": "تفاصيل نتائج المختبر", "resultOf": "نتيجة", "whatIsThisResult": "ما هي هذه النتيجة؟", @@ -1553,14 +1555,14 @@ "bmi": "مؤشر كتلة الجسم", "yesPleaseINeedHelp": "نعم، من فضلك أريد المساعدة", "aiOverView": "AI ملخص", - "generateAiAnalysis": "قم بإجراء تحليل لهذا الطلب AI", + "generateAiAnalysis": "التحليل باستخدام الذكاء الاصطناعي", "aiAnalysis": "AI تحليل", - "prediction": "تنبؤ", + "prediction": "التوقعات", "prevention": "وقاية", "disclaimer": "تنصل", "thisAboveInfo": "المعلومات المذكورة أعلاه مُولّدة بواسطة AI بناءً على نتائج تحاليلك المخبرية، وهي لأغراض إعلامية فقط. لا ينبغي اعتبارها تشخيصًا طبيًا أو خطة علاجية. استشر طبيبك دائمًا للحصول على نصيحة طبية مُخصصة قبل اتخاذ أي قرارات تتعلق بصحتك.", "aiDisclaimer": "سيتم مشاركة بيانات نتائج تحاليلك المخبرية بشكل آمن مع خدمة الذكاء الاصطناعي لدينا لتحليلها. يساعد هذا في تقديم رؤى صحية مُخصصة. هل ترغب في المتابعة؟", - "consent": "موافقة", + "consent": "نتائج المختبر", "bmiNormalDescription": "مؤشر كتلة جسمك ضمن المعدل الصحي. استمر في اتباع نظام غذائي متوازن، وممارسة النشاط البدني بانتظام، وإجراء الفحوصات الدورية للحفاظ على صحة جيدة. راقب أي تغييرات ملحوظة مع مرور الوقت.", "bmiUnderweightDescription": "يشير مؤشر كتلة الجسم إلى أنك تعاني من نقص الوزن. لذا، يُنصح بزيادة السعرات الحرارية المتناولة من خلال تناول الأطعمة الغنية بالعناصر الغذائية، وممارسة تمارين المقاومة لبناء العضلات، واستشارة أخصائي رعاية صحية للتحقق من وجود أسباب كامنة.", "bmiOverweightDescription": "يشير مؤشر كتلة الجسم إلى زيادة الوزن. لذا، يُنصح بالسعي إلى إنقاص الوزن تدريجياً وبشكل مستدام من خلال تقليل السعرات الحرارية بشكل معتدل، وممارسة النشاط البدني بانتظام، واختيار الأطعمة الصحية. استشر طبيبك قبل إجراء أي تغييرات جذرية في نمط حياتك.", @@ -1636,7 +1638,7 @@ "insuranceRequestSubmittedSuccessfully": "تم إرسال طلب تحديث بيانات التأمين بنجاح. سيتم إعلامك بمجرد الانتهاء.", "updatingEmailAddress": "جارٍ تحديث عنوان البريد الإلكتروني، يرجى الانتظار...", "verifyInsurance": "التحقق من التأمين", - "tests": "تحليل", + "tests": "تحاليل", "calendarPermissionAlert": "يرجى منح إذن الوصول إلى التقويم من إعدادات التطبيق لضبط تذكير تناول الدواء.", "sortByNearestLocation": "فرز حسب الأقرب إلى موقعك", "giveLocationPermissionForNearestList": "يرجى منح إذن الوصول إلى الموقع من إعدادات التطبيق لعرض أقرب المواقع.", @@ -1664,7 +1666,7 @@ "homeHealthCareServiceHeader": "صحتك، في أبهى صورها. رعاية فائقة الجودة، تصلك إلى عتبة دارك.", "homeHealthCareServiceDescription": "نقدم لكم رعاية صحية عالية الجودة تصلكم إلى عتبة منزلكم. ممرضات ذوات خبرة يقدمون رعاية حانية في راحة منزلكم.", "profileOnlyText": "الملف الشخصي", - "information": "معلومه", + "information": "معلومات الطبيب", "noFavouriteDoctors": "ليس لديك أي قائمة مفضلة حتى الآن", "addDoctors": "إضافة الأطباء", "favouriteList": "قائمة المفضلة", diff --git a/assets/langs/en-US.json b/assets/langs/en-US.json index ca64e0a9..d9773a81 100644 --- a/assets/langs/en-US.json +++ b/assets/langs/en-US.json @@ -196,6 +196,7 @@ "enterEmail": "Please Enter Email", "family": "My Family", "familyTitle": "My Family Files", + "familyTitle2": "My Family Files", "addNewMember": "Add Family Member", "sentRequests": "Sent Requests", "recievedRequests": "Recieved Requests", @@ -1220,6 +1221,7 @@ "hmgServices": "HMG Services", "personalServices": "Personal Services", "habibWallet": "Habib Wallet", + "habibWallet2": "Habib Wallet", "loginToViewWalletBalance": "Login to view your wallet balance", "loginToViewMedicalFile": "Login to view your medical file", "addMember": "Add Member", diff --git a/lib/generated/codegen_loader.g.dart b/lib/generated/codegen_loader.g.dart index 7722c8d8..1ac71827 100644 --- a/lib/generated/codegen_loader.g.dart +++ b/lib/generated/codegen_loader.g.dart @@ -85,7 +85,7 @@ class CodegenLoader extends AssetLoader{ "date": "التاريخ", "time": "الوقت", "pendingPayment": "معلق للدفع", - "payNow": "ادفع الآن", + "payNow": "الدفع", "viewQR": "عرض رمز الاستجابة السريعة", "instruction": "تعليمات", "livecare": "لايف كير", @@ -99,6 +99,8 @@ class CodegenLoader extends AssetLoader{ "bookSuccessConfirmMore2412": "ستكون عملية الدفع عبر الإنترنت متاحة قبل 24 ساعة ��ن الموعد.", "upcomingPaymentPending": "سيتم تفعيل الدفع عبر الإنترنت قبل 24 ساعة من موعد الموعد", "upcomingPaymentNow": "ادفع عبر الإنترنت الآن لتجنب الانتظار الطويل", + "timeUntilAppointment": "الوقت المتبقي حتى الموعد", + "appointmentTimePassed": "انتهى وقت الموعد", "upcomingQR": "استخدم رمز الاستجابة السريعة لتسجيل الوصول في المستشفى", "upcomingVirtual": "هذا موعد افتراضي، يرجى الالتزام بالتعليمات لتجربة سلسة.", "upcomingLivecare": "هذا موعد لايف كير", @@ -187,9 +189,9 @@ class CodegenLoader extends AssetLoader{ "emailSentError": "خطأ في إرسال البريد الإلكتروني", "close": "إغلاق", "closeIt": "أغلق", - "booked": "محجوز", + "booked": "تم الحجز", "confirmed": "مؤكد", - "arrived": "وصل", + "arrived": " تم الوصول", "payNowBookSuccess": "ادفع الآن عبر تطبيق الحبيب", "payNowBookSuccesstext1": "ادفع الآن باستخدام خدمة الدفع عبر الإنترنت من بوابات الدفع الآمنة", "payNowBookSuccesstext2": "يمكنك أيضًا الدفع لاحقًا عبر الدفع الإلكتروني أو في المستشفى.", @@ -289,7 +291,7 @@ class CodegenLoader extends AssetLoader{ "parkingDescription": "خدمة المواقف هي لك لمسح موقع السيارة حتى تتمكن من العثور عليها بسهولة عند مغادرتك. انقر على زر (مسح الموقف) لحفظ موقع الموقف، ثم سيظهر زر (عرض موقفي) لإظهار الطريق إلى الموقف. إذا كنت ترغب في إعادة مسح موقف السيارة QR فقط انقر على (مسح بياناتي).", "appointments": "المواعيد", "all2": "الكل", - "checkinOption": "تسجيل الوصول", + "checkinOption": "تسجيل الحضور", "readBarcode": "قراءة الكود", "showMyPark": "عرض الموقف", "clearMyData": "امسح البيانات", @@ -311,7 +313,7 @@ class CodegenLoader extends AssetLoader{ "radiology": "الأشعة", "radiologySubtitle": "النتيجة", "lab": "المختبر", - "labSubtitle": "النتائج", + "labSubtitle": "نتائج", "medicines": "الأدوية", "medicinesSubtitle": "الوصفات", "vitalSigns": "علامات حيوية", @@ -327,9 +329,11 @@ class CodegenLoader extends AssetLoader{ "myMedicalSubtitle": "الأدوية", "myDoctor": "أطبائي", "myDoctorSubtitle": "القائمة", + "myDoctorSubtitle2": "قائمة", "eye": "العين", "eyeSubtitle": "القياس", "insurance": "التأمين", + "insurance2": "تأمين", "insuranceSubtitle": "البطاقة", "updateInsurance": "تحديث", "updateInsuranceSubtitle": "التأمين", @@ -344,6 +348,7 @@ class CodegenLoader extends AssetLoader{ "monthly": "شهري", "monthlySubtitle": "التقرير", "sick": "مريض", + "sick2": "المريضة", "sickSubtitle": "الإجازات", "myBalance": "رصيدي", "myBalanceSubtitle": "الرصيد", @@ -497,7 +502,7 @@ class CodegenLoader extends AssetLoader{ "shareReview": "شارك التقييم", "review": " التقييمات", "viewMedicalFile": "عرض التفاصيل", - "viewAllServices": "عرض جميع الخدمات", + "viewAllServices": "جميع الخدمات", "medicalFile": "الملف الطبي", "verified": "تم التحقق", "checkup": "فحص", @@ -506,9 +511,11 @@ class CodegenLoader extends AssetLoader{ "refferalTitle": "إحالة إلكترونية", "refferalSubTitle": "الخدمة", "healthCare": "الرعاية الصحية", - "emergency": "حالة طوارئ", + "emergency": "طوارئ", + "emergency2": "الطوارئ", "erservices": "خدمات الطوارئ", "services2": "الخدمات", + "services3": "خدمات", "cantSeeProfile": "لرؤية ملفك الطبي، يرجى تسجيل الدخول أو التسجيل الآن", "loginRegisterNow": "تسجيل الدخول أو التسجيل الآن", "hmgPharmacy": "صيدلية الحبيب", @@ -779,6 +786,7 @@ class CodegenLoader extends AssetLoader{ "erConsultation": "تتيح لك هذه الخدمة إجراء استشارة افتراضية عبر الإنترنت عبر مكالمة فيديو مباشرة مع الطبيب من أي مكان وفي أي وقت.", "myInvoice": "القائمة", "invoiceList": "فواتيري", + "invoiceList2": "فواتيري", "allInvoices": "كل الفواتير", "hospitals": "المستشفيات", "clinics": "العيادات", @@ -902,7 +910,7 @@ class CodegenLoader extends AssetLoader{ "to": "إلى", "startDate": "تاريخ البدء", "endDate": "تاريخ الانتهاء", - "walkin": "زيارة بدون موعد", + "walkin": "بدون موعد", "laserClinic": "عيادة الليزر", "continueString": "يكمل", "covid_info": "تجري مستشفيات د. سليمان الحبيب فحص فيروس كورونا المستجد وتصدر شهادات السفر على مدار الساعة، طوال أيام الأسبوع، وبسرعة ودقة عالية. يمكن للراغبين في الاستفادة من هذه الخدمة زيارة أحد فروع مستشفيات د. سليمان الحبيب وإجراء فحص كورونا خلال بضع دقائق والحصول على النتائج خلال عدة ساعات خدمة فحص فيروس كورونا Covid 19 بتقنية PCR للكشف عن الفيروس وفقاً لأعلى المعايير العالمية وبأحدث أجهزة RT-PCR عالية الدقة (GeneXpert الأمريكي وغيره)، وهي طرق معتمدة من قبل هيئة الغذاء والدواء وكذلك من قبل المركز السعودي للوقاية من الأمراض المُعدية", @@ -944,7 +952,7 @@ class CodegenLoader extends AssetLoader{ "immediateConsultation": "استشارة فورية", "scheduledConsultation": "استشارة مجدولة", "pharmaLiveCare": "لايف كير الصيدلية", - "notSureHelpMeChooseClinic": "غير متأكد؟ ساعدني في اختيار عيادة!", + "notSureHelpMeChooseClinic": "هل تريد مساعدة في اختيار العياة؟", "mentionYourSymptomsAndFindDoctors": "اذكر أعراضك واعثر على قائمة الأطباء وفقاً لذلك", "immediateService": "خدمة فورية", "noNeedToWaitGetMedicalConsultation": "لا حاجة للانتظار، ستحصل على استشارة طبية فورية عبر مكالمة فيديو", @@ -954,7 +962,7 @@ class CodegenLoader extends AssetLoader{ "freeMedicineDelivery": "توصيل مجاني للأدوية", "offersFreeMedicineDelivery": "يوفر توصيل مجاني للأدوية لموعد لايف كير", "dentalChiefComplaints": "الشكاوى الرئيسة للأسنان", - "viewAvailableAppointments": "عرض المواعيد المتاحة", + "viewAvailableAppointments": "المواعيد المتاحة", "doctorProfile": " ملف الطبيب", "waitingAppointment": "موعد الانتظار", "hospitalInformation": "معلومات المستشفى", @@ -1008,7 +1016,7 @@ class CodegenLoader extends AssetLoader{ "processingCheckIn": "جاري معالجة تسجيل الحضور...", "bookingWaitingAppointment": "جاري حجز موعد الانتظار، يرجى الانتظار...", "enterValidIDorIqama": "يرجى إدخال رقم هوية وطنية أو رقم ملف صالح", - "selectAppointment": "حدد الموعد", + "selectAppointment": "اختر الموعد", "rebookSameDoctor": "أعد الحجز مع نفس الطبيب", "queueing": "قائمة الانتظار", "inQueue": "في قائمة الانتظار", @@ -1233,6 +1241,7 @@ class CodegenLoader extends AssetLoader{ "hmgServices": "خدمات مجموعة الحبيب الطبية", "personalServices": "الخدمات الشخصية", "habibWallet": "محفظة الحبيب", + "habibWallet2": "المحفظة", "loginToViewWalletBalance": "سجل الدخول لعرض رصيد محفظتك", "loginToViewMedicalFile": "سجل الدخول لعرض ملفك الطبي", "addMember": "إضافة عضو", @@ -1302,7 +1311,7 @@ class CodegenLoader extends AssetLoader{ "rebook": "إعادة الحجز", "noOphthalmologyAppointments": "لم يتم العثور على أي مواعيد في قسم طب العيون...", "noVitalSignsRecordedYet": "لا توجد علامات حيوية مسجلة بعد", - "appointmentsAndVisits": "المواعيد والزيارات", + "appointmentsAndVisits": "المواعيد", "labAndRadiology": "المختبر والأشعة", "activeMedicationsAndPrescriptions": "الوصفات الطبية", "allPrescriptions": "جميع الوصفات", @@ -1463,7 +1472,7 @@ class CodegenLoader extends AssetLoader{ "beforeSyncingDataFollowInstructions": "قبل مزامنة البيانات، يرجى التأكد من اتباع التعليمات بشكل صحيح.", "viewWatchInstructions": "عرض تعليمات الساعة", "healthConnectAppNotInstalled": "يبدو أنه ليس لديك تطبيق Health Connect مثبتًا. يرجى تثبيته من متجر Play لمزامنة بيانات صحتك.", - "setTimerOfReminder": "ضبط مؤقت التذكير", + "setTimerOfReminder": "ضبط التذكير", "youHaveAppointmentWithDr": "لديك موعد مع د. ", "hours": "ساعات", "minutes": "دقائق", @@ -1477,6 +1486,7 @@ class CodegenLoader extends AssetLoader{ "distanceDescription": "المسافة المقطوعة على مدار اليوم", "overview": "نظرة عامة", "details": "التفاصيل", + "details2": "تفاصيل", "healthy": "صحي", "warning": "تحذير", "vitalSignDetails": "تفاصيل العلامات الحيوية", @@ -1526,7 +1536,7 @@ class CodegenLoader extends AssetLoader{ "notifyMeBeforeConsumptionTime": "أبلغني قبل وقت الاستهلاك", "noMedicationsToday": "لا أدوية اليوم", "reminders": "تذكيرات", - "reminderAddedToCalendar": "تمت إضافة تذكير إلى التقويم ✅", + "reminderAddedToCalendar": "تمت إضافة تذكير إلى التقويم ", "errorWhileSettingCalendar": "حدث خطأ أثناء ضبط التقويم:{error}", "instructions": "التعليمات", "requests": "الطلبات", @@ -1661,7 +1671,7 @@ class CodegenLoader extends AssetLoader{ "homeHealthCareServiceHeader": "صحتك، في أبهى صورها. رعاية فائقة الجودة، تصلك إلى عتبة دارك.", "homeHealthCareServiceDescription": "نقدم لكم رعاية صحية عالية الجودة تصلكم إلى عتبة منزلكم. ممرضات ذوات خبرة يقدمون رعاية حانية في راحة منزلكم.", "profileOnlyText": "الملف الشخصي", - "information": "معلومة", + "information": "معلومات الطبيب", "noFavouriteDoctors": "ليس لديك أي قائمة مفضلة حتى الآن", "addDoctors": "إضافة الأطباء", "favouriteList": "قائمة المفضلة", @@ -1800,7 +1810,7 @@ static const Map _en_US = { "date": "Date", "time": "Time", "pendingPayment": "Pending for payment", - "payNow": "Pay Now", + "payNow": "Payment", "viewQR": "View QR Code", "instruction": "Instructions", "livecare": "LiveCare", @@ -2042,6 +2052,7 @@ static const Map _en_US = { "myMedicalSubtitle": "Medications", "myDoctor": "My Doctors", "myDoctorSubtitle": "List", + "myDoctorSubtitle2": "List", "eye": "Eye", "eyeSubtitle": "Measurement", "insurance": "Insurance", @@ -2059,6 +2070,7 @@ static const Map _en_US = { "monthly": "Monthly", "monthlySubtitle": "Report", "sick": "Sick", + "sick2": "Sick", "sickSubtitle": "Leaves", "myBalance": "My Balance", "myBalanceSubtitle": "Credit", @@ -2216,8 +2228,10 @@ static const Map _en_US = { "refferalSubTitle": "Service", "healthCare": "Health Care", "emergency": "Emergency", + "emergency2": "Emergency", "erservices": "Emergency", "services2": "Services", + "services3": "Services", "cantSeeProfile": "To view your medical profile, please log in or register now", "loginRegisterNow": "Login or Register Now", "hmgPharmacy": "HMG Pharmacy", @@ -2489,6 +2503,7 @@ static const Map _en_US = { "erConsultation": "This service allows you to make an online virtual consultation via video call directly with the doctor from anywhere at any time.", "myInvoice": "List", "invoiceList": "My Invoice", + "invoiceList2": "My Invoice", "allInvoices": "All Invoices", "hospitals": "Hospitals", "clinics": "Clinics", @@ -3189,6 +3204,7 @@ static const Map _en_US = { "distanceDescription": "Distance covered throughout the day", "overview": "Overview", "details": "Details", + "details2": "Details", "healthy": "Healthy", "warning": "Warning", "vitalSignDetails": "Vital Sign Details", diff --git a/lib/generated/locale_kesy.g.dart b/lib/generated/locale_kesy.g.dart new file mode 100644 index 00000000..41bfb2b0 --- /dev/null +++ b/lib/generated/locale_kesy.g.dart @@ -0,0 +1,1729 @@ +// DO NOT EDIT. This is code generated via package:easy_localization/generate.dart + +// ignore_for_file: constant_identifier_names + +abstract class LocaleKeys { + static const english = 'english'; + static const arabic = 'arabic'; + static const login = 'login'; + static const noDataAvailable = 'noDataAvailable'; + static const noRatingAvailable = 'noRatingAvailable'; + static const doctorDoesNotHaveRating = 'doctorDoesNotHaveRating'; + static const confirm = 'confirm'; + static const loadingText = 'loadingText'; + static const kilometerUnit = 'kilometerUnit'; + static const dashboardScreenToolbarTitle = 'dashboardScreenToolbarTitle'; + static const settings = 'settings'; + static const language = 'language'; + static const lanEnglish = 'lanEnglish'; + static const lanArabic = 'lanArabic'; + static const cancel = 'cancel'; + static const done = 'done'; + static const replay2 = 'replay2'; + static const home = 'home'; + static const services = 'services'; + static const mySchedule = 'mySchedule'; + static const logout = 'logout'; + static const respirationRate = 'respirationRate'; + static const bookAppo = 'bookAppo'; + static const searchBy = 'searchBy'; + static const clinic = 'clinic'; + static const byClinic = 'byClinic'; + static const hospital = 'hospital'; + static const byHospital = 'byHospital'; + static const name = 'name'; + static const doctor = 'doctor'; + static const clinicName = 'clinicName'; + static const hospitalName = 'hospitalName'; + static const noClinicFound = 'noClinicFound'; + static const doctorName = 'doctorName'; + static const nearestAppo = 'nearestAppo'; + static const searchByDocText = 'searchByDocText'; + static const enterDocName = 'enterDocName'; + static const search = 'search'; + static const noResultFound = 'noResultFound'; + static const noSearchResultFound = 'noSearchResultFound'; + static const pleaseEnterProductName = 'pleaseEnterProductName'; + static const bookNow = 'bookNow'; + static const docInfo = 'docInfo'; + static const appoInfo = 'appoInfo'; + static const availableAppo = 'availableAppo'; + static const gender = 'gender'; + static const nationality = 'nationality'; + static const neverWait = 'neverWait'; + static const reminderTitle = 'reminderTitle'; + static const appointmentCalendar = 'appointmentCalendar'; + static const appointmentSuccess = 'appointmentSuccess'; + static const docQualifications = 'docQualifications'; + static const pressAgain = 'pressAgain'; + static const laserMaxLimitReach = 'laserMaxLimitReach'; + static const confirmAppoHeading = 'confirmAppoHeading'; + static const patientInfo = 'patientInfo'; + static const doctorFilter = 'doctorFilter'; + static const bookSuccess = 'bookSuccess'; + static const patientShare = 'patientShare'; + static const patientShareWithTax = 'patientShareWithTax'; + static const confirmAppo = 'confirmAppo'; + static const confirmLiveCare = 'confirmLiveCare'; + static const waitingForDoctor = 'waitingForDoctor'; + static const appointment = 'appointment'; + static const confirmLater = 'confirmLater'; + static const todoList = 'todoList'; + static const appoActions = 'appoActions'; + static const date = 'date'; + static const time = 'time'; + static const pendingPayment = 'pendingPayment'; + static const payNow = 'payNow'; + static const viewQR = 'viewQR'; + static const instruction = 'instruction'; + static const livecare = 'livecare'; + static const livecareAppo = 'livecareAppo'; + static const agreeTo = 'agreeTo'; + static const termsConditoins = 'termsConditoins'; + static const cancelAppoMsg = 'cancelAppoMsg'; + static const changePayment = 'changePayment'; + static const upcomingNoAction = 'upcomingNoAction'; + static const upcomingConfirm = 'upcomingConfirm'; + static const bookSuccessConfirmMore2412 = 'bookSuccessConfirmMore2412'; + static const upcomingPaymentPending = 'upcomingPaymentPending'; + static const upcomingPaymentNow = 'upcomingPaymentNow'; + static const timeUntilAppointment = 'timeUntilAppointment'; + static const appointmentTimePassed = 'appointmentTimePassed'; + static const upcomingQR = 'upcomingQR'; + static const upcomingVirtual = 'upcomingVirtual'; + static const upcomingLivecare = 'upcomingLivecare'; + static const upcomingDetails = 'upcomingDetails'; + static const reschedule = 'reschedule'; + static const raise = 'raise'; + static const complaint = 'complaint'; + static const add = 'add'; + static const reminder = 'reminder'; + static const location = 'location'; + static const online = 'online'; + static const payment = 'payment'; + static const onlinePayment = 'onlinePayment'; + static const onlinePaymentSubtitle = 'onlinePaymentSubtitle'; + static const cancelNocaps = 'cancelNocaps'; + static const setReminder = 'setReminder'; + static const nationalIdNumber = 'nationalIdNumber'; + static const medicalFileNumber = 'medicalFileNumber'; + static const loginregister = 'loginregister'; + static const poweredBy = 'poweredBy'; + static const welcome = 'welcome'; + static const welcomeToDrSulaiman = 'welcomeToDrSulaiman'; + static const patientApp = 'patientApp'; + static const welcomeText = 'welcomeText'; + static const drSulaimanText = 'drSulaimanText'; + static const welcomeText2 = 'welcomeText2'; + static const yes = 'yes'; + static const no = 'no'; + static const logintyperadio = 'logintyperadio'; + static const registernow = 'registernow'; + static const nationalID = 'nationalID'; + static const nationalId = 'nationalId'; + static const fileNo = 'fileNo'; + static const fileno = 'fileno'; + static const forgotFileNo = 'forgotFileNo'; + static const forgotFileNoTitle = 'forgotFileNoTitle'; + static const enterNationalId = 'enterNationalId'; + static const profileInfo = 'profileInfo'; + static const submit = 'submit'; + static const forgotDesc = 'forgotDesc'; + static const dob = 'dob'; + static const hijriDate = 'hijriDate'; + static const gregorianDate = 'gregorianDate'; + static const verifyLoginWith = 'verifyLoginWith'; + static const registerUser = 'registerUser'; + static const verifyWithFingerprint = 'verifyWithFingerprint'; + static const verifyWithFaceid = 'verifyWithFaceid'; + static const verifyWithSms = 'verifyWithSms'; + static const verifyWithWhatsapp = 'verifyWithWhatsapp'; + static const verifyThrough = 'verifyThrough'; + static const lastLogin = 'lastLogin'; + static const lastLoginWith = 'lastLoginWith'; + static const verifyFingerprint = 'verifyFingerprint'; + static const searchMedicine = 'searchMedicine'; + static const pharmaciesList = 'pharmaciesList'; + static const searchMedicineHere = 'searchMedicineHere'; + static const description = 'description'; + static const howToUse = 'howToUse'; + static const price = 'price'; + static const youCanFindItIn = 'youCanFindItIn'; + static const pleaseEnterMedicineName = 'pleaseEnterMedicineName'; + static const verificationMessage = 'verificationMessage'; + static const validationMessage = 'validationMessage'; + static const notification = 'notification'; + static const appSettings = 'appSettings'; + static const rateApp = 'rateApp'; + static const before = 'before'; + static const minute = 'minute'; + static const hour = 'hour'; + static const reminderSuccess = 'reminderSuccess'; + static const reminderCancelSuccess = 'reminderCancelSuccess'; + static const patientShareToDo = 'patientShareToDo'; + static const patientTaxToDo = 'patientTaxToDo'; + static const patientShareTotalToDo = 'patientShareTotalToDo'; + static const paymentMethod = 'paymentMethod'; + static const noNeedToWaitInLine = 'noNeedToWaitInLine'; + static const useQRAppoAttend = 'useQRAppoAttend'; + static const passQRAppoAttend = 'passQRAppoAttend'; + static const sitWaitingQR = 'sitWaitingQR'; + static const attendRegisterCode = 'attendRegisterCode'; + static const scanQRHospital = 'scanQRHospital'; + static const scanNFC = 'scanNFC'; + static const sendEmail = 'sendEmail'; + static const success = 'success'; + static const emailSentSuccessfully = 'emailSentSuccessfully'; + static const emailSentError = 'emailSentError'; + static const close = 'close'; + static const closeIt = 'closeIt'; + static const booked = 'booked'; + static const confirmed = 'confirmed'; + static const arrived = 'arrived'; + static const payNowBookSuccess = 'payNowBookSuccess'; + static const payNowBookSuccesstext1 = 'payNowBookSuccesstext1'; + static const payNowBookSuccesstext2 = 'payNowBookSuccesstext2'; + static const payLater = 'payLater'; + static const askDocNotAllowed = 'askDocNotAllowed'; + static const moreVerify = 'moreVerify'; + static const welcomeBack = 'welcomeBack'; + static const accountInfo = 'accountInfo'; + static const anotherAcc = 'anotherAcc'; + static const next = 'next'; + static const firstName = 'firstName'; + static const middleName = 'middleName'; + static const lastName = 'lastName'; + static const preferredLanguage = 'preferredLanguage'; + static const locationsRegister = 'locationsRegister'; + static const ksa = 'ksa'; + static const dubai = 'dubai'; + static const enterEmail = 'enterEmail'; + static const family = 'family'; + static const familyTitle = 'familyTitle'; + static const familyTitle2 = 'familyTitle2'; + static const myFamily = 'myFamily'; + static const addNewMember = 'addNewMember'; + static const sentRequests = 'sentRequests'; + static const recievedRequests = 'recievedRequests'; + static const manageFiles = 'manageFiles'; + static const oxygenation = 'oxygenation'; + static const bodyMeasurements = 'bodyMeasurements'; + static const temperature = 'temperature'; + static const pulse = 'pulse'; + static const respiration = 'respiration'; + static const bloodPressure = 'bloodPressure'; + static const painScale = 'painScale'; + static const weight = 'weight'; + static const height = 'height'; + static const heart = 'heart'; + static const heightUnit = 'heightUnit'; + static const weightUnit = 'weightUnit'; + static const unit = 'unit'; + static const request = 'request'; + static const memberName = 'memberName'; + static const switchLogin = 'switchLogin'; + static const removeMember = 'removeMember'; + static const allowView = 'allowView'; + static const rejectView = 'rejectView'; + static const deleteView = 'deleteView'; + static const approvals = 'approvals'; + static const approvalNo = 'approvalNo'; + static const companyName = 'companyName'; + static const receiptOn = 'receiptOn'; + static const expiryDate = 'expiryDate'; + static const expiryPoints = 'expiryPoints'; + static const expiryOn = 'expiryOn'; + static const procedureName = 'procedureName'; + static const procedure = 'procedure'; + static const procedureStatus = 'procedureStatus'; + static const usageStatus = 'usageStatus'; + static const unusedCount = 'unusedCount'; + static const totalApproval = 'totalApproval'; + static const category = 'category'; + static const expirationDate = 'expirationDate'; + static const patientCard = 'patientCard'; + static const policyNumber = 'policyNumber'; + static const seeDetails = 'seeDetails'; + static const insuranceCards = 'insuranceCards'; + static const requestType = 'requestType'; + static const registerInfoFamily = 'registerInfoFamily'; + static const removeFamilyMember = 'removeFamilyMember'; + static const myMedicalFile = 'myMedicalFile'; + static const myMedicalFileSubTitle = 'myMedicalFileSubTitle'; + static const viewMore = 'viewMore'; + static const homeHealthCareService = 'homeHealthCareService'; + static const onlinePharmacy = 'onlinePharmacy'; + static const emergencyService = 'emergencyService'; + static const onlinePaymentService = 'onlinePaymentService'; + static const offersAndPackages = 'offersAndPackages'; + static const comprehensiveMedicalCheckup = 'comprehensiveMedicalCheckup'; + static const hmgService = 'hmgService'; + static const viewAllHabibMedicalService = 'viewAllHabibMedicalService'; + static const viewAll = 'viewAll'; + static const view = 'view'; + static const contactUs = 'contactUs'; + static const contactUsLocation = 'contactUsLocation'; + static const contactUsTime = 'contactUsTime'; + static const viewAllWaysReachUs = 'viewAllWaysReachUs'; + static const medicalProfile = 'medicalProfile'; + static const consultation = 'consultation'; + static const logs = 'logs'; + static const textToSpeech = 'textToSpeech'; + static const locationDialogMessage = 'locationDialogMessage'; + static const userViewRequester = 'userViewRequester'; + static const userView = 'userView'; + static const parking = 'parking'; + static const alhabiServices = 'alhabiServices'; + static const parkingTitle = 'parkingTitle'; + static const parkingDescription = 'parkingDescription'; + static const appointments = 'appointments'; + static const all2 = 'all2'; + static const checkinOption = 'checkinOption'; + static const readBarcode = 'readBarcode'; + static const showMyPark = 'showMyPark'; + static const clearMyData = 'clearMyData'; + static const floor = 'floor'; + static const gate = 'gate'; + static const building = 'building'; + static const branch = 'branch'; + static const emergencyServices = 'emergencyServices'; + static const nearester = 'nearester'; + static const locationa = 'locationa'; + static const callNow = 'callNow'; + static const ambulancerequest = 'ambulancerequest'; + static const requestA = 'requestA'; + static const noBookedAppointments = 'noBookedAppointments'; + static const noConfirmedAppointments = 'noConfirmedAppointments'; + static const noArrivedAppointments = 'noArrivedAppointments'; + static const myAppointmentsList = 'myAppointmentsList'; + static const myAppointments = 'myAppointments'; + static const radiology = 'radiology'; + static const radiologySubtitle = 'radiologySubtitle'; + static const lab = 'lab'; + static const labSubtitle = 'labSubtitle'; + static const medicines = 'medicines'; + static const medicinesSubtitle = 'medicinesSubtitle'; + static const vitalSigns = 'vitalSigns'; + static const vitalSignsSubTitle = 'vitalSignsSubTitle'; + static const vitalSignNormal = 'vitalSignNormal'; + static const vitalSignLow = 'vitalSignLow'; + static const vitalSignHigh = 'vitalSignHigh'; + static const vitalSignObese = 'vitalSignObese'; + static const vitalSignOverweight = 'vitalSignOverweight'; + static const vitalSignUnderweight = 'vitalSignUnderweight'; + static const vitalSignSkinny = 'vitalSignSkinny'; + static const myMedical = 'myMedical'; + static const myMedicalSubtitle = 'myMedicalSubtitle'; + static const myDoctor = 'myDoctor'; + static const myDoctorSubtitle = 'myDoctorSubtitle'; + static const myDoctorSubtitle2 = 'myDoctorSubtitle2'; + static const eye = 'eye'; + static const eyeSubtitle = 'eyeSubtitle'; + static const insurance = 'insurance'; + static const insurance2 = 'insurance2'; + static const insuranceSubtitle = 'insuranceSubtitle'; + static const updateInsurance = 'updateInsurance'; + static const updateInsuranceSubtitle = 'updateInsuranceSubtitle'; + static const insuranceApproval = 'insuranceApproval'; + static const insuranceApprovalSubtitle = 'insuranceApprovalSubtitle'; + static const allergies = 'allergies'; + static const allergiesSubtitle = 'allergiesSubtitle'; + static const myVaccines = 'myVaccines'; + static const myVaccinesSubtitle = 'myVaccinesSubtitle'; + static const medical = 'medical'; + static const medicalSubtitle = 'medicalSubtitle'; + static const monthly = 'monthly'; + static const monthlySubtitle = 'monthlySubtitle'; + static const sick = 'sick'; + static const sick2 = 'sick2'; + static const sickSubtitle = 'sickSubtitle'; + static const myBalance = 'myBalance'; + static const myBalanceSubtitle = 'myBalanceSubtitle'; + static const patientCall = 'patientCall'; + static const patientCallSubtitle = 'patientCallSubtitle'; + static const smartWatches = 'smartWatches'; + static const smartWatchesSubtitle = 'smartWatchesSubtitle'; + static const myTrackers = 'myTrackers'; + static const myTrackersSubtitle = 'myTrackersSubtitle'; + static const askYour = 'askYour'; + static const askYourSubtitle = 'askYourSubtitle'; + static const internet = 'internet'; + static const internetSubtitle = 'internetSubtitle'; + static const chatbot = 'chatbot'; + static const chatbotSubtitle = 'chatbotSubtitle'; + static const timeLine = 'timeLine'; + static const labOrders = 'labOrders'; + static const billNo = 'billNo'; + static const prescriptions = 'prescriptions'; + static const history = 'history'; + static const orderNo = 'orderNo'; + static const orderDetails = 'orderDetails'; + static const deliveryDriverTrack = 'deliveryDriverTrack'; + static const deliveryLocation = 'deliveryLocation'; + static const driver = 'driver'; + static const vitalSign = 'vitalSign'; + static const monthlyReports = 'monthlyReports'; + static const km = 'km'; + static const km_ = 'km_'; + static const patientHealthSummaryReport = 'patientHealthSummaryReport'; + static const toViewTheTermsAndConditions = 'toViewTheTermsAndConditions'; + static const clickHere = 'clickHere'; + static const iAgreeToTheTermsAndConditions = 'iAgreeToTheTermsAndConditions'; + static const iAgreeToTheTermsAndConditionsSubtitle = 'iAgreeToTheTermsAndConditionsSubtitle'; + static const save = 'save'; + static const userAgreement = 'userAgreement'; + static const updateSuccessfully = 'updateSuccessfully'; + static const checkVaccineAvailability = 'checkVaccineAvailability'; + static const myVaccinesAvailability = 'myVaccinesAvailability'; + static const paymentService = 'paymentService'; + static const paymentOnline = 'paymentOnline'; + static const onlineCheckIn = 'onlineCheckIn'; + static const myBalances = 'myBalances'; + static const myWallet = 'myWallet'; + static const balanceAmount = 'balanceAmount'; + static const totalBalance = 'totalBalance'; + static const createAdvancedPayment = 'createAdvancedPayment'; + static const advancePayment = 'advancePayment'; + static const advancePaymentLabel = 'advancePaymentLabel'; + static const fileNumber = 'fileNumber'; + static const amount = 'amount'; + static const depositorEmail = 'depositorEmail'; + static const notes = 'notes'; + static const selectPatientName = 'selectPatientName'; + static const selectFamilyPatientName = 'selectFamilyPatientName'; + static const selectHospital = 'selectHospital'; + static const selectCity = 'selectCity'; + static const city = 'city'; + static const distance = 'distance'; + static const myAccount = 'myAccount'; + static const otherAccount = 'otherAccount'; + static const selectBeneficiary = 'selectBeneficiary'; + static const confirmThePayment = 'confirmThePayment'; + static const depositorName = 'depositorName'; + static const mobileNumber = 'mobileNumber'; + static const phoneNumber = 'phoneNumber'; + static const country = 'country'; + static const ok = 'ok'; + static const averageWaitingTime = 'averageWaitingTime'; + static const waitingTime = 'waitingTime'; + static const waterConsumedInWeek = 'waterConsumedInWeek'; + static const waterConsumedInMonth = 'waterConsumedInMonth'; + static const theVerificationCodeExpiresIn = 'theVerificationCodeExpiresIn'; + static const pleaseEnterTheVerificationCode = 'pleaseEnterTheVerificationCode'; + static const eyeMeasurements = 'eyeMeasurements'; + static const measurements = 'measurements'; + static const classes = 'classes'; + static const contactLens = 'contactLens'; + static const rightEye = 'rightEye'; + static const sphere = 'sphere'; + static const cylinder = 'cylinder'; + static const axis = 'axis'; + static const prism = 'prism'; + static const va = 'va'; + static const leftEye = 'leftEye'; + static const brand = 'brand'; + static const power = 'power'; + static const diameter = 'diameter'; + static const remarks = 'remarks'; + static const activeMedications = 'activeMedications'; + static const expDate = 'expDate'; + static const route = 'route'; + static const frequency = 'frequency'; + static const dailyQuantity = 'dailyQuantity'; + static const addReminder = 'addReminder'; + static const cancelReminder = 'cancelReminder'; + static const reminderDes = 'reminderDes'; + static const pleaseSelectAllQuestionToContinue = 'pleaseSelectAllQuestionToContinue'; + static const startDay = 'startDay'; + static const endDay = 'endDay'; + static const days = 'days'; + static const pleaseVerify = 'pleaseVerify'; + static const scheduleTime = 'scheduleTime'; + static const askDoctor = 'askDoctor'; + static const doctorResponses = 'doctorResponses'; + static const ne_w = 'ne_w'; + static const all = 'all'; + static const dailyWater = 'dailyWater'; + static const questionHere = 'questionHere'; + static const viewDoctorResponses = 'viewDoctorResponses'; + static const serviceInformationButton = 'serviceInformationButton'; + static const serviceInformationTitle = 'serviceInformationTitle'; + static const serviceInformation = 'serviceInformation'; + static const homeHealthCare = 'homeHealthCare'; + static const noAppointmentAvailable = 'noAppointmentAvailable'; + static const loginRegister = 'loginRegister'; + static const orderLog = 'orderLog'; + static const infoLab = 'infoLab'; + static const infoRadiology = 'infoRadiology'; + static const noReviewsAvailable = 'noReviewsAvailable'; + static const noLocationAvailable = 'noLocationAvailable'; + static const orders = 'orders'; + static const lakum = 'lakum'; + static const lakumMsg = 'lakumMsg'; + static const lakumPoint = 'lakumPoint'; + static const wishlist = 'wishlist'; + static const products = 'products'; + static const reviews = 'reviews'; + static const brands = 'brands'; + static const productDetails = 'productDetails'; + static const medicationRefill = 'medicationRefill'; + static const pillReminder = 'pillReminder'; + static const shippingAddresses = 'shippingAddresses'; + static const reachUs = 'reachUs'; + static const ourLocations = 'ourLocations'; + static const edit = 'edit'; + static const whatsApp = 'whatsApp'; + static const phone = 'phone'; + static const delete = 'delete'; + static const deleteAddress = 'deleteAddress'; + static const deletedAddres = 'deletedAddres'; + static const addAddress = 'addAddress'; + static const addNewAddress = 'addNewAddress'; + static const order = 'order'; + static const delivered = 'delivered'; + static const pending = 'pending'; + static const enterNameHere = 'enterNameHere'; + static const processing = 'processing'; + static const cancelled = 'cancelled'; + static const writeReview = 'writeReview'; + static const shareReview = 'shareReview'; + static const review = 'review'; + static const viewMedicalFile = 'viewMedicalFile'; + static const viewAllServices = 'viewAllServices'; + static const medicalFile = 'medicalFile'; + static const verified = 'verified'; + static const checkup = 'checkup'; + static const hhcHome = 'hhcHome'; + static const refferal = 'refferal'; + static const refferalTitle = 'refferalTitle'; + static const refferalSubTitle = 'refferalSubTitle'; + static const healthCare = 'healthCare'; + static const emergency = 'emergency'; + static const emergency2 = 'emergency2'; + static const erservices = 'erservices'; + static const services2 = 'services2'; + static const services3 = 'services3'; + static const cantSeeProfile = 'cantSeeProfile'; + static const loginRegisterNow = 'loginRegisterNow'; + static const hmgPharmacy = 'hmgPharmacy'; + static const ecommerceSolution = 'ecommerceSolution'; + static const comprehensive = 'comprehensive'; + static const onlineConsulting = 'onlineConsulting'; + static const pendingOrder = 'pendingOrder'; + static const deliveredOrder = 'deliveredOrder'; + static const processingOrder = 'processingOrder'; + static const cancelledOrder = 'cancelledOrder'; + static const compare = 'compare'; + static const medicationsRefill = 'medicationsRefill'; + static const recommended = 'recommended'; + static const myPrescription = 'myPrescription'; + static const quantity = 'quantity'; + static const reviewAppointment = 'reviewAppointment'; + static const backMyAccount = 'backMyAccount'; + static const reviewSuccessful = 'reviewSuccessful'; + static const reviewShared = 'reviewShared'; + static const reviewComment = 'reviewComment'; + static const shippedMethod = 'shippedMethod'; + static const orderDetail = 'orderDetail'; + static const orderSummary = 'orderSummary'; + static const subtotal = 'subtotal'; + static const shipping = 'shipping'; + static const shipBy = 'shipBy'; + static const lakumPoints = 'lakumPoints'; + static const useLakumPoints = 'useLakumPoints'; + static const use = 'use'; + static const proceedPay = 'proceedPay'; + static const vat = 'vat'; + static const inclusiveVat = 'inclusiveVat'; + static const items = 'items'; + static const checkOut = 'checkOut'; + static const sar = 'sar'; + static const aed = 'aed'; + static const payOnline = 'payOnline'; + static const cancelOrder = 'cancelOrder'; + static const confirmAddress = 'confirmAddress'; + static const confirmLocation = 'confirmLocation'; + static const conditionsHMG = 'conditionsHMG'; + static const conditions = 'conditions'; + static const confirmDeleteMsg = 'confirmDeleteMsg'; + static const confirmDelete = 'confirmDelete'; + static const confirmCancellation = 'confirmCancellation'; + static const orderNumber = 'orderNumber'; + static const orderDate = 'orderDate'; + static const itemsNo = 'itemsNo'; + static const noOrder = 'noOrder'; + static const noResult = 'noResult'; + static const nonRecommended = 'nonRecommended'; + static const termsService = 'termsService'; + static const beforeusing = 'beforeusing'; + static const accept = 'accept'; + static const dataSafeInfo = 'dataSafeInfo'; + static const dataSafe = 'dataSafe'; + static const informational = 'informational'; + static const notUseInEmerbency = 'notUseInEmerbency'; + static const notUseInEmerbencyDetails = 'notUseInEmerbencyDetails'; + static const notUseInEmerbencyDetailsCall = 'notUseInEmerbencyDetailsCall'; + static const checkDiagnosis = 'checkDiagnosis'; + static const remeberthat = 'remeberthat'; + static const loginToUseService = 'loginToUseService'; + static const offersAndPromotions = 'offersAndPromotions'; + static const offers = 'offers'; + static const myPrescriptions = 'myPrescriptions'; + static const searchAndScanMedication = 'searchAndScanMedication'; + static const shopByBrands = 'shopByBrands'; + static const recentlyViewed = 'recentlyViewed'; + static const bestSellers = 'bestSellers'; + static const deleteAllItems = 'deleteAllItems'; + static const total = 'total'; + static const totalWithColonRight = 'totalWithColonRight'; + static const selectAddress = 'selectAddress'; + static const shippingAddress = 'shippingAddress'; + static const changeAddress = 'changeAddress'; + static const selectPaymentOption = 'selectPaymentOption'; + static const selectTamaraPlan = 'selectTamaraPlan'; + static const changeMethod = 'changeMethod'; + static const reviewOrder = 'reviewOrder'; + static const active = 'active'; + static const inactive = 'inactive'; + static const balance = 'balance'; + static const gained = 'gained'; + static const consumed = 'consumed'; + static const transferred = 'transferred'; + static const riyal = 'riyal'; + static const membersince = 'membersince'; + static const identification = 'identification'; + static const lakumMobile = 'lakumMobile'; + static const waitinggained = 'waitinggained'; + static const expired = 'expired'; + static const willBeExpired = 'willBeExpired'; + static const activateLAKUMAccount = 'activateLAKUMAccount'; + static const checkBeneficiary = 'checkBeneficiary'; + static const beneficiaryName = 'beneficiaryName'; + static const accountActivation = 'accountActivation'; + static const lakumTransfer = 'lakumTransfer'; + static const acceptLbl = 'acceptLbl'; + static const declineLbl = 'declineLbl'; + static const selectGender = 'selectGender'; + static const iAmA = 'iAmA'; + static const selectAge = 'selectAge'; + static const select = 'select'; + static const iAm = 'iAm'; + static const yearsOld = 'yearsOld'; + static const dragPoint = 'dragPoint'; + static const refine = 'refine'; + static const subGroup = 'subGroup'; + static const max = 'max'; + static const compeleteOrderMsg = 'compeleteOrderMsg'; + static const addToCompareMsg = 'addToCompareMsg'; + static const itInListMsg = 'itInListMsg'; + static const compareListFull = 'compareListFull'; + static const addQuantity = 'addQuantity'; + static const addToCartMsg = 'addToCartMsg'; + static const addToWishlistMsg = 'addToWishlistMsg'; + static const notifyMeMsg = 'notifyMeMsg'; + static const removeFromWishlistMsg = 'removeFromWishlistMsg'; + static const min = 'min'; + static const reset = 'reset'; + static const apply = 'apply'; + static const viewCategorise = 'viewCategorise'; + static const viewSubCategorise = 'viewSubCategorise'; + static const categorise = 'categorise'; + static const wishList = 'wishList'; + static const cart = 'cart'; + static const alhabibapp = 'alhabibapp'; + static const searchProductHere = 'searchProductHere'; + static const hhcNotAuthMsg = 'hhcNotAuthMsg'; + static const email = 'email'; + static const book = 'book'; + static const appointmentLabel = 'appointmentLabel'; + static const bloodType = 'bloodType'; + static const maritalStatus = 'maritalStatus'; + static const general = 'general'; + static const profile = 'profile'; + static const notifications = 'notifications'; + static const notificationDetails = 'notificationDetails'; + static const notificationDetailsa = 'notificationDetailsa'; + static const infoMyDoctorPoints = 'infoMyDoctorPoints'; + static const infoMyDoctor = 'infoMyDoctor'; + static const infoPrescriptions = 'infoPrescriptions'; + static const infoMyPrescriptionPoints = 'infoMyPrescriptionPoints'; + static const infoInsuranceCards = 'infoInsuranceCards'; + static const infoInsuranceCardsPoints = 'infoInsuranceCardsPoints'; + static const infoAllergies = 'infoAllergies'; + static const infoSickLeaves = 'infoSickLeaves'; + static const infoSickLeavePoints = 'infoSickLeavePoints'; + static const infoApprovals = 'infoApprovals'; + static const infoApprovalPoints = 'infoApprovalPoints'; + static const infoMonthReport = 'infoMonthReport'; + static const languageSetting = 'languageSetting'; + static const alert = 'alert'; + static const emailAlert = 'emailAlert'; + static const smsAlert = 'smsAlert'; + static const contactInfo = 'contactInfo'; + static const emrgName = 'emrgName'; + static const emrgNo = 'emrgNo'; + static const modes = 'modes'; + static const vibration = 'vibration'; + static const blindModes = 'blindModes'; + static const invertTheme = 'invertTheme'; + static const offTheme = 'offTheme'; + static const dimTheme = 'dimTheme'; + static const bwTheme = 'bwTheme'; + static const permissions = 'permissions'; + static const cameraPermission = 'cameraPermission'; + static const locationPermission = 'locationPermission'; + static const needPrescription = 'needPrescription'; + static const outOfStockMsg = 'outOfStockMsg'; + static const noArabicLetters = 'noArabicLetters'; + static const noOffersAvailable = 'noOffersAvailable'; + static const accessibility = 'accessibility'; + static const orderStatus = 'orderStatus'; + static const findUs = 'findUs'; + static const liveChat = 'liveChat'; + static const service = 'service'; + static const hmgServiceLabel = 'hmgServiceLabel'; + static const healthWeatherIndicators = 'healthWeatherIndicators'; + static const healthTipsBasedOnCurrentWeather = 'healthTipsBasedOnCurrentWeather'; + static const moreDetails = 'moreDetails'; + static const resendOrder = 'resendOrder'; + static const ports = 'ports'; + static const way = 'way'; + static const dailyDoses = 'dailyDoses'; + static const period = 'period'; + static const duration = 'duration'; + static const cm = 'cm'; + static const ft = 'ft'; + static const kg = 'kg'; + static const lb = 'lb'; + static const birthDate = 'birthDate'; + static const dateOfBirth = 'dateOfBirth'; + static const mass = 'mass'; + static const tempC = 'tempC'; + static const bpm = 'bpm'; + static const respirationSigns = 'respirationSigns'; + static const sysDias = 'sysDias'; + static const body = 'body'; + static const bodyString = 'bodyString'; + static const face = 'face'; + static const retouch = 'retouch'; + static const bikini = 'bikini'; + static const totalMinutes = 'totalMinutes'; + static const feedback = 'feedback'; + static const likeToHear = 'likeToHear'; + static const emptySubject = 'emptySubject'; + static const emptyMessage = 'emptyMessage'; + static const selectAttachment = 'selectAttachment'; + static const complainAppo = 'complainAppo'; + static const complainAppoAlt = 'complainAppoAlt'; + static const messageType = 'messageType'; + static const feedbackType = 'feedbackType'; + static const compliment = 'compliment'; + static const suggestion = 'suggestion'; + static const yourFeedback = 'yourFeedback'; + static const selectPart = 'selectPart'; + static const number = 'number'; + static const notClassified = 'notClassified'; + static const selectClinic = 'selectClinic'; + static const selectProject = 'selectProject'; + static const searchItemError = 'searchItemError'; + static const youCanFind = 'youCanFind'; + static const itemInSearch = 'itemInSearch'; + static const bloodDonation = 'bloodDonation'; + static const bloodDonationInfo = 'bloodDonationInfo'; + static const bloodInstruction = 'bloodInstruction'; + static const aboutBloodDonation = 'aboutBloodDonation'; + static const bloodDonationDescription = 'bloodDonationDescription'; + static const bloodDonationBenefit1 = 'bloodDonationBenefit1'; + static const bloodDonationBenefit2 = 'bloodDonationBenefit2'; + static const bloodDonationBenefit3 = 'bloodDonationBenefit3'; + static const viewTerms = 'viewTerms'; + static const wantConnectHmgNetwork = 'wantConnectHmgNetwork'; + static const failedToAccessHmgServices = 'failedToAccessHmgServices'; + static const offerAndPackages = 'offerAndPackages'; + static const offerAndPackagesDetails = 'offerAndPackagesDetails'; + static const invoiceNo = 'invoiceNo'; + static const invoiceDate = 'invoiceDate'; + static const specialResult = 'specialResult'; + static const generalResult = 'generalResult'; + static const showMoreBtn = 'showMoreBtn'; + static const value = 'value'; + static const report = 'report'; + static const openRad = 'openRad'; + static const sendCopy = 'sendCopy'; + static const appoSurvey = 'appoSurvey'; + static const appoSurveySubtitle = 'appoSurveySubtitle'; + static const labResults = 'labResults'; + static const doctorRating = 'doctorRating'; + static const good = 'good'; + static const vGood = 'vGood'; + static const excellent = 'excellent'; + static const average = 'average'; + static const infoSigns = 'infoSigns'; + static const infoAdvancePayment = 'infoAdvancePayment'; + static const infoMyBalance = 'infoMyBalance'; + static const erContant = 'erContant'; + static const infoAmbulance = 'infoAmbulance'; + static const infoMyAppointments = 'infoMyAppointments'; + static const infoTodo = 'infoTodo'; + static const familyInfo = 'familyInfo'; + static const rrtdDetails = 'rrtdDetails'; + static const homeHealthCareText = 'homeHealthCareText'; + static const onlineCheckInAgreement = 'onlineCheckInAgreement'; + static const infoEreferral = 'infoEreferral'; + static const erConsultation = 'erConsultation'; + static const myInvoice = 'myInvoice'; + static const invoiceList = 'invoiceList'; + static const invoiceList2 = 'invoiceList2'; + static const allInvoices = 'allInvoices'; + static const hospitals = 'hospitals'; + static const clinics = 'clinics'; + static const doctors = 'doctors'; + static const selectDoctor = 'selectDoctor'; + static const thisItemIsNotAvailable = 'thisItemIsNotAvailable'; + static const beforeAfterImages = 'beforeAfterImages'; + static const clinicAcceptLivecare = 'clinicAcceptLivecare'; + static const livecareModalTop = 'livecareModalTop'; + static const livecarePoint2 = 'livecarePoint2'; + static const livecarePoint3 = 'livecarePoint3'; + static const livecarePoint4 = 'livecarePoint4'; + static const livecarePoint5 = 'livecarePoint5'; + static const bookImmediateLivecare = 'bookImmediateLivecare'; + static const bookVideoLivecare2 = 'bookVideoLivecare2'; + static const noThankyou = 'noThankyou'; + static const visitClinic = 'visitClinic'; + static const generateCovidCertificate = 'generateCovidCertificate'; + static const isReportOutsideKsa = 'isReportOutsideKsa'; + static const passportNumber = 'passportNumber'; + static const enterPassportNumber = 'enterPassportNumber'; + static const validPassportNumber = 'validPassportNumber'; + static const continuePlan = 'continuePlan'; + static const aboutApp = 'aboutApp'; + static const dontHaveAccount = 'dontHaveAccount'; + static const loginOrRegister = 'loginOrRegister'; + static const myFiles = 'myFiles'; + static const resultsPending = 'resultsPending'; + static const resultsAvailable = 'resultsAvailable'; + static const viewReport = 'viewReport'; + static const checkAvailability = 'checkAvailability'; + static const readInstructions = 'readInstructions'; + static const searchLabReport = 'searchLabReport'; + static const prescriptionDeliveryError = 'prescriptionDeliveryError'; + static const receiveOtpToast = 'receiveOtpToast'; + static const enterPhoneNumber = 'enterPhoneNumber'; + static const enterEmailDesc = 'enterEmailDesc'; + static const enterPhoneDesc = 'enterPhoneDesc'; + static const pleaseChooseOption = 'pleaseChooseOption'; + static const prepareToElevate = 'prepareToElevate'; + static const iAcceptTermsConditions = 'iAcceptTermsConditions'; + static const alreadyHaveAccount = 'alreadyHaveAccount'; + static const loginNow = 'loginNow'; + static const notice = 'notice'; + static const oR = 'oR'; + static const sendOTPWHATSAPP = 'sendOTPWHATSAPP'; + static const sendOTPSMS = 'sendOTPSMS'; + static const fullName = 'fullName'; + static const married = 'married'; + static const uae = 'uae'; + static const malE = 'malE'; + static const loginBy = 'loginBy'; + static const loginByOTP = 'loginByOTP'; + static const guest = 'guest'; + static const switchAccount = 'switchAccount'; + static const lastLoginBy = 'lastLoginBy'; + static const allSet = 'allSet'; + static const enableQuickLogin = 'enableQuickLogin'; + static const enableMsg = 'enableMsg'; + static const notNow = 'notNow'; + static const pendingActivation = 'pendingActivation'; + static const awaitingApproval = 'awaitingApproval'; + static const news = 'news'; + static const ready = 'ready'; + static const enterValidNationalId = 'enterValidNationalId'; + static const enterValidPhoneNumber = 'enterValidPhoneNumber'; + static const cannotEnterSaudiOrUAENumber = 'cannotEnterSaudiOrUAENumber'; + static const medicalCentersWithCount = 'medicalCentersWithCount'; + static const medicalCenters = 'medicalCenters'; + static const hospitalsWithCount = 'hospitalsWithCount'; + static const selectRegion = 'selectRegion'; + static const selectFacility = 'selectFacility'; + static const selectFacilitiesSubTitle = 'selectFacilitiesSubTitle'; + static const selectHospitalSubTitle = 'selectHospitalSubTitle'; + static const iAcceptThe = 'iAcceptThe'; + static const personalDetailsVerification = 'personalDetailsVerification'; + static const otpVerification = 'otpVerification'; + static const weHaveSendOTP = 'weHaveSendOTP'; + static const via = 'via'; + static const forRegistrationVerification = 'forRegistrationVerification'; + static const didntReceiveIt = 'didntReceiveIt'; + static const resendOTP = 'resendOTP'; + static const resendIn = 'resendIn'; + static const pleaseEnterAnationalID = 'pleaseEnterAnationalID'; + static const pleaseEnterAFileNumber = 'pleaseEnterAFileNumber'; + static const pleaseEnterAValidEmail = 'pleaseEnterAValidEmail'; + static const pleaseEnterFullName = 'pleaseEnterFullName'; + static const pleaseAcceptTermsConditions = 'pleaseAcceptTermsConditions'; + static const pleaseEnterAValidIqamaID = 'pleaseEnterAValidIqamaID'; + static const pleaseEnterAValidNationalID = 'pleaseEnterAValidNationalID'; + static const pleaseEnterAValidDateOfBirth = 'pleaseEnterAValidDateOfBirth'; + static const pleaseEnterAValidName = 'pleaseEnterAValidName'; + static const pleaseSelectAGender = 'pleaseSelectAGender'; + static const pleaseSelectAMaritalStatus = 'pleaseSelectAMaritalStatus'; + static const pleaseSelectACountry = 'pleaseSelectACountry'; + static const pleaseEnterEmail = 'pleaseEnterEmail'; + static const pleaseEnterAValidEmailFormat = 'pleaseEnterAValidEmailFormat'; + static const selectCountry = 'selectCountry'; + static const forLoginVerification = 'forLoginVerification'; + static const searchHospital = 'searchHospital'; + static const skip = 'skip'; + static const getStarted = 'getStarted'; + static const onboardingHeading1 = 'onboardingHeading1'; + static const onboardingBody1 = 'onboardingBody1'; + static const onboardingHeading2 = 'onboardingHeading2'; + static const onboardingBody2 = 'onboardingBody2'; + static const hmgHospitals = 'hmgHospitals'; + static const hmcMedicalClinic = 'hmcMedicalClinic'; + static const applyFilter = 'applyFilter'; + static const facilityAndLocation = 'facilityAndLocation'; + static const regionAndLocation = 'regionAndLocation'; + static const clearAllFilters = 'clearAllFilters'; + static const filters = 'filters'; + static const searchClinic = 'searchClinic'; + static const normal = 'normal'; + static const attention = 'attention'; + static const monitor = 'monitor'; + static const noSpecialResult = 'noSpecialResult'; + static const setTheDateRange = 'setTheDateRange'; + static const historyFlowchart = 'historyFlowchart'; + static const to = 'to'; + static const startDate = 'startDate'; + static const endDate = 'endDate'; + static const walkin = 'walkin'; + static const laserClinic = 'laserClinic'; + static const continueString = 'continueString'; + static const covid_info = 'covid_info'; + static const appointmentDetails = 'appointmentDetails'; + static const checkingDoctorAvailability = 'checkingDoctorAvailability'; + static const cancellingAppointmentPleaseWait = 'cancellingAppointmentPleaseWait'; + static const appointmentCancelledSuccessfully = 'appointmentCancelledSuccessfully'; + static const notConfirmed = 'notConfirmed'; + static const appointmentStatus = 'appointmentStatus'; + static const doctorWillCallYou = 'doctorWillCallYou'; + static const getDirections = 'getDirections'; + static const notifyMeBeforeAppointment = 'notifyMeBeforeAppointment'; + static const fetchingLabResults = 'fetchingLabResults'; + static const fetchingRadiologyResults = 'fetchingRadiologyResults'; + static const fetchingAppointmentPrescriptions = 'fetchingAppointmentPrescriptions'; + static const noPrescriptionsForAppointment = 'noPrescriptionsForAppointment'; + static const amountBeforeTax = 'amountBeforeTax'; + static const rebookAppointment = 'rebookAppointment'; + static const fetchingDoctorSchedulePleaseWait = 'fetchingDoctorSchedulePleaseWait'; + static const pickADate = 'pickADate'; + static const confirmingAppointmentPleaseWait = 'confirmingAppointmentPleaseWait'; + static const appointmentConfirmedSuccessfully = 'appointmentConfirmedSuccessfully'; + static const appointmentPayment = 'appointmentPayment'; + static const checkingPaymentStatusPleaseWait = 'checkingPaymentStatusPleaseWait'; + static const paymentFailedPleaseTryAgain = 'paymentFailedPleaseTryAgain'; + static const appointmentCheckIn = 'appointmentCheckIn'; + static const insuranceExpiredOrInactive = 'insuranceExpiredOrInactive'; + static const totalAmountToPay = 'totalAmountToPay'; + static const vat15 = 'vat15'; + static const liveCare = 'liveCare'; + static const recentVisits = 'recentVisits'; + static const favouriteDoctors = 'favouriteDoctors'; + static const searchByClinic = 'searchByClinic'; + static const tapToSelectClinic = 'tapToSelectClinic'; + static const searchByDoctor = 'searchByDoctor'; + static const tapToSelect = 'tapToSelect'; + static const searchByRegion = 'searchByRegion'; + static const centralRegion = 'centralRegion'; + static const immediateConsultation = 'immediateConsultation'; + static const scheduledConsultation = 'scheduledConsultation'; + static const pharmaLiveCare = 'pharmaLiveCare'; + static const notSureHelpMeChooseClinic = 'notSureHelpMeChooseClinic'; + static const mentionYourSymptomsAndFindDoctors = 'mentionYourSymptomsAndFindDoctors'; + static const immediateService = 'immediateService'; + static const noNeedToWaitGetMedicalConsultation = 'noNeedToWaitGetMedicalConsultation'; + static const noVisitRequired = 'noVisitRequired'; + static const doctorWillContact = 'doctorWillContact'; + static const specialisedDoctorWillContactYou = 'specialisedDoctorWillContactYou'; + static const freeMedicineDelivery = 'freeMedicineDelivery'; + static const offersFreeMedicineDelivery = 'offersFreeMedicineDelivery'; + static const dentalChiefComplaints = 'dentalChiefComplaints'; + static const viewAvailableAppointments = 'viewAvailableAppointments'; + static const doctorProfile = 'doctorProfile'; + static const waitingAppointment = 'waitingAppointment'; + static const hospitalInformation = 'hospitalInformation'; + static const fetchingAppointmentShare = 'fetchingAppointmentShare'; + static const bookingYourAppointment = 'bookingYourAppointment'; + static const selectLiveCareClinic = 'selectLiveCareClinic'; + static const checkingForExistingDentalPlan = 'checkingForExistingDentalPlan'; + static const dentalTreatmentPlan = 'dentalTreatmentPlan'; + static const youHaveExistingTreatmentPlan = 'youHaveExistingTreatmentPlan'; + static const mins = 'mins'; + static const totalTimeRequired = 'totalTimeRequired'; + static const wouldYouLikeToContinue = 'wouldYouLikeToContinue'; + static const chooseDoctor = 'chooseDoctor'; + static const viewNearestAppos = 'viewNearestAppos'; + static const noDoctorFound = 'noDoctorFound'; + static const yesPleasImInAHurry = 'yesPleasImInAHurry'; + static const fetchingFeesPleaseWait = 'fetchingFeesPleaseWait'; + static const noThanksPhysicalVisit = 'noThanksPhysicalVisit'; + 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'; + static const reviewLiveCareRequest = 'reviewLiveCareRequest'; + static const selectedLiveCareType = 'selectedLiveCareType'; + static const selectLiveCareCallType = 'selectLiveCareCallType'; + static const confirmingLiveCareRequest = 'confirmingLiveCareRequest'; + static const unknownErrorOccurred = 'unknownErrorOccurred'; + static const liveCarePermissionsMessage = 'liveCarePermissionsMessage'; + static const liveCarePayment = 'liveCarePayment'; + static const mada = 'mada'; + static const visaOrMastercard = 'visaOrMastercard'; + static const tamara = 'tamara'; + static const fetchingApplePayDetails = 'fetchingApplePayDetails'; + static const liveCarePendingRequest = 'liveCarePendingRequest'; + static const callLiveCareSupport = 'callLiveCareSupport'; + static const whatIsWaitingAppointment = 'whatIsWaitingAppointment'; + static const waitingAppointmentsFeature = 'waitingAppointmentsFeature'; + static const appointmentWithDoctorConfirmed = 'appointmentWithDoctorConfirmed'; + static const paymentWithinTenMinutes = 'paymentWithinTenMinutes'; + static const liveLocation = 'liveLocation'; + static const verifyYourLocationAtHospital = 'verifyYourLocationAtHospital'; + static const error = 'error'; + static const ensureWithinHospitalLocation = 'ensureWithinHospitalLocation'; + static const nfcNearFieldCommunication = 'nfcNearFieldCommunication'; + static const scanPhoneViaNFC = 'scanPhoneViaNFC'; + static const qrCode = 'qrCode'; + static const scanQRCodeToCheckIn = 'scanQRCodeToCheckIn'; + static const processingCheckIn = 'processingCheckIn'; + static const bookingWaitingAppointment = 'bookingWaitingAppointment'; + static const enterValidIDorIqama = 'enterValidIDorIqama'; + static const selectAppointment = 'selectAppointment'; + static const rebookSameDoctor = 'rebookSameDoctor'; + static const queueing = 'queueing'; + static const inQueue = 'inQueue'; + static const yourTurn = 'yourTurn'; + static const halaFirstName = 'halaFirstName'; + static const thankYouForPatience = 'thankYouForPatience'; + static const servingNow = 'servingNow'; + static const callForVitalSigns = 'callForVitalSigns'; + static const callForDoctor = 'callForDoctor'; + static const thingsToAskDoctor = 'thingsToAskDoctor'; + static const improveOverallHealth = 'improveOverallHealth'; + static const routineScreenings = 'routineScreenings'; + static const whatIsThisMedicationFor = 'whatIsThisMedicationFor'; + static const sideEffectsToKnow = 'sideEffectsToKnow'; + static const whenFollowUp = 'whenFollowUp'; + static const goToHomepage = 'goToHomepage'; + static const appointmentsList = 'appointmentsList'; + static const allAppt = 'allAppt'; + static const upcoming = 'upcoming'; + static const completed = 'completed'; + static const noAppointmentsYet = 'noAppointmentsYet'; + static const viewProfile = 'viewProfile'; + static const choosePreferredHospitalForService = 'choosePreferredHospitalForService'; + static const noHospitalsFound = 'noHospitalsFound'; + static const cancelOrderConfirmation = 'cancelOrderConfirmation'; + static const orderCancelledSuccessfully = 'orderCancelledSuccessfully'; + static const requestID = 'requestID'; + static const noCMCOrdersYet = 'noCMCOrdersYet'; + static const cmcOrders = 'cmcOrders'; + static const summary = 'summary'; + static const selectedService = 'selectedService'; + static const requestSubmittedSuccessfully = 'requestSubmittedSuccessfully'; + static const hereIsYourRequestNumber = 'hereIsYourRequestNumber'; + static const pleaseSelectHospitalToContinue = 'pleaseSelectHospitalToContinue'; + static const confirmSubmitRequest = 'confirmSubmitRequest'; + static const pendingOrderWait = 'pendingOrderWait'; + static const noServicesAvailable = 'noServicesAvailable'; + static const selectAService = 'selectAService'; + static const comprehensiveCheckup = 'comprehensiveCheckup'; + static const viewNearestHMGLocations = 'viewNearestHMGLocations'; + static const provideFeedbackOnServices = 'provideFeedbackOnServices'; + static const liveChatWithHMG = 'liveChatWithHMG'; + static const send = 'send'; + static const status = 'status'; + static const sendingFeedback = 'sendingFeedback'; + static const selectFeedbackType = 'selectFeedbackType'; + static const loadingAppointmentsList = 'loadingAppointmentsList'; + static const noAppointmentsForFeedback = 'noAppointmentsForFeedback'; + static const selectedAppointment = 'selectedAppointment'; + static const subject = 'subject'; + static const enterSubjectHere = 'enterSubjectHere'; + static const message = 'message'; + static const enterMessageHere = 'enterMessageHere'; + static const filesSelected = 'filesSelected'; + static const otherDetails = 'otherDetails'; + static const medicalReport = 'medicalReport'; + static const medicalReportNumber = 'medicalReportNumber'; + static const patientIsInsured = 'patientIsInsured'; + static const insuranceDocument = 'insuranceDocument'; + static const selectBranch = 'selectBranch'; + static const patientInformation = 'patientInformation'; + static const patientLocation = 'patientLocation'; + static const identificationNumber = 'identificationNumber'; + static const enterIdentificationNumber = 'enterIdentificationNumber'; + static const patientName = 'patientName'; + static const referralRequesterInformation = 'referralRequesterInformation'; + static const enterReferralRequesterName = 'enterReferralRequesterName'; + static const requesterName = 'requesterName'; + static const relationship = 'relationship'; + static const selectRelation = 'selectRelation'; + static const otherName = 'otherName'; + static const otherNameHint = 'otherNameHint'; + static const requesterNameRequired = 'requesterNameRequired'; + static const selectRelationshipRequired = 'selectRelationshipRequired'; + static const otherRelationshipNameRequired = 'otherRelationshipNameRequired'; + static const identificationNumberRequired = 'identificationNumberRequired'; + static const patientNameRequired = 'patientNameRequired'; + static const enterPatientPhoneRequired = 'enterPatientPhoneRequired'; + static const selectPatientCityRequired = 'selectPatientCityRequired'; + static const medicalReportRequired = 'medicalReportRequired'; + static const selectBranchRequired = 'selectBranchRequired'; + static const insuranceDocumentRequired = 'insuranceDocumentRequired'; + static const searchResult = 'searchResult'; + static const referralNo = 'referralNo'; + static const eReferral = 'eReferral'; + static const referralCreatedSuccessfully = 'referralCreatedSuccessfully'; + static const hereIsYourReferralNumber = 'hereIsYourReferralNumber'; + static const searchEReferral = 'searchEReferral'; + static const enterRequiredInfoToSearch = 'enterRequiredInfoToSearch'; + static const selectPickupDirection = 'selectPickupDirection'; + static const selectDirection = 'selectDirection'; + static const toHospital = 'toHospital'; + static const fromHospital = 'fromHospital'; + static const selectWay = 'selectWay'; + static const oneWay = 'oneWay'; + static const twoWay = 'twoWay'; + static const selectPickupDetails = 'selectPickupDetails'; + static const pleaseSelectDetailsOfPickup = 'pleaseSelectDetailsOfPickup'; + static const selectDetails = 'selectDetails'; + static const work = 'work'; + static const pick = 'pick'; + static const insideTheHome = 'insideTheHome'; + static const haveAnyAppointment = 'haveAnyAppointment'; + static const amountPaidAtHospital = 'amountPaidAtHospital'; + static const submitRequest = 'submitRequest'; + static const enterPickupLocationManually = 'enterPickupLocationManually'; + static const enterPickupLocation = 'enterPickupLocation'; + static const trackingDetails = 'trackingDetails'; + static const cancelRequest = 'cancelRequest'; + static const shareLocationWhatsapp = 'shareLocationWhatsapp'; + static const pleaseWaitForCall = 'pleaseWaitForCall'; + static const toHospitalLower = 'toHospitalLower'; + static const contact = 'contact'; + static const failed = 'failed'; + static const confirmationCall = 'confirmationCall'; + static const pickupFromHome = 'pickupFromHome'; + static const onTheWayToHospital = 'onTheWayToHospital'; + static const arrivedAtHospital = 'arrivedAtHospital'; + static const orderCancel = 'orderCancel'; + static const emergencyCheckIn = 'emergencyCheckIn'; + static const erOnlineCheckInDescription = 'erOnlineCheckInDescription'; + static const erOnlineCheckInSuccess = 'erOnlineCheckInSuccess'; + static const erOnlineCheckInError = 'erOnlineCheckInError'; + static const fetchingHospitalsList = 'fetchingHospitalsList'; + static const fetchingPaymentInformation = 'fetchingPaymentInformation'; + static const erVisitDetails = 'erVisitDetails'; + static const erClinic = 'erClinic'; + static const vatWithAmount = 'vatWithAmount'; + static const erAppointmentBookedSuccess = 'erAppointmentBookedSuccess'; + static const underProcessing = 'underProcessing'; + static const canceledByPatient = 'canceledByPatient'; + static const rapidResponseTeam = 'rapidResponseTeam'; + static const allFacilities = 'allFacilities'; + static const selectLocation = 'selectLocation'; + static const pleaseSelectTheLocation = 'pleaseSelectTheLocation'; + static const viewLocationGoogleMaps = 'viewLocationGoogleMaps'; + static const callAmbulance = 'callAmbulance'; + static const requestAmbulanceInEmergency = 'requestAmbulanceInEmergency'; + static const confirmation = 'confirmation'; + static const areYouSureYouWantToCallAmbulance = 'areYouSureYouWantToCallAmbulance'; + static const getDetailsOfNearestBranch = 'getDetailsOfNearestBranch'; + static const areYouSureYouWantToCallRRT = 'areYouSureYouWantToCallRRT'; + static const priorERCheckInToSkipLine = 'priorERCheckInToSkipLine'; + static const areYouSureYouWantToMakeERCheckIn = 'areYouSureYouWantToMakeERCheckIn'; + static const checkingYourERAppointmentStatus = 'checkingYourERAppointmentStatus'; + static const transportOptions = 'transportOptions'; + static const selectHospitalForAdvancePayment = 'selectHospitalForAdvancePayment'; + static const recharge = 'recharge'; + static const activityLevel = 'activityLevel'; + static const selectActivityLevel = 'selectActivityLevel'; + static const caloriesPerDay = 'caloriesPerDay'; + static const dietType = 'dietType'; + static const selectDietType = 'selectDietType'; + static const bodyFrameSize = 'bodyFrameSize'; + static const selectBodyFrameSize = 'selectBodyFrameSize'; + static const averageCycleLength = 'averageCycleLength'; + static const averageLutealPhase = 'averageLutealPhase'; + static const convert = 'convert'; + static const calculate = 'calculate'; + static const healthCalculators = 'healthCalculators'; + static const healthConverters = 'healthConverters'; + static const generalHealth = 'generalHealth'; + static const relatedToBMICalories = 'relatedToBMICalories'; + static const selectCalculator = 'selectCalculator'; + static const womensHealth = 'womensHealth'; + static const relatedToPeriodsOvulation = 'relatedToPeriodsOvulation'; + static const bloodSugar = 'bloodSugar'; + static const trackYourGlucoseLevels = 'trackYourGlucoseLevels'; + static const bloodCholesterol = 'bloodCholesterol'; + static const monitorCholesterolLevels = 'monitorCholesterolLevels'; + static const triglyceridesFatBlood = 'triglyceridesFatBlood'; + static const understandTriglyceridesImpact = 'understandTriglyceridesImpact'; + static const bmiCalculator = 'bmiCalculator'; + static const caloriesCalculator = 'caloriesCalculator'; + static const bmrCalculator = 'bmrCalculator'; + static const idealBodyWeight = 'idealBodyWeight'; + static const bodyFatCalculator = 'bodyFatCalculator'; + static const carbsProteinFat = 'carbsProteinFat'; + static const ovulationPeriod = 'ovulationPeriod'; + static const deliveryDueDate = 'deliveryDueDate'; + static const low = 'low'; + static const preDiabetic = 'preDiabetic'; + static const high = 'high'; + static const elevated = 'elevated'; + static const recorded = 'recorded'; + static const noRecordsYet = 'noRecordsYet'; + static const lastRecord = 'lastRecord'; + static const addBloodSugar = 'addBloodSugar'; + static const addBloodPressure = 'addBloodPressure'; + static const addWeight = 'addWeight'; + static const bloodSugarDataSavedSuccessfully = 'bloodSugarDataSavedSuccessfully'; + static const bloodPressureDataSavedSuccessfully = 'bloodPressureDataSavedSuccessfully'; + static const weightDataSavedSuccessfully = 'weightDataSavedSuccessfully'; + static const pleaseWait = 'pleaseWait'; + static const selectUnit = 'selectUnit'; + static const selectMeasureTime = 'selectMeasureTime'; + static const selectArm = 'selectArm'; + static const enterBloodSugar = 'enterBloodSugar'; + static const enterSystolicValue = 'enterSystolicValue'; + static const enterDiastolicValue = 'enterDiastolicValue'; + static const enterWeight = 'enterWeight'; + static const selectDuration = 'selectDuration'; + static const systolic = 'systolic'; + static const diastolic = 'diastolic'; + static const sendReportByEmail = 'sendReportByEmail'; + static const enterYourEmailToReceiveReport = 'enterYourEmailToReceiveReport'; + static const addNewRecord = 'addNewRecord'; + static const healthTrackers = 'healthTrackers'; + static const monitorBloodPressureLevels = 'monitorBloodPressureLevels'; + static const trackWeightProgress = 'trackWeightProgress'; + static const bookAppointment = 'bookAppointment'; + static const completeCheckup = 'completeCheckup'; + static const indoorNavigation = 'indoorNavigation'; + static const eReferralServices = 'eReferralServices'; + static const dailyWaterMonitor = 'dailyWaterMonitor'; + static const fetchingYourWaterIntakeDetails = 'fetchingYourWaterIntakeDetails'; + static const healthCalculatorsServices = 'healthCalculatorsServices'; + static const healthConvertersServices = 'healthConvertersServices'; + static const smartWatchesServices = 'smartWatchesServices'; + static const exploreServices = 'exploreServices'; + static const medicalAndCareServices = 'medicalAndCareServices'; + static const hmgServices = 'hmgServices'; + static const personalServices = 'personalServices'; + static const habibWallet = 'habibWallet'; + static const habibWallet2 = 'habibWallet2'; + static const loginToViewWalletBalance = 'loginToViewWalletBalance'; + static const loginToViewMedicalFile = 'loginToViewMedicalFile'; + static const addMember = 'addMember'; + static const addFamilyMember = 'addFamilyMember'; + static const pleaseFillBelowFieldToAddNewFamilyMember = 'pleaseFillBelowFieldToAddNewFamilyMember'; + static const healthTools = 'healthTools'; + static const supportServices = 'supportServices'; + static const virtualTour = 'virtualTour'; + static const carParking = 'carParking'; + static const latestNews = 'latestNews'; + static const hmgContact = 'hmgContact'; + static const durationCannotExceed90 = 'durationCannotExceed90'; + static const unexpectedError = 'unexpectedError'; + static const gettingAmbulanceTransportOption = 'gettingAmbulanceTransportOption'; + static const fetchingAppointment = 'fetchingAppointment'; + static const doYouWantToCancelTheRequest = 'doYouWantToCancelTheRequest'; + static const cancellingRequest = 'cancellingRequest'; + static const fetchingTermsAndConditions = 'fetchingTermsAndConditions'; + static const selectLocationPrescriptionDelivery = 'selectLocationPrescriptionDelivery'; + static const noRadiologyOrders = 'noRadiologyOrders'; + static const ageIsRequired = 'ageIsRequired'; + static const invalidAge = 'invalidAge'; + static const ageMustBeBetween11And120 = 'ageMustBeBetween11And120'; + static const heightIsRequired = 'heightIsRequired'; + static const invalidHeight = 'invalidHeight'; + static const weightIsRequired = 'weightIsRequired'; + static const invalidWeight = 'invalidWeight'; + static const timeToDrinkWater = 'timeToDrinkWater'; + static const stayHydratedDrinkWater = 'stayHydratedDrinkWater'; + static const visitPharmacyOnline = 'visitPharmacyOnline'; + static const howAreYouFeelingToday = 'howAreYouFeelingToday'; + static const checkYourSymptomsWithScale = 'checkYourSymptomsWithScale'; + static const checkYourSymptoms = 'checkYourSymptoms'; + static const noUpcomingAppointmentPleaseBook = 'noUpcomingAppointmentPleaseBook'; + static const youHaveEROnlineCheckInRequest = 'youHaveEROnlineCheckInRequest'; + static const quickLinks = 'quickLinks'; + static const viewMedicalFileLandingPage = 'viewMedicalFileLandingPage'; + static const immediateLiveCareRequest = 'immediateLiveCareRequest'; + static const yourTurnIsAfterPatients = 'yourTurnIsAfterPatients'; + static const dontHaveHHCOrders = 'dontHaveHHCOrders'; + static const hhcOrders = 'hhcOrders'; + static const requestedServices = 'requestedServices'; + static const selectServices = 'selectServices'; + static const selectedServices = 'selectedServices'; + static const createNewRequest = 'createNewRequest'; + static const youHaveNoPendingRequests = 'youHaveNoPendingRequests'; + static const noInsuranceDataFound = 'noInsuranceDataFound'; + static const noInsuranceUpdateRequest = 'noInsuranceUpdateRequest'; + static const policyNumberInsurancePage = 'policyNumberInsurancePage'; + static const insuranceExpired = 'insuranceExpired'; + static const insuranceActive = 'insuranceActive'; + static const patientCardID = 'patientCardID'; + static const noInsuranceApprovals = 'noInsuranceApprovals'; + static const noInsuranceWithHMG = 'noInsuranceWithHMG'; + static const referenceRange = 'referenceRange'; + static const downloadReport = 'downloadReport'; + static const generatingReport = 'generatingReport'; + static const noLabResults = 'noLabResults'; + static const labResultDetails = 'labResultDetails'; + static const resultOf = 'resultOf'; + static const whatIsThisResult = 'whatIsThisResult'; + static const lastTested = 'lastTested'; + static const byVisit = 'byVisit'; + static const byTest = 'byTest'; + static const results = 'results'; + static const viewResults = 'viewResults'; + static const rebook = 'rebook'; + static const noOphthalmologyAppointments = 'noOphthalmologyAppointments'; + static const noVitalSignsRecordedYet = 'noVitalSignsRecordedYet'; + static const appointmentsAndVisits = 'appointmentsAndVisits'; + static const labAndRadiology = 'labAndRadiology'; + static const activeMedicationsAndPrescriptions = 'activeMedicationsAndPrescriptions'; + static const allPrescriptions = 'allPrescriptions'; + static const allMedications = 'allMedications'; + static const youDontHaveAnyPrescriptionsYet = 'youDontHaveAnyPrescriptionsYet'; + static const youDontHaveAnyCompletedVisitsYet = 'youDontHaveAnyCompletedVisitsYet'; + static const others = 'others'; + static const allergyInfo = 'allergyInfo'; + static const vaccineInfo = 'vaccineInfo'; + static const updateInsuranceInfo = 'updateInsuranceInfo'; + static const myInvoicesList = 'myInvoicesList'; + static const ancillaryOrdersList = 'ancillaryOrdersList'; + static const youDontHaveAnySickLeavesYet = 'youDontHaveAnySickLeavesYet'; + static const medicalReports = 'medicalReports'; + static const sickLeaveReport = 'sickLeaveReport'; + static const weightTracker = 'weightTracker'; + static const askYourDoctor = 'askYourDoctor'; + static const internetPairing = 'internetPairing'; + static const requested = 'requested'; + static const youDontHaveAnyMedicalReportsYet = 'youDontHaveAnyMedicalReportsYet'; + static const requestMedicalReport = 'requestMedicalReport'; + static const youDoNotHaveAnyAppointmentsToRequestMedicalReport = 'youDoNotHaveAnyAppointmentsToRequestMedicalReport'; + static const areYouSureYouWantToRequestMedicalReport = 'areYouSureYouWantToRequestMedicalReport'; + static const yourMedicalReportRequestSubmittedSuccessfully = 'yourMedicalReportRequestSubmittedSuccessfully'; + static const monthlyHealthSummaryReportDisclaimer = 'monthlyHealthSummaryReportDisclaimer'; + static const updatingMonthlyReportStatus = 'updatingMonthlyReportStatus'; + static const monthlyReportStatusUpdatedSuccessfully = 'monthlyReportStatusUpdatedSuccessfully'; + static const whoCanViewMyMedicalFile = 'whoCanViewMyMedicalFile'; + static const acceptedYourRequestToBeYourFamilyMember = 'acceptedYourRequestToBeYourFamilyMember'; + static const canViewYourFile = 'canViewYourFile'; + static const hasARequestPendingToBeYourFamilyMember = 'hasARequestPendingToBeYourFamilyMember'; + static const wantsToAddYouAsTheirFamilyMember = 'wantsToAddYouAsTheirFamilyMember'; + static const rejectedYourRequestToBeYourFamilyMember = 'rejectedYourRequestToBeYourFamilyMember'; + static const rejectedYourFamilyMemberRequest = 'rejectedYourFamilyMemberRequest'; + static const notAvailable = 'notAvailable'; + static const selectAProfile = 'selectAProfile'; + static const switchFamilyFile = 'switchFamilyFile'; + static const medicalFiles = 'medicalFiles'; + static const addANewFamilyMember = 'addANewFamilyMember'; + static const viewInvoiceDetails = 'viewInvoiceDetails'; + static const outPatient = 'outPatient'; + static const invoiceDetails = 'invoiceDetails'; + static const sendingEmailPleaseWait = 'sendingEmailPleaseWait'; + static const emailSentSuccessfullyMessage = 'emailSentSuccessfullyMessage'; + static const discount = 'discount'; + static const paid = 'paid'; + static const fetchingInvoiceDetails = 'fetchingInvoiceDetails'; + static const scanQRCode = 'scanQRCode'; + static const parkingSlotDetails = 'parkingSlotDetails'; + static const slotNumber = 'slotNumber'; + static const basement = 'basement'; + static const parkingDate = 'parkingDate'; + static const parkedSince = 'parkedSince'; + static const resetDirection = 'resetDirection'; + static const noPrescriptionOrdersYet = 'noPrescriptionOrdersYet'; + static const fetchingPrescriptionPDFPleaseWait = 'fetchingPrescriptionPDFPleaseWait'; + static const ratingValue = 'ratingValue'; + static const downloadPrescription = 'downloadPrescription'; + static const fetchingPrescriptionDetails = 'fetchingPrescriptionDetails'; + static const switchBackFamilyFile = 'switchBackFamilyFile'; + static const profileAndSettings = 'profileAndSettings'; + static const quickActions = 'quickActions'; + static const notificationsSettings = 'notificationsSettings'; + static const touchIDFaceIDServices = 'touchIDFaceIDServices'; + static const personalInformation = 'personalInformation'; + static const updateEmailAddress = 'updateEmailAddress'; + static const helpAndSupport = 'helpAndSupport'; + static const permissionsProfile = 'permissionsProfile'; + static const privacyPolicy = 'privacyPolicy'; + static const deactivateAccount = 'deactivateAccount'; + static const ageYearsOld = 'ageYearsOld'; + static const youDontHaveRadiologyOrders = 'youDontHaveRadiologyOrders'; + static const radiologyResult = 'radiologyResult'; + static const viewRadiologyImage = 'viewRadiologyImage'; + static const rateClinic = 'rateClinic'; + static const back = 'back'; + static const rateDoctor = 'rateDoctor'; + static const howWasYourLastVisitWithDoctor = 'howWasYourLastVisitWithDoctor'; + static const dateOfBirthSymptoms = 'dateOfBirthSymptoms'; + static const genderSymptoms = 'genderSymptoms'; + static const heightSymptoms = 'heightSymptoms'; + static const weightSymptoms = 'weightSymptoms'; + static const femaleGender = 'femaleGender'; + static const previous = 'previous'; + static const selectedOrgans = 'selectedOrgans'; + static const noOrgansSelected = 'noOrgansSelected'; + static const organSelector = 'organSelector'; + static const noPredictionsAvailable = 'noPredictionsAvailable'; + static const areYouSureYouWantToRestartOrganSelection = 'areYouSureYouWantToRestartOrganSelection'; + static const possibleConditions = 'possibleConditions'; + static const pleaseSelectAtLeastOneRiskBeforeProceeding = 'pleaseSelectAtLeastOneRiskBeforeProceeding'; + static const aboveYouSeeCommonRiskFactors = 'aboveYouSeeCommonRiskFactors'; + static const readMore = 'readMore'; + static const riskFactors = 'riskFactors'; + static const noRiskFactorsFound = 'noRiskFactorsFound'; + static const basedOnYourSelectedSymptomsNoRiskFactors = 'basedOnYourSelectedSymptomsNoRiskFactors'; + static const messageNotification = 'messageNotification'; + static const attachedImage = 'attachedImage'; + static const failedToLoadImage = 'failedToLoadImage'; + static const typeNotification = 'typeNotification'; + static const pleaseSelectAtLeastOneOptionBeforeProceeding = 'pleaseSelectAtLeastOneOptionBeforeProceeding'; + static const suggestions = 'suggestions'; + static const pleaseGoBackAndSelectOrgansFirst = 'pleaseGoBackAndSelectOrgansFirst'; + static const symptomsSelector = 'symptomsSelector'; + static const possibleSymptomsRelatedTo = 'possibleSymptomsRelatedTo'; + static const suggestionAIListDescription = 'suggestionAIListDescription'; + static const analyzing = 'analyzing'; + static const seekMedicalAdvice = 'seekMedicalAdvice'; + static const monitorDescription = 'monitorDescription'; + static const seekMedicalAdviceDescription = 'seekMedicalAdviceDescription'; + static const emergencyDescription = 'emergencyDescription'; + static const colorScience = 'colorScience'; + static const noNeedToVisitDoctor = 'noNeedToVisitDoctor'; + static const commonSymptom = 'commonSymptom'; + static const notApplicable = 'notApplicable'; + static const emergencyTriage = 'emergencyTriage'; + static const emergencyEvidenceDetected = 'emergencyEvidenceDetected'; + static const noQuestionItemsAvailable = 'noQuestionItemsAvailable'; + static const pleaseAnswerAllQuestionsBeforeProceeding = 'pleaseAnswerAllQuestionsBeforeProceeding'; + static const triage = 'triage'; + static const areYouSureYouWantToExitProgress = 'areYouSureYouWantToExitProgress'; + static const noQuestionAvailable = 'noQuestionAvailable'; + static const possibleSymptom = 'possibleSymptom'; + static const symptomsCheckerFindingScore = 'symptomsCheckerFindingScore'; + static const notSet = 'notSet'; + static const years = 'years'; + static const symptomsChecker = 'symptomsChecker'; + static const helloIsYourInformationUpToDate = 'helloIsYourInformationUpToDate'; + static const noEditAll = 'noEditAll'; + static const yesItIs = 'yesItIs'; + static const age = 'age'; + static const youDontHaveAnyAncillaryOrdersYet = 'youDontHaveAnyAncillaryOrdersYet'; + static const invoiceWithNumber = 'invoiceWithNumber'; + static const queued = 'queued'; + static const checkInReady = 'checkInReady'; + static const checkIn = 'checkIn'; + static const viewDetails = 'viewDetails'; + static const selectPaymentMethod = 'selectPaymentMethod'; + static const processingPaymentPleaseWait = 'processingPaymentPleaseWait'; + static const finalizingPaymentPleaseWait = 'finalizingPaymentPleaseWait'; + static const generatingInvoicePleaseWait = 'generatingInvoicePleaseWait'; + static const hereIsYourInvoiceNumber = 'hereIsYourInvoiceNumber'; + static const paymentCompletedSuccessfully = 'paymentCompletedSuccessfully'; + static const failedToInitializeApplePay = 'failedToInitializeApplePay'; + static const cash = 'cash'; + static const approved = 'approved'; + static const approvalRejectedPleaseVisitReceptionist = 'approvalRejectedPleaseVisitReceptionist'; + static const sentForApproval = 'sentForApproval'; + static const ancillaryOrderDetails = 'ancillaryOrderDetails'; + static const noProceduresAvailableForSelectedOrder = 'noProceduresAvailableForSelectedOrder'; + static const procedures = 'procedures'; + static const totalAmount = 'totalAmount'; + static const covered = 'covered'; + static const vatPercent = 'vatPercent'; + static const proceedToPayment = 'proceedToPayment'; + static const supportedSmartWatches = 'supportedSmartWatches'; + static const pleaseMakeSureSamsungWatchConnected = 'pleaseMakeSureSamsungWatchConnected'; + static const beforeSyncingDataFollowInstructions = 'beforeSyncingDataFollowInstructions'; + static const viewWatchInstructions = 'viewWatchInstructions'; + static const healthConnectAppNotInstalled = 'healthConnectAppNotInstalled'; + static const setTimerOfReminder = 'setTimerOfReminder'; + static const youHaveAppointmentWithDr = 'youHaveAppointmentWithDr'; + static const hours = 'hours'; + static const minutes = 'minutes'; + static const seconds = 'seconds'; + static const secs = 'secs'; + static const noAllergiesDataFound = 'noAllergiesDataFound'; + static const heartRateDescription = 'heartRateDescription'; + static const bloodOxygenDescription = 'bloodOxygenDescription'; + static const stepsDescription = 'stepsDescription'; + static const caloriesDescription = 'caloriesDescription'; + static const distanceDescription = 'distanceDescription'; + static const overview = 'overview'; + static const details = 'details'; + static const details2 = 'details2'; + static const healthy = 'healthy'; + static const warning = 'warning'; + static const vitalSignDetails = 'vitalSignDetails'; + static const resultOfNoDate = 'resultOfNoDate'; + static const referenceRangeBetween = 'referenceRangeBetween'; + static const referenceRangeMin = 'referenceRangeMin'; + static const referenceRangeMax = 'referenceRangeMax'; + static const noHistoryAvailable = 'noHistoryAvailable'; + static const bmiDescription = 'bmiDescription'; + static const heightDescription = 'heightDescription'; + static const weightDescription = 'weightDescription'; + static const bloodPressureDescription = 'bloodPressureDescription'; + static const temperatureDescription = 'temperatureDescription'; + static const heartRateDescriptionVital = 'heartRateDescriptionVital'; + static const respiratoryRateDescription = 'respiratoryRateDescription'; + static const bmiAdvice = 'bmiAdvice'; + static const heightAdvice = 'heightAdvice'; + static const weightAdvice = 'weightAdvice'; + static const bloodPressureAdvice = 'bloodPressureAdvice'; + static const temperatureAdvice = 'temperatureAdvice'; + static const heartRateAdvice = 'heartRateAdvice'; + static const respiratoryRateAdvice = 'respiratoryRateAdvice'; + static const whatShouldIDoNext = 'whatShouldIDoNext'; + static const customizeDrinkCup = 'customizeDrinkCup'; + static const tipsToStayHydrated = 'tipsToStayHydrated'; + static const drinkBeforeYouFeelThirsty = 'drinkBeforeYouFeelThirsty'; + static const keepRefillableBottleNextToYou = 'keepRefillableBottleNextToYou'; + static const trackYourDailyIntakeToStayMotivated = 'trackYourDailyIntakeToStayMotivated'; + static const chooseSparklingWaterInsteadOfSoda = 'chooseSparklingWaterInsteadOfSoda'; + static const switchCup = 'switchCup'; + static const plainWater = 'plainWater'; + static const yourGoal = 'yourGoal'; + static const remaining = 'remaining'; + static const hydrationStatus = 'hydrationStatus'; + static const areYouSureYouWantToCancelAllWaterReminders = 'areYouSureYouWantToCancelAllWaterReminders'; + static const remindersSet = 'remindersSet'; + static const dailyWaterRemindersScheduledAt = 'dailyWaterRemindersScheduledAt'; + static const waterConsumption = 'waterConsumption'; + static const selectNumberOfReminders = 'selectNumberOfReminders'; + static const h2oSettings = 'h2oSettings'; + static const settingsSavedSuccessfully = 'settingsSavedSuccessfully'; + static const yourName = 'yourName'; + static const ageYears = 'ageYears'; + static const numberOfRemindersInADay = 'numberOfRemindersInADay'; + static const medications = 'medications'; + static const someRemarksAboutPrescription = 'someRemarksAboutPrescription'; + static const notifyMeBeforeConsumptionTime = 'notifyMeBeforeConsumptionTime'; + static const noMedicationsToday = 'noMedicationsToday'; + static const reminders = 'reminders'; + static const reminderAddedToCalendar = 'reminderAddedToCalendar'; + static const errorWhileSettingCalendar = 'errorWhileSettingCalendar'; + static const instructions = 'instructions'; + static const requests = 'requests'; + static const thisWeek = 'thisWeek'; + static const lastMonth = 'lastMonth'; + static const lastSixMonths = 'lastSixMonths'; + static const selectTime = 'selectTime'; + static const pleaseWaitYouWillBeCalledForVitalSigns = 'pleaseWaitYouWillBeCalledForVitalSigns'; + static const pleaseVisitRoomForVitalSigns = 'pleaseVisitRoomForVitalSigns'; + static const pleaseVisitRoomToTheDoctor = 'pleaseVisitRoomToTheDoctor'; + static const erOnlineCheckInRequest = 'erOnlineCheckInRequest'; + static const indoor = 'indoor'; + static const navigation = 'navigation'; + static const health = 'health'; + static const calculators = 'calculators'; + static const converters = 'converters'; + static const guide = 'guide'; + static const liveCareServiceDesc = 'liveCareServiceDesc'; + static const bloodGroup = 'bloodGroup'; + static const medicalServices = 'medicalServices'; + static const insuranceAndPayments = 'insuranceAndPayments'; + static const trackerAndOthers = 'trackerAndOthers'; + static const bmi = 'bmi'; + static const yesPleaseINeedHelp = 'yesPleaseINeedHelp'; + static const aiOverView = 'aiOverView'; + static const generateAiAnalysis = 'generateAiAnalysis'; + static const aiAnalysis = 'aiAnalysis'; + static const prediction = 'prediction'; + static const prevention = 'prevention'; + static const disclaimer = 'disclaimer'; + static const thisAboveInfo = 'thisAboveInfo'; + static const aiDisclaimer = 'aiDisclaimer'; + static const consent = 'consent'; + static const bmiNormalDescription = 'bmiNormalDescription'; + static const bmiUnderweightDescription = 'bmiUnderweightDescription'; + static const bmiOverweightDescription = 'bmiOverweightDescription'; + static const caloriesMaintenanceDescription = 'caloriesMaintenanceDescription'; + static const caloriesModerateDeficitDescription = 'caloriesModerateDeficitDescription'; + static const caloriesAggressiveDeficitDescription = 'caloriesAggressiveDeficitDescription'; + static const bodyFatEssentialDescription = 'bodyFatEssentialDescription'; + static const bodyFatFitnessDescription = 'bodyFatFitnessDescription'; + static const bodyFatAverageDescription = 'bodyFatAverageDescription'; + static const bodyFatObeseDescription = 'bodyFatObeseDescription'; + static const bmrNormalDescription = 'bmrNormalDescription'; + static const bmrLowDescription = 'bmrLowDescription'; + static const bmrHighDescription = 'bmrHighDescription'; + static const ibwAtTargetDescription = 'ibwAtTargetDescription'; + static const ibwBelowTargetDescription = 'ibwBelowTargetDescription'; + static const ibwAboveTargetDescription = 'ibwAboveTargetDescription'; + static const ibwCloseToRangeDescription = 'ibwCloseToRangeDescription'; + static const ibwUnderweightDescription = 'ibwUnderweightDescription'; + static const ibwUnderweightGenericDescription = 'ibwUnderweightGenericDescription'; + static const ibwOverweightDescription = 'ibwOverweightDescription'; + static const ibwOverweightGenericDescription = 'ibwOverweightGenericDescription'; + static const dietVeryLowCarbsDescription = 'dietVeryLowCarbsDescription'; + static const dietLowCarbsDescription = 'dietLowCarbsDescription'; + static const dietModerateCarbsDescription = 'dietModerateCarbsDescription'; + static const dietUSDAGuidelinesDescription = 'dietUSDAGuidelinesDescription'; + static const dietZoneDietDescription = 'dietZoneDietDescription'; + static const contextDependent = 'contextDependent'; + static const calculatedValue = 'calculatedValue'; + static const calculationFormula = 'calculationFormula'; + static const confirmYourLocation = 'confirmYourLocation'; + static const confirmYourLocationDesc = 'confirmYourLocationDesc'; + static const insideHospital = 'insideHospital'; + static const outsideHospital = 'outsideHospital'; + static const servicePriceList = 'servicePriceList'; + static const servicePriceListDesc = 'servicePriceListDesc'; + static const servicePriceListRights = 'servicePriceListRights'; + static const serviceName = 'serviceName'; + static const noFreeSlot = 'noFreeSlot'; + static const noThanksIKnowTheClinic = 'noThanksIKnowTheClinic'; + static const unableToSendOTP = 'unableToSendOTP'; + static const loadingAIAnalysis = 'loadingAIAnalysis'; + static const symptoms = 'symptoms'; + static const insuranceInActive = 'insuranceInActive'; + static const insuranceInActiveContactSupport = 'insuranceInActiveContactSupport'; + static const updateAppNow = 'updateAppNow'; + static const Dr = 'Dr'; + static const reschedulingAppo = 'reschedulingAppo'; + static const invalidEligibility = 'invalidEligibility'; + static const invalidInsurance = 'invalidInsurance'; + static const continueCash = 'continueCash'; + static const applewatch = 'applewatch'; + static const applehealthapplicationshouldbeinstalledinyourphone = 'applehealthapplicationshouldbeinstalledinyourphone'; + static const unabletodetectapplicationinstalledpleasecomebackonceinstalled = 'unabletodetectapplicationinstalledpleasecomebackonceinstalled'; + static const applewatchshouldbeconnected = 'applewatchshouldbeconnected'; + static const samsungwatch = 'samsungwatch'; + static const samsunghealthapplicationshouldbeinstalledinyourphone = 'samsunghealthapplicationshouldbeinstalledinyourphone'; + static const samsungwatchshouldbeconnected = 'samsungwatchshouldbeconnected'; + static const huaweiwatch = 'huaweiwatch'; + static const huaweihealthapplicationshouldbeinstalledinyourphone = 'huaweihealthapplicationshouldbeinstalledinyourphone'; + static const huaweiwatchshouldbeconnected = 'huaweiwatchshouldbeconnected'; + static const whoopwatch = 'whoopwatch'; + static const whoophealthapplicationshouldbeinstalledinyourphone = 'whoophealthapplicationshouldbeinstalledinyourphone'; + static const whoopwatchshouldbeconnected = 'whoopwatchshouldbeconnected'; + static const updatetheinformation = 'updatetheinformation'; + static const timeFor = 'timeFor'; + static const hmgPolicies = 'hmgPolicies'; + static const darkMode = 'darkMode'; + static const featureComingSoonDescription = 'featureComingSoonDescription'; + static const generateAiAnalysisResult = 'generateAiAnalysisResult'; + static const ratings = 'ratings'; + static const hmgPharmacyText = 'hmgPharmacyText'; + static const insuranceRequestSubmittedSuccessfully = 'insuranceRequestSubmittedSuccessfully'; + static const updatingEmailAddress = 'updatingEmailAddress'; + static const verifyInsurance = 'verifyInsurance'; + static const tests = 'tests'; + static const calendarPermissionAlert = 'calendarPermissionAlert'; + static const sortByNearestLocation = 'sortByNearestLocation'; + static const giveLocationPermissionForNearestList = 'giveLocationPermissionForNearestList'; + static const sortByLocation = 'sortByLocation'; + static const timeForFirstReminder = 'timeForFirstReminder'; + static const reminderRemovalNote = 'reminderRemovalNote'; + static const communicationLanguage = 'communicationLanguage'; + static const cmcServiceHeader = 'cmcServiceHeader'; + static const cmcServiceDescription = 'cmcServiceDescription'; + static const eReferralServiceHeader = 'eReferralServiceHeader'; + static const eReferralServiceDescription = 'eReferralServiceDescription'; + static const bloodDonationServiceHeader = 'bloodDonationServiceHeader'; + static const bloodDonationServiceDescription = 'bloodDonationServiceDescription'; + static const healthTrackersServiceHeader = 'healthTrackersServiceHeader'; + static const healthTrackersServiceDescription = 'healthTrackersServiceDescription'; + static const waterConsumptionServiceHeader = 'waterConsumptionServiceHeader'; + static const waterConsumptionServiceDescription = 'waterConsumptionServiceDescription'; + static const smartWatchServiceHeader = 'smartWatchServiceHeader'; + static const smartWatchServiceDescription = 'smartWatchServiceDescription'; + static const liveChatServiceHeader = 'liveChatServiceHeader'; + static const liveChatServiceDescription = 'liveChatServiceDescription'; + static const emergencyServiceHeader = 'emergencyServiceHeader'; + static const emergencyServiceDescription = 'emergencyServiceDescription'; + static const homeHealthCareServiceHeader = 'homeHealthCareServiceHeader'; + static const homeHealthCareServiceDescription = 'homeHealthCareServiceDescription'; + static const profileOnlyText = 'profileOnlyText'; + static const information = 'information'; + static const noFavouriteDoctors = 'noFavouriteDoctors'; + static const addDoctors = 'addDoctors'; + static const favouriteList = 'favouriteList'; + static const later = 'later'; + static const cancelAppointmentConfirmMessage = 'cancelAppointmentConfirmMessage'; + static const acknowledged = 'acknowledged'; + static const searchLabResults = 'searchLabResults'; + static const callForAssistance = 'callForAssistance'; + static const oneWaySubtitle = 'oneWaySubtitle'; + static const twoWaySubtitle = 'twoWaySubtitle'; + static const toHospitalSubtitle = 'toHospitalSubtitle'; + static const fromHospitalSubtitle = 'fromHospitalSubtitle'; + static const clinicSchedule = 'clinicSchedule'; + static const doctorAddedToFavourite = 'doctorAddedToFavourite'; + static const doctorRemovedFromFavourite = 'doctorRemovedFromFavourite'; + static const addNewFavorite = 'addNewFavorite'; + static const favourites = 'favourites'; + static const pendingAncillaryOrders = 'pendingAncillaryOrders'; + static const liveCarePermissions = 'liveCarePermissions'; + static const containsImage = 'containsImage'; + static const servicesSelected = 'servicesSelected'; + static const selectMedicalFileFromFamily = 'selectMedicalFileFromFamily'; + static const anyFileFromHMG = 'anyFileFromHMG'; + static const noDistance = 'noDistance'; + static const enterAmount = 'enterAmount'; + static const selectHospitalContinue = 'selectHospitalContinue'; + static const year = 'year'; + static const notifyPrescription = 'notifyPrescription'; + static const doctorRatingAppointment = 'doctorRatingAppointment'; + static const ratingSubmitted = 'ratingSubmitted'; + static const rateTheDoctor = 'rateTheDoctor'; + static const downloadInvoice = 'downloadInvoice'; + static const approvalDetails = 'approvalDetails'; + static const obese = 'obese'; + static const overWeight = 'overWeight'; + static const underWeight = 'underWeight'; + static const nearestGate = 'nearestGate'; + static const RRTDDetails = 'RRTDDetails'; + static const normalMapType = 'normalMapType'; + static const satelliteMapType = 'satelliteMapType'; + static const terrainMapType = 'terrainMapType'; + static const hybridMapType = 'hybridMapType'; + static const openCamera = 'openCamera'; + static const openGallery = 'openGallery'; + static const openFiles = 'openFiles'; + static const generateAiAnalysisRadResult = 'generateAiAnalysisRadResult'; + static const grantLocationPermission = 'grantLocationPermission'; + static const NoBookedAppointments = 'NoBookedAppointments'; + static const aiDisclaimerRad = 'aiDisclaimerRad'; + static const imageSizeTooLarge = 'imageSizeTooLarge'; + static const profileImageUpdatedSuccessfully = 'profileImageUpdatedSuccessfully'; + static const failedToProcessImage = 'failedToProcessImage'; + static const cameraGalleryPermissionMessage = 'cameraGalleryPermissionMessage'; + static const cameraGalleryPermissionRequired = 'cameraGalleryPermissionRequired'; + static const cameraPermissionMessage = 'cameraPermissionMessage'; + static const cameraPermissionRequired = 'cameraPermissionRequired'; + static const galleryPermissionMessage = 'galleryPermissionMessage'; + static const galleryPermissionRequired = 'galleryPermissionRequired'; + static const failedToCheckPermissions = 'failedToCheckPermissions'; + static const takePhotoWithCamera = 'takePhotoWithCamera'; + static const selectFromPhotoLibrary = 'selectFromPhotoLibrary'; + static const selectDocumentFiles = 'selectDocumentFiles'; + static const profilePicture = 'profilePicture'; + static const sendingAskDrRequest = 'sendingAskDrRequest'; + static const askDrRequestSentSuccess = 'askDrRequestSentSuccess'; + static const onlineCheckIn24HoursOnly = 'onlineCheckIn24HoursOnly'; + +} diff --git a/lib/presentation/home/widgets/habib_wallet_card.dart b/lib/presentation/home/widgets/habib_wallet_card.dart index 2a45e2f5..e96f35c3 100644 --- a/lib/presentation/home/widgets/habib_wallet_card.dart +++ b/lib/presentation/home/widgets/habib_wallet_card.dart @@ -26,7 +26,7 @@ class HabibWalletCard extends StatelessWidget { Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - LocaleKeys.myBalance.tr(context: context).toText16(isBold: true), + LocaleKeys.myBalanceSubtitle.tr(context: context).toText16(isBold: true), // Row( // children: [ // LocaleKeys.viewAllServices.tr(context: context).toText12(color: AppColors.primaryRedColor, isBold: true), @@ -57,7 +57,7 @@ class HabibWalletCard extends StatelessWidget { // Row( // mainAxisAlignment: MainAxisAlignment.spaceBetween, // children: [ - LocaleKeys.habibWallet.tr(context: context).toText16(isBold: true, letterSpacing: -0.2), + LocaleKeys.habibWallet2.tr(context: context).toText16(isBold: true, letterSpacing: -0.2), // Container( // height: 40.h, // width: 40.h, From 76c301384040c344a61141c6ad327a29092f1df3 Mon Sep 17 00:00:00 2001 From: Sultan khan Date: Mon, 13 Apr 2026 17:09:23 +0300 Subject: [PATCH 15/45] no message --- lib/generated/codegen_loader.g.dart | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/lib/generated/codegen_loader.g.dart b/lib/generated/codegen_loader.g.dart index 1ac71827..43248236 100644 --- a/lib/generated/codegen_loader.g.dart +++ b/lib/generated/codegen_loader.g.dart @@ -214,6 +214,7 @@ class CodegenLoader extends AssetLoader{ "enterEmail": "يرجى إدخال البريد الإلكتروني", "family": "عائلتي", "familyTitle": "ملفات عائلتي", + "familyTitle2": "ملفات العائلة", "myFamily": "عائلتي", "addNewMember": "إضافة فرد جديد للعائلة", "sentRequests": "الطلبات المرسلة", @@ -234,7 +235,7 @@ class CodegenLoader extends AssetLoader{ "unit": "الوحدة", "request": "طلب", "memberName": "اسم العضو", - "switchLogin": "تبديل", + "switchLogin": "عرض", "removeMember": "إزالة", "allowView": "السماح", "rejectView": "رفض", @@ -941,7 +942,7 @@ class CodegenLoader extends AssetLoader{ "totalAmountToPay": "المبلغ الإجمالي المستحق", "vat15": "ضريبة القيمة المضافة 15%", "liveCare": "لايف كير", - "recentVisits": "الزيارات الأخيرة", + "recentVisits": "قائمة الزيارات", "favouriteDoctors": "الأطباء المفضلون", "searchByClinic": "البحث حسب العيادة", "tapToSelectClinic": "انقر لاختيار العيادة", @@ -1299,7 +1300,7 @@ class CodegenLoader extends AssetLoader{ "referenceRange": "النطاق المرجعي", "downloadReport": "تنزيل التقرير", "generatingReport": "جارٍ إنشاء التقرير، يرجى الانتظار...", - "noLabResults": "ليس لديك أي نتائج مختبرية حتى الآن.", + "noLabResults": "لا يوجد نتائج", "labResultDetails": "تفاصيل نتائج المختبر", "resultOf": "نتيجة {date}", "whatIsThisResult": "ما هي هذه النتيجة؟", @@ -1562,14 +1563,14 @@ class CodegenLoader extends AssetLoader{ "bmi": "مؤشر كتلة الجسم", "yesPleaseINeedHelp": "نعم، من فضلك أريد المساعدة", "aiOverView": "AI ملخص", - "generateAiAnalysis": "قم بإجراء تحليل لهذا الطلب AI", + "generateAiAnalysis": "التحليل باستخدام الذكاء الاصطناعي", "aiAnalysis": "AI تحليل", - "prediction": "تنبؤ", + "prediction": "التوقعات", "prevention": "وقاية", "disclaimer": "تنصل", "thisAboveInfo": "المعلومات المذكورة أعلاه مُولّدة بواسطة AI بناءً على نتائج تحاليلك المخبرية، وهي لأغراض إعلامية فقط. لا ينبغي اعتبارها تشخيصًا طبيًا أو خطة علاجية. استشر طبيبك دائمًا للحصول على نصيحة طبية مُخصصة قبل اتخاذ أي قرارات تتعلق بصحتك.", "aiDisclaimer": "سيتم مشاركة بيانات نتائج تحاليلك المخبرية بشكل آمن مع خدمة الذكاء الاصطناعي لدينا لتحليلها. يساعد هذا في تقديم رؤى صحية مُخصصة. هل ترغب في المتابعة؟", - "consent": "موافقة", + "consent": "نتائج المختبر", "bmiNormalDescription": "مؤشر كتلة جسمك ضمن المعدل الصحي. استمر في اتباع نظام غذائي متوازن، وممارسة النشاط البدني بانتظام، وإجراء الفحوصات الدورية للحفاظ على صحة جيدة. راقب أي تغييرات ملحوظة مع مرور الوقت.", "bmiUnderweightDescription": "يشير مؤشر كتلة الجسم إلى أنك تعاني من نقص الوزن. لذا، يُنصح بزيادة السعرات الحرارية المتناولة من خلال تناول الأطعمة الغنية بالعناصر الغذائية، وممارسة تمارين المقاومة لبناء العضلات، واستشارة أخصائي رعاية صحية للتحقق من وجود أسباب كامنة.", "bmiOverweightDescription": "يشير مؤشر كتلة الجسم إلى زيادة الوزن. لذا، يُنصح بالسعي إلى إنقاص الوزن تدريجياً وبشكل مستدام من خلال تقليل السعرات الحرارية بشكل معتدل، وممارسة النشاط البدني بانتظام، واختيار الأطعمة الصحية. استشر طبيبك قبل إجراء أي تغييرات جذرية في نمط حياتك.", @@ -1644,7 +1645,7 @@ class CodegenLoader extends AssetLoader{ "insuranceRequestSubmittedSuccessfully": "تم إرسال طلب تحديث بيانات التأمين بنجاح. سيتم إعلامك بمجرد الانتهاء.", "updatingEmailAddress": "جارٍ تحديث عنوان البريد الإلكتروني، يرجى الانتظار...", "verifyInsurance": "التحقق من التأمين", - "tests": "تحليل", + "tests": "تحاليل", "calendarPermissionAlert": "يرجى منح إذن الوصول إلى التقويم من إعدادات التطبيق لضبط تذكير تناول الدواء.", "sortByNearestLocation": "فرز حسب الأقرب إلى موقعك", "giveLocationPermissionForNearestList": "يرجى منح إذن الوصول إلى الموقع من إعدادات التطبيق لعرض أقرب المواقع.", @@ -1937,6 +1938,7 @@ static const Map _en_US = { "enterEmail": "Please Enter Email", "family": "My Family", "familyTitle": "My Family Files", + "familyTitle2": "My Family Files", "addNewMember": "Add Family Member", "sentRequests": "Sent Requests", "recievedRequests": "Recieved Requests", @@ -2960,6 +2962,7 @@ static const Map _en_US = { "hmgServices": "HMG Services", "personalServices": "Personal Services", "habibWallet": "Habib Wallet", + "habibWallet2": "Habib Wallet", "loginToViewWalletBalance": "Login to view your wallet balance", "loginToViewMedicalFile": "Login to view your medical file", "addMember": "Add Member", From 772f6caa38e2ebdacbe4de6116a98bb7ab7cae30 Mon Sep 17 00:00:00 2001 From: Sultan khan Date: Mon, 13 Apr 2026 17:29:49 +0300 Subject: [PATCH 16/45] updates --- lib/generated/codegen_loader.g.dart | 32 ++++++--- lib/generated/locale_kesy.g.dart | 8 +++ lib/generated/locale_keys.g.dart | 2 + .../widgets/appointment_card.dart | 65 ++++++++++--------- 4 files changed, 69 insertions(+), 38 deletions(-) diff --git a/lib/generated/codegen_loader.g.dart b/lib/generated/codegen_loader.g.dart index 2b55cfc1..b8c7ee0b 100644 --- a/lib/generated/codegen_loader.g.dart +++ b/lib/generated/codegen_loader.g.dart @@ -1190,14 +1190,22 @@ class CodegenLoader extends AssetLoader{ "monitorCholesterolLevels": "راقب مستويات الكوليسترول، وقيّم مخاطر صحة القلب، واتخذ خطوات استباقية للرفاهية.", "triglyceridesFatBlood": "الدهون الثلاثية في الدم", "understandTriglyceridesImpact": "افهم تأثير الدهون الثلاثية على صحة القلب مع رؤى مخصصة وتوصيات الخبراء.", - "bmiCalculator": "حاسبة\nمؤشر كتلة الجسم", - "caloriesCalculator": "حاسبة\nالسعرات الحرارية", - "bmrCalculator": "حاسبة\nمعدل الأيض الأساسي", - "idealBodyWeight": "الوزن المثالي\nللجسم", - "bodyFatCalculator": "حاسبة\nدهون الجسم", - "carbsProteinFat": "الكربوهيدرات\nالبروتين والدهون", - "ovulationPeriod": "فترة\nالإباضة", - "deliveryDueDate": "تاريخ الولادة\nالمتوقع", + "bmiCalculator": "حاسبة مؤشر كتلة الجسم", + "bmiCalculatorDesc": "احسب مؤشر كتلة جسمك لفهم نطاق وزنك الصحي.", + "caloriesCalculator": "حاسبةالسعرات الحرارية", + "caloriesCalculatorDesc": "اكتشف عدد السعرات الحرارية التي تحتاجها يومياً للحفاظ على الوزن أو فقدانه.", + "bmrCalculator": "حاسبة معدل الأيض الأساسي", + "bmrCalculatorDesc": "حدد معدل الأيض الأساسي ومتطلباتك اليومية من الطاقة.", + "idealBodyWeight": "الوزن المثالي للجسم", + "idealBodyWeightDesc": "اكتشف وزنك المثالي بناءً على الطول والعمر وبنية الجسم.", + "bodyFatCalculator": "حاسبة دهون الجسم", + "bodyFatCalculatorDesc": "قدّر نسبة دهون جسمك لتتبع أهداف اللياقة والصحة.", + "carbsProteinFat": "الكربوهيدرات البروتين والدهون", + "carbsProteinFatDesc": "وازن بين العناصر الغذائية مع النسب الصحيحة من الكربوهيدرات والبروتين والدهون.", + "ovulationPeriod": "فترة الإباضة", + "ovulationPeriodDesc": "تتبع فترة خصوبتك وخطط للحمل بدقة.", + "deliveryDueDate": "تاريخ الولادة المتوقع", + "deliveryDueDateDesc": "احسب تاريخ ولادتك المتوقع وراقب مراحل الحمل.", "low": "منخفض", "preDiabetic": "ما قبل السكري", "high": "مرتفع", @@ -2911,13 +2919,21 @@ static const Map _en_US = { "triglyceridesFatBlood": "Triglycerides Fat Blood", "understandTriglyceridesImpact": "Understand triglycerides' impact on heart health with personalized insights and expert recommendations.", "bmiCalculator": "BMI Calculator", + "bmiCalculatorDesc": "Calculate your body mass index to understand your healthy weight range.", "caloriesCalculator": "Calories Calculator", + "caloriesCalculatorDesc": "Find out how many calories you need daily to maintain or lose weight.", "bmrCalculator": "BMR Calculator", + "bmrCalculatorDesc": "Determine your basal metabolic rate and daily energy requirements.", "idealBodyWeight": "Ideal Body Weight", + "idealBodyWeightDesc": "Discover your ideal weight based on height, age, and body structure.", "bodyFatCalculator": "Body Fat Calculator", + "bodyFatCalculatorDesc": "Estimate your body fat percentage to track fitness and health goals.", "carbsProteinFat": "Carbs Protein & Fat", + "carbsProteinFatDesc": "Balance your macros with the right carbs, protein, and fat ratios.", "ovulationPeriod": "Ovulation Period", + "ovulationPeriodDesc": "Track your fertile window and plan for conception with accuracy.", "deliveryDueDate": "Delivery Due Date", + "deliveryDueDateDesc": "Calculate your expected delivery date and monitor pregnancy milestones.", "low": "Low", "preDiabetic": "Pre-diabetic", "high": "High", diff --git a/lib/generated/locale_kesy.g.dart b/lib/generated/locale_kesy.g.dart index 41bfb2b0..06f92632 100644 --- a/lib/generated/locale_kesy.g.dart +++ b/lib/generated/locale_kesy.g.dart @@ -1177,13 +1177,21 @@ abstract class LocaleKeys { static const triglyceridesFatBlood = 'triglyceridesFatBlood'; static const understandTriglyceridesImpact = 'understandTriglyceridesImpact'; static const bmiCalculator = 'bmiCalculator'; + static const bmiCalculatorDesc = 'bmiCalculatorDesc'; static const caloriesCalculator = 'caloriesCalculator'; + static const caloriesCalculatorDesc = 'caloriesCalculatorDesc'; static const bmrCalculator = 'bmrCalculator'; + static const bmrCalculatorDesc = 'bmrCalculatorDesc'; static const idealBodyWeight = 'idealBodyWeight'; + static const idealBodyWeightDesc = 'idealBodyWeightDesc'; static const bodyFatCalculator = 'bodyFatCalculator'; + static const bodyFatCalculatorDesc = 'bodyFatCalculatorDesc'; static const carbsProteinFat = 'carbsProteinFat'; + static const carbsProteinFatDesc = 'carbsProteinFatDesc'; static const ovulationPeriod = 'ovulationPeriod'; + static const ovulationPeriodDesc = 'ovulationPeriodDesc'; static const deliveryDueDate = 'deliveryDueDate'; + static const deliveryDueDateDesc = 'deliveryDueDateDesc'; static const low = 'low'; static const preDiabetic = 'preDiabetic'; static const high = 'high'; diff --git a/lib/generated/locale_keys.g.dart b/lib/generated/locale_keys.g.dart index 10528bb3..06f92632 100644 --- a/lib/generated/locale_keys.g.dart +++ b/lib/generated/locale_keys.g.dart @@ -200,6 +200,7 @@ abstract class LocaleKeys { static const enterEmail = 'enterEmail'; static const family = 'family'; static const familyTitle = 'familyTitle'; + static const familyTitle2 = 'familyTitle2'; static const myFamily = 'myFamily'; static const addNewMember = 'addNewMember'; static const sentRequests = 'sentRequests'; @@ -1235,6 +1236,7 @@ abstract class LocaleKeys { static const hmgServices = 'hmgServices'; static const personalServices = 'personalServices'; static const habibWallet = 'habibWallet'; + static const habibWallet2 = 'habibWallet2'; static const loginToViewWalletBalance = 'loginToViewWalletBalance'; static const loginToViewMedicalFile = 'loginToViewMedicalFile'; static const addMember = 'addMember'; diff --git a/lib/presentation/appointments/widgets/appointment_card.dart b/lib/presentation/appointments/widgets/appointment_card.dart index 8923e9fa..fabb9043 100644 --- a/lib/presentation/appointments/widgets/appointment_card.dart +++ b/lib/presentation/appointments/widgets/appointment_card.dart @@ -28,6 +28,7 @@ import 'package:hmg_patient_app_new/widgets/loader/bottomsheet_loader.dart'; import 'package:hmg_patient_app_new/widgets/routes/custom_page_route.dart'; import 'dart:ui' as ui; import 'package:hmg_patient_app_new/presentation/appointments/appointment_payment_page.dart'; +import 'package:lottie/lottie.dart'; class AppointmentCard extends StatefulWidget { final PatientAppointmentHistoryResponseModel patientAppointmentHistoryResponseModel; @@ -705,42 +706,46 @@ class _AppointmentCardState extends State { return Column( crossAxisAlignment: CrossAxisAlignment.center, children: [ - // Message text + Lottie.asset(AppAnimations.warningAnimation, + repeat: false, reverse: false, frameRate: FrameRate(60), width: 100.h, height: 100.h, fit: BoxFit.fill), + SizedBox(height: 12,), LocaleKeys.upcomingPaymentPending.tr(context: context).toText14( color: AppColors.textColor, isCenter: true, ), SizedBox(height: 24.h), + + // Countdown Timer - DD : HH : MM : SS format with labels - Row( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - // Days - _buildTimeUnit( - _timeRemaining != null ? _timeRemaining!.inDays.toString().padLeft(2, '0') : '00', - LocaleKeys.days.tr(context: context), - ), - _buildTimeSeparator(), - // Hours - _buildTimeUnit( - _timeRemaining != null ? _timeRemaining!.inHours.remainder(24).toString().padLeft(2, '0') : '00', - LocaleKeys.hours.tr(context: context), - ), - _buildTimeSeparator(), - // Minutes - _buildTimeUnit( - _timeRemaining != null ? _timeRemaining!.inMinutes.remainder(60).toString().padLeft(2, '0') : '00', - LocaleKeys.minutes.tr(context: context), - ), - _buildTimeSeparator(), - // Seconds - _buildTimeUnit( - _timeRemaining != null ? _timeRemaining!.inSeconds.remainder(60).toString().padLeft(2, '0') : '00', - LocaleKeys.seconds.tr(context: context), - ), - ], - ), + // Row( + // mainAxisAlignment: MainAxisAlignment.center, + // crossAxisAlignment: CrossAxisAlignment.start, + // children: [ + // // Days + // _buildTimeUnit( + // _timeRemaining != null ? _timeRemaining!.inDays.toString().padLeft(2, '0') : '00', + // LocaleKeys.days.tr(context: context), + // ), + // _buildTimeSeparator(), + // // Hours + // _buildTimeUnit( + // _timeRemaining != null ? _timeRemaining!.inHours.remainder(24).toString().padLeft(2, '0') : '00', + // LocaleKeys.hours.tr(context: context), + // ), + // _buildTimeSeparator(), + // // Minutes + // _buildTimeUnit( + // _timeRemaining != null ? _timeRemaining!.inMinutes.remainder(60).toString().padLeft(2, '0') : '00', + // LocaleKeys.minutes.tr(context: context), + // ), + // _buildTimeSeparator(), + // // Seconds + // _buildTimeUnit( + // _timeRemaining != null ? _timeRemaining!.inSeconds.remainder(60).toString().padLeft(2, '0') : '00', + // LocaleKeys.seconds.tr(context: context), + // ), + // ], + // ), SizedBox(height: 24.h), // Green Acknowledge button with checkmark icon CustomButton( From 4f60227429ae55e18ca1a8d2c48e2952278f8653 Mon Sep 17 00:00:00 2001 From: haroon amjad Date: Mon, 13 Apr 2026 19:01:03 +0300 Subject: [PATCH 17/45] LiveCare Video Call fixes --- lib/core/cache_consts.dart | 1 + lib/core/utils/push_notification_handler.dart | 2 + .../tele_consultation/zoom/call_screen.dart | 108 ++++++++---------- lib/splashPage.dart | 4 +- 4 files changed, 56 insertions(+), 59 deletions(-) diff --git a/lib/core/cache_consts.dart b/lib/core/cache_consts.dart index c1e06aa3..c829adbf 100644 --- a/lib/core/cache_consts.dart +++ b/lib/core/cache_consts.dart @@ -78,5 +78,6 @@ class CacheConst { static const String isMonthlyReportEnabled = 'is-monthly-report-enabled'; static const String zoomRoomID = 'zoom-room-id'; + static const String callTypeID = 'call-type-id'; static String isAppOpenedFromCall = "is_app_opened_from_call"; } diff --git a/lib/core/utils/push_notification_handler.dart b/lib/core/utils/push_notification_handler.dart index e2925c29..6fc248f9 100644 --- a/lib/core/utils/push_notification_handler.dart +++ b/lib/core/utils/push_notification_handler.dart @@ -46,11 +46,13 @@ _incomingCall(Map data) async { // LandingPage.isOpenCallPage = true; String roomID = data['session_id'] ?? ''; + String callTypeID = data['AppointmentNo'] ?? ''; // GetIt.instance().saveString(key: CacheConst.zoomRoomID, value: roomID); // GetIt.instance().saveBool(key: CacheConst.isAppOpenedFromCall, value: true); Utils.saveStringFromPrefs(CacheConst.zoomRoomID, roomID); + Utils.saveStringFromPrefs(CacheConst.callTypeID, callTypeID); Utils.saveBoolFromPrefs(CacheConst.isAppOpenedFromCall, true); WidgetsFlutterBinding.ensureInitialized(); diff --git a/lib/presentation/tele_consultation/zoom/call_screen.dart b/lib/presentation/tele_consultation/zoom/call_screen.dart index 21836a8a..a2721aba 100644 --- a/lib/presentation/tele_consultation/zoom/call_screen.dart +++ b/lib/presentation/tele_consultation/zoom/call_screen.dart @@ -84,6 +84,7 @@ class _CallScreenState extends State { Color chatTextColor = const Color(0xFFAAAAAA); Widget changeNamePopup; final args = ModalRoute.of(context)!.settings.arguments as CallArguments; + var isFrontCamera = useState(true); useEffect(() { Future.microtask(() async { @@ -93,8 +94,11 @@ class _CallScreenState extends State { try { Map SDKaudioOptions = {"connect": true, "mute": false, "autoAdjustSpeakerVolume": false}; + // Map SDKvideoOptions = { + // "localVideoOn": true, + // }; Map SDKvideoOptions = { - "localVideoOn": true, + "localVideoOn": args.callType == 1 ? true : false, }; JoinSessionConfig joinSession = JoinSessionConfig( sessionName: args.sessionName, @@ -302,6 +306,19 @@ class _CallScreenState extends State { List? remoteUserList = await zoom.session.getRemoteUsers(); var leftUserListJson = jsonDecode(data['leftUsers']) as List; List leftUserLis = leftUserListJson.map((userJson) => ZoomVideoSdkUser.fromJson(userJson)).toList(); + + // If no remote users remain, the other participant has left — end the session + if (remoteUserList == null || remoteUserList.isEmpty) { + await zoom.leaveSession(true); + Navigator.pushAndRemoveUntil( + context, + CustomPageRoute( + page: LandingNavigation(), + ), + (r) => false); + return; + } + if (fullScreenUser.value != null) { for (var user in leftUserLis) { { @@ -313,8 +330,8 @@ class _CallScreenState extends State { } else { fullScreenUser.value = mySelf; } - remoteUserList?.add(mySelf!); - users.value = remoteUserList!; + remoteUserList.add(mySelf!); + users.value = remoteUserList; }); final userNameChangedListener = eventListener.addListener(EventType.onUserNameChanged, (data) async { @@ -817,63 +834,38 @@ class _CallScreenState extends State { } void onPressCameraList() async { - List options = []; List cameraList = await zoom.videoHelper.getCameraList(); - for (var camera in cameraList) { - options.add( - ListTile( - title: Text( - camera.deviceName, - style: const TextStyle( - fontSize: 14, - fontWeight: FontWeight.normal, - color: Colors.black, - ), - ), - onTap: () async => { - await zoom.videoHelper.switchCamera(camera.deviceId), - Navigator.of(context).pop(), - }, - ), - ); + if (cameraList.isEmpty) return; + + // Find the target camera by toggling between front and back + ZoomVideoSdkCameraDevice? targetCamera; + try { + if (isFrontCamera.value) { + // Currently front, switch to back + targetCamera = cameraList.firstWhere( + (c) => c.deviceName.toLowerCase().contains('back') || c.deviceName.toLowerCase().contains('rear'), + ); + } else { + // Currently back, switch to front + targetCamera = cameraList.firstWhere( + (c) => c.deviceName.toLowerCase().contains('front') || c.deviceName.toLowerCase().contains('facing'), + ); + } + } catch (_) { + targetCamera = null; + } + + // Fallback: if we can't identify by name, just pick the other camera + if (targetCamera == null && cameraList.length >= 2) { + final currentIndex = isFrontCamera.value ? 0 : 1; + final nextIndex = (currentIndex + 1) % cameraList.length; + targetCamera = cameraList[nextIndex]; + } + + if (targetCamera != null) { + await zoom.videoHelper.switchCamera(targetCamera.deviceId); + isFrontCamera.value = !isFrontCamera.value; } - options.add( - ListTile( - title: Text( - "Cancel", - style: const TextStyle( - fontSize: 14, - fontWeight: FontWeight.normal, - color: Colors.black, - ), - ), - onTap: () async => { - Navigator.of(context).pop(), - }, - ), - ); - showDialog( - context: context, - builder: (context) { - return Dialog( - elevation: 0.0, - insetPadding: const EdgeInsets.symmetric(horizontal: 40), - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(20)), - child: SizedBox( - height: options.length * 60, - child: Scrollbar( - child: ListView( - shrinkWrap: true, - scrollDirection: Axis.vertical, - children: ListTile.divideTiles( - context: context, - tiles: options, - ).toList(), - ), - ), - ), - ); - }); } // Future onPressMore() async { diff --git a/lib/splashPage.dart b/lib/splashPage.dart index 64518f30..f17d8bc3 100644 --- a/lib/splashPage.dart +++ b/lib/splashPage.dart @@ -80,7 +80,9 @@ class _SplashScreenState extends State { navigateToTeleConsult() async { String roomID = await Utils.getStringFromPrefs(CacheConst.zoomRoomID); + String callTypeID = await Utils.getStringFromPrefs(CacheConst.callTypeID); print('RoomID: $roomID'); + print('callTypeID: $callTypeID'); // GetIt.instance().remove(key: CacheConst.isAppOpenedFromCall); Utils.removeFromPrefs(CacheConst.isAppOpenedFromCall); @@ -92,7 +94,7 @@ class _SplashScreenState extends State { GetIt.instance().navigatorKey.currentContext!, AppRoutes.zoomCallPage, // arguments: CallArguments(appointmentID, "111", "Patient", "40", "1", true, 1), - arguments: CallArguments(roomID, "123", "Patient", "40", "0", true, 1), + arguments: CallArguments(roomID, "123", "Patient", "40", "0", true, int.parse(callTypeID)), // arguments: CallArguments("SmallDailyStandup9875", "123", "Patient", "40", "0", false, int.parse(widget.incomingCallData!.appointmentNo!)), ); } From 994bf95043e8f5fe3d3efe242594c6332b03b3d5 Mon Sep 17 00:00:00 2001 From: tahaalam Date: Mon, 13 Apr 2026 19:05:54 +0300 Subject: [PATCH 18/45] updates and fixes --- assets/langs/ar-SA.json | 18 +++--- assets/langs/en-US.json | 4 +- lib/generated/locale_keys.g.dart | 16 +++--- .../appointment_details_page.dart | 4 +- lib/presentation/home/landing_page.dart | 57 ++++++++++++++++++- .../widgets/update_email_widget.dart | 2 +- .../update_emergency_contact_widget.dart | 2 +- 7 files changed, 82 insertions(+), 21 deletions(-) diff --git a/assets/langs/ar-SA.json b/assets/langs/ar-SA.json index 9dc024b6..b509107b 100644 --- a/assets/langs/ar-SA.json +++ b/assets/langs/ar-SA.json @@ -123,7 +123,7 @@ "forgotFileNoTitle": "نسيت الملف الطبي", "enterNationalId": "يرجى إدخال رقم الهاتف المحمول ورقم الهوية", "profileInfo": "يرجى إدخال معلومات الملف الشخصي", - "submit": "إرسال", + "submit": "تحديث", "forgotDesc": "أدخل رقم الهاتف المحمول لاستلام رقم الملف الطبي عبر الرسائل القصيرة", "dob": "تاريخ الميلاد:", "hijriDate": "الت��ريخ الهجري", @@ -1295,7 +1295,7 @@ "noInsuranceApprovals": "لم تحصل على أي موافقات تأمينية حتى الآن.", "noInsuranceWithHMG": "ليس لديك تأمين مسجل لدى مجموعة الحبيب الطبية.", "referenceRange": "النطاق المرجعي", - "downloadReport": "تنزيل التقرير", + "downloadReport": "تحميل التقارير", "generatingReport": "جارٍ إنشاء التقرير، يرجى الانتظار...", "noLabResults": "ليس لديك أي نتائج مختبرية حتى الآن.", "labResultDetails": "تفاصيل نتائج المختبر", @@ -1375,7 +1375,7 @@ "notificationsSettings": "إعدادات الإشعارات", "touchIDFaceIDServices": "خدمات Touch ID / Face ID", "personalInformation": "المعلومات الشخصية", - "updateEmailAddress": "تحديث عنوان البريد الإلكتروني", + "updateEmailAddress": "عنوان البريد الالكتروني", "helpAndSupport": "المساعدة والدعم", "permissionsProfile": "الأذونات", "privacyPolicy": "سياسة الخصوصية", @@ -1565,8 +1565,8 @@ "generateAiAnalysis": "قم بإجراء تحليل لهذا الطلب AI", "aiAnalysis": "AI تحليل", "prediction": "تنبؤ", - "prevention": "وقاية", - "disclaimer": "تنصل", + "prevention": "الوقاية", + "disclaimer": "تنبيه", "thisAboveInfo": "المعلومات المذكورة أعلاه مُولّدة بواسطة AI بناءً على نتائج تحاليلك المخبرية، وهي لأغراض إعلامية فقط. لا ينبغي اعتبارها تشخيصًا طبيًا أو خطة علاجية. استشر طبيبك دائمًا للحصول على نصيحة طبية مُخصصة قبل اتخاذ أي قرارات تتعلق بصحتك.", "aiDisclaimer": "سيتم مشاركة بيانات نتائج تحاليلك المخبرية بشكل آمن مع خدمة الذكاء الاصطناعي لدينا لتحليلها. يساعد هذا في تقديم رؤى صحية مُخصصة. هل ترغب في المتابعة؟", "consent": "موافقة", @@ -1637,7 +1637,7 @@ "continueCash": "متابعة الدفع نقدًا", "timeFor": "الوقت", "hmgPolicies": "سياسات مجموعة الحبيب الطبية", - "darkMode": "المظهر الداكن", + "darkMode": "الوضع الداكن", "featureComingSoonDescription": "هذه الميزة ستتوفر قريباً. نحن نعمل جاهدين لإضافة ميزات أكثر تميزاً إلى التطبيق. انتظرونا لمتابعة التحديثات.", "generateAiAnalysisResult": "قم بإجراء تحليل لهذا المختبر AI", "ratings": "التقييمات", @@ -1720,7 +1720,7 @@ "openCamera": "افتح الكاميرا", "openGallery": "افتح المعرض", "openFiles": "فتح الملفات", - "generateAiAnalysisRadResult": "بإنشاء تحليل الذكاء الاصطناعي لهذا التقرير", + "generateAiAnalysisRadResult": "نتيجة الاشعة بالذكاء الاصطناعي", "grantLocationPermission": "يرجى منح إذن الوصول إلى الموقع من إعدادات التطبيق للحصول على نتائج أفضل.", "NoBookedAppointments": "لا توجد مواعيد محجوزة", "aiDisclaimerRad": "سيتم مشاركة بيانات نتائج الأشعة الخاصة بك بشكل آمن مع محلل الذكاء الاصطناعي لدينا لتحليلها. يساعد هذا في توفير رؤى صحية مخصصة. هل ترغب في المتابعة؟", @@ -1744,5 +1744,7 @@ "onlineCheckIn24HoursOnly": "لا تتوفر خدمة تسجيل الوصول عبر الإنترنت إلا خلال 4 ساعات من موعد الحجز.لا تتوفر خدمة تسجيل الوصول عبر الإنترنت إلا خلال 4 ساعات من موعد الحجز.", "searchFor" : "بحث عن", "m": "متر", - "inch": "انش" + "inch": "انش", + "updateEmailAddressTitle": "تحديث البريد الالكتروني: ", + "enterNewNewContactNumber": "الرجاء اضافة رقم اتصال في حالة الطواريء: " } diff --git a/assets/langs/en-US.json b/assets/langs/en-US.json index 311d320c..a913111a 100644 --- a/assets/langs/en-US.json +++ b/assets/langs/en-US.json @@ -1733,5 +1733,7 @@ "onlineCheckIn24HoursOnly": "Online Check-In is only available within 4 hours of the appointment time.", "searchFor": "Search For", "m": "m", -"inch": "in" +"inch": "in", + "updateEmailAddressTitle": "Enter the new email address to be updated: ", + "enterNewNewContactNumber": "Enter the new emergency contact number to be updated: " } diff --git a/lib/generated/locale_keys.g.dart b/lib/generated/locale_keys.g.dart index 75b5e390..88964f6c 100644 --- a/lib/generated/locale_keys.g.dart +++ b/lib/generated/locale_keys.g.dart @@ -1177,20 +1177,20 @@ abstract class LocaleKeys { static const triglyceridesFatBlood = 'triglyceridesFatBlood'; static const understandTriglyceridesImpact = 'understandTriglyceridesImpact'; static const bmiCalculator = 'bmiCalculator'; - static const bmiCalculatorDesc = 'bmiCalculatorDesc'; static const caloriesCalculator = 'caloriesCalculator'; - static const caloriesCalculatorDesc = 'caloriesCalculatorDesc'; static const bmrCalculator = 'bmrCalculator'; - static const bmrCalculatorDesc = 'bmrCalculatorDesc'; static const idealBodyWeight = 'idealBodyWeight'; - static const idealBodyWeightDesc = 'idealBodyWeightDesc'; static const bodyFatCalculator = 'bodyFatCalculator'; - static const bodyFatCalculatorDesc = 'bodyFatCalculatorDesc'; static const carbsProteinFat = 'carbsProteinFat'; - static const carbsProteinFatDesc = 'carbsProteinFatDesc'; static const ovulationPeriod = 'ovulationPeriod'; - static const ovulationPeriodDesc = 'ovulationPeriodDesc'; static const deliveryDueDate = 'deliveryDueDate'; + static const bmiCalculatorDesc = 'bmiCalculatorDesc'; + static const caloriesCalculatorDesc = 'caloriesCalculatorDesc'; + static const bmrCalculatorDesc = 'bmrCalculatorDesc'; + static const idealBodyWeightDesc = 'idealBodyWeightDesc'; + static const bodyFatCalculatorDesc = 'bodyFatCalculatorDesc'; + static const carbsProteinFatDesc = 'carbsProteinFatDesc'; + static const ovulationPeriodDesc = 'ovulationPeriodDesc'; static const deliveryDueDateDesc = 'deliveryDueDateDesc'; static const low = 'low'; static const preDiabetic = 'preDiabetic'; @@ -1735,5 +1735,7 @@ abstract class LocaleKeys { static const searchFor = 'searchFor'; static const m = 'm'; static const inch = 'inch'; + static const updateEmailAddressTitle = 'updateEmailAddressTitle'; + static const enterNewNewContactNumber = 'enterNewNewContactNumber'; } diff --git a/lib/presentation/appointments/appointment_details_page.dart b/lib/presentation/appointments/appointment_details_page.dart index ff656c72..5b012872 100644 --- a/lib/presentation/appointments/appointment_details_page.dart +++ b/lib/presentation/appointments/appointment_details_page.dart @@ -97,8 +97,8 @@ class _AppointmentDetailsPageState extends State { isAppointmentWithin4Hours = true; } - // Check if reminder exists in calendar and update the flag - await _checkAndUpdateReminderStatus(); + // // Check if reminder exists in calendar and update the flag + // await _checkAndUpdateReminderStatus(); } }); diff --git a/lib/presentation/home/landing_page.dart b/lib/presentation/home/landing_page.dart index fc5924ca..2807c57e 100644 --- a/lib/presentation/home/landing_page.dart +++ b/lib/presentation/home/landing_page.dart @@ -510,7 +510,12 @@ class _LandingPageState extends State { pagination: SwiperPagination( alignment: Alignment.bottomCenter, margin: EdgeInsets.only(top: 220.h + 20 + 8 + 24), - builder: DotSwiperPaginationBuilder(color: Color(0xffD9D9D9), activeColor: AppColors.blackBgColor), + builder: _DirectionalDotPaginationBuilder( + color: Color(0xffD9D9D9), + activeColor: AppColors.blackBgColor, + isRTL: isArabic, + totalCount: swiperItemCount, + ), ), itemBuilder: (BuildContext context, int index) { final int actualIndex = isArabic ? (swiperItemCount - 1 - index) : index; @@ -1414,3 +1419,53 @@ class _LandingPageState extends State { ); } } + +/// A custom pagination builder that reverses the active-dot index +/// when the UI is in RTL (Arabic) mode, so the dots visually match +/// the swipe direction. +class _DirectionalDotPaginationBuilder extends SwiperPlugin { + final Color color; + final Color activeColor; + final double size; + final double activeSize; + final double space; + final bool isRTL; + final int totalCount; + + const _DirectionalDotPaginationBuilder({ + required this.color, + required this.activeColor, + required this.isRTL, + required this.totalCount, + this.size = 10.0, + this.activeSize = 10.0, + this.space = 3.0, + }); + + @override + Widget build(BuildContext context, SwiperPluginConfig config) { + final int activeIndex = isRTL + ? (totalCount - 1 - config.activeIndex) + : config.activeIndex; + print("the index is $activeIndex"); + print("the config.activeIndex is ${config.activeIndex}"); + + return Row( + mainAxisSize: MainAxisSize.min, + textDirection: ui.TextDirection.ltr, // always lay out dots left-to-right + children: List.generate(config.itemCount, (i) { + final bool isActive = i == config.activeIndex; + return Container( + margin: EdgeInsets.symmetric(horizontal: space), + width: isActive ? activeSize : size, + height: isActive ? activeSize : size, + decoration: BoxDecoration( + color: isActive ? activeColor : color, + shape: BoxShape.circle, + ), + ); + }), + ); + } +} + diff --git a/lib/presentation/profile_settings/widgets/update_email_widget.dart b/lib/presentation/profile_settings/widgets/update_email_widget.dart index d2633b93..c1952dd0 100644 --- a/lib/presentation/profile_settings/widgets/update_email_widget.dart +++ b/lib/presentation/profile_settings/widgets/update_email_widget.dart @@ -56,7 +56,7 @@ class _UpdateEmailDialogState extends State { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - "Enter the new email address to be updated: ".toText16(textAlign: TextAlign.start, isBold: true), + LocaleKeys.updateEmailAddressTitle.tr().toText16(textAlign: TextAlign.start, isBold: true), SizedBox(height: 12.h), TextInputWidget( labelText: LocaleKeys.email.tr(), diff --git a/lib/presentation/profile_settings/widgets/update_emergency_contact_widget.dart b/lib/presentation/profile_settings/widgets/update_emergency_contact_widget.dart index e1bb59ad..832938da 100644 --- a/lib/presentation/profile_settings/widgets/update_emergency_contact_widget.dart +++ b/lib/presentation/profile_settings/widgets/update_emergency_contact_widget.dart @@ -56,7 +56,7 @@ class _UpdateEmergencyContactDialogState extends State Date: Mon, 13 Apr 2026 19:15:41 +0300 Subject: [PATCH 19/45] updates --- lib/core/app_state.dart | 23 +++++--- .../authentication_view_model.dart | 21 +++++-- .../profile_settings_repo.dart | 2 +- .../profile_settings_view_model.dart | 55 +++++++++--------- .../widgets/profile_picture_widget.dart | 56 +++++++++++-------- 5 files changed, 98 insertions(+), 59 deletions(-) diff --git a/lib/core/app_state.dart b/lib/core/app_state.dart index 85fe9cb2..21f93eed 100644 --- a/lib/core/app_state.dart +++ b/lib/core/app_state.dart @@ -94,24 +94,33 @@ class AppState { String? get getProfileImageData => _profileImageData; set setProfileImageData(String? value) { + // Clear old data first + if (_profileImageData != null && _profileImageData != value) { + print('🔄 Replacing profile image: old data length=${_profileImageData!.length}, new data length=${value?.length ?? 0}'); + } + + // Set new value directly WITHOUT caching _profileImageData = value; - // Persist to cache + if (value != null && value.isNotEmpty) { - cacheService.saveString(key: _profileImageKey, value: value); + print('✅ Profile image set (length: ${value.length}) - NO CACHE'); } else { - cacheService.remove(key: _profileImageKey); + print('🗑️ Profile image cleared - NO CACHE'); } } - /// Load profile image from cache on app initialization + /// Load profile image from cache on app initialization - DISABLED void _loadProfileImageFromCache() { - _profileImageData = cacheService.getString(key: _profileImageKey); + // DO NOT LOAD FROM CACHE - always fetch fresh from API + _profileImageData = null; + print('📂 Profile image cache disabled - will fetch from API'); } - /// Clear profile image from cache (e.g., on logout) + /// Clear profile image data (e.g., on logout or user switch) void clearProfileImageCache() { + print('🧹 Clearing profile image data (was: ${_profileImageData != null ? "${_profileImageData!.length} chars" : "null"})'); _profileImageData = null; - cacheService.remove(key: _profileImageKey); + print('✅ Profile image data cleared - NO CACHE'); } SelectDeviceByImeiRespModelElement? _selectDeviceByImeiRespModelElement; diff --git a/lib/features/authentication/authentication_view_model.dart b/lib/features/authentication/authentication_view_model.dart index 45c2d620..573887e6 100644 --- a/lib/features/authentication/authentication_view_model.dart +++ b/lib/features/authentication/authentication_view_model.dart @@ -1240,6 +1240,12 @@ class AuthenticationViewModel extends ChangeNotifier { try { log("Fetching profile image for patient ID: $patientID"); + + // IMPORTANT: Clear old cache BEFORE fetching new image + // This ensures old data is removed immediately + _appState.clearProfileImageCache(); + log("🧹 Cleared profile image cache before fetch"); + final profileSettingsRepo = GetIt.instance(); final result = await profileSettingsRepo.getProfileImage(patientID: patientID); @@ -1247,6 +1253,8 @@ class AuthenticationViewModel extends ChangeNotifier { (failure) { // Silently fail - profile image is optional log("Failed to fetch profile image: ${failure.message}"); + // Ensure cache is cleared even on failure + _appState.setProfileImageData = null; }, (apiResponse) { if (apiResponse.data != null && apiResponse.data['Patient_GetProfileImageDataList'] != null) { @@ -1254,21 +1262,26 @@ class AuthenticationViewModel extends ChangeNotifier { if (imageList is List && imageList.isNotEmpty) { String? imageData = imageList[0]['ImageData']; if (imageData != null && imageData.isNotEmpty) { + // Set new profile image data - this will update cache and notify all listeners _appState.setProfileImageData = imageData; - log("✅ Profile image loaded and cached successfully"); + log("✅ Profile image loaded and cached successfully for patient: $patientID"); } else { - log("⚠️ Profile image data is empty"); + log("⚠️ Profile image data is empty for patient: $patientID"); + _appState.setProfileImageData = null; } } else { - log("⚠️ Profile image list is empty"); + log("⚠️ Profile image list is empty for patient: $patientID"); + _appState.setProfileImageData = null; } } else { - log("⚠️ No profile image data in response"); + log("⚠️ No profile image data in response for patient: $patientID"); + _appState.setProfileImageData = null; } }, ); } catch (e) { log("❌ Error fetching profile image: $e"); + _appState.setProfileImageData = null; } } } diff --git a/lib/features/profile_settings/profile_settings_repo.dart b/lib/features/profile_settings/profile_settings_repo.dart index d86bd7fd..113a52c0 100644 --- a/lib/features/profile_settings/profile_settings_repo.dart +++ b/lib/features/profile_settings/profile_settings_repo.dart @@ -151,7 +151,7 @@ class ProfileSettingsRepoImp implements ProfileSettingsRepo { } @override - Future>> getProfileImage({ + Future>> getProfileImage({ required int patientID, }) async { final Map body = { diff --git a/lib/features/profile_settings/profile_settings_view_model.dart b/lib/features/profile_settings/profile_settings_view_model.dart index b208494a..5d2f58d4 100644 --- a/lib/features/profile_settings/profile_settings_view_model.dart +++ b/lib/features/profile_settings/profile_settings_view_model.dart @@ -189,19 +189,15 @@ class ProfileSettingsViewModel extends ChangeNotifier { Function(String)? onError, bool forceRefresh = false, // Add flag to force refresh }) async { - // Skip API call if image is already loaded and not forcing refresh - if (!forceRefresh && GetIt.instance().getProfileImageData != null) { - // Use cached data - profileImageData = GetIt.instance().getProfileImageData; - if (onSuccess != null) { - onSuccess(profileImageData); - } - return; - } + print('🌐 Fetching profile image from API for patient: $patientID (forceRefresh: $forceRefresh)'); + + // IMPORTANT: Always clear old data BEFORE fetching + // Do NOT use cached data - always fetch fresh from API + profileImageData = null; isProfileImageLoading = true; profileImageError = null; - notifyListeners(); + notifyListeners(); // Notify to show loading state final result = await profileSettingsRepo.getProfileImage(patientID: patientID); @@ -209,6 +205,11 @@ class ProfileSettingsViewModel extends ChangeNotifier { (failure) { isProfileImageLoading = false; profileImageError = failure.message; + print('❌ Failed to fetch profile image: ${failure.message}'); + + // Ensure data is cleared on failure + profileImageData = null; + notifyListeners(); if (onError != null) { onError(failure.message); @@ -216,44 +217,48 @@ class ProfileSettingsViewModel extends ChangeNotifier { }, (response) { isProfileImageLoading = false; + // Extract image data from response if (response.data != null && response.data['Patient_GetProfileImageDataList'] != null) { var imageList = response.data['Patient_GetProfileImageDataList']; if (imageList is List && imageList.isNotEmpty) { profileImageData = imageList[0]['ImageData']; - // Store in AppState for global access - GetIt.instance().setProfileImageData = profileImageData; + if (profileImageData != null && profileImageData!.isNotEmpty) { + // ONLY store in ViewModel - AppState will be updated separately by auth flow + print('✅ Profile image loaded from API (length: ${profileImageData!.length})'); + } else { + profileImageData = null; + print('⚠️ Profile image data is empty in API response'); + } } else { profileImageData = null; - GetIt.instance().setProfileImageData = null; + print('⚠️ Profile image list is empty in API response'); } } else { profileImageData = null; - GetIt.instance().setProfileImageData = null; + print('⚠️ No profile image data in API response'); } - notifyListeners(); + + notifyListeners(); // Notify to update UI with new/null data onSuccess?.call(response.data); }, ); } - /// Clear cached profile image data + /// Clear profile image data from ViewModel void clearProfileImageCache() { + print('🧹 Clearing profile image from ViewModel'); profileImageData = null; - GetIt.instance().setProfileImageData = null; notifyListeners(); } - /// Sync profile image data from AppState + /// Sync profile image data from AppState - DISABLED + /// Profile Settings screen uses only ViewModel data from API void syncProfileImageFromAppState() { - final appStateImageData = GetIt.instance().getProfileImageData; - if (appStateImageData != null && appStateImageData.isNotEmpty) { - if (profileImageData != appStateImageData) { - profileImageData = appStateImageData; - notifyListeners(); - } - } + // DO NOTHING - Profile Settings uses only direct API data + // No syncing from AppState to avoid stale cache issues + print('⚠️ syncProfileImageFromAppState called but disabled - use API data only'); } Future uploadProfileImage({ diff --git a/lib/presentation/profile_settings/widgets/profile_picture_widget.dart b/lib/presentation/profile_settings/widgets/profile_picture_widget.dart index b057591a..c9c5e7b1 100644 --- a/lib/presentation/profile_settings/widgets/profile_picture_widget.dart +++ b/lib/presentation/profile_settings/widgets/profile_picture_widget.dart @@ -34,13 +34,12 @@ class _ProfilePictureWidgetState extends State { void initState() { super.initState(); _currentPatientId = _appState.getAuthenticatedUser()?.patientId; - print('🎬 ProfilePictureWidget initState - patient: $_currentPatientId'); + // Use addPostFrameCallback to ensure widget is built before loading WidgetsBinding.instance.addPostFrameCallback((_) { if (!mounted) return; - final profileVm = context.read(); final patientID = _appState.getAuthenticatedUser()?.patientId; if (patientID == null) { @@ -48,20 +47,9 @@ class _ProfilePictureWidgetState extends State { return; } - // Check if we have data in AppState that matches current user - final appStateImageData = _appState.getProfileImageData; - - if (appStateImageData != null && appStateImageData.isNotEmpty) { - // Sync to ViewModel if it doesn't have data - if (profileVm.profileImageData == null || profileVm.profileImageData!.isEmpty) { - print('🔄 Syncing AppState data to ViewModel'); - profileVm.syncProfileImageFromAppState(); - } - } else { - // No cached data - load from API - print('📥 No cached data - loading from API for patient: $patientID'); - _loadProfileImage(forceRefresh: false); - } + // Always load fresh data from API - do NOT use AppState cache + print('📥 Loading fresh profile image from API for patient: $patientID'); + _loadProfileImage(forceRefresh: true); }); } @@ -88,13 +76,25 @@ class _ProfilePictureWidgetState extends State { final oldPatientId = _currentPatientId; _currentPatientId = currentPatientId; - // Clear the old profile image data + // Clear the old profile image data from BOTH AppState and ViewModel try { final profileVm = context.read(); print('🧹 Clearing cache for old user: $oldPatientId'); + + // Clear AppState cache first + _appState.clearProfileImageCache(); + + // Then clear ViewModel cache profileVm.clearProfileImageCache(); + // Force rebuild to show default avatar immediately + if (mounted) { + setState(() { + _selectedImage = null; // Clear any selected image + }); + } + print('📥 Loading profile image for new user: $currentPatientId'); // Load the new user's profile image immediately profileVm.getProfileImage( @@ -455,6 +455,7 @@ class _ProfilePictureWidgetState extends State { Widget _buildProfileImage(ProfileSettingsViewModel profileVm) { // Always get fresh user data final currentUser = _appState.getAuthenticatedUser(); + final currentPatientId = currentUser?.patientId; final gender = currentUser?.gender ?? 1; final age = currentUser?.age ?? 0; @@ -480,11 +481,22 @@ class _ProfilePictureWidgetState extends State { ); } - // Use ViewModel data if available, otherwise fall back to AppState - // This ensures we show the current logged-in user's image (same as homepage profile icon) - final String? imageData = profileVm.profileImageData ?? _appState.getProfileImageData; + // // IMPORTANT: Verify the cached image belongs to the current user + // // If _currentPatientId doesn't match currentPatientId, don't show cached image + // if (currentPatientId != _currentPatientId) { + // print('⚠️ Patient ID mismatch - showing default avatar (current: $currentPatientId, cached: $_currentPatientId)'); + // return Image.asset( + // defaultImage, + // width: 136.w, + // height: 136.h, + // ); + // } + + // IMPORTANT: Use ONLY ViewModel data, DO NOT fallback to AppState + // This prevents showing stale cached data when switching users + final String? imageData = profileVm.profileImageData; - print('🖼️ Building profile image - has data: ${imageData != null && imageData.isNotEmpty}, patient: ${currentUser?.patientId}'); + print('🖼️ Building profile image - has data: ${imageData != null && imageData.isNotEmpty}, patient: $currentPatientId (ViewModel ONLY)'); // Show uploaded image if available if (imageData != null && imageData.isNotEmpty) { @@ -510,7 +522,7 @@ class _ProfilePictureWidgetState extends State { } // Show default image (no image data or user has no uploaded image) - print('📷 Showing default avatar for user ${currentUser?.patientId}'); + print('📷 Showing default avatar for user $currentPatientId'); return Image.asset( defaultImage, width: 136.w, From 9e5c9f9b4c75cab4e64bc8fb48747464dc200a1a Mon Sep 17 00:00:00 2001 From: Sultan khan Date: Tue, 14 Apr 2026 09:37:55 +0300 Subject: [PATCH 20/45] no message --- .../hmg_services/services_page.dart | 144 +++++++++--------- 1 file changed, 72 insertions(+), 72 deletions(-) diff --git a/lib/presentation/hmg_services/services_page.dart b/lib/presentation/hmg_services/services_page.dart index c92d47e5..4f648c96 100644 --- a/lib/presentation/hmg_services/services_page.dart +++ b/lib/presentation/hmg_services/services_page.dart @@ -378,8 +378,8 @@ class _ServicesPageState extends State { void initState() { // TODO: implement initState super.initState(); - weatherVM = getIt(); - weatherVM.fetchCityInfoList(); + //weatherVM = getIt(); + // weatherVM.fetchCityInfoList(); } @@ -398,76 +398,76 @@ class _ServicesPageState extends State { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Row( - children: [ - Flexible( - child: Container( - padding: EdgeInsets.all(16.w), - decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 24.r, hasShadow: false), - child: Column( - children: [ - Row( - children: [ - Utils.buildSvgWithAssets(icon: "assets/images/svg/cloudyweather.svg", width: 64.w, height: 64.w).onPress(() { - // locationUtils?.getCurrentLocation(); - print(getIt.get().userLat); - print(getIt.get().userLong); - }), - SizedBox(width: 12.w), - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - "August 19, 2025 - Tuesday, 11:25 ".toText12(fontWeight: FontWeight.w500, color: AppColors.greyTextColor), - SizedBox( - height: 4.w, - ), - "Cloudy 38oC".toText16(isBold: true, weight: FontWeight.w600), - SizedBox( - height: 4.w, - ), - "Health tips based on current weather".toText12(color: AppColors.greyTextColor, fontWeight: FontWeight.w500) - ], - ), - ], - ), - SizedBox(height: 16.w), - Container( - padding: EdgeInsets.all(16.w), - decoration: RoundedRectangleBorder().toSmoothCornerDecoration( - color: AppColors.lightGrayBGColor, - borderRadius: 10.r, - hasShadow: false, - ), - child: Row( - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Row( - children: [ - Utils.buildSvgWithAssets(icon: "assets/images/svg/morning.svg", width: 24.w, height: 24.h), - SizedBox(width: 4.w), - DateTime.now().toLocal().toString().substring(11, 16).toText14(isBold: true), - ], - ), - SizedBox(width: 25.w), - DateTime.now().toLocal().toString().substring(11, 16).toText14(isBold: true), - SizedBox(width: 25.w), - Row( - children: [ - Utils.buildSvgWithAssets(icon: "assets/images/svg/evening.svg", width: 24.w, height: 24.h), - SizedBox(width: 4.w), - DateTime.now().toLocal().toString().substring(11, 16).toText14(isBold: true), - ], - ), - ], - ).expanded, - ).paddingSymmetrical(0.w, 8.w) - ], - ), - ), - ) - ], - ).paddingSymmetrical(24.w, 0.w), + // Row( + // children: [ + // Flexible( + // child: Container( + // padding: EdgeInsets.all(16.w), + // decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 24.r, hasShadow: false), + // child: Column( + // children: [ + // Row( + // children: [ + // Utils.buildSvgWithAssets(icon: "assets/images/svg/cloudyweather.svg", width: 64.w, height: 64.w).onPress(() { + // // locationUtils?.getCurrentLocation(); + // print(getIt.get().userLat); + // print(getIt.get().userLong); + // }), + // SizedBox(width: 12.w), + // Column( + // crossAxisAlignment: CrossAxisAlignment.start, + // children: [ + // "August 19, 2025 - Tuesday, 11:25 ".toText12(fontWeight: FontWeight.w500, color: AppColors.greyTextColor), + // SizedBox( + // height: 4.w, + // ), + // "Cloudy 38oC".toText16(isBold: true, weight: FontWeight.w600), + // SizedBox( + // height: 4.w, + // ), + // "Health tips based on current weather".toText12(color: AppColors.greyTextColor, fontWeight: FontWeight.w500) + // ], + // ), + // ], + // ), + // SizedBox(height: 16.w), + // Container( + // padding: EdgeInsets.all(16.w), + // decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + // color: AppColors.lightGrayBGColor, + // borderRadius: 10.r, + // hasShadow: false, + // ), + // child: Row( + // crossAxisAlignment: CrossAxisAlignment.center, + // mainAxisAlignment: MainAxisAlignment.spaceBetween, + // children: [ + // Row( + // children: [ + // Utils.buildSvgWithAssets(icon: "assets/images/svg/morning.svg", width: 24.w, height: 24.h), + // SizedBox(width: 4.w), + // DateTime.now().toLocal().toString().substring(11, 16).toText14(isBold: true), + // ], + // ), + // SizedBox(width: 25.w), + // DateTime.now().toLocal().toString().substring(11, 16).toText14(isBold: true), + // SizedBox(width: 25.w), + // Row( + // children: [ + // Utils.buildSvgWithAssets(icon: "assets/images/svg/evening.svg", width: 24.w, height: 24.h), + // SizedBox(width: 4.w), + // DateTime.now().toLocal().toString().substring(11, 16).toText14(isBold: true), + // ], + // ), + // ], + // ).expanded, + // ).paddingSymmetrical(0.w, 8.w) + // ], + // ), + // ), + // ) + // ], + // ).paddingSymmetrical(24.w, 0.w), SizedBox(height: 16.h), LocaleKeys.medicalAndCareServices.tr().toText18(isBold: true).paddingSymmetrical(24.w, 0), SizedBox(height: 16.h), From c19451a6b6da1c270ae2affb7d41b6cae347d9a1 Mon Sep 17 00:00:00 2001 From: tahaalam Date: Tue, 14 Apr 2026 11:32:11 +0300 Subject: [PATCH 21/45] profile picture fix --- .../health_trackers_view_model.dart | 6 + .../add_health_tracker_entry_page.dart | 2 +- .../profile_settings/profile_settings.dart | 20 +-- .../widgets/profile_picture_widget.dart | 149 +++++++++++------- 4 files changed, 112 insertions(+), 65 deletions(-) diff --git a/lib/features/health_trackers/health_trackers_view_model.dart b/lib/features/health_trackers/health_trackers_view_model.dart index 8f7e0ffa..8fcbee01 100644 --- a/lib/features/health_trackers/health_trackers_view_model.dart +++ b/lib/features/health_trackers/health_trackers_view_model.dart @@ -2,6 +2,8 @@ import 'dart:developer'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/cupertino.dart'; +import 'package:hmg_patient_app_new/core/app_state.dart'; +import 'package:hmg_patient_app_new/core/dependencies.dart'; import 'package:hmg_patient_app_new/core/enums.dart'; import 'package:hmg_patient_app_new/features/health_trackers/health_trackers_repo.dart'; import 'package:hmg_patient_app_new/features/health_trackers/models/blood_pressure/blood_pressure_result.dart'; @@ -76,6 +78,10 @@ class HealthTrackersViewModel extends ChangeNotifier { "آخر", ]; + List getBloodSugarTimeList(){ + return getIt.get().isArabic()?bloodSugarMeasureTimeArList:bloodSugarMeasureTimeEnList; + } + // Setters with notification void setBloodSugarMeasureTime(String duration) async { _selectedBloodSugarMeasureTime = duration; diff --git a/lib/presentation/health_trackers/add_health_tracker_entry_page.dart b/lib/presentation/health_trackers/add_health_tracker_entry_page.dart index 2d0356c3..0305eebf 100644 --- a/lib/presentation/health_trackers/add_health_tracker_entry_page.dart +++ b/lib/presentation/health_trackers/add_health_tracker_entry_page.dart @@ -251,7 +251,7 @@ class _AddHealthTrackerEntryPageState extends State { _showSelectionBottomSheet( context: context, title: LocaleKeys.selectMeasureTime.tr(context: context), - items: viewModel.bloodSugarMeasureTimeEnList, + items: viewModel.getBloodSugarTimeList(), selectedValue: viewModel.selectedBloodSugarMeasureTime, onSelected: viewModel.setBloodSugarMeasureTime, useUpperCase: false, diff --git a/lib/presentation/profile_settings/profile_settings.dart b/lib/presentation/profile_settings/profile_settings.dart index 750ea8c4..be7ddb54 100644 --- a/lib/presentation/profile_settings/profile_settings.dart +++ b/lib/presentation/profile_settings/profile_settings.dart @@ -450,16 +450,16 @@ class _FamilyCardWidgetState extends State { }); } - @override - void didChangeDependencies() { - super.didChangeDependencies(); - // Also sync when dependencies change (e.g., after user switch) - WidgetsBinding.instance.addPostFrameCallback((_) { - if (mounted) { - _syncProfileImageFromAppState(); - } - }); - } + // @override + // void didChangeDependencies() { + // super.didChangeDependencies(); + // // Also sync when dependencies change (e.g., after user switch) + // WidgetsBinding.instance.addPostFrameCallback((_) { + // if (mounted) { + // _syncProfileImageFromAppState(); + // } + // }); + // } void _syncProfileImageFromAppState() { try { diff --git a/lib/presentation/profile_settings/widgets/profile_picture_widget.dart b/lib/presentation/profile_settings/widgets/profile_picture_widget.dart index c9c5e7b1..e7abcb12 100644 --- a/lib/presentation/profile_settings/widgets/profile_picture_widget.dart +++ b/lib/presentation/profile_settings/widgets/profile_picture_widget.dart @@ -1,8 +1,10 @@ import 'dart:convert'; import 'dart:io'; +import 'dart:typed_data'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; +import 'package:get_it/get_it.dart'; import 'package:hmg_patient_app_new/core/app_assets.dart'; import 'package:hmg_patient_app_new/core/app_export.dart'; import 'package:hmg_patient_app_new/core/app_state.dart'; @@ -29,16 +31,24 @@ class _ProfilePictureWidgetState extends State { final AppState _appState = getIt.get(); File? _selectedImage; int? _currentPatientId; + bool _isInitialLoadTriggered = false; + + /// Cache decoded image bytes to avoid decoding base64 on every rebuild + Uint8List? _cachedImageBytes; + String? _cachedImageDataHash; @override void initState() { super.initState(); _currentPatientId = _appState.getAuthenticatedUser()?.patientId; + // Pre-cache existing image data if available (prevents blink from default → loaded) + _tryCacheExistingImage(); // Use addPostFrameCallback to ensure widget is built before loading WidgetsBinding.instance.addPostFrameCallback((_) { - if (!mounted) return; + if (!mounted || _isInitialLoadTriggered) return; + _isInitialLoadTriggered = true; final patientID = _appState.getAuthenticatedUser()?.patientId; @@ -47,16 +57,19 @@ class _ProfilePictureWidgetState extends State { return; } - // Always load fresh data from API - do NOT use AppState cache + // Load fresh data from API print('📥 Loading fresh profile image from API for patient: $patientID'); - _loadProfileImage(forceRefresh: true); + _loadProfileImage(forceRefresh: false); }); } @override void didChangeDependencies() { super.didChangeDependencies(); - _checkAndUpdateUserImage(); + // Only check for user switch, NOT on initial load (initState handles that) + if (_isInitialLoadTriggered) { + _checkAndUpdateUserImage(); + } } @override @@ -65,6 +78,20 @@ class _ProfilePictureWidgetState extends State { _checkAndUpdateUserImage(); } + /// Pre-cache already-loaded image bytes so we don't flash default avatar + void _tryCacheExistingImage() { + final imageData = _appState.getProfileImageData; + if (imageData != null && imageData.isNotEmpty) { + try { + _cachedImageBytes = base64Decode(imageData); + _cachedImageDataHash = '${imageData.length}_${imageData.hashCode}'; + } catch (_) { + _cachedImageBytes = null; + _cachedImageDataHash = null; + } + } + } + void _checkAndUpdateUserImage() { // Check if the authenticated user has changed (family member switch) final currentPatientId = _appState.getAuthenticatedUser()?.patientId; @@ -88,6 +115,10 @@ class _ProfilePictureWidgetState extends State { // Then clear ViewModel cache profileVm.clearProfileImageCache(); + // Clear local decoded bytes cache + _cachedImageBytes = null; + _cachedImageDataHash = null; + // Force rebuild to show default avatar immediately if (mounted) { setState(() { @@ -103,6 +134,7 @@ class _ProfilePictureWidgetState extends State { onSuccess: (data) { print('✅ Profile image loaded successfully for user: $currentPatientId'); if (mounted) { + _tryCacheExistingImage(); setState(() {}); // Force rebuild to show new data } }, @@ -136,7 +168,10 @@ class _ProfilePictureWidgetState extends State { forceRefresh: forceRefresh, onSuccess: (data) { print('✅ Profile image loaded successfully'); - // Image loaded successfully + if (mounted) { + _tryCacheExistingImage(); + setState(() {}); // Rebuild with new cached bytes + } }, onError: (error) { print('❌ Error loading profile image: $error'); @@ -437,6 +472,8 @@ class _ProfilePictureWidgetState extends State { imageData: base64String, onSuccess: (data) { if (mounted) { + // Update cached bytes immediately from the uploaded data + _tryCacheExistingImage(); setState(() { _selectedImage = null; // Clear selected image after successful upload }); @@ -481,80 +518,84 @@ class _ProfilePictureWidgetState extends State { ); } - // // IMPORTANT: Verify the cached image belongs to the current user - // // If _currentPatientId doesn't match currentPatientId, don't show cached image - // if (currentPatientId != _currentPatientId) { - // print('⚠️ Patient ID mismatch - showing default avatar (current: $currentPatientId, cached: $_currentPatientId)'); - // return Image.asset( - // defaultImage, - // width: 136.w, - // height: 136.h, - // ); - // } - - // IMPORTANT: Use ONLY ViewModel data, DO NOT fallback to AppState - // This prevents showing stale cached data when switching users - final String? imageData = profileVm.profileImageData; + // Use cached decoded bytes — update cache if source data changed + final String? imageData = GetIt.instance().getProfileImageData; + final String? currentHash = (imageData != null && imageData.isNotEmpty) + ? '${imageData.length}_${imageData.hashCode}' + : null; - print('🖼️ Building profile image - has data: ${imageData != null && imageData.isNotEmpty}, patient: $currentPatientId (ViewModel ONLY)'); - - // Show uploaded image if available - if (imageData != null && imageData.isNotEmpty) { + // Re-decode only if the underlying data actually changed + if (currentHash != null && currentHash != _cachedImageDataHash) { try { - final bytes = base64Decode(imageData); - return ClipOval( - child: Image.memory( - bytes, - width: 136.w, - height: 136.h, - fit: BoxFit.cover, - ), - ); + _cachedImageBytes = base64Decode(imageData!); + _cachedImageDataHash = currentHash; } catch (e) { print('❌ Error decoding profile image: $e'); - // If decoding fails, show default image - return Image.asset( - defaultImage, + _cachedImageBytes = null; + _cachedImageDataHash = null; + } + } else if (currentHash == null) { + _cachedImageBytes = null; + _cachedImageDataHash = null; + } + + // Show cached decoded image if available + if (_cachedImageBytes != null) { + return ClipOval( + child: Image.memory( + _cachedImageBytes!, + key: ValueKey('profile_$currentPatientId'), width: 136.w, height: 136.h, - ); - } + fit: BoxFit.cover, + gaplessPlayback: true, // Prevents blink during image rebuild + ), + ); } // Show default image (no image data or user has no uploaded image) print('📷 Showing default avatar for user $currentPatientId'); return Image.asset( defaultImage, + key: ValueKey('default_$currentPatientId'), width: 136.w, height: 136.h, + gaplessPlayback: true, ); } @override Widget build(BuildContext context) { - // Check for user change on every build (handles navigation scenarios) - WidgetsBinding.instance.addPostFrameCallback((_) { - if (mounted) { - _checkAndUpdateUserImage(); - } - }); + // Removed addPostFrameCallback from build() — it was causing redundant + // _checkAndUpdateUserImage calls on every single rebuild. + // didChangeDependencies + didUpdateWidget already handle user switches. return Consumer( builder: (context, profileVm, _) { + // If we already have cached bytes, show the image even while "loading" + // to prevent the shimmer→image blink on page open + final bool showShimmer = profileVm.isProfileImageLoading && + _cachedImageBytes == null && + _selectedImage == null; + return Center( child: Stack( children: [ - // Profile Image - profileVm.isProfileImageLoading - ? Container( - width: 136.w, - height: 136.h, - decoration: BoxDecoration( - shape: BoxShape.circle, - color: AppColors.greyTextColor.withValues(alpha: 0.2), - ), - ).toShimmer2(isShow: true) - : _buildProfileImage(profileVm), + // Profile Image — use AnimatedSwitcher to smooth transition + AnimatedSwitcher( + duration: const Duration(milliseconds: 200), + child: showShimmer + ? Container( + key: const ValueKey('shimmer'), + width: 136.w, + height: 136.h, + decoration: BoxDecoration( + shape: BoxShape.circle, + color: AppColors.greyTextColor.withValues(alpha: 0.2), + ), + ).toShimmer2(isShow: true) + : _buildProfileImage(profileVm), + ), // Edit button Positioned( From 4c56137f102017f125a10dd15a906a186ad082d5 Mon Sep 17 00:00:00 2001 From: aamir-csol Date: Tue, 14 Apr 2026 11:49:14 +0300 Subject: [PATCH 22/45] calender --- lib/core/utils/calender_utils_new.dart | 2 +- .../appointment_details_page.dart | 122 ++++++++------- .../book_appointment/widgets/bell_switch.dart | 54 ++++--- .../widget/e_referral_patient_info.dart | 52 ++++--- lib/widgets/common_bottom_sheet.dart | 142 ++++++++++-------- 5 files changed, 204 insertions(+), 168 deletions(-) diff --git a/lib/core/utils/calender_utils_new.dart b/lib/core/utils/calender_utils_new.dart index dfb400be..347c2ebc 100644 --- a/lib/core/utils/calender_utils_new.dart +++ b/lib/core/utils/calender_utils_new.dart @@ -25,7 +25,7 @@ class CalenderUtilsNew { Future getCalenders() async { CalendarPermissionStatus result = await DeviceCalendar.instance.hasPermissions(); if (result != CalendarPermissionStatus.granted) { - // await DeviceCalendar.instance.requestPermissions(); + await DeviceCalendar.instance.requestPermissions(); showCommonBottomSheetWithoutHeight( title: LocaleKeys.notice.tr(context: GetIt.instance().navigatorKey.currentContext!), GetIt.instance().navigatorKey.currentContext!, diff --git a/lib/presentation/appointments/appointment_details_page.dart b/lib/presentation/appointments/appointment_details_page.dart index 5b012872..40ef4644 100644 --- a/lib/presentation/appointments/appointment_details_page.dart +++ b/lib/presentation/appointments/appointment_details_page.dart @@ -80,8 +80,13 @@ class _AppointmentDetailsPageState extends State { String _countdownText = ""; Function(void Function())? _modalSetState; // Callback for modal state updates + // GlobalKey for BellAnimatedSwitch to control it programmatically + final GlobalKey _bellSwitchKey = GlobalKey(); + @override void initState() { + super.initState(); + scheduleMicrotask(() async { if (AppointmentType.isArrived(widget.patientAppointmentHistoryResponseModel)) { myAppointmentsViewModel.getDoctorsRatingCheck( @@ -102,12 +107,12 @@ class _AppointmentDetailsPageState extends State { } }); - // Initialize countdown timer for payment - if (widget.patientAppointmentHistoryResponseModel.nextAction == 15 || widget.patientAppointmentHistoryResponseModel.nextAction == 20) { - _startCountdownTimer(); - } - - super.initState(); + // Initialize countdown timer for payment after first frame to ensure context is available + WidgetsBinding.instance.addPostFrameCallback((_) { + if (mounted) { + _startCountdownTimer(); + } + }); } /// Checks if a reminder exists in the calendar for this appointment @@ -364,56 +369,51 @@ class _AppointmentDetailsPageState extends State { onRescheduleTap: () async { openDoctorScheduleCalendar(); }, - timerWidget: Column( - children: [ - SizedBox( - height: 16.w, - ), - Divider( - height: 1, - color: AppColors.dividerColor, - ), - SizedBox( - height: 16.w, - ), - Directionality( - textDirection: ui.TextDirection.ltr, - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.start, + timerWidget: (_timeRemaining == null || _timeRemaining == Duration.zero) + ? null + : Column( children: [ - Expanded( - child: _buildTimeUnit( - _timeRemaining != null ? _timeRemaining!.inDays.toString().padLeft(2, '0') : '00', - LocaleKeys.days.tr(context: context), - ), - ), - _buildTimeSeparator(), - Expanded( - child: _buildTimeUnit( - _timeRemaining != null ? _timeRemaining!.inHours.remainder(24).toString().padLeft(2, '0') : '00', - LocaleKeys.hours.tr(context: context), - ), - ), - _buildTimeSeparator(), - Expanded( - child: _buildTimeUnit( - _timeRemaining != null ? _timeRemaining!.inMinutes.remainder(60).toString().padLeft(2, '0') : '00', - LocaleKeys.minutes.tr(context: context), - ), - ), - _buildTimeSeparator(), - Expanded( - child: _buildTimeUnit( - _timeRemaining != null ? _timeRemaining!.inSeconds.remainder(60).toString().padLeft(2, '0') : '00', - LocaleKeys.seconds.tr(context: context), + SizedBox(height: 16.w), + Divider(height: 1, color: AppColors.dividerColor), + SizedBox(height: 16.w), + Directionality( + textDirection: ui.TextDirection.ltr, + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Expanded( + child: _buildTimeUnit( + _timeRemaining!.inDays.toString().padLeft(2, '0'), + LocaleKeys.days.tr(context: context), + ), + ), + _buildTimeSeparator(), + Expanded( + child: _buildTimeUnit( + _timeRemaining!.inHours.remainder(24).toString().padLeft(2, '0'), + LocaleKeys.hours.tr(context: context), + ), + ), + _buildTimeSeparator(), + Expanded( + child: _buildTimeUnit( + _timeRemaining!.inMinutes.remainder(60).toString().padLeft(2, '0'), + LocaleKeys.minutes.tr(context: context), + ), + ), + _buildTimeSeparator(), + Expanded( + child: _buildTimeUnit( + _timeRemaining!.inSeconds.remainder(60).toString().padLeft(2, '0'), + LocaleKeys.seconds.tr(context: context), + ), + ), + ], ), ), ], ), - ), - ], - ), ), SizedBox(height: 16.h), @@ -603,6 +603,7 @@ class _AppointmentDetailsPageState extends State { ), const Spacer(), BellAnimatedSwitch( + key: _bellSwitchKey, initialValue: widget.patientAppointmentHistoryResponseModel.hasReminder ?? false, activeColor: AppColors.successColor.withOpacity(0.2), inactiveColor: AppColors.lightGrayBGColor, @@ -618,7 +619,9 @@ class _AppointmentDetailsPageState extends State { if (newValue == true) { DateTime startDate = DateTime.now(); DateTime endDate = DateUtil.convertStringToDate(widget.patientAppointmentHistoryResponseModel.appointmentDate); - BottomSheetUtils().showReminderBottomSheet( + + // Show reminder bottom sheet and check if permission was granted + bool permissionGranted = await BottomSheetUtils().showReminderBottomSheet( context, endDate, widget.patientAppointmentHistoryResponseModel.doctorNameObj ?? "", @@ -649,6 +652,11 @@ class _AppointmentDetailsPageState extends State { }); }, ); + + // If permission was not granted, revert the switch back to OFF + if (!permissionGranted) { + _bellSwitchKey.currentState?.setSwitchValue(false); + } } else { isEventAddedOrRemoved = await calender.checkAndRemove( id: "${widget.patientAppointmentHistoryResponseModel.appointmentNo}", @@ -1210,8 +1218,7 @@ class _AppointmentDetailsPageState extends State { handleAppointmentNextAction(widget.patientAppointmentHistoryResponseModel.nextAction); }, backgroundColor: AppointmentType.getNextActionButtonColor(widget.patientAppointmentHistoryResponseModel.nextAction), - borderColor: - AppointmentType.getNextActionButtonColor(widget.patientAppointmentHistoryResponseModel.nextAction).withValues(alpha: 0.01), + borderColor: AppointmentType.getNextActionButtonColor(widget.patientAppointmentHistoryResponseModel.nextAction).withValues(alpha: 0.01), textColor: widget.patientAppointmentHistoryResponseModel.nextAction == 15 ? AppColors.textColor : Colors.white, fontSize: 16.f, fontWeight: FontWeight.w600, @@ -1392,9 +1399,10 @@ class _AppointmentDetailsPageState extends State { return Column( crossAxisAlignment: CrossAxisAlignment.center, children: [ - Lottie.asset(AppAnimations.warningAnimation, - repeat: false, reverse: false, frameRate: FrameRate(60), width: 100.h, height: 100.h, fit: BoxFit.fill), - SizedBox(height: 12,), + Lottie.asset(AppAnimations.warningAnimation, repeat: false, reverse: false, frameRate: FrameRate(60), width: 100.h, height: 100.h, fit: BoxFit.fill), + SizedBox( + height: 12, + ), LocaleKeys.upcomingPaymentPending.tr(context: context).toText14(color: AppColors.textColor, isCenter: true), SizedBox(height: 24.h), // // Countdown Timer - DD : HH : MM : SS format with labels - Always LTR diff --git a/lib/presentation/book_appointment/widgets/bell_switch.dart b/lib/presentation/book_appointment/widgets/bell_switch.dart index 498ea6aa..ea3746a0 100644 --- a/lib/presentation/book_appointment/widgets/bell_switch.dart +++ b/lib/presentation/book_appointment/widgets/bell_switch.dart @@ -33,10 +33,10 @@ class BellAnimatedSwitch extends StatefulWidget { }); @override - State createState() => _BellAnimatedSwitchState(); + State createState() => BellAnimatedSwitchState(); } -class _BellAnimatedSwitchState extends State with SingleTickerProviderStateMixin { +class BellAnimatedSwitchState extends State with SingleTickerProviderStateMixin { late bool _isActive; late AnimationController _animationController; late Animation _circleAlignment; @@ -51,11 +51,7 @@ class _BellAnimatedSwitchState extends State with SingleTick vsync: this, ); - // Animation for the circle position (left/right) - _circleAlignment = AlignmentTween( - begin: Alignment.centerLeft, - end: Alignment.centerRight, - ).animate( + _circleAlignment = AlignmentTween(begin: Alignment.centerLeft, end: Alignment.centerRight).animate( CurvedAnimation(parent: _animationController, curve: Curves.easeInOut), ); @@ -78,6 +74,24 @@ class _BellAnimatedSwitchState extends State with SingleTick super.dispose(); } + /// Public method to set switch value programmatically without triggering onChanged callback + void setSwitchValue(bool value, {bool animate = true}) { + if (_isActive == value) return; // No change needed + + setState(() { + _isActive = value; + if (animate) { + if (_isActive) { + _animationController.forward(); + } else { + _animationController.reverse(); + } + } else { + _animationController.value = _isActive ? 1.0 : 0.0; + } + }); + } + void _toggle() { setState(() { _isActive = !_isActive; @@ -106,17 +120,19 @@ class _BellAnimatedSwitchState extends State with SingleTick Widget _getIcon() { if (_isActive) { - return widget.activeIcon ?? Icon( - Icons.check, - size: 18, - color: widget.activeIconColor ?? Colors.green.shade400, - ); + return widget.activeIcon ?? + Icon( + Icons.check, + size: 18, + color: widget.activeIconColor ?? Colors.green.shade400, + ); } - return widget.inactiveIcon ?? Icon( - Icons.close, - size: 18, - color: widget.inactiveIconColor ?? Colors.grey.shade600, - ); + return widget.inactiveIcon ?? + Icon( + Icons.close, + size: 18, + color: widget.inactiveIconColor ?? Colors.grey.shade600, + ); } @override @@ -162,9 +178,7 @@ class _BellAnimatedSwitchState extends State with SingleTick ), ], ), - child: Center( - child: _getIcon(), - ), + child: Center(child: _getIcon()), ), ), ], diff --git a/lib/presentation/e_referral/widget/e_referral_patient_info.dart b/lib/presentation/e_referral/widget/e_referral_patient_info.dart index cbce6919..efbac168 100644 --- a/lib/presentation/e_referral/widget/e_referral_patient_info.dart +++ b/lib/presentation/e_referral/widget/e_referral_patient_info.dart @@ -1,5 +1,6 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; +import 'dart:ui' as ui; import 'package:hmg_patient_app_new/core/app_export.dart'; import 'package:hmg_patient_app_new/core/utils/validation_utils.dart'; import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; @@ -138,30 +139,33 @@ class PatientInformationStepState extends State { } Widget _buildPatientPhoneField(ReferralFormManager formManager) { - return Focus( - focusNode: _phoneFocusNode, - child: TextInputWidget( - labelText: LocaleKeys.phoneNumber.tr(context: context), - hintText: "5xxxxxxxx", - controller: _phoneController, - padding: const EdgeInsets.all(8), - keyboardType: TextInputType.number, - fontFamily: "Poppins", - onChange: (value) { - formManager.updatePatientPhone(value ?? ''); - }, - onCountryChange: (value) { - formManager.updatePatientCountryEnum(value); - }, - prefix: '966', - isBorderAllowed: false, - isAllowLeadingIcon: true, - fontSize: 13, - isCountryDropDown: true, - leadingIcon: AppAssets.smart_phone, - errorMessage: formManager.errors.patientPhone, - hasError: !ValidationUtils.isNullOrEmpty(formManager.errors.patientPhone) - ).paddingSymmetrical(0, 8), + return Directionality( + textDirection: ui.TextDirection.ltr, + child: Focus( + focusNode: _phoneFocusNode, + child: TextInputWidget( + labelText: LocaleKeys.phoneNumber.tr(context: context), + hintText: "5xxxxxxxx", + controller: _phoneController, + padding: const EdgeInsets.all(8), + keyboardType: TextInputType.number, + fontFamily: "Poppins", + onChange: (value) { + formManager.updatePatientPhone(value ?? ''); + }, + onCountryChange: (value) { + formManager.updatePatientCountryEnum(value); + }, + prefix: '966', + isBorderAllowed: false, + isAllowLeadingIcon: true, + fontSize: 13, + isCountryDropDown: true, + leadingIcon: AppAssets.smart_phone, + errorMessage: formManager.errors.patientPhone, + hasError: !ValidationUtils.isNullOrEmpty(formManager.errors.patientPhone) + ).paddingSymmetrical(0, 8), + ), ); } diff --git a/lib/widgets/common_bottom_sheet.dart b/lib/widgets/common_bottom_sheet.dart index 267fb5c5..069022d1 100644 --- a/lib/widgets/common_bottom_sheet.dart +++ b/lib/widgets/common_bottom_sheet.dart @@ -17,82 +17,92 @@ import 'package:hmg_patient_app_new/theme/colors.dart'; import 'package:permission_handler/permission_handler.dart'; class BottomSheetUtils { - showReminderBottomSheet(BuildContext context, DateTime dateTime, String doctorName, String eventId, String appoDateFormatted, String appoTimeFormatted, + Future showReminderBottomSheet(BuildContext context, DateTime dateTime, String doctorName, String eventId, String appoDateFormatted, String appoTimeFormatted, {required Function() onSuccess, String? title, String? description, Function(int)? onMultiDateSuccess, bool isMultiAllowed = false}) async { + // Check and request permissions based on platform + bool hasPermission = await _checkAndRequestCalendarPermissions(); + + if (hasPermission) { + // Permission granted, show the reminder selection bottom sheet + await _showReminderBottomSheet(context, dateTime, doctorName, eventId, appoDateFormatted, appoTimeFormatted, + onSuccess: onSuccess, title: title, description: description, onMultiDateSuccess: onMultiDateSuccess, isMultiAllowed: isMultiAllowed); + return true; + } else { + await _showPermissionDeniedDialog(); + return false; + } + } + + /// Checks and requests calendar permissions for both Android and iOS + /// Returns true if all required permissions are granted + Future _checkAndRequestCalendarPermissions() async { if (Platform.isAndroid) { + // Android: Check existing permission first using PermissionService bool hasPermission = await PermissionService.isCalendarPermissionEnabled(); - if (!hasPermission) { - PermissionStatus status = await Permission.calendarFullAccess.request(); - hasPermission = status.isGranted; - } if (hasPermission) { - _showReminderBottomSheet(context, dateTime, doctorName, eventId, appoDateFormatted, appoTimeFormatted, - onSuccess: onSuccess, title: title, description: description, onMultiDateSuccess: onMultiDateSuccess, isMultiAllowed: isMultiAllowed); - } else { - showCommonBottomSheetWithoutHeight( - title: LocaleKeys.notice.tr(context: GetIt.instance().navigatorKey.currentContext!), - GetIt.instance().navigatorKey.currentContext!, - child: Utils.getWarningWidget( - loadingText: LocaleKeys.calendarPermissionAlert.tr(), - isShowActionButtons: true, - onCancelTap: () { - GetIt.instance().pop(); - }, - onConfirmTap: () async { - GetIt.instance().pop(); - openAppSettings(); - }), - callBackFunc: () {}, - isFullScreen: false, - isCloseButtonVisible: true, - ); + return true; + } + + // Request calendarFullAccess permission (Android 14+ requires this) + // This internally requests both READ_CALENDAR and WRITE_CALENDAR + PermissionStatus status = await Permission.calendarFullAccess.request(); + + // If calendarFullAccess request didn't show dialog or failed, + // fallback to requesting individual permissions + if (!status.isGranted) { + Map statuses = await [ + Permission.calendarWriteOnly, + ].request(); + + return statuses[Permission.calendarWriteOnly]?.isGranted ?? false; } + + return status.isGranted; } else { - if (await Permission.calendarWriteOnly.request().isGranted) { - if (await Permission.calendarFullAccess.request().isGranted) { - _showReminderBottomSheet(context, dateTime, doctorName, eventId, appoDateFormatted, appoTimeFormatted, - onSuccess: onSuccess, title: title, description: description, onMultiDateSuccess: onMultiDateSuccess, isMultiAllowed: isMultiAllowed); - } else { - showCommonBottomSheetWithoutHeight( - title: LocaleKeys.notice.tr(context: GetIt.instance().navigatorKey.currentContext!), - GetIt.instance().navigatorKey.currentContext!, - child: Utils.getWarningWidget( - loadingText: LocaleKeys.calendarPermissionAlert.tr(), - isShowActionButtons: true, - onCancelTap: () { - GetIt.instance().pop(); - }, - onConfirmTap: () async { - GetIt.instance().pop(); - openAppSettings(); - }), - callBackFunc: () {}, - isFullScreen: false, - isCloseButtonVisible: true, - ); - } - } else { - showCommonBottomSheetWithoutHeight( - title: LocaleKeys.notice.tr(context: GetIt.instance().navigatorKey.currentContext!), - GetIt.instance().navigatorKey.currentContext!, - child: Utils.getWarningWidget( - loadingText: LocaleKeys.calendarPermissionAlert.tr(), - isShowActionButtons: true, - onCancelTap: () { - GetIt.instance().pop(); - }, - onConfirmTap: () async { - GetIt.instance().pop(); - openAppSettings(); - }), - callBackFunc: () {}, - isFullScreen: false, - isCloseButtonVisible: true, - ); + // iOS: Check if we already have full access + PermissionStatus fullAccessStatus = await Permission.calendarFullAccess.status; + + if (fullAccessStatus.isGranted) { + return true; + } + + // Request write permission first (required before full access on iOS) + PermissionStatus writeStatus = await Permission.calendarWriteOnly.request(); + if (!writeStatus.isGranted) { + return false; } + + // Then request full access permission + PermissionStatus fullStatus = await Permission.calendarFullAccess.request(); + return fullStatus.isGranted; } } + /// Shows permission denied dialog with option to open settings + Future _showPermissionDeniedDialog() async { + BuildContext? context = GetIt.instance().navigatorKey.currentContext; + if (context == null) return; + + showCommonBottomSheetWithoutHeight( + context, + title: LocaleKeys.notice.tr(context: context), + child: Utils.getWarningWidget( + loadingText: LocaleKeys.calendarPermissionAlert.tr(), + isShowActionButtons: true, + onCancelTap: () { + GetIt.instance().pop(); + }, + onConfirmTap: () async { + GetIt.instance().pop(); + await openAppSettings(); + }, + ), + callBackFunc: () {}, + isFullScreen: false, + isCloseButtonVisible: true, + ); + } + Future _showReminderBottomSheet(BuildContext providedContext, DateTime dateTime, String doctorName, String eventId, String appoDateFormatted, String appoTimeFormatted, {required Function onSuccess, String? title, String? description, Function(int)? onMultiDateSuccess, bool? isMultiAllowed}) async { showCommonBottomSheetWithoutHeight(providedContext, title: LocaleKeys.setTimerOfReminder.tr(context: providedContext), child: PrescriptionReminderView( From fd3e434b0caa2264ee336865ed729061a9bc291b Mon Sep 17 00:00:00 2001 From: Sultan khan Date: Tue, 14 Apr 2026 11:50:34 +0300 Subject: [PATCH 23/45] no message --- ios/Podfile.lock | 626 ------------------ .../my_appointments/my_appointments_repo.dart | 2 +- .../widgets/appointment_doctor_card.dart | 3 +- 3 files changed, 3 insertions(+), 628 deletions(-) delete mode 100644 ios/Podfile.lock diff --git a/ios/Podfile.lock b/ios/Podfile.lock deleted file mode 100644 index deb3a53f..00000000 --- a/ios/Podfile.lock +++ /dev/null @@ -1,626 +0,0 @@ -PODS: - - amazon_payfort (1.1.4): - - Flutter - - PayFortSDK - - audio_session (0.0.1): - - Flutter - - barcode_scan2 (0.0.1): - - Flutter - - SwiftProtobuf (~> 1.33) - - connectivity_plus (0.0.1): - - Flutter - - CryptoSwift (1.8.4) - - device_calendar (0.0.1): - - Flutter - - device_calendar_plus_ios (0.0.1): - - Flutter - - device_info_plus (0.0.1): - - Flutter - - DKImagePickerController/Core (4.3.9): - - DKImagePickerController/ImageDataManager - - DKImagePickerController/Resource - - DKImagePickerController/ImageDataManager (4.3.9) - - DKImagePickerController/PhotoGallery (4.3.9): - - DKImagePickerController/Core - - DKPhotoGallery - - DKImagePickerController/Resource (4.3.9) - - DKPhotoGallery (0.0.19): - - DKPhotoGallery/Core (= 0.0.19) - - DKPhotoGallery/Model (= 0.0.19) - - DKPhotoGallery/Preview (= 0.0.19) - - DKPhotoGallery/Resource (= 0.0.19) - - SDWebImage - - SwiftyGif - - DKPhotoGallery/Core (0.0.19): - - DKPhotoGallery/Model - - DKPhotoGallery/Preview - - SDWebImage - - SwiftyGif - - DKPhotoGallery/Model (0.0.19): - - SDWebImage - - SwiftyGif - - DKPhotoGallery/Preview (0.0.19): - - DKPhotoGallery/Model - - DKPhotoGallery/Resource - - SDWebImage - - SwiftyGif - - DKPhotoGallery/Resource (0.0.19): - - SDWebImage - - SwiftyGif - - file_picker (0.0.1): - - DKImagePickerController/PhotoGallery - - Flutter - - Firebase/Analytics (11.15.0): - - Firebase/Core - - Firebase/Core (11.15.0): - - Firebase/CoreOnly - - FirebaseAnalytics (~> 11.15.0) - - Firebase/CoreOnly (11.15.0): - - FirebaseCore (~> 11.15.0) - - Firebase/Crashlytics (11.15.0): - - Firebase/CoreOnly - - FirebaseCrashlytics (~> 11.15.0) - - Firebase/Messaging (11.15.0): - - Firebase/CoreOnly - - FirebaseMessaging (~> 11.15.0) - - firebase_analytics (11.6.0): - - Firebase/Analytics (= 11.15.0) - - firebase_core - - Flutter - - firebase_core (3.15.2): - - Firebase/CoreOnly (= 11.15.0) - - Flutter - - firebase_crashlytics (4.3.10): - - Firebase/Crashlytics (= 11.15.0) - - firebase_core - - Flutter - - firebase_messaging (15.2.10): - - Firebase/Messaging (= 11.15.0) - - firebase_core - - Flutter - - FirebaseAnalytics (11.15.0): - - FirebaseAnalytics/Default (= 11.15.0) - - FirebaseCore (~> 11.15.0) - - FirebaseInstallations (~> 11.0) - - GoogleUtilities/AppDelegateSwizzler (~> 8.1) - - GoogleUtilities/MethodSwizzler (~> 8.1) - - GoogleUtilities/Network (~> 8.1) - - "GoogleUtilities/NSData+zlib (~> 8.1)" - - nanopb (~> 3.30910.0) - - FirebaseAnalytics/Default (11.15.0): - - FirebaseCore (~> 11.15.0) - - FirebaseInstallations (~> 11.0) - - GoogleAppMeasurement/Default (= 11.15.0) - - GoogleUtilities/AppDelegateSwizzler (~> 8.1) - - GoogleUtilities/MethodSwizzler (~> 8.1) - - GoogleUtilities/Network (~> 8.1) - - "GoogleUtilities/NSData+zlib (~> 8.1)" - - nanopb (~> 3.30910.0) - - FirebaseCore (11.15.0): - - FirebaseCoreInternal (~> 11.15.0) - - GoogleUtilities/Environment (~> 8.1) - - GoogleUtilities/Logger (~> 8.1) - - FirebaseCoreExtension (11.15.0): - - FirebaseCore (~> 11.15.0) - - FirebaseCoreInternal (11.15.0): - - "GoogleUtilities/NSData+zlib (~> 8.1)" - - FirebaseCrashlytics (11.15.0): - - FirebaseCore (~> 11.15.0) - - FirebaseInstallations (~> 11.0) - - FirebaseRemoteConfigInterop (~> 11.0) - - FirebaseSessions (~> 11.0) - - GoogleDataTransport (~> 10.0) - - GoogleUtilities/Environment (~> 8.1) - - nanopb (~> 3.30910.0) - - PromisesObjC (~> 2.4) - - FirebaseInstallations (11.15.0): - - FirebaseCore (~> 11.15.0) - - GoogleUtilities/Environment (~> 8.1) - - GoogleUtilities/UserDefaults (~> 8.1) - - PromisesObjC (~> 2.4) - - FirebaseMessaging (11.15.0): - - FirebaseCore (~> 11.15.0) - - FirebaseInstallations (~> 11.0) - - GoogleDataTransport (~> 10.0) - - GoogleUtilities/AppDelegateSwizzler (~> 8.1) - - GoogleUtilities/Environment (~> 8.1) - - GoogleUtilities/Reachability (~> 8.1) - - GoogleUtilities/UserDefaults (~> 8.1) - - nanopb (~> 3.30910.0) - - FirebaseRemoteConfigInterop (11.15.0) - - FirebaseSessions (11.15.0): - - FirebaseCore (~> 11.15.0) - - FirebaseCoreExtension (~> 11.15.0) - - FirebaseInstallations (~> 11.0) - - GoogleDataTransport (~> 10.0) - - GoogleUtilities/Environment (~> 8.1) - - GoogleUtilities/UserDefaults (~> 8.1) - - nanopb (~> 3.30910.0) - - PromisesSwift (~> 2.1) - - FLAnimatedImage (1.0.17) - - Flutter (1.0.0) - - flutter_callkit_incoming (0.0.1): - - CryptoSwift - - Flutter - - flutter_image_compress_common (1.0.0): - - Flutter - - Mantle - - SDWebImage - - SDWebImageWebPCoder - - flutter_inappwebview_ios (0.0.1): - - Flutter - - flutter_inappwebview_ios/Core (= 0.0.1) - - OrderedSet (~> 6.0.3) - - flutter_inappwebview_ios/Core (0.0.1): - - Flutter - - OrderedSet (~> 6.0.3) - - flutter_ios_voip_kit_karmm (0.8.0): - - Flutter - - flutter_local_notifications (0.0.1): - - Flutter - - flutter_nfc_kit (3.6.0): - - Flutter - - flutter_zoom_videosdk (0.0.1): - - Flutter - - ZoomVideoSDK/CptShare (= 2.1.10) - - ZoomVideoSDK/zm_annoter_dynamic (= 2.1.10) - - ZoomVideoSDK/zoomcml (= 2.1.10) - - ZoomVideoSDK/ZoomVideoSDK (= 2.1.10) - - fluttertoast (0.0.2): - - Flutter - - geolocator_apple (1.2.0): - - Flutter - - FlutterMacOS - - Google-Maps-iOS-Utils (5.0.0): - - GoogleMaps (~> 8.0) - - google_maps_flutter_ios (0.0.1): - - Flutter - - Google-Maps-iOS-Utils (< 7.0, >= 5.0) - - GoogleMaps (< 11.0, >= 8.4) - - GoogleAdsOnDeviceConversion (2.1.0): - - GoogleUtilities/Logger (~> 8.1) - - GoogleUtilities/Network (~> 8.1) - - nanopb (~> 3.30910.0) - - GoogleAppMeasurement/Core (11.15.0): - - GoogleUtilities/AppDelegateSwizzler (~> 8.1) - - GoogleUtilities/MethodSwizzler (~> 8.1) - - GoogleUtilities/Network (~> 8.1) - - "GoogleUtilities/NSData+zlib (~> 8.1)" - - nanopb (~> 3.30910.0) - - GoogleAppMeasurement/Default (11.15.0): - - GoogleAdsOnDeviceConversion (= 2.1.0) - - GoogleAppMeasurement/Core (= 11.15.0) - - GoogleAppMeasurement/IdentitySupport (= 11.15.0) - - GoogleUtilities/AppDelegateSwizzler (~> 8.1) - - GoogleUtilities/MethodSwizzler (~> 8.1) - - GoogleUtilities/Network (~> 8.1) - - "GoogleUtilities/NSData+zlib (~> 8.1)" - - nanopb (~> 3.30910.0) - - GoogleAppMeasurement/IdentitySupport (11.15.0): - - GoogleAppMeasurement/Core (= 11.15.0) - - GoogleUtilities/AppDelegateSwizzler (~> 8.1) - - GoogleUtilities/MethodSwizzler (~> 8.1) - - GoogleUtilities/Network (~> 8.1) - - "GoogleUtilities/NSData+zlib (~> 8.1)" - - nanopb (~> 3.30910.0) - - GoogleDataTransport (10.1.0): - - nanopb (~> 3.30910.0) - - PromisesObjC (~> 2.4) - - GoogleMaps (8.4.0): - - GoogleMaps/Maps (= 8.4.0) - - GoogleMaps/Base (8.4.0) - - GoogleMaps/Maps (8.4.0): - - GoogleMaps/Base - - GoogleUtilities/AppDelegateSwizzler (8.1.0): - - GoogleUtilities/Environment - - GoogleUtilities/Logger - - GoogleUtilities/Network - - GoogleUtilities/Privacy - - GoogleUtilities/Environment (8.1.0): - - GoogleUtilities/Privacy - - GoogleUtilities/Logger (8.1.0): - - GoogleUtilities/Environment - - GoogleUtilities/Privacy - - GoogleUtilities/MethodSwizzler (8.1.0): - - GoogleUtilities/Logger - - GoogleUtilities/Privacy - - GoogleUtilities/Network (8.1.0): - - GoogleUtilities/Logger - - "GoogleUtilities/NSData+zlib" - - GoogleUtilities/Privacy - - GoogleUtilities/Reachability - - "GoogleUtilities/NSData+zlib (8.1.0)": - - GoogleUtilities/Privacy - - GoogleUtilities/Privacy (8.1.0) - - GoogleUtilities/Reachability (8.1.0): - - GoogleUtilities/Logger - - GoogleUtilities/Privacy - - GoogleUtilities/UserDefaults (8.1.0): - - GoogleUtilities/Logger - - GoogleUtilities/Privacy - - health (13.1.4): - - Flutter - - image_picker_ios (0.0.1): - - Flutter - - in_app_review (2.0.0): - - Flutter - - just_audio (0.0.1): - - Flutter - - FlutterMacOS - - libwebp (1.5.0): - - libwebp/demux (= 1.5.0) - - libwebp/mux (= 1.5.0) - - libwebp/sharpyuv (= 1.5.0) - - libwebp/webp (= 1.5.0) - - libwebp/demux (1.5.0): - - libwebp/webp - - libwebp/mux (1.5.0): - - libwebp/demux - - libwebp/sharpyuv (1.5.0) - - libwebp/webp (1.5.0): - - libwebp/sharpyuv - - local_auth_darwin (0.0.1): - - Flutter - - FlutterMacOS - - location (0.0.1): - - Flutter - - manage_calendar_events (0.0.1): - - Flutter - - Mantle (2.2.0): - - Mantle/extobjc (= 2.2.0) - - Mantle/extobjc (2.2.0) - - map_launcher (0.0.1): - - Flutter - - MapboxCommon (23.11.0) - - MapboxCoreMaps (10.19.1): - - MapboxCommon (~> 23.11) - - MapboxCoreNavigation (2.19.0): - - MapboxDirections (~> 2.14) - - MapboxNavigationNative (< 207.0.0, >= 206.0.1) - - MapboxDirections (2.14.3): - - Polyline (~> 5.0) - - Turf (~> 2.8.0) - - MapboxMaps (10.19.0): - - MapboxCommon (= 23.11.0) - - MapboxCoreMaps (= 10.19.1) - - MapboxMobileEvents (= 2.0.0) - - Turf (= 2.8.0) - - MapboxMobileEvents (2.0.0) - - MapboxNavigation (2.19.0): - - MapboxCoreNavigation (= 2.19.0) - - MapboxMaps (~> 10.18) - - MapboxSpeech (~> 2.0) - - Solar-dev (~> 3.0) - - MapboxNavigationNative (206.2.2): - - MapboxCommon (~> 23.10) - - MapboxSpeech (2.1.1) - - nanopb (3.30910.0): - - nanopb/decode (= 3.30910.0) - - nanopb/encode (= 3.30910.0) - - nanopb/decode (3.30910.0) - - nanopb/encode (3.30910.0) - - network_info_plus (0.0.1): - - Flutter - - open_filex (0.0.2): - - Flutter - - OrderedSet (6.0.3) - - package_info_plus (0.4.5): - - Flutter - - path_provider_foundation (0.0.1): - - Flutter - - FlutterMacOS - - PayFortSDK (3.2.1) - - permission_handler_apple (9.3.0): - - Flutter - - Polyline (5.1.0) - - PromisesObjC (2.4.0) - - PromisesSwift (2.4.0): - - PromisesObjC (= 2.4.0) - - SDWebImage (5.21.5): - - SDWebImage/Core (= 5.21.5) - - SDWebImage/Core (5.21.5) - - SDWebImageWebPCoder (0.15.0): - - libwebp (~> 1.0) - - SDWebImage/Core (~> 5.17) - - share_plus (0.0.1): - - Flutter - - shared_preferences_foundation (0.0.1): - - Flutter - - FlutterMacOS - - Solar-dev (3.0.1) - - sqflite_darwin (0.0.4): - - Flutter - - FlutterMacOS - - SwiftProtobuf (1.33.3) - - SwiftyGif (5.4.5) - - Turf (2.8.0) - - url_launcher_ios (0.0.1): - - Flutter - - video_player_avfoundation (0.0.1): - - Flutter - - FlutterMacOS - - wakelock_plus (0.0.1): - - Flutter - - webview_flutter_wkwebview (0.0.1): - - Flutter - - FlutterMacOS - - ZoomVideoSDK/CptShare (2.1.10) - - ZoomVideoSDK/zm_annoter_dynamic (2.1.10) - - ZoomVideoSDK/zoomcml (2.1.10) - - ZoomVideoSDK/ZoomVideoSDK (2.1.10) - -DEPENDENCIES: - - amazon_payfort (from `.symlinks/plugins/amazon_payfort/ios`) - - audio_session (from `.symlinks/plugins/audio_session/ios`) - - barcode_scan2 (from `.symlinks/plugins/barcode_scan2/ios`) - - connectivity_plus (from `.symlinks/plugins/connectivity_plus/ios`) - - device_calendar (from `.symlinks/plugins/device_calendar/ios`) - - device_calendar_plus_ios (from `.symlinks/plugins/device_calendar_plus_ios/ios`) - - device_info_plus (from `.symlinks/plugins/device_info_plus/ios`) - - file_picker (from `.symlinks/plugins/file_picker/ios`) - - firebase_analytics (from `.symlinks/plugins/firebase_analytics/ios`) - - firebase_core (from `.symlinks/plugins/firebase_core/ios`) - - firebase_crashlytics (from `.symlinks/plugins/firebase_crashlytics/ios`) - - firebase_messaging (from `.symlinks/plugins/firebase_messaging/ios`) - - FLAnimatedImage - - Flutter (from `Flutter`) - - flutter_callkit_incoming (from `.symlinks/plugins/flutter_callkit_incoming/ios`) - - flutter_image_compress_common (from `.symlinks/plugins/flutter_image_compress_common/ios`) - - flutter_inappwebview_ios (from `.symlinks/plugins/flutter_inappwebview_ios/ios`) - - flutter_ios_voip_kit_karmm (from `.symlinks/plugins/flutter_ios_voip_kit_karmm/ios`) - - flutter_local_notifications (from `.symlinks/plugins/flutter_local_notifications/ios`) - - flutter_nfc_kit (from `.symlinks/plugins/flutter_nfc_kit/ios`) - - flutter_zoom_videosdk (from `.symlinks/plugins/flutter_zoom_videosdk/ios`) - - fluttertoast (from `.symlinks/plugins/fluttertoast/ios`) - - geolocator_apple (from `.symlinks/plugins/geolocator_apple/darwin`) - - google_maps_flutter_ios (from `.symlinks/plugins/google_maps_flutter_ios/ios`) - - health (from `.symlinks/plugins/health/ios`) - - image_picker_ios (from `.symlinks/plugins/image_picker_ios/ios`) - - in_app_review (from `.symlinks/plugins/in_app_review/ios`) - - just_audio (from `.symlinks/plugins/just_audio/darwin`) - - local_auth_darwin (from `.symlinks/plugins/local_auth_darwin/darwin`) - - location (from `.symlinks/plugins/location/ios`) - - manage_calendar_events (from `.symlinks/plugins/manage_calendar_events/ios`) - - map_launcher (from `.symlinks/plugins/map_launcher/ios`) - - MapboxMaps (= 10.19.0) - - MapboxNavigation (= 2.19.0) - - network_info_plus (from `.symlinks/plugins/network_info_plus/ios`) - - open_filex (from `.symlinks/plugins/open_filex/ios`) - - package_info_plus (from `.symlinks/plugins/package_info_plus/ios`) - - path_provider_foundation (from `.symlinks/plugins/path_provider_foundation/darwin`) - - permission_handler_apple (from `.symlinks/plugins/permission_handler_apple/ios`) - - share_plus (from `.symlinks/plugins/share_plus/ios`) - - shared_preferences_foundation (from `.symlinks/plugins/shared_preferences_foundation/darwin`) - - sqflite_darwin (from `.symlinks/plugins/sqflite_darwin/darwin`) - - url_launcher_ios (from `.symlinks/plugins/url_launcher_ios/ios`) - - video_player_avfoundation (from `.symlinks/plugins/video_player_avfoundation/darwin`) - - wakelock_plus (from `.symlinks/plugins/wakelock_plus/ios`) - - webview_flutter_wkwebview (from `.symlinks/plugins/webview_flutter_wkwebview/darwin`) - -SPEC REPOS: - trunk: - - CryptoSwift - - DKImagePickerController - - DKPhotoGallery - - Firebase - - FirebaseAnalytics - - FirebaseCore - - FirebaseCoreExtension - - FirebaseCoreInternal - - FirebaseCrashlytics - - FirebaseInstallations - - FirebaseMessaging - - FirebaseRemoteConfigInterop - - FirebaseSessions - - FLAnimatedImage - - Google-Maps-iOS-Utils - - GoogleAdsOnDeviceConversion - - GoogleAppMeasurement - - GoogleDataTransport - - GoogleMaps - - GoogleUtilities - - libwebp - - Mantle - - MapboxCommon - - MapboxCoreMaps - - MapboxCoreNavigation - - MapboxDirections - - MapboxMaps - - MapboxMobileEvents - - MapboxNavigation - - MapboxNavigationNative - - MapboxSpeech - - nanopb - - OrderedSet - - PayFortSDK - - Polyline - - PromisesObjC - - PromisesSwift - - SDWebImage - - SDWebImageWebPCoder - - Solar-dev - - SwiftProtobuf - - SwiftyGif - - Turf - - ZoomVideoSDK - -EXTERNAL SOURCES: - amazon_payfort: - :path: ".symlinks/plugins/amazon_payfort/ios" - audio_session: - :path: ".symlinks/plugins/audio_session/ios" - barcode_scan2: - :path: ".symlinks/plugins/barcode_scan2/ios" - connectivity_plus: - :path: ".symlinks/plugins/connectivity_plus/ios" - device_calendar: - :path: ".symlinks/plugins/device_calendar/ios" - device_calendar_plus_ios: - :path: ".symlinks/plugins/device_calendar_plus_ios/ios" - device_info_plus: - :path: ".symlinks/plugins/device_info_plus/ios" - file_picker: - :path: ".symlinks/plugins/file_picker/ios" - firebase_analytics: - :path: ".symlinks/plugins/firebase_analytics/ios" - firebase_core: - :path: ".symlinks/plugins/firebase_core/ios" - firebase_crashlytics: - :path: ".symlinks/plugins/firebase_crashlytics/ios" - firebase_messaging: - :path: ".symlinks/plugins/firebase_messaging/ios" - Flutter: - :path: Flutter - flutter_callkit_incoming: - :path: ".symlinks/plugins/flutter_callkit_incoming/ios" - flutter_image_compress_common: - :path: ".symlinks/plugins/flutter_image_compress_common/ios" - flutter_inappwebview_ios: - :path: ".symlinks/plugins/flutter_inappwebview_ios/ios" - flutter_ios_voip_kit_karmm: - :path: ".symlinks/plugins/flutter_ios_voip_kit_karmm/ios" - flutter_local_notifications: - :path: ".symlinks/plugins/flutter_local_notifications/ios" - flutter_nfc_kit: - :path: ".symlinks/plugins/flutter_nfc_kit/ios" - flutter_zoom_videosdk: - :path: ".symlinks/plugins/flutter_zoom_videosdk/ios" - fluttertoast: - :path: ".symlinks/plugins/fluttertoast/ios" - geolocator_apple: - :path: ".symlinks/plugins/geolocator_apple/darwin" - google_maps_flutter_ios: - :path: ".symlinks/plugins/google_maps_flutter_ios/ios" - health: - :path: ".symlinks/plugins/health/ios" - image_picker_ios: - :path: ".symlinks/plugins/image_picker_ios/ios" - in_app_review: - :path: ".symlinks/plugins/in_app_review/ios" - just_audio: - :path: ".symlinks/plugins/just_audio/darwin" - local_auth_darwin: - :path: ".symlinks/plugins/local_auth_darwin/darwin" - location: - :path: ".symlinks/plugins/location/ios" - manage_calendar_events: - :path: ".symlinks/plugins/manage_calendar_events/ios" - map_launcher: - :path: ".symlinks/plugins/map_launcher/ios" - network_info_plus: - :path: ".symlinks/plugins/network_info_plus/ios" - open_filex: - :path: ".symlinks/plugins/open_filex/ios" - package_info_plus: - :path: ".symlinks/plugins/package_info_plus/ios" - path_provider_foundation: - :path: ".symlinks/plugins/path_provider_foundation/darwin" - permission_handler_apple: - :path: ".symlinks/plugins/permission_handler_apple/ios" - share_plus: - :path: ".symlinks/plugins/share_plus/ios" - shared_preferences_foundation: - :path: ".symlinks/plugins/shared_preferences_foundation/darwin" - sqflite_darwin: - :path: ".symlinks/plugins/sqflite_darwin/darwin" - url_launcher_ios: - :path: ".symlinks/plugins/url_launcher_ios/ios" - video_player_avfoundation: - :path: ".symlinks/plugins/video_player_avfoundation/darwin" - wakelock_plus: - :path: ".symlinks/plugins/wakelock_plus/ios" - webview_flutter_wkwebview: - :path: ".symlinks/plugins/webview_flutter_wkwebview/darwin" - -SPEC CHECKSUMS: - amazon_payfort: 782d287860ac8962baf4e0a2a0fb2f81fdf27204 - audio_session: 19e9480dbdd4e5f6c4543826b2e8b0e4ab6145fe - barcode_scan2: 050b7b327e85954c8918715d42e83c5a35c3ed89 - connectivity_plus: 2a701ffec2c0ae28a48cf7540e279787e77c447d - CryptoSwift: e64e11850ede528a02a0f3e768cec8e9d92ecb90 - device_calendar: 9cb33f88a02e19652ec7b8b122ca778f751b1f7b - device_calendar_plus_ios: 34dca387f44fad29b840096a840f94edc55af858 - device_info_plus: bf2e3232933866d73fe290f2942f2156cdd10342 - DKImagePickerController: 946cec48c7873164274ecc4624d19e3da4c1ef3c - DKPhotoGallery: b3834fecb755ee09a593d7c9e389d8b5d6deed60 - file_picker: b159e0c068aef54932bb15dc9fd1571818edaf49 - Firebase: d99ac19b909cd2c548339c2241ecd0d1599ab02e - firebase_analytics: bf93e20703c95030404d6ddbb1adf05bf5c3885b - firebase_core: 99a37263b3c27536063a7b601d9e2a49400a433c - firebase_crashlytics: 986773c0c7ea4c3f5a4ead141b58522fcd9dfdb1 - firebase_messaging: bf6697c61f31c7cc0f654131212ff04c0115c2c7 - FirebaseAnalytics: 6433dfd311ba78084fc93bdfc145e8cb75740eae - FirebaseCore: efb3893e5b94f32b86e331e3bd6dadf18b66568e - FirebaseCoreExtension: edbd30474b5ccf04e5f001470bdf6ea616af2435 - FirebaseCoreInternal: 9afa45b1159304c963da48addb78275ef701c6b4 - FirebaseCrashlytics: e09d0bc19aa54a51e45b8039c836ef73f32c039a - FirebaseInstallations: 317270fec08a5d418fdbc8429282238cab3ac843 - FirebaseMessaging: 3b26e2cee503815e01c3701236b020aa9b576f09 - FirebaseRemoteConfigInterop: 1c6135e8a094cc6368949f5faeeca7ee8948b8aa - FirebaseSessions: b9a92c1c51bbb81e78fc3142cda6d925d700f8e7 - FLAnimatedImage: bbf914596368867157cc71b38a8ec834b3eeb32b - Flutter: cabc95a1d2626b1b06e7179b784ebcf0c0cde467 - flutter_callkit_incoming: 417dd1b46541cdd5d855ad795ccbe97d1c18155e - flutter_image_compress_common: ec1d45c362c9d30a3f6a0426c297f47c52007e3e - flutter_inappwebview_ios: 6f63631e2c62a7c350263b13fa5427aedefe81d4 - flutter_ios_voip_kit_karmm: 7ea37381a8841c92d186edf1f4604df5cc437579 - flutter_local_notifications: ff50f8405aaa0ccdc7dcfb9022ca192e8ad9688f - flutter_nfc_kit: 3985c93f749b9cb4747479205c2f10bd2f877a11 - flutter_zoom_videosdk: 7ddc97d617b85aeace252165d2b5fc5638678c38 - fluttertoast: 21eecd6935e7064cc1fcb733a4c5a428f3f24f0f - geolocator_apple: 66b711889fd333205763b83c9dcf0a57a28c7afd - Google-Maps-iOS-Utils: 66d6de12be1ce6d3742a54661e7a79cb317a9321 - google_maps_flutter_ios: ffdd933832966673a1f57f5effd014dc8d4d43a2 - GoogleAdsOnDeviceConversion: 2be6297a4f048459e0ae17fad9bfd2844e10cf64 - GoogleAppMeasurement: 700dce7541804bec33db590a5c496b663fbe2539 - GoogleDataTransport: aae35b7ea0c09004c3797d53c8c41f66f219d6a7 - GoogleMaps: 8939898920281c649150e0af74aa291c60f2e77d - GoogleUtilities: 00c88b9a86066ef77f0da2fab05f65d7768ed8e1 - health: 9cd70a5c9d9ec559a12d639a1471091c0cbb6b48 - image_picker_ios: 4f2f91b01abdb52842a8e277617df877e40f905b - in_app_review: 436034b18594851a7328d7f1c2ed5ec235b79cfc - just_audio: a42c63806f16995daf5b219ae1d679deb76e6a79 - libwebp: 02b23773aedb6ff1fd38cec7a77b81414c6842a8 - local_auth_darwin: 63c73d6d28cc3e239be2b6aa460ea6e317cd5100 - location: d5cf8598915965547c3f36761ae9cc4f4e87d22e - manage_calendar_events: 9b2889799340398027b3e3f5c4891d41599ec257 - Mantle: c5aa8794a29a022dfbbfc9799af95f477a69b62d - map_launcher: 8a4e484aaddff55680a7da9bc9e25f512067fb87 - MapboxCommon: 119f3759f7dc9457f0695848108ab323eb643cb4 - MapboxCoreMaps: ca17f67baced23f8c952166ac6314c35bad3f66c - MapboxCoreNavigation: 3be9990fae3ed732a101001746d0e3b4234ec023 - MapboxDirections: d9ad8452e8927d95ed21e35f733834dbca7e0eb1 - MapboxMaps: b7f29ec7c33f7dc6d2947c1148edce6db81db9a7 - MapboxMobileEvents: d044b9edbe0ec7df60f6c2c9634fe9a7f449266b - MapboxNavigation: da9cf3d773ed5b0fa0fb388fccdaa117ee681f31 - MapboxNavigationNative: 629e359f3d2590acd1ebbacaaf99e1a80ee57e42 - MapboxSpeech: cd25ef99c3a3d2e0da72620ff558276ea5991a77 - nanopb: fad817b59e0457d11a5dfbde799381cd727c1275 - network_info_plus: 6613d9d7cdeb0e6f366ed4dbe4b3c51c52d567a9 - open_filex: 6e26e659846ec990262224a12ef1c528bb4edbe4 - OrderedSet: e539b66b644ff081c73a262d24ad552a69be3a94 - package_info_plus: c0502532a26c7662a62a356cebe2692ec5fe4ec4 - path_provider_foundation: 0b743cbb62d8e47eab856f09262bb8c1ddcfe6ba - PayFortSDK: 233eabe9a45601fdbeac67fa6e5aae46ed8faf82 - permission_handler_apple: 9878588469a2b0d0fc1e048d9f43605f92e6cec2 - Polyline: 2a1f29f87f8d9b7de868940f4f76deb8c678a5b1 - PromisesObjC: f5707f49cb48b9636751c5b2e7d227e43fba9f47 - PromisesSwift: 9d77319bbe72ebf6d872900551f7eeba9bce2851 - SDWebImage: e9c98383c7572d713c1a0d7dd2783b10599b9838 - SDWebImageWebPCoder: 0e06e365080397465cc73a7a9b472d8a3bd0f377 - share_plus: 8b6f8b3447e494cca5317c8c3073de39b3600d1f - shared_preferences_foundation: 5086985c1d43c5ba4d5e69a4e8083a389e2909e6 - Solar-dev: 4612dc9878b9fed2667d23b327f1d4e54e16e8d0 - sqflite_darwin: 5a7236e3b501866c1c9befc6771dfd73ffb8702d - SwiftProtobuf: e1b437c8e31a4c5577b643249a0bb62ed4f02153 - SwiftyGif: 706c60cf65fa2bc5ee0313beece843c8eb8194d4 - Turf: aa2ede4298009639d10db36aba1a7ebaad072a5e - url_launcher_ios: bb13df5870e8c4234ca12609d04010a21be43dfa - video_player_avfoundation: 7993f492ae0bd77edaea24d9dc051d8bb2cd7c86 - wakelock_plus: 76957ab028e12bfa4e66813c99e46637f367fc7e - webview_flutter_wkwebview: 29eb20d43355b48fe7d07113835b9128f84e3af4 - ZoomVideoSDK: 94e939820e57a075c5e712559f927017da0de06a - -PODFILE CHECKSUM: 8235407385ddd5904afc2563d65406117a51993e - -COCOAPODS: 1.16.2 diff --git a/lib/features/my_appointments/my_appointments_repo.dart b/lib/features/my_appointments/my_appointments_repo.dart index d4669767..541e8878 100644 --- a/lib/features/my_appointments/my_appointments_repo.dart +++ b/lib/features/my_appointments/my_appointments_repo.dart @@ -847,7 +847,7 @@ class MyAppointmentsRepoImp implements MyAppointmentsRepo { // final queueList = list.map((item) => PatientQueueDetails.fromJson(item as Map)).toList().cast(); final queueList = PatientQueueDetails.fromJson(queueData); - queueList.patientQueueData!.isClinicConfigured = 1; + // queueList.patientQueueData!.isClinicConfigured = 1; apiResponse = GenericApiModel( messageStatus: messageStatus, diff --git a/lib/presentation/appointments/widgets/appointment_doctor_card.dart b/lib/presentation/appointments/widgets/appointment_doctor_card.dart index 593746cb..0e4e2aeb 100644 --- a/lib/presentation/appointments/widgets/appointment_doctor_card.dart +++ b/lib/presentation/appointments/widgets/appointment_doctor_card.dart @@ -150,7 +150,8 @@ class AppointmentDoctorCard extends StatelessWidget { ], ), ), - patientAppointmentHistoryResponseModel.isLiveCareAppointment! || patientAppointmentHistoryResponseModel.isClinicReBookingAllowed! ==false + + patientAppointmentHistoryResponseModel.isLiveCareAppointment! || patientAppointmentHistoryResponseModel.isClinicReBookingAllowed! || patientAppointmentHistoryResponseModel.isActiveDoctor! == false ? SizedBox.shrink() : Utils.buildSvgWithAssets(icon: AppAssets.doctor_profile_icon, width: 20.h, height: 20.h, fit: BoxFit.scaleDown).onPress(() async { DoctorsListResponseModel selectedDoctor = DoctorsListResponseModel(); From ce0eda744811ef0c96dafdd6fd87444d808c02bf Mon Sep 17 00:00:00 2001 From: Sultan khan Date: Tue, 14 Apr 2026 11:58:47 +0300 Subject: [PATCH 24/45] no message --- pubspec.lock | 126 +++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 92 insertions(+), 34 deletions(-) diff --git a/pubspec.lock b/pubspec.lock index 8395a120..f8ccd5ee 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -237,35 +237,31 @@ packages: device_calendar_plus: dependency: "direct main" description: - name: device_calendar_plus - sha256: d11a70d98eb123e8eb09fdcfaf220ca4f1aa65a1512e12092f176f4b54983507 - url: "https://pub.dev" - source: hosted - version: "0.3.3" + path: "package/device_calendar_plus" + relative: true + source: path + version: "0.3.1" device_calendar_plus_android: dependency: transitive description: - name: device_calendar_plus_android - sha256: a341ef29fa0251251287d63c1d009dfd35c1459dc6a129fd5e03f5ac92d8d7ff - url: "https://pub.dev" - source: hosted - version: "0.3.3" + path: "package/device_calendar_plus/package/device_calendar_plus_android" + relative: true + source: path + version: "0.3.1" device_calendar_plus_ios: dependency: transitive description: - name: device_calendar_plus_ios - sha256: "3b2f84ce1ed002be8460e214a3229e66748bbaad4077603f2c734d67c42033ff" - url: "https://pub.dev" - source: hosted - version: "0.3.3" + path: "package/device_calendar_plus/package/device_calendar_plus_ios" + relative: true + source: path + version: "0.3.1" device_calendar_plus_platform_interface: dependency: transitive description: - name: device_calendar_plus_platform_interface - sha256: "0ce7511c094ca256831a48e16efe8f1e97e7bd00a5ff3936296ffd650a1d76b5" - url: "https://pub.dev" - source: hosted - version: "0.3.3" + path: "package/device_calendar_plus/package/device_calendar_plus_platform_interface" + relative: true + source: path + version: "0.3.1" device_info_plus: dependency: "direct main" description: @@ -519,6 +515,54 @@ packages: url: "https://pub.dev" source: hosted version: "0.20.5" + flutter_image_compress: + dependency: "direct main" + description: + name: flutter_image_compress + sha256: "51d23be39efc2185e72e290042a0da41aed70b14ef97db362a6b5368d0523b27" + url: "https://pub.dev" + source: hosted + version: "2.4.0" + flutter_image_compress_common: + dependency: transitive + description: + name: flutter_image_compress_common + sha256: c5c5d50c15e97dd7dc72ff96bd7077b9f791932f2076c5c5b6c43f2c88607bfb + url: "https://pub.dev" + source: hosted + version: "1.0.6" + flutter_image_compress_macos: + dependency: transitive + description: + name: flutter_image_compress_macos + sha256: "20019719b71b743aba0ef874ed29c50747461e5e8438980dfa5c2031898f7337" + url: "https://pub.dev" + source: hosted + version: "1.0.3" + flutter_image_compress_ohos: + dependency: transitive + description: + name: flutter_image_compress_ohos + sha256: e76b92bbc830ee08f5b05962fc78a532011fcd2041f620b5400a593e96da3f51 + url: "https://pub.dev" + source: hosted + version: "0.0.3" + flutter_image_compress_platform_interface: + dependency: transitive + description: + name: flutter_image_compress_platform_interface + sha256: "579cb3947fd4309103afe6442a01ca01e1e6f93dc53bb4cbd090e8ce34a41889" + url: "https://pub.dev" + source: hosted + version: "1.0.5" + flutter_image_compress_web: + dependency: transitive + description: + name: flutter_image_compress_web + sha256: b9b141ac7c686a2ce7bb9a98176321e1182c9074650e47bb140741a44b6f5a96 + url: "https://pub.dev" + source: hosted + version: "0.1.5" flutter_inappwebview: dependency: "direct main" description: @@ -679,10 +723,9 @@ packages: flutter_swiper_view: dependency: "direct main" description: - name: flutter_swiper_view - sha256: "2a165b259e8a4c49d4da5626b967ed42a73dac2d075bd9e266ad8d23b9f01879" - url: "https://pub.dev" - source: hosted + path: "package/flutter_swiper_view" + relative: true + source: path version: "1.1.8" flutter_test: dependency: "direct dev" @@ -993,12 +1036,11 @@ packages: huawei_map: dependency: "direct main" description: - path: flutter-hms-map - ref: HEAD - resolved-ref: "9a16541e4016e3bf58a2571e6aa658a4751af399" - url: "https://github.com/fleoparra/hms-flutter-plugin.git" - source: git - version: "6.11.2+303" + name: huawei_map + sha256: "03bd37d565874281be10e7649d09990d88bc5bf724f45051f8cfaca7620fc273" + url: "https://pub.dev" + source: hosted + version: "6.12.0+301" image_picker: dependency: "direct main" description: @@ -1063,6 +1105,22 @@ packages: url: "https://pub.dev" source: hosted version: "0.2.2" + in_app_review: + dependency: "direct main" + description: + name: in_app_review + sha256: ab26ac54dbd802896af78c670b265eaeab7ecddd6af4d0751e9604b60574817f + url: "https://pub.dev" + source: hosted + version: "2.0.11" + in_app_review_platform_interface: + dependency: transitive + description: + name: in_app_review_platform_interface + sha256: fed2c755f2125caa9ae10495a3c163aa7fab5af3585a9c62ef4a6920c5b45f10 + url: "https://pub.dev" + source: hosted + version: "2.0.5" in_app_update: dependency: "direct main" description: @@ -1283,10 +1341,10 @@ packages: dependency: transitive description: name: meta - sha256: e3641ec5d63ebf0d9b41bd43201a66e3fc79a65db5f61fc181f04cd27aab950c + sha256: "23f08335362185a5ea2ad3a4e597f1375e78bce8a040df5c600c8d3552ef2394" url: "https://pub.dev" source: hosted - version: "1.16.0" + version: "1.17.0" mime: dependency: transitive description: @@ -1816,10 +1874,10 @@ packages: dependency: transitive description: name: test_api - sha256: "522f00f556e73044315fa4585ec3270f1808a4b186c936e612cab0b565ff1e00" + sha256: ab2726c1a94d3176a45960b6234466ec367179b87dd74f1611adb1f3b5fb9d55 url: "https://pub.dev" source: hosted - version: "0.7.6" + version: "0.7.7" time: dependency: transitive description: From 4cd51326277ba741ce7a1d7549c8dc1e844144c3 Mon Sep 17 00:00:00 2001 From: aamir-csol Date: Tue, 14 Apr 2026 12:25:53 +0300 Subject: [PATCH 25/45] radiology ai Analysis --- .../radiology_ai_analysis_response_model.dart | 29 +- .../radiology/radiology_view_model.dart | 12 +- .../radiology_ai_analysis_detailed_page.dart | 255 ++++++++++++++++++ .../radiology_ai_analysis_widget.dart | 63 ++++- .../radiology/radiology_result_page.dart | 39 +-- 5 files changed, 349 insertions(+), 49 deletions(-) create mode 100644 lib/presentation/radiology/radiology_ai_analysis_detailed_page.dart diff --git a/lib/features/radiology/models/resp_models/radiology_ai_analysis_response_model.dart b/lib/features/radiology/models/resp_models/radiology_ai_analysis_response_model.dart index e838f187..3f523428 100644 --- a/lib/features/radiology/models/resp_models/radiology_ai_analysis_response_model.dart +++ b/lib/features/radiology/models/resp_models/radiology_ai_analysis_response_model.dart @@ -2,9 +2,19 @@ import 'dart:convert'; class RadiologyAiAnalysisResponse { String? summary; + String? labResults; + String? aiPredictions; + String? riskFactors; + String? prevention; + int? languageId; RadiologyAiAnalysisResponse({ this.summary, + this.labResults, + this.aiPredictions, + this.riskFactors, + this.prevention, + this.languageId, }); factory RadiologyAiAnalysisResponse.fromRawJson(String str) => RadiologyAiAnalysisResponse.fromJson(json.decode(str)); @@ -12,11 +22,20 @@ class RadiologyAiAnalysisResponse { String toRawJson() => json.encode(toJson()); factory RadiologyAiAnalysisResponse.fromJson(Map json) => RadiologyAiAnalysisResponse( - summary: json["summary"], - ); + summary: json["summary"], + labResults: json["lab_results"], + aiPredictions: json["ai_predictions"], + riskFactors: json["riskFactors"], + prevention: json["prevention"], + languageId: json["language_id"], + ); Map toJson() => { - "summary": summary, - }; + "summary": summary, + "lab_results": labResults, + "ai_predictions": aiPredictions, + "riskFactors": riskFactors, + "prevention": prevention, + "language_id": languageId, + }; } - diff --git a/lib/features/radiology/radiology_view_model.dart b/lib/features/radiology/radiology_view_model.dart index 7386a5a0..cf795a1d 100644 --- a/lib/features/radiology/radiology_view_model.dart +++ b/lib/features/radiology/radiology_view_model.dart @@ -1,12 +1,10 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; -import 'package:hmg_patient_app_new/core/app_state.dart'; -import 'package:hmg_patient_app_new/core/dependencies.dart'; -import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; import 'package:hmg_patient_app_new/features/authentication/models/resp_models/authenticated_user_resp_model.dart'; import 'package:hmg_patient_app_new/features/radiology/models/resp_models/radiology_ai_analysis_response_model.dart'; import 'package:hmg_patient_app_new/features/radiology/radiology_repo.dart'; import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; +import 'package:hmg_patient_app_new/presentation/radiology/radiology_ai_analysis_detailed_page.dart'; import 'package:hmg_patient_app_new/presentation/radiology/radiology_result_page.dart'; import 'package:hmg_patient_app_new/services/error_handler_service.dart'; import 'package:hmg_patient_app_new/services/navigation_service.dart'; @@ -216,12 +214,11 @@ class RadiologyViewModel extends ChangeNotifier { void setIsRadiologyAIAnalysisNeedsToBeShown(bool value) { isRadiologyAIAnalysisNeedsToBeShown = value; - notifyListeners(); } void closeRadiologyAIAnalysis() { radiologyAiAnalysisResponse = null; - notifyListeners(); + } Future getRadiologyAiAnalysis({required String reportData, required String loadingText, required int langId}) async { @@ -229,7 +226,6 @@ class RadiologyViewModel extends ChangeNotifier { loadingText: loadingText, showCloseButton: true, onCloseTap: () { - setIsRadiologyAIAnalysisNeedsToBeShown(false); }, ); @@ -248,6 +244,10 @@ class RadiologyViewModel extends ChangeNotifier { if (isRadiologyAIAnalysisNeedsToBeShown) { radiologyAiAnalysisResponse = apiResponse.data; notifyListeners(); + // Navigate to detailed page + navigationService.push( + CustomPageRoute(direction: AxisDirection.down, page: RadiologyAiAnalysisDetailedPage()), + ); } } }, diff --git a/lib/presentation/radiology/radiology_ai_analysis_detailed_page.dart b/lib/presentation/radiology/radiology_ai_analysis_detailed_page.dart new file mode 100644 index 00000000..78a3a097 --- /dev/null +++ b/lib/presentation/radiology/radiology_ai_analysis_detailed_page.dart @@ -0,0 +1,255 @@ +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/app_assets.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/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/features/radiology/radiology_view_model.dart'; +import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; +import 'package:hmg_patient_app_new/widgets/appbar/collapsing_list_view.dart'; +import 'package:hmg_patient_app_new/widgets/expandable_list_widget.dart'; +import 'package:provider/provider.dart'; + +class RadiologyAiAnalysisDetailedPage extends StatefulWidget { + const RadiologyAiAnalysisDetailedPage({super.key}); + + @override + State createState() => _RadiologyAiAnalysisDetailedPageState(); +} + +class _RadiologyAiAnalysisDetailedPageState extends State { + late RadiologyViewModel radiologyProvider; + + List _parseStringToList(String? text) { + if (text == null || text.isEmpty) return []; + // Split by newlines and filter out empty lines + return text.split('\n').where((line) => line.trim().isNotEmpty).map((line) => line.trim()).toList(); + } + + @override + Widget build(BuildContext context) { + radiologyProvider = Provider.of(context, listen: false); + return CollapsingListView( + isClose: true, + title: LocaleKeys.aiAnalysis.tr(context: context), + child: Consumer( + builder: (context, model, child) { + if (model.radiologyAiAnalysisResponse == null) { + return Utils.getNoDataWidget(context); + } + + final analysis = model.radiologyAiAnalysisResponse!; + List expandableItems = []; + + // Parse string fields into lists + final predictions = _parseStringToList(analysis.aiPredictions); + final preventions = _parseStringToList(analysis.prevention); + final riskFactorsText = _parseStringToList(analysis.riskFactors); + + // Summary Section + if (analysis.summary != null && analysis.summary!.isNotEmpty) { + expandableItems.add( + ExpandableListItem( + backgroundColor: Colors.transparent, + expandedBackgroundColor: Colors.transparent, + title: LocaleKeys.summary.tr(context: context).toText18(weight: FontWeight.w700, color: AppColors.blackColor), + initiallyExpanded: true, + children: [ + SizedBox(height: 10.h), + Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 12.r, + side: BorderSide(width: 1, color: Color(0xFF0B85F7)), + ), + padding: EdgeInsets.all(16.r), + child: (analysis.summary ?? "").toText14(color: AppColors.textColorLight, height: 1.5, weight: FontWeight.w400), + ), + SizedBox(height: 8.h), + ], + ), + ); + } + + // Lab Results Section (Radiology Results) + if (analysis.labResults != null && analysis.labResults!.isNotEmpty) { + expandableItems.add( + ExpandableListItem( + backgroundColor: Colors.transparent, + expandedBackgroundColor: Colors.transparent, + title: LocaleKeys.labResults.tr(context: context).toText18(weight: FontWeight.w700, color: AppColors.blackColor), + children: [ + SizedBox(height: 10.h), + Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 12.r, + side: BorderSide(width: 1, color: Color(0xFF0B85F7)), + ), + padding: EdgeInsets.all(16.r), + child: (analysis.labResults ?? "").toText14(color: AppColors.textColorLight, height: 1.5, weight: FontWeight.w400), + ), + SizedBox(height: 8.h), + ], + ), + ); + } + + // AI Predictions Section + if (predictions.isNotEmpty) { + expandableItems.add( + ExpandableListItem( + backgroundColor: Colors.transparent, + expandedBackgroundColor: Colors.transparent, + title: LocaleKeys.prediction.tr(context: context).toText18(weight: FontWeight.w700, color: AppColors.blackColor), + children: [ + SizedBox(height: 10.h), + Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 12.r, + side: BorderSide(width: 1, color: Color(0xFFFFAF15)), + ), + padding: EdgeInsets.all(16.r), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: predictions.map((prediction) => _buildBulletItem(prediction)).toList(), + ), + ), + SizedBox(height: 8.h), + ], + ), + ); + } + + // Risk Factors Section + if (riskFactorsText.isNotEmpty) { + expandableItems.add( + ExpandableListItem( + backgroundColor: Colors.transparent, + expandedBackgroundColor: Colors.transparent, + title: LocaleKeys.riskFactors.tr(context: context).toText18(weight: FontWeight.w700, color: AppColors.blackColor), + children: [ + SizedBox(height: 10.h), + ...riskFactorsText.asMap().entries.map((entry) { + final riskText = entry.value; + return Column( + children: [ + Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: Color(0xFFFBCB6E).withOpacity(0.10), + borderRadius: 12.r, + side: BorderSide(width: 1, color: Color(0xFFFBCB6E).withOpacity(0.10)), + ), + padding: EdgeInsets.all(16.r), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + Utils.buildSvgWithAssets(icon: AppAssets.guradIcon), + Padding( + padding: const EdgeInsets.all(8.0), + child: LocaleKeys.riskFactors.tr(context: context).toText16(weight: FontWeight.w700, color: AppColors.blackColor), + ), + ], + ), + SizedBox(height: 8.h), + riskText.toText14( + color: AppColors.textColorLight, + height: 1.5, + weight: FontWeight.w400, + ), + ], + ), + ), + SizedBox(height: 16.h), + ], + ); + }).toList(), + ], + ), + ); + } + + // Prevention Section + if (preventions.isNotEmpty) { + expandableItems.add( + ExpandableListItem( + backgroundColor: Colors.transparent, + expandedBackgroundColor: Colors.transparent, + title: LocaleKeys.prevention.tr(context: context).toText18(weight: FontWeight.w700, color: AppColors.blackColor), + children: [ + SizedBox(height: 10.h), + Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 12.r, + side: BorderSide(width: 1, color: Color(0xFF18C273)), + ), + padding: EdgeInsets.all(16.r), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: preventions.map((prevention) => _buildBulletItem(prevention)).toList(), + ), + ), + SizedBox(height: 8.h), + ], + ), + ); + } + + return Column( + children: [ + if (expandableItems.isEmpty) + Utils.getNoDataWidget(context) + else + CustomExpandableList( + expansionMode: ExpansionMode.exactlyOne, + dividerColor: AppColors.dividerColor, + itemPadding: EdgeInsets.symmetric(vertical: 16.h, horizontal: 14.h), + items: expandableItems, + theme: ExpandableListTheme.custom( + defaultTrailingIcon: Utils.buildSvgWithAssets( + icon: AppAssets.arrow_down, + height: 22.h, + width: 22.w, + iconColor: AppColors.textColor, + ), + ), + ).paddingSymmetrical(16.w, 0.0), + Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Icon(Icons.info_outline, color: AppColors.greyTextColor, size: 20.r), + SizedBox(width: 8.w), + Expanded( + child: ("${LocaleKeys.disclaimer.tr()}:${LocaleKeys.thisAboveInfo.tr()}") + .toText12(color: AppColors.greyTextColor, fontWeight: FontWeight.w400), + ), + ], + ).paddingSymmetrical(16.w, 16.h) + ], + ); + }, + ), + ); + } + + Widget _buildBulletItem(String text) { + return Padding( + padding: EdgeInsets.only(bottom: 12.h), + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Expanded( + child: text.toText14(color: AppColors.textColorLight, height: 1.5, weight: FontWeight.w400), + ), + ], + ), + ); + } +} + diff --git a/lib/presentation/radiology/radiology_ai_analysis_widget.dart b/lib/presentation/radiology/radiology_ai_analysis_widget.dart index 97d35115..7eda4047 100644 --- a/lib/presentation/radiology/radiology_ai_analysis_widget.dart +++ b/lib/presentation/radiology/radiology_ai_analysis_widget.dart @@ -16,8 +16,18 @@ class RadiologyAiAnalysisWidget extends StatelessWidget { const RadiologyAiAnalysisWidget({super.key, required this.data}); + List _parseStringToList(String? text) { + if (text == null || text.isEmpty) return []; + // Split by newlines and filter out empty lines + return text.split('\n').where((line) => line.trim().isNotEmpty).map((line) => line.trim()).toList(); + } + @override Widget build(BuildContext context) { + // Parse the string fields into lists + final predictions = _parseStringToList(data.aiPredictions); + final preventions = _parseStringToList(data.prevention); + return Container( decoration: BoxDecoration(borderRadius: BorderRadius.circular(24.r), gradient: AppColors.aiLinearGradient), padding: EdgeInsets.all(1.5.r), // Border thickness @@ -43,7 +53,25 @@ class RadiologyAiAnalysisWidget extends StatelessWidget { ), SizedBox(height: 16.h), if (data.summary != null && data.summary!.isNotEmpty) ...[ + LocaleKeys.suggestion.tr().toText16(weight: FontWeight.w700, color: AppColors.blackColor), + SizedBox(height: 8.h), data.summary!.toText14(color: AppColors.textColorLight, height: 1.5, weight: FontWeight.w400), + SizedBox(height: 16.h), + Divider(color: AppColors.dividerColor, thickness: 1), + SizedBox(height: 16.h), + ], + if (predictions.isNotEmpty) ...[ + LocaleKeys.prediction.tr().toText16(weight: FontWeight.w700, color: AppColors.blackColor), + SizedBox(height: 12.h), + ...predictions.map((item) => _buildBulletItem(item)), + SizedBox(height: 16.h), + Divider(color: AppColors.dividerColor, thickness: 1), + SizedBox(height: 16.h), + ], + if (preventions.isNotEmpty) ...[ + LocaleKeys.prevention.tr().toText16(weight: FontWeight.w700, color: AppColors.blackColor), + SizedBox(height: 12.h), + ...preventions.map((item) => _buildBulletItem(item)), SizedBox(height: 20.h), ], Row( @@ -52,14 +80,45 @@ class RadiologyAiAnalysisWidget extends StatelessWidget { Icon(Icons.info_outline, color: AppColors.greyTextColor, size: 20.r), SizedBox(width: 8.w), Expanded( - child: ("${LocaleKeys.disclaimer.tr()}: ${LocaleKeys.thisAboveInfo.tr()}").toText12(color: AppColors.greyTextColor, fontWeight: FontWeight.w400), + child: ("${LocaleKeys.disclaimer.tr()}:${LocaleKeys.thisAboveInfo.tr()}").toText12(color: AppColors.greyTextColor, fontWeight: FontWeight.w400), ), ], ), - SizedBox(height: 8.h), + SizedBox(height: 16.h), + CustomButton( + height: 50.h, + text: LocaleKeys.close.tr(context: context), + backgroundColor: AppColors.primaryRedColor, + borderColor: AppColors.primaryRedColor, + onPressed: () { + getIt.get().closeRadiologyAIAnalysis(); + }, + ), ], ), ), ); } + + Widget _buildBulletItem(String text) { + return Padding( + padding: EdgeInsets.only(bottom: 12.h), + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: EdgeInsets.only(top: 8.h, right: 12.w, left: 4.w), + child: Container( + width: 5.r, + height: 5.r, + decoration: BoxDecoration(color: AppColors.blackColor, shape: BoxShape.circle), + ), + ), + Expanded( + child: text.toText14(color: AppColors.textColorLight, height: 1.5, weight: FontWeight.w400), + ), + ], + ), + ); + } } diff --git a/lib/presentation/radiology/radiology_result_page.dart b/lib/presentation/radiology/radiology_result_page.dart index 445bbd45..5b7072e6 100644 --- a/lib/presentation/radiology/radiology_result_page.dart +++ b/lib/presentation/radiology/radiology_result_page.dart @@ -11,10 +11,8 @@ import 'package:hmg_patient_app_new/extensions/route_extensions.dart'; import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; import 'package:hmg_patient_app_new/features/radiology/models/resp_models/patient_radiology_response_model.dart'; -import 'package:hmg_patient_app_new/features/radiology/models/resp_models/radiology_ai_analysis_response_model.dart'; import 'package:hmg_patient_app_new/features/radiology/radiology_view_model.dart'; import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; -import 'package:hmg_patient_app_new/presentation/radiology/radiology_ai_analysis_widget.dart'; import 'package:hmg_patient_app_new/services/dialog_service.dart'; import 'package:hmg_patient_app_new/widgets/appbar/collapsing_list_view.dart'; import 'package:hmg_patient_app_new/theme/colors.dart'; @@ -37,8 +35,6 @@ class RadiologyResultPage extends StatefulWidget { class _RadiologyResultPageState extends State { late RadiologyViewModel radiologyViewModel; - final GlobalKey _aiAnalysisKey = GlobalKey(); - RadiologyAiAnalysisResponse? _previousAiData; @override void initState() { @@ -52,7 +48,7 @@ class _RadiologyResultPageState extends State { void dispose() { // Clear AI analysis data when leaving the screen radiologyViewModel.closeRadiologyAIAnalysis(); - radiologyViewModel.setIsRadiologyAIAnalysisNeedsToBeShown(true); + // radiologyViewModel.setIsRadiologyAIAnalysisNeedsToBeShown(true); super.dispose(); } @@ -63,29 +59,6 @@ class _RadiologyResultPageState extends State { return Scaffold( backgroundColor: AppColors.bgScaffoldColor, body: Consumer(builder: (context, radVM, child) { - // Detect changes in radiologyAiAnalysisResponse - WidgetsBinding.instance.addPostFrameCallback((_) { - if (radVM.radiologyAiAnalysisResponse != null && _previousAiData == null) { - // AI data just became available — scroll to it - final ctx = _aiAnalysisKey.currentContext; - if (ctx != null) { - Scrollable.ensureVisible( - ctx, - duration: const Duration(milliseconds: 400), - curve: Curves.easeOut, - ); - } - } else if (radVM.radiologyAiAnalysisResponse == null && _previousAiData != null) { - // AI data just became null — scroll to top - final scrollable = Scrollable.maybeOf(context); - scrollable?.position.animateTo( - 0, - duration: const Duration(milliseconds: 400), - curve: Curves.easeOut, - ); - } - _previousAiData = radVM.radiologyAiAnalysisResponse; - }); return Column( children: [ @@ -185,11 +158,6 @@ class _RadiologyResultPageState extends State { ).paddingSymmetrical(16.h, 0.h), ), SizedBox(height: 24.h), - if (radVM.radiologyAiAnalysisResponse != null) - RadiologyAiAnalysisWidget( - key: _aiAnalysisKey, - data: radVM.radiologyAiAnalysisResponse!, - ), ], ), ), @@ -229,8 +197,7 @@ class _RadiologyResultPageState extends State { iconSize: 20.h, ).paddingSymmetrical(24.h, 0.h) : SizedBox.shrink(), - Utils.havePrivilege(116) ? radVM.radiologyAiAnalysisResponse == null - ? Container( + Utils.havePrivilege(116) ? Container( height: 56.h, decoration: BoxDecoration( borderRadius: BorderRadius.circular(12.r), @@ -274,7 +241,7 @@ class _RadiologyResultPageState extends State { context.pop(); }, ); - }) : SizedBox.shrink() : SizedBox(height: 24.h), + }) : SizedBox(height: 24.h), ], ), ), From aa22ad1e0788b5293c6d7eaf15a8b284009cf98b Mon Sep 17 00:00:00 2001 From: tahaalam Date: Tue, 14 Apr 2026 13:54:01 +0300 Subject: [PATCH 26/45] calender request changes --- lib/core/utils/calender_utils_new.dart | 87 ++++++++++++------- .../appointment_details_page.dart | 6 +- 2 files changed, 61 insertions(+), 32 deletions(-) diff --git a/lib/core/utils/calender_utils_new.dart b/lib/core/utils/calender_utils_new.dart index 347c2ebc..a30de823 100644 --- a/lib/core/utils/calender_utils_new.dart +++ b/lib/core/utils/calender_utils_new.dart @@ -16,33 +16,64 @@ class CalenderUtilsNew { final DeviceCalendar calender = DeviceCalendar.instance; List writableCalender = []; - CalenderUtilsNew._instance() { - getCalenders(); - } + /// Completer to ensure getCalenders() only runs once at a time + Completer? _calendarInitCompleter; + + CalenderUtilsNew._instance(); static final CalenderUtilsNew instance = CalenderUtilsNew._instance(); - Future getCalenders() async { + /// Ensures calendars are loaded exactly once. Safe to call multiple times — + /// subsequent calls await the same future. + Future ensureCalendarsLoaded() async { + if (writableCalender.isNotEmpty) return; + if (_calendarInitCompleter != null) { + // Already in progress — just wait for it + return _calendarInitCompleter!.future; + } + _calendarInitCompleter = Completer(); + try { + await _loadCalendars(); + _calendarInitCompleter!.complete(); + } catch (e) { + _calendarInitCompleter!.completeError(e); + _calendarInitCompleter = null; // Allow retry on failure + rethrow; + } + } + + Future _loadCalendars() async { + print("the get calenders is called"); CalendarPermissionStatus result = await DeviceCalendar.instance.hasPermissions(); if (result != CalendarPermissionStatus.granted) { await DeviceCalendar.instance.requestPermissions(); - showCommonBottomSheetWithoutHeight( - title: LocaleKeys.notice.tr(context: GetIt.instance().navigatorKey.currentContext!), - GetIt.instance().navigatorKey.currentContext!, - child: Utils.getWarningWidget( - loadingText: LocaleKeys.calendarPermissionAlert.tr(), - isShowActionButtons: true, - onCancelTap: () { - GetIt.instance().pop(); - }, - onConfirmTap: () async { - GetIt.instance().pop(); - openAppSettings(); - }), - callBackFunc: () {}, - isFullScreen: false, - isCloseButtonVisible: true, - ); + result = await DeviceCalendar.instance.hasPermissions(); + // if (result != CalendarPermissionStatus.granted) { + // print("the permission is not granted"); + // showCommonBottomSheetWithoutHeight( + // title: LocaleKeys.notice.tr(context: GetIt + // .instance() + // .navigatorKey + // .currentContext!), + // GetIt + // .instance() + // .navigatorKey + // .currentContext!, + // child: Utils.getWarningWidget( + // loadingText: LocaleKeys.calendarPermissionAlert.tr(), + // isShowActionButtons: true, + // onCancelTap: () { + // GetIt.instance().pop(); + // }, + // onConfirmTap: () async { + // GetIt.instance().pop(); + // openAppSettings(); + // }), + // callBackFunc: () {}, + // isFullScreen: false, + // isCloseButtonVisible: true, + // ); + // } } var calenders = await calender.listCalendars(); calenders.forEach((calender) { @@ -53,9 +84,7 @@ class CalenderUtilsNew { } FutureOr createOrUpdateEvent({required String title, required String description, required String location, DateTime? scheduleDateTime, String? eventId, int? reminderMinutes}) async { - if (writableCalender.isEmpty) { - await getCalenders(); - } + await ensureCalendarsLoaded(); var writableCalendars = writableCalender.first; String eventResult = ""; CalendarPermissionStatus result = await DeviceCalendar.instance.hasPermissions(); @@ -146,9 +175,7 @@ class CalenderUtilsNew { } FutureOr checkIfEventExist(String admissionId) async { - if (writableCalender.isEmpty) { - await getCalenders(); - } + await ensureCalendarsLoaded(); List events = await getEvents(); if (events.isEmpty) return false; for (var event in events) { @@ -161,7 +188,7 @@ class CalenderUtilsNew { FutureOr getEventIdIfEventExist(String admissionId) async { if (writableCalender.isEmpty) { - await getCalenders(); + await ensureCalendarsLoaded(); } List events = await getEvents(); if (events.isEmpty) return ""; @@ -174,7 +201,7 @@ class CalenderUtilsNew { FutureOr checkAndRemove({required String id}) async { if (writableCalender.isEmpty) { - await getCalenders(); + await ensureCalendarsLoaded(); } List events = await getEvents(); if (events.isEmpty) return false; @@ -191,7 +218,7 @@ class CalenderUtilsNew { FutureOr checkAndRemoveMultipleItems({required String id}) async { if (writableCalender.isEmpty) { - await getCalenders(); + await ensureCalendarsLoaded(); } List events = await getEvents(); if (events.isEmpty) return false; diff --git a/lib/presentation/appointments/appointment_details_page.dart b/lib/presentation/appointments/appointment_details_page.dart index 40ef4644..545fdb18 100644 --- a/lib/presentation/appointments/appointment_details_page.dart +++ b/lib/presentation/appointments/appointment_details_page.dart @@ -103,14 +103,15 @@ class _AppointmentDetailsPageState extends State { } // // Check if reminder exists in calendar and update the flag - // await _checkAndUpdateReminderStatus(); } }); // Initialize countdown timer for payment after first frame to ensure context is available - WidgetsBinding.instance.addPostFrameCallback((_) { + WidgetsBinding.instance.addPostFrameCallback((_) async { if (mounted) { _startCountdownTimer(); + await _checkAndUpdateReminderStatus(); + } }); } @@ -373,6 +374,7 @@ class _AppointmentDetailsPageState extends State { ? null : Column( children: [ + SizedBox(height: 16.w), Divider(height: 1, color: AppColors.dividerColor), SizedBox(height: 16.w), From 9ff303d514a5a55059f46221d5e34837cc9f5cd6 Mon Sep 17 00:00:00 2001 From: Sultan khan Date: Tue, 14 Apr 2026 15:37:54 +0300 Subject: [PATCH 27/45] fixes and updates. --- lib/core/utils/push_notification_handler.dart | 17 ++++++++++++----- .../widgets/appointment_doctor_card.dart | 2 +- lib/presentation/authentication/login.dart | 3 ++- .../widgets/medical_file_appointment_card.dart | 5 +++-- .../symptoms_checker/triage_screen.dart | 2 +- lib/splashPage.dart | 15 +++++++++++++-- lib/widgets/language_switcher.dart | 6 ++++-- 7 files changed, 36 insertions(+), 14 deletions(-) diff --git a/lib/core/utils/push_notification_handler.dart b/lib/core/utils/push_notification_handler.dart index 6fc248f9..770961de 100644 --- a/lib/core/utils/push_notification_handler.dart +++ b/lib/core/utils/push_notification_handler.dart @@ -51,12 +51,15 @@ _incomingCall(Map data) async { // GetIt.instance().saveString(key: CacheConst.zoomRoomID, value: roomID); // GetIt.instance().saveBool(key: CacheConst.isAppOpenedFromCall, value: true); - Utils.saveStringFromPrefs(CacheConst.zoomRoomID, roomID); - Utils.saveStringFromPrefs(CacheConst.callTypeID, callTypeID); - Utils.saveBoolFromPrefs(CacheConst.isAppOpenedFromCall, true); + await Utils.saveStringFromPrefs(CacheConst.zoomRoomID, roomID); + await Utils.saveStringFromPrefs(CacheConst.callTypeID, callTypeID); + await Utils.saveBoolFromPrefs(CacheConst.isAppOpenedFromCall, true); + WidgetsFlutterBinding.ensureInitialized(); + int callKitType = callTypeID == '2' ? 0 : 1; + var _currentUuid = Uuid().v4(); CallKitParams callKitParams = CallKitParams( id: _currentUuid, @@ -64,7 +67,7 @@ _incomingCall(Map data) async { appName: 'Dr Al Habib', avatar: 'https://play-lh.googleusercontent.com/FBNNpxb7m6eM6wtW7MV1Ffp6OXOGLI38q47zcvP29OCYA1yhYH5mZzl5itZi0TgOyZpG', // handle: LandingPage.incomingCallData.name, - type: 1, + type: callKitType, textAccept: 'Accept', textDecline: 'Decline', missedCallNotification: NotificationParams( @@ -80,7 +83,11 @@ _incomingCall(Map data) async { callbackText: 'Hang Up', ), duration: 30000, - extra: {'userId': '1a2b3c4d'}, + extra: { + 'userId': '1a2b3c4d', + 'callTypeID': callTypeID, // Store actual callTypeID here + 'roomID': roomID, // Store roomID here for backup + }, headers: {'apiKey': 'Abc@123!', 'platform': 'flutter'}, android: const AndroidParams( isImportant: true, diff --git a/lib/presentation/appointments/widgets/appointment_doctor_card.dart b/lib/presentation/appointments/widgets/appointment_doctor_card.dart index 0e4e2aeb..05358243 100644 --- a/lib/presentation/appointments/widgets/appointment_doctor_card.dart +++ b/lib/presentation/appointments/widgets/appointment_doctor_card.dart @@ -151,7 +151,7 @@ class AppointmentDoctorCard extends StatelessWidget { ), ), - patientAppointmentHistoryResponseModel.isLiveCareAppointment! || patientAppointmentHistoryResponseModel.isClinicReBookingAllowed! || patientAppointmentHistoryResponseModel.isActiveDoctor! == false + patientAppointmentHistoryResponseModel.isLiveCareAppointment! || patientAppointmentHistoryResponseModel.isClinicReBookingAllowed! ==false || patientAppointmentHistoryResponseModel.isActiveDoctor! == false ? SizedBox.shrink() : Utils.buildSvgWithAssets(icon: AppAssets.doctor_profile_icon, width: 20.h, height: 20.h, fit: BoxFit.scaleDown).onPress(() async { DoctorsListResponseModel selectedDoctor = DoctorsListResponseModel(); diff --git a/lib/presentation/authentication/login.dart b/lib/presentation/authentication/login.dart index b2979235..e15b62bb 100644 --- a/lib/presentation/authentication/login.dart +++ b/lib/presentation/authentication/login.dart @@ -70,7 +70,8 @@ class LoginScreenState extends State { crossAxisAlignment: CrossAxisAlignment.start, children: [ Utils.showLottie(context: context, assetPath: AppAnimations.login, width: 200.h, height: 200.h, repeat: true, fit: BoxFit.cover), - SizedBox(height: 130.h), // Adjusted to sizer unit + // SizedBox(height: 130.h), + SizedBox(height: MediaQuery.of(context).size.height * 0.12), // based on the screen height Adjusted to sizer unit LocaleKeys.welcomeToDrSulaiman.tr(context: context).toText32(isBold: true, color: AppColors.textColor ), SizedBox(height: 32.h), Localizations.override(context: context, locale: Locale('en', 'US'), child: Container()), // Force English locale for this widget diff --git a/lib/presentation/medical_file/widgets/medical_file_appointment_card.dart b/lib/presentation/medical_file/widgets/medical_file_appointment_card.dart index 2e769609..a67a6765 100644 --- a/lib/presentation/medical_file/widgets/medical_file_appointment_card.dart +++ b/lib/presentation/medical_file/widgets/medical_file_appointment_card.dart @@ -350,7 +350,8 @@ class _MedicalFileAppointmentCardState extends State ), SizedBox(height: 24.h), // Countdown Timer - DD : HH : MM : SS format with labels - Row( + Directionality( + textDirection: ui.TextDirection.ltr, child:Row( mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.start, children: [ @@ -378,7 +379,7 @@ class _MedicalFileAppointmentCardState extends State LocaleKeys.seconds.tr(context: context), ), ], - ), + )), SizedBox(height: 24.h), // Green Acknowledge button with checkmark icon CustomButton( diff --git a/lib/presentation/symptoms_checker/triage_screen.dart b/lib/presentation/symptoms_checker/triage_screen.dart index c9291275..58c03db2 100644 --- a/lib/presentation/symptoms_checker/triage_screen.dart +++ b/lib/presentation/symptoms_checker/triage_screen.dart @@ -80,7 +80,7 @@ class _TriagePageState extends State { } // Case 2: Should stop flag is true OR Case 3: Probability >= 70% OR Case 4: 7 or more questions answered - if (viewModel.shouldStopTriage || highestProbability >= 70.0 || viewModel.triageQuestionCount >= 15) { + if (viewModel.shouldStopTriage || highestProbability >= 70.0 || viewModel.triageQuestionCount >= 30) { // Navigate to results/possible conditions screen context.navigateWithName(AppRoutes.possibleConditionsPage); return; diff --git a/lib/splashPage.dart b/lib/splashPage.dart index f17d8bc3..c7be036f 100644 --- a/lib/splashPage.dart +++ b/lib/splashPage.dart @@ -79,10 +79,9 @@ class _SplashScreenState extends State { } navigateToTeleConsult() async { + String roomID = await Utils.getStringFromPrefs(CacheConst.zoomRoomID); String callTypeID = await Utils.getStringFromPrefs(CacheConst.callTypeID); - print('RoomID: $roomID'); - print('callTypeID: $callTypeID'); // GetIt.instance().remove(key: CacheConst.isAppOpenedFromCall); Utils.removeFromPrefs(CacheConst.isAppOpenedFromCall); @@ -116,6 +115,18 @@ class _SplashScreenState extends State { print('actionCallAccept Event Received: ------->'); FlutterCallkitIncoming.endAllCalls(); try { + // Get callTypeID and roomID from event's extra data + String? eventCallTypeID = event.body['extra']?['callTypeID']; + String? eventRoomID = event.body['extra']?['roomID']; + + // Re-save to SharedPreferences to ensure they're available + if (eventCallTypeID != null && eventCallTypeID.isNotEmpty) { + await Utils.saveStringFromPrefs(CacheConst.callTypeID, eventCallTypeID); + } + if (eventRoomID != null && eventRoomID.isNotEmpty) { + await Utils.saveStringFromPrefs(CacheConst.zoomRoomID, eventRoomID); + } + navigateToTeleConsult(); // String roomID = await Utils.getStringFromPrefs(SharedPrefsConsts.ZOOM_ROOM_ID); // String roomPass = await Utils.getStringFromPrefs(SharedPrefsConsts.ZOOM_ROOM_PASS); diff --git a/lib/widgets/language_switcher.dart b/lib/widgets/language_switcher.dart index 3ee10df3..15237363 100644 --- a/lib/widgets/language_switcher.dart +++ b/lib/widgets/language_switcher.dart @@ -56,8 +56,7 @@ class _LanguageSelectorState extends State { child: Row( mainAxisSize: MainAxisSize.min, children: [ - Utils.buildSvgWithAssets(icon: AppAssets.language), - SizedBox(width: 6.h), + Text( // currentLangData['name']?.toUpperCase() ?? 'EN', widget.currentLanguage == 'ar' ? "ENGLISH" : "العربية", @@ -69,6 +68,9 @@ class _LanguageSelectorState extends State { isLanguageSwitcher: true, fontFamily: widget.currentLanguage == 'ar' ? "Poppins" : "CairoArabic"), ), + SizedBox(width: 6.h), + Utils.buildSvgWithAssets(icon: AppAssets.language), + ], ), ), From 5a4e5e138be1d6abe49912ba6ac297e63501a81b Mon Sep 17 00:00:00 2001 From: tahaalam Date: Tue, 14 Apr 2026 15:42:19 +0300 Subject: [PATCH 28/45] string localization changes --- assets/langs/ar-SA.json | 17 +++++++++-------- assets/langs/en-US.json | 11 ++++++----- lib/generated/locale_keys.g.dart | 1 + lib/presentation/authentication/login.dart | 2 +- 4 files changed, 17 insertions(+), 14 deletions(-) diff --git a/assets/langs/ar-SA.json b/assets/langs/ar-SA.json index 5a8df673..f339bdd0 100644 --- a/assets/langs/ar-SA.json +++ b/assets/langs/ar-SA.json @@ -101,7 +101,7 @@ "onlinePaymentSubtitle": "الدفع", "cancelNocaps": "إلغاء", "setReminder": "تذكير", - "nationalIdNumber": "رقم الهوية الوطنية", + "nationalIdNumber": "رقم الهوية / الإقام", "medicalFileNumber": "رقم الملف الطبي", "loginregister": "تسجيل الدخول / التسجيل", "poweredBy": "مدعوم من", @@ -125,7 +125,7 @@ "profileInfo": "يرجى إدخال معلومات الملف الشخصي", "submit": "تحديث", "forgotDesc": "أدخل رقم الهاتف المحمول لاستلام رقم الملف الطبي عبر الرسائل القصيرة", - "dob": "تاريخ الميلاد:", + "dob": "تاريخ الميلاد", "hijriDate": "الت��ريخ الهجري", "gregorianDate": "التاريخ الميلادي", "verifyLoginWith": "يرجى اختيار واحدة من الخيارات التالية للتحقق", @@ -815,7 +815,7 @@ "enterEmailDesc": "أدخل عنوان بريدك الإلكتروني لإكمال عملية إنشاء ملف طبي", "enterPhoneDesc": "أدخل رقم هاتفك لتلقي رمز التحقق ", "pleaseChooseOption": "الرجاء اختيار من الخيارات أدناه لتلقي رمز التحقق OTP", - "prepareToElevate": "هل أنت مستعد لتحسين صحتك ورفاهيتك؟", + "prepareToElevate": "رعايتك الصحية تبدأ من هنا", "iAcceptTermsConditions": "أوافق على الشروط والأحكام", "alreadyHaveAccount": "هل لديك حساب بالفعل؟", "loginNow": "تسجيل الدخول الآن", @@ -859,8 +859,8 @@ "didntReceiveIt": "لم تستلمه؟", "resendOTP": "إعادة إرسال", "resendIn": "إعادة الإرسال في", - "pleaseEnterAnationalID": "يرجى إدخال رقم الهوية الوطنية", - "pleaseEnterAFileNumber": "يرجى إدخال رقم الملف", + "pleaseEnterAnationalID": "تسجيل الدخول برقم الهوية او الاقامة", + "pleaseEnterAFileNumber": "يرجى إدخال / رقم الملف", "pleaseEnterAValidEmail": "يرجى إدخال بريد إلكتروني صالح", "pleaseEnterFullName": "يرجى إدخال الاسم الكامل", "pleaseAcceptTermsConditions": "يرجى قبول الشروط والأحكام", @@ -1681,10 +1681,10 @@ "favouriteList": "قائمة المفضلة", "later": "لاحقاً", "cancelAppointmentConfirmMessage": "هل أنت متأكد من رغبتك في إلغاء هذا الموعد؟", - "acknowledged": "حسنا", + "acknowledged": "إغلاق", "searchLabResults": "بحث نتائج المختبر", "callForAssistance": "اتصل للحصول على المساعدة الفورية", - "oneWaySubtitle": "نقل من الموقع إلى المستشفى", + "oneWaySubtitle": "نقل م ن الموقع إلى المستشفى", "twoWaySubtitle": "نقل من الموقع إلى المستشفى والعودة مرة أخرى", "toHospitalSubtitle": "نقل من موقعك الحالي إلى المستشفى", "fromHospitalSubtitle": "نقل من المستشفى إلى منزلك", @@ -1748,5 +1748,6 @@ "m": "متر", "inch": "انش", "updateEmailAddressTitle": "تحديث البريد الالكتروني: ", - "enterNewNewContactNumber": "الرجاء اضافة رقم اتصال في حالة الطواريء: " + "enterNewNewContactNumber": "الرجاء اضافة رقم اتصال في حالة الطواريء: ", + "nationalIdFileNumber": "رقم الهوية / الإقامة / الملف" } diff --git a/assets/langs/en-US.json b/assets/langs/en-US.json index 5a7f9e66..ddecd702 100644 --- a/assets/langs/en-US.json +++ b/assets/langs/en-US.json @@ -99,7 +99,7 @@ "onlinePaymentSubtitle": "Payment", "cancelNocaps": "Cancel", "setReminder": "Set Reminder", - "nationalIdNumber": "National ID Number", + "nationalIdNumber": "National ID / Iqama", "medicalFileNumber": "Medical File Number", "loginregister": "Login / Register", "poweredBy": "Powered by", @@ -123,7 +123,7 @@ "profileInfo": "Please enter profile information", "submit": "Submit", "forgotDesc": "Enter the mobile number to receive the Medical File Number via SMS", - "dob": "Birth Date:", + "dob": "Birth Date", "hijriDate": "Hijri Date", "gregorianDate": "Gregorian Date", "verifyLoginWith": "Please choose one of the following options to verify", @@ -806,7 +806,7 @@ "readInstructions": "Read Instructions", "searchLabReport": "Search Lab Report", "prescriptionDeliveryError": "This clinic doesn't support refill", - "prepareToElevate": "Prepared to elevate your health and well-being?", + "prepareToElevate": "Your wellness journey starts here.", "iAcceptTermsConditions": "I Accept the Terms and Conditions", "alreadyHaveAccount": "Already have an account?", "loginNow": "Login Now", @@ -997,7 +997,7 @@ "processingCheckIn": "Processing Check-In...", "bookingWaitingAppointment": "Booking Waiting Appointment, Please wait...", "enterValidIDorIqama": "Please enter a valid national ID or file number", - "selectAppointment": "Select Appointment", + "selectAppointment": "Select Axppointment", "rebookSameDoctor": "Rebook with same doctor", "queueing": "Queueing", "inQueue": "In Queue", @@ -1737,5 +1737,6 @@ "m": "m", "inch": "in", "updateEmailAddressTitle": "Enter the new email address to be updated: ", - "enterNewNewContactNumber": "Enter the new emergency contact number to be updated: " + "enterNewNewContactNumber": "Enter the new emergency contact number to be updated: ", + "nationalIdFileNumber": "National ID/File Number" } diff --git a/lib/generated/locale_keys.g.dart b/lib/generated/locale_keys.g.dart index f71483b9..51d64b07 100644 --- a/lib/generated/locale_keys.g.dart +++ b/lib/generated/locale_keys.g.dart @@ -1739,5 +1739,6 @@ abstract class LocaleKeys { static const inch = 'inch'; static const updateEmailAddressTitle = 'updateEmailAddressTitle'; static const enterNewNewContactNumber = 'enterNewNewContactNumber'; + static const nationalIdFileNumber = 'nationalIdFileNumber'; } diff --git a/lib/presentation/authentication/login.dart b/lib/presentation/authentication/login.dart index b2979235..bbb6b4eb 100644 --- a/lib/presentation/authentication/login.dart +++ b/lib/presentation/authentication/login.dart @@ -75,7 +75,7 @@ class LoginScreenState extends State { SizedBox(height: 32.h), Localizations.override(context: context, locale: Locale('en', 'US'), child: Container()), // Force English locale for this widget TextInputWidget( - labelText: "${LocaleKeys.nationalId.tr(context: context)} / ${LocaleKeys.fileNo.tr(context: context)}", + labelText: "${LocaleKeys.nationalIdFileNumber.tr(context: context)}", hintText: "xxxxxxxxx", controller: authVm.nationalIdController, focusNode: _nationalIdFocusNode, From 14771b32d36531fd2a06573627107d422ab2ddc6 Mon Sep 17 00:00:00 2001 From: tahaalam Date: Tue, 14 Apr 2026 16:14:11 +0300 Subject: [PATCH 29/45] reminder changes --- assets/langs/ar-SA.json | 6 +- assets/langs/en-US.json | 4 +- lib/core/utils/calender_utils_new.dart | 6 +- .../appointment_details_page.dart | 426 ++++++++++++------ .../book_appointment/widgets/bell_switch.dart | 4 +- 5 files changed, 292 insertions(+), 154 deletions(-) diff --git a/assets/langs/ar-SA.json b/assets/langs/ar-SA.json index f339bdd0..7b6c06d4 100644 --- a/assets/langs/ar-SA.json +++ b/assets/langs/ar-SA.json @@ -114,7 +114,7 @@ "yes": "نعم", "no": "لا", "logintyperadio": "اختر من الخيارات أدناه لتسجيل الدخول إلى ملفك الطبي.", - "registernow": "سجل الآن", + "registernow": "تسجيل", "nationalID": "أدخل رقم الهوية", "nationalId": "الهوية الوطنية", "fileNo": "رقم الملف", @@ -817,8 +817,8 @@ "pleaseChooseOption": "الرجاء اختيار من الخيارات أدناه لتلقي رمز التحقق OTP", "prepareToElevate": "رعايتك الصحية تبدأ من هنا", "iAcceptTermsConditions": "أوافق على الشروط والأحكام", - "alreadyHaveAccount": "هل لديك حساب بالفعل؟", - "loginNow": "تسجيل الدخول الآن", + "alreadyHaveAccount": "لديك حساب؟", + "loginNow": "تسجيل الدخول", "notice": "إشعار", "oR": "أو", "sendOTPWHATSAPP": "واتساب", diff --git a/assets/langs/en-US.json b/assets/langs/en-US.json index ddecd702..dee355f6 100644 --- a/assets/langs/en-US.json +++ b/assets/langs/en-US.json @@ -112,7 +112,7 @@ "yes": "Yes", "no": "No", "logintyperadio": " Choose from the below options to login to your medical file.", - "registernow": "Register Now", + "registernow": "Register", "nationalID": "Enter the Identification Number", "nationalId": "National ID", "fileNo": "File Number", @@ -849,7 +849,7 @@ "didntReceiveIt": "Didn't receive it?", "resendOTP": "Resend", "resendIn": "resend in", - "pleaseEnterAnationalID": "Please enter a national ID", + "pleaseEnterAnationalID": "ID or Iqama number is required", "pleaseEnterAFileNumber": "Please enter a file number", "pleaseEnterAValidEmail": "Please enter a valid email", "pleaseEnterFullName": "Please enter full name", diff --git a/lib/core/utils/calender_utils_new.dart b/lib/core/utils/calender_utils_new.dart index a30de823..bbf69119 100644 --- a/lib/core/utils/calender_utils_new.dart +++ b/lib/core/utils/calender_utils_new.dart @@ -87,9 +87,9 @@ class CalenderUtilsNew { await ensureCalendarsLoaded(); var writableCalendars = writableCalender.first; String eventResult = ""; - CalendarPermissionStatus result = await DeviceCalendar.instance.hasPermissions(); - if (result != CalendarPermissionStatus.granted) await DeviceCalendar.instance.requestPermissions(); - print(result); + // CalendarPermissionStatus result = await DeviceCalendar.instance.hasPermissions(); + // if (result != CalendarPermissionStatus.granted) await DeviceCalendar.instance.requestPermissions(); + // print(result); // String eventId = await getEventIdIfEventExist(title!.split("#").last); // if (eventId.isEmpty) { diff --git a/lib/presentation/appointments/appointment_details_page.dart b/lib/presentation/appointments/appointment_details_page.dart index 545fdb18..66d2b151 100644 --- a/lib/presentation/appointments/appointment_details_page.dart +++ b/lib/presentation/appointments/appointment_details_page.dart @@ -110,8 +110,7 @@ class _AppointmentDetailsPageState extends State { WidgetsBinding.instance.addPostFrameCallback((_) async { if (mounted) { _startCountdownTimer(); - await _checkAndUpdateReminderStatus(); - + // await _checkAndUpdateReminderStatus(); } }); } @@ -414,6 +413,145 @@ class _AppointmentDetailsPageState extends State { ], ), ), + SizedBox(height: 16.h), + Row( + mainAxisSize: MainAxisSize.max, + children: [ + Utils.buildSvgWithAssets(icon: AppAssets.prescription_reminder_icon, width: 40.w, height: 40.h, applyThemeColor: false), + SizedBox(width: 8.w), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + spacing: 4.h, + children: [ + LocaleKeys.setReminder.tr(context: context).toText13(isBold: true), + LocaleKeys.notifyMeBeforeAppointment.tr(context: context).toText11(color: AppColors.textColorLight, isBold: true), + ], + ), + const Spacer(), + BellAnimatedSwitch( + key: _bellSwitchKey, + width: 48.w, + height: 30.h, + initialValue: widget.patientAppointmentHistoryResponseModel.hasReminder ?? false, + activeColor: AppColors.successColor.withOpacity(0.2), + inactiveColor: AppColors.lightGrayBGColor, + activeCircleColor: AppColors.successColor, + inactiveCircleColor: AppColors.greyTextColor, + activeIconColor: AppColors.bgGreenColor, + inactiveIconColor: AppColors.greyTextColor, + activeIcon: Utils.buildSvgWithAssets(icon: AppAssets.bell, iconColor: AppColors.whiteColor, width: 12.w, height: 12.h), + inactiveIcon: Utils.buildSvgWithAssets(icon: AppAssets.bell, iconColor: AppColors.whiteColor, width: 12.w, height: 12.h), + onChanged: (newValue) async { + CalenderUtilsNew calender = CalenderUtilsNew.instance; + bool isEventAddedOrRemoved = false; + if (newValue == true) { + DateTime startDate = DateTime.now(); + DateTime endDate = DateUtil.convertStringToDate(widget.patientAppointmentHistoryResponseModel.appointmentDate); + + // Show reminder bottom sheet and check if permission was granted + bool permissionGranted = await BottomSheetUtils().showReminderBottomSheet( + context, + endDate, + widget.patientAppointmentHistoryResponseModel.doctorNameObj ?? "", + "${widget.patientAppointmentHistoryResponseModel.appointmentNo}" ?? "", + "", + "", + title: "Appointment with ${widget.patientAppointmentHistoryResponseModel.doctorNameObj}", + description: + "${widget.patientAppointmentHistoryResponseModel.doctorNameObj} will be having an appointment on ${widget.patientAppointmentHistoryResponseModel.appointmentDate}", + onSuccess: () { + setState(() { + myAppointmentsViewModel.setAppointmentReminder(newValue, widget.patientAppointmentHistoryResponseModel); + }); + }, + isMultiAllowed: true, + onMultiDateSuccess: (int selectedIndex) async { + isEventAddedOrRemoved = await calender.createOrUpdateEvent( + title: + "Appointment Reminder with ${widget.patientAppointmentHistoryResponseModel.doctorNameObj} on ${DateUtil.convertStringToDate(widget.patientAppointmentHistoryResponseModel.appointmentDate)}, Appointment #${widget.patientAppointmentHistoryResponseModel.appointmentNo}", + description: + "Appointment Reminder with ${widget.patientAppointmentHistoryResponseModel.doctorNameObj} in ${widget.patientAppointmentHistoryResponseModel.projectName}", + scheduleDateTime: DateUtil.convertStringToDate(widget.patientAppointmentHistoryResponseModel.appointmentDate), + eventId: "${widget.patientAppointmentHistoryResponseModel.appointmentNo}", + location: '', + reminderMinutes: selectedIndex); + setState(() { + myAppointmentsViewModel.setAppointmentReminder(isEventAddedOrRemoved, widget.patientAppointmentHistoryResponseModel); + }); + }, + ); + + // If permission was not granted, revert the switch back to OFF + if (!permissionGranted) { + _bellSwitchKey.currentState?.setSwitchValue(false); + } + } else { + isEventAddedOrRemoved = await calender.checkAndRemove( + id: "${widget.patientAppointmentHistoryResponseModel.appointmentNo}", + ); + setState(() { + myAppointmentsViewModel.setAppointmentReminder(!isEventAddedOrRemoved, widget.patientAppointmentHistoryResponseModel); + }); + } + }, + ) + + // Switch( + // activeThumbColor: AppColors.successColor, + // // activeTrackColor: AppColors.successColor.withValues(alpha: .15), + // value: widget.patientAppointmentHistoryResponseModel.hasReminder!, + // onChanged: (newValue) async { + // CalenderUtilsNew calender = CalenderUtilsNew.instance; + // bool isEventAddedOrRemoved = false; + // if(newValue == true){ + // DateTime startDate = DateTime.now(); + // DateTime endDate = DateUtil.convertStringToDate(widget + // .patientAppointmentHistoryResponseModel.appointmentDate); + // BottomSheetUtils().showReminderBottomSheet( + // context, + // endDate, + // widget.patientAppointmentHistoryResponseModel.doctorNameObj??"", + // "${widget.patientAppointmentHistoryResponseModel.appointmentNo}"??"", + // "", + // "", + // title: "Appointment with ${widget.patientAppointmentHistoryResponseModel.doctorNameObj}", + // description: + // "${widget.patientAppointmentHistoryResponseModel.doctorNameObj} will be having an appointment on ${widget.patientAppointmentHistoryResponseModel.appointmentDate}", + // onSuccess: () { + // setState(() { + // myAppointmentsViewModel.setAppointmentReminder(newValue, widget.patientAppointmentHistoryResponseModel); + // }); + // }, + // isMultiAllowed: true, + // onMultiDateSuccess: (int selectedIndex) async { + // isEventAddedOrRemoved = await calender.createOrUpdateEvent( + // title: + // "Appointment Reminder with ${widget.patientAppointmentHistoryResponseModel.doctorNameObj} on ${DateUtil.convertStringToDate(widget.patientAppointmentHistoryResponseModel.appointmentDate)}, Appointment #${widget.patientAppointmentHistoryResponseModel.appointmentNo}", + // description: + // "Appointment Reminder with ${widget.patientAppointmentHistoryResponseModel.doctorNameObj} in ${widget.patientAppointmentHistoryResponseModel.projectName}", + // scheduleDateTime: DateUtil.convertStringToDate(widget + // .patientAppointmentHistoryResponseModel.appointmentDate), + // eventId: "${widget.patientAppointmentHistoryResponseModel.appointmentNo}", + // location: '', + // reminderMinutes: selectedIndex + // ); + // setState(() { + // myAppointmentsViewModel.setAppointmentReminder(isEventAddedOrRemoved, widget.patientAppointmentHistoryResponseModel); + // }); + // }, + // ); + // }else { + // isEventAddedOrRemoved = await calender.checkAndRemove( id:"${widget.patientAppointmentHistoryResponseModel.appointmentNo}", ); + // setState(() { + // myAppointmentsViewModel.setAppointmentReminder(!isEventAddedOrRemoved, widget.patientAppointmentHistoryResponseModel); + // }); + // } + // + // + // }, + // ), + ], + ).paddingSymmetrical(16.w, 0) ], ), ), @@ -585,148 +723,148 @@ class _AppointmentDetailsPageState extends State { ); }), SizedBox(height: 16.h), - Container( - decoration: RoundedRectangleBorder().toSmoothCornerDecoration( - color: AppColors.whiteColor, - borderRadius: 20.r, - hasShadow: false, - ), - child: Row( - mainAxisSize: MainAxisSize.max, - children: [ - Utils.buildSvgWithAssets(icon: AppAssets.prescription_reminder_icon, width: 35.h, height: 35.h, applyThemeColor: false), - SizedBox(width: 8.h), - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - LocaleKeys.setReminder.tr(context: context).toText13(isBold: true), - LocaleKeys.notifyMeBeforeAppointment.tr(context: context).toText11(color: AppColors.textColorLight, isBold: true), - ], - ), - const Spacer(), - BellAnimatedSwitch( - key: _bellSwitchKey, - initialValue: widget.patientAppointmentHistoryResponseModel.hasReminder ?? false, - activeColor: AppColors.successColor.withOpacity(0.2), - inactiveColor: AppColors.lightGrayBGColor, - activeCircleColor: AppColors.successColor, - inactiveCircleColor: AppColors.greyTextColor, - activeIconColor: AppColors.bgGreenColor, - inactiveIconColor: AppColors.greyTextColor, - activeIcon: Utils.buildSvgWithAssets(icon: AppAssets.bell, iconColor: AppColors.whiteColor, width: 15.w, height: 15.h), - inactiveIcon: Utils.buildSvgWithAssets(icon: AppAssets.bell, iconColor: AppColors.whiteColor, width: 15.w, height: 15.h), - onChanged: (newValue) async { - CalenderUtilsNew calender = CalenderUtilsNew.instance; - bool isEventAddedOrRemoved = false; - if (newValue == true) { - DateTime startDate = DateTime.now(); - DateTime endDate = DateUtil.convertStringToDate(widget.patientAppointmentHistoryResponseModel.appointmentDate); - - // Show reminder bottom sheet and check if permission was granted - bool permissionGranted = await BottomSheetUtils().showReminderBottomSheet( - context, - endDate, - widget.patientAppointmentHistoryResponseModel.doctorNameObj ?? "", - "${widget.patientAppointmentHistoryResponseModel.appointmentNo}" ?? "", - "", - "", - title: "Appointment with ${widget.patientAppointmentHistoryResponseModel.doctorNameObj}", - description: - "${widget.patientAppointmentHistoryResponseModel.doctorNameObj} will be having an appointment on ${widget.patientAppointmentHistoryResponseModel.appointmentDate}", - onSuccess: () { - setState(() { - myAppointmentsViewModel.setAppointmentReminder(newValue, widget.patientAppointmentHistoryResponseModel); - }); - }, - isMultiAllowed: true, - onMultiDateSuccess: (int selectedIndex) async { - isEventAddedOrRemoved = await calender.createOrUpdateEvent( - title: - "Appointment Reminder with ${widget.patientAppointmentHistoryResponseModel.doctorNameObj} on ${DateUtil.convertStringToDate(widget.patientAppointmentHistoryResponseModel.appointmentDate)}, Appointment #${widget.patientAppointmentHistoryResponseModel.appointmentNo}", - description: - "Appointment Reminder with ${widget.patientAppointmentHistoryResponseModel.doctorNameObj} in ${widget.patientAppointmentHistoryResponseModel.projectName}", - scheduleDateTime: DateUtil.convertStringToDate(widget.patientAppointmentHistoryResponseModel.appointmentDate), - eventId: "${widget.patientAppointmentHistoryResponseModel.appointmentNo}", - location: '', - reminderMinutes: selectedIndex); - setState(() { - myAppointmentsViewModel.setAppointmentReminder(isEventAddedOrRemoved, widget.patientAppointmentHistoryResponseModel); - }); - }, - ); - - // If permission was not granted, revert the switch back to OFF - if (!permissionGranted) { - _bellSwitchKey.currentState?.setSwitchValue(false); - } - } else { - isEventAddedOrRemoved = await calender.checkAndRemove( - id: "${widget.patientAppointmentHistoryResponseModel.appointmentNo}", - ); - setState(() { - myAppointmentsViewModel.setAppointmentReminder(!isEventAddedOrRemoved, widget.patientAppointmentHistoryResponseModel); - }); - } - }, - ) - - // Switch( - // activeThumbColor: AppColors.successColor, - // // activeTrackColor: AppColors.successColor.withValues(alpha: .15), - // value: widget.patientAppointmentHistoryResponseModel.hasReminder!, - // onChanged: (newValue) async { - // CalenderUtilsNew calender = CalenderUtilsNew.instance; - // bool isEventAddedOrRemoved = false; - // if(newValue == true){ - // DateTime startDate = DateTime.now(); - // DateTime endDate = DateUtil.convertStringToDate(widget - // .patientAppointmentHistoryResponseModel.appointmentDate); - // BottomSheetUtils().showReminderBottomSheet( - // context, - // endDate, - // widget.patientAppointmentHistoryResponseModel.doctorNameObj??"", - // "${widget.patientAppointmentHistoryResponseModel.appointmentNo}"??"", - // "", - // "", - // title: "Appointment with ${widget.patientAppointmentHistoryResponseModel.doctorNameObj}", - // description: - // "${widget.patientAppointmentHistoryResponseModel.doctorNameObj} will be having an appointment on ${widget.patientAppointmentHistoryResponseModel.appointmentDate}", - // onSuccess: () { - // setState(() { - // myAppointmentsViewModel.setAppointmentReminder(newValue, widget.patientAppointmentHistoryResponseModel); - // }); - // }, - // isMultiAllowed: true, - // onMultiDateSuccess: (int selectedIndex) async { - // isEventAddedOrRemoved = await calender.createOrUpdateEvent( - // title: - // "Appointment Reminder with ${widget.patientAppointmentHistoryResponseModel.doctorNameObj} on ${DateUtil.convertStringToDate(widget.patientAppointmentHistoryResponseModel.appointmentDate)}, Appointment #${widget.patientAppointmentHistoryResponseModel.appointmentNo}", - // description: - // "Appointment Reminder with ${widget.patientAppointmentHistoryResponseModel.doctorNameObj} in ${widget.patientAppointmentHistoryResponseModel.projectName}", - // scheduleDateTime: DateUtil.convertStringToDate(widget - // .patientAppointmentHistoryResponseModel.appointmentDate), - // eventId: "${widget.patientAppointmentHistoryResponseModel.appointmentNo}", - // location: '', - // reminderMinutes: selectedIndex - // ); - // setState(() { - // myAppointmentsViewModel.setAppointmentReminder(isEventAddedOrRemoved, widget.patientAppointmentHistoryResponseModel); - // }); - // }, - // ); - // }else { - // isEventAddedOrRemoved = await calender.checkAndRemove( id:"${widget.patientAppointmentHistoryResponseModel.appointmentNo}", ); - // setState(() { - // myAppointmentsViewModel.setAppointmentReminder(!isEventAddedOrRemoved, widget.patientAppointmentHistoryResponseModel); - // }); - // } - // - // - // }, - // ), - ], - ).paddingSymmetrical(16.h, 16.h), - ), + // Container( + // decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + // color: AppColors.whiteColor, + // borderRadius: 20.r, + // hasShadow: false, + // ), + // child: Row( + // mainAxisSize: MainAxisSize.max, + // children: [ + // Utils.buildSvgWithAssets(icon: AppAssets.prescription_reminder_icon, width: 35.h, height: 35.h, applyThemeColor: false), + // SizedBox(width: 8.h), + // Column( + // crossAxisAlignment: CrossAxisAlignment.start, + // children: [ + // LocaleKeys.setReminder.tr(context: context).toText13(isBold: true), + // LocaleKeys.notifyMeBeforeAppointment.tr(context: context).toText11(color: AppColors.textColorLight, isBold: true), + // ], + // ), + // const Spacer(), + // BellAnimatedSwitch( + // key: _bellSwitchKey, + // initialValue: widget.patientAppointmentHistoryResponseModel.hasReminder ?? false, + // activeColor: AppColors.successColor.withOpacity(0.2), + // inactiveColor: AppColors.lightGrayBGColor, + // activeCircleColor: AppColors.successColor, + // inactiveCircleColor: AppColors.greyTextColor, + // activeIconColor: AppColors.bgGreenColor, + // inactiveIconColor: AppColors.greyTextColor, + // activeIcon: Utils.buildSvgWithAssets(icon: AppAssets.bell, iconColor: AppColors.whiteColor, width: 15.w, height: 15.h), + // inactiveIcon: Utils.buildSvgWithAssets(icon: AppAssets.bell, iconColor: AppColors.whiteColor, width: 15.w, height: 15.h), + // onChanged: (newValue) async { + // CalenderUtilsNew calender = CalenderUtilsNew.instance; + // bool isEventAddedOrRemoved = false; + // if (newValue == true) { + // DateTime startDate = DateTime.now(); + // DateTime endDate = DateUtil.convertStringToDate(widget.patientAppointmentHistoryResponseModel.appointmentDate); + // + // // Show reminder bottom sheet and check if permission was granted + // bool permissionGranted = await BottomSheetUtils().showReminderBottomSheet( + // context, + // endDate, + // widget.patientAppointmentHistoryResponseModel.doctorNameObj ?? "", + // "${widget.patientAppointmentHistoryResponseModel.appointmentNo}" ?? "", + // "", + // "", + // title: "Appointment with ${widget.patientAppointmentHistoryResponseModel.doctorNameObj}", + // description: + // "${widget.patientAppointmentHistoryResponseModel.doctorNameObj} will be having an appointment on ${widget.patientAppointmentHistoryResponseModel.appointmentDate}", + // onSuccess: () { + // setState(() { + // myAppointmentsViewModel.setAppointmentReminder(newValue, widget.patientAppointmentHistoryResponseModel); + // }); + // }, + // isMultiAllowed: true, + // onMultiDateSuccess: (int selectedIndex) async { + // isEventAddedOrRemoved = await calender.createOrUpdateEvent( + // title: + // "Appointment Reminder with ${widget.patientAppointmentHistoryResponseModel.doctorNameObj} on ${DateUtil.convertStringToDate(widget.patientAppointmentHistoryResponseModel.appointmentDate)}, Appointment #${widget.patientAppointmentHistoryResponseModel.appointmentNo}", + // description: + // "Appointment Reminder with ${widget.patientAppointmentHistoryResponseModel.doctorNameObj} in ${widget.patientAppointmentHistoryResponseModel.projectName}", + // scheduleDateTime: DateUtil.convertStringToDate(widget.patientAppointmentHistoryResponseModel.appointmentDate), + // eventId: "${widget.patientAppointmentHistoryResponseModel.appointmentNo}", + // location: '', + // reminderMinutes: selectedIndex); + // setState(() { + // myAppointmentsViewModel.setAppointmentReminder(isEventAddedOrRemoved, widget.patientAppointmentHistoryResponseModel); + // }); + // }, + // ); + // + // // If permission was not granted, revert the switch back to OFF + // if (!permissionGranted) { + // _bellSwitchKey.currentState?.setSwitchValue(false); + // } + // } else { + // isEventAddedOrRemoved = await calender.checkAndRemove( + // id: "${widget.patientAppointmentHistoryResponseModel.appointmentNo}", + // ); + // setState(() { + // myAppointmentsViewModel.setAppointmentReminder(!isEventAddedOrRemoved, widget.patientAppointmentHistoryResponseModel); + // }); + // } + // }, + // ) + // + // // Switch( + // // activeThumbColor: AppColors.successColor, + // // // activeTrackColor: AppColors.successColor.withValues(alpha: .15), + // // value: widget.patientAppointmentHistoryResponseModel.hasReminder!, + // // onChanged: (newValue) async { + // // CalenderUtilsNew calender = CalenderUtilsNew.instance; + // // bool isEventAddedOrRemoved = false; + // // if(newValue == true){ + // // DateTime startDate = DateTime.now(); + // // DateTime endDate = DateUtil.convertStringToDate(widget + // // .patientAppointmentHistoryResponseModel.appointmentDate); + // // BottomSheetUtils().showReminderBottomSheet( + // // context, + // // endDate, + // // widget.patientAppointmentHistoryResponseModel.doctorNameObj??"", + // // "${widget.patientAppointmentHistoryResponseModel.appointmentNo}"??"", + // // "", + // // "", + // // title: "Appointment with ${widget.patientAppointmentHistoryResponseModel.doctorNameObj}", + // // description: + // // "${widget.patientAppointmentHistoryResponseModel.doctorNameObj} will be having an appointment on ${widget.patientAppointmentHistoryResponseModel.appointmentDate}", + // // onSuccess: () { + // // setState(() { + // // myAppointmentsViewModel.setAppointmentReminder(newValue, widget.patientAppointmentHistoryResponseModel); + // // }); + // // }, + // // isMultiAllowed: true, + // // onMultiDateSuccess: (int selectedIndex) async { + // // isEventAddedOrRemoved = await calender.createOrUpdateEvent( + // // title: + // // "Appointment Reminder with ${widget.patientAppointmentHistoryResponseModel.doctorNameObj} on ${DateUtil.convertStringToDate(widget.patientAppointmentHistoryResponseModel.appointmentDate)}, Appointment #${widget.patientAppointmentHistoryResponseModel.appointmentNo}", + // // description: + // // "Appointment Reminder with ${widget.patientAppointmentHistoryResponseModel.doctorNameObj} in ${widget.patientAppointmentHistoryResponseModel.projectName}", + // // scheduleDateTime: DateUtil.convertStringToDate(widget + // // .patientAppointmentHistoryResponseModel.appointmentDate), + // // eventId: "${widget.patientAppointmentHistoryResponseModel.appointmentNo}", + // // location: '', + // // reminderMinutes: selectedIndex + // // ); + // // setState(() { + // // myAppointmentsViewModel.setAppointmentReminder(isEventAddedOrRemoved, widget.patientAppointmentHistoryResponseModel); + // // }); + // // }, + // // ); + // // }else { + // // isEventAddedOrRemoved = await calender.checkAndRemove( id:"${widget.patientAppointmentHistoryResponseModel.appointmentNo}", ); + // // setState(() { + // // myAppointmentsViewModel.setAppointmentReminder(!isEventAddedOrRemoved, widget.patientAppointmentHistoryResponseModel); + // // }); + // // } + // // + // // + // // }, + // // ), + // ], + // ).paddingSymmetrical(16.h, 16.h), + // ), SizedBox(height: 16.h), ], ) diff --git a/lib/presentation/book_appointment/widgets/bell_switch.dart b/lib/presentation/book_appointment/widgets/bell_switch.dart index ea3746a0..c002e59a 100644 --- a/lib/presentation/book_appointment/widgets/bell_switch.dart +++ b/lib/presentation/book_appointment/widgets/bell_switch.dart @@ -27,8 +27,8 @@ class BellAnimatedSwitch extends StatefulWidget { this.inactiveCircleColor, this.activeIcon, this.inactiveIcon, - this.width = 70, - this.height = 40, + this.width = 48, + this.height = 30, this.animationDuration = const Duration(milliseconds: 300), }); From 50a597b4d308eeec14f999e05bab23e39488030a Mon Sep 17 00:00:00 2001 From: tahaalam Date: Tue, 14 Apr 2026 18:48:57 +0300 Subject: [PATCH 30/45] lang changes --- assets/langs/ar-SA.json | 75 +- assets/langs/en-US.json | 61 +- lib/generated/codegen_loader.g.dart | 3483 ----------------- lib/generated/locale_kesy.g.dart | 1737 -------- lib/generated/locale_keys.g.dart | 1 + .../book_appointment/select_clinic_page.dart | 2 + .../widgets/bmr.dart | 2 +- .../widgets/calories.dart | 2 +- .../home/data/landing_page_data.dart | 4 +- .../prescriptions_list_page.dart | 2 +- 10 files changed, 79 insertions(+), 5290 deletions(-) delete mode 100644 lib/generated/codegen_loader.g.dart delete mode 100644 lib/generated/locale_kesy.g.dart diff --git a/assets/langs/ar-SA.json b/assets/langs/ar-SA.json index 7b6c06d4..0975dc01 100644 --- a/assets/langs/ar-SA.json +++ b/assets/langs/ar-SA.json @@ -6,14 +6,14 @@ "noRatingAvailable": "لا يوجد تقييم متاح", "doctorDoesNotHaveRating": "لم يحصل هذا الطبيب على أي تقييمات بعد.", "confirm": "تأكيد", - "loadingText": "جاري التحميل، يرجى الانتظار...", + "loadingText": "جارٍ التحقق...", "kilometerUnit": "كم", "dashboardScreenToolbarTitle": "الرئيسية", "settings": "الإعدادات", "language": "لغة التطبيق", "lanEnglish": "الإنجليزية", "lanArabic": "العربية", - "cancel": "إلغاء", + "cancel": "لا", "done": "تم", "replay2": "إعادة التشغيل", "home": "الرئيسية", @@ -40,7 +40,7 @@ "noResultFound": "لم يتم العثور على نتائج", "noSearchResultFound": "لم يتم العثور على نتائج", "pleaseEnterProductName": "يرجى إدخال اسم المنتج", - "bookNow": "احجز الآن", + "bookNow": "حجز موعد", "docInfo": "معلومات الطبيب", "appoInfo": "معلومات الموعد", "availableAppo": "المواعيد المتاحة", @@ -68,7 +68,7 @@ "appoActions": "إجراءات الموعد", "date": "التاريخ", "time": "الوقت", - "pendingPayment": "معلق للدفع", + "pendingPayment": "إتمام الدفع", "payNow": "الدفع", "viewQR": "عرض رمز الاستجابة السريعة", "instruction": "تعليمات", @@ -82,7 +82,7 @@ "upcomingConfirm": "يرجى تأكيد الموعد لتجنب الإلغاء", "bookSuccessConfirmMore2412": "ستكون عملية الدفع عبر الإنترنت متاحة قبل 24 ساعة ��ن الموعد.", "upcomingPaymentPending": "سيتم تفعيل الدفع عبر الإنترنت قبل 24 ساعة من وقت الموعد", - "upcomingPaymentNow": "ادفع عبر الإنترنت الآن لتجنب الانتظار الطويل", + "upcomingPaymentNow": "الدفع الإلكتروني لتجنب الانتظار", "timeUntilAppointment": "الوقت المتبقي حتى الموعد", "appointmentTimePassed": "انتهى وقت الموعد", "upcomingQR": "استخدم رمز الاستجابة السريعة لتسجيل الوصول في المستشفى", @@ -93,7 +93,7 @@ "raise": "رفع", "complaint": "شكوى", "add": "إضافة", - "reminder": "تذكير", + "reminder": "حفظ", "location": "المواقع", "online": "عبر الإنترنت", "payment": "الدفع", @@ -401,7 +401,7 @@ "confirmThePayment": "تأكيد الدفع", "depositorName": "اسم مُقدِّم الإيداع", "mobileNumber": "رقم الجوال", - "phoneNumber": "رقم الهاتف", + "phoneNumber": "رقم الجوال", "country": "البلد", "ok": "حسنا", "averageWaitingTime": "متوسط وقت الانتظار:", @@ -711,12 +711,12 @@ "bikini": "بيكيني", "totalMinutes": "إجمالي الدقائق", "feedback": "رأيك يهمنا", - "likeToHear": "نود سماع ملاحظاتك، ومخاوفك بشأن خدمات الرعاية الصحية وتجربة الخدمات الإلكترونية. يرجى استخدام النموذج أدناه", + "likeToHear": "يسعدنا سماع رأيك. شاركنا تجربتك أو أي ملاحظات حول خدماتنا الطبية أو الالكترونية عبر النموذج أدناه", "emptySubject": "يرجى إدخال الموضوع", "emptyMessage": "يرجى إدخال الرسالة", - "selectAttachment": "اختر المرفق", - "complainAppo": "شكوى بخصوص الموعد", - "complainAppoAlt": "شكوى بدون موعد", + "selectAttachment": "اختر الملف", + "complainAppo": "شكوى مع وجود موعد", + "complainAppoAlt": "شكوى بدون وجود موعد", "messageType": "نوع الرسالة", "feedbackType": "نوع الرسالة", "compliment": "تقدير", @@ -769,14 +769,14 @@ "infoTodo": "تم تصميم هذه الخدمة لتمكينك من الحصول على رابط سريع لقائمة المهام التي تحتاج القيام بها", "familyInfo": "من خلال هذه الخدمة، ستتمكن من ربط ملفات عائلتك الطبية بملفك الطبي حتى تتمكن من إدارة سجلاتهم عن طريق تسجيل الدخول إلى ملفك الطبي.", "rrtdDetails": "تقدم فريق الاستجابة السريعة خدمة طبية شاملة لجميع أنواع الحالات العاجلة والمستقرة من جميع الأعمار، بما في ذلك البالغين والمرضى الأطفال، وتغطي الخدمة فريق طبي مدرب تدريبًا عاليًا ومجهز تجهيزًا كاملاً قادرًا على تقديم أفضل رعاية طبية في منزل المريض.", - "homeHealthCareText": "تقدم هذه الخدمة مجموعة من خدمات الرعاية الصحية المنزلية.", + "homeHealthCareText": "أعلى معاييرالرعاية و الخدمات الطبية في راحة منزلك", "onlineCheckInAgreement": "تسجيل الوصول عبر الإنترنت مخصص للحالات التي لا تهدد الحياة. اتصل بالهلال الأحمر (997) أو اذهب إلى أقرب قسم طوارئ إذا كان هناك: \n\nعلامات السكتة الدماغية أو النوبة القلبية \nhالة من النوبات أو الإغماء \nهناك إصابة تهدد الطرف أو الحياة \nصورة لإصابات خطيرة", "infoEreferral": "تتيح لك هذه الخدمة تقديم طلب إحالة من أي مقدم رعاية صحية سواء داخل أو خارج المملكة العربية السعودية إلى أي من مستشفيات HMG، عن طريق ملء بعض بيانات المريض وإرفاق التقارير الطبية، علاوة على ذلك يمكنك تتبع حالة الطلب (قيد المعالجة، مقبول أو مرفوض)", "erConsultation": "تتيح لك هذه الخدمة إجراء استشارة افتراضية عبر الإنترنت عبر مكالمة فيديو مباشرة مع الطبيب من أي مكان وفي أي وقت.", "myInvoice": "القائمة", "invoiceList": "فواتيري", "invoiceList2": "فواتيري", - "allInvoices": "كل الفواتير", + "allInvoices": "الكل", "hospitals": "المستشفيات", "clinics": "العيادات", "doctors": "الأطباء", @@ -809,20 +809,20 @@ "checkAvailability": "التحقق من التوفر", "readInstructions": "قراءة التعليمات", "searchLabReport": "ابحث عن تقرير المختبر", - "prescriptionDeliveryError": "هذه العيادة لا تدعم إعادة التعبئة والتسليم.", + "prescriptionDeliveryError": "هذه العيادة لا تدعم إعادة صرف الدواء", "receiveOtpToast": "أين تود تلقي رمز التحقق OTP؟", - "enterPhoneNumber": "أدخل رقم الهاتف", + "enterPhoneNumber": "إدخال رقم الجوال", "enterEmailDesc": "أدخل عنوان بريدك الإلكتروني لإكمال عملية إنشاء ملف طبي", - "enterPhoneDesc": "أدخل رقم هاتفك لتلقي رمز التحقق ", + "enterPhoneDesc": "أدخل رقم جوالك لاستلام رمز التحقق ", "pleaseChooseOption": "الرجاء اختيار من الخيارات أدناه لتلقي رمز التحقق OTP", "prepareToElevate": "رعايتك الصحية تبدأ من هنا", - "iAcceptTermsConditions": "أوافق على الشروط والأحكام", + "iAcceptTermsConditions": "الموافقة على الشروط والأحكام", "alreadyHaveAccount": "لديك حساب؟", "loginNow": "تسجيل الدخول", - "notice": "إشعار", + "notice": "تنبيه", "oR": "أو", "sendOTPWHATSAPP": "واتساب", - "sendOTPSMS": "االرسائل النصية", + "sendOTPSMS": "رسالة نصية", "fullName": "الاسم الكامل", "married": "متزوج", "uae": "الإمارات العربية المتحدة", @@ -852,13 +852,13 @@ "selectHospitalSubTitle": "يرجى اختيار المستشفى للموعد", "iAcceptThe": "أوافق على", "personalDetailsVerification": "التحقق من التفاصيل الشخصية", - "otpVerification": "التحقق من OTP", + "otpVerification": "إدخال رمز التحقق", "weHaveSendOTP": "لقد أرسلنا OTP إلى", "via": "عبر", "forRegistrationVerification": "للتحقق من التسجيل", - "didntReceiveIt": "لم تستلمه؟", + "didntReceiveIt": "لم يصلك الرمز؟", "resendOTP": "إعادة إرسال", - "resendIn": "إعادة الإرسال في", + "resendIn": "إعادة الإرسال خلال", "pleaseEnterAnationalID": "تسجيل الدخول برقم الهوية او الاقامة", "pleaseEnterAFileNumber": "يرجى إدخال / رقم الملف", "pleaseEnterAValidEmail": "يرجى إدخال بريد إلكتروني صالح", @@ -899,7 +899,7 @@ "to": "إلى", "startDate": "تاريخ البدء", "endDate": "تاريخ الانتهاء", - "walkin": "بدون موعد", + "walkin": "موعد", "laserClinic": "عيادة الليزر", "continueString": "يكمل", "covid_info": "تجري مستشفيات د. سليمان الحبيب فحص فيروس كورونا المستجد وتصدر شهادات السفر على مدار الساعة، طوال أيام الأسبوع، وبسرعة ودقة عالية. يمكن للراغبين في الاستفادة من هذه الخدمة زيارة أحد فروع مستشفيات د. سليمان الحبيب وإجراء فحص كورونا خلال بضع دقائق والحصول على النتائج خلال عدة ساعات خدمة فحص فيروس كورونا Covid 19 بتقنية PCR للكشف عن الفيروس وفقاً لأعلى المعايير العالمية وبأحدث أجهزة RT-PCR عالية الدقة (GeneXpert الأمريكي وغيره)، وهي طرق معتمدة من قبل هيئة الغذاء والدواء وكذلك من قبل المركز السعودي للوقاية من الأمراض المُعدية", @@ -928,7 +928,7 @@ "appointmentCheckIn": "تسجيل حضور الموعد", "insuranceExpiredOrInactive": "التأمين غير ساري (منتهي او غير مفعل)", "totalAmountToPay": "المبلغ الإجمالي المستحق", - "vat15": "ضريبة القيمة المضافة 15%", + "vat15": "ضريبة القيمة المضافة (15%)", "general": "عام", "liveCare": "لايف كير", "recentVisits": "قائمة الزيارات", @@ -1110,8 +1110,8 @@ "pick": "استلام", "insideTheHome": "داخل المنزل", "haveAnyAppointment": "هل لديك أي موعد", - "amountPaidAtHospital": "سيتم دفع المبلغ في المستشفى", - "submitRequest": "إرسال الطلب", + "amountPaidAtHospital": "الدفع عند الوصول للمستشفى", + "submitRequest": "تأكيد الطلب", "enterPickupLocationManually": "أدخل موقع الاستلام يدوياً", "enterPickupLocation": "أدخل موقع الاستلام", "trackingDetails": "تفاصيل التتبع", @@ -1145,7 +1145,7 @@ "viewLocationGoogleMaps": "عرض الموقع على خرائط جوجل", "callAmbulance": "استدعاء سيارة إسعاف", "requestAmbulanceInEmergency": "طلب سيارة إسعاف في حالة الطوارئ من المنزل أو المستشفى", - "confirmation": "تأكيد", + "confirmation": "استمرار", "areYouSureYouWantToCallAmbulance": "هل أنت متأكد أنك تريد استدعاء سيارة إسعاف؟", "getDetailsOfNearestBranch": "احصل على تفاصيل أقرب فرع بما في ذلك الاتجاهات", "areYouSureYouWantToCallRRT": "هل أنت متأكد أنك تريد استدعاء فريق الاستجابة السريعة (RRT)؟", @@ -1271,10 +1271,10 @@ "invalidWeight": "الوزن غير صالح", "timeToDrinkWater": "حان وقت شرب الماء! 💧", "stayHydratedDrinkWater": "ابق رطبًا! اشرب {amount} مل من الماء.", - "visitPharmacyOnline": "زيارة الصيدلية", + "visitPharmacyOnline": "الصيدلية الالكترونية", "howAreYouFeelingToday": "كيف حالك اليوم؟", - "checkYourSymptomsWithScale": "تحقق من حالتك الصحية", - "checkYourSymptoms": "تحقق من أعراضك", + "checkYourSymptomsWithScale": "قيّم حالتك الصحية واحصل على التوجيه الطبي المناسب", + "checkYourSymptoms": "مدقق الأعراض", "noUpcomingAppointmentPleaseBook": "ليس لديك أي مواعيد قادمة. يرجى حجز موعد", "youHaveEROnlineCheckInRequest": "لديك طلب تسجيل وصول عبر الإنترنت للطوارئ", "quickLinks": "روابط سريعة", @@ -1372,7 +1372,7 @@ "downloadPrescription": "تحميل الوصفة الطبية", "fetchingPrescriptionDetails": "جاري جلب تفاصيل الوصفة الطبية...", "switchBackFamilyFile": "العودة إلى ملف العائلة", - "profileAndSettings": "الملف الشخصي والإعدادات", + "profileAndSettings": "الإعدادات", "quickActions": "إجراءات سريعة", "notificationsSettings": "إعدادات الإشعارات", "touchIDFaceIDServices": "خدمات Touch ID / Face ID", @@ -1473,7 +1473,7 @@ "beforeSyncingDataFollowInstructions": "قبل مزامنة البيانات، يرجى التأكد من اتباع التعليمات بشكل صحيح.", "viewWatchInstructions": "عرض تعليمات الساعة", "healthConnectAppNotInstalled": "يبدو أنه ليس لديك تطبيق Health Connect مثبتًا. يرجى تثبيته من متجر Play لمزامنة بيانات صحتك.", - "setTimerOfReminder": "ضبط التذكير", + "setTimerOfReminder": "تنبيهي قبل الموعد", "youHaveAppointmentWithDr": "لديك موعد مع د. ", "hours": "ساعات", "minutes": "دقائق", @@ -1556,7 +1556,7 @@ "calculators": "الحاسبات", "converters": "محول الوحدات", "guide": "دليل", - "liveCareServiceDesc": "احصل على استشارة طبية من طبيب متخصص عبر مكالمة فيديو", + "liveCareServiceDesc": "احصل على استشارة طبية من طبيب مختص عبر مكالمة فيديو", "bloodGroup": "فصيلة الدم: {bloodType}", "medicalServices": "الخدمات الطبية", "insuranceAndPayments": "التأمين والمدفوعات", @@ -1643,7 +1643,7 @@ "featureComingSoonDescription": "هذه الميزة ستتوفر قريباً. نحن نعمل جاهدين لإضافة ميزات أكثر تميزاً إلى التطبيق. انتظرونا لمتابعة التحديثات.", "generateAiAnalysisResult": "قم بإجراء تحليل لهذا المختبر AI", "ratings": "التقييمات", - "hmgPharmacyText": "المتجر الالكتروني او تسوق من الصيدلية بسهوله", + "hmgPharmacyText": "وجهتك الالكترونية الشاملة للأدوية ومنتجات العناية بالصحة", "insuranceRequestSubmittedSuccessfully": "تم إرسال طلب تحديث بيانات التأمين بنجاح. سيتم إعلامك بمجرد الانتهاء.", "updatingEmailAddress": "جارٍ تحديث عنوان البريد الإلكتروني، يرجى الانتظار...", "verifyInsurance": "التحقق من التأمين", @@ -1707,7 +1707,7 @@ "doctorRatingAppointment": "طبيب\nتصنيف", "ratingSubmitted": "تم إرسال التقييم", "rateTheDoctor": "يرجى تقييم الطبيب", - "downloadInvoice": "تحميل الفاتورة", + "downloadInvoice": "تنزيل الفاتورة", "approvalDetails": "تفاصيل الموافقة", "obese": "سمين", "overWeight": "وزن زائد", @@ -1748,6 +1748,7 @@ "m": "متر", "inch": "انش", "updateEmailAddressTitle": "تحديث البريد الالكتروني: ", - "enterNewNewContactNumber": "الرجاء اضافة رقم اتصال في حالة الطواريء: ", - "nationalIdFileNumber": "رقم الهوية / الإقامة / الملف" + "enterNewNewContactNumber": "الرجاء اضافة رقم اتصال في حالة الطوارئ: ", + "nationalIdFileNumber": "رقم الهوية / الإقامة / الملف", + "finda": "البحث عن" } diff --git a/assets/langs/en-US.json b/assets/langs/en-US.json index dee355f6..c75f2ae8 100644 --- a/assets/langs/en-US.json +++ b/assets/langs/en-US.json @@ -40,7 +40,7 @@ "noResultFound": "No Result Found", "noSearchResultFound": "No Result Found", "pleaseEnterProductName": "Please Enter Product Name", - "bookNow": "Book Now", + "bookNow": "New Appointment", "docInfo": "Doctor Information", "appoInfo": "Appointment Information", "availableAppo": "Available Appointments", @@ -443,7 +443,7 @@ "serviceInformation": "Service Information", "homeHealthCare": "Home Health Care", "noAppointmentAvailable": "No Available Appointments", - "homeHealthCareText": "This service provides a set of home health care services, continuous and comprehensive follow-up in their places of residence for those who cannot access health facilities, such as (laboratory analyzes - radiology - vaccinations - physical therapy), etc.", + "homeHealthCareText": "Clinical excellence and specialized care in the comfort of your own home", "loginRegister": "Login/Register", "orderLog": "Order Log", "infoLab": "This service allows you to view the results of all laboratory tests performed in Al Habib Medical Group as well as sending the report via e-mail.", @@ -701,11 +701,11 @@ "bikini": "Bikini", "totalMinutes": "Total Minutes", "feedback": "Feedback", - "likeToHear": "We would love to hear the feedback, concerns on healthcare services and eServices experience. Please use the below form", + "likeToHear": "We would love to hear your feedback. If you have any concerns about healthcare services or eServices experience, please let us in the form below.", "emptySubject": "Please enter the subject", "emptyMessage": "Please enter message", "selectAttachment": "Select Attachment", - "complainAppo": "Complaint for appointment", + "complainAppo": "Complaint with appointment", "complainAppoAlt": "Complaint without appointment", "messageType": "Message Type", "feedbackType": "Feedback Type", @@ -777,7 +777,7 @@ "livecarePoint2": "A Specialized doctor will contact you", "livecarePoint3": "A Doctor will be able to see your full medical file history", "livecarePoint4": "Free Medicine Delivery Available", - "livecarePoint5": "No need to visit the service is in your place", + "livecarePoint5": "Consult our specialists remotely and manage your health whenever and wherever you are.", "bookImmediateLivecare": "I accept to get the service immediately", "bookVideoLivecare2": "I don't need to visit the clinic", "noThankyou": "No Thanks", @@ -890,7 +890,7 @@ "clearAllFilters": "Clear all filters", "filters": "Filters", "searchClinic": "Search Clinic", - "walkin": "Walk In", + "walkin": "Booked", "continueString": "Continue", "laserClinic": "Laser Clinic", "covid_info" :"Dr. Sulaiman Al Habib hospitals are conducting a test for the emerging corona virus and issuing travel certificates 24/7 in a short time and with high accuracy. Those wishing to benefit from this service can visit one of Dr. Sulaiman Al Habib branches to conduct a corona test within few minutes, and obtain the result within several hours. Corona Virus Covid 19 testing service with PCR technology to detect the virus according to the highest international standards and with the latest high-precision RT-PCR devices (American GeneXpert and others), That is approved by the Food and Drug Authority as well as by the Saudi Center for Infectious Diseases Prevention.", @@ -934,12 +934,12 @@ "scheduledConsultation": "Scheduled Consultation", "pharmaLiveCare": "Pharma LiveCare", "notSureHelpMeChooseClinic": "Not sure? help me choose a clinic!", - "mentionYourSymptomsAndFindDoctors": "Mention your symptoms and find the list of doctors accordingly", + "mentionYourSymptomsAndFindDoctors": "Tell us your symptoms, and we’ll recommend the best-suited specialists for your care", "immediateService": "Immediate service", "noNeedToWaitGetMedicalConsultation": "No need to wait, you will get medical consultation immediately via video call", "noVisitRequired": "No visit required", - "doctorWillContact": "Doctor will contact", - "specialisedDoctorWillContactYou": "A specialised doctor will contact you and will be able to view your medical history", + "doctorWillContact": "Doctor will contact you", + "specialisedDoctorWillContactYou": "A specialized doctor will contact you and will be able to view your medical history", "freeMedicineDelivery": "Free medicine delivery", "offersFreeMedicineDelivery": "Offers free medicine delivery for the LiveCare appointment", "dentalChiefComplaints": "Dental Chief Complaints", @@ -1059,7 +1059,7 @@ "insuranceDocument": "Insurance Document", "selectBranch": "Select Branch", "patientInformation": "Patient information", - "patientLocation": "Where the patient located", + "patientLocation": "Select the location of the patient", "identificationNumber": "Identification Number", "enterIdentificationNumber": "Enter Identification Number*", "patientName": "Patient Name*", @@ -1098,9 +1098,9 @@ "pleaseSelectDetailsOfPickup": " Please select the details of pickup", "selectDetails": "Select Details", "work": "Work", - "pick": "Pick", - "insideTheHome": "Inside the home", - "haveAnyAppointment": "Have any appointment", + "pick": "Pick up", + "insideTheHome": "From your home/Selected location", + "haveAnyAppointment": "Select if you have any appointment?", "amountPaidAtHospital": "Amount will be paid at the hospital", "submitRequest": "Submit Request", "enterPickupLocationManually": "Enter Pickup Location Manually", @@ -1141,7 +1141,7 @@ "getDetailsOfNearestBranch": "Get the details of nearest branch including directions", "areYouSureYouWantToCallRRT": "Are you sure you want to call Rapid Response Team (RRT)?", "priorERCheckInToSkipLine": "Prior ER Check-In to skip the line & payment at the reception.", - "areYouSureYouWantToMakeERCheckIn": "Are you sure you want to make ER Check-In?", + "areYouSureYouWantToMakeERCheckIn": "Are you sure you want to request an online ER check-in?", "checkingYourERAppointmentStatus": "Checking your ER Appointment status...", "transportOptions": "Transport Options", "selectHospitalForAdvancePayment": "Please select the hospital you want to make an advance payment for.", @@ -1216,7 +1216,7 @@ "healthTrackers": "Health Trackers", "monitorBloodPressureLevels": "Monitor your blood pressure levels, track systolic and diastolic readings, and maintain a healthy heart.", "trackWeightProgress": "Track your weight progress, set goals, and maintain a healthy body mass for overall wellness.", - "bookAppointment": "Book\nAppointment", + "bookAppointment": "New\nAppointment", "completeCheckup": "Complete Checkup", "indoorNavigation": "Indoor Navigation", "eReferralServices": "E-Referral Services", @@ -1226,7 +1226,7 @@ "healthConvertersServices": "Health\nConverters", "smartWatchesServices": "Smart\nWatches", "exploreServices": "Explore Services", - "medicalAndCareServices": "Medical & Care Services", + "medicalAndCareServices": "Medical & Healthcare Services", "hmgServices": "HMG Services", "personalServices": "Personal Services", "habibWallet": "Habib Wallet", @@ -1262,8 +1262,8 @@ "stayHydratedDrinkWater": "Stay hydrated! Drink {amount}ml of water.", "visitPharmacyOnline": "Visit Pharmacy Online", "howAreYouFeelingToday": "How are you feeling today?", - "checkYourSymptomsWithScale": "Check your symptoms or check your health", - "checkYourSymptoms": "Check your symptoms", + "checkYourSymptomsWithScale": "Evaluate your symptoms and find the right care", + "checkYourSymptoms": "Symptom Checker", "noUpcomingAppointmentPleaseBook": "You do not have any upcoming appointment. Please book an appointment", "youHaveEROnlineCheckInRequest": "You have ER Online Check-In Request", "quickLinks": "Quick Links", @@ -1277,7 +1277,7 @@ "selectedServices": "Selected Services", "createNewRequest": "Create new request", "youHaveNoPendingRequests": "You have no pending requests.", - "noInsuranceDataFound": "No insurance data found...", + "noInsuranceinsurance2DataFound": "No insurance data found...", "noInsuranceUpdateRequest": "No insurance update requests found.", "policyNumberInsurancePage": "Policy: {number}", "insuranceExpired": "Insurance Expired", @@ -1361,7 +1361,7 @@ "downloadPrescription": "Download Prescription", "fetchingPrescriptionDetails": "Fetching prescription details...", "switchBackFamilyFile": "Switch Back To Family File", - "profileAndSettings": "Profile & Settings", + "profileAndSettings": "Settings", "quickActions": "Quick Actions", "notificationsSettings": "Notifications Settings", "touchIDFaceIDServices": "Touch ID / Face ID Services", @@ -1489,7 +1489,7 @@ "heightDescription": "Height is measured in centimeters and is used to calculate BMI and dosage recommendations.", "weightDescription": "Weight helps track overall health, nutrition, and changes over time.", "bloodPressureDescription": "Blood pressure reflects the force of blood against artery walls. It is shown as systolic/diastolic.", - "temperatureDescription": "Body temperature reflects how hot your body is and may change with infection or inflammation.", + "temperatureDescription": "Body temperature is a vital sign that indicates how warm the body is. It may increase in response to immune triggers like infection or inflammation", "heartRateDescriptionVital": "Heart rate refers to the number of heart beats per minute.", "respiratoryRateDescription": "Respiratory rate is the number of breaths taken per minute.", "bmiAdvice": "Maintain a balanced diet and regular activity. If your BMI is high or low, consider consulting your doctor.", @@ -1547,7 +1547,7 @@ "calculators": "Calculators", "converters": "Converters", "guide": "Guide", - "liveCareServiceDesc": "Get medical advice with a specialist doctor Via a video call", + "liveCareServiceDesc": "Get medical advice from a specialist doctor via video call", "bloodGroup": "Blood: {bloodType}", "medicalServices": "Medical Services", "insuranceAndPayments": "Insurance & Payments", @@ -1633,7 +1633,7 @@ "darkMode": "Dark Mode", "generateAiAnalysisResult": "Generate AI analysis for this result", "ratings": "Ratings", - "hmgPharmacyText": "Al Habib Pharmacy, the complete online Pharmaceutical store brought to you by Dr. Sulaiman Al Habib Medical Services Group.", + "hmgPharmacyText": "Online pharmacy for a complete health shopping experience", "insuranceRequestSubmittedSuccessfully": "Your insurance update request has been successfully submitted. You will be notified once completed.", "updatingEmailAddress": "Updating email address, Please wait...", "verifyInsurance": "Verify Insurance", @@ -1661,13 +1661,13 @@ "liveChatServiceDescription": "Need help ? Our live chat connects you with expert support for any questions about features, settings, or troubleshooting.", "emergencyServiceHeader": "ER Check-in, Faster Than Ever. Call ambulance / Rapid Response Team instantly", "emergencyServiceDescription": "In a medical emergency? Our ambulances and rapid response teams are on standby 24/7. Plus, quick ER check-in for faster care.", - "homeHealthCareServiceHeader": "Your Health, Elevated. Premium care, delivered to your doorstep.", - "homeHealthCareServiceDescription": "We bring quality healthcare to your doorstep. Experienced nurses providing compassionate care in the comfort of your home.", + "homeHealthCareServiceHeader": "Premium care, delivered right to your doorstep", + "homeHealthCareServiceDescription": "We provide the highest degree of patient care at home in a value-oriented, efficient, and professional manner.", "profileOnlyText": "Profile", "information": "Information", - "noFavouriteDoctors": "You don't have any favourite list yet", + "noFavouriteDoctors": "You don't have any favorite list yet", "addDoctors": "Add Doctors", - "favouriteList": "Favourite List", + "favouriteList": "Favorite List", "later": "Later", "cancelAppointmentConfirmMessage": "Are you sure you want to cancel this appointment?", "acknowledged": "Acknowledged", @@ -1738,5 +1738,10 @@ "inch": "in", "updateEmailAddressTitle": "Enter the new email address to be updated: ", "enterNewNewContactNumber": "Enter the new emergency contact number to be updated: ", - "nationalIdFileNumber": "National ID/File Number" + "nationalIdFileNumber": "National ID/File Number", + "finda": "Find a", + "calculateCaloriesBasedOnFactors": "Calculates daily calorie intake based on several factors including: height, weight, age, gender and daily physical activity.", + "insurance2": "Insurance" } + + diff --git a/lib/generated/codegen_loader.g.dart b/lib/generated/codegen_loader.g.dart deleted file mode 100644 index 486cb4da..00000000 --- a/lib/generated/codegen_loader.g.dart +++ /dev/null @@ -1,3483 +0,0 @@ -// DO NOT EDIT. This is code generated via package:easy_localization/generate.dart - -// ignore_for_file: prefer_single_quotes, avoid_renaming_method_parameters, constant_identifier_names - -import 'dart:ui'; - -import 'package:easy_localization/easy_localization.dart' show AssetLoader; - -class CodegenLoader extends AssetLoader{ - const CodegenLoader(); - - @override - Future?> load(String path, Locale locale) { - return Future.value(mapLocales[locale.toString()]); - } - - static const Map _ar_SA = { - "english": "الإنجليزية", - "arabic": "العربية", - "login": "تسجيل الدخول", - "noDataAvailable": "لا توجد بيانات متاحة", - "noRatingAvailable": "لا يوجد تقييم متاح", - "doctorDoesNotHaveRating": "لم يحصل هذا الطبيب على أي تقييمات بعد.", - "confirm": "تأكيد", - "loadingText": "جاري التحميل، يرجى الانتظار...", - "kilometerUnit": "كم", - "dashboardScreenToolbarTitle": "الرئيسية", - "settings": "الإعدادات", - "language": "لغة التطبيق", - "lanEnglish": "الإنجليزية", - "lanArabic": "العربية", - "cancel": "إلغاء", - "done": "تم", - "replay2": "إعادة التشغيل", - "home": "الرئيسية", - "services": "الخدمات", - "mySchedule": "جدولي", - "logout": "تسجيل الخروج", - "respirationRate": "معدل التنفس", - "bookAppo": "حجز موعد", - "searchBy": "البحث بواسطة:", - "clinic": "عيادة", - "byClinic": "حسب العيادة", - "hospital": "مستشفى", - "byHospital": "حسب المستشفى", - "name": "الاسم", - "doctor": "طبيب", - "clinicName": "اسم العيادة", - "hospitalName": "اسم المستشفى", - "noClinicFound": "لم يتم العثور على عيادة", - "doctorName": "اسم الطبيب", - "nearestAppo": "أقرب موعد", - "searchByDocText": "اكتب اسم الطبيب لمساعدتك في العثور عليه", - "enterDocName": "أدخل اسم الطبيب", - "search": "بحث", - "noResultFound": "لم يتم العثور على نتائج", - "noSearchResultFound": "لم يتم العثور على نتائج", - "pleaseEnterProductName": "يرجى إدخال اسم المنتج", - "bookNow": "احجز الآن", - "docInfo": "معلومات الطبيب", - "appoInfo": "معلومات الموعد", - "availableAppo": "المواعيد المتاحة", - "gender": "الجنس", - "nationality": "الجنسية", - "neverWait": "لا تنتظر في الطابور أبدًا", - "reminderTitle": "لديك موعد مع الدكتور.", - "appointmentCalendar": "هل ترغب في تعيين تذكير لهذا الموعد في التقويم الخاص بك؟", - "appointmentSuccess": "تم حجز الموعد بنجاح", - "docQualifications": "مؤهلات الطبيب", - "pressAgain": "اضغط مرة أخرى للخروج من التطبيق", - "laserMaxLimitReach": "الحد الأقصى هو 90 دقيقة", - "confirmAppoHeading": "يرجى مراجعة موعدك", - "patientInfo": "معلومات المريض", - "doctorFilter": "سيتم تصفية الأطباء بناءً على جنسك وعمرك", - "bookSuccess": "تم الحجز بنجاح", - "patientShare": "نسبة المريض", - "patientShareWithTax": "نسبة المريض مع الضريبة", - "confirmAppo": "تأكيد الموعد", - "confirmLiveCare": "تأكيد ال لايف كير", - "waitingForDoctor": "في انتظار الطبيب", - "appointment": "موعد", - "confirmLater": "تأكيد لاحقًا", - "todoList": "قائمة المهام", - "appoActions": "إجراءات الموعد", - "date": "التاريخ", - "time": "الوقت", - "pendingPayment": "معلق للدفع", - "payNow": "الدفع", - "viewQR": "عرض رمز الاستجابة السريعة", - "instruction": "تعليمات", - "livecare": "لايف كير", - "livecareAppo": "موعد لايف كير", - "agreeTo": "أوافق على", - "termsConditoins": "الشروط والأحكام", - "cancelAppoMsg": "هل أنت متأكد أنك تريد إلغاء هذا الموعد؟", - "changePayment": "تغيير طريقة الدفع", - "upcomingNoAction": "لا يتطلب أي إجراء", - "upcomingConfirm": "يرجى تأكيد الموعد لتجنب الإلغاء", - "bookSuccessConfirmMore2412": "ستكون عملية الدفع عبر الإنترنت متاحة قبل 24 ساعة ��ن الموعد.", - "upcomingPaymentPending": "سيتم تفعيل الدفع عبر الإنترنت قبل 24 ساعة من موعد الموعد", - "upcomingPaymentNow": "ادفع عبر الإنترنت الآن لتجنب الانتظار الطويل", - "timeUntilAppointment": "الوقت المتبقي حتى الموعد", - "appointmentTimePassed": "انتهى وقت الموعد", - "upcomingQR": "استخدم رمز الاستجابة السريعة لتسجيل الوصول في المستشفى", - "upcomingVirtual": "هذا موعد افتراضي، يرجى الالتزام بالتعليمات لتجربة سلسة.", - "upcomingLivecare": "هذا موعد لايف كير", - "upcomingDetails": "المزيد من التفاصيل", - "reschedule": "إعادة جدولة", - "raise": "رفع", - "complaint": "شكوى", - "add": "إضافة", - "reminder": "تذكير", - "location": "المواقع", - "online": "عبر الإنترنت", - "payment": "الدفع", - "onlinePayment": "عبر الإنترنت", - "onlinePaymentSubtitle": "الدفع", - "cancelNocaps": "إلغاء", - "setReminder": "ضبط تذكير", - "nationalIdNumber": "رقم الهوية الوطنية", - "medicalFileNumber": "رقم الملف الطبي", - "loginregister": "تسجيل الدخول / التسجيل", - "poweredBy": "مدعوم من", - "welcome": "مرحبًا", - "welcomeToDrSulaiman": "مرحباً بكم في مجموعة الدكتور سليمان الحبيب الطبية", - "patientApp": "تطبيق المريض", - "welcomeText": "تطبيق الدكتور سليمان الحبيب للهاتف المحمول", - "drSulaimanText": "الدكتور سليمان الحبيب", - "welcomeText2": "هل زرت مستشفيات أو مراكز الدكتور سليمان الحبيب من قبل؟", - "yes": "نعم", - "no": "لا", - "logintyperadio": "اختر من الخيارات أدناه لتسجيل الدخول إلى ملفك الطبي.", - "registernow": "سجل الآن", - "nationalID": "أدخل رقم الهوية", - "nationalId": "الهوية الوطنية", - "fileNo": "رقم الملف", - "fileno": "رقم الملف", - "forgotFileNo": "نسيت رقم الملف؟", - "forgotFileNoTitle": "نسيت الملف الطبي", - "enterNationalId": "يرجى إدخال رقم الهاتف المحمول ورقم الهوية", - "profileInfo": "يرجى إدخال معلومات الملف الشخصي", - "submit": "إرسال", - "forgotDesc": "أدخل رقم الهاتف المحمول لاستلام رقم الملف الطبي عبر الرسائل القصيرة", - "dob": "تاريخ الميلاد:", - "hijriDate": "الت��ريخ الهجري", - "gregorianDate": "التاريخ الميلادي", - "verifyLoginWith": "يرجى اختيار واحدة من الخيارات التالية للتحقق", - "registerUser": "تسجيل", - "verifyWithFingerprint": "البيومترية", - "verifyWithFaceid": "معرف الوجه", - "verifyWithSms": "رسالة قصيرة", - "verifyWithWhatsapp": "واتساب", - "verifyThrough": "التحقق من خلال", - "lastLogin": "آخر تسجيل دخول في:", - "lastLoginWith": "نوع التحقق:", - "verifyFingerprint": "لتفعيل خدمة تسجيل الدخول ببصمة الإصبع، يرجى التحقق من البيانات باستخدام واحدة من الخيارات التالية.", - "searchMedicine": "ابحث عن دواء", - "pharmaciesList": "قائمة الصيدليات", - "searchMedicineHere": "ابحث عن دواء هنا", - "description": "الوصف", - "howToUse": "كيفية الاستخدام", - "price": "السعر", - "youCanFindItIn": "يمكنك العثور عليه في", - "pleaseEnterMedicineName": "يرجى إدخال اسم الدواء", - "verificationMessage": "يرجى إدخال رمز التحقق المرسل إلى", - "validationMessage": "ينتهي رمز التحقق في", - "notification": "الإشعارات", - "appSettings": "إعدادات التطبيق", - "rateApp": "قيم تطبيقنا", - "before": "قبل", - "minute": "دقائق", - "hour": "ساعة", - "reminderSuccess": "تمت إضافة التذكير بنجاح", - "reminderCancelSuccess": "تم إلغاء التذكير بنجاح", - "patientShareToDo": "المبلغ قبل الضريبة: ", - "patientTaxToDo": "قيمة الضريبة: ", - "patientShareTotalToDo": "إجمالي المبلغ المستحق: ", - "paymentMethod": "طريقة الدفع", - "noNeedToWaitInLine": "لا حاجة للانتظار في الطابور.", - "useQRAppoAttend": "استخدم رمز الاستجابة السريعة لتسجيل حضور الموعد.", - "passQRAppoAttend": "مرر رمز الاستجابة السريعة عبر أجهزة الحضور المتاحة في المستشفى.", - "sitWaitingQR": "اجلس في غرف الانتظار حتى يتم استدعاؤك من قبل الممرضة.", - "attendRegisterCode": "رمز تسجيل الحضور", - "scanQRHospital": "توجّه إلى لوحة تسجيل الوصول الإلكتروني في المستشفى، وقم بالمسح عبر تقنية NFC أو رمز الاستجابة السريعة (QR) لإتمام تسجيل الوصول.", - "scanNFC": "امسح NFC لتسجيل الوصول", - "sendEmail": "إرسال بريد إلكتروني", - "success": "تم بنجاح", - "emailSentSuccessfully": "تم إرسال البريد الإلكتروني بنجاح", - "emailSentError": "خطأ في إرسال البريد الإلكتروني", - "close": "إغلاق", - "closeIt": "أغلق", - "booked": "تم الحجز", - "confirmed": "مؤكد", - "arrived": "تم الحضور", - "payNowBookSuccess": "ادفع الآن عبر تطبيق الحبيب", - "payNowBookSuccesstext1": "ادفع الآن باستخدام خدمة الدفع عبر الإنترنت من بوابات الدفع الآمنة", - "payNowBookSuccesstext2": "يمكنك أيضًا الدفع لاحقًا عبر الدفع الإلكتروني أو في المستشفى.", - "payLater": "ادفع لاحقًا", - "askDocNotAllowed": "هذه الخدمة ستكون متاحة فقط لزيارة الطبيب قبل 15 يومًا", - "moreVerify": "خيارات تحقق إضافية", - "welcomeBack": "مرحبًا بعودتك!", - "accountInfo": "هل ترغب في تسجيل الدخول باستخدام اسم المستخدم الحالي؟", - "anotherAcc": "استخدم حسابًا آخر", - "next": "التالي", - "firstName": "الاسم الأول", - "middleName": "اسم الأب", - "lastName": "اسم العائلة", - "female": "أنثى", - "male": "ذكر", - "preferredLanguage": "اللغة المفضلة", - "locationsRegister": "أين ترغب في إنشاء هذا الملف؟", - "ksa": "السعودية", - "dubai": "دبي", - "enterEmail": "يرجى إدخال البريد الإلكتروني", - "family": "عائلتي", - "familyTitle": "ملفات عائلتي", - "familyTitle2": "ملفات العائلة", - "myFamily": "عائلتي", - "addNewMember": "إضافة فرد جديد للعائلة", - "sentRequests": "الطلبات المرسلة", - "recievedRequests": "الطلبات المستلمة", - "manageFiles": "إدارة ملفات العائلة", - "oxygenation": "تشبع الأكسجين", - "bodyMeasurements": "مؤشر كتلة الجسم", - "temperature": "درجة الحرارة", - "pulse": "النبض", - "respiration": "التنفس", - "bloodPressure": "ضغط الدم", - "painScale": "مقياس الألم", - "weight": "الوزن", - "height": "الطول", - "heart": "معدل ضربات القلب", - "heightUnit": "وحدة الطول", - "weightUnit": "وحدة الوزن", - "unit": "الوحدة", - "request": "طلب", - "memberName": "اسم العضو", - "switchLogin": "عرض", - "removeMember": "إزالة", - "allowView": "السماح", - "rejectView": "رفض", - "deleteView": "حذف", - "approvals": "الموافقات", - "approvalNo": "رقم الموافقة:", - "companyName": "اسم الشركة:", - "receiptOn": "الإيصال على:", - "expiryDate": "تاريخ الانتهاء:", - "expiryPoints": "منتهي الصلاحية", - "expiryOn": "ينتهي في:", - "procedureName": "اسم الإجراء:", - "procedure": "الإجراء", - "procedureStatus": "حالة الإجراء: ", - "usageStatus": "حالة الاستخدام", - "unusedCount": "عدد غير المستخدم:", - "totalApproval": "إجمالي الموافقة غير المستخدمة", - "category": "الفئة: ", - "expirationDate": "تاريخ انتهاء الصلاحية: ", - "patientCard": "رقم بطاقة المريض: ", - "policyNumber": "رقم الوثيقة: ", - "seeDetails": "عرض التفاصيل", - "insuranceCards": "بطاقات التأمين", - "requestType": "نوع الطلب", - "registerInfoFamily": "كيف تود إضافة عضو جديد؟", - "removeFamilyMember": "هل تريد إزالة هذا العضو؟", - "myMedicalFile": "ملفي الطبي", - "myMedicalFileSubTitle": "جميع سجلاتك الطبية", - "viewMore": "عرض المزيد", - "homeHealthCareService": "خدمة الرعاية الصحية المنزلية", - "onlinePharmacy": "الصيدلية الإلكترونية", - "emergencyService": "خدمة الطوارئ", - "onlinePaymentService": "خدمة الدفع عبر الإنترنت", - "offersAndPackages": "طلب تحويل عبر الإنترنت", - "comprehensiveMedicalCheckup": "فحص طبي شامل", - "hmgService": "خدمة HMG", - "viewAllHabibMedicalService": "عرض جميع خدمات الحبيب الطبية", - "viewAll": "عرض الكل", - "view": "عرض", - "contactUs": "اتصل بنا", - "contactUsLocation": "ص.ب: 91877 - الرياض 11643، طريق الملك فهد - العليا - المملكة العربية السعودية", - "contactUsTime": "السبت - الأربعاء 8:00 صباحًا - 10 مساءً، الخميس 8:00 صباحًا- 8:00 مساءً، الجمعة 2:00 مساءً - 8:00 مساءً", - "viewAllWaysReachUs": "عرض جميع طرق التواصل معنا", - "medicalProfile": "الملف الطبي", - "consultation": "استشارة", - "logs": "السجلات", - "textToSpeech": "كيف يمكنني مساعدتك؟", - "locationDialogMessage": "السماح لتطبيق HMG بالوصول إلى موقعك سيساعدك في عرض المستشفيات الأقرب إليك.", - "userViewRequester": "يريد المستخدم عرض ملفك الطبي", - "userView": "يمكن للمستخدم عرض ملفك الطبي", - "parking": "موقف السيارات", - "alhabiServices": "خدمة HMG", - "parkingTitle": "خدمة السيارة، خدمة السيارة، خدمة لحفظ معلومات الموقف، العودة إليها لاحقًا، 1- من خلال النقر على (قراءة الرمز)، حفظ بيانات الموقف. 2- من خلال النقر على زر (عرض موقف سيارتي)، يظهر لك موقع السيارة في خرائط Google. 3- قراءة موضع آخر بالضغط على زر مسح بيانات الموضع.", - "parkingDescription": "خدمة المواقف هي لك لمسح موقع السيارة حتى تتمكن من العثور عليها بسهولة عند مغادرتك. انقر على زر (مسح الموقف) لحفظ موقع الموقف، ثم سيظهر زر (عرض موقفي) لإظهار الطريق إلى الموقف. إذا كنت ترغب في إعادة مسح موقف السيارة QR فقط انقر على (مسح بياناتي).", - "appointments": "المواعيد", - "all2": "الكل", - "checkinOption": "تسجيل الحضور", - "readBarcode": "قراءة الكود", - "showMyPark": "عرض الموقف", - "clearMyData": "امسح البيانات", - "floor": "الطابق:", - "gate": "البوابة:", - "building": "المبنى:", - "branch": "الفرع:", - "emergencyServices": "خدمات الطوارئ", - "nearester": "أقرب طوارئ", - "locationa": "الموقع", - "callNow": "اتصل الآن", - "ambulancerequest": "طلب إسعاف", - "requestA": "طلب", - "noBookedAppointments": "لا توجد مواعيد محجوزة", - "noConfirmedAppointments": "لا توجد مواعيد مؤكدة", - "noArrivedAppointments": "لا توجد مواعيد تم تسجيل الوصول إليها", - "myAppointmentsList": "المواعيد", - "myAppointments": "مواعيدي", - "radiology": "الأشعة", - "radiologySubtitle": "النتيجة", - "lab": "المختبر", - "labSubtitle": "نتائج", - "medicines": "الأدوية", - "medicinesSubtitle": "الوصفات", - "vitalSigns": "علامات حيوية", - "vitalSignsSubTitle": "التقارير", - "vitalSignNormal": "طبيعي", - "vitalSignLow": "منخفض", - "vitalSignHigh": "مرتفع", - "vitalSignObese": "بدين", - "vitalSignOverweight": "زيادة الوزن", - "vitalSignUnderweight": "نقص الوزن", - "vitalSignSkinny": "نحيف جداً", - "myMedical": "نشط", - "myMedicalSubtitle": "الأدوية", - "myDoctor": "أطبائي", - "myDoctorSubtitle": "القائمة", - "myDoctorSubtitle2": "قائمة", - "eye": "العين", - "eyeSubtitle": "القياس", - "insurance": "التأمين", - "insurance2": "تأمين", - "insuranceSubtitle": "البطاقة", - "updateInsurance": "تحديث", - "updateInsuranceSubtitle": "التأمين", - "insuranceApproval": "التأمين", - "insuranceApprovalSubtitle": "الموافقات", - "allergies": "الحساسية", - "allergiesSubtitle": "القائمة", - "myVaccines": "لقاحاتي", - "myVaccinesSubtitle": "القائمة", - "medical": "طبي", - "medicalSubtitle": "التقرير", - "monthly": "شهري", - "monthlySubtitle": "التقرير", - "sick": "مريض", - "sick2": "المريضة", - "sickSubtitle": "الإجازات", - "myBalance": "رصيدي", - "myBalanceSubtitle": "الرصيد", - "patientCall": "مكالمة المريض", - "patientCallSubtitle": "الخدمة", - "smartWatches": "الساعات الذكية", - "smartWatchesSubtitle": "الاقتران", - "myTrackers": "متعقباتي", - "myTrackersSubtitle": "الخدمة", - "askYour": "اسأل", - "askYourSubtitle": "طبيبك", - "internet": "الإنترنت", - "internetSubtitle": "الاقتران", - "chatbot": "الدرد��ة الآلية", - "chatbotSubtitle": "", - "timeLine": "الخط الزمني", - "labOrders": "طلبات المختبر", - "billNo": "رقم الفاتورة:", - "prescriptions": "الوصفات", - "history": "التاريخ", - "orderNo": "رقم الطلب", - "orderDetails": "تفاصيل الطلب", - "deliveryDriverTrack": "تتبع السائق", - "deliveryLocation": "موقع التسليم", - "driver": "السائق", - "vitalSign": "علامة حيوية", - "monthlyReports": "تقارير شهرية", - "km": "كم:", - "km_": "كم", - "patientHealthSummaryReport": "تقرير ملخص صحة المريض", - "toViewTheTermsAndConditions": "لعرض الشروط والأحكام", - "clickHere": "انقر هنا", - "iAgreeToTheTermsAndConditions": "أوافق على الشروط والأحكام ", - "iAgreeToTheTermsAndConditionsSubtitle": "أوافق على الشروط والأحكام ", - "save": "حفظ", - "userAgreement": "اتفاقية المستخدم", - "updateSuccessfully": "تم التحديث بنجاح", - "checkVaccineAvailability": "تحقق من توفر اللقاح", - "myVaccinesAvailability": "توفر اللقاحات الخاصة بي", - "paymentService": "خدمة الدفع", - "paymentOnline": "الخدمة", - "onlineCheckIn": "تسجيل الوصول عبر الإنترنت", - "myBalances": "رصيدي", - "myWallet": "محفظتي", - "balanceAmount": "مبلغ المحفظة", - "totalBalance": "إجمالي الرصيد", - "createAdvancedPayment": "إعادة شحن المحفظة", - "advancePayment": "دفع مسبق", - "advancePaymentLabel": "يمكنك إنشاء وإضافة دفعة مقدمة لحسابك أو حسابات أخرى.", - "fileNumber": "رقم الملف", - "amount": "المبلغ *", - "depositorEmail": "البريد الإلكتروني للودائع *", - "notes": "ملاحظات", - "selectPatientName": "اختر اسم المريض", - "selectFamilyPatientName": "أفراد العائلة", - "selectHospital": "اختر المستشفى", - "selectCity": "اختر المدينة", - "city": "المدينة", - "distance": "المسافة", - "myAccount": "حسابي", - "otherAccount": "حساب آخر", - "selectBeneficiary": "اختر المستفيد", - "confirmThePayment": "تأكيد الدفع", - "depositorName": "اسم مُقدِّم الإيداع", - "mobileNumber": "رقم الجوال", - "phoneNumber": "رقم الهاتف", - "country": "البلد", - "ok": "حسنا", - "averageWaitingTime": "متوسط وقت الانتظار:", - "waitingTime": "وقت الانتظار المتوقع:", - "waterConsumedInWeek": "الماء المستهلك في أسبوع", - "waterConsumedInMonth": "الماء المستهلك في شهر", - "theVerificationCodeExpiresIn": "ينتهي رمز التحقق في", - "pleaseEnterTheVerificationCode": "يرجى إدخال رمز التحقق المرسل إلى", - "eyeMeasurements": "قياسات العين", - "measurements": "قياسات", - "classes": "نظارات", - "contactLens": "عدسات لاصقة", - "rightEye": "العين اليمنى", - "sphere": "الكرة", - "cylinder": "الأسطوانة", - "axis": "المحور", - "prism": "الهرم", - "va": "VA", - "leftEye": "العين اليسرى", - "brand": "العلامة التجارية", - "power": "القوة", - "diameter": "القطر", - "remarks": "ملاحظات: ", - "activeMedications": "الأدوية النشطة", - "expDate": "تاريخ انتهاء الصلاحية:", - "route": "الطريق", - "frequency": "التكرار", - "dailyQuantity": "��لكمية اليومية:", - "addReminder": "إضافة تذكير", - "cancelReminder": "إلغاء التذكير", - "reminderDes": "يرجى تحديد يوم ووقت بدء العلاج ليتم إعلامك عندما يحين وقت تناول الدواء", - "pleaseSelectAllQuestionToContinue": "يرجى الإجابة على جميع الأسئلة للمتابعة...", - "startDay": "يوم البدء", - "endDay": "يوم الانتهاء", - "days": "أيام ", - "pleaseVerify": "يرجى التحقق ", - "scheduleTime": "وقت الجدولة", - "askDoctor": "اسأل الطبيب", - "doctorResponses": "ردود الطبيب", - "ne_w": "جديد", - "all": "الكل", - "dailyWater": "متابعة الماء اليومية", - "questionHere": "أدخل السؤال هنا...", - "viewDoctorResponses": "عرض ردود الطبيب", - "serviceInformationButton": "تسجيل الدخول / التسجيل", - "serviceInformationTitle": "معلومات الخدمة", - "serviceInformation": "معلومات الخدمة", - "homeHealthCare": "الرعاية الصحية المنزلية", - "noAppointmentAvailable": "لا توجد مواعيد متاحة", - "loginRegister": "تسجيل الدخول / التسجيل", - "orderLog": "سجل الطلب", - "infoLab": "تتيح لك هذه الخدمة عرض نتائج جميع الفحوصات المخبرية التي أجريت في مجموعة الحبيب الطبية بالإضافة إلى إرسال التقرير عبر البريد الإلكتروني.", - "infoRadiology": "تتيح لك هذه الخدمة عرض تقارير وصور الأشعة في مجموعة الحبيب الطبية بالإضافة إلى إرسال التقرير عبر البريد الإلكتروني.", - "noReviewsAvailable": "لا توجد تقييمات متاحة", - "noLocationAvailable": "لا توجد مواقع متاحة", - "orders": "الطلبات", - "lakum": "لكم", - "lakumMsg": "لا توجد تفاصيل عن النقاط", - "lakumPoint": "نقاط لكم", - "wishlist": "قائمة الرغبات", - "products": "المنتجات", - "reviews": "التعليقات", - "brands": "العلامات التجارية", - "productDetails": "تفاصيل المنتج", - "medicationRefill": "إعادة تعبئة الدواء", - "pillReminder": "تذكير الأدوية", - "shippingAddresses": "عناوين الشحن", - "reachUs": "تواصل معنا", - "ourLocations": "مواقعنا", - "edit": "تعديل", - "whatsApp": "واتساب", - "phone": "الهاتف", - "delete": "حذف", - "deleteAddress": "هل أنت متأكد أنك تريد الحذف", - "deletedAddres": "تم حذف العنوان", - "addAddress": "إضافة عنوان جديد", - "addNewAddress": "إضافة عنوان جديد", - "order": "طلبي", - "delivered": "تم التوصيل", - "pending": "قيد الانتظار", - "enterNameHere": "أدخل اسمك هنا", - "processing": "جاري المعالجة", - "cancelled": "ملغى", - "writeReview": "اكتب تقييمًا", - "shareReview": "شارك التقييم", - "review": " التقييمات", - "viewMedicalFile": "عرض التفاصيل", - "viewAllServices": "جميع الخدمات", - "medicalFile": "الملف الطبي", - "verified": "تم التحقق", - "checkup": "فحص", - "hhcHome": "الرئيسية", - "refferal": "إحالة إلكترونية", - "refferalTitle": "إحالة إلكترونية", - "refferalSubTitle": "الخدمة", - "healthCare": "الرعاية الصحية", - "emergency": "طوارئ", - "emergency2": "الطوارئ", - "erservices": "خدمات الطوارئ", - "services2": "الخدمات", - "services3": "خدمات", - "cantSeeProfile": "لرؤية ملفك الطبي، يرجى تسجيل الدخول أو التسجيل الآن", - "loginRegisterNow": "تسجيل الدخول أو التسجيل الآن", - "hmgPharmacy": "صيدلية الحبيب", - "ecommerceSolution": "حلول التجارة الإلكترونية", - "comprehensive": "شامل", - "onlineConsulting": "استشارات عبر الإنترنت", - "pendingOrder": " قيد الانتظار", - "deliveredOrder": " تم التوصيل", - "processingOrder": " جارٍ المعالجة", - "cancelledOrder": " ملغى", - "compare": " قارن", - "medicationsRefill": " إعادة تعبئة الأدوية", - "recommended": " موصى به لك", - "myPrescription": " وصفتي", - "quantity": " الكمية ", - "reviewAppointment": " مراجعة الموعد ", - "backMyAccount": "العودة إلى حسابي ", - "reviewSuccessful": "تمت مراجعة الطلب بنجاح", - "reviewShared": "تمت مشاركة تقييمك في قسم تقييم المنتج", - "reviewComment": "تساعد تقييماتك الآخرين على اختيار منتج أفضل", - "shippedMethod": "الشحن بواسطة:", - "orderDetail": "تفاصيل الطلب", - "orderSummary": "ملخص الطلب", - "subtotal": "المجموع الفرعي", - "shipping": "الشحن", - "shipBy": "الشحن بواسطة:", - "lakumPoints": "نقاط لكم", - "useLakumPoints": "استخدم نقاط لكم", - "use": "استخدم", - "proceedPay": "المتابعة للدفع", - "vat": "ضريبة القيمة المضافة (15%)", - "inclusiveVat": "(شاملة ضريبة القيمة المضافة)", - "items": "عنصر(عناصر)", - "checkOut": "الدفع", - "sar": "ريال سعودي", - "aed": "درهم إماراتي", - "payOnline": "الدفع عبر الإنترنت", - "cancelOrder": "إلغاء الطلب", - "confirmAddress": "تأكيد العنوان ", - "confirmLocation": "أكد الموقع ", - "conditionsHMG": "الشروط والأحكام ", - "conditions": "الشروط والأحكام لكوم", - "confirmDeleteMsg": "هل أنت متأكد! تريد الحذف ", - "confirmDelete": "حذف", - "confirmCancellation": "هل أنت متأكد! تريد إلغاء هذا الطلب ", - "orderNumber": "رقم الطلب: ", - "orderDate": "التاريخ", - "itemsNo": "عنصر(عناصر)", - "noOrder": "ليس لديك أي طلبات.", - "noResult": "لا توجد نتيجة.", - "nonRecommended": "لا توجد منتجات موصى بها.", - "termsService": "شروط الخدمة", - "beforeusing": "قبل استخدام الفحص، يرجى قراءة شروط الخدمة.", - "accept": "أقرأ وأقبل شروط الخدمة وسياسة الخصوصية", - "dataSafeInfo": "المعلومات التي تقدمها مجهولة الهوية وليست مشتركة مع أي شخص.", - "dataSafe": " بياناتك آمنة.", - "informational": "الفحص لأغراض معلوماتية وليس رأيًا طبيًا مؤهلاً", - "notUseInEmerbency": "لا تستخدم في حالات الطوارئ.", - "notUseInEmerbencyDetails": "في حالة الطوارئ الصحية، ", - "notUseInEmerbencyDetailsCall": "اتصل بأقرب رقم طوارئ على الفور", - "checkDiagnosis": "الفحص ليس تشخيصًا.", - "remeberthat": "تذكر أن", - "loginToUseService": "تحتاج إلى تسجيل الدخول لاستخدام هذه الخدمة", - "offersAndPromotions": "عروض وترويجيات خاصة", - "offers": "عروض", - "myPrescriptions": "وصفاتي", - "searchAndScanMedication": "البحث والمسح الضوئي للدواء", - "shopByBrands": "تسوق حسب العلامات التجارية", - "recentlyViewed": "تمت مشاهدته مؤخرًا", - "bestSellers": "الأكثر مبيعًا", - "deleteAllItems": "حذف جميع العناصر", - "total": "الإجمالي", - "totalWithColonRight": "الإجمالي:", - "selectAddress": "اختر العنوان", - "shippingAddress": "عنوان الشحن", - "changeAddress": "تغيير العنوان", - "selectPaymentOption": "اختر طريقة الدفع", - "selectTamaraPlan": "اختر خطة دفع تمارا", - "changeMethod": "تغيير الطريقة", - "reviewOrder": "مراجعة الطلب", - "active": "نشط", - "inactive": "غير نشط", - "balance": "الرصيد", - "gained": "المكتسب", - "consumed": "المستهلك", - "transferred": "المحول", - "riyal": "ريال", - "membersince": "عضو منذ", - "identification": "رقم الهوية", - "lakumMobile": "رقم الجوال", - "waitinggained": "انتظار المكتسب", - "expired": "منتهي", - "willBeExpired": "سينتهي", - "activateLAKUMAccount": "تفعيل حساب لكم", - "checkBeneficiary": "تحقق من المستفيد", - "beneficiaryName": "اسم المستفيد", - "accountActivation": "تفعيل الحساب", - "lakumTransfer": "تحويل لكم", - "acceptLbl": "قبول", - "declineLbl": "رفض", - "selectGender": "اختر الجنس", - "iAmA": "أنا ...", - "selectAge": "اختر عمرك", - "select": "اختر", - "iAm": "أنا", - "yearsOld": "سنوات", - "dragPoint": "اسحب النقطة لتغيير عمرك", - "refine": "تنقيح", - "subGroup": "مجموعة فرعية", - "max": "الحد الأقصى", - "compeleteOrderMsg": "تم تقديم الطلب بنجاح!!", - "addToCompareMsg": "لقد أضفت منتجًا إلى قائمة المقارنة", - "itInListMsg": "العنصر موجود بالفعل في القائمة", - "compareListFull": "قائمة المقارنة ممتلئة", - "addQuantity": "يجب عليك إضافة الكمية", - "addToCartMsg": "لقد أضفت منتجًا إلى عربة التسوق", - "addToWishlistMsg": "لقد أضفت منتجًا إلى قائمة الرغبات", - "notifyMeMsg": "سوف يتم إبلاغك عند توفر المنتج", - "removeFromWishlistMsg": "لقد أزلت منتجًا من قائمة الرغبات", - "min": "الحد الأدنى", - "reset": "إعادة تعيين", - "apply": "تطبيق", - "viewCategorise": "عرض جميع الفئات", - "viewSubCategorise": "عرض جميع الفئات الفرعية", - "categorise": "الفئات", - "wishList": "قائمة الرغبات", - "cart": "عربة التسوق", - "alhabibapp": "تطبيق الحبيب", - "searchProductHere": "ابحث عن المنتج هنا", - "hhcNotAuthMsg": "تقدم هذه الخدمة مجموعة من خدمات الرعاية الصحية المنزلية، والمتابعة المستمرة والشاملة في أماكن إقامتهم لأولئك الذين لا يمكنهم الوصول إلى المرافق الصحية، مثل (تحليلات المختبر - الأشعة - التطعيمات - العلاج الطبيعي)، إلخ.", - "email": "البريد الإلكتروني *", - "book": "احجز", - "appointmentLabel": "موعد", - "bloodType": "فصيلة الدم", - "maritalStatus": "الحالة الاجتماعية", - "general": "عام", - "profile": "ملفي", - "notifications": "إشعارات", - "notificationDetails": "تفاصيل الإشعار", - "notificationDetailsa": "تفاصيل الإشعار", - "infoMyDoctorPoints": "", - "infoMyDoctor": "تتيح لك هذه الخدمة رؤية جميع الأطباء الذين زرتهم في مجموعة الحبيب الطبية، ومن خلال هذه الخدمة:", - "infoPrescriptions": "تتيح لك هذه الخدمة عرض جميع الوصفات الطبية التي أصدرتها مجموعة الحبيب الطبية، ومن خلال هذه الخدمة، يمكنك:", - "infoMyPrescriptionPoints": "", - "infoInsuranceCards": "تتيح لك هذه الخدمة عرض جميع بطاقات التأمين التي تم تسجيلها خلال زياراتك لمجموعة الحبيب الطبية بالإضافة إلى:", - "infoInsuranceCardsPoints": "", - "infoAllergies": "تتيح لك هذه الخدمة عرض جميع أنواع الحساسية المسجلة خلال زياراتك لمجموعة الحبيب الطبية.", - "infoSickLeaves": "تتيح لك هذه الخدمة عرض جميع الاجازات المرضيه التي تم أخذها في مجموعة الحبيب الطبية بالإضافة إلى:", - "infoSickLeavePoints": "", - "infoApprovals": "تتيح لك هذه الخدمة عرض جميع طلبات الموافقة التي تم إرسالها إلى شركات التأمين بالإضافة إلى:", - "infoApprovalPoints": "", - "infoMonthReport": "عند تفعيل هذه الخدمة، سيقوم النظام بإرسال تقرير شهري تلقائيًا إلى البريد الإلكتروني المسجل يتضمن العلامات الحيوية والنتائج لآخر الزيارات التي تمت في مجموعة الحبيب الطبية.", - "languageSetting": "الرسائل القصيرة، واتساب، لغة مكالمات التأكيد", - "alert": "تنبيهات", - "emailAlert": "تنبيه عبر البريد الإلكتروني", - "smsAlert": "تنبيه عبر الرسائل القصيرة", - "contactInfo": "معلومات الاتصال", - "emrgName": "اسم جهة الاتصال في حالات الطوارئ", - "emrgNo": "رقم جهة الاتصال في حالات الطوارئ", - "modes": "الأوضاع", - "vibration": "اهتزاز عند اللمس", - "blindModes": "أوضاع للمكفوفين جزئيًا", - "invertTheme": "عكس", - "offTheme": "إيقاف", - "dimTheme": "خافت", - "bwTheme": "أسود وأبيض", - "permissions": "إذن", - "cameraPermission": "الكاميرا", - "locationPermission": "الموقع", - "needPrescription": "يتطلب هذا المنتج وصفة طبية", - "outOfStockMsg": "لقد أضفت منتجًا غير متوفر حاليًا، يرجى إزالته!", - "noArabicLetters": "لا يُسمح باستخدام الحروف العربية", - "noOffersAvailable": "لا توجد عروض متاحة!", - "accessibility": "وضع الوصول", - "orderStatus": "حالة الطلب", - "findUs": "اعثر علينا", - "liveChat": "دردشة مباشرة", - "service": "خدمة", - "hmgServiceLabel": "خدمة مجموعة الحبيب الطبية", - "healthWeatherIndicators": "مؤشرات الطقس الصحية", - "healthTipsBasedOnCurrentWeather": "نصائح صحية بناءً على الطقس الحالي", - "moreDetails": "المزيد من التفاصيل", - "resendOrder": "إعادة التعبئة والتوصيل", - "ports": "المنافذ", - "way": "الطريقة", - "dailyDoses": "الجرعات اليومية", - "period": "الفترة", - "duration": "المدة", - "cm": "سم", - "ft": "قدم", - "kg": "كجم", - "lb": "رطل", - "birthDate": "تاريخ الميلاد", - "dateOfBirth": "تاريخ الميلاد", - "mass": "الكتلة", - "tempC": "°م", - "bpm": "نبضة في الدقيقة", - "respirationSigns": "التنفس", - "sysDias": "SBP/DBP", - "body": "مؤشر كتلة الجسم", - "bodyString": "الجسم", - "face": "وجه", - "retouch": "روتوش", - "bikini": "بيكيني", - "totalMinutes": "إجمالي الدقائق", - "feedback": "رأيك يهمنا", - "likeToHear": "نود سماع ملاحظاتك، ومخاوفك بشأن خدمات الرعاية الصحية وتجربة الخدمات الإلكترونية. يرجى استخدام النموذج أدناه", - "emptySubject": "يرجى إدخال الموضوع", - "emptyMessage": "يرجى إدخال الرسالة", - "selectAttachment": "اختر المرفق", - "complainAppo": "شكوى بخصوص الموعد", - "complainAppoAlt": "شكوى بدون موعد", - "messageType": "نوع الرسالة", - "feedbackType": "نوع الرسالة", - "compliment": "تقدير", - "suggestion": "اقتراح", - "yourFeedback": "تم إرسال رأيك", - "selectPart": "يرجى اختيار الجزء الذي تشتكي منه", - "number": "رقم", - "notClassified": "غير مصنف", - "selectClinic": "اختر العيادة", - "selectProject": "اختر المستشفى", - "searchItemError": "يجب أن يكون اسم العنصر أكثر من 3 أحرف", - "youCanFind": "يمكنك العثور على ", - "itemInSearch": " عنصر في البحث", - "bloodDonation": "التبرع بالدم", - "bloodDonationInfo": "من خلال هذه الخدمة، يمكنك تسجيل اسمك كمتبرع بالدم حيث سيتواصل معك بنك الدم في مجموعة الحبيب الطبية في حالة الحاجة إلى فصيلة الدم.", - "bloodInstruction": "أدخل المعلومات المطلوبة، من أجل التسجيل في خدمة التبرع بالدم", - "aboutBloodDonation": "عن التبرع بالدم", - "bloodDonationDescription": "التبرع بالدم هو عمل نبيل ينقذ الأرواح. كل تبرع واحد يمكن أن ينقذ ما يصل إلى ثلاثة أشخاص. من خلال التبرع بالدم، فإنك تساعد المرضى الذين يحتاجون إلى عمليات نقل دم، وحالات الطوارئ، والعلاجات الطبية.", - "bloodDonationBenefit1": "عملية آمنة وسريعة (10-15 دقيقة)", - "bloodDonationBenefit2": "يمكنك التبرع كل 8-12 أسبوع", - "bloodDonationBenefit3": "فحص صحي مجاني لدمك", - "viewTerms": "لعرض الشروط والأحكام", - "wantConnectHmgNetwork": "عزيزي العميل، لا يوجد وصول إلى الإنترنت، هل ترغب في الاتصال بشبكة مجموعة الحبيب الطبية لاستخدام تطبيقنا، تأكد من أنك في نطاق شبكة مجموعة الحبيب الطبية", - "failedToAccessHmgServices": "متصل بشبكة مجموعة الحبيب الطبية،\n\nلكن فشل في الوصول إلى خدمات مجموعة الحبيب الطبية", - "offerAndPackages": "عروض وباقات", - "offerAndPackagesDetails": "تتيح لك هذه الخدمة عرض جميع عروض مجموعة الحبيب الطبية:", - "invoiceNo": "رقم الفاتورة", - "invoiceDate": "تاريخ الفاتورة", - "specialResult": "نتيجة خاصة", - "generalResult": "نتيجة عامة", - "showMoreBtn": "مخطط التدفق", - "value": "القيمة", - "report": "تقرير الأشعة", - "openRad": "فتح الصورة", - "sendCopy": "إرسال التقرير عبر البريد الإلكتروني", - "appoSurvey": "استطلاع", - "appoSurveySubtitle": "استطلاع", - "labResults": "نتائج المختبر", - "doctorRating": "تقييم الطبيب", - "good": "جيد", - "vGood": "جيد جدًا", - "excellent": "ممتاز", - "average": "متوسط", - "infoSigns": "تتيح لك هذه الخدمة عرض جميع العلامات الحيوية التي تم قياسها في مجموعة الحبيب الطبية، مثل (الطول، الوزن، مؤشر كتلة الجسم، معدل ضربات القلب، إلخ.) بالإضافة إلى عرض بعض الرسوم البيانية الإحصائية.", - "infoAdvancePayment": "تم تصميم هذه الخدمة بحيث يمكنك إيداع مبلغ مقدم إما في حسابك أو في حساب شخص آخر، في مجموعة الحبيب الطبية.", - "infoMyBalance": "تتيح لك هذه الخدمة التحقق من رصيدك في جميع الفروع", - "erContant": "تظهر هذه الخدمة أقرب فرع من بين جميع فروع مجموعة الحبيب الطبية بناءً على موقعك الحالي.", - "infoAmbulance": "من خلال هذه الخدمة، يمكنك طلب الإخلاء بواسطة سيارة إسعاف، سواء من المنزل أو إلى المنزل، بالإضافة إلى مجموعة من الخدمات الأخرى", - "infoMyAppointments": "تتيح لك هذه الخدمة رؤية جميع المواعيد التي زرتها في مجموعة الحبيب الطبية، ومن خلال هذه الخدمة:", - "infoTodo": "تم تصميم هذه الخدمة لتمكينك من الحصول على رابط سريع لقائمة المهام التي تحتاج القيام بها", - "familyInfo": "من خلال هذه الخدمة، ستتمكن من ربط ملفات عائلتك الطبية بملفك الطبي حتى تتمكن من إدارة سجلاتهم عن طريق تسجيل الدخول إلى ملفك الطبي.", - "rrtdDetails": "تقدم فريق الاستجابة السريعة خدمة طبية شاملة لجميع أنواع الحالات العاجلة والمستقرة من جميع الأعمار، بما في ذلك البالغين والمرضى الأطفال، وتغطي الخدمة فريق طبي مدرب تدريبًا عاليًا ومجهز تجهيزًا كاملاً قادرًا على تقديم أفضل رعاية طبية في منزل المريض.", - "homeHealthCareText": "تقدم هذه الخدمة مجموعة من خدمات الرعاية الصحية المنزلية، والمتابعة المستمرة والشاملة في أماكن إقامتهم لأولئك الذين لا يمكنهم الوصول إلى المرافق الصحية، مثل (تحليلات المختبر - الأشعة - التطعيمات - العلاج الطبيعي)، إلخ.", - "onlineCheckInAgreement": "تسجيل الوصول عبر الإنترنت مخصص للحالات التي لا تهدد الحياة. اتصل بالهلال الأحمر (997) أو اذهب إلى أقرب قسم طوارئ إذا كان هناك: \n\nعلامات السكتة الدماغية أو النوبة القلبية \nhالة من النوبات أو الإغماء \nهناك إصابة تهدد الطرف أو الحياة \nصورة لإصابات خطيرة", - "infoEreferral": "تتيح لك هذه الخدمة تقديم طلب إحالة من أي مقدم رعاية صحية سواء داخل أو خارج المملكة العربية السعودية إلى أي من مستشفيات HMG، عن طريق ملء بعض بيانات المريض وإرفاق التقارير الطبية، علاوة على ذلك يمكنك تتبع حالة الطلب (قيد المعالجة، مقبول أو مرفوض)", - "erConsultation": "تتيح لك هذه الخدمة إجراء استشارة افتراضية عبر الإنترنت عبر مكالمة فيديو مباشرة مع الطبيب من أي مكان وفي أي وقت.", - "myInvoice": "القائمة", - "invoiceList": "فواتيري", - "invoiceList2": "فواتيري", - "allInvoices": "كل الفواتير", - "hospitals": "المستشفيات", - "clinics": "العيادات", - "doctors": "الأطباء", - "selectDoctor": "اختر الطبيب", - "thisItemIsNotAvailable": "هذا العنصر غير متوفر", - "beforeAfterImages": "صور قبل وبعد", - "clinicAcceptLivecare": "لا حاجة للانتظار أو الزيارة يمكنك الآن الحصول على استشارة طبية عبر مكالمة فيديو (لايف كير) في اسم العيادة وسيتصل بك الطبيب على الفور", - "livecareModalTop": "تقبل هذه العيادة خدمات ال لايف كير", - "livecarePoint2": "سوف يتصل بك طبيب متخصص", - "livecarePoint3": "سيكون لدى الطبيب القدرة على رؤية تاريخ ملفك الطبي الكامل", - "livecarePoint4": "تتوفر خدمة توصيل الأدوية المجانية", - "livecarePoint5": "لا حاجة للزيارة، الخدمة في مكانك", - "bookImmediateLivecare": "أوافق على الحصول على الخدمة على الفور", - "bookVideoLivecare2": "لا أحتاج لزيارة العيادة", - "noThankyou": "لا شكرًا", - "visitClinic": "جدولة موعد مع الطبيب", - "generateCovidCertificate": "إصدار شهادة كوفيد-19", - "isReportOutsideKsa": "هل الشهادة مطلوبة خارج المملكة العربية السعودية؟", - "passportNumber": "رقم جواز السفر", - "enterPassportNumber": "يرجى تأكيد أو تحديث رقم جواز السفر الخاص بك:", - "validPassportNumber": "يرجى إدخال رقم جواز سفر صالح", - "continuePlan": "متابعة خطة العلاج؟", - "aboutApp": "حول التطبيق", - "dontHaveAccount": "ليس لديك حساب؟", - "loginOrRegister": "تسجيل الدخول أو التسجيل", - "myFiles": "ملفاتي", - "resultsPending": "النتائج معلقة", - "resultsAvailable": "النتائج متاحة", - "viewReport": "عرض التقرير", - "checkAvailability": "التحقق من التوفر", - "readInstructions": "قراءة التعليمات", - "searchLabReport": "ابحث عن تقرير المختبر", - "prescriptionDeliveryError": "هذه العيادة لا تدعم إعادة التعبئة والتسليم.", - "receiveOtpToast": "أين تود تلقي رمز التحقق OTP؟", - "enterPhoneNumber": "أدخل رقم الهاتف", - "enterEmailDesc": "أدخل عنوان بريدك الإلكتروني لإكمال عملية إنشاء ملف طبي", - "enterPhoneDesc": "أدخل رقم هاتفك لتلقي رمز التحقق ", - "pleaseChooseOption": "الرجاء اختيار من الخيارات أدناه لتلقي رمز التحقق OTP", - "prepareToElevate": "هل أنت مستعد لتحسين صحتك ورفاهيتك؟", - "iAcceptTermsConditions": "أوافق على الشروط والأحكام", - "alreadyHaveAccount": "هل لديك حساب بالفعل؟", - "loginNow": "تسجيل الدخول الآن", - "notice": "إشعار", - "oR": "أو", - "sendOTPWHATSAPP": "أرسل لي OTP عبر واتساب", - "sendOTPSMS": "أرسل لي OTP عبر الرسائل القصيرة", - "fullName": "الاسم الكامل", - "married": "متزوج", - "uae": "الإمارات العربية المتحدة", - "malE": "ذكر", - "loginBy": "تسجيل الدخول بواسطة", - "loginByOTP": "تسجيل الدخول بواسطة OTP", - "guest": "زائر", - "switchAccount": "تبديل الحساب", - "lastLoginBy": "آخر تسجيل دخول بواسطة", - "allSet": "جاهز! الآن يمكنك تسجيل الدخول باستخدام Face ID أو البصمة", - "enableQuickLogin": "تمكين تسجيل الدخول السريع", - "enableMsg": "تمكين تسجيل الدخول السريع سيسمح بالتحقق من خلال Face ID / Biometric الخاص بجهازك الحالي", - "notNow": "ليس الآن", - "pendingActivation": "في انتظار التنشيط", - "awaitingApproval": "انتظر القبول", - "news": "أخبار", - "ready": "جاهز", - "enterValidNationalId": "رقم الهوية أو رقم الملف غير صحيح", - "enterValidPhoneNumber": "الرجاء إدخال رقم هاتف صالح", - "cannotEnterSaudiOrUAENumber": "لا يمكنك إدخال أرقام هواتف السعودية (00966) أو الإمارات (00971) عند اختيار دولة 'أخرى'", - "medicalCentersWithCount": "{count} مراكز طبية", - "medicalCenters": "مراكز طبية", - "hospitalsWithCount": "{count} مستشفيات", - "selectRegion": "اختر المنطقة", - "selectFacility": "اختر المرافق", - "selectFacilitiesSubTitle": "يرجى اختيار المرفق للموعد", - "selectHospitalSubTitle": "يرجى اختيار المستشفى للموعد", - "iAcceptThe": "أوافق على", - "personalDetailsVerification": "التحقق من التفاصيل الشخصية", - "otpVerification": "التحقق من OTP", - "weHaveSendOTP": "لقد أرسلنا OTP إلى", - "via": "عبر", - "forRegistrationVerification": "للتحقق من التسجيل", - "didntReceiveIt": "لم تستلمه؟", - "resendOTP": "إعادة إرسال", - "resendIn": "إعادة الإرسال في", - "pleaseEnterAnationalID": "يرجى إدخال رقم الهوية الوطنية", - "pleaseEnterAFileNumber": "يرجى إدخال رقم الملف", - "pleaseEnterAValidEmail": "يرجى إدخال بريد إلكتروني صالح", - "pleaseEnterFullName": "يرجى إدخال الاسم الكامل", - "pleaseAcceptTermsConditions": "يرجى قبول الشروط والأحكام", - "pleaseEnterAValidIqamaID": "يرجى إدخال رقم إقامة صالح", - "pleaseEnterAValidNationalID": "يرجى إدخال رقم هوية وطنية صالح", - "pleaseEnterAValidDateOfBirth": "يرجى إدخال تاريخ ميلاد صالح", - "pleaseEnterAValidName": "يرجى إدخال اسم صالح", - "pleaseSelectAGender": "يرجى اختيار الجنس", - "pleaseSelectAMaritalStatus": "يرجى اختيار الحالة الاجتماعية", - "pleaseSelectACountry": "يرجى اختيار الدولة", - "pleaseEnterEmail": "يرجى إدخال البريد الإلكتروني", - "pleaseEnterAValidEmailFormat": "يرجى إدخال تنسيق بريد إلكتروني صالح", - "selectCountry": "اختر الدولة", - "forLoginVerification": "للتحقق من تسجيل الدخول", - "searchHospital": "بحث في المستشفى", - "skip": "تخطي", - "getStarted": "ابدأ الآن", - "onboardingHeading1": "حجز المواعيد لم يكن أسهل من الآن.", - "onboardingBody1": "ببضع نقرات فقط يمكنك استشارة الطبيب الذي تختاره.", - "onboardingHeading2": "الوصول إلى السجل الطبي بين يديك", - "onboardingBody2": "تتبع تاريخك الطبي بما في ذلك الفحوصات المخبرية، الوصفات الطبية، التأمين، وغيرها.", - "hmgHospitals": "المستشفيات", - "hmcMedicalClinic": "المراكز الطبية", - "applyFilter": "تطبيق الفلتر", - "facilityAndLocation": "المرفق والموقع", - "regionAndLocation": "المنطقة والمواقع", - "clearAllFilters": "مسح جميع الفلاتر", - "filters": "فلاتر", - "searchClinic": "بحث عن عيادة", - "normal": "عادي", - "attention": "انتباه", - "monitor": "مراقبة", - "noSpecialResult": "لا توجد نتائج خاصة", - "setTheDateRange": "تعيين النطاق الزمني", - "historyFlowchart": "مخطط تدفق التاريخ", - "to": "إلى", - "startDate": "تاريخ البدء", - "endDate": "تاريخ الانتهاء", - "walkin": "بدون حجز", - "laserClinic": "عيادة الليزر", - "continueString": "يكمل", - "covid_info": "تجري مستشفيات د. سليمان الحبيب فحص فيروس كورونا المستجد وتصدر شهادات السفر على مدار الساعة، طوال أيام الأسبوع، وبسرعة ودقة عالية. يمكن للراغبين في الاستفادة من هذه الخدمة زيارة أحد فروع مستشفيات د. سليمان الحبيب وإجراء فحص كورونا خلال بضع دقائق والحصول على النتائج خلال عدة ساعات خدمة فحص فيروس كورونا Covid 19 بتقنية PCR للكشف عن الفيروس وفقاً لأعلى المعايير العالمية وبأحدث أجهزة RT-PCR عالية الدقة (GeneXpert الأمريكي وغيره)، وهي طرق معتمدة من قبل هيئة الغذاء والدواء وكذلك من قبل المركز السعودي للوقاية من الأمراض المُعدية", - "appointmentDetails": "تفاصيل الموعد", - "checkingDoctorAvailability": "جاري التحقق من توفر الطبيب...", - "cancellingAppointmentPleaseWait": "جاري إلغاء الموعد، يرجى الانتظار...", - "appointmentCancelledSuccessfully": "تم إلغاء الموعد بنجاح", - "notConfirmed": "غير مؤكد", - "appointmentStatus": "حالة الموعد", - "doctorWillCallYou": "سيتصل بك الطبيب عندما يقترب موعدك.", - "getDirections": "الحصول على الاتجاهات", - "notifyMeBeforeAppointment": "أبلغني قبل الموعد", - "fetchingLabResults": "جاري جلب نتائج المختبر...", - "fetchingRadiologyResults": "جاري جلب نتائج الأشعة...", - "fetchingAppointmentPrescriptions": "جاري جلب وصفات الموعد...", - "noPrescriptionsForAppointment": "ليس لديك أي وصفات طبية لهذا الموعد.", - "amountBeforeTax": "المبلغ قبل الضريبة", - "rebookAppointment": "إعادة حجز الموعد", - "fetchingDoctorSchedulePleaseWait": "جاري جلب جدول الطبيب، يرجى الانتظار...", - "pickADate": "اختر تاريخاً", - "confirmingAppointmentPleaseWait": "جاري تأكيد الموعد، يرجى الانتظار...", - "appointmentConfirmedSuccessfully": "تم تأكيد الموعد بنجاح", - "appointmentPayment": "دفع الموعد", - "checkingPaymentStatusPleaseWait": "جاري التحقق من حالة الدفع، يرجى الانتظار...", - "paymentFailedPleaseTryAgain": "فشل الدفع! يرجى المحاولة مرة أخرى.", - "appointmentCheckIn": "تسجيل حضور الموعد", - "insuranceExpiredOrInactive": "التأمين منتهي الصلاحية أو غير نشط", - "totalAmountToPay": "المبلغ الإجمالي المستحق", - "vat15": "ضريبة القيمة المضافة 15%", - "liveCare": "لايف كير", - "recentVisits": "قائمة الزيارات", - "favouriteDoctors": "الأطباء المفضلون", - "searchByClinic": "البحث حسب العيادة", - "tapToSelectClinic": "انقر لاختيار العيادة", - "searchByDoctor": "البحث حسب الطبيب", - "tapToSelect": "انقر للاختيار", - "searchByRegion": "البحث حسب المنطقة", - "centralRegion": "المنطقة الوسطى", - "immediateConsultation": "استشارة فورية", - "scheduledConsultation": "استشارة مجدولة", - "pharmaLiveCare": "لايف كير الصيدلية", - "notSureHelpMeChooseClinic": "هل تريد مساعدة في اختيار العياة؟", - "mentionYourSymptomsAndFindDoctors": "اذكر أعراضك واعثر على قائمة الأطباء وفقاً لذلك", - "immediateService": "خدمة فورية", - "noNeedToWaitGetMedicalConsultation": "لا حاجة للانتظار، ستحصل على استشارة طبية فورية عبر مكالمة فيديو", - "noVisitRequired": "لا حاجة للزيارة", - "doctorWillContact": "سيتصل بك الطبيب", - "specialisedDoctorWillContactYou": "سيتصل بك طبيب متخصص وسيكون قادراً على الاطلاع على تاريخك الطبي", - "freeMedicineDelivery": "توصيل مجاني للأدوية", - "offersFreeMedicineDelivery": "يوفر توصيل مجاني للأدوية لموعد لايف كير", - "dentalChiefComplaints": "الشكاوى الرئيسة للأسنان", - "viewAvailableAppointments": "المواعيد المتاحة", - "doctorProfile": " ملف الطبيب", - "waitingAppointment": "موعد الانتظار", - "hospitalInformation": "معلومات المستشفى", - "fetchingAppointmentShare": "جاري جلب تفاصيل الموعد...", - "bookingYourAppointment": "جاري حجز موعدك...", - "selectLiveCareClinic": "عيادة لايف كير", - "checkingForExistingDentalPlan": "جاري التحقق من وجود خطة أسنان حالية، يرجى الانتظار...", - "dentalTreatmentPlan": "خطة علاج الأسنان", - "youHaveExistingTreatmentPlan": "لديك خطة علاج حالية: ", - "mins": "دقيقة", - "totalTimeRequired": "إجمالي الوقت المطلوب", - "wouldYouLikeToContinue": "هل تريد متابعتها؟", - "chooseDoctor": "اختر الطبيب", - "viewNearestAppos": "عرض أقرب المواعيد المتاحة", - "noDoctorFound": "لم يتم العثور على طبيب مطابق للمعايير المحددة...", - "yesPleasImInAHurry": "نعم من فضلك، أنا في عجلة من أمري", - "fetchingFeesPleaseWait": "جاري جلب الرسوم، يرجى الانتظار...", - "noThanksPhysicalVisit": "لا، شكراً. أفضل الزيارة الشخصية", - "offline": "غير متصل", - "videoCall": "مكالمة فيديو", - "liveVideoCallWithHMGDoctors": "مكالمة فيديو مباشرة مع أطباء مجموعة الحبيب الطبية", - "liveAudioCallWithHMGDoctors": "مكالمة صوتية مباشرة مع أطباء مجموعة الحبيب الطبية", - "audioCall": "مكالمة صوتية", - "phoneCall": "مكالمة هاتفية", - "livePhoneCallWithHMGDoctors": "مكالمة هاتفية مباشرة مع أطباء مجموعة الحبيب الطبية", - "reviewLiveCareRequest": "مراجعة طلب لايف كير", - "selectedLiveCareType": "نوع لايف كير المحدد", - "selectLiveCareCallType": "اختر نوع مكالمة لايف كير", - "confirmingLiveCareRequest": "جاري تأكيد طلب لايف كير، يرجى الانتظار...", - "unknownErrorOccurred": "حدث خطأ غير معروف...", - "liveCarePermissionsMessage": "يتطلب لايف كير أذونات الكاميرا والميكروفون والموقع والإشعارات لتمكين الاستشارة الافتراضية بين المريض والطبيب، يرجى السماح بهذه الأذونات للمتابعة.", - "liveCarePayment": "دفع لايف كير", - "mada": "مدى", - "visaOrMastercard": "فيزا أو ماستركارد", - "tamara": "تمارا", - "fetchingApplePayDetails": "جاري جلب تفاصيل Apple Pay، يرجى الانتظار...", - "liveCarePendingRequest": "طلب لايف كير قيد الانتظار", - "callLiveCareSupport": "اتصل بدعم لايف كير", - "whatIsWaitingAppointment": "ما هو موعد الانتظار؟", - "waitingAppointmentsFeature": "تتيح لك ميزة مواعيد الانتظار حجز موعد أثناء تواجدك داخل مبنى المستشفى، وفي حال عدم توفر مواعيد متاحة في جدول الطبيب.", - "appointmentWithDoctorConfirmed": "الموعد مع الطبيب مؤكد، ولكن وقت الدخول غير محدد.", - "paymentWithinTenMinutes": "ملاحظة: يجب عليك الدفع خلال 10 دقائق من الحجز، وإلا سيتم إلغاء موعدك تلقائياً", - "liveLocation": "الموقع المباشر", - "verifyYourLocationAtHospital": "تحقق من موقعك في المستشفى لتسجيل الحضور", - "error": "خطأ", - "ensureWithinHospitalLocation": "يرجى التأكد من أنك داخل موقع المستشفى لإجراء تسجيل الحضور عبر الإنترنت.", - "nfcNearFieldCommunication": "NFC (الاتصال قريب المدى)", - "scanPhoneViaNFC": "امسح هاتفك عبر لوحة NFC لتسجيل الحضور", - "qrCode": "رمز QR", - "scanQRCodeToCheckIn": "امسح رمز QR بالكاميرا لتسجيل الحضور", - "processingCheckIn": "جاري معالجة تسجيل الحضور...", - "bookingWaitingAppointment": "جاري حجز موعد الانتظار، يرجى الانتظار...", - "enterValidIDorIqama": "يرجى إدخال رقم هوية وطنية أو رقم ملف صالح", - "selectAppointment": "اختر الموعد", - "rebookSameDoctor": "أعد الحجز مع نفس الطبيب", - "queueing": "قائمة الانتظار", - "inQueue": "في قائمة الانتظار", - "yourTurn": "دورك", - "halaFirstName": "هلا {firstName}!!!", - "thankYouForPatience": "شكراً لصبرك، هذا هو رقم قائمة الانتظار الخاص بك.", - "servingNow": "يُخدم الآن", - "callForVitalSigns": "نداء للعلامات الحيوية", - "callForDoctor": "نداء للطبيب", - "thingsToAskDoctor": "أشياء تسأل طبيبك عنها اليوم", - "improveOverallHealth": "ماذا يمكنني أن أفعل لتحسين صحتي العامة؟", - "routineScreenings": "هل هناك أي فحوصات روتينية يجب أن أجريها؟", - "whatIsThisMedicationFor": "لماذا هذا الدواء؟", - "sideEffectsToKnow": "هل هناك أي آثار جانبية يجب أن أعرفها؟", - "whenFollowUp": "متى يجب أن أعود للمتابعة؟", - "goToHomepage": "الذهاب إلى الصفحة الرئيسية", - "appointmentsList": "قائمة المواعيد", - "allAppt": "جميع المواعيد", - "upcoming": "القادمة", - "completed": "المكتملة", - "noAppointmentsYet": "ليس لديك أي مواعيد بعد.", - "viewProfile": "عرض الملف الشخصي", - "choosePreferredHospitalForService": "اختر المستشفى المفضل لديك للخدمة", - "noHospitalsFound": "لم يتم العثور على مستشفيات", - "cancelOrderConfirmation": "هل أنت متأكد أنك تريد إلغاء هذا الطلب؟", - "orderCancelledSuccessfully": "تم إلغاء الطلب بنجاح", - "requestID": "معرف الطلب:", - "noCMCOrdersYet": "ليس لديك أي طلبات فحص شامل بعد.", - "cmcOrders": "طلبات الفحص الشامل", - "summary": "الملخص", - "selectedService": "الخدمة المحددة", - "requestSubmittedSuccessfully": "تم إرسال طلبك بنجاح.", - "hereIsYourRequestNumber": "هذا هو رقم طلبك #: ", - "pleaseSelectHospitalToContinue": "يرجى اختيار مستشفى للمتابعة", - "confirmSubmitRequest": "هل أنت متأكد أنك تريد إرسال هذا الطلب؟", - "pendingOrderWait": "لديك طلب معلق. يرجى الانتظار حتى تتم معالجته.", - "noServicesAvailable": "لا توجد خدمات متاحة", - "selectAService": "اختر خدمة", - "comprehensiveCheckup": "الفحص الشامل", - "viewNearestHMGLocations": "عرض أقرب مواقع مجموعة الحبيب الطبية", - "provideFeedbackOnServices": "قدم ملاحظاتك على خدماتنا", - "liveChatWithHMG": "خيار الدردشة المباشرة مع مجموعة الحبيب الطبية", - "send": "إرسال", - "status": "الحالة", - "sendingFeedback": "جاري إرسال الملاحظات...", - "selectFeedbackType": "اختر نوع الملاحظات", - "loadingAppointmentsList": "جاري تحميل قائمة المواعيد...", - "noAppointmentsForFeedback": "ليس لديك أي مواعيد لتقديم ملاحظات عنها.", - "selectedAppointment": "الموعد المحدد:", - "subject": "الموضوع", - "enterSubjectHere": "أدخل الموضوع هنا", - "message": "الرسالة", - "enterMessageHere": "أدخل الرسالة هنا", - "filesSelected": "تم تحديد {count} ملف(ات)", - "otherDetails": "تفاصيل أخرى", - "medicalReport": "التقرير الطبي", - "medicalReportNumber": "التقرير الطبي {number}", - "patientIsInsured": "المريض مؤمن عليه", - "insuranceDocument": "وثيقة التأمين", - "selectBranch": "اختر الفرع", - "patientInformation": "معلومات المريض", - "patientLocation": "أين يتواجد المريض", - "identificationNumber": "رقم الهوية", - "enterIdentificationNumber": "أدخل رقم الهوية*", - "patientName": "اسم المريض*", - "referralRequesterInformation": "معلومات مقدم طلب الإحالة", - "enterReferralRequesterName": "أدخل اسم مقدم طلب الإحالة*", - "requesterName": "اسم مقدم الطلب", - "relationship": "العلاقة", - "selectRelation": "اختر العلاقة", - "otherName": "اسم آخر", - "otherNameHint": "اسم آخر*", - "requesterNameRequired": "اسم مقدم طلب الإحالة مطلوب", - "selectRelationshipRequired": "يرجى اختيار العلاقة", - "otherRelationshipNameRequired": "اسم العلاقة الأخرى مطلوب", - "identificationNumberRequired": "رقم الهوية مطلوب", - "patientNameRequired": "اسم المريض مطلوب", - "enterPatientPhoneRequired": "يرجى إدخال رقم هاتف المريض", - "selectPatientCityRequired": "يرجى اختيار مدينة المريض", - "medicalReportRequired": "مطلوب تقرير طبي واحد على الأقل", - "selectBranchRequired": "يرجى اختيار الفرع", - "insuranceDocumentRequired": "وثيقة التأمين مطلوبة للمرضى المؤمن عليهم", - "searchResult": "نتيجة البحث", - "referralNo": "رقم الإحالة {number}", - "eReferral": "الإحالة الإلكترونية", - "referralCreatedSuccessfully": "تم إنشاء إحالتك بنجاح.", - "hereIsYourReferralNumber": "هذا هو رقم الإحالة الخاص بك #: ", - "searchEReferral": "البحث عن إحالة إلكترونية", - "enterRequiredInfoToSearch": "يرجى إدخال المعلومات المطلوبة للبحث عن إحالة إلكترونية", - "selectPickupDirection": "اختر اتجاه الاستلام", - "selectDirection": "اختر الاتجاه", - "toHospital": "إلى المستشفى", - "fromHospital": "من المستشفى", - "selectWay": "اختر الطريقة", - "oneWay": "اتجاه واحد", - "twoWay": "اتجاهين", - "selectPickupDetails": "اختر تفاصيل الاستلام", - "pleaseSelectDetailsOfPickup": " يرجى تحديد تفاصيل الاستلام", - "selectDetails": "اختر التفاصيل", - "work": "العمل", - "pick": "استلام", - "insideTheHome": "داخل المنزل", - "haveAnyAppointment": "هل لديك أي موعد", - "amountPaidAtHospital": "سيتم دفع المبلغ في المستشفى", - "submitRequest": "إرسال الطلب", - "enterPickupLocationManually": "أدخل موقع الاستلام يدوياً", - "enterPickupLocation": "أدخل موقع الاستلام", - "trackingDetails": "تفاصيل التتبع", - "cancelRequest": "إلغاء الطلب", - "shareLocationWhatsapp": "مشاركة موقعك المباشر على واتساب", - "pleaseWaitForCall": "يرجى انتظار المكالمة", - "toHospitalLower": "إلى المستشفى", - "contact": "اتصال", - "failed": "فشل", - "confirmationCall": "مكالمة التأكيد", - "pickupFromHome": "الاستلام من المنزل", - "onTheWayToHospital": " في الطريق إلى المستشفى", - "arrivedAtHospital": "وصل إلى المستشفى", - "orderCancel": "إلغاء الطلب", - "emergencyCheckIn": "تسجيل الطوارئ الإلكتروني", - "erOnlineCheckInDescription": "تتيح هذه الخدمة للمرضى تسجيل موعد الطوارئ قبل الوصول.", - "erOnlineCheckInSuccess": "تم تسجيل وصول الطوارئ بنجاح. الرجاء التوجه إلى منطقة الانتظار.", - "erOnlineCheckInError": "حدث خطأ غير متوقع أثناء عملية التسجيل. يرجى التواصل مع الدعم.", - "fetchingHospitalsList": "جاري جلب قائمة المستشفيات...", - "fetchingPaymentInformation": "جاري جلب معلومات الدفع...", - "erVisitDetails": "تفاصيل زيارة الطوارئ", - "erClinic": "عيادة الطوارئ", - "vatWithAmount": "الضريبة 15% ({amount})", - "erAppointmentBookedSuccess": "تم حجز موعدك بنجاح. يرجى إتمام إجراءات تسجيل الوصول عند وصولك إلى المستشفى.", - "underProcessing": "قيد المعالجة", - "canceledByPatient": "ملغى بواسطة المريض", - "rapidResponseTeam": "فريق الاستجابة السريع", - "allFacilities": "جميع المرافق", - "selectLocation": "اختر الموقع", - "pleaseSelectTheLocation": "يرجى اختيار الموقع", - "viewLocationGoogleMaps": "عرض الموقع على خرائط جوجل", - "callAmbulance": "استدعاء سيارة إسعاف", - "requestAmbulanceInEmergency": "طلب سيارة إسعاف في حالة الطوارئ من المنزل أو المستشفى", - "confirmation": "تأكيد", - "areYouSureYouWantToCallAmbulance": "هل أنت متأكد أنك تريد استدعاء سيارة إسعاف؟", - "getDetailsOfNearestBranch": "احصل على تفاصيل أقرب فرع بما في ذلك الاتجاهات", - "areYouSureYouWantToCallRRT": "هل أنت متأكد أنك تريد استدعاء فريق الاستجابة السريعة (RRT)؟", - "priorERCheckInToSkipLine": "تسجيل الوصول المسبق في الطوارئ لتجاوز الطابور والدفع في الاستقبال.", - "areYouSureYouWantToMakeERCheckIn": "هل أنت متأكد أنك تريد إجراء تسجيل وصول الطوارئ؟", - "checkingYourERAppointmentStatus": "جاري التحقق من حالة موعد الطوارئ الخاص بك...", - "transportOptions": "خيارات النقل", - "selectHospitalForAdvancePayment": "يرجى اختيار المستشفى الذي ترغب في دفع مبلغ مقدم له.", - "recharge": "إعادة الشحن", - "activityLevel": "مستوى النشاط", - "selectActivityLevel": "حدد مستوى النشاط", - "caloriesPerDay": "السعرات الحرارية في اليوم الواحد", - "dietType": "نوع النظام الغذائي", - "selectDietType": "حدد نوع النظام الغذائي", - "bodyFrameSize": "حجم إطار الجسم", - "selectBodyFrameSize": "حدد حجم إطار الجسم", - "averageCycleLength": "متوسط طول الدورة الشهرية (عادةً 28 يومًا)", - "averageLutealPhase": "متوسط طول المرحلة الأصفرية (عادةً 14 يومًا)", - "convert": "يتحول", - "calculate": "احسب", - "healthCalculators": "حاسبات الصحة", - "healthConverters": "محولات الصحة", - "generalHealth": "الصحة العامة", - "relatedToBMICalories": "متعلق بمؤشر كتلة الجسم والسعرات الحرارية ودهون الجسم وما إلى ذلك للبقاء على اطلاع دائم بصحتك.", - "selectCalculator": "اختر الآلة الحاسبة", - "womensHealth": "صحة المرأة", - "relatedToPeriodsOvulation": "متعلق بالدورة الشهرية والإباضة والحمل ومواضيع أخرى.", - "bloodSugar": "سكر الدم", - "trackYourGlucoseLevels": "تتبع مستويات الجلوكوز لديك، وفهم الاتجاهات، واحصل على رؤى مخصصة لصحة أفضل.", - "bloodCholesterol": "كوليسترول الدم", - "monitorCholesterolLevels": "راقب مستويات الكوليسترول، وقيّم مخاطر صحة القلب، واتخذ خطوات استباقية للرفاهية.", - "triglyceridesFatBlood": "الدهون الثلاثية في الدم", - "understandTriglyceridesImpact": "افهم تأثير الدهون الثلاثية على صحة القلب مع رؤى مخصصة وتوصيات الخبراء.", - "bmiCalculator": "حاسبة مؤشر كتلة الجسم", - "bmiCalculatorDesc": "احسب مؤشر كتلة جسمك لفهم نطاق وزنك الصحي.", - "caloriesCalculator": "حاسبةالسعرات الحرارية", - "caloriesCalculatorDesc": "اكتشف عدد السعرات الحرارية التي تحتاجها يومياً للحفاظ على الوزن أو فقدانه.", - "bmrCalculator": "حاسبة معدل الأيض الأساسي", - "bmrCalculatorDesc": "حدد معدل الأيض الأساسي ومتطلباتك اليومية من الطاقة.", - "idealBodyWeight": "الوزن المثالي للجسم", - "idealBodyWeightDesc": "اكتشف وزنك المثالي بناءً على الطول والعمر وبنية الجسم.", - "bodyFatCalculator": "حاسبة دهون الجسم", - "bodyFatCalculatorDesc": "قدّر نسبة دهون جسمك لتتبع أهداف اللياقة والصحة.", - "carbsProteinFat": "الكربوهيدرات البروتين والدهون", - "carbsProteinFatDesc": "وازن بين العناصر الغذائية مع النسب الصحيحة من الكربوهيدرات والبروتين والدهون.", - "ovulationPeriod": "فترة الإباضة", - "ovulationPeriodDesc": "تتبع فترة خصوبتك وخطط للحمل بدقة.", - "deliveryDueDate": "تاريخ الولادة المتوقع", - "deliveryDueDateDesc": "احسب تاريخ ولادتك المتوقع وراقب مراحل الحمل.", - "low": "منخفض", - "preDiabetic": "ما قبل السكري", - "high": "مرتفع", - "elevated": "مرتفع قليلاً", - "recorded": "مسجل", - "noRecordsYet": "لا توجد سجلات بعد", - "lastRecord": "آخر سجل", - "addBloodSugar": "إضافة سكر الدم", - "addBloodPressure": "إضافة ضغط الدم", - "addWeight": "إضافة الوزن", - "bloodSugarDataSavedSuccessfully": "تم حفظ بيانات سكر الدم بنجاح", - "bloodPressureDataSavedSuccessfully": "تم حفظ بيانات ضغط الدم بنجاح", - "weightDataSavedSuccessfully": "تم حفظ بيانات الوزن بنجاح", - "pleaseWait": "يرجى الانتظار", - "selectUnit": "اختر الوحدة", - "selectMeasureTime": "اختر وقت القياس", - "selectArm": "اختر الذراع", - "enterBloodSugar": "أدخل سكر الدم", - "enterSystolicValue": "أدخل القيمة الانقباضية", - "enterDiastolicValue": "أدخل القيمة الانبساطية", - "enterWeight": "أدخل الوزن", - "selectDuration": "اختر المدة", - "systolic": "الانقباضي", - "diastolic": "الانبساطي", - "sendReportByEmail": "إرسال التقرير عبر البريد الإلكتروني", - "enterYourEmailToReceiveReport": "أدخل عنوان بريدك الإلكتروني لاستلام التقرير", - "addNewRecord": "إضافة سجل جديد", - "healthTrackers": "متتبعات الصحة", - "monitorBloodPressureLevels": "راقب مستويات ضغط الدم لديك، وتتبع القراءات الانقباضية والانبساطية، وحافظ على صحة قلبك.", - "trackWeightProgress": "تتبع تقدم وزنك، وضع الأهداف، وحافظ على كتلة جسم صحية من أجل العافية الشاملة.", - "bookAppointment": "احجز موعد", - "completeCheckup": "الفحص الشامل", - "indoorNavigation": "الملاحة الداخلية", - "eReferralServices": "خدمات الإحالة الإلكترونية", - "dailyWaterMonitor": "مراقب الماء اليومي", - "fetchingYourWaterIntakeDetails": "جاري جلب تفاصيل استهلاك الماء الخاص بك.", - "healthCalculatorsServices": "حاسبات\nالصحة", - "healthConvertersServices": "محولات\nالصحة", - "smartWatchesServices": "الساعات\nالذكية", - "exploreServices": "استكشف الخدمات", - "medicalAndCareServices": "خدمات الرعاية الطبية", - "hmgServices": "خدمات مجموعة الحبيب الطبية", - "personalServices": "الخدمات الشخصية", - "habibWallet": "محفظة الحبيب", - "habibWallet2": "المحفظة", - "loginToViewWalletBalance": "سجل الدخول لعرض رصيد محفظتك", - "loginToViewMedicalFile": "سجل الدخول لعرض ملفك الطبي", - "addMember": "إضافة عضو", - "addFamilyMember": "إضافة فرد من العائلة", - "pleaseFillBelowFieldToAddNewFamilyMember": "يرجى ملء الحقل أدناه لإضافة فرد جديد من العائلة إلى ملفك الشخصي", - "healthTools": "أدوات الصحة", - "supportServices": "خدمات الدعم", - "virtualTour": "جولة افتراضية", - "carParking": "موقف السيارات", - "latestNews": "آخر الأخبار", - "hmgContact": "اتصل بمجموعة الحبيب الطبية", - "durationCannotExceed90": "لا يجوز أن تتجاوز المدة 90 دقيقة", - "unexpectedError": "حدث خطأ غير متوقع", - "gettingAmbulanceTransportOption": "جاري الحصول على خيارات نقل الإسعاف", - "fetchingAppointment": "جاري جلب الموعد", - "doYouWantToCancelTheRequest": "هل تريد إلغاء الطلب", - "cancellingRequest": "جاري إلغاء الطلب", - "fetchingTermsAndConditions": "جاري جلب الشروط والأحكام", - "selectLocationPrescriptionDelivery": "يرجى تحديد موقع توصيل الوصفة الطبية", - "noRadiologyOrders": "لم يتم العثور على أي طلبات تصوير شعاعي", - "ageIsRequired": "العمر مطلوب", - "invalidAge": "العمر غير صالح", - "ageMustBeBetween11And120": "يجب أن يكون العمر بين 11 و 120", - "heightIsRequired": "الطول مطلوب", - "invalidHeight": "الطول غير صالح", - "weightIsRequired": "الوزن مطلوب", - "invalidWeight": "الوزن غير صالح", - "timeToDrinkWater": "حان وقت شرب الماء! 💧", - "stayHydratedDrinkWater": "ابق رطبًا! اشرب {amount} مل من الماء.", - "visitPharmacyOnline": "زيارة الصيدلية على الانترنت", - "howAreYouFeelingToday": "كيف حالك اليوم؟", - "checkYourSymptomsWithScale": "تحقق من أعراضك باستخدام ذا المقياس", - "checkYourSymptoms": "تحقق من أعراضك", - "noUpcomingAppointmentPleaseBook": "ليس لديك أي مواعيد قادمة. يرجى حجز موعد", - "youHaveEROnlineCheckInRequest": "لديك طلب تسجيل وصول عبر الإنترنت للطوارئ", - "quickLinks": "روابط سريعة", - "viewMedicalFileLandingPage": "عرض الملف الطبي", - "immediateLiveCareRequest": "طلب لايف كير فوري", - "yourTurnIsAfterPatients": "دورك بعد {count} مريض. يرجى الانتظار حتى يحين دورك، وسيناديك الطبيب قريباً.", - "dontHaveHHCOrders": "ليس لديك أي أوامر رعاية صحية منزلية حتى الآن.", - "hhcOrders": "أوامر الرعاية الصحية المنزلية", - "requestedServices": "الخدمات المطلوبة", - "selectServices": "اختر الخدمات", - "selectedServices": "الخدمات المختارة", - "createNewRequest": "إنشاء طلب جديد", - "youHaveNoPendingRequests": "ليس لديك أي طلبات معلقة.", - "noInsuranceDataFound": "لم يتم العثور على بيانات التأمين...", - "noInsuranceUpdateRequest": "لم يتم العثور على أي طلبات لتحديث بيانات التأمين.", - "policyNumberInsurancePage": "الوثيقة: {number}", - "insuranceExpired": "التأمين منتهي الصلاحية", - "insuranceActive": "التأمين نشط", - "patientCardID": "رقم بطاقة المريض: {id}", - "noInsuranceApprovals": "لم تحصل على أي موافقات تأمينية حتى الآن.", - "noInsuranceWithHMG": "ليس لديك تأمين مسجل لدى مجموعة الحبيب الطبية.", - "referenceRange": "النطاق المرجعي", - "downloadReport": "تنزيل التقرير", - "generatingReport": "جارٍ إنشاء التقرير، يرجى الانتظار...", - "noLabResults": "لا يوجد نتائج", - "labResultDetails": "تفاصيل نتائج المختبر", - "resultOf": "نتيجة {date}", - "whatIsThisResult": "ما هي هذه النتيجة؟", - "lastTested": "آخر اختبار", - "byVisit": "حسب الزيارة", - "byTest": "حسب التحليل", - "results": "نتائج", - "viewResults": "عرض النتائج", - "rebook": "إعادة الحجز", - "noOphthalmologyAppointments": "لم يتم العثور على أي مواعيد في قسم طب العيون...", - "noVitalSignsRecordedYet": "لا توجد علامات حيوية مسجلة بعد", - "appointmentsAndVisits": "المواعيد", - "labAndRadiology": "المختبر والأشعة", - "activeMedicationsAndPrescriptions": "الوصفات الطبية", - "allPrescriptions": "جميع الوصفات", - "allMedications": "جميع الأدوية", - "youDontHaveAnyPrescriptionsYet": "ليس لديك أي وصفات طبية بعد.", - "youDontHaveAnyCompletedVisitsYet": "ليس لديك أي زيارات مكتملة بعد", - "others": "أخرى", - "allergyInfo": "معلومات الحساسية", - "vaccineInfo": "معلومات اللقاحات", - "updateInsuranceInfo": "تحديث التأمين", - "myInvoicesList": "قائمة فواتيري", - "ancillaryOrdersList": "قائمة الطلبات المساعدة", - "youDontHaveAnySickLeavesYet": "ليس لديك أي إجازات مرضية بعد.", - "medicalReports": "التقارير الطبية", - "sickLeaveReport": "تقرير الإجازة المرضية", - "weightTracker": "متتبع الوزن", - "askYourDoctor": "اسأل طبيبك", - "internetPairing": "الاقتران بالإنترنت", - "requested": "مطلوب", - "youDontHaveAnyMedicalReportsYet": "ليس لديك أي تقارير طبية بعد.", - "requestMedicalReport": "طلب تقرير طبي", - "youDoNotHaveAnyAppointmentsToRequestMedicalReport": "ليس لديك أي مواعيد لطلب تقرير طبي.", - "areYouSureYouWantToRequestMedicalReport": "هل أنت متأكد أنك تريد طلب تقرير طبي لهذا الموعد؟", - "yourMedicalReportRequestSubmittedSuccessfully": "تم إرسال طلب التقرير الطبي بنجاح.", - "monthlyHealthSummaryReportDisclaimer": "يعكس تقرير الملخص الصحي الشهري هذا المؤشرات الصحية ونتائج التحليل لأحدث الزيارات. يرجى ملاحظة أن هذا سيتم إرساله تلقائيًا من النظام ولا يعتبر تقريرًا رسميًا لذا لا ينبغي اتخاذ أي قرار طبي بناءً عليه", - "updatingMonthlyReportStatus": "جاري تحديث حالة التقرير الشهري...", - "monthlyReportStatusUpdatedSuccessfully": "تم تحديث حالة التقرير الشهري بنجاح", - "whoCanViewMyMedicalFile": "من يمكنه عرض ملفي الطبي؟", - "acceptedYourRequestToBeYourFamilyMember": "{status} طلب الانضمام الى أفراد عائلتك", - "canViewYourFile": "يمكنه عرض ملفك", - "hasARequestPendingToBeYourFamilyMember": "لديه طلب {status} ليكون فردًا من عائلتك", - "wantsToAddYouAsTheirFamilyMember": "يرغب في إضافتك كفرد من أفراد العائلة", - "rejectedYourRequestToBeYourFamilyMember": "{status} طلب الانضمام إلى عائلتك", - "rejectedYourFamilyMemberRequest": "{status} طلب أحد أفراد عائلتك", - "notAvailable": "غير متاح", - "selectAProfile": "الرجاء تحديد ملف تعريف", - "switchFamilyFile": "قم بالتبديل من قائمة الملفات الطبية أدناه", - "medicalFiles": "الملفات الطبية", - "addANewFamilyMember": "إضافة فرد جديد من العائلة", - "viewInvoiceDetails": "عرض تفاصيل الفاتورة", - "outPatient": "مريض خارجي", - "invoiceDetails": "تفاصيل الفاتورة", - "sendingEmailPleaseWait": "جاري إرسال ال��ريد الإلكتروني، يرجى الانتظار...", - "emailSentSuccessfullyMessage": "تم إرسال البريد الإلكتروني بنجاح.", - "discount": "خصم", - "paid": "مدفوع", - "fetchingInvoiceDetails": "جارٍ جلب تفاصيل الفاتورة، يرجى الانتظار...", - "scanQRCode": "مسح رمز الاستجابة السريعة", - "parkingSlotDetails": "تفاصيل موقف السيارة", - "slotNumber": "رقم الموقف: {code}", - "basement": "الطابق: {description}", - "parkingDate": "التاريخ: {date}", - "parkedSince": "متوقف منذ: {time}", - "resetDirection": "إعادة تعيين الاتجاه", - "noPrescriptionOrdersYet": "ليس لديك أي طلبات وصفات طبية حتى الآن.", - "fetchingPrescriptionPDFPleaseWait": "جاري جلب ملف الوصفة الطبية، يرجى الانتظار...", - "ratingValue": "التقييم: {rating}", - "downloadPrescription": "تحميل الوصفة الطبية", - "fetchingPrescriptionDetails": "جاري جلب تفاصيل الوصفة الطبية...", - "switchBackFamilyFile": "العودة إلى ملف العائلة", - "profileAndSettings": "الملف الشخصي والإعدادات", - "quickActions": "إجراءات سريعة", - "notificationsSettings": "إعدادات الإشعارات", - "touchIDFaceIDServices": "خدمات Touch ID / Face ID", - "personalInformation": "المعلومات الشخصية", - "updateEmailAddress": "تحديث عنوان البريد الإلكتروني", - "helpAndSupport": "المساعدة والدعم", - "permissionsProfile": "الأذونات", - "privacyPolicy": "سياسة الخصوصية", - "deactivateAccount": "إلغاء تنشيط الحساب", - "ageYearsOld": "{age} {yearsOld}", - "youDontHaveRadiologyOrders": "ليس لديك أي نتائج للأشعة حتى الآن.", - "radiologyResult": "نتيجة الأشعة", - "viewRadiologyImage": "عرض صورة الأشعة", - "rateClinic": "تقييم العيادة", - "back": "رجوع", - "rateDoctor": "تقييم الطبيب", - "howWasYourLastVisitWithDoctor": "كيف كانت زيارتك الأخيرة مع الطبيب؟", - "dateOfBirthSymptoms": "ما هو تاريخ ميلادك؟", - "genderSymptoms": "ما هو جنسك؟", - "heightSymptoms": "كم طولك؟", - "weightSymptoms": "ما هو وزنك؟", - "femaleGender": "أنثى", - "previous": "سابق", - "selectedOrgans": "الهيئات المختارة", - "noOrgansSelected": "لم يتم تحديد أي أعضاء بعد", - "organSelector": "محدد الأعضاء", - "noPredictionsAvailable": "لا توجد تنبؤات متاحة", - "areYouSureYouWantToRestartOrganSelection": "هل أنت متأكد أنك تريد إعادة تشغيل اختيار الأعضاء؟", - "possibleConditions": "الحالات المحتملة", - "pleaseSelectAtLeastOneRiskBeforeProceeding": "يرجى اختيار عامل خطر واحد على الأقل قبل المتابعة", - "aboveYouSeeCommonRiskFactors": "أعلاه ترى عوامل الخطر الأكثر شيوعًا. على الرغم من أن /diagnosis قد تعيد أسئلة حول عوامل الخطر، ", - "readMore": "اقرأ المزيد", - "riskFactors": "عوامل الخطر", - "noRiskFactorsFound": "لم يتم العثور على عوامل خطر", - "basedOnYourSelectedSymptomsNoRiskFactors": "بناءً على الأعراض المحددة، لم يتم تحديد عوامل خطر إضافية.", - "messageNotification": "الرسالة", - "attachedImage": "الصورة المرفقة", - "failedToLoadImage": "فشل تحميل الصورة", - "typeNotification": "النوع", - "pleaseSelectAtLeastOneOptionBeforeProceeding": "يرجى اختيار خيار واحد على الأقل قبل المتابعة", - "suggestions": "الاقتراحات", - "pleaseGoBackAndSelectOrgansFirst": "يرجى العودة واختيار الأعضاء أولاً", - "symptomsSelector": "محدد الأعراض", - "possibleSymptomsRelatedTo": "الأعراض المحتملة المتعلقة بـ", - "suggestionAIListDescription": "هذه قائمة بالأعراض المقترحة من قبل الذكاء الاصطناعي، بناءً على المعلومات التي تم جمعها حتى الآن خلال المقابلة", - "analyzing": "جاري التحليل...", - "seekMedicalAdvice": "اطلب المشورة الطبية", - "monitorDescription": "لا حاجة لطلب المشورة الطبية. فقط حافظ على روتين صحي.", - "seekMedicalAdviceDescription": "ليست حالة طوارئ ولكن من الأفضل مراقبة الأعراض.", - "emergencyDescription": "تحتاج إلى استشارة الطبيب في أقرب وقت ممكن قبل فوات الأوان.", - "colorScience": "دلالات الألوان", - "noNeedToVisitDoctor": "لا حاجة لزيارة الطبيب", - "commonSymptom": "الأعراض الشائعة", - "notApplicable": "لا ينطبق", - "emergencyTriage": "طوارئ", - "emergencyEvidenceDetected": "تم اكتشاف دليل طوارئ. يرجى طلب العناية الطبية.", - "noQuestionItemsAvailable": "لا توجد عناصر أسئلة متاحة", - "pleaseAnswerAllQuestionsBeforeProceeding": "يرجى الإجابة على جميع الأسئلة قبل المتابعة", - "triage": "الفرز", - "areYouSureYouWantToExitProgress": "هل أنت متأكد أنك تريد الخروج؟ سيتم فقدان تقدمك.", - "noQuestionAvailable": "لا يوجد سؤال متاح", - "possibleSymptom": "عرض محتمل: ", - "symptomsCheckerFindingScore": "- درجة نتائج فاحص الأعراض", - "notSet": "غير محدد", - "years": "سنوات", - "symptomsChecker": "فاحص الأعراض", - "helloIsYourInformationUpToDate": "مرحباً {name}، هل معلوماتك محدثة؟", - "noEditAll": "لا، تعديل الكل", - "yesItIs": "نعم، إنها كذلك", - "age": "العمر", - "youDontHaveAnyAncillaryOrdersYet": "ليس لديك أي طلبات مساعدة بعد.", - "invoiceWithNumber": "الفاتورة: {invoiceNo}", - "queued": "في قائمة الانتظار", - "checkInReady": "جاهز للتسجيل", - "checkIn": "تسجيل الوصول", - "viewDetails": "عرض التفاصيل", - "selectPaymentMethod": "اختر طريقة الدفع", - "processingPaymentPleaseWait": "جاري معالجة الدفع، يرجى الانتظار...", - "finalizingPaymentPleaseWait": "جاري إتمام الدفع، يرجى الانتظار...", - "generatingInvoicePleaseWait": "جاري إنشاء الفاتورة، يرجى الانتظار...", - "hereIsYourInvoiceNumber": "هذا هو رقم فاتورتك #: ", - "paymentCompletedSuccessfully": "تم الدفع بنجاح", - "failedToInitializeApplePay": "فشل في تهيئة Apple Pay. يرجى المحاولة مرة أخرى.", - "cash": "نقدي", - "approved": "موافق عليه", - "approvalRejectedPleaseVisitReceptionist": "تم رفض الموافقة - يرجى زيارة موظف الاستقبال", - "sentForApproval": "تم إرساله للموافقة", - "ancillaryOrderDetails": "تفاصيل الطلبات المساندة", - "noProceduresAvailableForSelectedOrder": "لا توجد إجراءات متاحة للطلب المحدد.", - "procedures": "الإجراءات", - "totalAmount": "المبلغ الإجمالي", - "covered": "مغطى", - "vatPercent": "ضريبة القيمة المضافة (15%)", - "proceedToPayment": "المتابعة للدفع", - "supportedSmartWatches": "الساعات الذكية المدعومة", - "pleaseMakeSureSamsungWatchConnected": "يرجى التأكد من أن ساعة Samsung الخاصة بك متصلة بهاتفك، ومتزامنة ومحدثة بشكل نشط.", - "beforeSyncingDataFollowInstructions": "قبل مزامنة البيانات، يرجى التأكد من اتباع التعليمات بشكل صحيح.", - "viewWatchInstructions": "عرض تعليمات الساعة", - "healthConnectAppNotInstalled": "يبدو أنه ليس لديك تطبيق Health Connect مثبتًا. يرجى تثبيته من متجر Play لمزامنة بيانات صحتك.", - "setTimerOfReminder": "ضبط التذكير", - "youHaveAppointmentWithDr": "لديك موعد مع د. ", - "hours": "ساعات", - "minutes": "دقائق", - "seconds": "ثواني", - "secs": "ثواني", - "noAllergiesDataFound": "لم يتم العثور على بيانات الحساسية...", - "heartRateDescription": "معدل ضربات قلبك يشير إلى عدد المرات التي ينبض فيها قلبك في الدقيقة", - "bloodOxygenDescription": "مستوى الأكسجين في الدم يشير إلى كمية الأكسجين التي تحملها خلايا الدم الحمراء", - "stepsDescription": "عدد الخطوات المتخذة على مدار اليوم", - "caloriesDescription": "السعرات الحرارية المحروقة أثناء النشاط البدني", - "distanceDescription": "المسافة المقطوعة على مدار اليوم", - "overview": "نظرة عامة", - "details": "التفاصيل", - "details2": "تفاصيل", - "healthy": "صحي", - "warning": "تحذير", - "vitalSignDetails": "تفاصيل العلامات الحيوية", - "resultOfNoDate": "نتيجة --", - "referenceRangeBetween": "النطاق المرجعي: {low} – {high} {unit}", - "referenceRangeMin": "النطاق المرجعي: ≥ {low} {unit}", - "referenceRangeMax": "النطاق المرجعي: ≤ {high} {unit}", - "noHistoryAvailable": "لا يوجد تاريخ متاح", - "bmiDescription": "مؤشر كتلة الجسم هو قياس يعتمد على الطول والوزن لتقدير دهون الجسم.", - "heightDescription": "يقاس الطول بالسنتيمتر ويستخدم لحساب مؤشر كتلة الجسم وتوصيات الجرعات.", - "weightDescription": "الوزن يساعد في تتبع الصحة العامة والتغذية والتغيرات مع مرور الوقت.", - "bloodPressureDescription": "ضغط الدم يعكس قوة الدم على جدران الشرايين. يظهر كانقباضي/انبساطي.", - "temperatureDescription": "درجة حرارة الجسم تعكس مدى سخونة جسمك وقد تتغير مع العدوى أو الالتهاب.", - "heartRateDescriptionVital": "معدل ضربات القلب يشير إلى عدد نبضات القلب في الدقيقة.", - "respiratoryRateDescription": "معدل التنفس هو عدد الأنفاس المأخوذة في الدقيقة.", - "bmiAdvice": "حافظ على نظام غذائي متوازن ونشاط منتظم. إذا كان مؤشر كتلة جسمك مرتفعًا أو منخفضًا، فكر في استشارة طبيبك.", - "heightAdvice": "لا حاجة لاتخاذ أي إجراء إلا إذا بدا قياسك غير صحيح. قم بتحديثه في زيارتك القادمة.", - "weightAdvice": "راقب تغيرات الوزن. الزيادة أو الخسارة المفاجئة قد تتطلب استشارة طبية.", - "bloodPressureAdvice": "استمر في تتبع ضغط دمك. يجب مناقشة القراءات المرتفعة أو المنخفضة مع طبيبك.", - "temperatureAdvice": "إذا كان لديك حمى مستمرة أو أعراض، اتصل بمقدم الرعاية الصحية.", - "heartRateAdvice": "تتبع اتجاهات معدل ضربات قلبك. إذا شعرت بدوار أو ألم في الصدر، اطلب الرعاية الطبية.", - "respiratoryRateAdvice": "إذا لاحظت ضيقًا في التنفس أو تنفسًا غير طبيعي، اطلب المشورة الطبية.", - "whatShouldIDoNext": "ماذا يجب أن أفعل بعد ذلك؟", - "customizeDrinkCup": "قم بتخصيص كوب مشروبك", - "tipsToStayHydrated": "نصائح للبقاء رطبًا", - "drinkBeforeYouFeelThirsty": "اشرب قبل أن تشعر بالعطش", - "keepRefillableBottleNextToYou": "احتفظ بزجاجة قابلة لإعادة التعبئة بجانبك", - "trackYourDailyIntakeToStayMotivated": "تتبع كمية الماء اليومية للحفاظ على الحافز", - "chooseSparklingWaterInsteadOfSoda": "اختر الماء الفوار بدلاً من الصودا", - "switchCup": "تبديل الكوب", - "plainWater": "ماء عادي", - "yourGoal": "هدفك", - "remaining": "المتبقي", - "hydrationStatus": "حالة الترطيب", - "areYouSureYouWantToCancelAllWaterReminders": "هل أنت متأكد أنك تريد إلغاء جميع تذكيرات الماء؟", - "remindersSet": "تم ضبط التذكيرات!", - "dailyWaterRemindersScheduledAt": "تم جدولة تذكيرات الماء اليومية في:", - "waterConsumption": "استهلاك المياه", - "selectNumberOfReminders": "حدد عدد التذكيرات", - "h2oSettings": "إعدادات H20", - "settingsSavedSuccessfully": "تم حفظ الإعدادات بنجاح", - "yourName": "اسمك", - "ageYears": "العمر (11-120) سنة", - "numberOfRemindersInADay": "عدد التذكيرات في اليوم", - "medications": "الأدوية", - "someRemarksAboutPrescription": "ستجدون هنا بعض الملاحظات حول الوصفة الطبية", - "notifyMeBeforeConsumptionTime": "أبلغني قبل وقت الاستهلاك", - "noMedicationsToday": "لا أدوية اليوم", - "reminders": "تذكيرات", - "reminderAddedToCalendar": "تمت إضافة تذكير إلى التقويم ", - "errorWhileSettingCalendar": "حدث خطأ أثناء ضبط التقويم:{error}", - "instructions": "التعليمات", - "requests": "الطلبات", - "thisWeek": "هذا الأسبوع", - "lastMonth": "الشهر الماضي", - "lastSixMonths": "آخر 6 أشهر", - "selectTime": "حدد الوقت", - "pleaseWaitYouWillBeCalledForVitalSigns": "يرجى الانتظار! سيتم استدعاؤك لقياس العلامات الحيوية", - "pleaseVisitRoomForVitalSigns": "يرجى زيارة الغرفة {roomNumber} لقياس العلامات الحيوية", - "pleaseVisitRoomToTheDoctor": "يرجى زيارة الغرفة {roomNumber} لمقابلة الطبيب", - "erOnlineCheckInRequest": "طلب تسجيل الوصول عبر الإنترنت لقسم الطوارئ", - "indoor": "داخلي", - "navigation": "الملاحة", - "health": "الصحة", - "calculators": "الحاسبات", - "converters": "المحولات", - "guide": "الدليل", - "liveCareServiceDesc": "احصل على استشارة طبية من طبيب متخصص عبر مكالمة فيديو", - "bloodGroup": "فصيلة الدم: {bloodType}", - "medicalServices": "الخدمات الطبية", - "insuranceAndPayments": "التأمين والمدفوعات", - "trackerAndOthers": "المتتبع وأخرى", - "bmi": "مؤشر كتلة الجسم", - "yesPleaseINeedHelp": "نعم، من فضلك أريد المساعدة", - "aiOverView": "AI ملخص", - "generateAiAnalysis": "التحليل باستخدام الذكاء الاصطناعي", - "aiAnalysis": "AI تحليل", - "prediction": "التوقعات", - "prevention": "وقاية", - "disclaimer": "تنصل", - "thisAboveInfo": "المعلومات المذكورة أعلاه مُولّدة بواسطة AI بناءً على نتائج تحاليلك المخبرية، وهي لأغراض إعلامية فقط. لا ينبغي اعتبارها تشخيصًا طبيًا أو خطة علاجية. استشر طبيبك دائمًا للحصول على نصيحة طبية مُخصصة قبل اتخاذ أي قرارات تتعلق بصحتك.", - "aiDisclaimer": "سيتم مشاركة بيانات نتائج تحاليلك المخبرية بشكل آمن مع خدمة الذكاء الاصطناعي لدينا لتحليلها. يساعد هذا في تقديم رؤى صحية مُخصصة. هل ترغب في المتابعة؟", - "consent": "نتائج المختبر", - "bmiNormalDescription": "مؤشر كتلة جسمك ضمن المعدل الصحي. استمر في اتباع نظام غذائي متوازن، وممارسة النشاط البدني بانتظام، وإجراء الفحوصات الدورية للحفاظ على صحة جيدة. راقب أي تغييرات ملحوظة مع مرور الوقت.", - "bmiUnderweightDescription": "يشير مؤشر كتلة الجسم إلى أنك تعاني من نقص الوزن. لذا، يُنصح بزيادة السعرات الحرارية المتناولة من خلال تناول الأطعمة الغنية بالعناصر الغذائية، وممارسة تمارين المقاومة لبناء العضلات، واستشارة أخصائي رعاية صحية للتحقق من وجود أسباب كامنة.", - "bmiOverweightDescription": "يشير مؤشر كتلة الجسم إلى زيادة الوزن. لذا، يُنصح بالسعي إلى إنقاص الوزن تدريجياً وبشكل مستدام من خلال تقليل السعرات الحرارية بشكل معتدل، وممارسة النشاط البدني بانتظام، واختيار الأطعمة الصحية. استشر طبيبك قبل إجراء أي تغييرات جذرية في نمط حياتك.", - "caloriesMaintenanceDescription": "السعرات الحرارية اليومية المُقدَّرة للحفاظ على وزنك الحالي بناءً على مستوى نشاطك ومعدل الأيض لديك. استخدم هذه الكمية كخط أساس: زدها قليلاً لزيادة الكتلة العضلية، أو قللها قليلاً لإنقاص الوزن تدريجياً. تابع تقدمك وعدّل الخطة كل أسبوعين إلى أربعة أسابيع.", - "caloriesModerateDeficitDescription": "نظام غذائي معتدل لتقليل السعرات الحرارية مصمم لإنقاص الوزن بشكل ثابت ومستدام (عادةً من 0.25 إلى 0.5 كيلوغرام أسبوعيًا). يُنصح بدمجه مع تمارين المقاومة وتناول كمية كافية من البروتين للحفاظ على الكتلة العضلية. تجنب التخفيضات الحادة في السعرات الحرارية واستشر طبيبًا مختصًا إذا كنت تعاني من أي حالة صحية.", - "caloriesAggressiveDeficitDescription": "يؤدي خفض السعرات الحرارية بشكل كبير إلى فقدان الوزن بشكل أسرع، ولكنه قد يصعب الاستمرار عليه ويزيد من خطر نقص العناصر الغذائية والإرهاق وفقدان الكتلة العضلية. لا يُنصح باتباعه على المدى الطويل؛ استشر طبيبًا أو أخصائي تغذية قبل الاستمرار.", - "bodyFatEssentialDescription": "نسبة الدهون في جسمك ضمن النطاق الأساسي/الرياضي. هذا المستوى شائع لدى الرياضيين ويشير إلى انخفاض نسبة الدهون في الجسم. مع أن هذا قد يكون مثاليًا للأداء، تأكد من الحفاظ على تغذية سليمة ووظائف هرمونية متوازنة. استشر طبيبًا إذا شعرت بالتعب، أو واجهت مشاكل هرمونية، أو أي مخاوف صحية أخرى.", - "bodyFatFitnessDescription": "نسبة الدهون في جسمك ضمن النطاق الصحي. وهذا يدل على مستوى صحي من الدهون في الجسم يرتبط بلياقة بدنية جيدة. حافظ على نمط حياتك الحالي، بما في ذلك ممارسة الرياضة بانتظام واتباع نظام غذائي متوازن، للحفاظ على هذا المستوى الصحي.", - "bodyFatAverageDescription": "نسبة الدهون في جسمك ضمن المعدل الطبيعي/المقبول، وهي نسبة تُعتبر صحية لعموم الناس. لتحسين تكوين جسمك، يُنصح بممارسة تمارين القوة، وتمارين القلب والأوعية الدموية، واتباع نظام غذائي متوازن. ركّز على التغييرات التدريجية والمستدامة للحفاظ على صحتك على المدى الطويل.", - "bodyFatObeseDescription": "نسبة الدهون في جسمك أعلى من المعدل الصحي الموصى به. قد يزيد هذا من المخاطر الصحية، بما في ذلك أمراض القلب والأوعية الدموية، والسكري، ومشاكل المفاصل. يُنصح باستشارة طبيب أو أخصائي تغذية معتمد لوضع خطة علاجية شخصية تشمل التغذية المتوازنة، والنشاط البدني المنتظم، وتعديلات نمط الحياة لتحقيق إدارة مستدامة للوزن.", - "bmrNormalDescription": "معدل الأيض الأساسي لديك ضمن النطاق المتوقع لحالتك. معدل الأيض الأساسي هو الطاقة التي يحتاجها جسمك في حالة الراحة للحفاظ على وظائفه الحيوية (التنفس، الدورة الدموية، درجة الحرارة). استخدم هذه القيمة كأساس لتقدير إجمالي احتياجاتك اليومية من الطاقة من خلال تطبيق مُعامل النشاط. حافظ على نظام غذائي متوازن وممارسة النشاط البدني بانتظام لدعم صحة التمثيل الغذائي.", - "bmrLowDescription": "معدل الأيض الأساسي لديك أقل من المعدل الطبيعي لحالتك. تشمل الأسباب المحتملة انخفاض كتلة العضلات، أو تراجع التمثيل الغذائي المرتبط بالتقدم في السن، أو التكيف الأيضي الناتج عن تقييد السعرات الحرارية لفترة طويلة. يُنصح بالتركيز على تمارين المقاومة لبناء العضلات والحفاظ عليها، والتأكد من تناول كميات كافية من البروتين والمغذيات الدقيقة، واستشارة أخصائي رعاية صحية إذا كان هذا الأمر غير متوقع.", - "bmrHighDescription": "معدل الأيض الأساسي لديك أعلى من المتوسط ​​بالنسبة لحالتك. قد يعكس هذا زيادة في كتلة العضلات، أو صغر السن، أو ارتفاع معدل الأيض لديك بشكل طبيعي، مما يعني أنك تحرق طاقة أكبر أثناء الراحة. استخدم هذه المعلومات لتحديد احتياجاتك من السعرات الحرارية: احتياجات أعلى للحفاظ على الوزن أو بناء العضلات، ونقص معتدل في السعرات الحرارية لإنقاص الوزن. استشر طبيبك إذا لاحظت أي تغيرات سريعة غير مبررة.", - "ibwAtTargetDescription": "وزنك في النطاق المثالي. حافظ على عاداتك الحالية — نظام غذائي متوازن ونشاط بدني منتظم — للاستمرار على هذا المستوى.", - "ibwBelowTargetDescription": "أنتِ أقل من الوزن المثالي بمقدار {kg} كجم. يُنصح بزيادة الوزن تدريجيًا من خلال فائضٍ بسيط في السعرات الحرارية، وتناول أطعمة غنية بالعناصر الغذائية، مع ممارسة تمارين المقاومة.", - "ibwAboveTargetDescription": "أنتِ أعلى من الوزن المثالي بمقدار {kg} كجم. يُنصح باتباع خفضٍ تدريجي ومستدام للوزن من خلال عجزٍ معتدل في السعرات الحرارية، وزيادة مستوى النشاط البدني، واتباع تغذية متوازنة.", - "ibwCloseToRangeDescription": "وزنك قريب من النطاق المثالي. حافظ على نظام غذائي متوازن ونشاط بدني منتظم، مع اتباع إرشادات شخصية من مختص صحي عند الحاجة.", - "ibwUnderweightDescription": "أنت أقل من الوزن المثالي بمقدار {kg} كجم. ركّز على زيادة السعرات الحرارية من خلال أطعمة غنية بالعناصر الغذائية، وأعط الأولوية للبروتين وتمارين المقاومة لبناء كتلة صحية، مع اتباع إرشادات شخصية من مختص صحي.", - "ibwUnderweightGenericDescription": "يبدو أنكِ أقل من الوزن المثالي. يُنصح بزيادة السعرات الحرارية من خلال أطعمة غنية بالعناصر الغذائية وممارسة تمارين المقاومة؛ مع الحصول على استشارة مختص صحي عند الحاجة.", - "ibwOverweightDescription": "أنت أعلى من الوزن المثالي بمقدار {kg} كجم. يُنصح باتباع استراتيجية تدريجية ومستدامة لفقدان الوزن — من خلال عجزٍ معتدل في السعرات الحرارية، وممارسة نشاط بدني منتظم، وتغذية متوازنة. يُفضّل استشارة مختص صحي قبل إجراء تغييرات كبيرة.", - "ibwOverweightGenericDescription": "يبدو أنك أعلى من الوزن المثالي. يُنصح باتباع عجزٍ تدريجي ومستدام في السعرات الحرارية مع ممارسة النشاط البدني واتباع تغذية متوازنة؛ مع الحصول على استشارة مختص صحي عند الحاجة.", - "dietVeryLowCarbsDescription": "نهج منخفض الكربوهيدرات جدًا (الكيتوني): تقليل الكربوهيدرات إلى الحد الأدنى مع زيادة الدهون وبروتين معتدل. قد يساعد على فقدان الوزن بسرعة وتحسين التحكم في سكر الدم لدى بعض الأشخاص، لكنه قد يكون صعب الاستمرار عليه وقد يسبب نقصًا في بعض العناصر الغذائية. يجب مراقبة الترطيب ، والحصول على استشارة مختص صحي عند استخدامه لفترة طويلة.", - "dietLowCarbsDescription": "خطة منخفضة الكربوهيدرات وعالية البروتين: تقليل الكربوهيدرات مع زيادة البروتين لدعم الشعور بالشبع والحفاظ على الكتلة العضلية. مفيدة لإدارة الوزن وضبط سكر الدم عند موازنتها مع الخضروات والدهون الصحية. احرص على الحصول على كمية كافية من الألياف والعناصر الدقيقة (الفيتامينات والمعادن).", - "dietModerateCarbsDescription": "تناول معتدل للكربوهيدرات مع توازن في البروتين والدهون: يوفر طاقة مستقرة للأنشطة اليومية والتمارين مع قدر من المرونة. مناسب لكثير من الأشخاص الذين يسعون لإدارة وزن مستدامة وتحسين الأداء.", - "dietUSDAGuidelinesDescription": "نمط متوازن مستند إلى (USDA): يركز على الفواكه والخضروات والحبوب الكاملة والبروتينات قليلة الدهن، مع الحد من السكريات المضافة والدهون المشبعة. يُعد إطارًا قائمًا على الأدلة لدعم الصحة العامة، وكفاية العناصر الغذائية، والوقاية من الأمراض المزمنة.", - "dietZoneDietDescription": "حمية الزون (~40٪ كربوهيدرات / 30٪ بروتين / 30٪ دهون): تركز على التوازن الهرموني وضبط الحصص الغذائية. قد تُحسّن تركيب الجسم ومستوى الطاقة لدى بعض الأشخاص، لكنها تتطلب تخطيطًا جيدًا؛ ويُفضّل تخصيصها بالتعاون مع مختص تغذية.", - "contextDependent": "يعتمد السياق", - "calculatedValue": "القيمة المحسوبة", - "calculationFormula": "صيغة الحساب", - "confirmYourLocation": "قم بتأكيد موقعك", - "confirmYourLocationDesc": "يرجى تأكيد موقعك الحالي لعرض الاتجاهات المناسبة.", - "insideHospital": "أنا داخل المستشفى", - "outsideHospital": "أنا خارج المستشفى", - "servicePriceList": "قائمة أسعار الخدمات", - "servicePriceListDesc": "توضح قائمة أسعار الخدمات أدناه رسوم الخدمات الصحية المقدمة للمرضى بنظام الدفع النقدي. أما فيما يتعلق بالخدمات المشمولة بالتأمين، فسيتم تطبيق التغطية التأمينية والتحقق من الأهلية واحتساب نسب التحمل وفقًا لشروط وثيقة التأمين وجدول المنافع المعتمد لكل شركة تأمين.", - "servicePriceListRights": "يحق للمريض الحصول على متابعة مجانية في غضون 14 يومًا من الزيارة الأولى", - "serviceName": "اسم الخدمة", - "noFreeSlot": "لا توجد مواعيد متاحة في التاريخ المحدد. يرجى اختيار تاريخ آخر أو إعادة المحاولة لاحقاً.", - "noThanksIKnowTheClinic": "لا، شكراً. أنا أعرف العيادة.", - "unableToSendOTP": "تعذر إرسال رمز التحقق لمرة واحدة", - "loadingAIAnalysis": "نقوم بتحليل نتائجك، يرجى التحلي بالصبر والسماح للذكاء الاصطناعي بالقيام بالمهمة، قد يستغرق هذا بعض الوقت.", - "symptoms": "أعراض", - "insuranceInActive": "التأمين غير نشط", - "insuranceInActiveContactSupport": "لديك تأمين ساري المفعول، ولكنه غير مُفعّل حاليًا في مجموعة حبيب الطبية. يُرجى التواصل مع خدمة عملاء مجموعة حبيب الطبية.", - "updateAppNow": "تحديث التطبيق الآن", - "Dr": "الدكتور.", - "reschedulingAppo": "إعادة جدولة الموعد، يرجى الانتظار...", - "invalidEligibility": "لا يمكنك إجراء الدفع عبر الإنترنت لأنك غير مؤهل لاستخدام الخدمة المقدمة.", - "invalidInsurance": "لا يمكنك إجراء الدفع عبر الإنترنت لأنه ليس لديك تأمين صالح.", - "continueCash": "متابعة الدفع نقدًا", - "applewatch": "ساعة آبل", - "applehealthapplicationshouldbeinstalledinyourphone": "يجب تثبيت تطبيق Apple Health على هاتفك", - "unabletodetectapplicationinstalledpleasecomebackonceinstalled": "لا يمكننا اكتشاف التطبيق المثبت على جهازك. يرجى العودة إلى هنا بمجرد تثبيت هذا التطبيق.", - "applewatchshouldbeconnected": "يجب توصيل ساعة آبل", - "samsungwatch": "ساعة سامسونج", - "samsunghealthapplicationshouldbeinstalledinyourphone": "يجب تثبيت تطبيق Samsung Health على هاتفك", - "samsungwatchshouldbeconnected": "يجب توصيل ساعة سامسونج", - "huaweiwatch": "ساعة هواوي", - "huaweihealthapplicationshouldbeinstalledinyourphone": "يجب تثبيت تطبيق Huawei Health على هاتفك", - "huaweiwatchshouldbeconnected": "يجب توصيل ساعة هواوي", - "whoopwatch": "ساعة Whoop", - "whoophealthapplicationshouldbeinstalledinyourphone": "يجب تثبيت تطبيق Whoop Health على هاتفك", - "whoopwatchshouldbeconnected": "يجب توصيل ساعة Whoop", - "updatetheinformation": "سيتيح ذلك جمع أحدث المعلومات من ساعة آبل الخاصة بك", - "timeFor": "الوقت", - "hmgPolicies": "سياسات مجموعة الحبيب الطبية", - "darkMode": "المظهر الداكن", - "featureComingSoonDescription": "هذه الميزة ستتوفر قريباً. نحن نعمل جاهدين لإضافة ميزات أكثر تميزاً إلى التطبيق. انتظرونا لمتابعة التحديثات.", - "generateAiAnalysisResult": "قم بإجراء تحليل لهذا المختبر AI", - "ratings": "التقييمات", - "hmgPharmacyText": "صيدلية الحبيب، المتجر الصيدلاني الإلكتروني المتكامل الذي تقدمه لكم مجموعة خدمات الدكتور سليمان الحبيب الطبية.", - "insuranceRequestSubmittedSuccessfully": "تم إرسال طلب تحديث بيانات التأمين بنجاح. سيتم إعلامك بمجرد الانتهاء.", - "updatingEmailAddress": "جارٍ تحديث عنوان البريد الإلكتروني، يرجى الانتظار...", - "verifyInsurance": "التحقق من التأمين", - "tests": "تحاليل", - "calendarPermissionAlert": "يرجى منح إذن الوصول إلى التقويم من إعدادات التطبيق لضبط تذكير تناول الدواء.", - "sortByNearestLocation": "فرز حسب الأقرب إلى موقعك", - "giveLocationPermissionForNearestList": "يرجى منح إذن الوصول إلى الموقع من إعدادات التطبيق لعرض أقرب المواقع.", - "sortByLocation": "الترتيب حسب الموقع", - "timeForFirstReminder": "وقت التذكير الأول", - "reminderRemovalNote": "يمكنك إزالتها من التقويم الخاص بك لاحقاً عن طريق إيقاف تشغيل التذكير", - "communicationLanguage": "لغة التواصل", - "cmcServiceHeader": "فحص صحي شامل: تشخيص متقدم، معلومات صحية مفصلة", - "cmcServiceDescription": "احصل على معلومات تفصيلية عن صحتك من خلال خدمات التشخيص المتقدمة لدينا. افهم جسمك بشكل أفضل لمستقبل صحي.", - "eReferralServiceHeader": "نظام الإحالة الإلكترونية في مستشفى حبيب: تبسيط عملية إحالة المرضى", - "eReferralServiceDescription": "نُسهّل عملية نقل المرضى بسلاسة إلى مستشفى حبيب من خلال نظام الإحالة الإلكترونية الآمن لدينا. نضمن استمرارية الرعاية لكل مريض.", - "bloodDonationServiceHeader": "تبرع بالدم، أنقذ الأرواح. تبرعك يُحدث فرقاً.", - "bloodDonationServiceDescription": "تبرّع بالدم، وأنقذ الأرواح. تبرعك يبعث الأمل. انضم لحملة التبرع بالدم وكن شريان حياة للمحتاجين. كل قطرة تُحدث فرقًا!", - "healthTrackersServiceHeader": "تتبّع مؤشراتك الحيوية بسهولة ويسر", - "healthTrackersServiceDescription": "أدخل بياناتك لمراقبة معدل ضربات القلب وضغط الدم بشكل مستمر، بالإضافة إلى ملخصات دقيقة لأنشطتك اليومية. ابقَ على اطلاع وحسّن صحتك بسهولة.", - "waterConsumptionServiceHeader": "حافظ على رطوبتك، حافظ على صحتك. تتبع كمية الماء التي تشربها يومياً بكل سهولة.", - "waterConsumptionServiceDescription": "أروِ عطشك، وتابع صحتك. راقب كمية الماء التي تتناولها يومياً بكل سهولة باستخدام تطبيقنا سهل الاستخدام، مما يضمن لك الترطيب الأمثل والصحة الجيدة.", - "smartWatchServiceHeader": "قم بمزامنة ساعتك الذكية مع تطبيقات الصحة", - "smartWatchServiceDescription": "قم بتوصيل ساعتك الذكية بسلاسة بتطبيقنا الصحي لتتبع البيانات بسهولة والحصول على رؤى شخصية.", - "liveChatServiceHeader": "مساعدة الخبراء على مدار الساعة طوال أيام الأسبوع\n\nمساعدة", - "liveChatServiceDescription": "هل تحتاج إلى مساعدة؟ تتيح لك خدمة الدردشة المباشرة لدينا التواصل مع فريق دعم الخبراء للإجابة على أي أسئلة لديك حول الميزات أو الإعدادات أو استكشاف الأخطاء وإصلاحها.", - "emergencyServiceHeader": "تسجيل الوصول إلى قسم الطوارئ، أسرع من أي وقت مضى. اتصل بالإسعاف / فريق الاستجابة السريعة على الفور", - "emergencyServiceDescription": "هل تواجه حالة طبية طارئة؟ سيارات الإسعاف وفرق الاستجابة السريعة لدينا جاهزة على مدار الساعة. بالإضافة إلى ذلك، يمكنك تسجيل دخولك إلى قسم الطوارئ بسرعة لتلقي رعاية أسرع.", - "homeHealthCareServiceHeader": "صحتك، في أبهى صورها. رعاية فائقة الجودة، تصلك إلى عتبة دارك.", - "homeHealthCareServiceDescription": "نقدم لكم رعاية صحية عالية الجودة تصلكم إلى عتبة منزلكم. ممرضات ذوات خبرة يقدمون رعاية حانية في راحة منزلكم.", - "profileOnlyText": "الملف الشخصي", - "information": "معلومات الطبيب", - "noFavouriteDoctors": "ليس لديك أي قائمة مفضلة حتى الآن", - "addDoctors": "إضافة الأطباء", - "favouriteList": "قائمة المفضلة", - "later": "لاحقاً", - "cancelAppointmentConfirmMessage": "هل أنت متأكد من رغبتك في إلغاء هذا الموعد؟", - "acknowledged": "معترف به", - "searchLabResults": "بحث نتائج المختبر", - "callForAssistance": "اتصل للحصول على المساعدة الفورية", - "oneWaySubtitle": "نقل من الموقع إلى المستشفى", - "twoWaySubtitle": "نقل من الموقع إلى المستشفى والعودة مرة أخرى", - "toHospitalSubtitle": "نقل من موقعك الحالي إلى المستشفى", - "fromHospitalSubtitle": "نقل من المستشفى إلى منزلك", - "clinicSchedule": "جدول العيادة", - "doctorAddedToFavourite": "تمت إضافة إلى قائمة المفضلة", - "doctorRemovedFromFavourite": "تمت إزالة من قائمة الأطباء المفضلين", - "addNewFavorite": "إضافة مفضلة جديدة", - "favourites": "المفضلة", - "pendingAncillaryOrders": "مدفوعات طلبات الاضافية", - "liveCarePermissions": "يتطلب لايف كير أذونات الكاميرا والميكروفون وإشعارات، يرجى السماح لها بالمتابعة.", - "containsImage": "يحتوي على صورة", - "servicesSelected": "الخدمة (الخدمات) المختارة", - "selectMedicalFileFromFamily": "اختر ملف طبي من عائلتك", - "anyFileFromHMG": "أي ملف طبي نشط من مجموعة حبيب الطبية", - "noDistance": "المسافة غير متوفرة", - "enterAmount": "يرجى إدخال المبلغ للمتابعة.", - "selectHospitalContinue": "يرجى اختيار المستشفى للمتابعة.", - "year": "سنة", - "notifyPrescription": "أبلغني قبل وقت الاستهلاك", - "doctorRatingAppointment": "طبيب\nتصنيف", - "ratingSubmitted": "تم إرسال التقييم", - "rateTheDoctor": "يرجى تقييم الطبيب", - "downloadInvoice": "تحميل الفاتورة", - "approvalDetails": "تفاصيل الموافقة", - "obese": "سمين", - "overWeight": "وزن زائد", - "underWeight": "وزن ناقص", - "nearestGate": "أقرب بوابة", - "RRTDDetails": "فريق الاستجابة السريعة يقوم بتقديم رعاية صحية متكاملة لجميع الحالات الطارئة و المستقرة، الخدمة تشمل جميع الأعمار بما في ذلك حالات الأطفال.", - "normalMapType": "افتراضي", - "satelliteMapType": "قمر صناعي", - "terrainMapType": "تضاريس", - "hybridMapType": "هجين", - "openCamera": "افتح الكاميرا", - "openGallery": "افتح المعرض", - "openFiles": "فتح الملفات", - "generateAiAnalysisRadResult": "بإنشاء تحليل الذكاء الاصطناعي لهذا التقرير", - "grantLocationPermission": "يرجى منح إذن الوصول إلى الموقع من إعدادات التطبيق للحصول على نتائج أفضل.", - "NoBookedAppointments": "لا توجد مواعيد محجوزة", - "aiDisclaimerRad": "سيتم مشاركة بيانات نتائج الأشعة الخاصة بك بشكل آمن مع محلل الذكاء الاصطناعي لدينا لتحليلها. يساعد هذا في توفير رؤى صحية مخصصة. هل ترغب في المتابعة؟", - "imageSizeTooLarge": "حجم الصورة كبير جداً. الحد الأقصى للحجم هو 1 ميجابايت", - "profileImageUpdatedSuccessfully": "تم تحديث صورة الملف الشخصي بنجاح", - "failedToProcessImage": "فشل في معالجة الصورة. يرجى المحاولة مرة أخرى", - "cameraGalleryPermissionMessage": "مطلوب إذن الكاميرا والمعرض لتحميل صورة الملف الشخصي. يرجى منح الأذونات من إعدادات التطبيق.", - "cameraGalleryPermissionRequired": "مطلوب أذونات الكاميرا والمعرض", - "cameraPermissionMessage": "مطلوب إذن الكاميرا لالتقاط الصور. يرجى منح الإذن من إعدادات التطبيق.", - "cameraPermissionRequired": "مطلوب إذن الكاميرا", - "galleryPermissionMessage": "مطلوب إذن المعرض لتحديد الصور. يرجى منح الإذن من إعدادات التطبيق.", - "galleryPermissionRequired": "مطلوب إذن المعرض", - "failedToCheckPermissions": "فشل في التحقق من الأذونات. يرجى المحاولة مرة أخرى", - "takePhotoWithCamera": "التقط صورة بالكاميرا", - "selectFromPhotoLibrary": "اختر من مكتبة الصور", - "selectDocumentFiles": "اختر ملفات المستندات", - "profilePicture": "صورة الملف الشخصي", - "sendingAskDrRequest": "جارٍ إرسال الطلب...", - "askDrRequestSentSuccess": "تم إرسال الطلب بنجاح، وسيتواصل معك الطبيب قريباً.", - "onlineCheckIn24HoursOnly": "لا تتوفر خدمة تسجيل الوصول عبر الإنترنت إلا خلال 4 ساعات من موعد الحجز.لا تتوفر خدمة تسجيل الوصول عبر الإنترنت إلا خلال 4 ساعات من موعد الحجز." -}; -static const Map _en_US = { - "english": "English", - "arabic": "Arabic", - "login": "Login", - "noDataAvailable": "No Data Available", - "noRatingAvailable": "No Rating Available", - "doctorDoesNotHaveRating": "This doctor does not have any ratings yet.", - "confirm": "Confirm", - "loadingText": "Loading, please wait...", - "kilometerUnit": "KM", - "dashboardScreenToolbarTitle": "Home", - "settings": "Settings", - "language": "App Language", - "lanEnglish": "English", - "lanArabic": "العربية", - "cancel": "Cancel", - "done": "Done", - "replay2": "Replay", - "home": "Home", - "services": "SERVICES", - "mySchedule": "My Schedule", - "logout": "Logout", - "respirationRate": "Respiration Rate", - "bookAppo": "Book Appointment", - "searchBy": "Search By:", - "clinic": "Clinic", - "byClinic": "By Clinic", - "hospital": "Hospital", - "byHospital": "By Hospital", - "name": "Name", - "doctor": "Doctor", - "clinicName": "Clinic Name", - "hospitalName": "Hospital Name", - "noClinicFound": "No Clinic Found", - "doctorName": "Doctor Name", - "nearestAppo": "Nearest Appointment", - "searchByDocText": "Type the name of the doctor to help you find him", - "enterDocName": "Enter Doctor name", - "search": "Search", - "noResultFound": "No Result Found", - "noSearchResultFound": "No Result Found", - "pleaseEnterProductName": "Please Enter Product Name", - "bookNow": "Book Now", - "docInfo": "Doctor Information", - "appoInfo": "Appointment Information", - "availableAppo": "Available Appointments", - "gender": "Gender", - "nationality": "Nationality", - "neverWait": "Never wait in queue", - "reminderTitle": "You have appointment with Dr. ", - "appointmentCalendar": "Would you like to set a reminder for this appointment in your calendar?", - "appointmentSuccess": "Appointment is successfully booked", - "docQualifications": "Doctor Qualifications", - "pressAgain": "Press again to exit the app", - "laserMaxLimitReach": "Maximum limit is 90 minutes", - "confirmAppoHeading": "Kindly review your Appointment", - "patientInfo": "Patient Information", - "doctorFilter": "Doctors will be filtered based on your gender and age", - "bookSuccess": "Book Success", - "patientShare": "Patient Share", - "patientShareWithTax": "Patient Share with Tax", - "confirmAppo": "Confirm Appointment", - "confirmLiveCare": "Confirm LiveCare", - "waitingForDoctor": "Waiting for doctor", - "appointment": "Appointment", - "confirmLater": "Confirm Later", - "todoList": "Todo List", - "appoActions": "Appointment Actions", - "date": "Date", - "time": "Time", - "pendingPayment": "Pending for payment", - "payNow": "Payment", - "viewQR": "View QR Code", - "instruction": "Instructions", - "livecare": "LiveCare", - "livecareAppo": "LiveCare Appointment", - "agreeTo": "I agree to the", - "termsConditoins": "Terms and Conditions", - "cancelAppoMsg": "Are you sure you want to cancel this appointment?", - "changePayment": "Change Payment Method", - "upcomingNoAction": "No Action Required", - "upcomingConfirm": "Please confirm the appointment to avoid cancellation", - "bookSuccessConfirmMore2412": "The online payment process will be available 24 hours before the appointment.", - "upcomingPaymentPending": "Online Payment will be Activated before 24 Hours of Appointment Time", - "upcomingPaymentNow": "Pay Online now to avoid long waiting queue", - "upcomingQR": "Use the QR Code to Check-In in hospital", - "upcomingVirtual": "This is a virtual appointment, Please adhere to the instructions for a seamless experience.", - "upcomingLivecare": "This is a LiveCare appointment", - "upcomingDetails": "More Details", - "reschedule": "Reschedule", - "raise": "Raise", - "complaint": "Complaint", - "add": "Add", - "reminder": "Reminder", - "location": "Locations", - "online": "Online", - "payment": "Payment", - "onlinePayment": "Online", - "onlinePaymentSubtitle": "Payment", - "cancelNocaps": "Cancel", - "setReminder": "Set Reminder", - "nationalIdNumber": "National ID Number", - "medicalFileNumber": "Medical File Number", - "loginregister": "Login / Register", - "poweredBy": "Powered by", - "welcome": "Welcome", - "welcomeToDrSulaiman": "Welcome to Dr. Sulaiman Al Habib Medical Group", - "patientApp": "Patient App", - "welcomeText": "Dr. Sulaiman Al Habib Mobile Application", - "drSulaimanText": "Dr. Sulaiman Al Habib", - "welcomeText2": "Have you previously visited the hospitals or medical centers of Dr. Sulaiman Al Habib?", - "yes": "Yes", - "no": "No", - "logintyperadio": " Choose from the below options to login to your medical file.", - "registernow": "Register Now", - "nationalID": "Enter the Identification Number", - "nationalId": "National ID", - "fileNo": "File Number", - "fileno": "File No", - "forgotFileNo": "Forgot file Number?", - "forgotFileNoTitle": "Forgot medical file", - "enterNationalId": "Please enter mobile number and identification number", - "profileInfo": "Please enter profile information", - "submit": "Submit", - "forgotDesc": "Enter the mobile number to receive the Medical File Number via SMS", - "dob": "Birth Date:", - "hijriDate": "Hijri Date", - "gregorianDate": "Gregorian Date", - "verifyLoginWith": "Please choose one of the following options to verify", - "registerUser": "Register", - "verifyWithFingerprint": "Biometric", - "verifyWithFaceid": "Face ID", - "verifyWithSms": "SMS", - "verifyWithWhatsapp": "Whatsapp", - "verifyThrough": "Verify Through", - "lastLogin": "LAST LOGIN AT:", - "lastLoginWith": "VERIFICATION TYPE:", - "verifyFingerprint": "To activate the fingerprint login service, please verify data by using one of the following options.", - "searchMedicine": "Search Medicine", - "pharmaciesList": "Pharmacies List", - "searchMedicineHere": "Search Medicine Here", - "description": "Description", - "howToUse": "How to Use", - "price": "Price", - "youCanFindItIn": "You can find it in", - "pleaseEnterMedicineName": "Please Enter Medicine Name", - "verificationMessage": "Please enter the Verification Code sent to", - "validationMessage": "The verification code expires in", - "notification": "Notifications", - "appSettings": "App Settings", - "rateApp": "Rate Our App", - "before": "Before", - "minute": "Minutes", - "hour": "Hour", - "reminderSuccess": "The reminder has been added successfully", - "reminderCancelSuccess": "The reminder has been cancelled successfully", - "patientShareToDo": "Amount before tax: ", - "patientTaxToDo": "Tax amount: ", - "patientShareTotalToDo": "Total amount due: ", - "paymentMethod": "Payment Method", - "noNeedToWaitInLine": "No need to stand in line.", - "useQRAppoAttend": "Use the QR code to register the appointment attendance.", - "passQRAppoAttend": "Pass the QR code through the attendance devices available in the Hospital.", - "sitWaitingQR": "Sit in the waiting rooms until called by the nurse.", - "attendRegisterCode": "Attendance registration code", - "scanQRHospital": "Approach the Online Check-In board in the hospital & scan via NFC or QR Code to Check-In", - "scanNFC": "Scan NFC to Check-In", - "sendEmail": "Send Email", - "success": "Done successfully", - "emailSentSuccessfully": "Email Sent Successfully", - "emailSentError": "Error Sending Email", - "close": "Close", - "closeIt": "Close", - "booked": "Booked", - "confirmed": "Confirmed", - "arrived": "Arrived", - "payNowBookSuccess": "Pay now via Al Habib App", - "payNowBookSuccesstext1": "Pay Now using online payment service from secure payment gateways", - "payNowBookSuccesstext2": "You can also Pay Later via online payment or in Hospital", - "payLater": "Pay Later", - "askDocNotAllowed": "This service will be available for last 15 days’ doctor Visit only", - "moreVerify": "More Verification Options", - "welcomeBack": "Welcome back!", - "accountInfo": "Would you like to login with current username?", - "anotherAcc": "Use Another Account", - "next": "Next", - "firstName": "First Name", - "middleName": "Middle Name", - "lastName": "Last Name", - "female": "Female", - "male": "Male", - "preferredLanguage": "Preferred Language", - "locationsRegister": "Where do you want to create this file?", - "ksa": "KSA", - "dubai": "Dubai", - "enterEmail": "Please Enter Email", - "family": "My Family", - "familyTitle": "My Family Files", - "familyTitle2": "My Family Files", - "addNewMember": "Add Family Member", - "sentRequests": "Sent Requests", - "recievedRequests": "Recieved Requests", - "manageFiles": "Manage Family Files", - "oxygenation": "Oxygenation", - "bodyMeasurements": "body Mass Index", - "temperature": "Temperature", - "pulse": "Pulse", - "respiration": "Respiration", - "bloodPressure": "Blood Pressure", - "painScale": "Pain Scale", - "weight": "Weight", - "height": "Height", - "heart": "Heart Rate", - "heightUnit": "height unit", - "weightUnit": "Weight Unit", - "unit": "Unit", - "request": "Request", - "memberName": "Member Name", - "switchLogin": "Switch", - "removeMember": "Remove", - "allowView": "Allow", - "rejectView": "Reject", - "deleteView": "Delete", - "myFamily": "MY FAMILY", - "approvals": "Approvals", - "approvalNo": "Approval No:", - "companyName": "Company Name:", - "receiptOn": "Receipt on:", - "expiryDate": "Expiry Date:", - "expiryPoints": "Expired", - "expiryOn": "Expiry on:", - "procedureName": "Procedure Name:", - "procedure": "Procedure", - "procedureStatus": "Procedure Status: ", - "usageStatus": "Usage Status", - "unusedCount": "Unused Count:", - "totalApproval": "Total approval unused", - "category": "Category: ", - "expirationDate": "Expiration Date: ", - "patientCard": "Patient Card ID: ", - "policyNumber": "Policy Number: ", - "seeDetails": "SEE DETAILS", - "insuranceCards": "Insurance Cards", - "requestType": "Request Type", - "registerInfoFamily": "How would like to add the new member?", - "removeFamilyMember": "Remove this member?", - "myMedicalFile": "My Medical File", - "myMedicalFileSubTitle": "All your medical records", - "viewMore": "View More", - "homeHealthCareService": "Home Health Care Service", - "onlinePharmacy": "Online Pharmacy", - "emergencyService": "Emergency Service", - "onlinePaymentService": "Online Payment Service", - "offersAndPackages": "Online transfer request", - "comprehensiveMedicalCheckup": "Comprehensive Medical Check-up", - "hmgService": "HMG Service", - "viewAllHabibMedicalService": "View All Habib Medical Service", - "viewAll": "View All", - "view": "View", - "contactUs": "Contact Us", - "contactUsLocation": "P.O.Box: 91877 - Riyadh 11643, King Fahad Road - Olaya - Kingdom of Saudi Arabia", - "contactUsTime": "Saturday - Wednesday 8:00 AM - 10 PM, Thursday 8:00 AM- 8:00 PM, Friday 2:00 PM - 8:00 PM", - "viewAllWaysReachUs": "View All Ways Reach Us", - "medicalProfile": "Medical Profile", - "consultation": "Consultation", - "logs": "Logs", - "textToSpeech": "How May I Help You?", - "locationDialogMessage": "Allow the HMG app to access your location will assist you in showing the hospitals according to the nearest to you.", - "userViewRequester": "User Wants to View Your Medical File", - "userView": "User Can View Your Medical File", - "parking": "Parking", - "alhabiServices": "HMG Service", - "parkingTitle": "Car service, car service, service to save parking information, return to it later, 1- By clicking on (Read the code), save the parking data. 2- By clicking on the button (view my car park), it shows you the car’s location in Google Maps. 3- Read another position by pressing the Clear Position Data button.", - "parkingDescription": "Parking service is for you to scan the car location so you can find it easy on you way out. click on (scan parking) button to save the parking location, then (show my park) button will appear to show you the way for the parking. if you want to rescan parking QR just click on (Clear My Data).", - "appointments": "Appointments", - "all2": "All", - "checkinOption": "Check-In", - "readBarcode": "Read Barcode", - "showMyPark": "Show My Park", - "clearMyData": "Clear My Data", - "floor": "Floor:", - "gate": "Gate:", - "building": "Building:", - "branch": "Branch:", - "emergencyServices": "Emergency Services", - "nearester": "Nearest ER", - "locationa": "Location", - "callNow": "Call now", - "ambulancerequest": "Ambulance", - "requestA": "Request", - "noBookedAppointments": "No Booked Appointments", - "noConfirmedAppointments": "No Confirmed Appointments", - "noArrivedAppointments": "No Arrived Appointments", - "myAppointmentsList": "Appointments", - "myAppointments": "My", - "radiology": "Radiology", - "radiologySubtitle": "Result", - "lab": "Lab", - "labSubtitle": "Results", - "medicines": "Medicines", - "medicinesSubtitle": "Prescriptions", - "vitalSigns": "Vital Signs", - "vitalSignsSubTitle": "Reports", - "vitalSignNormal": "Normal", - "vitalSignLow": "Low", - "vitalSignHigh": "High", - "vitalSignObese": "Obese", - "vitalSignOverweight": "Overweight", - "vitalSignUnderweight": "Underweight", - "vitalSignSkinny": "Underweight", - "myMedical": "Active", - "myMedicalSubtitle": "Medications", - "myDoctor": "My Doctors", - "myDoctorSubtitle": "List", - "myDoctorSubtitle2": "List", - "eye": "Eye", - "eyeSubtitle": "Measurement", - "insurance": "Insurance", - "insuranceSubtitle": "Card", - "updateInsurance": "Update", - "updateInsuranceSubtitle": "Insurance", - "insuranceApproval": "Insurance", - "insuranceApprovalSubtitle": "Approvals", - "allergies": "Allergies", - "allergiesSubtitle": "List", - "myVaccines": "My Vaccines", - "myVaccinesSubtitle": "List", - "medical": "Medical", - "medicalSubtitle": "Report", - "monthly": "Monthly", - "monthlySubtitle": "Report", - "sick": "Sick", - "sick2": "Sick", - "sickSubtitle": "Leaves", - "myBalance": "My Balance", - "myBalanceSubtitle": "Credit", - "patientCall": "Patient Call", - "patientCallSubtitle": "Service", - "smartWatches": "Smart Watches", - "smartWatchesSubtitle": "Pairing", - "myTrackers": "My Trackers", - "myTrackersSubtitle": "Service", - "askYour": "Ask Your", - "askYourSubtitle": "Doctor", - "internet": "Internet", - "internetSubtitle": "Pairing", - "chatbot": "Chatbot", - "chatbotSubtitle": "", - "timeLine": "Timeline", - "labOrders": "Lab Orders", - "billNo": "Bill No:", - "prescriptions": "Prescriptions", - "history": "History", - "orderNo": "Order No", - "orderDetails": "Order Details", - "deliveryDriverTrack": "Driver Tracking", - "deliveryLocation": "Delivery Location", - "driver": "Driver", - "vitalSign": "Vital Sign", - "monthlyReports": "Monthly Reports", - "km": "KMs:", - "km_": "KM", - "patientHealthSummaryReport": "Patient Health Summary Report", - "toViewTheTermsAndConditions": "To View the Terms and Conditions Report", - "clickHere": "Click here", - "iAgreeToTheTermsAndConditions": "I agree to the terms and conditions ", - "iAgreeToTheTermsAndConditionsSubtitle": "I agree to the terms and conditions ", - "save": "Save", - "userAgreement": "User Agreement", - "updateSuccessfully": "Update Successfully", - "checkVaccineAvailability": "CHECK VACCINE AVAILABILITY", - "myVaccinesAvailability": "My Vaccines Availability", - "paymentService": "Payment Service", - "paymentOnline": "Service", - "onlineCheckIn": "Online Check-In", - "myBalances": "My Balances", - "myWallet": "My Wallet", - "balanceAmount": "Wallet Amount", - "totalBalance": "Total Balance", - "createAdvancedPayment": "Recharge Wallet", - "advancePayment": "Advance Payment", - "advancePaymentLabel": "You can create and add an Advanced Payment for your account or other accounts.", - "fileNumber": "File Number", - "amount": "Amount *", - "depositorEmail": "Depositor Email *", - "notes": "Notes", - "selectPatientName": "Select Patient Name", - "selectFamilyPatientName": "Family Members", - "selectHospital": "Select Hospital", - "selectCity": "Select City", - "city": "City", - "distance": "Distance", - "otherAccount": "Other Account", - "selectBeneficiary": "Select Beneficiary", - "confirmThePayment": "Confirm The Payment", - "depositorName": "Depositor Name", - "mobileNumber": "Mobile Number", - "phoneNumber": "Phone Number", - "country": "Country", - "ok": "Ok", - "averageWaitingTime": "Average Waiting Time:", - "waitingTime": "Expected waiting time:", - "waterConsumedInWeek": "Water consumed in a week", - "waterConsumedInMonth": "Water consumed in a month", - "theVerificationCodeExpiresIn": "The Verification Code Expires in", - "pleaseEnterTheVerificationCode": "Please enter the verification code send to", - "eyeMeasurements": "Eye Measurements", - "measurements": "Measurements", - "classes": "Glasses", - "contactLens": "Contact Lens", - "rightEye": "Right Eye", - "sphere": "Sphere", - "cylinder": "Cylinder", - "axis": "Axis", - "prism": "Prism", - "va": "VA", - "leftEye": "Left Eye", - "brand": "Brand", - "power": "Power", - "diameter": "Diameter", - "activeMedications": "Active Medications", - "expDate": "Active Exp Date :", - "dailyQuantity": "Daily Quantity :", - "addReminder": "Add Reminder", - "cancelReminder": "Cancel Reminder", - "reminderDes": "Please select treatment start day and time to be notified when it's time to take the medicine", - "pleaseSelectAllQuestionToContinue": "Please answer all questions to continue...", - "startDay": "Start Day", - "endDay": "End Day", - "days": "Days ", - "pleaseVerify": "Please Verify ", - "scheduleTime": "Schedule time", - "askDoctor": "Ask Doctor", - "doctorResponses": "Doctor Responses", - "ne_w": "New", - "all": "All", - "dailyWater": "Daily Water Check", - "questionHere": "Enter the question here...", - "viewDoctorResponses": "View Doctor Responses", - "serviceInformationButton": "LOGIN / REGISTER", - "serviceInformationTitle": "Service Information", - "serviceInformation": "Service Information", - "homeHealthCare": "Home Health Care", - "noAppointmentAvailable": "No Available Appointments", - "homeHealthCareText": "This service provides a set of home health care services, continuous and comprehensive follow-up in their places of residence for those who cannot access health facilities, such as (laboratory analyzes - radiology - vaccinations - physical therapy), etc.", - "loginRegister": "Login/Register", - "orderLog": "Order Log", - "infoLab": "This service allows you to view the results of all laboratory tests performed in Al Habib Medical Group as well as sending the report via e-mail.", - "infoRadiology": "This service allows you to view the reports and photos of radiology in Al Habib Medical Group as well as send the report by e-mail.", - "noReviewsAvailable": "No Reviews Available", - "noLocationAvailable": "No Location Available", - "orders": "Orders", - "wishlist": "Wishlist", - "products": "Products", - "reviews": "Reviews", - "brands": "Brands", - "productDetails": "Product Details", - "medicationRefill": "Medication Refill", - "pillReminder": "Pill Reminder", - "shippingAddresses": "Shipping Addresses", - "reachUs": "Reach Us", - "ourLocations": "Our Locations", - "edit": "Edit", - "whatsApp": "Whats App", - "phone": "Phone", - "delete": "Delete", - "deleteAddress": "Are you sure want to delete", - "deletedAddres": "Address has been deleted", - "addAddress": "ADD A NEW ADDRESS", - "addNewAddress": "Add New Address", - "order": "My Order", - "delivered": "Delivered", - "pending": "Pending", - "enterNameHere": "Enter Your Name", - "processing": "Processing", - "cancelled": "Cancelled", - "writeReview": "Write Review", - "shareReview": "SHARE REVIEW", - "review": " reviews", - "viewMedicalFile": "View Details", - "viewAllServices": "View All Services", - "medicalFile": "Medical File", - "verified": "Verified", - "checkup": "Checkup", - "hhcHome": "Home", - "refferal": "E-Refferal", - "refferalTitle": "E-Refferal", - "refferalSubTitle": "Service", - "healthCare": "Health Care", - "emergency": "Emergency", - "emergency2": "Emergency", - "erservices": "Emergency", - "services2": "Services", - "services3": "Services", - "cantSeeProfile": "To view your medical profile, please log in or register now", - "loginRegisterNow": "Login or Register Now", - "hmgPharmacy": "HMG Pharmacy", - "ecommerceSolution": "Ecommerce Solution", - "comprehensive": "Comprehensive", - "onlineConsulting": "Online Consulting", - "pendingOrder": " PENDING", - "deliveredOrder": " DELIVERED", - "processingOrder": " PROCESSING", - "cancelledOrder": " CANCELLED", - "compare": " Compare", - "medicationsRefill": " Medication Refill", - "recommended": " Recommended for You", - "myPrescription": " My Prescriptions", - "quantity": " QTY ", - "reviewAppointment": " Review Appointment ", - "backMyAccount": "BACK TO MY ACCOUNT ", - "reviewSuccessful": "Review Successful", - "reviewShared": "Your review has been shared on product review section", - "reviewComment": "Your reviews help other to choose better product", - "shippedMethod": "SHIP BY:", - "orderDetail": "Order Details", - "orderSummary": "Order Summary", - "subtotal": "Subtotal", - "shipping": "Shipping", - "shipBy": "SHIP BY:", - "lakumPoints": "Lakum Points", - "useLakumPoints": "Use Lakum points", - "use": "USE", - "proceedPay": "PROCEED TO PAY", - "vat": "VAT (15%)", - "inclusiveVat": "(inclusive VAT)", - "items": "item(s)", - "checkOut": "CHECK OUT", - "sar": "SAR", - "aed": "AED", - "payOnline": "PAY ONLINE", - "cancelOrder": "CANCEL ORDER", - "confirmAddress": "CONFIRM ADDRESS ", - "confirmLocation": "CONFIRM LOCATION ", - "conditionsHMG": "Terms & Conditions ", - "conditions": "Terms & Conditions of Lakum", - "confirmDeleteMsg": "Are you sure! want to delete ", - "confirmDelete": "DELETE", - "confirmCancellation": "Are you sure! want to cancel this order ", - "orderNumber": "Order#: ", - "orderDate": "Date", - "itemsNo": "items(s)", - "noOrder": "You Don't have any orders.", - "noResult": "No Result.", - "nonRecommended": "No Recommended Products.", - "termsService": "Terms of Service", - "beforeusing": "Before using the checkup, please read Terms of Service.", - "accept": "I read and accept Terms of Service and Privacy Policy", - "dataSafeInfo": "Information that you provide is anonymous and not shared with anyone.", - "dataSafe": " Your data is safe.", - "informational": "Checkup is for informational purposes and is not a qualified medical opinion", - "notUseInEmerbency": "Do not use in emergencies.", - "notUseInEmerbencyDetails": "In case of health emergency, ", - "notUseInEmerbencyDetailsCall": "call the nearest emergency number immediately", - "checkDiagnosis": "Checkup is not a diagnosis.", - "remeberthat": "Remember that", - "loginToUseService": "You need to login to use this service", - "offersAndPromotions": "OFFERS & SPECIAL PROMOTIONS", - "offers": "OFFERS", - "myPrescriptions": "MY PRESCRIPTIONS", - "searchAndScanMedication": "SEARCH & SCAN FOR MEDICATION", - "shopByBrands": "Shop by Brands", - "recentlyViewed": "Recently Viewed", - "bestSellers": "Best Seller", - "deleteAllItems": "Delete All Items", - "total": "Total", - "totalWithColonRight": "Total:", - "selectAddress": "Select Address", - "shippingAddress": "SHIPPING ADDRESS", - "changeAddress": "Change Address", - "selectPaymentOption": "Select Payment Option", - "selectTamaraPlan": "Select Tamara Payment Plan", - "changeMethod": "Change Method", - "reviewOrder": "Review Order", - "active": "Active", - "inactive": "InActive", - "balance": "Balance", - "gained": "GAINED", - "consumed": "Consumed", - "transferred": "Transferred", - "riyal": "RIYAL", - "membersince": "MEMBER SINCE", - "identification": "Identification Number", - "lakumMobile": "Mobile Number", - "waitinggained": "Waiting gained", - "expired": "Expired", - "willBeExpired": "Will Be Expired", - "lakumPoint": "Lakum Points", - "activateLAKUMAccount": "Activate LAKUM Account", - "checkBeneficiary": "CHECK BENEFICIARY", - "beneficiaryName": "Beneficiary Name", - "accountActivation": "Account Activation", - "lakumTransfer": "Lakum Transfer", - "acceptLbl": "Accept", - "declineLbl": "Decline", - "selectGender": "Select Gender", - "iAmA": "I am a ...", - "selectAge": "Select Your Age", - "select": "Select", - "iAm": "I am", - "yearsOld": "years old", - "dragPoint": "Drag point to change your age", - "refine": "Refine", - "subGroup": "Subgroup", - "max": "Max", - "compeleteOrderMsg": "Order has been placed successfully!!", - "addToCompareMsg": "You have added a product to the Compare list", - "itInListMsg": "Item is already in the list", - "compareListFull": "Your compare list is full", - "addQuantity": "You should add quantity", - "addToCartMsg": "You have added a product to the cart", - "addToWishlistMsg": "You have added a product to the Wishlist", - "notifyMeMsg": "You will be notified when product available", - "removeFromWishlistMsg": "You have removed a product from the Wishlist", - "min": "Min", - "reset": "Reset", - "apply": "Apply", - "viewCategorise": "View All Categories", - "viewSubCategorise": "View All Sub Categories", - "categorise": "Categories", - "wishList": "WishList", - "myAccount": "My Account", - "cart": "Cart", - "alhabibapp": "Al Habib app", - "searchProductHere": "Search Product here", - "hhcNotAuthMsg": "This service provides a set of home health care services, continuous and comprehensive follow-up in their places of residence for those who cannot access health facilities, such as (laboratory analyzes - radiology - vaccinations - physical therapy), etc.", - "email": "Email *", - "book": "Book", - "appointmentLabel": "Appointment", - "bloodType": "Blood Type", - "maritalStatus": "Marital status", - "general": "General", - "profile": "My Profile", - "notifications": "Notifications", - "notificationDetails": "Notification Details", - "notificationDetailsa": "Notification Details", - "infoMyDoctorPoints": "", - "infoMyDoctor": "This service allows you to see all the doctors you have visited in Al Habib Medical Group, and through this service:", - "infoPrescriptions": "This service allows you to view all the medical prescriptions issued by Al Habib Medical Group, and through this service, you can:", - "infoMyPrescriptionPoints": "", - "infoInsuranceCards": "This service allows you to view all the insurance cards that recorded during your visits to Al Habib Medical Group in addition to:", - "infoInsuranceCardsPoints": "", - "infoAllergies": "This service allows you to view all types of allergies recorded during your visits to Al Habib Medical Group.", - "infoSickLeaves": "This service allows you to view all sick leaves that were taken in Al Habib Medical Group in addition to:", - "infoSickLeavePoints": "", - "infoApprovals": "This service allows you to view all approvals requests that have been sent to the insurance companies in addition to:", - "infoApprovalPoints": "", - "infoMonthReport": "Upon activation of this service, the system will send a monthly report automatically to the registered email which lists the vital signs and the results for the last visits made in AlHabib Medical Group.", - "languageSetting": "SMS, WhatsApp and Confirmation Calls Language", - "alert": "Alerts", - "emailAlert": "Alert by Email", - "smsAlert": "Alert by SMS", - "contactInfo": "Contact Information", - "emrgName": "Emergency Contact Name", - "emrgNo": "Emergency Contact Number", - "modes": "Modes", - "vibration": "Vibration Touch Feedback", - "blindModes": "Modes for Partially Blind", - "invertTheme": "Invert", - "offTheme": "Off", - "dimTheme": "Dim", - "bwTheme": "Black and White", - "permissions": "Permission", - "cameraPermission": "Camera", - "locationPermission": "Location", - "needPrescription": "This product requires a prescription", - "outOfStockMsg": "You have added product which is out of stock now, Please remove that!", - "noArabicLetters": "It Is Not Allow to Use Arabic Letters", - "noOffersAvailable": "No Offers Available!", - "accessibility": "Accessibility Mode", - "orderStatus": "Order Status", - "findUs": "Find Us", - "liveChat": "Live Chat", - "service": "Service", - "hmgServiceLabel": "HMG Service", - "healthWeatherIndicators": "Health Weather Indicators", - "healthTipsBasedOnCurrentWeather": "Health Tips Based On Current Weather", - "moreDetails": "More details", - "resendOrder": "Refill and Delivery", - "ports": "Ports", - "way": "Way", - "dailyDoses": "Daily Doses", - "period": "Period", - "duration": "المدة", - "cm": "CM", - "ft": "ft", - "kg": "kg", - "lb": "lb", - "birthDate": "Birth Date", - "dateOfBirth": "Date of Birth", - "mass": "Mass", - "tempC": "°C", - "bpm": "bpm", - "respirationSigns": "Respiration", - "sysDias": "SBP/DBP", - "body": "Body Mass", - "bodyString": "Body", - "face": "Face", - "retouch": "Re-touch", - "bikini": "Bikini", - "totalMinutes": "Total Minutes", - "feedback": "Feedback", - "likeToHear": "We would love to hear the feedback, concerns on healthcare services and eServices experience. Please use the below form", - "emptySubject": "Please enter the subject", - "emptyMessage": "Please enter message", - "selectAttachment": "Select Attachment", - "complainAppo": "Complaint for appointment", - "complainAppoAlt": "Complaint without appointment", - "messageType": "Message Type", - "feedbackType": "Feedback Type", - "compliment": "Appreciation", - "suggestion": "Suggestion", - "yourFeedback": "Your feedback was sent", - "selectPart": "Please select the part that complain about", - "number": "Number", - "notClassified": "Not classified", - "selectClinic": "Select Clinic", - "selectProject": "Select Hospital", - "searchItemError": "Item name should be more than 3 character", - "youCanFind": "You Can Find ", - "itemInSearch": " Item in Search", - "bloodDonation": "Blood Donation", - "bloodDonationInfo": "Through this service, you can register your name as a blood donor where the blood bank in the Habib Medical Group will communicate you in case of need for blood type.", - "bloodInstruction": "Enter the required information, in order to register for Blood Donation Service", - "aboutBloodDonation": "About Blood Donation", - "bloodDonationDescription": "Blood donation is a noble act that saves lives. Every single donation can save up to three people. By donating blood, you help patients in need of transfusions, emergencies, and medical treatments.", - "bloodDonationBenefit1": "Safe and quick process (10-15 minutes)", - "bloodDonationBenefit2": "You can donate every 8-12 weeks", - "bloodDonationBenefit3": "Free health check of your blood", - "viewTerms": "To view the terms and conditions", - "wantConnectHmgNetwork": "Dear customer there is no internet access, do you want to connect with HMG network to use our app, make sure you are in range of HMG network", - "failedToAccessHmgServices": "Connected with HMG Network,\n\nBut failed to access HMG services", - "offerAndPackages": "Offers and Packages", - "offerAndPackagesDetails": "This service allows you to view all HMG Offers:", - "invoiceNo": "Invoice No", - "invoiceDate": "Invoice Date", - "specialResult": "Special Result", - "generalResult": "General Result", - "showMoreBtn": "Flow Chart", - "value": "Value", - "report": "Radiology Report", - "openRad": "Open Image", - "sendCopy": "Email the Report", - "appoSurvey": "Survey", - "appoSurveySubtitle": "Survey", - "labResults": "Lab Results", - "doctorRating": "Doctor Rating", - "good": "Good", - "vGood": "Very Good", - "excellent": "Excellent", - "average": "Average", - "infoSigns": "This service allows you to view all vital signs were performed in the Habib Medical Group, e.x (height, weight, body mass index, heart rate, etc.) as well shows some statistics charts.", - "infoAdvancePayment": "This service designed so that you can deposit an amount in advance either in your account or in someone else's account with Al Habib Medical Group.", - "infoMyBalance": "This service allows you to check your balance in all branchs", - "erContant": "This service displays nearest branch among all the branches of Al Habib Medical Group based on your current location.", - "infoAmbulance": "Through this service, you can request evacuation by ambulance, whether from home or to home, in addition to a set of other services", - "infoMyAppointments": "This service allows you to see all the appointment you have visited in Al Habib Medical Group, and through this service:", - "infoTodo": "This service is designed to enable you to have a quick link to the list of tasks that need to be done", - "familyInfo": "Through this service, you will be able to link your family medical files to your medical file so that you can manage their records by login to your medical file.", - "rrtdDetails": "The Rapid response team provides a comprehensive medical service for all sorts of urgent and stable cases of all ages, including adult and paediatric patients, the service is covered by a fully equipped and highly trained medical team capable of providing the best medical care at the patient’s home.", - "onlineCheckInAgreement": "The online check-in is for non-life threatening situation. Call the red crescent (997) or go to the nearest emergency department if there are: \n\nsigns of stroke or heart attack \nhistory of seizure or syncope \nthere is limb or life threatening injury \npicture of severe injuries", - "infoEreferral": "This service allows you to submit a Referral request from any health care providers either inside or outside the kingdom of Saudi Arabia to any of HMG Hospitals, by filling some of the patient's data and attaching the medical reports, moreover you can track the request status (Under process, Accepted or Rejected)", - "erConsultation": "This service allows you to make an online virtual consultation via video call directly with the doctor from anywhere at any time.", - "myInvoice": "List", - "invoiceList": "My Invoice", - "invoiceList2": "My Invoice", - "allInvoices": "All Invoices", - "hospitals": "Hospitals", - "clinics": "Clinics", - "doctors": "Doctors", - "selectDoctor": "Select Doctor", - "thisItemIsNotAvailable": "This item is not available", - "beforeAfterImages": "Before & After Images", - "clinicAcceptLivecare": "No need to wait or visit You can now get medical consultation via Video call (LiveCare service) in The name of the clinic clinic and the doctor will contact you immediately", - "livecareModalTop": "This Clinic is Accepting LiveCare services", - "livecarePoint2": "A Specialized doctor will contact you", - "livecarePoint3": "A Doctor will be able to see your full medical file history", - "livecarePoint4": "Free Medicine Delivery Available", - "livecarePoint5": "No need to visit the service is in your place", - "bookImmediateLivecare": "I accept to get the service immediately", - "bookVideoLivecare2": "I don't need to visit the clinic", - "noThankyou": "No Thanks", - "visitClinic": "Schedule appointment with the doctor", - "generateCovidCertificate": "Generate Covid-19 Certificate", - "isReportOutsideKsa": "Is the certificate needed for outside KSA?", - "passportNumber": "Passport Number", - "enterPassportNumber": "Please confirm or update your passport number:", - "validPassportNumber": "Please enter valid passport number", - "continuePlan": "Continue with the treatment plan?", - "aboutApp": "About the app", - "aboutPoints": "Online Appointment Booking & rescheduling, Insurance approval status, Find A doctor, Ask your doctor, Medical prescriptions, Lab results, Hospitals contact numbers, Doctor profiles, Hospitals locations, Pharmacies Locations, Hospital's Virtual Tour, Official Social Media, Vaccines Schedule, Health Calculators, Other Services", - "termsConditions": "These Online Services Terms of Use (Service Terms) govern certain online services provided by Dr Sulaiman Al Habib Medical Services Group Company (HMG, we, us, our)...", - "receiveOtpToast": "Where would you like to receive OTP?", - "enterPhoneNumber": "Enter Phone Number", - "enterEmailDesc": "Enter your email address to complete the process of creating a medical file", - "enterPhoneDesc": "Enter your phone number to receive OTP verification code", - "pleaseChooseOption": "Please select from the below options to receive OTP", - "dontHaveAccount": "Don't have an account?", - "loginOrRegister": "Login or Register", - "myFiles": "My Files", - "resultsPending": "Results Pending", - "resultsAvailable": "Results Available", - "viewReport": "View Report", - "checkAvailability": "Check Availability", - "readInstructions": "Read Instructions", - "searchLabReport": "Search Lab Report", - "prescriptionDeliveryError": "This clinic doesn't support refill", - "prepareToElevate": "Prepared to elevate your health and well-being?", - "iAcceptTermsConditions": "I Accept the Terms and Conditions", - "alreadyHaveAccount": "Already have an account?", - "loginNow": "Login Now", - "notice": "Notice", - "oR": "OR", - "sendOTPWHATSAPP": "Send me OTP on Whatsapp", - "sendOTPSMS": "Send me OTP on SMS", - "fullName": "Full Name", - "married": "Married", - "uae": "United Arab Emirates", - "malE": "Male", - "loginBy": "Login By", - "loginByOTP": "Login By OTP", - "guest": "Guest", - "switchAccount": "Switch Account", - "allSet": "All Set! Now you can login with Face ID or Biometric", - "enableQuickLogin": "Enable Quick Login", - "enableMsg": "Enabling the quick login will verify through your existing device Face ID / Biometric", - "notNow": "Not Now", - "pendingActivation": "Pending Activation", - "awaitingApproval": "Awaiting Approval", - "enterValidNationalId": "Invalid Identification or file number", - "enterValidPhoneNumber": "Please enter a valid phone number", - "cannotEnterSaudiOrUAENumber": "You cannot enter Saudi Arabia (00966) or UAE (00971) phone numbers when 'Others' country is selected", - "ready": "Ready", - "medicalCentersWithCount": "{count} Medical Centers", - "medicalCenters": " Medical Centers", - "hospitalsWithCount": "{count} Hospitals", - "selectRegion": "Select Region", - "selectFacility": "Select Facilities", - "selectFacilitiesSubTitle": "Please select the facility for the appointment", - "selectHospitalSubTitle": "Please select the hospital for the appointment", - "news": "News", - "iAcceptThe": "I Accept the", - "personalDetailsVerification": "Personal Details Verification", - "otpVerification": "OTP Verification", - "weHaveSendOTP": "We have sent you the OTP code on", - "via": "via", - "forRegistrationVerification": "for registration verification", - "didntReceiveIt": "Didn't receive it?", - "resendOTP": "Resend", - "resendIn": "resend in", - "pleaseEnterAnationalID": "Please enter a national ID", - "pleaseEnterAFileNumber": "Please enter a file number", - "pleaseEnterAValidEmail": "Please enter a valid email", - "pleaseEnterFullName": "Please enter full name", - "pleaseAcceptTermsConditions": "Please accept the terms and conditions", - "pleaseEnterAValidIqamaID": "Please enter a valid Iqama ID", - "pleaseEnterAValidNationalID": "Please enter a valid national ID", - "pleaseEnterAValidDateOfBirth": "Please enter a valid date of birth", - "pleaseEnterAValidName": "Please enter a valid name", - "pleaseSelectAGender": "Please select a gender", - "pleaseSelectAMaritalStatus": "Please select a marital status", - "pleaseSelectACountry": "Please select a country", - "pleaseEnterEmail": "Please enter email", - "pleaseEnterAValidEmailFormat": "Please enter a valid email format", - "selectCountry": "Select Country", - "forLoginVerification": "for login verification", - "lastLoginBy": "Last login by", - "searchHospital": "Search Hospital", - "skip": "Skip", - "getStarted": "Get Started", - "onboardingHeading1": "Booking appointment has never been easy", - "onboardingBody1": "In few clicks find yourself having consultation with the doctor of your choice.", - "onboardingHeading2": "Access the medical history on finger tips", - "onboardingBody2": "Keep track on your medical history including labs, prescription, insurance, etc", - "normal": "Normal", - "attention": "Attention", - "monitor": "Monitor", - "noSpecialResult": "No Special Results", - "setTheDateRange": "Set The Date Range", - "historyFlowchart": "History FlowChart", - "to": "to", - "startDate": "Start Date", - "endDate": "End Date", - "hmgHospitals": "HMG Hospitals", - "hmcMedicalClinic": "HMC Medical Centers", - "applyFilter": "Apply Filter", - "facilityAndLocation": "Facility and Location", - "regionAndLocation": "Region And Locations", - "clearAllFilters": "Clear all filters", - "filters": "Filters", - "searchClinic": "Search Clinic", - "walkin": "Walk In", - "continueString": "Continue", - "laserClinic": "Laser Clinic", - "covid_info": "Dr. Sulaiman Al Habib hospitals are conducting a test for the emerging corona virus and issuing travel certificates 24/7 in a short time and with high accuracy. Those wishing to benefit from this service can visit one of Dr. Sulaiman Al Habib branches to conduct a corona test within few minutes, and obtain the result within several hours. Corona Virus Covid 19 testing service with PCR technology to detect the virus according to the highest international standards and with the latest high-precision RT-PCR devices (American GeneXpert and others), That is approved by the Food and Drug Authority as well as by the Saudi Center for Infectious Diseases Prevention.", - "appointmentDetails": "Appointment Details", - "checkingDoctorAvailability": "Checking doctor availability...", - "cancellingAppointmentPleaseWait": "Cancelling Appointment, Please Wait...", - "appointmentCancelledSuccessfully": "Appointment Cancelled Successfully", - "notConfirmed": "Not Confirmed", - "appointmentStatus": "Appointment Status", - "doctorWillCallYou": "The doctor will call you once the appointment time approaches.", - "getDirections": "Get Directions", - "notifyMeBeforeAppointment": "Notify me before the appointment", - "fetchingLabResults": "Fetching Lab Results...", - "fetchingRadiologyResults": "Fetching Radiology Results...", - "fetchingAppointmentPrescriptions": "Fetching Appointment Prescriptions...", - "noPrescriptionsForAppointment": "You don't have any prescriptions for this appointment.", - "amountBeforeTax": "Amount before tax", - "rebookAppointment": "Re-book Appointment", - "fetchingDoctorSchedulePleaseWait": "Fetching Doctor Schedule, Please Wait...", - "pickADate": "Pick a Date", - "confirmingAppointmentPleaseWait": "Confirming Appointment, Please Wait...", - "appointmentConfirmedSuccessfully": "Appointment Confirmed Successfully", - "appointmentPayment": "Appointment Payment", - "checkingPaymentStatusPleaseWait": "Checking payment status, Please wait...", - "paymentFailedPleaseTryAgain": "Payment Failed! Please try again.", - "appointmentCheckIn": "Appointment check in", - "insuranceExpiredOrInactive": "Insurance expired or inactive", - "totalAmountToPay": "Total amount to pay", - "vat15": "VAT 15%", - "liveCare": "LiveCare", - "recentVisits": "Recent Visits", - "favouriteDoctors": "Favourite Doctors", - "searchByClinic": "Search By Clinic", - "tapToSelectClinic": "Tap to select clinic", - "searchByDoctor": "Search By Doctor", - "tapToSelect": "Tap to select", - "searchByRegion": "Search By Region", - "centralRegion": "Central Region", - "immediateConsultation": "Immediate Consultation", - "scheduledConsultation": "Scheduled Consultation", - "pharmaLiveCare": "Pharma LiveCare", - "notSureHelpMeChooseClinic": "Not sure? help me choose a clinic!", - "mentionYourSymptomsAndFindDoctors": "Mention your symptoms and find the list of doctors accordingly", - "immediateService": "Immediate service", - "noNeedToWaitGetMedicalConsultation": "No need to wait, you will get medical consultation immediately via video call", - "noVisitRequired": "No visit required", - "doctorWillContact": "Doctor will contact", - "specialisedDoctorWillContactYou": "A specialised doctor will contact you and will be able to view your medical history", - "freeMedicineDelivery": "Free medicine delivery", - "offersFreeMedicineDelivery": "Offers free medicine delivery for the LiveCare appointment", - "dentalChiefComplaints": "Dental Chief Complaints", - "viewAvailableAppointments": "View available appointments", - "doctorProfile": "Doctor Profile", - "waitingAppointment": "Waiting Appointment", - "hospitalInformation": "Hospital Information", - "fetchingAppointmentShare": "Fetching Appointment Share...", - "bookingYourAppointment": "Booking your appointment...", - "selectLiveCareClinic": "LiveCare Clinic", - "checkingForExistingDentalPlan": "Checking for an existing dental plan, Please wait...", - "dentalTreatmentPlan": "Dental treatment plan", - "youHaveExistingTreatmentPlan": "You have an existing treatment plan: ", - "mins": "Mins", - "totalTimeRequired": "Total time required", - "wouldYouLikeToContinue": "Would you like to continue it?", - "chooseDoctor": "Choose Doctor", - "viewNearestAppos": "View nearest available appointments", - "noDoctorFound": "No Doctor found for selected criteria...", - "yesPleasImInAHurry": "Yes please, I am in a hurry", - "fetchingFeesPleaseWait": "Fetching fees, Please wait...", - "noThanksPhysicalVisit": "No, Thanks. I would like a physical visit", - "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", - "reviewLiveCareRequest": "Review LiveCare Request", - "selectedLiveCareType": "Selected LiveCare Type", - "selectLiveCareCallType": "Select LiveCare call type", - "confirmingLiveCareRequest": "Confirming LiveCare request, Please wait...", - "unknownErrorOccurred": "Unknown error occurred...", - "liveCarePermissionsMessage": "LiveCare requires Camera, Microphone, Location & Notifications permissions to enable virtual consultation between patient & doctor, Please allow these to proceed.", - "liveCarePayment": "LiveCare Payment", - "mada": "Mada", - "visaOrMastercard": "Visa or Mastercard", - "tamara": "Tamara", - "fetchingApplePayDetails": "Fetching Apple Pay details, Please wait...", - "liveCarePendingRequest": "LiveCare Pending Request", - "callLiveCareSupport": "Call LiveCare Support", - "whatIsWaitingAppointment": "What is Waiting Appointment?", - "waitingAppointmentsFeature": "The waiting appointments feature allows you to book an appointment while you are inside the hospital building, and in case there is no available slot in the doctor's schedule.", - "appointmentWithDoctorConfirmed": "The appointment with the doctor is confirmed, but the time of entry is uncertain.", - "paymentWithinTenMinutes": "Note: You must have to pay within 10 minutes of booking, otherwise your appointment will be cancelled automatically", - "liveLocation": "Live Location", - "verifyYourLocationAtHospital": "Verify your location to be at hospital to check in", - "error": "Error", - "ensureWithinHospitalLocation": "Please ensure you're within the hospital location to perform online check-in.", - "nfcNearFieldCommunication": "NFC (Near Field Communication)", - "scanPhoneViaNFC": "Scan your phone via NFC board to check in", - "qrCode": "QR Code", - "scanQRCodeToCheckIn": "Scan QR code with your camera to check in", - "processingCheckIn": "Processing Check-In...", - "bookingWaitingAppointment": "Booking Waiting Appointment, Please wait...", - "enterValidIDorIqama": "Please enter a valid national ID or file number", - "selectAppointment": "Select Appointment", - "rebookSameDoctor": "Rebook with same doctor", - "queueing": "Queueing", - "inQueue": "In Queue", - "yourTurn": "Your Turn", - "halaFirstName": "Hala {firstName}!!!", - "thankYouForPatience": "Thank you for your patience, here is your queue number.", - "servingNow": "Serving Now", - "callForVitalSigns": "Call for vital signs", - "callForDoctor": "Call for Doctor", - "thingsToAskDoctor": "Things to ask your doctor today", - "improveOverallHealth": "What can I do to improve my overall health?", - "routineScreenings": "Are there any routine screenings I should get?", - "whatIsThisMedicationFor": "What is this medication for?", - "sideEffectsToKnow": "Are there any side effects I should know about?", - "whenFollowUp": "When should I come back for a follow-up?", - "goToHomepage": "Go to homepage", - "appointmentsList": "Appointments List", - "allAppt": "All Appt.", - "upcoming": "Upcoming", - "completed": "Completed", - "noAppointmentsYet": "You don't have any appointments yet.", - "viewProfile": "View Profile", - "choosePreferredHospitalForService": "Choose your preferred hospital for the service", - "noHospitalsFound": "No hospitals Found", - "cancelOrderConfirmation": "Are you sure you want to cancel this order?", - "orderCancelledSuccessfully": "Order has been cancelled successfully", - "requestID": "Request ID:", - "noCMCOrdersYet": "You don't have any CMC orders yet.", - "cmcOrders": "CMC Orders", - "summary": "Summary", - "selectedService": "Selected Service", - "requestSubmittedSuccessfully": "Your request has been successfully submitted.", - "hereIsYourRequestNumber": "Here is your request #: ", - "pleaseSelectHospitalToContinue": "Please select a hospital to continue", - "confirmSubmitRequest": "Are you sure you want to submit this request?", - "pendingOrderWait": "You have a pending order. Please wait for it to be processed.", - "noServicesAvailable": "No services available", - "selectAService": "Select a Service", - "comprehensiveCheckup": "Comprehensive Checkup", - "viewNearestHMGLocations": "View your nearest HMG locations", - "provideFeedbackOnServices": "Provide your feedback on our services", - "liveChatWithHMG": "Live chat option with HMG", - "send": "Send", - "status": "Status", - "sendingFeedback": "Sending Feedback...", - "selectFeedbackType": "Select Feedback Type", - "loadingAppointmentsList": "Loading appointments list...", - "noAppointmentsForFeedback": "You do not have any appointments to submit a feedback.", - "selectedAppointment": "Selected Appointment:", - "subject": "Subject", - "enterSubjectHere": "Enter subject here", - "message": "Message", - "enterMessageHere": "Enter message here", - "filesSelected": "{count} file(s) selected", - "otherDetails": "Other Details", - "medicalReport": "Medical Report", - "medicalReportNumber": "Medical Report {number}", - "patientIsInsured": "Patient is Insured", - "insuranceDocument": "Insurance Document", - "selectBranch": "Select Branch", - "patientInformation": "Patient information", - "patientLocation": "Where the patient located", - "identificationNumber": "Identification Number", - "enterIdentificationNumber": "Enter Identification Number*", - "patientName": "Patient Name*", - "referralRequesterInformation": "Referral requester information", - "enterReferralRequesterName": "Enter Referral Requester Name*", - "requesterName": "Requester Name", - "relationship": "Relationship", - "selectRelation": "Select Relation", - "otherName": "Other Name", - "otherNameHint": "Other Name*", - "requesterNameRequired": "Referral requester name is required", - "selectRelationshipRequired": "Please select a relationship", - "otherRelationshipNameRequired": "Other relationship name is required", - "identificationNumberRequired": "Identification number is required", - "patientNameRequired": "Patient name is required", - "enterPatientPhoneRequired": "Please Enter patient phone number", - "selectPatientCityRequired": "Please select patient city", - "medicalReportRequired": "At least one medical report is required", - "selectBranchRequired": "Please select a branch", - "insuranceDocumentRequired": "Insurance document is required for insured patients", - "searchResult": "Search Result", - "referralNo": "Referral No {number}", - "eReferral": "E Referral", - "referralCreatedSuccessfully": "Your Referral has been created Successfully.", - "hereIsYourReferralNumber": "Here is your Referral #: ", - "searchEReferral": "Search E-Referral", - "enterRequiredInfoToSearch": "Please enter the required information to search for an e-referral", - "selectPickupDirection": "Select Pickup Direction", - "selectDirection": "Select Direction", - "toHospital": "To Hospital", - "fromHospital": "From Hospital", - "selectWay": "Select Way", - "oneWay": "One Way", - "twoWay": "Two Way", - "selectPickupDetails": "Select Pickup Details", - "pleaseSelectDetailsOfPickup": " Please select the details of pickup", - "selectDetails": "Select Details", - "work": "Work", - "pick": "Pick", - "insideTheHome": "Inside the home", - "haveAnyAppointment": "Have any appointment", - "amountPaidAtHospital": "Amount will be paid at the hospital", - "submitRequest": "Submit Request", - "enterPickupLocationManually": "Enter Pickup Location Manually", - "enterPickupLocation": "Enter Pickup Location", - "trackingDetails": "Tracking Details", - "cancelRequest": "Cancel Request", - "shareLocationWhatsapp": "Share Your Live Location on Whatsapp", - "pleaseWaitForCall": "Please wait for the call", - "toHospitalLower": "to hospital", - "contact": "Contact", - "failed": "Failed", - "confirmationCall": "Confirmation Call", - "pickupFromHome": "Pickup Up from Home", - "onTheWayToHospital": " On The Way To Hospital", - "arrivedAtHospital": "Arrived at Hospital", - "orderCancel": "Order Cancel", - "emergencyCheckIn": "Emergency Check-In", - "erOnlineCheckInDescription": "This service lets patients register their ER appointment prior to arrival.", - "erOnlineCheckInSuccess": "Your ER Online Check-In has been successfully done. Please proceed to the waiting area.", - "erOnlineCheckInError": "Unexpected error occurred during check-in. Please contact support.", - "fetchingHospitalsList": "Fetching hospitals list...", - "fetchingPaymentInformation": "Fetching payment information...", - "erVisitDetails": "ER Visit Details", - "erClinic": "ER Clinic", - "vatWithAmount": "VAT 15% ({amount})", - "erAppointmentBookedSuccess": "Your appointment has been booked successfully. Please perform Check-In once you arrive at the hospital.", - "underProcessing": "Under processing", - "canceledByPatient": "Cancelled by patient", - "rapidResponseTeam": "Rapid Response Team", - "allFacilities": "All Facilities", - "selectLocation": "Select Location", - "pleaseSelectTheLocation": "Please select the location", - "viewLocationGoogleMaps": "View Location on Google Maps", - "callAmbulance": "Call Ambulance", - "requestAmbulanceInEmergency": "Request an ambulance in emergency from home or hospital", - "confirmation": "Confirmation", - "areYouSureYouWantToCallAmbulance": "Are you sure you want to call an ambulance?", - "getDetailsOfNearestBranch": "Get the details of nearest branch including directions", - "areYouSureYouWantToCallRRT": "Are you sure you want to call Rapid Response Team (RRT)?", - "priorERCheckInToSkipLine": "Prior ER Check-In to skip the line & payment at the reception.", - "areYouSureYouWantToMakeERCheckIn": "Are you sure you want to make ER Check-In?", - "checkingYourERAppointmentStatus": "Checking your ER Appointment status...", - "transportOptions": "Transport Options", - "selectHospitalForAdvancePayment": "Please select the hospital you want to make an advance payment for.", - "recharge": "Recharge", - "activityLevel": "Activity Level", - "selectActivityLevel": "Select Activity Level", - "caloriesPerDay": "Calories Per Day", - "dietType": "Diet Type", - "selectDietType": "Select Diet Type", - "bodyFrameSize": "Body Frame Size", - "selectBodyFrameSize": "Select Body Frame Size", - "averageCycleLength": "Average Cycle Length (Usually 28 days)", - "averageLutealPhase": "Average Luteal Phase Length(Usually 14 days)", - "convert": "Convert", - "calculate": "Calculate", - "healthCalculators": "Health Calculators", - "healthConverters": "Health Converters", - "generalHealth": "General Health", - "relatedToBMICalories": "Related To BMI, calories, body fat, etc to stay updated with your health.", - "selectCalculator": "Select Calculator", - "womensHealth": "Women's Health", - "relatedToPeriodsOvulation": "Related To periods, ovulation, pregnancy, and other topics.", - "bloodSugar": "Blood Sugar", - "trackYourGlucoseLevels": "Track your glucose levels, understand trends, and get personalized insights for better health.", - "bloodCholesterol": "Blood Cholesterol", - "monitorCholesterolLevels": "Monitor cholesterol levels, assess heart health risks, and take proactive steps for well-being.", - "triglyceridesFatBlood": "Triglycerides Fat Blood", - "understandTriglyceridesImpact": "Understand triglycerides' impact on heart health with personalized insights and expert recommendations.", - "bmiCalculator": "BMI Calculator", - "bmiCalculatorDesc": "Calculate your body mass index to understand your healthy weight range.", - "caloriesCalculator": "Calories Calculator", - "caloriesCalculatorDesc": "Find out how many calories you need daily to maintain or lose weight.", - "bmrCalculator": "BMR Calculator", - "bmrCalculatorDesc": "Determine your basal metabolic rate and daily energy requirements.", - "idealBodyWeight": "Ideal Body Weight", - "idealBodyWeightDesc": "Discover your ideal weight based on height, age, and body structure.", - "bodyFatCalculator": "Body Fat Calculator", - "bodyFatCalculatorDesc": "Estimate your body fat percentage to track fitness and health goals.", - "carbsProteinFat": "Carbs Protein & Fat", - "carbsProteinFatDesc": "Balance your macros with the right carbs, protein, and fat ratios.", - "ovulationPeriod": "Ovulation Period", - "ovulationPeriodDesc": "Track your fertile window and plan for conception with accuracy.", - "deliveryDueDate": "Delivery Due Date", - "deliveryDueDateDesc": "Calculate your expected delivery date and monitor pregnancy milestones.", - "low": "Low", - "preDiabetic": "Pre-diabetic", - "high": "High", - "elevated": "Elevated", - "recorded": "Recorded", - "noRecordsYet": "No records yet", - "lastRecord": "Last Record", - "addBloodSugar": "Add Blood Sugar", - "addBloodPressure": "Add Blood Pressure", - "addWeight": "Add Weight", - "bloodSugarDataSavedSuccessfully": "Blood Sugar Data saved successfully", - "bloodPressureDataSavedSuccessfully": "Blood Pressure Data saved successfully", - "weightDataSavedSuccessfully": "Weight Data saved successfully", - "pleaseWait": "Please wait", - "selectUnit": "Select Unit", - "selectMeasureTime": "Select Measure Time", - "selectArm": "Select Arm", - "enterBloodSugar": "Enter Blood Sugar", - "enterSystolicValue": "Enter Systolic Value", - "enterDiastolicValue": "Enter Diastolic Value", - "enterWeight": "Enter Weight", - "selectDuration": "Select Duration", - "systolic": "Systolic", - "diastolic": "Diastolic", - "sendReportByEmail": "Send Report by Email", - "enterYourEmailToReceiveReport": "Enter your email address to receive the report", - "addNewRecord": "Add new Record", - "healthTrackers": "Health Trackers", - "monitorBloodPressureLevels": "Monitor your blood pressure levels, track systolic and diastolic readings, and maintain a healthy heart.", - "trackWeightProgress": "Track your weight progress, set goals, and maintain a healthy body mass for overall wellness.", - "bookAppointment": "Book Appointment", - "completeCheckup": "Complete Checkup", - "indoorNavigation": "Indoor Navigation", - "eReferralServices": "E-Referral Services", - "dailyWaterMonitor": "Daily Water Monitor", - "fetchingYourWaterIntakeDetails": "Fetching your water intake details.", - "healthCalculatorsServices": "Health\nCalculators", - "healthConvertersServices": "Health\nConverters", - "smartWatchesServices": "Smart\nWatches", - "exploreServices": "Explore Services", - "medicalAndCareServices": "Medical & Care Services", - "hmgServices": "HMG Services", - "personalServices": "Personal Services", - "habibWallet": "Habib Wallet", - "habibWallet2": "Habib Wallet", - "loginToViewWalletBalance": "Login to view your wallet balance", - "loginToViewMedicalFile": "Login to view your medical file", - "addMember": "Add Member", - "addFamilyMember": "Add Family Member", - "pleaseFillBelowFieldToAddNewFamilyMember": "Please fill the below field to add a new family member to your profile", - "healthTools": "Health Tools", - "supportServices": "Support Services", - "virtualTour": "Virtual Tour", - "carParking": "Car Parking", - "latestNews": "Latest News", - "hmgContact": "HMG Contact", - "durationCannotExceed90": "Duration can not exceed 90 mins", - "unexpectedError": "Unexpected Error Occurred", - "gettingAmbulanceTransportOption": "Getting Ambulance Transport Option", - "fetchingAppointment": "Fetching Appointment", - "doYouWantToCancelTheRequest": "Do you want to cancel the request", - "cancellingRequest": "Cancelling request", - "fetchingTermsAndConditions": "Fetching Terms And Conditions", - "selectLocationPrescriptionDelivery": "Please select the location for prescription delivery", - "noRadiologyOrders": "No Radiology Orders Found", - "ageIsRequired": "Age is required", - "invalidAge": "Invalid age", - "ageMustBeBetween11And120": "Age must be between 11 and 120", - "heightIsRequired": "Height is required", - "invalidHeight": "Invalid height", - "weightIsRequired": "Weight is required", - "invalidWeight": "Invalid weight", - "timeToDrinkWater": "Time to Drink Water! 💧", - "stayHydratedDrinkWater": "Stay hydrated! Drink {amount}ml of water.", - "visitPharmacyOnline": "Visit Pharmacy Online", - "howAreYouFeelingToday": "How are you feeling today?", - "checkYourSymptomsWithScale": "Check your symptoms with this scale", - "checkYourSymptoms": "Check your symptoms", - "noUpcomingAppointmentPleaseBook": "You do not have any upcoming appointment. Please book an appointment", - "youHaveEROnlineCheckInRequest": "You have ER Online Check-In Request", - "quickLinks": "Quick Links", - "viewMedicalFileLandingPage": "View medical file", - "immediateLiveCareRequest": "Immediate LiveCare Request", - "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", - "selectServices": "Select Services", - "selectedServices": "Selected Services", - "createNewRequest": "Create new request", - "youHaveNoPendingRequests": "You have no pending requests.", - "noInsuranceDataFound": "No insurance data found...", - "noInsuranceUpdateRequest": "No insurance update requests found.", - "policyNumberInsurancePage": "Policy: {number}", - "insuranceExpired": "Insurance Expired", - "insuranceActive": "Insurance Active", - "patientCardID": "Patient Card ID: {id}", - "noInsuranceApprovals": "You don't have any insurance approvals yet.", - "noInsuranceWithHMG": "You don't have insurance registered with HMG.", - "referenceRange": "Reference Range", - "downloadReport": "Download report", - "generatingReport": "Generating report, Please wait...", - "noLabResults": "You don't have any lab results yet.", - "labResultDetails": "Lab Result Details", - "resultOf": "Result of", - "whatIsThisResult": "What is this result?", - "lastTested": "Last Tested", - "byVisit": "By Visit", - "byTest": "By Test", - "results": "results", - "viewResults": "View Results", - "rebook": "Rebook", - "noOphthalmologyAppointments": "No Ophthalmology appointments found...", - "noVitalSignsRecordedYet": "No vital signs recorded yet", - "appointmentsAndVisits": "Appointments & visits", - "labAndRadiology": "Lab & Radiology", - "activeMedicationsAndPrescriptions": "Recent Prescriptions", - "allPrescriptions": "All Prescriptions", - "allMedications": "All Medications", - "youDontHaveAnyPrescriptionsYet": "You don't have any prescriptions yet.", - "youDontHaveAnyCompletedVisitsYet": "You don't have any completed visits yet", - "others": "Others", - "allergyInfo": "Allergy Info", - "vaccineInfo": "Vaccine Info", - "updateInsuranceInfo": "Update Insurance", - "myInvoicesList": "My Invoices List", - "ancillaryOrdersList": "Ancillary Orders List", - "youDontHaveAnySickLeavesYet": "You don't have any sick leaves yet.", - "medicalReports": "Medical Reports", - "sickLeaveReport": "Sick Leave Report", - "weightTracker": "Weight Tracker", - "askYourDoctor": "Ask Your Doctor", - "internetPairing": "Internet Pairing", - "requested": "Requested", - "youDontHaveAnyMedicalReportsYet": "You don't have any medical reports yet.", - "requestMedicalReport": "Request medical report", - "youDoNotHaveAnyAppointmentsToRequestMedicalReport": "You do not have any appointments to request a medical report.", - "areYouSureYouWantToRequestMedicalReport": "Are you sure you want to request a medical report for this appointment?", - "yourMedicalReportRequestSubmittedSuccessfully": "Your medical report request has been successfully submitted.", - "monthlyHealthSummaryReportDisclaimer": "This monthly health summary report reflects the health indicators and analysis results of the latest visits. Please note that this will be sent automatically from the system and it's not considered as a official report so no medical decision should be taken based on it", - "updatingMonthlyReportStatus": "Updating Monthly Report Status...", - "monthlyReportStatusUpdatedSuccessfully": "Monthly Report Status Updated Successfully", - "whoCanViewMyMedicalFile": "Who can view my medical file?", - "acceptedYourRequestToBeYourFamilyMember": "{status} your request to be your family member", - "canViewYourFile": "can view your file", - "hasARequestPendingToBeYourFamilyMember": "has a request {status} to be your family member", - "wantsToAddYouAsTheirFamilyMember": "wants to add you as their family member", - "rejectedYourRequestToBeYourFamilyMember": "{status} your request to be your family member", - "rejectedYourFamilyMemberRequest": "{status} your family member request", - "notAvailable": "N/A", - "selectAProfile": "Please select a profile", - "switchFamilyFile": "Switch from the below list of medical files", - "medicalFiles": "Medical Files", - "addANewFamilyMember": "Add a new family member", - "viewInvoiceDetails": "View invoice details", - "outPatient": "OutPatient", - "invoiceDetails": "Invoice Details", - "sendingEmailPleaseWait": "Sending email, Please wait...", - "emailSentSuccessfullyMessage": "Email sent successfully.", - "discount": "Discount", - "paid": "Paid", - "fetchingInvoiceDetails": "Fetching invoice details, Please wait...", - "scanQRCode": "Scan QR code", - "parkingSlotDetails": "Parking Slot Details", - "slotNumber": "Slot: {code}", - "basement": "Basement: {description}", - "parkingDate": "Date: {date}", - "parkedSince": "Parked Since: {time}", - "resetDirection": "Reset Direction", - "noPrescriptionOrdersYet": "You don't have any prescription orders yet.", - "fetchingPrescriptionPDFPleaseWait": "Fetching prescription PDF, Please wait...", - "ratingValue": "Rating: {rating}", - "downloadPrescription": "Download Prescription", - "fetchingPrescriptionDetails": "Fetching prescription details...", - "switchBackFamilyFile": "Switch Back To Family File", - "profileAndSettings": "Profile & Settings", - "quickActions": "Quick Actions", - "notificationsSettings": "Notifications Settings", - "touchIDFaceIDServices": "Touch ID / Face ID Services", - "personalInformation": "Personal Information", - "updateEmailAddress": "Update Email Address", - "helpAndSupport": "Help & Support", - "permissionsProfile": "Permissions", - "privacyPolicy": "Privacy Policy", - "deactivateAccount": "Deactivate account", - "ageYearsOld": "{age} {yearsOld}", - "youDontHaveRadiologyOrders": "You don't have any radiology results yet.", - "radiologyResult": "Radiology Result", - "viewRadiologyImage": "View Radiology Image", - "rateClinic": "Rate Clinic", - "back": "Back", - "rateDoctor": "Rate Doctor", - "howWasYourLastVisitWithDoctor": "How was your last visit with doctor?", - "dateOfBirthSymptoms": "What is your Date of Birth?", - "genderSymptoms": "What is your gender?", - "heightSymptoms": "How tall are you?", - "weightSymptoms": "What is your weight?", - "femaleGender": "Female", - "previous": "Previous", - "selectedOrgans": "Selected Organs", - "noOrgansSelected": "No organs selected yet", - "organSelector": "Organ Selector", - "noPredictionsAvailable": "No Predictions available", - "areYouSureYouWantToRestartOrganSelection": "Are you sure you want to restart the organ selection?", - "possibleConditions": "Possible Conditions", - "pleaseSelectAtLeastOneRiskBeforeProceeding": "Please select at least one risk before proceeding", - "aboveYouSeeCommonRiskFactors": "Above you see the most common risk factors. Although /diagnosis may return questions about risk factors, ", - "readMore": "Read more", - "riskFactors": "Risk Factors", - "noRiskFactorsFound": "No risk factors found", - "basedOnYourSelectedSymptomsNoRiskFactors": "Based on your selected symptoms, no additional risk factors were identified.", - "messageNotification": "Message", - "attachedImage": "Attached Image", - "failedToLoadImage": "Failed to load image", - "typeNotification": "Type", - "pleaseSelectAtLeastOneOptionBeforeProceeding": "Please select at least one option before proceeding", - "suggestions": "Suggestions", - "pleaseGoBackAndSelectOrgansFirst": "Please go back and select organs first", - "symptomsSelector": "Symptoms Selector", - "possibleSymptomsRelatedTo": "Possible symptoms related to", - "suggestionAIListDescription": "This is a list of symptoms suggested by our AI, based on the information gathered so far during the interview", - "analyzing": "Analyzing...", - "seekMedicalAdvice": "Seek Medical Advice", - "monitorDescription": "No need to seek medical advice. Just keep healthy routine.", - "seekMedicalAdviceDescription": "Not emergency but better to monitor the symptoms.", - "emergencyDescription": "Need to consult doctor as soon as possible before getting too late.", - "colorScience": "Color Science", - "noNeedToVisitDoctor": "No need to visit doctor", - "commonSymptom": "Common Symptom", - "notApplicable": "Not Applicable", - "emergencyTriage": "Emergency", - "emergencyEvidenceDetected": "Emergency evidence detected. Please seek medical attention.", - "noQuestionItemsAvailable": "No question items available", - "pleaseAnswerAllQuestionsBeforeProceeding": "Please answer all questions before proceeding", - "triage": "Triage", - "areYouSureYouWantToExitProgress": "Are you sure you want to exit? Your progress will be lost.", - "noQuestionAvailable": "No question available", - "possibleSymptom": "Possible symptom: ", - "symptomsCheckerFindingScore": "- Symptoms checker finding score", - "notSet": "Not set", - "years": "Years", - "symptomsChecker": "Symptoms Checker", - "helloIsYourInformationUpToDate": "Hello {name}, Is your information up to date?", - "noEditAll": "No, Edit all", - "yesItIs": "Yes, It is", - "age": "Age", - "youDontHaveAnyAncillaryOrdersYet": "You don't have any ancillary orders yet.", - "invoiceWithNumber": "Invoice: {invoiceNo}", - "queued": "Queued", - "checkInReady": "Check-in Ready", - "checkIn": "Check In", - "viewDetails": "View Details", - "selectPaymentMethod": "Select Payment Method", - "processingPaymentPleaseWait": "Processing payment, Please wait...", - "finalizingPaymentPleaseWait": "Finalizing payment, Please wait...", - "generatingInvoicePleaseWait": "Generating invoice, Please wait...", - "hereIsYourInvoiceNumber": "Here is your invoice #: ", - "paymentCompletedSuccessfully": "Payment Completed Successfully", - "failedToInitializeApplePay": "Failed to initialize Apple Pay. Please try again.", - "cash": "Cash", - "approved": "Approved", - "approvalRejectedPleaseVisitReceptionist": "Approval Rejected - Please visit receptionist", - "sentForApproval": "Sent For Approval", - "ancillaryOrderDetails": "Ancillary Order Details", - "noProceduresAvailableForSelectedOrder": "No Procedures available for the selected order.", - "procedures": "Procedures", - "totalAmount": "Total Amount", - "covered": "Covered", - "vatPercent": "VAT (15%)", - "proceedToPayment": "Proceed to Payment", - "supportedSmartWatches": "Supported Smart Watches", - "pleaseMakeSureSamsungWatchConnected": "Please make sure that your Samsung Watch is connected to your Phone, is actively synced & updated.", - "beforeSyncingDataFollowInstructions": "Before syncing data, please make sure that you have followed the instructions properly.", - "viewWatchInstructions": "View watch instructions", - "healthConnectAppNotInstalled": "Seems like you do not have Health Connect App installed. Please install it from the Play Store to sync your health data.", - "setTimerOfReminder": "Set the timer of reminder", - "youHaveAppointmentWithDr": "You have appointment with Dr. ", - "hours": "Hours", - "minutes": "Minutes", - "seconds": "Seconds", - "secs": "Secs", - "noAllergiesDataFound": "No allergies data found...", - "heartRateDescription": "Your heart rate indicates how many times your heart beats per minute", - "bloodOxygenDescription": "Blood oxygen level indicates how much oxygen your red blood cells are carrying", - "stepsDescription": "Number of steps taken throughout the day", - "caloriesDescription": "Calories burned during physical activity", - "distanceDescription": "Distance covered throughout the day", - "overview": "Overview", - "details": "Details", - "details2": "Details", - "healthy": "Healthy", - "warning": "Warning", - "vitalSignDetails": "Vital Sign Details", - "resultOfNoDate": "Result of --", - "referenceRangeBetween": "Reference range: {low} – {high} {unit}", - "referenceRangeMin": "Reference range: ≥ {low} {unit}", - "referenceRangeMax": "Reference range: ≤ {high} {unit}", - "noHistoryAvailable": "No history available", - "bmiDescription": "BMI is a measurement based on height and weight that estimates body fat.", - "heightDescription": "Height is measured in centimeters and is used to calculate BMI and dosage recommendations.", - "weightDescription": "Weight helps track overall health, nutrition, and changes over time.", - "bloodPressureDescription": "Blood pressure reflects the force of blood against artery walls. It is shown as systolic/diastolic.", - "temperatureDescription": "Body temperature reflects how hot your body is and may change with infection or inflammation.", - "heartRateDescriptionVital": "Heart rate refers to the number of heart beats per minute.", - "respiratoryRateDescription": "Respiratory rate is the number of breaths taken per minute.", - "bmiAdvice": "Maintain a balanced diet and regular activity. If your BMI is high or low, consider consulting your doctor.", - "heightAdvice": "No action is needed unless your measurement looks incorrect. Update it during your next visit.", - "weightAdvice": "Monitor weight changes. Sudden gain or loss may require medical advice.", - "bloodPressureAdvice": "Keep tracking your blood pressure. High or low readings should be discussed with your doctor.", - "temperatureAdvice": "If you have a persistent fever or symptoms, contact your healthcare provider.", - "heartRateAdvice": "Track your heart rate trends. If you feel dizziness or chest pain, seek medical care.", - "respiratoryRateAdvice": "If you notice shortness of breath or abnormal breathing, seek medical advice.", - "whatShouldIDoNext": "What should I do next?", - "customizeDrinkCup": "Customize your drink cup", - "tipsToStayHydrated": "Tips to stay hydrated", - "drinkBeforeYouFeelThirsty": "Drink before you feel thirsty", - "keepRefillableBottleNextToYou": "Keep a refillable bottle next to you", - "trackYourDailyIntakeToStayMotivated": "Track your daily intake to stay motivated", - "chooseSparklingWaterInsteadOfSoda": "Choose sparkling water instead of soda", - "switchCup": "Switch Cup", - "plainWater": "Plain Water", - "yourGoal": "Your Goal", - "remaining": "Remaining", - "hydrationStatus": "Hydration Status", - "areYouSureYouWantToCancelAllWaterReminders": "Are you sure you want to cancel all water reminders?", - "remindersSet": "Reminders Set!", - "dailyWaterRemindersScheduledAt": "Daily water reminders scheduled at:", - "waterConsumption": "Water Consumption", - "selectNumberOfReminders": "Select Number of Reminders", - "h2oSettings": "H20 Settings", - "settingsSavedSuccessfully": "Settings saved successfully", - "yourName": "Your Name", - "ageYears": "Age (11-120) yrs", - "numberOfRemindersInADay": "Number of reminders in a day", - "medications": "Medications", - "remarks": "Remarks: ", - "someRemarksAboutPrescription": "some remarks about the prescription will be here", - "notifyMeBeforeConsumptionTime": "Notify me before the consumption time", - "noMedicationsToday": "No medications today", - "route": "Route", - "frequency": "Frequency", - "reminders": "Reminders", - "reminderAddedToCalendar": "Reminder added to calendar ✅", - "errorWhileSettingCalendar": "Error while setting calendar: {error}", - "instructions": "Instructions", - "requests": "Requests", - "thisWeek": "This Week", - "lastMonth": "Last Month", - "lastSixMonths": "Last 6 Months", - "selectTime": "Select Time", - "pleaseWaitYouWillBeCalledForVitalSigns": "Please wait! you will be called for vital signs", - "pleaseVisitRoomForVitalSigns": "Please visit Room {roomNumber} for vital signs", - "pleaseVisitRoomToTheDoctor": "Please visit Room {roomNumber} to the Doctor", - "erOnlineCheckInRequest": "ER Online Check-In Request", - "indoor": "Indoor", - "navigation": "Navigation", - "health": "Health", - "calculators": "Calculators", - "converters": "Converters", - "guide": "Guide", - "liveCareServiceDesc": "Get medical advice with a specialist doctor Via a video call", - "bloodGroup": "Blood: {bloodType}", - "medicalServices": "Medical Services", - "insuranceAndPayments": "Insurance & Payments", - "trackerAndOthers": "Tracker & Others", - "bmi": "BMI", - "yesPleaseINeedHelp": "Yes, Please I need help", - "confirmYourLocation": "Confirm Your Location", - "confirmYourLocationDesc": "Please confirm your present location to view appropriate directions.", - "insideHospital": "I am inside the hospital", - "outsideHospital": "I am outside the hospital", - "servicePriceList": "Services Price List", - "servicePriceListDesc": "Below is the services price list outline the healthcare services fees for cash payments, where the insurance coverage, eligibility, and co-payment deductions will be processed in accordance with the insurance policy terms and the table of benefits of each insurance providers:", - "servicePriceListRights": "The patient has the right to a free follow-up within 14 days of initial visit", - "serviceName": "Service Name", - "noFreeSlot": "No free slot available for the selected date. Please select another date or check back later.", - "noThanksIKnowTheClinic": "No, Thanks. I Know the clinic", - "unableToSendOTP": "Unable to send Verification OTP", - "aiOverView": "AI Overview", - "generateAiAnalysis": "Generate AI analysis for this order", - "aiAnalysis": "AI Analysis", - "prediction": "Prediction", - "prevention": "Prevention", - "disclaimer": "Disclaimer", - "thisAboveInfo": "The above information is generated by AI based on your lab results and is intended for informational purposes only. It should not be considered a medical diagnosis or treatment plan. Always consult with your healthcare provider for personalized medical advice and before making any health-related decisions.", - "aiDisclaimer": "Your lab result data will be securely shared with our AI Analyzer for analysis. This helps provide personalized health insights. Do you want to proceed?", - "consent": "Consent", - "bmiNormalDescription": "Your BMI is within the healthy range. Continue a balanced diet, regular physical activity, and routine checkups to maintain good health. Monitor any significant changes over time.", - "bmiUnderweightDescription": "BMI suggests you are underweight. Consider increasing calorie intake with nutrient-dense foods, include resistance training to build muscle, and consult a healthcare professional to check for underlying causes.", - "bmiOverweightDescription": "BMI indicates overweight. Aim for gradual, sustainable weight loss through a modest calorie deficit, regular physical activity, and healthier food choices. Seek medical advice before major lifestyle changes.", - "caloriesMaintenanceDescription": "Estimated daily calories to maintain your current weight given your activity level and metabolism. Use this as a baseline: increase slightly for muscle gain, or create a small deficit for gradual weight loss. Track progress and adjust every 2–4 weeks.", - "caloriesModerateDeficitDescription": "A moderate calorie reduction designed for steady, sustainable weight loss (typically 0.25–0.5 kg per week). Combine with resistance training and adequate protein to preserve muscle. Avoid extreme cuts and consult a professional if you have medical conditions.", - "caloriesAggressiveDeficitDescription": "A large calorie reduction that may produce faster weight loss but can be hard to sustain and increase risk of nutrient deficiencies, fatigue, or muscle loss. Not recommended long-term; seek guidance from a healthcare or nutrition professional before continuing.", - "bodyFatEssentialDescription": "Your body fat percentage is in the essential/athletic range. This level is typical for athletes and indicates very low body fat. While this may be optimal for performance, ensure you maintain adequate nutrition and hormone function. Consult a healthcare professional if you experience fatigue, hormonal issues, or other health concerns.", - "bodyFatFitnessDescription": "Your body fat percentage is in the fitness range. This indicates a healthy level of body fat associated with good physical conditioning. Maintain your current lifestyle habits including regular exercise and balanced nutrition to sustain this healthy range.", - "bodyFatAverageDescription": "Your body fat percentage is in the average/acceptable range. This is considered a healthy range for general population. To improve body composition, consider incorporating strength training, cardiovascular exercise, and a balanced diet. Focus on gradual, sustainable changes for long-term health.", - "bodyFatObeseDescription": "Your body fat percentage is above the recommended healthy range. This may increase health risks including cardiovascular disease, diabetes, and joint problems. Consider consulting a healthcare provider or registered dietitian to develop a personalized plan that includes balanced nutrition, regular physical activity, and lifestyle modifications for sustainable weight management.", - "bmrNormalDescription": "Your Basal Metabolic Rate (BMR) is within the expected range for your profile. BMR is the energy your body needs at rest to maintain vital functions (breathing, circulation, temperature). Use this value as the baseline for estimating total daily energy needs by applying an activity multiplier. Maintain a balanced diet and regular physical activity to support metabolic health.", - "bmrLowDescription": "Your BMR is lower than typical for your profile. Possible causes include lower lean muscle mass, age-related metabolic decline, or metabolic adaptation from prolonged calorie restriction. Consider focusing on resistance training to build/maintain muscle, ensure adequate protein and micronutrient intake, and consult a healthcare professional if this is unexpected.", - "bmrHighDescription": "Your BMR is higher than average for your profile. This can reflect greater lean mass, younger age, or a naturally higher metabolic rate, meaning you burn more energy at rest. Use this information to tailor calorie targets: higher needs for maintenance or muscle gain, moderate deficit for weight loss. Seek medical advice if you notice rapid unexplained changes.", - "ibwAtTargetDescription": "Your weight is at the ideal target. Maintain your current habits — balanced diet and regular activity — to keep this.", - "ibwBelowTargetDescription": "You are below the ideal weight by {kg} kg. Aim to gradually increase weight with a modest calorie surplus, nutrient-dense foods, and resistance training.", - "ibwAboveTargetDescription": "You are above the ideal weight by {kg} kg. Aim for a gradual, sustainable weight reduction through a moderate calorie deficit, increased activity, and balanced nutrition.", - "ibwCloseToRangeDescription": "Your weight is close to the ideal range. Maintain a balanced diet and regular activity; follow personalized advice from a healthcare professional if needed.", - "ibwUnderweightDescription": "You are below the ideal weight by {kg} kg. Focus on increasing calorie intake with nutrient-dense foods, prioritize protein and resistance training to build healthy mass, and consider consulting a healthcare professional.", - "ibwUnderweightGenericDescription": "You appear underweight compared to the ideal. Consider increasing calorie intake with nutrient-dense foods and resistance training; seek professional guidance if needed.", - "ibwOverweightDescription": "You are above the ideal weight by {kg} kg. Aim for a gradual, sustainable weight loss strategy — moderate calorie deficit, regular physical activity, and balanced nutrition. Consult a professional before major changes.", - "ibwOverweightGenericDescription": "You appear above the ideal weight. Consider a gradual, sustainable calorie deficit combined with activity and balanced nutrition; consult a professional if needed.", - "dietVeryLowCarbsDescription": "Very low‑carb (ketogenic) approach: minimal carbohydrates, higher fat and moderate protein. May support rapid weight loss and improved blood sugar control for some, but can be hard to sustain and may cause nutrient gaps. Monitor hydration/electrolytes and consult a professional for long‑term use.", - "dietLowCarbsDescription": "Low‑carb, higher‑protein plan: reduced carbohydrates with increased protein to support satiety and muscle maintenance. Helpful for weight management and glycemic control when balanced with vegetables and healthy fats. Ensure adequate fiber and micronutrients.", - "dietModerateCarbsDescription": "Moderate carbohydrate intake with balanced protein and fats: provides steady energy for daily activity and exercise while allowing flexibility. Suitable for many people aiming for sustainable weight management and performance.", - "dietUSDAGuidelinesDescription": "USDA‑based balanced pattern: emphasizes fruits, vegetables, whole grains, lean proteins, and limited added sugars and saturated fats. Evidence‑based framework for general health, nutrient adequacy, and chronic disease prevention.", - "dietZoneDietDescription": "Zone Diet (~40% carbs / 30% protein / 30% fat): emphasizes hormonal balance and portion control. May improve body composition and energy for some, but requires planning; personalize with a nutrition professional.", - "contextDependent": "Context Dependent", - "calculatedValue": "Calculated Value", - "calculationFormula": "Calculation Formula", - "loadingAIAnalysis": "Analysing your results, Please be patient and let the AI do the magic, This might take some time.", - "symptoms": "Symptoms", - "insuranceInActive": "Insurance Inactive", - "insuranceInActiveContactSupport": "You have a valid insurance but it is currently inactive in HMG. Please contact HMG customer support to activate it.", - "updateAppNow": "Update App Now", - "Dr": "Dr.", - "reschedulingAppo": "Rescheduling Appointment, Please wait...", - "invalidEligibility": "You cannot make online payment because you are not eligible to use the provided service.", - "invalidInsurance": "You cannot make online payment because you do not have a valid insurance.", - "continueCash": "Continue as cash", - "applewatch": "Apple Watch", - "applehealthapplicationshouldbeinstalledinyourphone": "Apple Health application should be installed in your phone", - "unabletodetectapplicationinstalledpleasecomebackonceinstalled": "We are unable to detect the application installed in your device. Please come back here once you have installed this application.", - "applewatchshouldbeconnected": "Apple Watch should be connected", - "samsungwatch": "Samsung Watch", - "samsunghealthapplicationshouldbeinstalledinyourphone": "Samsung Health application should be installed in your phone", - "samsungwatchshouldbeconnected": "Samsung Watch should be connected", - "huaweiwatch": "Huawei Watch", - "huaweihealthapplicationshouldbeinstalledinyourphone": "Huawei Health application should be installed in your phone", - "huaweiwatchshouldbeconnected": "Huawei Watch should be connected", - "whoopwatch": "Whoop Watch", - "whoophealthapplicationshouldbeinstalledinyourphone": "Whoop Health application should be installed in your phone", - "whoopwatchshouldbeconnected": "Whoop Watch should be connected", - "updatetheinformation": "This will allow to gather the most up to date information from your apple watch", - "timeFor": "Time For", - "hmgPolicies": "HMG Policies", - "featureComingSoonDescription": "Feature is coming soon. We are actively working to bring more exciting features into the app. Stay tuned for updates.", - "darkMode": "Dark Mode", - "generateAiAnalysisResult": "Generate AI analysis for this result", - "ratings": "Ratings", - "hmgPharmacyText": "Al Habib Pharmacy, the complete online Pharmaceutical store brought to you by Dr. Sulaiman Al Habib Medical Services Group.", - "insuranceRequestSubmittedSuccessfully": "Your insurance update request has been successfully submitted. You will be notified once completed.", - "updatingEmailAddress": "Updating email address, Please wait...", - "verifyInsurance": "Verify Insurance", - "tests": "tests", - "calendarPermissionAlert": "Please grant calendar access permission from app settings to set medication reminder.", - "timeForFirstReminder": "Time for 1st reminder", - "reminderRemovalNote": "You can remove it from your calendar later by switching off the reminder", - "sortByLocation": "Sort by location", - "sortByNearestLocation": "Sort by nearest to your location", - "giveLocationPermissionForNearestList": "Please grant location permission from app settings to see the nearest locations.", - "communicationLanguage": "Communication Language", - "cmcServiceHeader": "Complete Health Checkup: Advanced diagnostics, Detailed Health insights", - "cmcServiceDescription": "Get detailed insights into your health with our advanced diagnostics. Understand your body better for a healthier future.", - "eReferralServiceHeader": "HMG Hospital E-Referral: Streamlined patient referrals", - "eReferralServiceDescription": "Facilitate seamless patient transfers to HMG with our secure e-referral system. Ensure continuity of care for every patient.", - "bloodDonationServiceHeader": "Give Blood, Save Lives. Your donation makes a difference.", - "bloodDonationServiceDescription": "Donate blood, empower lives. Your contribution creates hope. Join our blood drive and be a lifeline for those in need. Every drop counts!", - "healthTrackersServiceHeader": "Track Your Vitals with Ease and effortlessly ", - "healthTrackersServiceDescription": "Input your metrics for continuous heart rate monitoring, blood pressure and precise daily activity summaries. Stay informed and optimize your well-being with ease.", - "waterConsumptionServiceHeader": "Stay Hydrated, Stay Healthy. Track your daily water intake with ease.", - "waterConsumptionServiceDescription": "Quench your thirst, track your health. Effortlessly monitor your daily water intake with our user-friendly app, ensuring optimal hydration and well-being.", - "smartWatchServiceHeader": "Sync Your Smartwatch with Health Apps", - "smartWatchServiceDescription": "Seamlessly connect your smartwatch to our health app for effortless data tracking and personalized insights.", - "liveChatServiceHeader": "24/7 Expert\nAssistance", - "liveChatServiceDescription": "Need help ? Our live chat connects you with expert support for any questions about features, settings, or troubleshooting.", - "emergencyServiceHeader": "ER Check-in, Faster Than Ever. Call ambulance / Rapid Response Team instantly", - "emergencyServiceDescription": "In a medical emergency? Our ambulances and rapid response teams are on standby 24/7. Plus, quick ER check-in for faster care.", - "homeHealthCareServiceHeader": "Your Health, Elevated. Premium care, delivered to your doorstep.", - "homeHealthCareServiceDescription": "We bring quality healthcare to your doorstep. Experienced nurses providing compassionate care in the comfort of your home.", - "profileOnlyText": "Profile", - "information": "Information", - "noFavouriteDoctors": "You don't have any favourite list yet", - "addDoctors": "Add Doctors", - "favouriteList": "Favourite List", - "later": "Later", - "cancelAppointmentConfirmMessage": "Are you sure you want to cancel this appointment?", - "acknowledged": "Acknowledged", - "searchLabResults": "Search lab results", - "callForAssistance": "Call for immediate assistance", - "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", - "clinicSchedule": "Clinic Schedule", - "doctorAddedToFavourite": "Added to favorites list", - "doctorRemovedFromFavourite": "Removed from favorites list", - "favourites": "Favourites", - "addNewFavorite": "Add new favourite", - "pendingAncillaryOrders": "Pending ancillary orders", - "liveCarePermissions": "LiveCare requires Camera, Microphone & Notifications permissions to enable virtual consultation between patient & doctor, Open app settings to allow them.", - "containsImage": "Contains Image", - "servicesSelected": "Service(s) Selected", - "selectMedicalFileFromFamily": "Select a medical file from your family", - "anyFileFromHMG": "Any active medical file from HMG", - "noDistance": "Distance not available", - "enterAmount": "Please enter amount to continue.", - "selectHospitalContinue": "Please select hospital to continue.", - "year": "Year", - "notifyPrescription": "Notify me before the consumption time", - "doctorRatingAppointment": "Doctor\nRating", - "ratingSubmitted": "Rating Submitted", - "rateTheDoctor": "Please rate the doctor", - "downloadInvoice": "Download Invoice", - "approvalDetails": "Approval Details", - "obese": "Obese", - "overWeight": "OverWeight", - "underWeight": "UnderWeight", - "nearestGate": "Nearest Gate", - "RRTDDetails": "The Rapid response team provides a comprehensive medical service for all sorts of urgent and stable cases of all ages, including adult and paediatric patients.", - "normalMapType": "Default", - "satelliteMapType": "Satellite", - "terrainMapType": "Terrain", - "hybridMapType": "Hybrid", - "openCamera": "Open Camera", - "openGallery": "Open Gallery", - "openFiles": "Open Files", - "generateAiAnalysisRadResult": "Generate AI analysis for this result", - "grantLocationPermission": "Please grant location permission from app settings to see better results.", - "NoBookedAppointments": "No Booked Appointments", - "aiDisclaimerRad": "Your radiology result data will be securely shared with our AI Analyzer for analysis. This helps provide personalized health insights. Do you want to proceed?", - "imageSizeTooLarge": "Image size is too large. Maximum size is 1MB", - "profileImageUpdatedSuccessfully": "Profile image updated successfully", - "failedToProcessImage": "Failed to process image. Please try again", - "cameraGalleryPermissionMessage": "Camera and Gallery permissions are required to upload profile picture. Please grant permissions from app settings.", - "cameraGalleryPermissionRequired": "Camera and Gallery permissions are required", - "cameraPermissionMessage": "Camera permission is required to take photos. Please grant permission from app settings.", - "cameraPermissionRequired": "Camera permission is required", - "galleryPermissionMessage": "Gallery permission is required to select photos. Please grant permission from app settings.", - "galleryPermissionRequired": "Gallery permission is required", - "failedToCheckPermissions": "Failed to check permissions. Please try again", - "takePhotoWithCamera": "Take a photo with your camera", - "selectFromPhotoLibrary": "Select from your photo library", - "selectDocumentFiles": "Select document files", - "profilePicture": "Profile Picture", - "sendingAskDrRequest": "Sending Request...", - "askDrRequestSentSuccess": "Request has been sent successfully, The doctor will get back to you soon.", - "onlineCheckIn24HoursOnly": "Online Check-In is only available within 4 hours of the appointment time." -}; -static const Map> mapLocales = {"ar_SA": _ar_SA, "en_US": _en_US}; -} diff --git a/lib/generated/locale_kesy.g.dart b/lib/generated/locale_kesy.g.dart deleted file mode 100644 index 06f92632..00000000 --- a/lib/generated/locale_kesy.g.dart +++ /dev/null @@ -1,1737 +0,0 @@ -// DO NOT EDIT. This is code generated via package:easy_localization/generate.dart - -// ignore_for_file: constant_identifier_names - -abstract class LocaleKeys { - static const english = 'english'; - static const arabic = 'arabic'; - static const login = 'login'; - static const noDataAvailable = 'noDataAvailable'; - static const noRatingAvailable = 'noRatingAvailable'; - static const doctorDoesNotHaveRating = 'doctorDoesNotHaveRating'; - static const confirm = 'confirm'; - static const loadingText = 'loadingText'; - static const kilometerUnit = 'kilometerUnit'; - static const dashboardScreenToolbarTitle = 'dashboardScreenToolbarTitle'; - static const settings = 'settings'; - static const language = 'language'; - static const lanEnglish = 'lanEnglish'; - static const lanArabic = 'lanArabic'; - static const cancel = 'cancel'; - static const done = 'done'; - static const replay2 = 'replay2'; - static const home = 'home'; - static const services = 'services'; - static const mySchedule = 'mySchedule'; - static const logout = 'logout'; - static const respirationRate = 'respirationRate'; - static const bookAppo = 'bookAppo'; - static const searchBy = 'searchBy'; - static const clinic = 'clinic'; - static const byClinic = 'byClinic'; - static const hospital = 'hospital'; - static const byHospital = 'byHospital'; - static const name = 'name'; - static const doctor = 'doctor'; - static const clinicName = 'clinicName'; - static const hospitalName = 'hospitalName'; - static const noClinicFound = 'noClinicFound'; - static const doctorName = 'doctorName'; - static const nearestAppo = 'nearestAppo'; - static const searchByDocText = 'searchByDocText'; - static const enterDocName = 'enterDocName'; - static const search = 'search'; - static const noResultFound = 'noResultFound'; - static const noSearchResultFound = 'noSearchResultFound'; - static const pleaseEnterProductName = 'pleaseEnterProductName'; - static const bookNow = 'bookNow'; - static const docInfo = 'docInfo'; - static const appoInfo = 'appoInfo'; - static const availableAppo = 'availableAppo'; - static const gender = 'gender'; - static const nationality = 'nationality'; - static const neverWait = 'neverWait'; - static const reminderTitle = 'reminderTitle'; - static const appointmentCalendar = 'appointmentCalendar'; - static const appointmentSuccess = 'appointmentSuccess'; - static const docQualifications = 'docQualifications'; - static const pressAgain = 'pressAgain'; - static const laserMaxLimitReach = 'laserMaxLimitReach'; - static const confirmAppoHeading = 'confirmAppoHeading'; - static const patientInfo = 'patientInfo'; - static const doctorFilter = 'doctorFilter'; - static const bookSuccess = 'bookSuccess'; - static const patientShare = 'patientShare'; - static const patientShareWithTax = 'patientShareWithTax'; - static const confirmAppo = 'confirmAppo'; - static const confirmLiveCare = 'confirmLiveCare'; - static const waitingForDoctor = 'waitingForDoctor'; - static const appointment = 'appointment'; - static const confirmLater = 'confirmLater'; - static const todoList = 'todoList'; - static const appoActions = 'appoActions'; - static const date = 'date'; - static const time = 'time'; - static const pendingPayment = 'pendingPayment'; - static const payNow = 'payNow'; - static const viewQR = 'viewQR'; - static const instruction = 'instruction'; - static const livecare = 'livecare'; - static const livecareAppo = 'livecareAppo'; - static const agreeTo = 'agreeTo'; - static const termsConditoins = 'termsConditoins'; - static const cancelAppoMsg = 'cancelAppoMsg'; - static const changePayment = 'changePayment'; - static const upcomingNoAction = 'upcomingNoAction'; - static const upcomingConfirm = 'upcomingConfirm'; - static const bookSuccessConfirmMore2412 = 'bookSuccessConfirmMore2412'; - static const upcomingPaymentPending = 'upcomingPaymentPending'; - static const upcomingPaymentNow = 'upcomingPaymentNow'; - static const timeUntilAppointment = 'timeUntilAppointment'; - static const appointmentTimePassed = 'appointmentTimePassed'; - static const upcomingQR = 'upcomingQR'; - static const upcomingVirtual = 'upcomingVirtual'; - static const upcomingLivecare = 'upcomingLivecare'; - static const upcomingDetails = 'upcomingDetails'; - static const reschedule = 'reschedule'; - static const raise = 'raise'; - static const complaint = 'complaint'; - static const add = 'add'; - static const reminder = 'reminder'; - static const location = 'location'; - static const online = 'online'; - static const payment = 'payment'; - static const onlinePayment = 'onlinePayment'; - static const onlinePaymentSubtitle = 'onlinePaymentSubtitle'; - static const cancelNocaps = 'cancelNocaps'; - static const setReminder = 'setReminder'; - static const nationalIdNumber = 'nationalIdNumber'; - static const medicalFileNumber = 'medicalFileNumber'; - static const loginregister = 'loginregister'; - static const poweredBy = 'poweredBy'; - static const welcome = 'welcome'; - static const welcomeToDrSulaiman = 'welcomeToDrSulaiman'; - static const patientApp = 'patientApp'; - static const welcomeText = 'welcomeText'; - static const drSulaimanText = 'drSulaimanText'; - static const welcomeText2 = 'welcomeText2'; - static const yes = 'yes'; - static const no = 'no'; - static const logintyperadio = 'logintyperadio'; - static const registernow = 'registernow'; - static const nationalID = 'nationalID'; - static const nationalId = 'nationalId'; - static const fileNo = 'fileNo'; - static const fileno = 'fileno'; - static const forgotFileNo = 'forgotFileNo'; - static const forgotFileNoTitle = 'forgotFileNoTitle'; - static const enterNationalId = 'enterNationalId'; - static const profileInfo = 'profileInfo'; - static const submit = 'submit'; - static const forgotDesc = 'forgotDesc'; - static const dob = 'dob'; - static const hijriDate = 'hijriDate'; - static const gregorianDate = 'gregorianDate'; - static const verifyLoginWith = 'verifyLoginWith'; - static const registerUser = 'registerUser'; - static const verifyWithFingerprint = 'verifyWithFingerprint'; - static const verifyWithFaceid = 'verifyWithFaceid'; - static const verifyWithSms = 'verifyWithSms'; - static const verifyWithWhatsapp = 'verifyWithWhatsapp'; - static const verifyThrough = 'verifyThrough'; - static const lastLogin = 'lastLogin'; - static const lastLoginWith = 'lastLoginWith'; - static const verifyFingerprint = 'verifyFingerprint'; - static const searchMedicine = 'searchMedicine'; - static const pharmaciesList = 'pharmaciesList'; - static const searchMedicineHere = 'searchMedicineHere'; - static const description = 'description'; - static const howToUse = 'howToUse'; - static const price = 'price'; - static const youCanFindItIn = 'youCanFindItIn'; - static const pleaseEnterMedicineName = 'pleaseEnterMedicineName'; - static const verificationMessage = 'verificationMessage'; - static const validationMessage = 'validationMessage'; - static const notification = 'notification'; - static const appSettings = 'appSettings'; - static const rateApp = 'rateApp'; - static const before = 'before'; - static const minute = 'minute'; - static const hour = 'hour'; - static const reminderSuccess = 'reminderSuccess'; - static const reminderCancelSuccess = 'reminderCancelSuccess'; - static const patientShareToDo = 'patientShareToDo'; - static const patientTaxToDo = 'patientTaxToDo'; - static const patientShareTotalToDo = 'patientShareTotalToDo'; - static const paymentMethod = 'paymentMethod'; - static const noNeedToWaitInLine = 'noNeedToWaitInLine'; - static const useQRAppoAttend = 'useQRAppoAttend'; - static const passQRAppoAttend = 'passQRAppoAttend'; - static const sitWaitingQR = 'sitWaitingQR'; - static const attendRegisterCode = 'attendRegisterCode'; - static const scanQRHospital = 'scanQRHospital'; - static const scanNFC = 'scanNFC'; - static const sendEmail = 'sendEmail'; - static const success = 'success'; - static const emailSentSuccessfully = 'emailSentSuccessfully'; - static const emailSentError = 'emailSentError'; - static const close = 'close'; - static const closeIt = 'closeIt'; - static const booked = 'booked'; - static const confirmed = 'confirmed'; - static const arrived = 'arrived'; - static const payNowBookSuccess = 'payNowBookSuccess'; - static const payNowBookSuccesstext1 = 'payNowBookSuccesstext1'; - static const payNowBookSuccesstext2 = 'payNowBookSuccesstext2'; - static const payLater = 'payLater'; - static const askDocNotAllowed = 'askDocNotAllowed'; - static const moreVerify = 'moreVerify'; - static const welcomeBack = 'welcomeBack'; - static const accountInfo = 'accountInfo'; - static const anotherAcc = 'anotherAcc'; - static const next = 'next'; - static const firstName = 'firstName'; - static const middleName = 'middleName'; - static const lastName = 'lastName'; - static const preferredLanguage = 'preferredLanguage'; - static const locationsRegister = 'locationsRegister'; - static const ksa = 'ksa'; - static const dubai = 'dubai'; - static const enterEmail = 'enterEmail'; - static const family = 'family'; - static const familyTitle = 'familyTitle'; - static const familyTitle2 = 'familyTitle2'; - static const myFamily = 'myFamily'; - static const addNewMember = 'addNewMember'; - static const sentRequests = 'sentRequests'; - static const recievedRequests = 'recievedRequests'; - static const manageFiles = 'manageFiles'; - static const oxygenation = 'oxygenation'; - static const bodyMeasurements = 'bodyMeasurements'; - static const temperature = 'temperature'; - static const pulse = 'pulse'; - static const respiration = 'respiration'; - static const bloodPressure = 'bloodPressure'; - static const painScale = 'painScale'; - static const weight = 'weight'; - static const height = 'height'; - static const heart = 'heart'; - static const heightUnit = 'heightUnit'; - static const weightUnit = 'weightUnit'; - static const unit = 'unit'; - static const request = 'request'; - static const memberName = 'memberName'; - static const switchLogin = 'switchLogin'; - static const removeMember = 'removeMember'; - static const allowView = 'allowView'; - static const rejectView = 'rejectView'; - static const deleteView = 'deleteView'; - static const approvals = 'approvals'; - static const approvalNo = 'approvalNo'; - static const companyName = 'companyName'; - static const receiptOn = 'receiptOn'; - static const expiryDate = 'expiryDate'; - static const expiryPoints = 'expiryPoints'; - static const expiryOn = 'expiryOn'; - static const procedureName = 'procedureName'; - static const procedure = 'procedure'; - static const procedureStatus = 'procedureStatus'; - static const usageStatus = 'usageStatus'; - static const unusedCount = 'unusedCount'; - static const totalApproval = 'totalApproval'; - static const category = 'category'; - static const expirationDate = 'expirationDate'; - static const patientCard = 'patientCard'; - static const policyNumber = 'policyNumber'; - static const seeDetails = 'seeDetails'; - static const insuranceCards = 'insuranceCards'; - static const requestType = 'requestType'; - static const registerInfoFamily = 'registerInfoFamily'; - static const removeFamilyMember = 'removeFamilyMember'; - static const myMedicalFile = 'myMedicalFile'; - static const myMedicalFileSubTitle = 'myMedicalFileSubTitle'; - static const viewMore = 'viewMore'; - static const homeHealthCareService = 'homeHealthCareService'; - static const onlinePharmacy = 'onlinePharmacy'; - static const emergencyService = 'emergencyService'; - static const onlinePaymentService = 'onlinePaymentService'; - static const offersAndPackages = 'offersAndPackages'; - static const comprehensiveMedicalCheckup = 'comprehensiveMedicalCheckup'; - static const hmgService = 'hmgService'; - static const viewAllHabibMedicalService = 'viewAllHabibMedicalService'; - static const viewAll = 'viewAll'; - static const view = 'view'; - static const contactUs = 'contactUs'; - static const contactUsLocation = 'contactUsLocation'; - static const contactUsTime = 'contactUsTime'; - static const viewAllWaysReachUs = 'viewAllWaysReachUs'; - static const medicalProfile = 'medicalProfile'; - static const consultation = 'consultation'; - static const logs = 'logs'; - static const textToSpeech = 'textToSpeech'; - static const locationDialogMessage = 'locationDialogMessage'; - static const userViewRequester = 'userViewRequester'; - static const userView = 'userView'; - static const parking = 'parking'; - static const alhabiServices = 'alhabiServices'; - static const parkingTitle = 'parkingTitle'; - static const parkingDescription = 'parkingDescription'; - static const appointments = 'appointments'; - static const all2 = 'all2'; - static const checkinOption = 'checkinOption'; - static const readBarcode = 'readBarcode'; - static const showMyPark = 'showMyPark'; - static const clearMyData = 'clearMyData'; - static const floor = 'floor'; - static const gate = 'gate'; - static const building = 'building'; - static const branch = 'branch'; - static const emergencyServices = 'emergencyServices'; - static const nearester = 'nearester'; - static const locationa = 'locationa'; - static const callNow = 'callNow'; - static const ambulancerequest = 'ambulancerequest'; - static const requestA = 'requestA'; - static const noBookedAppointments = 'noBookedAppointments'; - static const noConfirmedAppointments = 'noConfirmedAppointments'; - static const noArrivedAppointments = 'noArrivedAppointments'; - static const myAppointmentsList = 'myAppointmentsList'; - static const myAppointments = 'myAppointments'; - static const radiology = 'radiology'; - static const radiologySubtitle = 'radiologySubtitle'; - static const lab = 'lab'; - static const labSubtitle = 'labSubtitle'; - static const medicines = 'medicines'; - static const medicinesSubtitle = 'medicinesSubtitle'; - static const vitalSigns = 'vitalSigns'; - static const vitalSignsSubTitle = 'vitalSignsSubTitle'; - static const vitalSignNormal = 'vitalSignNormal'; - static const vitalSignLow = 'vitalSignLow'; - static const vitalSignHigh = 'vitalSignHigh'; - static const vitalSignObese = 'vitalSignObese'; - static const vitalSignOverweight = 'vitalSignOverweight'; - static const vitalSignUnderweight = 'vitalSignUnderweight'; - static const vitalSignSkinny = 'vitalSignSkinny'; - static const myMedical = 'myMedical'; - static const myMedicalSubtitle = 'myMedicalSubtitle'; - static const myDoctor = 'myDoctor'; - static const myDoctorSubtitle = 'myDoctorSubtitle'; - static const myDoctorSubtitle2 = 'myDoctorSubtitle2'; - static const eye = 'eye'; - static const eyeSubtitle = 'eyeSubtitle'; - static const insurance = 'insurance'; - static const insurance2 = 'insurance2'; - static const insuranceSubtitle = 'insuranceSubtitle'; - static const updateInsurance = 'updateInsurance'; - static const updateInsuranceSubtitle = 'updateInsuranceSubtitle'; - static const insuranceApproval = 'insuranceApproval'; - static const insuranceApprovalSubtitle = 'insuranceApprovalSubtitle'; - static const allergies = 'allergies'; - static const allergiesSubtitle = 'allergiesSubtitle'; - static const myVaccines = 'myVaccines'; - static const myVaccinesSubtitle = 'myVaccinesSubtitle'; - static const medical = 'medical'; - static const medicalSubtitle = 'medicalSubtitle'; - static const monthly = 'monthly'; - static const monthlySubtitle = 'monthlySubtitle'; - static const sick = 'sick'; - static const sick2 = 'sick2'; - static const sickSubtitle = 'sickSubtitle'; - static const myBalance = 'myBalance'; - static const myBalanceSubtitle = 'myBalanceSubtitle'; - static const patientCall = 'patientCall'; - static const patientCallSubtitle = 'patientCallSubtitle'; - static const smartWatches = 'smartWatches'; - static const smartWatchesSubtitle = 'smartWatchesSubtitle'; - static const myTrackers = 'myTrackers'; - static const myTrackersSubtitle = 'myTrackersSubtitle'; - static const askYour = 'askYour'; - static const askYourSubtitle = 'askYourSubtitle'; - static const internet = 'internet'; - static const internetSubtitle = 'internetSubtitle'; - static const chatbot = 'chatbot'; - static const chatbotSubtitle = 'chatbotSubtitle'; - static const timeLine = 'timeLine'; - static const labOrders = 'labOrders'; - static const billNo = 'billNo'; - static const prescriptions = 'prescriptions'; - static const history = 'history'; - static const orderNo = 'orderNo'; - static const orderDetails = 'orderDetails'; - static const deliveryDriverTrack = 'deliveryDriverTrack'; - static const deliveryLocation = 'deliveryLocation'; - static const driver = 'driver'; - static const vitalSign = 'vitalSign'; - static const monthlyReports = 'monthlyReports'; - static const km = 'km'; - static const km_ = 'km_'; - static const patientHealthSummaryReport = 'patientHealthSummaryReport'; - static const toViewTheTermsAndConditions = 'toViewTheTermsAndConditions'; - static const clickHere = 'clickHere'; - static const iAgreeToTheTermsAndConditions = 'iAgreeToTheTermsAndConditions'; - static const iAgreeToTheTermsAndConditionsSubtitle = 'iAgreeToTheTermsAndConditionsSubtitle'; - static const save = 'save'; - static const userAgreement = 'userAgreement'; - static const updateSuccessfully = 'updateSuccessfully'; - static const checkVaccineAvailability = 'checkVaccineAvailability'; - static const myVaccinesAvailability = 'myVaccinesAvailability'; - static const paymentService = 'paymentService'; - static const paymentOnline = 'paymentOnline'; - static const onlineCheckIn = 'onlineCheckIn'; - static const myBalances = 'myBalances'; - static const myWallet = 'myWallet'; - static const balanceAmount = 'balanceAmount'; - static const totalBalance = 'totalBalance'; - static const createAdvancedPayment = 'createAdvancedPayment'; - static const advancePayment = 'advancePayment'; - static const advancePaymentLabel = 'advancePaymentLabel'; - static const fileNumber = 'fileNumber'; - static const amount = 'amount'; - static const depositorEmail = 'depositorEmail'; - static const notes = 'notes'; - static const selectPatientName = 'selectPatientName'; - static const selectFamilyPatientName = 'selectFamilyPatientName'; - static const selectHospital = 'selectHospital'; - static const selectCity = 'selectCity'; - static const city = 'city'; - static const distance = 'distance'; - static const myAccount = 'myAccount'; - static const otherAccount = 'otherAccount'; - static const selectBeneficiary = 'selectBeneficiary'; - static const confirmThePayment = 'confirmThePayment'; - static const depositorName = 'depositorName'; - static const mobileNumber = 'mobileNumber'; - static const phoneNumber = 'phoneNumber'; - static const country = 'country'; - static const ok = 'ok'; - static const averageWaitingTime = 'averageWaitingTime'; - static const waitingTime = 'waitingTime'; - static const waterConsumedInWeek = 'waterConsumedInWeek'; - static const waterConsumedInMonth = 'waterConsumedInMonth'; - static const theVerificationCodeExpiresIn = 'theVerificationCodeExpiresIn'; - static const pleaseEnterTheVerificationCode = 'pleaseEnterTheVerificationCode'; - static const eyeMeasurements = 'eyeMeasurements'; - static const measurements = 'measurements'; - static const classes = 'classes'; - static const contactLens = 'contactLens'; - static const rightEye = 'rightEye'; - static const sphere = 'sphere'; - static const cylinder = 'cylinder'; - static const axis = 'axis'; - static const prism = 'prism'; - static const va = 'va'; - static const leftEye = 'leftEye'; - static const brand = 'brand'; - static const power = 'power'; - static const diameter = 'diameter'; - static const remarks = 'remarks'; - static const activeMedications = 'activeMedications'; - static const expDate = 'expDate'; - static const route = 'route'; - static const frequency = 'frequency'; - static const dailyQuantity = 'dailyQuantity'; - static const addReminder = 'addReminder'; - static const cancelReminder = 'cancelReminder'; - static const reminderDes = 'reminderDes'; - static const pleaseSelectAllQuestionToContinue = 'pleaseSelectAllQuestionToContinue'; - static const startDay = 'startDay'; - static const endDay = 'endDay'; - static const days = 'days'; - static const pleaseVerify = 'pleaseVerify'; - static const scheduleTime = 'scheduleTime'; - static const askDoctor = 'askDoctor'; - static const doctorResponses = 'doctorResponses'; - static const ne_w = 'ne_w'; - static const all = 'all'; - static const dailyWater = 'dailyWater'; - static const questionHere = 'questionHere'; - static const viewDoctorResponses = 'viewDoctorResponses'; - static const serviceInformationButton = 'serviceInformationButton'; - static const serviceInformationTitle = 'serviceInformationTitle'; - static const serviceInformation = 'serviceInformation'; - static const homeHealthCare = 'homeHealthCare'; - static const noAppointmentAvailable = 'noAppointmentAvailable'; - static const loginRegister = 'loginRegister'; - static const orderLog = 'orderLog'; - static const infoLab = 'infoLab'; - static const infoRadiology = 'infoRadiology'; - static const noReviewsAvailable = 'noReviewsAvailable'; - static const noLocationAvailable = 'noLocationAvailable'; - static const orders = 'orders'; - static const lakum = 'lakum'; - static const lakumMsg = 'lakumMsg'; - static const lakumPoint = 'lakumPoint'; - static const wishlist = 'wishlist'; - static const products = 'products'; - static const reviews = 'reviews'; - static const brands = 'brands'; - static const productDetails = 'productDetails'; - static const medicationRefill = 'medicationRefill'; - static const pillReminder = 'pillReminder'; - static const shippingAddresses = 'shippingAddresses'; - static const reachUs = 'reachUs'; - static const ourLocations = 'ourLocations'; - static const edit = 'edit'; - static const whatsApp = 'whatsApp'; - static const phone = 'phone'; - static const delete = 'delete'; - static const deleteAddress = 'deleteAddress'; - static const deletedAddres = 'deletedAddres'; - static const addAddress = 'addAddress'; - static const addNewAddress = 'addNewAddress'; - static const order = 'order'; - static const delivered = 'delivered'; - static const pending = 'pending'; - static const enterNameHere = 'enterNameHere'; - static const processing = 'processing'; - static const cancelled = 'cancelled'; - static const writeReview = 'writeReview'; - static const shareReview = 'shareReview'; - static const review = 'review'; - static const viewMedicalFile = 'viewMedicalFile'; - static const viewAllServices = 'viewAllServices'; - static const medicalFile = 'medicalFile'; - static const verified = 'verified'; - static const checkup = 'checkup'; - static const hhcHome = 'hhcHome'; - static const refferal = 'refferal'; - static const refferalTitle = 'refferalTitle'; - static const refferalSubTitle = 'refferalSubTitle'; - static const healthCare = 'healthCare'; - static const emergency = 'emergency'; - static const emergency2 = 'emergency2'; - static const erservices = 'erservices'; - static const services2 = 'services2'; - static const services3 = 'services3'; - static const cantSeeProfile = 'cantSeeProfile'; - static const loginRegisterNow = 'loginRegisterNow'; - static const hmgPharmacy = 'hmgPharmacy'; - static const ecommerceSolution = 'ecommerceSolution'; - static const comprehensive = 'comprehensive'; - static const onlineConsulting = 'onlineConsulting'; - static const pendingOrder = 'pendingOrder'; - static const deliveredOrder = 'deliveredOrder'; - static const processingOrder = 'processingOrder'; - static const cancelledOrder = 'cancelledOrder'; - static const compare = 'compare'; - static const medicationsRefill = 'medicationsRefill'; - static const recommended = 'recommended'; - static const myPrescription = 'myPrescription'; - static const quantity = 'quantity'; - static const reviewAppointment = 'reviewAppointment'; - static const backMyAccount = 'backMyAccount'; - static const reviewSuccessful = 'reviewSuccessful'; - static const reviewShared = 'reviewShared'; - static const reviewComment = 'reviewComment'; - static const shippedMethod = 'shippedMethod'; - static const orderDetail = 'orderDetail'; - static const orderSummary = 'orderSummary'; - static const subtotal = 'subtotal'; - static const shipping = 'shipping'; - static const shipBy = 'shipBy'; - static const lakumPoints = 'lakumPoints'; - static const useLakumPoints = 'useLakumPoints'; - static const use = 'use'; - static const proceedPay = 'proceedPay'; - static const vat = 'vat'; - static const inclusiveVat = 'inclusiveVat'; - static const items = 'items'; - static const checkOut = 'checkOut'; - static const sar = 'sar'; - static const aed = 'aed'; - static const payOnline = 'payOnline'; - static const cancelOrder = 'cancelOrder'; - static const confirmAddress = 'confirmAddress'; - static const confirmLocation = 'confirmLocation'; - static const conditionsHMG = 'conditionsHMG'; - static const conditions = 'conditions'; - static const confirmDeleteMsg = 'confirmDeleteMsg'; - static const confirmDelete = 'confirmDelete'; - static const confirmCancellation = 'confirmCancellation'; - static const orderNumber = 'orderNumber'; - static const orderDate = 'orderDate'; - static const itemsNo = 'itemsNo'; - static const noOrder = 'noOrder'; - static const noResult = 'noResult'; - static const nonRecommended = 'nonRecommended'; - static const termsService = 'termsService'; - static const beforeusing = 'beforeusing'; - static const accept = 'accept'; - static const dataSafeInfo = 'dataSafeInfo'; - static const dataSafe = 'dataSafe'; - static const informational = 'informational'; - static const notUseInEmerbency = 'notUseInEmerbency'; - static const notUseInEmerbencyDetails = 'notUseInEmerbencyDetails'; - static const notUseInEmerbencyDetailsCall = 'notUseInEmerbencyDetailsCall'; - static const checkDiagnosis = 'checkDiagnosis'; - static const remeberthat = 'remeberthat'; - static const loginToUseService = 'loginToUseService'; - static const offersAndPromotions = 'offersAndPromotions'; - static const offers = 'offers'; - static const myPrescriptions = 'myPrescriptions'; - static const searchAndScanMedication = 'searchAndScanMedication'; - static const shopByBrands = 'shopByBrands'; - static const recentlyViewed = 'recentlyViewed'; - static const bestSellers = 'bestSellers'; - static const deleteAllItems = 'deleteAllItems'; - static const total = 'total'; - static const totalWithColonRight = 'totalWithColonRight'; - static const selectAddress = 'selectAddress'; - static const shippingAddress = 'shippingAddress'; - static const changeAddress = 'changeAddress'; - static const selectPaymentOption = 'selectPaymentOption'; - static const selectTamaraPlan = 'selectTamaraPlan'; - static const changeMethod = 'changeMethod'; - static const reviewOrder = 'reviewOrder'; - static const active = 'active'; - static const inactive = 'inactive'; - static const balance = 'balance'; - static const gained = 'gained'; - static const consumed = 'consumed'; - static const transferred = 'transferred'; - static const riyal = 'riyal'; - static const membersince = 'membersince'; - static const identification = 'identification'; - static const lakumMobile = 'lakumMobile'; - static const waitinggained = 'waitinggained'; - static const expired = 'expired'; - static const willBeExpired = 'willBeExpired'; - static const activateLAKUMAccount = 'activateLAKUMAccount'; - static const checkBeneficiary = 'checkBeneficiary'; - static const beneficiaryName = 'beneficiaryName'; - static const accountActivation = 'accountActivation'; - static const lakumTransfer = 'lakumTransfer'; - static const acceptLbl = 'acceptLbl'; - static const declineLbl = 'declineLbl'; - static const selectGender = 'selectGender'; - static const iAmA = 'iAmA'; - static const selectAge = 'selectAge'; - static const select = 'select'; - static const iAm = 'iAm'; - static const yearsOld = 'yearsOld'; - static const dragPoint = 'dragPoint'; - static const refine = 'refine'; - static const subGroup = 'subGroup'; - static const max = 'max'; - static const compeleteOrderMsg = 'compeleteOrderMsg'; - static const addToCompareMsg = 'addToCompareMsg'; - static const itInListMsg = 'itInListMsg'; - static const compareListFull = 'compareListFull'; - static const addQuantity = 'addQuantity'; - static const addToCartMsg = 'addToCartMsg'; - static const addToWishlistMsg = 'addToWishlistMsg'; - static const notifyMeMsg = 'notifyMeMsg'; - static const removeFromWishlistMsg = 'removeFromWishlistMsg'; - static const min = 'min'; - static const reset = 'reset'; - static const apply = 'apply'; - static const viewCategorise = 'viewCategorise'; - static const viewSubCategorise = 'viewSubCategorise'; - static const categorise = 'categorise'; - static const wishList = 'wishList'; - static const cart = 'cart'; - static const alhabibapp = 'alhabibapp'; - static const searchProductHere = 'searchProductHere'; - static const hhcNotAuthMsg = 'hhcNotAuthMsg'; - static const email = 'email'; - static const book = 'book'; - static const appointmentLabel = 'appointmentLabel'; - static const bloodType = 'bloodType'; - static const maritalStatus = 'maritalStatus'; - static const general = 'general'; - static const profile = 'profile'; - static const notifications = 'notifications'; - static const notificationDetails = 'notificationDetails'; - static const notificationDetailsa = 'notificationDetailsa'; - static const infoMyDoctorPoints = 'infoMyDoctorPoints'; - static const infoMyDoctor = 'infoMyDoctor'; - static const infoPrescriptions = 'infoPrescriptions'; - static const infoMyPrescriptionPoints = 'infoMyPrescriptionPoints'; - static const infoInsuranceCards = 'infoInsuranceCards'; - static const infoInsuranceCardsPoints = 'infoInsuranceCardsPoints'; - static const infoAllergies = 'infoAllergies'; - static const infoSickLeaves = 'infoSickLeaves'; - static const infoSickLeavePoints = 'infoSickLeavePoints'; - static const infoApprovals = 'infoApprovals'; - static const infoApprovalPoints = 'infoApprovalPoints'; - static const infoMonthReport = 'infoMonthReport'; - static const languageSetting = 'languageSetting'; - static const alert = 'alert'; - static const emailAlert = 'emailAlert'; - static const smsAlert = 'smsAlert'; - static const contactInfo = 'contactInfo'; - static const emrgName = 'emrgName'; - static const emrgNo = 'emrgNo'; - static const modes = 'modes'; - static const vibration = 'vibration'; - static const blindModes = 'blindModes'; - static const invertTheme = 'invertTheme'; - static const offTheme = 'offTheme'; - static const dimTheme = 'dimTheme'; - static const bwTheme = 'bwTheme'; - static const permissions = 'permissions'; - static const cameraPermission = 'cameraPermission'; - static const locationPermission = 'locationPermission'; - static const needPrescription = 'needPrescription'; - static const outOfStockMsg = 'outOfStockMsg'; - static const noArabicLetters = 'noArabicLetters'; - static const noOffersAvailable = 'noOffersAvailable'; - static const accessibility = 'accessibility'; - static const orderStatus = 'orderStatus'; - static const findUs = 'findUs'; - static const liveChat = 'liveChat'; - static const service = 'service'; - static const hmgServiceLabel = 'hmgServiceLabel'; - static const healthWeatherIndicators = 'healthWeatherIndicators'; - static const healthTipsBasedOnCurrentWeather = 'healthTipsBasedOnCurrentWeather'; - static const moreDetails = 'moreDetails'; - static const resendOrder = 'resendOrder'; - static const ports = 'ports'; - static const way = 'way'; - static const dailyDoses = 'dailyDoses'; - static const period = 'period'; - static const duration = 'duration'; - static const cm = 'cm'; - static const ft = 'ft'; - static const kg = 'kg'; - static const lb = 'lb'; - static const birthDate = 'birthDate'; - static const dateOfBirth = 'dateOfBirth'; - static const mass = 'mass'; - static const tempC = 'tempC'; - static const bpm = 'bpm'; - static const respirationSigns = 'respirationSigns'; - static const sysDias = 'sysDias'; - static const body = 'body'; - static const bodyString = 'bodyString'; - static const face = 'face'; - static const retouch = 'retouch'; - static const bikini = 'bikini'; - static const totalMinutes = 'totalMinutes'; - static const feedback = 'feedback'; - static const likeToHear = 'likeToHear'; - static const emptySubject = 'emptySubject'; - static const emptyMessage = 'emptyMessage'; - static const selectAttachment = 'selectAttachment'; - static const complainAppo = 'complainAppo'; - static const complainAppoAlt = 'complainAppoAlt'; - static const messageType = 'messageType'; - static const feedbackType = 'feedbackType'; - static const compliment = 'compliment'; - static const suggestion = 'suggestion'; - static const yourFeedback = 'yourFeedback'; - static const selectPart = 'selectPart'; - static const number = 'number'; - static const notClassified = 'notClassified'; - static const selectClinic = 'selectClinic'; - static const selectProject = 'selectProject'; - static const searchItemError = 'searchItemError'; - static const youCanFind = 'youCanFind'; - static const itemInSearch = 'itemInSearch'; - static const bloodDonation = 'bloodDonation'; - static const bloodDonationInfo = 'bloodDonationInfo'; - static const bloodInstruction = 'bloodInstruction'; - static const aboutBloodDonation = 'aboutBloodDonation'; - static const bloodDonationDescription = 'bloodDonationDescription'; - static const bloodDonationBenefit1 = 'bloodDonationBenefit1'; - static const bloodDonationBenefit2 = 'bloodDonationBenefit2'; - static const bloodDonationBenefit3 = 'bloodDonationBenefit3'; - static const viewTerms = 'viewTerms'; - static const wantConnectHmgNetwork = 'wantConnectHmgNetwork'; - static const failedToAccessHmgServices = 'failedToAccessHmgServices'; - static const offerAndPackages = 'offerAndPackages'; - static const offerAndPackagesDetails = 'offerAndPackagesDetails'; - static const invoiceNo = 'invoiceNo'; - static const invoiceDate = 'invoiceDate'; - static const specialResult = 'specialResult'; - static const generalResult = 'generalResult'; - static const showMoreBtn = 'showMoreBtn'; - static const value = 'value'; - static const report = 'report'; - static const openRad = 'openRad'; - static const sendCopy = 'sendCopy'; - static const appoSurvey = 'appoSurvey'; - static const appoSurveySubtitle = 'appoSurveySubtitle'; - static const labResults = 'labResults'; - static const doctorRating = 'doctorRating'; - static const good = 'good'; - static const vGood = 'vGood'; - static const excellent = 'excellent'; - static const average = 'average'; - static const infoSigns = 'infoSigns'; - static const infoAdvancePayment = 'infoAdvancePayment'; - static const infoMyBalance = 'infoMyBalance'; - static const erContant = 'erContant'; - static const infoAmbulance = 'infoAmbulance'; - static const infoMyAppointments = 'infoMyAppointments'; - static const infoTodo = 'infoTodo'; - static const familyInfo = 'familyInfo'; - static const rrtdDetails = 'rrtdDetails'; - static const homeHealthCareText = 'homeHealthCareText'; - static const onlineCheckInAgreement = 'onlineCheckInAgreement'; - static const infoEreferral = 'infoEreferral'; - static const erConsultation = 'erConsultation'; - static const myInvoice = 'myInvoice'; - static const invoiceList = 'invoiceList'; - static const invoiceList2 = 'invoiceList2'; - static const allInvoices = 'allInvoices'; - static const hospitals = 'hospitals'; - static const clinics = 'clinics'; - static const doctors = 'doctors'; - static const selectDoctor = 'selectDoctor'; - static const thisItemIsNotAvailable = 'thisItemIsNotAvailable'; - static const beforeAfterImages = 'beforeAfterImages'; - static const clinicAcceptLivecare = 'clinicAcceptLivecare'; - static const livecareModalTop = 'livecareModalTop'; - static const livecarePoint2 = 'livecarePoint2'; - static const livecarePoint3 = 'livecarePoint3'; - static const livecarePoint4 = 'livecarePoint4'; - static const livecarePoint5 = 'livecarePoint5'; - static const bookImmediateLivecare = 'bookImmediateLivecare'; - static const bookVideoLivecare2 = 'bookVideoLivecare2'; - static const noThankyou = 'noThankyou'; - static const visitClinic = 'visitClinic'; - static const generateCovidCertificate = 'generateCovidCertificate'; - static const isReportOutsideKsa = 'isReportOutsideKsa'; - static const passportNumber = 'passportNumber'; - static const enterPassportNumber = 'enterPassportNumber'; - static const validPassportNumber = 'validPassportNumber'; - static const continuePlan = 'continuePlan'; - static const aboutApp = 'aboutApp'; - static const dontHaveAccount = 'dontHaveAccount'; - static const loginOrRegister = 'loginOrRegister'; - static const myFiles = 'myFiles'; - static const resultsPending = 'resultsPending'; - static const resultsAvailable = 'resultsAvailable'; - static const viewReport = 'viewReport'; - static const checkAvailability = 'checkAvailability'; - static const readInstructions = 'readInstructions'; - static const searchLabReport = 'searchLabReport'; - static const prescriptionDeliveryError = 'prescriptionDeliveryError'; - static const receiveOtpToast = 'receiveOtpToast'; - static const enterPhoneNumber = 'enterPhoneNumber'; - static const enterEmailDesc = 'enterEmailDesc'; - static const enterPhoneDesc = 'enterPhoneDesc'; - static const pleaseChooseOption = 'pleaseChooseOption'; - static const prepareToElevate = 'prepareToElevate'; - static const iAcceptTermsConditions = 'iAcceptTermsConditions'; - static const alreadyHaveAccount = 'alreadyHaveAccount'; - static const loginNow = 'loginNow'; - static const notice = 'notice'; - static const oR = 'oR'; - static const sendOTPWHATSAPP = 'sendOTPWHATSAPP'; - static const sendOTPSMS = 'sendOTPSMS'; - static const fullName = 'fullName'; - static const married = 'married'; - static const uae = 'uae'; - static const malE = 'malE'; - static const loginBy = 'loginBy'; - static const loginByOTP = 'loginByOTP'; - static const guest = 'guest'; - static const switchAccount = 'switchAccount'; - static const lastLoginBy = 'lastLoginBy'; - static const allSet = 'allSet'; - static const enableQuickLogin = 'enableQuickLogin'; - static const enableMsg = 'enableMsg'; - static const notNow = 'notNow'; - static const pendingActivation = 'pendingActivation'; - static const awaitingApproval = 'awaitingApproval'; - static const news = 'news'; - static const ready = 'ready'; - static const enterValidNationalId = 'enterValidNationalId'; - static const enterValidPhoneNumber = 'enterValidPhoneNumber'; - static const cannotEnterSaudiOrUAENumber = 'cannotEnterSaudiOrUAENumber'; - static const medicalCentersWithCount = 'medicalCentersWithCount'; - static const medicalCenters = 'medicalCenters'; - static const hospitalsWithCount = 'hospitalsWithCount'; - static const selectRegion = 'selectRegion'; - static const selectFacility = 'selectFacility'; - static const selectFacilitiesSubTitle = 'selectFacilitiesSubTitle'; - static const selectHospitalSubTitle = 'selectHospitalSubTitle'; - static const iAcceptThe = 'iAcceptThe'; - static const personalDetailsVerification = 'personalDetailsVerification'; - static const otpVerification = 'otpVerification'; - static const weHaveSendOTP = 'weHaveSendOTP'; - static const via = 'via'; - static const forRegistrationVerification = 'forRegistrationVerification'; - static const didntReceiveIt = 'didntReceiveIt'; - static const resendOTP = 'resendOTP'; - static const resendIn = 'resendIn'; - static const pleaseEnterAnationalID = 'pleaseEnterAnationalID'; - static const pleaseEnterAFileNumber = 'pleaseEnterAFileNumber'; - static const pleaseEnterAValidEmail = 'pleaseEnterAValidEmail'; - static const pleaseEnterFullName = 'pleaseEnterFullName'; - static const pleaseAcceptTermsConditions = 'pleaseAcceptTermsConditions'; - static const pleaseEnterAValidIqamaID = 'pleaseEnterAValidIqamaID'; - static const pleaseEnterAValidNationalID = 'pleaseEnterAValidNationalID'; - static const pleaseEnterAValidDateOfBirth = 'pleaseEnterAValidDateOfBirth'; - static const pleaseEnterAValidName = 'pleaseEnterAValidName'; - static const pleaseSelectAGender = 'pleaseSelectAGender'; - static const pleaseSelectAMaritalStatus = 'pleaseSelectAMaritalStatus'; - static const pleaseSelectACountry = 'pleaseSelectACountry'; - static const pleaseEnterEmail = 'pleaseEnterEmail'; - static const pleaseEnterAValidEmailFormat = 'pleaseEnterAValidEmailFormat'; - static const selectCountry = 'selectCountry'; - static const forLoginVerification = 'forLoginVerification'; - static const searchHospital = 'searchHospital'; - static const skip = 'skip'; - static const getStarted = 'getStarted'; - static const onboardingHeading1 = 'onboardingHeading1'; - static const onboardingBody1 = 'onboardingBody1'; - static const onboardingHeading2 = 'onboardingHeading2'; - static const onboardingBody2 = 'onboardingBody2'; - static const hmgHospitals = 'hmgHospitals'; - static const hmcMedicalClinic = 'hmcMedicalClinic'; - static const applyFilter = 'applyFilter'; - static const facilityAndLocation = 'facilityAndLocation'; - static const regionAndLocation = 'regionAndLocation'; - static const clearAllFilters = 'clearAllFilters'; - static const filters = 'filters'; - static const searchClinic = 'searchClinic'; - static const normal = 'normal'; - static const attention = 'attention'; - static const monitor = 'monitor'; - static const noSpecialResult = 'noSpecialResult'; - static const setTheDateRange = 'setTheDateRange'; - static const historyFlowchart = 'historyFlowchart'; - static const to = 'to'; - static const startDate = 'startDate'; - static const endDate = 'endDate'; - static const walkin = 'walkin'; - static const laserClinic = 'laserClinic'; - static const continueString = 'continueString'; - static const covid_info = 'covid_info'; - static const appointmentDetails = 'appointmentDetails'; - static const checkingDoctorAvailability = 'checkingDoctorAvailability'; - static const cancellingAppointmentPleaseWait = 'cancellingAppointmentPleaseWait'; - static const appointmentCancelledSuccessfully = 'appointmentCancelledSuccessfully'; - static const notConfirmed = 'notConfirmed'; - static const appointmentStatus = 'appointmentStatus'; - static const doctorWillCallYou = 'doctorWillCallYou'; - static const getDirections = 'getDirections'; - static const notifyMeBeforeAppointment = 'notifyMeBeforeAppointment'; - static const fetchingLabResults = 'fetchingLabResults'; - static const fetchingRadiologyResults = 'fetchingRadiologyResults'; - static const fetchingAppointmentPrescriptions = 'fetchingAppointmentPrescriptions'; - static const noPrescriptionsForAppointment = 'noPrescriptionsForAppointment'; - static const amountBeforeTax = 'amountBeforeTax'; - static const rebookAppointment = 'rebookAppointment'; - static const fetchingDoctorSchedulePleaseWait = 'fetchingDoctorSchedulePleaseWait'; - static const pickADate = 'pickADate'; - static const confirmingAppointmentPleaseWait = 'confirmingAppointmentPleaseWait'; - static const appointmentConfirmedSuccessfully = 'appointmentConfirmedSuccessfully'; - static const appointmentPayment = 'appointmentPayment'; - static const checkingPaymentStatusPleaseWait = 'checkingPaymentStatusPleaseWait'; - static const paymentFailedPleaseTryAgain = 'paymentFailedPleaseTryAgain'; - static const appointmentCheckIn = 'appointmentCheckIn'; - static const insuranceExpiredOrInactive = 'insuranceExpiredOrInactive'; - static const totalAmountToPay = 'totalAmountToPay'; - static const vat15 = 'vat15'; - static const liveCare = 'liveCare'; - static const recentVisits = 'recentVisits'; - static const favouriteDoctors = 'favouriteDoctors'; - static const searchByClinic = 'searchByClinic'; - static const tapToSelectClinic = 'tapToSelectClinic'; - static const searchByDoctor = 'searchByDoctor'; - static const tapToSelect = 'tapToSelect'; - static const searchByRegion = 'searchByRegion'; - static const centralRegion = 'centralRegion'; - static const immediateConsultation = 'immediateConsultation'; - static const scheduledConsultation = 'scheduledConsultation'; - static const pharmaLiveCare = 'pharmaLiveCare'; - static const notSureHelpMeChooseClinic = 'notSureHelpMeChooseClinic'; - static const mentionYourSymptomsAndFindDoctors = 'mentionYourSymptomsAndFindDoctors'; - static const immediateService = 'immediateService'; - static const noNeedToWaitGetMedicalConsultation = 'noNeedToWaitGetMedicalConsultation'; - static const noVisitRequired = 'noVisitRequired'; - static const doctorWillContact = 'doctorWillContact'; - static const specialisedDoctorWillContactYou = 'specialisedDoctorWillContactYou'; - static const freeMedicineDelivery = 'freeMedicineDelivery'; - static const offersFreeMedicineDelivery = 'offersFreeMedicineDelivery'; - static const dentalChiefComplaints = 'dentalChiefComplaints'; - static const viewAvailableAppointments = 'viewAvailableAppointments'; - static const doctorProfile = 'doctorProfile'; - static const waitingAppointment = 'waitingAppointment'; - static const hospitalInformation = 'hospitalInformation'; - static const fetchingAppointmentShare = 'fetchingAppointmentShare'; - static const bookingYourAppointment = 'bookingYourAppointment'; - static const selectLiveCareClinic = 'selectLiveCareClinic'; - static const checkingForExistingDentalPlan = 'checkingForExistingDentalPlan'; - static const dentalTreatmentPlan = 'dentalTreatmentPlan'; - static const youHaveExistingTreatmentPlan = 'youHaveExistingTreatmentPlan'; - static const mins = 'mins'; - static const totalTimeRequired = 'totalTimeRequired'; - static const wouldYouLikeToContinue = 'wouldYouLikeToContinue'; - static const chooseDoctor = 'chooseDoctor'; - static const viewNearestAppos = 'viewNearestAppos'; - static const noDoctorFound = 'noDoctorFound'; - static const yesPleasImInAHurry = 'yesPleasImInAHurry'; - static const fetchingFeesPleaseWait = 'fetchingFeesPleaseWait'; - static const noThanksPhysicalVisit = 'noThanksPhysicalVisit'; - 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'; - static const reviewLiveCareRequest = 'reviewLiveCareRequest'; - static const selectedLiveCareType = 'selectedLiveCareType'; - static const selectLiveCareCallType = 'selectLiveCareCallType'; - static const confirmingLiveCareRequest = 'confirmingLiveCareRequest'; - static const unknownErrorOccurred = 'unknownErrorOccurred'; - static const liveCarePermissionsMessage = 'liveCarePermissionsMessage'; - static const liveCarePayment = 'liveCarePayment'; - static const mada = 'mada'; - static const visaOrMastercard = 'visaOrMastercard'; - static const tamara = 'tamara'; - static const fetchingApplePayDetails = 'fetchingApplePayDetails'; - static const liveCarePendingRequest = 'liveCarePendingRequest'; - static const callLiveCareSupport = 'callLiveCareSupport'; - static const whatIsWaitingAppointment = 'whatIsWaitingAppointment'; - static const waitingAppointmentsFeature = 'waitingAppointmentsFeature'; - static const appointmentWithDoctorConfirmed = 'appointmentWithDoctorConfirmed'; - static const paymentWithinTenMinutes = 'paymentWithinTenMinutes'; - static const liveLocation = 'liveLocation'; - static const verifyYourLocationAtHospital = 'verifyYourLocationAtHospital'; - static const error = 'error'; - static const ensureWithinHospitalLocation = 'ensureWithinHospitalLocation'; - static const nfcNearFieldCommunication = 'nfcNearFieldCommunication'; - static const scanPhoneViaNFC = 'scanPhoneViaNFC'; - static const qrCode = 'qrCode'; - static const scanQRCodeToCheckIn = 'scanQRCodeToCheckIn'; - static const processingCheckIn = 'processingCheckIn'; - static const bookingWaitingAppointment = 'bookingWaitingAppointment'; - static const enterValidIDorIqama = 'enterValidIDorIqama'; - static const selectAppointment = 'selectAppointment'; - static const rebookSameDoctor = 'rebookSameDoctor'; - static const queueing = 'queueing'; - static const inQueue = 'inQueue'; - static const yourTurn = 'yourTurn'; - static const halaFirstName = 'halaFirstName'; - static const thankYouForPatience = 'thankYouForPatience'; - static const servingNow = 'servingNow'; - static const callForVitalSigns = 'callForVitalSigns'; - static const callForDoctor = 'callForDoctor'; - static const thingsToAskDoctor = 'thingsToAskDoctor'; - static const improveOverallHealth = 'improveOverallHealth'; - static const routineScreenings = 'routineScreenings'; - static const whatIsThisMedicationFor = 'whatIsThisMedicationFor'; - static const sideEffectsToKnow = 'sideEffectsToKnow'; - static const whenFollowUp = 'whenFollowUp'; - static const goToHomepage = 'goToHomepage'; - static const appointmentsList = 'appointmentsList'; - static const allAppt = 'allAppt'; - static const upcoming = 'upcoming'; - static const completed = 'completed'; - static const noAppointmentsYet = 'noAppointmentsYet'; - static const viewProfile = 'viewProfile'; - static const choosePreferredHospitalForService = 'choosePreferredHospitalForService'; - static const noHospitalsFound = 'noHospitalsFound'; - static const cancelOrderConfirmation = 'cancelOrderConfirmation'; - static const orderCancelledSuccessfully = 'orderCancelledSuccessfully'; - static const requestID = 'requestID'; - static const noCMCOrdersYet = 'noCMCOrdersYet'; - static const cmcOrders = 'cmcOrders'; - static const summary = 'summary'; - static const selectedService = 'selectedService'; - static const requestSubmittedSuccessfully = 'requestSubmittedSuccessfully'; - static const hereIsYourRequestNumber = 'hereIsYourRequestNumber'; - static const pleaseSelectHospitalToContinue = 'pleaseSelectHospitalToContinue'; - static const confirmSubmitRequest = 'confirmSubmitRequest'; - static const pendingOrderWait = 'pendingOrderWait'; - static const noServicesAvailable = 'noServicesAvailable'; - static const selectAService = 'selectAService'; - static const comprehensiveCheckup = 'comprehensiveCheckup'; - static const viewNearestHMGLocations = 'viewNearestHMGLocations'; - static const provideFeedbackOnServices = 'provideFeedbackOnServices'; - static const liveChatWithHMG = 'liveChatWithHMG'; - static const send = 'send'; - static const status = 'status'; - static const sendingFeedback = 'sendingFeedback'; - static const selectFeedbackType = 'selectFeedbackType'; - static const loadingAppointmentsList = 'loadingAppointmentsList'; - static const noAppointmentsForFeedback = 'noAppointmentsForFeedback'; - static const selectedAppointment = 'selectedAppointment'; - static const subject = 'subject'; - static const enterSubjectHere = 'enterSubjectHere'; - static const message = 'message'; - static const enterMessageHere = 'enterMessageHere'; - static const filesSelected = 'filesSelected'; - static const otherDetails = 'otherDetails'; - static const medicalReport = 'medicalReport'; - static const medicalReportNumber = 'medicalReportNumber'; - static const patientIsInsured = 'patientIsInsured'; - static const insuranceDocument = 'insuranceDocument'; - static const selectBranch = 'selectBranch'; - static const patientInformation = 'patientInformation'; - static const patientLocation = 'patientLocation'; - static const identificationNumber = 'identificationNumber'; - static const enterIdentificationNumber = 'enterIdentificationNumber'; - static const patientName = 'patientName'; - static const referralRequesterInformation = 'referralRequesterInformation'; - static const enterReferralRequesterName = 'enterReferralRequesterName'; - static const requesterName = 'requesterName'; - static const relationship = 'relationship'; - static const selectRelation = 'selectRelation'; - static const otherName = 'otherName'; - static const otherNameHint = 'otherNameHint'; - static const requesterNameRequired = 'requesterNameRequired'; - static const selectRelationshipRequired = 'selectRelationshipRequired'; - static const otherRelationshipNameRequired = 'otherRelationshipNameRequired'; - static const identificationNumberRequired = 'identificationNumberRequired'; - static const patientNameRequired = 'patientNameRequired'; - static const enterPatientPhoneRequired = 'enterPatientPhoneRequired'; - static const selectPatientCityRequired = 'selectPatientCityRequired'; - static const medicalReportRequired = 'medicalReportRequired'; - static const selectBranchRequired = 'selectBranchRequired'; - static const insuranceDocumentRequired = 'insuranceDocumentRequired'; - static const searchResult = 'searchResult'; - static const referralNo = 'referralNo'; - static const eReferral = 'eReferral'; - static const referralCreatedSuccessfully = 'referralCreatedSuccessfully'; - static const hereIsYourReferralNumber = 'hereIsYourReferralNumber'; - static const searchEReferral = 'searchEReferral'; - static const enterRequiredInfoToSearch = 'enterRequiredInfoToSearch'; - static const selectPickupDirection = 'selectPickupDirection'; - static const selectDirection = 'selectDirection'; - static const toHospital = 'toHospital'; - static const fromHospital = 'fromHospital'; - static const selectWay = 'selectWay'; - static const oneWay = 'oneWay'; - static const twoWay = 'twoWay'; - static const selectPickupDetails = 'selectPickupDetails'; - static const pleaseSelectDetailsOfPickup = 'pleaseSelectDetailsOfPickup'; - static const selectDetails = 'selectDetails'; - static const work = 'work'; - static const pick = 'pick'; - static const insideTheHome = 'insideTheHome'; - static const haveAnyAppointment = 'haveAnyAppointment'; - static const amountPaidAtHospital = 'amountPaidAtHospital'; - static const submitRequest = 'submitRequest'; - static const enterPickupLocationManually = 'enterPickupLocationManually'; - static const enterPickupLocation = 'enterPickupLocation'; - static const trackingDetails = 'trackingDetails'; - static const cancelRequest = 'cancelRequest'; - static const shareLocationWhatsapp = 'shareLocationWhatsapp'; - static const pleaseWaitForCall = 'pleaseWaitForCall'; - static const toHospitalLower = 'toHospitalLower'; - static const contact = 'contact'; - static const failed = 'failed'; - static const confirmationCall = 'confirmationCall'; - static const pickupFromHome = 'pickupFromHome'; - static const onTheWayToHospital = 'onTheWayToHospital'; - static const arrivedAtHospital = 'arrivedAtHospital'; - static const orderCancel = 'orderCancel'; - static const emergencyCheckIn = 'emergencyCheckIn'; - static const erOnlineCheckInDescription = 'erOnlineCheckInDescription'; - static const erOnlineCheckInSuccess = 'erOnlineCheckInSuccess'; - static const erOnlineCheckInError = 'erOnlineCheckInError'; - static const fetchingHospitalsList = 'fetchingHospitalsList'; - static const fetchingPaymentInformation = 'fetchingPaymentInformation'; - static const erVisitDetails = 'erVisitDetails'; - static const erClinic = 'erClinic'; - static const vatWithAmount = 'vatWithAmount'; - static const erAppointmentBookedSuccess = 'erAppointmentBookedSuccess'; - static const underProcessing = 'underProcessing'; - static const canceledByPatient = 'canceledByPatient'; - static const rapidResponseTeam = 'rapidResponseTeam'; - static const allFacilities = 'allFacilities'; - static const selectLocation = 'selectLocation'; - static const pleaseSelectTheLocation = 'pleaseSelectTheLocation'; - static const viewLocationGoogleMaps = 'viewLocationGoogleMaps'; - static const callAmbulance = 'callAmbulance'; - static const requestAmbulanceInEmergency = 'requestAmbulanceInEmergency'; - static const confirmation = 'confirmation'; - static const areYouSureYouWantToCallAmbulance = 'areYouSureYouWantToCallAmbulance'; - static const getDetailsOfNearestBranch = 'getDetailsOfNearestBranch'; - static const areYouSureYouWantToCallRRT = 'areYouSureYouWantToCallRRT'; - static const priorERCheckInToSkipLine = 'priorERCheckInToSkipLine'; - static const areYouSureYouWantToMakeERCheckIn = 'areYouSureYouWantToMakeERCheckIn'; - static const checkingYourERAppointmentStatus = 'checkingYourERAppointmentStatus'; - static const transportOptions = 'transportOptions'; - static const selectHospitalForAdvancePayment = 'selectHospitalForAdvancePayment'; - static const recharge = 'recharge'; - static const activityLevel = 'activityLevel'; - static const selectActivityLevel = 'selectActivityLevel'; - static const caloriesPerDay = 'caloriesPerDay'; - static const dietType = 'dietType'; - static const selectDietType = 'selectDietType'; - static const bodyFrameSize = 'bodyFrameSize'; - static const selectBodyFrameSize = 'selectBodyFrameSize'; - static const averageCycleLength = 'averageCycleLength'; - static const averageLutealPhase = 'averageLutealPhase'; - static const convert = 'convert'; - static const calculate = 'calculate'; - static const healthCalculators = 'healthCalculators'; - static const healthConverters = 'healthConverters'; - static const generalHealth = 'generalHealth'; - static const relatedToBMICalories = 'relatedToBMICalories'; - static const selectCalculator = 'selectCalculator'; - static const womensHealth = 'womensHealth'; - static const relatedToPeriodsOvulation = 'relatedToPeriodsOvulation'; - static const bloodSugar = 'bloodSugar'; - static const trackYourGlucoseLevels = 'trackYourGlucoseLevels'; - static const bloodCholesterol = 'bloodCholesterol'; - static const monitorCholesterolLevels = 'monitorCholesterolLevels'; - static const triglyceridesFatBlood = 'triglyceridesFatBlood'; - static const understandTriglyceridesImpact = 'understandTriglyceridesImpact'; - static const bmiCalculator = 'bmiCalculator'; - static const bmiCalculatorDesc = 'bmiCalculatorDesc'; - static const caloriesCalculator = 'caloriesCalculator'; - static const caloriesCalculatorDesc = 'caloriesCalculatorDesc'; - static const bmrCalculator = 'bmrCalculator'; - static const bmrCalculatorDesc = 'bmrCalculatorDesc'; - static const idealBodyWeight = 'idealBodyWeight'; - static const idealBodyWeightDesc = 'idealBodyWeightDesc'; - static const bodyFatCalculator = 'bodyFatCalculator'; - static const bodyFatCalculatorDesc = 'bodyFatCalculatorDesc'; - static const carbsProteinFat = 'carbsProteinFat'; - static const carbsProteinFatDesc = 'carbsProteinFatDesc'; - static const ovulationPeriod = 'ovulationPeriod'; - static const ovulationPeriodDesc = 'ovulationPeriodDesc'; - static const deliveryDueDate = 'deliveryDueDate'; - static const deliveryDueDateDesc = 'deliveryDueDateDesc'; - static const low = 'low'; - static const preDiabetic = 'preDiabetic'; - static const high = 'high'; - static const elevated = 'elevated'; - static const recorded = 'recorded'; - static const noRecordsYet = 'noRecordsYet'; - static const lastRecord = 'lastRecord'; - static const addBloodSugar = 'addBloodSugar'; - static const addBloodPressure = 'addBloodPressure'; - static const addWeight = 'addWeight'; - static const bloodSugarDataSavedSuccessfully = 'bloodSugarDataSavedSuccessfully'; - static const bloodPressureDataSavedSuccessfully = 'bloodPressureDataSavedSuccessfully'; - static const weightDataSavedSuccessfully = 'weightDataSavedSuccessfully'; - static const pleaseWait = 'pleaseWait'; - static const selectUnit = 'selectUnit'; - static const selectMeasureTime = 'selectMeasureTime'; - static const selectArm = 'selectArm'; - static const enterBloodSugar = 'enterBloodSugar'; - static const enterSystolicValue = 'enterSystolicValue'; - static const enterDiastolicValue = 'enterDiastolicValue'; - static const enterWeight = 'enterWeight'; - static const selectDuration = 'selectDuration'; - static const systolic = 'systolic'; - static const diastolic = 'diastolic'; - static const sendReportByEmail = 'sendReportByEmail'; - static const enterYourEmailToReceiveReport = 'enterYourEmailToReceiveReport'; - static const addNewRecord = 'addNewRecord'; - static const healthTrackers = 'healthTrackers'; - static const monitorBloodPressureLevels = 'monitorBloodPressureLevels'; - static const trackWeightProgress = 'trackWeightProgress'; - static const bookAppointment = 'bookAppointment'; - static const completeCheckup = 'completeCheckup'; - static const indoorNavigation = 'indoorNavigation'; - static const eReferralServices = 'eReferralServices'; - static const dailyWaterMonitor = 'dailyWaterMonitor'; - static const fetchingYourWaterIntakeDetails = 'fetchingYourWaterIntakeDetails'; - static const healthCalculatorsServices = 'healthCalculatorsServices'; - static const healthConvertersServices = 'healthConvertersServices'; - static const smartWatchesServices = 'smartWatchesServices'; - static const exploreServices = 'exploreServices'; - static const medicalAndCareServices = 'medicalAndCareServices'; - static const hmgServices = 'hmgServices'; - static const personalServices = 'personalServices'; - static const habibWallet = 'habibWallet'; - static const habibWallet2 = 'habibWallet2'; - static const loginToViewWalletBalance = 'loginToViewWalletBalance'; - static const loginToViewMedicalFile = 'loginToViewMedicalFile'; - static const addMember = 'addMember'; - static const addFamilyMember = 'addFamilyMember'; - static const pleaseFillBelowFieldToAddNewFamilyMember = 'pleaseFillBelowFieldToAddNewFamilyMember'; - static const healthTools = 'healthTools'; - static const supportServices = 'supportServices'; - static const virtualTour = 'virtualTour'; - static const carParking = 'carParking'; - static const latestNews = 'latestNews'; - static const hmgContact = 'hmgContact'; - static const durationCannotExceed90 = 'durationCannotExceed90'; - static const unexpectedError = 'unexpectedError'; - static const gettingAmbulanceTransportOption = 'gettingAmbulanceTransportOption'; - static const fetchingAppointment = 'fetchingAppointment'; - static const doYouWantToCancelTheRequest = 'doYouWantToCancelTheRequest'; - static const cancellingRequest = 'cancellingRequest'; - static const fetchingTermsAndConditions = 'fetchingTermsAndConditions'; - static const selectLocationPrescriptionDelivery = 'selectLocationPrescriptionDelivery'; - static const noRadiologyOrders = 'noRadiologyOrders'; - static const ageIsRequired = 'ageIsRequired'; - static const invalidAge = 'invalidAge'; - static const ageMustBeBetween11And120 = 'ageMustBeBetween11And120'; - static const heightIsRequired = 'heightIsRequired'; - static const invalidHeight = 'invalidHeight'; - static const weightIsRequired = 'weightIsRequired'; - static const invalidWeight = 'invalidWeight'; - static const timeToDrinkWater = 'timeToDrinkWater'; - static const stayHydratedDrinkWater = 'stayHydratedDrinkWater'; - static const visitPharmacyOnline = 'visitPharmacyOnline'; - static const howAreYouFeelingToday = 'howAreYouFeelingToday'; - static const checkYourSymptomsWithScale = 'checkYourSymptomsWithScale'; - static const checkYourSymptoms = 'checkYourSymptoms'; - static const noUpcomingAppointmentPleaseBook = 'noUpcomingAppointmentPleaseBook'; - static const youHaveEROnlineCheckInRequest = 'youHaveEROnlineCheckInRequest'; - static const quickLinks = 'quickLinks'; - static const viewMedicalFileLandingPage = 'viewMedicalFileLandingPage'; - static const immediateLiveCareRequest = 'immediateLiveCareRequest'; - static const yourTurnIsAfterPatients = 'yourTurnIsAfterPatients'; - static const dontHaveHHCOrders = 'dontHaveHHCOrders'; - static const hhcOrders = 'hhcOrders'; - static const requestedServices = 'requestedServices'; - static const selectServices = 'selectServices'; - static const selectedServices = 'selectedServices'; - static const createNewRequest = 'createNewRequest'; - static const youHaveNoPendingRequests = 'youHaveNoPendingRequests'; - static const noInsuranceDataFound = 'noInsuranceDataFound'; - static const noInsuranceUpdateRequest = 'noInsuranceUpdateRequest'; - static const policyNumberInsurancePage = 'policyNumberInsurancePage'; - static const insuranceExpired = 'insuranceExpired'; - static const insuranceActive = 'insuranceActive'; - static const patientCardID = 'patientCardID'; - static const noInsuranceApprovals = 'noInsuranceApprovals'; - static const noInsuranceWithHMG = 'noInsuranceWithHMG'; - static const referenceRange = 'referenceRange'; - static const downloadReport = 'downloadReport'; - static const generatingReport = 'generatingReport'; - static const noLabResults = 'noLabResults'; - static const labResultDetails = 'labResultDetails'; - static const resultOf = 'resultOf'; - static const whatIsThisResult = 'whatIsThisResult'; - static const lastTested = 'lastTested'; - static const byVisit = 'byVisit'; - static const byTest = 'byTest'; - static const results = 'results'; - static const viewResults = 'viewResults'; - static const rebook = 'rebook'; - static const noOphthalmologyAppointments = 'noOphthalmologyAppointments'; - static const noVitalSignsRecordedYet = 'noVitalSignsRecordedYet'; - static const appointmentsAndVisits = 'appointmentsAndVisits'; - static const labAndRadiology = 'labAndRadiology'; - static const activeMedicationsAndPrescriptions = 'activeMedicationsAndPrescriptions'; - static const allPrescriptions = 'allPrescriptions'; - static const allMedications = 'allMedications'; - static const youDontHaveAnyPrescriptionsYet = 'youDontHaveAnyPrescriptionsYet'; - static const youDontHaveAnyCompletedVisitsYet = 'youDontHaveAnyCompletedVisitsYet'; - static const others = 'others'; - static const allergyInfo = 'allergyInfo'; - static const vaccineInfo = 'vaccineInfo'; - static const updateInsuranceInfo = 'updateInsuranceInfo'; - static const myInvoicesList = 'myInvoicesList'; - static const ancillaryOrdersList = 'ancillaryOrdersList'; - static const youDontHaveAnySickLeavesYet = 'youDontHaveAnySickLeavesYet'; - static const medicalReports = 'medicalReports'; - static const sickLeaveReport = 'sickLeaveReport'; - static const weightTracker = 'weightTracker'; - static const askYourDoctor = 'askYourDoctor'; - static const internetPairing = 'internetPairing'; - static const requested = 'requested'; - static const youDontHaveAnyMedicalReportsYet = 'youDontHaveAnyMedicalReportsYet'; - static const requestMedicalReport = 'requestMedicalReport'; - static const youDoNotHaveAnyAppointmentsToRequestMedicalReport = 'youDoNotHaveAnyAppointmentsToRequestMedicalReport'; - static const areYouSureYouWantToRequestMedicalReport = 'areYouSureYouWantToRequestMedicalReport'; - static const yourMedicalReportRequestSubmittedSuccessfully = 'yourMedicalReportRequestSubmittedSuccessfully'; - static const monthlyHealthSummaryReportDisclaimer = 'monthlyHealthSummaryReportDisclaimer'; - static const updatingMonthlyReportStatus = 'updatingMonthlyReportStatus'; - static const monthlyReportStatusUpdatedSuccessfully = 'monthlyReportStatusUpdatedSuccessfully'; - static const whoCanViewMyMedicalFile = 'whoCanViewMyMedicalFile'; - static const acceptedYourRequestToBeYourFamilyMember = 'acceptedYourRequestToBeYourFamilyMember'; - static const canViewYourFile = 'canViewYourFile'; - static const hasARequestPendingToBeYourFamilyMember = 'hasARequestPendingToBeYourFamilyMember'; - static const wantsToAddYouAsTheirFamilyMember = 'wantsToAddYouAsTheirFamilyMember'; - static const rejectedYourRequestToBeYourFamilyMember = 'rejectedYourRequestToBeYourFamilyMember'; - static const rejectedYourFamilyMemberRequest = 'rejectedYourFamilyMemberRequest'; - static const notAvailable = 'notAvailable'; - static const selectAProfile = 'selectAProfile'; - static const switchFamilyFile = 'switchFamilyFile'; - static const medicalFiles = 'medicalFiles'; - static const addANewFamilyMember = 'addANewFamilyMember'; - static const viewInvoiceDetails = 'viewInvoiceDetails'; - static const outPatient = 'outPatient'; - static const invoiceDetails = 'invoiceDetails'; - static const sendingEmailPleaseWait = 'sendingEmailPleaseWait'; - static const emailSentSuccessfullyMessage = 'emailSentSuccessfullyMessage'; - static const discount = 'discount'; - static const paid = 'paid'; - static const fetchingInvoiceDetails = 'fetchingInvoiceDetails'; - static const scanQRCode = 'scanQRCode'; - static const parkingSlotDetails = 'parkingSlotDetails'; - static const slotNumber = 'slotNumber'; - static const basement = 'basement'; - static const parkingDate = 'parkingDate'; - static const parkedSince = 'parkedSince'; - static const resetDirection = 'resetDirection'; - static const noPrescriptionOrdersYet = 'noPrescriptionOrdersYet'; - static const fetchingPrescriptionPDFPleaseWait = 'fetchingPrescriptionPDFPleaseWait'; - static const ratingValue = 'ratingValue'; - static const downloadPrescription = 'downloadPrescription'; - static const fetchingPrescriptionDetails = 'fetchingPrescriptionDetails'; - static const switchBackFamilyFile = 'switchBackFamilyFile'; - static const profileAndSettings = 'profileAndSettings'; - static const quickActions = 'quickActions'; - static const notificationsSettings = 'notificationsSettings'; - static const touchIDFaceIDServices = 'touchIDFaceIDServices'; - static const personalInformation = 'personalInformation'; - static const updateEmailAddress = 'updateEmailAddress'; - static const helpAndSupport = 'helpAndSupport'; - static const permissionsProfile = 'permissionsProfile'; - static const privacyPolicy = 'privacyPolicy'; - static const deactivateAccount = 'deactivateAccount'; - static const ageYearsOld = 'ageYearsOld'; - static const youDontHaveRadiologyOrders = 'youDontHaveRadiologyOrders'; - static const radiologyResult = 'radiologyResult'; - static const viewRadiologyImage = 'viewRadiologyImage'; - static const rateClinic = 'rateClinic'; - static const back = 'back'; - static const rateDoctor = 'rateDoctor'; - static const howWasYourLastVisitWithDoctor = 'howWasYourLastVisitWithDoctor'; - static const dateOfBirthSymptoms = 'dateOfBirthSymptoms'; - static const genderSymptoms = 'genderSymptoms'; - static const heightSymptoms = 'heightSymptoms'; - static const weightSymptoms = 'weightSymptoms'; - static const femaleGender = 'femaleGender'; - static const previous = 'previous'; - static const selectedOrgans = 'selectedOrgans'; - static const noOrgansSelected = 'noOrgansSelected'; - static const organSelector = 'organSelector'; - static const noPredictionsAvailable = 'noPredictionsAvailable'; - static const areYouSureYouWantToRestartOrganSelection = 'areYouSureYouWantToRestartOrganSelection'; - static const possibleConditions = 'possibleConditions'; - static const pleaseSelectAtLeastOneRiskBeforeProceeding = 'pleaseSelectAtLeastOneRiskBeforeProceeding'; - static const aboveYouSeeCommonRiskFactors = 'aboveYouSeeCommonRiskFactors'; - static const readMore = 'readMore'; - static const riskFactors = 'riskFactors'; - static const noRiskFactorsFound = 'noRiskFactorsFound'; - static const basedOnYourSelectedSymptomsNoRiskFactors = 'basedOnYourSelectedSymptomsNoRiskFactors'; - static const messageNotification = 'messageNotification'; - static const attachedImage = 'attachedImage'; - static const failedToLoadImage = 'failedToLoadImage'; - static const typeNotification = 'typeNotification'; - static const pleaseSelectAtLeastOneOptionBeforeProceeding = 'pleaseSelectAtLeastOneOptionBeforeProceeding'; - static const suggestions = 'suggestions'; - static const pleaseGoBackAndSelectOrgansFirst = 'pleaseGoBackAndSelectOrgansFirst'; - static const symptomsSelector = 'symptomsSelector'; - static const possibleSymptomsRelatedTo = 'possibleSymptomsRelatedTo'; - static const suggestionAIListDescription = 'suggestionAIListDescription'; - static const analyzing = 'analyzing'; - static const seekMedicalAdvice = 'seekMedicalAdvice'; - static const monitorDescription = 'monitorDescription'; - static const seekMedicalAdviceDescription = 'seekMedicalAdviceDescription'; - static const emergencyDescription = 'emergencyDescription'; - static const colorScience = 'colorScience'; - static const noNeedToVisitDoctor = 'noNeedToVisitDoctor'; - static const commonSymptom = 'commonSymptom'; - static const notApplicable = 'notApplicable'; - static const emergencyTriage = 'emergencyTriage'; - static const emergencyEvidenceDetected = 'emergencyEvidenceDetected'; - static const noQuestionItemsAvailable = 'noQuestionItemsAvailable'; - static const pleaseAnswerAllQuestionsBeforeProceeding = 'pleaseAnswerAllQuestionsBeforeProceeding'; - static const triage = 'triage'; - static const areYouSureYouWantToExitProgress = 'areYouSureYouWantToExitProgress'; - static const noQuestionAvailable = 'noQuestionAvailable'; - static const possibleSymptom = 'possibleSymptom'; - static const symptomsCheckerFindingScore = 'symptomsCheckerFindingScore'; - static const notSet = 'notSet'; - static const years = 'years'; - static const symptomsChecker = 'symptomsChecker'; - static const helloIsYourInformationUpToDate = 'helloIsYourInformationUpToDate'; - static const noEditAll = 'noEditAll'; - static const yesItIs = 'yesItIs'; - static const age = 'age'; - static const youDontHaveAnyAncillaryOrdersYet = 'youDontHaveAnyAncillaryOrdersYet'; - static const invoiceWithNumber = 'invoiceWithNumber'; - static const queued = 'queued'; - static const checkInReady = 'checkInReady'; - static const checkIn = 'checkIn'; - static const viewDetails = 'viewDetails'; - static const selectPaymentMethod = 'selectPaymentMethod'; - static const processingPaymentPleaseWait = 'processingPaymentPleaseWait'; - static const finalizingPaymentPleaseWait = 'finalizingPaymentPleaseWait'; - static const generatingInvoicePleaseWait = 'generatingInvoicePleaseWait'; - static const hereIsYourInvoiceNumber = 'hereIsYourInvoiceNumber'; - static const paymentCompletedSuccessfully = 'paymentCompletedSuccessfully'; - static const failedToInitializeApplePay = 'failedToInitializeApplePay'; - static const cash = 'cash'; - static const approved = 'approved'; - static const approvalRejectedPleaseVisitReceptionist = 'approvalRejectedPleaseVisitReceptionist'; - static const sentForApproval = 'sentForApproval'; - static const ancillaryOrderDetails = 'ancillaryOrderDetails'; - static const noProceduresAvailableForSelectedOrder = 'noProceduresAvailableForSelectedOrder'; - static const procedures = 'procedures'; - static const totalAmount = 'totalAmount'; - static const covered = 'covered'; - static const vatPercent = 'vatPercent'; - static const proceedToPayment = 'proceedToPayment'; - static const supportedSmartWatches = 'supportedSmartWatches'; - static const pleaseMakeSureSamsungWatchConnected = 'pleaseMakeSureSamsungWatchConnected'; - static const beforeSyncingDataFollowInstructions = 'beforeSyncingDataFollowInstructions'; - static const viewWatchInstructions = 'viewWatchInstructions'; - static const healthConnectAppNotInstalled = 'healthConnectAppNotInstalled'; - static const setTimerOfReminder = 'setTimerOfReminder'; - static const youHaveAppointmentWithDr = 'youHaveAppointmentWithDr'; - static const hours = 'hours'; - static const minutes = 'minutes'; - static const seconds = 'seconds'; - static const secs = 'secs'; - static const noAllergiesDataFound = 'noAllergiesDataFound'; - static const heartRateDescription = 'heartRateDescription'; - static const bloodOxygenDescription = 'bloodOxygenDescription'; - static const stepsDescription = 'stepsDescription'; - static const caloriesDescription = 'caloriesDescription'; - static const distanceDescription = 'distanceDescription'; - static const overview = 'overview'; - static const details = 'details'; - static const details2 = 'details2'; - static const healthy = 'healthy'; - static const warning = 'warning'; - static const vitalSignDetails = 'vitalSignDetails'; - static const resultOfNoDate = 'resultOfNoDate'; - static const referenceRangeBetween = 'referenceRangeBetween'; - static const referenceRangeMin = 'referenceRangeMin'; - static const referenceRangeMax = 'referenceRangeMax'; - static const noHistoryAvailable = 'noHistoryAvailable'; - static const bmiDescription = 'bmiDescription'; - static const heightDescription = 'heightDescription'; - static const weightDescription = 'weightDescription'; - static const bloodPressureDescription = 'bloodPressureDescription'; - static const temperatureDescription = 'temperatureDescription'; - static const heartRateDescriptionVital = 'heartRateDescriptionVital'; - static const respiratoryRateDescription = 'respiratoryRateDescription'; - static const bmiAdvice = 'bmiAdvice'; - static const heightAdvice = 'heightAdvice'; - static const weightAdvice = 'weightAdvice'; - static const bloodPressureAdvice = 'bloodPressureAdvice'; - static const temperatureAdvice = 'temperatureAdvice'; - static const heartRateAdvice = 'heartRateAdvice'; - static const respiratoryRateAdvice = 'respiratoryRateAdvice'; - static const whatShouldIDoNext = 'whatShouldIDoNext'; - static const customizeDrinkCup = 'customizeDrinkCup'; - static const tipsToStayHydrated = 'tipsToStayHydrated'; - static const drinkBeforeYouFeelThirsty = 'drinkBeforeYouFeelThirsty'; - static const keepRefillableBottleNextToYou = 'keepRefillableBottleNextToYou'; - static const trackYourDailyIntakeToStayMotivated = 'trackYourDailyIntakeToStayMotivated'; - static const chooseSparklingWaterInsteadOfSoda = 'chooseSparklingWaterInsteadOfSoda'; - static const switchCup = 'switchCup'; - static const plainWater = 'plainWater'; - static const yourGoal = 'yourGoal'; - static const remaining = 'remaining'; - static const hydrationStatus = 'hydrationStatus'; - static const areYouSureYouWantToCancelAllWaterReminders = 'areYouSureYouWantToCancelAllWaterReminders'; - static const remindersSet = 'remindersSet'; - static const dailyWaterRemindersScheduledAt = 'dailyWaterRemindersScheduledAt'; - static const waterConsumption = 'waterConsumption'; - static const selectNumberOfReminders = 'selectNumberOfReminders'; - static const h2oSettings = 'h2oSettings'; - static const settingsSavedSuccessfully = 'settingsSavedSuccessfully'; - static const yourName = 'yourName'; - static const ageYears = 'ageYears'; - static const numberOfRemindersInADay = 'numberOfRemindersInADay'; - static const medications = 'medications'; - static const someRemarksAboutPrescription = 'someRemarksAboutPrescription'; - static const notifyMeBeforeConsumptionTime = 'notifyMeBeforeConsumptionTime'; - static const noMedicationsToday = 'noMedicationsToday'; - static const reminders = 'reminders'; - static const reminderAddedToCalendar = 'reminderAddedToCalendar'; - static const errorWhileSettingCalendar = 'errorWhileSettingCalendar'; - static const instructions = 'instructions'; - static const requests = 'requests'; - static const thisWeek = 'thisWeek'; - static const lastMonth = 'lastMonth'; - static const lastSixMonths = 'lastSixMonths'; - static const selectTime = 'selectTime'; - static const pleaseWaitYouWillBeCalledForVitalSigns = 'pleaseWaitYouWillBeCalledForVitalSigns'; - static const pleaseVisitRoomForVitalSigns = 'pleaseVisitRoomForVitalSigns'; - static const pleaseVisitRoomToTheDoctor = 'pleaseVisitRoomToTheDoctor'; - static const erOnlineCheckInRequest = 'erOnlineCheckInRequest'; - static const indoor = 'indoor'; - static const navigation = 'navigation'; - static const health = 'health'; - static const calculators = 'calculators'; - static const converters = 'converters'; - static const guide = 'guide'; - static const liveCareServiceDesc = 'liveCareServiceDesc'; - static const bloodGroup = 'bloodGroup'; - static const medicalServices = 'medicalServices'; - static const insuranceAndPayments = 'insuranceAndPayments'; - static const trackerAndOthers = 'trackerAndOthers'; - static const bmi = 'bmi'; - static const yesPleaseINeedHelp = 'yesPleaseINeedHelp'; - static const aiOverView = 'aiOverView'; - static const generateAiAnalysis = 'generateAiAnalysis'; - static const aiAnalysis = 'aiAnalysis'; - static const prediction = 'prediction'; - static const prevention = 'prevention'; - static const disclaimer = 'disclaimer'; - static const thisAboveInfo = 'thisAboveInfo'; - static const aiDisclaimer = 'aiDisclaimer'; - static const consent = 'consent'; - static const bmiNormalDescription = 'bmiNormalDescription'; - static const bmiUnderweightDescription = 'bmiUnderweightDescription'; - static const bmiOverweightDescription = 'bmiOverweightDescription'; - static const caloriesMaintenanceDescription = 'caloriesMaintenanceDescription'; - static const caloriesModerateDeficitDescription = 'caloriesModerateDeficitDescription'; - static const caloriesAggressiveDeficitDescription = 'caloriesAggressiveDeficitDescription'; - static const bodyFatEssentialDescription = 'bodyFatEssentialDescription'; - static const bodyFatFitnessDescription = 'bodyFatFitnessDescription'; - static const bodyFatAverageDescription = 'bodyFatAverageDescription'; - static const bodyFatObeseDescription = 'bodyFatObeseDescription'; - static const bmrNormalDescription = 'bmrNormalDescription'; - static const bmrLowDescription = 'bmrLowDescription'; - static const bmrHighDescription = 'bmrHighDescription'; - static const ibwAtTargetDescription = 'ibwAtTargetDescription'; - static const ibwBelowTargetDescription = 'ibwBelowTargetDescription'; - static const ibwAboveTargetDescription = 'ibwAboveTargetDescription'; - static const ibwCloseToRangeDescription = 'ibwCloseToRangeDescription'; - static const ibwUnderweightDescription = 'ibwUnderweightDescription'; - static const ibwUnderweightGenericDescription = 'ibwUnderweightGenericDescription'; - static const ibwOverweightDescription = 'ibwOverweightDescription'; - static const ibwOverweightGenericDescription = 'ibwOverweightGenericDescription'; - static const dietVeryLowCarbsDescription = 'dietVeryLowCarbsDescription'; - static const dietLowCarbsDescription = 'dietLowCarbsDescription'; - static const dietModerateCarbsDescription = 'dietModerateCarbsDescription'; - static const dietUSDAGuidelinesDescription = 'dietUSDAGuidelinesDescription'; - static const dietZoneDietDescription = 'dietZoneDietDescription'; - static const contextDependent = 'contextDependent'; - static const calculatedValue = 'calculatedValue'; - static const calculationFormula = 'calculationFormula'; - static const confirmYourLocation = 'confirmYourLocation'; - static const confirmYourLocationDesc = 'confirmYourLocationDesc'; - static const insideHospital = 'insideHospital'; - static const outsideHospital = 'outsideHospital'; - static const servicePriceList = 'servicePriceList'; - static const servicePriceListDesc = 'servicePriceListDesc'; - static const servicePriceListRights = 'servicePriceListRights'; - static const serviceName = 'serviceName'; - static const noFreeSlot = 'noFreeSlot'; - static const noThanksIKnowTheClinic = 'noThanksIKnowTheClinic'; - static const unableToSendOTP = 'unableToSendOTP'; - static const loadingAIAnalysis = 'loadingAIAnalysis'; - static const symptoms = 'symptoms'; - static const insuranceInActive = 'insuranceInActive'; - static const insuranceInActiveContactSupport = 'insuranceInActiveContactSupport'; - static const updateAppNow = 'updateAppNow'; - static const Dr = 'Dr'; - static const reschedulingAppo = 'reschedulingAppo'; - static const invalidEligibility = 'invalidEligibility'; - static const invalidInsurance = 'invalidInsurance'; - static const continueCash = 'continueCash'; - static const applewatch = 'applewatch'; - static const applehealthapplicationshouldbeinstalledinyourphone = 'applehealthapplicationshouldbeinstalledinyourphone'; - static const unabletodetectapplicationinstalledpleasecomebackonceinstalled = 'unabletodetectapplicationinstalledpleasecomebackonceinstalled'; - static const applewatchshouldbeconnected = 'applewatchshouldbeconnected'; - static const samsungwatch = 'samsungwatch'; - static const samsunghealthapplicationshouldbeinstalledinyourphone = 'samsunghealthapplicationshouldbeinstalledinyourphone'; - static const samsungwatchshouldbeconnected = 'samsungwatchshouldbeconnected'; - static const huaweiwatch = 'huaweiwatch'; - static const huaweihealthapplicationshouldbeinstalledinyourphone = 'huaweihealthapplicationshouldbeinstalledinyourphone'; - static const huaweiwatchshouldbeconnected = 'huaweiwatchshouldbeconnected'; - static const whoopwatch = 'whoopwatch'; - static const whoophealthapplicationshouldbeinstalledinyourphone = 'whoophealthapplicationshouldbeinstalledinyourphone'; - static const whoopwatchshouldbeconnected = 'whoopwatchshouldbeconnected'; - static const updatetheinformation = 'updatetheinformation'; - static const timeFor = 'timeFor'; - static const hmgPolicies = 'hmgPolicies'; - static const darkMode = 'darkMode'; - static const featureComingSoonDescription = 'featureComingSoonDescription'; - static const generateAiAnalysisResult = 'generateAiAnalysisResult'; - static const ratings = 'ratings'; - static const hmgPharmacyText = 'hmgPharmacyText'; - static const insuranceRequestSubmittedSuccessfully = 'insuranceRequestSubmittedSuccessfully'; - static const updatingEmailAddress = 'updatingEmailAddress'; - static const verifyInsurance = 'verifyInsurance'; - static const tests = 'tests'; - static const calendarPermissionAlert = 'calendarPermissionAlert'; - static const sortByNearestLocation = 'sortByNearestLocation'; - static const giveLocationPermissionForNearestList = 'giveLocationPermissionForNearestList'; - static const sortByLocation = 'sortByLocation'; - static const timeForFirstReminder = 'timeForFirstReminder'; - static const reminderRemovalNote = 'reminderRemovalNote'; - static const communicationLanguage = 'communicationLanguage'; - static const cmcServiceHeader = 'cmcServiceHeader'; - static const cmcServiceDescription = 'cmcServiceDescription'; - static const eReferralServiceHeader = 'eReferralServiceHeader'; - static const eReferralServiceDescription = 'eReferralServiceDescription'; - static const bloodDonationServiceHeader = 'bloodDonationServiceHeader'; - static const bloodDonationServiceDescription = 'bloodDonationServiceDescription'; - static const healthTrackersServiceHeader = 'healthTrackersServiceHeader'; - static const healthTrackersServiceDescription = 'healthTrackersServiceDescription'; - static const waterConsumptionServiceHeader = 'waterConsumptionServiceHeader'; - static const waterConsumptionServiceDescription = 'waterConsumptionServiceDescription'; - static const smartWatchServiceHeader = 'smartWatchServiceHeader'; - static const smartWatchServiceDescription = 'smartWatchServiceDescription'; - static const liveChatServiceHeader = 'liveChatServiceHeader'; - static const liveChatServiceDescription = 'liveChatServiceDescription'; - static const emergencyServiceHeader = 'emergencyServiceHeader'; - static const emergencyServiceDescription = 'emergencyServiceDescription'; - static const homeHealthCareServiceHeader = 'homeHealthCareServiceHeader'; - static const homeHealthCareServiceDescription = 'homeHealthCareServiceDescription'; - static const profileOnlyText = 'profileOnlyText'; - static const information = 'information'; - static const noFavouriteDoctors = 'noFavouriteDoctors'; - static const addDoctors = 'addDoctors'; - static const favouriteList = 'favouriteList'; - static const later = 'later'; - static const cancelAppointmentConfirmMessage = 'cancelAppointmentConfirmMessage'; - static const acknowledged = 'acknowledged'; - static const searchLabResults = 'searchLabResults'; - static const callForAssistance = 'callForAssistance'; - static const oneWaySubtitle = 'oneWaySubtitle'; - static const twoWaySubtitle = 'twoWaySubtitle'; - static const toHospitalSubtitle = 'toHospitalSubtitle'; - static const fromHospitalSubtitle = 'fromHospitalSubtitle'; - static const clinicSchedule = 'clinicSchedule'; - static const doctorAddedToFavourite = 'doctorAddedToFavourite'; - static const doctorRemovedFromFavourite = 'doctorRemovedFromFavourite'; - static const addNewFavorite = 'addNewFavorite'; - static const favourites = 'favourites'; - static const pendingAncillaryOrders = 'pendingAncillaryOrders'; - static const liveCarePermissions = 'liveCarePermissions'; - static const containsImage = 'containsImage'; - static const servicesSelected = 'servicesSelected'; - static const selectMedicalFileFromFamily = 'selectMedicalFileFromFamily'; - static const anyFileFromHMG = 'anyFileFromHMG'; - static const noDistance = 'noDistance'; - static const enterAmount = 'enterAmount'; - static const selectHospitalContinue = 'selectHospitalContinue'; - static const year = 'year'; - static const notifyPrescription = 'notifyPrescription'; - static const doctorRatingAppointment = 'doctorRatingAppointment'; - static const ratingSubmitted = 'ratingSubmitted'; - static const rateTheDoctor = 'rateTheDoctor'; - static const downloadInvoice = 'downloadInvoice'; - static const approvalDetails = 'approvalDetails'; - static const obese = 'obese'; - static const overWeight = 'overWeight'; - static const underWeight = 'underWeight'; - static const nearestGate = 'nearestGate'; - static const RRTDDetails = 'RRTDDetails'; - static const normalMapType = 'normalMapType'; - static const satelliteMapType = 'satelliteMapType'; - static const terrainMapType = 'terrainMapType'; - static const hybridMapType = 'hybridMapType'; - static const openCamera = 'openCamera'; - static const openGallery = 'openGallery'; - static const openFiles = 'openFiles'; - static const generateAiAnalysisRadResult = 'generateAiAnalysisRadResult'; - static const grantLocationPermission = 'grantLocationPermission'; - static const NoBookedAppointments = 'NoBookedAppointments'; - static const aiDisclaimerRad = 'aiDisclaimerRad'; - static const imageSizeTooLarge = 'imageSizeTooLarge'; - static const profileImageUpdatedSuccessfully = 'profileImageUpdatedSuccessfully'; - static const failedToProcessImage = 'failedToProcessImage'; - static const cameraGalleryPermissionMessage = 'cameraGalleryPermissionMessage'; - static const cameraGalleryPermissionRequired = 'cameraGalleryPermissionRequired'; - static const cameraPermissionMessage = 'cameraPermissionMessage'; - static const cameraPermissionRequired = 'cameraPermissionRequired'; - static const galleryPermissionMessage = 'galleryPermissionMessage'; - static const galleryPermissionRequired = 'galleryPermissionRequired'; - static const failedToCheckPermissions = 'failedToCheckPermissions'; - static const takePhotoWithCamera = 'takePhotoWithCamera'; - static const selectFromPhotoLibrary = 'selectFromPhotoLibrary'; - static const selectDocumentFiles = 'selectDocumentFiles'; - static const profilePicture = 'profilePicture'; - static const sendingAskDrRequest = 'sendingAskDrRequest'; - static const askDrRequestSentSuccess = 'askDrRequestSentSuccess'; - static const onlineCheckIn24HoursOnly = 'onlineCheckIn24HoursOnly'; - -} diff --git a/lib/generated/locale_keys.g.dart b/lib/generated/locale_keys.g.dart index 51d64b07..75653984 100644 --- a/lib/generated/locale_keys.g.dart +++ b/lib/generated/locale_keys.g.dart @@ -1740,5 +1740,6 @@ abstract class LocaleKeys { static const updateEmailAddressTitle = 'updateEmailAddressTitle'; static const enterNewNewContactNumber = 'enterNewNewContactNumber'; static const nationalIdFileNumber = 'nationalIdFileNumber'; + static const finda = 'finda'; } diff --git a/lib/presentation/book_appointment/select_clinic_page.dart b/lib/presentation/book_appointment/select_clinic_page.dart index e617194e..1cbe0e58 100644 --- a/lib/presentation/book_appointment/select_clinic_page.dart +++ b/lib/presentation/book_appointment/select_clinic_page.dart @@ -55,12 +55,14 @@ class _SelectClinicPageState extends State { late AppointmentViaRegionViewmodel regionalViewModel; late AppState appState; late BookAppointmentsViewModel bookAppointmentsViewModel; + late String name; @override void initState() { scheduleMicrotask(() { bookAppointmentsViewModel.getClinics(); }); + name = (widget.calculatorType!.name.toLowerCase() =="bmi"? widget.calculatorType!.name.toUpperCase(): widget.calculatorType!.name.toCamelCase)??""; super.initState(); } diff --git a/lib/presentation/health_calculators_and_converts/widgets/bmr.dart b/lib/presentation/health_calculators_and_converts/widgets/bmr.dart index 21a5df61..003faf06 100644 --- a/lib/presentation/health_calculators_and_converts/widgets/bmr.dart +++ b/lib/presentation/health_calculators_and_converts/widgets/bmr.dart @@ -513,7 +513,7 @@ class _BMRWidgetState extends State { Utils.buildSvgWithAssets(icon: AppAssets.globe, width: 18.w, height: 18.w), SizedBox(width: 12.w), Expanded( - child: "Calculates daily calorie intake based on server factors, like height, weight, age, gender and daily physical activity." + child: LocaleKeys.calculateCaloriesBasedOnFactors.tr() .toText12(isBold: true, color: AppColors.inputLabelTextColor), ), ], diff --git a/lib/presentation/health_calculators_and_converts/widgets/calories.dart b/lib/presentation/health_calculators_and_converts/widgets/calories.dart index 8e584e96..d354ce8e 100644 --- a/lib/presentation/health_calculators_and_converts/widgets/calories.dart +++ b/lib/presentation/health_calculators_and_converts/widgets/calories.dart @@ -512,7 +512,7 @@ class _CaloriesWidgetState extends State { Utils.buildSvgWithAssets(icon: AppAssets.globe, width: 18.w, height: 18.w), SizedBox(width: 12.w), Expanded( - child: "Calculates daily calorie intake based on server factors, like height, weight, age, gender and daily physical activity." + child: LocaleKeys.calculateCaloriesBasedOnFactors.tr() .toText12(isBold: true, color: AppColors.inputLabelTextColor), ), ], diff --git a/lib/presentation/home/data/landing_page_data.dart b/lib/presentation/home/data/landing_page_data.dart index eb0bb500..d0a15af6 100644 --- a/lib/presentation/home/data/landing_page_data.dart +++ b/lib/presentation/home/data/landing_page_data.dart @@ -32,7 +32,7 @@ class LandingPageData { ServiceCardData( serviceName: "search_doctor", icon: AppAssets.search_doctor_icon, - title: LocaleKeys.searchFor, + title: LocaleKeys.finda, subtitle: LocaleKeys.doctor, backgroundColor: AppColors.whiteColor, iconColor: AppColors.blackColor, @@ -115,7 +115,7 @@ class LandingPageData { ServiceCardData( serviceName: "insurance_update", icon: AppAssets.insurance_update_icon, - title: getIt.get().isArabic()?LocaleKeys.details2: LocaleKeys.insurance2, + title: LocaleKeys.medical, subtitle: getIt.get().isArabic()?LocaleKeys.insurance2: LocaleKeys.details2, backgroundColor: AppColors.whiteColor, iconColor: AppColors.blackColor, diff --git a/lib/presentation/prescriptions/prescriptions_list_page.dart b/lib/presentation/prescriptions/prescriptions_list_page.dart index b88eec30..483b1ad0 100644 --- a/lib/presentation/prescriptions/prescriptions_list_page.dart +++ b/lib/presentation/prescriptions/prescriptions_list_page.dart @@ -27,7 +27,7 @@ import 'package:provider/provider.dart'; import 'dart:ui' as ui; class PrescriptionsListPage extends StatefulWidget { - const PrescriptionsListPage({super.key}); + const PrescriptionsListPage({super.key}); @override State createState() => _PrescriptionsListPageState(); From db2ccd3be6a424df447626b6e3238f8832152119 Mon Sep 17 00:00:00 2001 From: aamir-csol Date: Tue, 14 Apr 2026 20:04:39 +0300 Subject: [PATCH 31/45] Date & Time New Widget For Whole App --- assets/langs/ar-SA.json | 1 + assets/langs/en-US.json | 1 + lib/core/dependencies.dart | 34 +- lib/core/utils/request_utils.dart | 2 +- .../authentication_view_model.dart | 19 +- lib/generated/codegen_loader.g.dart | 2 + lib/generated/locale_kesy.g.dart | 1 + lib/generated/locale_keys.g.dart | 1 + lib/main.dart | 3 + .../authentication/register_step2.dart | 87 +- .../date_range_calender.dart | 750 ++++++++++++++++-- .../models/calendar_design_type.dart | 5 + .../viewmodel/date_range_calendar_model.dart | 555 +++++++++++++ .../viewmodel/date_range_view_model.dart | 8 + lib/widgets/input_widget.dart | 55 +- pubspec.yaml | 3 +- 16 files changed, 1362 insertions(+), 165 deletions(-) create mode 100644 lib/widgets/date_range_selector/models/calendar_design_type.dart create mode 100644 lib/widgets/date_range_selector/viewmodel/date_range_calendar_model.dart diff --git a/assets/langs/ar-SA.json b/assets/langs/ar-SA.json index 5a8df673..8cc2cba5 100644 --- a/assets/langs/ar-SA.json +++ b/assets/langs/ar-SA.json @@ -895,6 +895,7 @@ "monitor": "مراقبة", "noSpecialResult": "لا توجد نتائج خاصة", "setTheDateRange": "تعيين النطاق الزمني", + "selectDate": "اختر التاريخ", "historyFlowchart": "مخطط تدفق التاريخ", "to": "إلى", "startDate": "تاريخ البدء", diff --git a/assets/langs/en-US.json b/assets/langs/en-US.json index 5a7f9e66..75a7bcab 100644 --- a/assets/langs/en-US.json +++ b/assets/langs/en-US.json @@ -878,6 +878,7 @@ "monitor": "Monitor", "noSpecialResult": "No Special Results", "setTheDateRange": "Set The Date Range", + "selectDate": "Select Date", "historyFlowchart": "History FlowChart", "to": "to", "startDate" : "Start Date", diff --git a/lib/core/dependencies.dart b/lib/core/dependencies.dart index f451f0d5..3b9eefc0 100644 --- a/lib/core/dependencies.dart +++ b/lib/core/dependencies.dart @@ -76,6 +76,7 @@ import 'package:hmg_patient_app_new/services/localauth_service.dart'; import 'package:hmg_patient_app_new/services/logger_service.dart'; import 'package:hmg_patient_app_new/services/navigation_service.dart'; import 'package:hmg_patient_app_new/services/notification_service.dart'; +import 'package:hmg_patient_app_new/widgets/date_range_selector/viewmodel/date_range_calendar_model.dart'; import 'package:hmg_patient_app_new/widgets/date_range_selector/viewmodel/date_range_view_model.dart'; import 'package:local_auth/local_auth.dart'; import 'package:logger/web.dart'; @@ -133,7 +134,6 @@ class AppDependencies { navigationService: getIt(), )); - final flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin(); getIt.registerLazySingleton(() => NotificationServiceImp( flutterLocalNotificationsPlugin: flutterLocalNotificationsPlugin, @@ -172,8 +172,12 @@ class AppDependencies { getIt.registerLazySingleton(() => MonthlyReportRepoImp(loggerService: getIt(), apiClient: getIt())); getIt.registerLazySingleton(() => ActivePrescriptionsRepoImp(loggerService: getIt(), apiClient: getIt())); getIt.registerLazySingleton(() => TermsConditionsRepoImp(loggerService: getIt(), apiClient: getIt())); - getIt.registerFactory(() => TermsConditionsViewModel(termsConditionsRepo: getIt(), errorHandlerService: getIt(), - ),); + getIt.registerFactory( + () => TermsConditionsViewModel( + termsConditionsRepo: getIt(), + errorHandlerService: getIt(), + ), + ); getIt.registerLazySingleton(() => MonthlyReportsRepoImp(loggerService: getIt(), apiClient: getIt())); getIt.registerLazySingleton(() => QrParkingRepoImp(loggerService: getIt(), apiClient: getIt())); getIt.registerLazySingleton(() => NotificationsRepoImp(loggerService: getIt(), apiClient: getIt())); @@ -233,10 +237,10 @@ class AppDependencies { ); getIt.registerLazySingleton(() => ProfileSettingsViewModel( - cacheService: getIt(), - profileSettingsRepo: getIt(), - errorHandlerService: getIt(), - )); + cacheService: getIt(), + profileSettingsRepo: getIt(), + errorHandlerService: getIt(), + )); getIt.registerLazySingleton(() => DateRangeSelectorRangeViewModel()); @@ -312,22 +316,12 @@ class AppDependencies { getIt.registerLazySingleton(() => NotificationsViewModel(notificationsRepo: getIt(), errorHandlerService: getIt())); getIt.registerLazySingleton(() => HealthTrackersViewModel(healthTrackersRepo: getIt(), errorHandlerService: getIt())); - getIt.registerLazySingleton( - () => ActivePrescriptionsViewModel( - errorHandlerService: getIt(), - activePrescriptionsRepo: getIt() - ), - ); - getIt.registerFactory( - () => QrParkingViewModel( - qrParkingRepo: getIt(), - errorHandlerService: getIt(), - cacheService: getIt(), - ), - ); + getIt.registerLazySingleton(() => ActivePrescriptionsViewModel(errorHandlerService: getIt(), activePrescriptionsRepo: getIt())); + getIt.registerFactory(() => QrParkingViewModel(qrParkingRepo: getIt(), errorHandlerService: getIt(), cacheService: getIt())); getIt.registerLazySingleton(() => AskDoctorViewModel(askDoctorRepo: getIt(), errorHandlerService: getIt())); getIt.registerLazySingleton(() => ServicesPriceListViewModel(servicesPriceListRepo: getIt(), errorHandlerService: getIt())); + getIt.registerLazySingleton(() => DateRangCalenderModel(appState: getIt(), navigationService: getIt(), dialogService: getIt())); } } diff --git a/lib/core/utils/request_utils.dart b/lib/core/utils/request_utils.dart index bb947398..4d4ae4b5 100644 --- a/lib/core/utils/request_utils.dart +++ b/lib/core/utils/request_utils.dart @@ -1,7 +1,6 @@ import 'dart:developer'; import 'package:easy_localization/easy_localization.dart'; -import 'package:hijri_gregorian_calendar/hijri_gregorian_calendar.dart'; import 'package:hmg_patient_app_new/core/api_consts.dart'; import 'package:hmg_patient_app_new/core/app_state.dart'; import 'package:hmg_patient_app_new/core/dependencies.dart'; @@ -12,6 +11,7 @@ import 'package:hmg_patient_app_new/features/authentication/models/request_model import 'package:hmg_patient_app_new/features/authentication/models/request_models/send_activation_request_model.dart'; import 'package:hmg_patient_app_new/features/common/models/commong_authanticated_req_model.dart'; import 'package:hmg_patient_app_new/features/common/models/family_file_request.dart'; +import 'package:hmg_patient_app_new/widgets/date_range_selector/viewmodel/date_range_calendar_model.dart'; class RequestUtils { static dynamic getPatientAuthenticationRequest({ diff --git a/lib/features/authentication/authentication_view_model.dart b/lib/features/authentication/authentication_view_model.dart index 573887e6..ca31b663 100644 --- a/lib/features/authentication/authentication_view_model.dart +++ b/lib/features/authentication/authentication_view_model.dart @@ -6,7 +6,6 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart' show rootBundle; import 'package:get_it/get_it.dart'; -import 'package:hijri_gregorian_calendar/hijri_gregorian_calendar.dart'; import 'package:hmg_patient_app_new/core/api_consts.dart'; import 'package:hmg_patient_app_new/core/app_state.dart'; import 'package:hmg_patient_app_new/core/cache_consts.dart'; @@ -42,6 +41,7 @@ import 'package:hmg_patient_app_new/services/dialog_service.dart'; import 'package:hmg_patient_app_new/services/error_handler_service.dart'; import 'package:hmg_patient_app_new/services/localauth_service.dart'; import 'package:hmg_patient_app_new/services/navigation_service.dart'; +import 'package:hmg_patient_app_new/widgets/date_range_selector/viewmodel/date_range_calendar_model.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:sms_otp_auto_verify/sms_otp_auto_verify.dart'; @@ -152,10 +152,12 @@ class AuthenticationViewModel extends ChangeNotifier { void onDobChange(String? date) { if (calenderType == CalenderEnum.hijri) { - var hijriDate = HijriGregConverter.gregorianToHijri(DateTime.parse(date!)); + // Use DateRangCalenderModel for accurate Umm al-Qura conversion + final calendarModel = DateRangCalenderModel(appState: _appState, navigationService: _errorHandlerService, dialogService: _dialogService); + var hijriDate = calendarModel.gregorianToHijri(DateTime.parse(date!)); DateTime hijriDateTimeForController = DateTime(hijriDate.year, hijriDate.month, hijriDate.day); dob = Utils.formatDateForApi(date); - dobController.text = Utils.formatHijriDateToDisplay(hijriDateTimeForController.toIso8601String()); // Or directly hijriDate.toString() if that's what your formatter expects + dobController.text = Utils.formatHijriDateToDisplay(hijriDateTimeForController.toIso8601String()); } else { dobController.text = Utils.formatDateToDisplay(date!); dob = Utils.formatDateForApi(date); @@ -897,7 +899,13 @@ class AuthenticationViewModel extends ChangeNotifier { } final resultEither = await _authenticationRepo.checkPatientForRegistration(commonAuthanticatedRequest: nRequest); - resultEither.fold((failure) async => await _errorHandlerService.handleError(failure: failure), (apiResponse) async { + resultEither.fold((failure) async => await _errorHandlerService.handleError(failure: failure, onUnHandledFailure: (failur) { + + LoaderBottomSheet.hideLoader(); + _dialogService.showExceptionBottomSheet(message: failur.message, onOkPressed: () { + _navigationService.pop(); + }); + }), (apiResponse) async { checkUserStatusForRegistration(response: apiResponse.data, request: request); }); } @@ -907,6 +915,7 @@ class AuthenticationViewModel extends ChangeNotifier { // LoadingUtils.showFullScreenLoader(loadingText: "Setting up your medical file.\nMay take a moment."); var request = RequestUtils.getUserSignupCompletionRequest(fullName: nameController.text, emailAddress: emailController.text, gender: genderType, maritalStatus: maritalStatus); + final resultEither = await _authenticationRepo.registerUser(registrationPayloadDataModelRequest: request); resultEither.fold((failure) async => await _errorHandlerService.handleError(failure: failure), (apiResponse) async { if (apiResponse.data is String) { @@ -926,6 +935,8 @@ class AuthenticationViewModel extends ChangeNotifier { _navigationService.pushAndRemoveUntil(CustomPageRoute(page: LandingNavigation()), (r) => false); _navigationService.push(CustomPageRoute(page: LoginScreen())); }); + } else { + print("========="); } } }); diff --git a/lib/generated/codegen_loader.g.dart b/lib/generated/codegen_loader.g.dart index 486cb4da..03e2a341 100644 --- a/lib/generated/codegen_loader.g.dart +++ b/lib/generated/codegen_loader.g.dart @@ -907,6 +907,7 @@ class CodegenLoader extends AssetLoader{ "monitor": "مراقبة", "noSpecialResult": "لا توجد نتائج خاصة", "setTheDateRange": "تعيين النطاق الزمني", + "selectDate": "اختر التاريخ", "historyFlowchart": "مخطط تدفق التاريخ", "to": "إلى", "startDate": "تاريخ البدء", @@ -2627,6 +2628,7 @@ static const Map _en_US = { "monitor": "Monitor", "noSpecialResult": "No Special Results", "setTheDateRange": "Set The Date Range", + "selectDate": "Select Date", "historyFlowchart": "History FlowChart", "to": "to", "startDate": "Start Date", diff --git a/lib/generated/locale_kesy.g.dart b/lib/generated/locale_kesy.g.dart index 06f92632..3bf6d2d9 100644 --- a/lib/generated/locale_kesy.g.dart +++ b/lib/generated/locale_kesy.g.dart @@ -893,6 +893,7 @@ abstract class LocaleKeys { static const monitor = 'monitor'; static const noSpecialResult = 'noSpecialResult'; static const setTheDateRange = 'setTheDateRange'; + static const selectDate = 'selectDate'; static const historyFlowchart = 'historyFlowchart'; static const to = 'to'; static const startDate = 'startDate'; diff --git a/lib/generated/locale_keys.g.dart b/lib/generated/locale_keys.g.dart index f71483b9..058100e4 100644 --- a/lib/generated/locale_keys.g.dart +++ b/lib/generated/locale_keys.g.dart @@ -894,6 +894,7 @@ abstract class LocaleKeys { static const monitor = 'monitor'; static const noSpecialResult = 'noSpecialResult'; static const setTheDateRange = 'setTheDateRange'; + static const selectDate = 'selectDate'; static const historyFlowchart = 'historyFlowchart'; static const to = 'to'; static const startDate = 'startDate'; diff --git a/lib/main.dart b/lib/main.dart index 6f086c34..23f7c4d7 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -53,6 +53,7 @@ import 'package:hmg_patient_app_new/services/logger_service.dart'; import 'package:hmg_patient_app_new/services/navigation_service.dart'; import 'package:hmg_patient_app_new/theme/app_theme.dart'; import 'package:hmg_patient_app_new/theme/colors.dart'; +import 'package:hmg_patient_app_new/widgets/date_range_selector/viewmodel/date_range_calendar_model.dart'; import 'package:hmg_patient_app_new/widgets/date_range_selector/viewmodel/date_range_view_model.dart' show DateRangeSelectorRangeViewModel; import 'package:provider/provider.dart'; import 'package:provider/single_child_widget.dart'; @@ -246,6 +247,8 @@ void main() async { ) , ChangeNotifierProvider( create: (_) => getIt.get(), + ), ChangeNotifierProvider( + create: (_) => getIt.get(), ) ], child: MyApp()), ), // Wrap your app diff --git a/lib/presentation/authentication/register_step2.dart b/lib/presentation/authentication/register_step2.dart index f01dd036..4a628fd3 100644 --- a/lib/presentation/authentication/register_step2.dart +++ b/lib/presentation/authentication/register_step2.dart @@ -73,7 +73,7 @@ class _RegisterNew extends State { onLanguageChanged: (lang) {}, hideLogoAndLang: true, ), - bottomSheet: Container( + bottomSheet: Container( // height: 200.h, width: MediaQuery.of(context).size.width, decoration: RoundedRectangleBorder().toSmoothCornerDecoration( @@ -81,51 +81,52 @@ class _RegisterNew extends State { customBorder: BorderRadius.only(topLeft: Radius.circular(24), topRight: Radius.circular(24)), hasShadow: true, ), - child: Row( - children: [ - Expanded( - child: CustomButton( - text: LocaleKeys.cancel.tr(), - icon: AppAssets.cancel, - onPressed: () { - Navigator.of(context).pop(); - // authVM!.clearDefaultInputValues(); - }, - backgroundColor: AppColors.secondaryLightRedColor, - borderColor: AppColors.secondaryLightRedColor, - textColor: AppColors.primaryRedColor, - iconColor: AppColors.primaryRedColor, + child: Row( + children: [ + Expanded( + child: CustomButton( + text: LocaleKeys.cancel.tr(), + icon: AppAssets.cancel, + onPressed: () { + Navigator.of(context).pop(); + // authVM!.clearDefaultInputValues(); + }, + backgroundColor: AppColors.secondaryLightRedColor, + borderColor: AppColors.secondaryLightRedColor, + textColor: AppColors.primaryRedColor, + iconColor: AppColors.primaryRedColor, + ), ), - ), - SizedBox(width: 16.w), - Expanded( - child: CustomButton( - backgroundColor: AppColors.primaryRedColor, - borderColor: AppColors.primaryRedColor, - textColor: AppColors.whiteColor, - text: LocaleKeys.confirm.tr(), - icon: AppAssets.confirm, - iconColor: AppColors.whiteColor, - onPressed: () { - if (appState.getUserRegistrationPayload.zipCode != CountryEnum.saudiArabia.countryCode) { - if (ValidationUtils.validateUaeRegistration( - name: authVM!.nameController.text, - gender: authVM!.genderType, - country: authVM!.pickedCountryByUAEUser, - maritalStatus: authVM!.maritalStatus, - onOkPress: () { - Navigator.of(context).pop(); - })) { + SizedBox(width: 16.w), + Expanded( + child: CustomButton( + backgroundColor: AppColors.primaryRedColor, + borderColor: AppColors.primaryRedColor, + textColor: AppColors.whiteColor, + text: LocaleKeys.confirm.tr(), + icon: AppAssets.confirm, + iconColor: AppColors.whiteColor, + onPressed: () { + if (appState.getUserRegistrationPayload.zipCode != CountryEnum.saudiArabia.countryCode) { + if (ValidationUtils.validateUaeRegistration( + name: authVM!.nameController.text, + gender: authVM!.genderType, + country: authVM!.pickedCountryByUAEUser, + maritalStatus: authVM!.maritalStatus, + onOkPress: () { + Navigator.of(context).pop(); + })) { + showModel(context: context); + } + } else { showModel(context: context); } - } else { - showModel(context: context); - } - }, - ), - ) - ], - ).paddingAll(16.h),), + }, + ), + ) + ], + ).paddingAll(16.h), + ), body: GestureDetector( onTap: () { FocusScope.of(context).unfocus(); diff --git a/lib/widgets/date_range_selector/date_range_calender.dart b/lib/widgets/date_range_selector/date_range_calender.dart index fd37d0cb..2bc5788b 100644 --- a/lib/widgets/date_range_selector/date_range_calender.dart +++ b/lib/widgets/date_range_selector/date_range_calender.dart @@ -4,6 +4,7 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:hmg_patient_app_new/core/app_assets.dart'; import 'package:hmg_patient_app_new/core/app_export.dart'; +import 'package:hmg_patient_app_new/core/dependencies.dart'; import 'package:hmg_patient_app_new/core/utils/utils.dart'; import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; @@ -12,31 +13,66 @@ import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; import 'package:hmg_patient_app_new/theme/colors.dart'; import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart'; import 'package:hmg_patient_app_new/widgets/chip/app_custom_chip_widget.dart'; +import 'package:hmg_patient_app_new/widgets/custom_tab_bar.dart'; +import 'package:hmg_patient_app_new/widgets/date_range_selector/models/calendar_design_type.dart'; +import 'package:hmg_patient_app_new/widgets/date_range_selector/viewmodel/date_range_calendar_model.dart'; import 'package:hmg_patient_app_new/widgets/date_range_selector/viewmodel/date_range_view_model.dart' show DateRangeSelectorRangeViewModel; import 'package:provider/provider.dart'; import 'package:syncfusion_flutter_datepicker/datepicker.dart'; typedef OnRangeSelected = void Function(DateTime? start, DateTime? end); +typedef OnCalendarTypeChanged = void Function(bool isGregorian); class DateRangeSelector extends StatefulWidget { final OnRangeSelected onRangeSelected; + final CalendarDesignType designType; + final bool showCalendarToggle; + final OnCalendarTypeChanged? onCalendarTypeChanged; - const DateRangeSelector({super.key, required this.onRangeSelected}); + const DateRangeSelector({ + super.key, + required this.onRangeSelected, + this.designType = CalendarDesignType.defaultUI, + this.showCalendarToggle = true, + this.onCalendarTypeChanged, + }); @override State createState() => _DateRangeSelectorState(); } +enum PickerViewMode { + date, + month, + year, +} + class _DateRangeSelectorState extends State { late DateRangePickerController _calendarController; DateTime? start; DateTime? end; late DateRangeSelectorRangeViewModel model; + PickerViewMode _viewMode = PickerViewMode.date; + + // Cache for Hijri conversions to avoid repeated calculations + final Map _hijriCache = {}; + + // Track the current Hijri month/year being displayed (for header display accuracy) + HijriGregDate? _currentHijriDisplay; + @override void initState() { _calendarController = DateRangePickerController(); scheduleMicrotask(() { - _calendarController.selectedRange = PickerDateRange(model.fromDate,model.toDate); + if (widget.designType == CalendarDesignType.designV2) { + // For V2, select today's date by default + final today = DateTime.now(); + _calendarController.selectedDate = today; + model.updateSelectedDate(today); + } else { + // For default UI, use range selection + _calendarController.selectedRange = PickerDateRange(model.fromDate, model.toDate); + } }); super.initState(); } @@ -45,9 +81,12 @@ class _DateRangeSelectorState extends State { Widget build(BuildContext context) { model = Provider.of(context); + _calendarController.selectedRange = PickerDateRange(model.fromDate, model.toDate); - _calendarController.selectedRange = PickerDateRange(model.fromDate,model.toDate); + return widget.designType == CalendarDesignType.designV2 ? _buildDesignV2() : _buildDefaultUI(); + } + Widget _buildDefaultUI() { return Padding( padding: EdgeInsets.symmetric(horizontal: 0.h), child: Column( @@ -57,14 +96,8 @@ class _DateRangeSelectorState extends State { builder: (_, model, __) => selectionChip(model), ).paddingOnly(bottom: 16.h), Container( - decoration: RoundedRectangleBorder().toSmoothCornerDecoration( - color: AppColors.whiteColor, - borderRadius: 20.h, - hasShadow: false, - ), - padding: EdgeInsets.all( - 16.h - ), + decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 20.h, hasShadow: false), + padding: EdgeInsets.all(16.h), child: Column( children: [ Row( @@ -72,13 +105,8 @@ class _DateRangeSelectorState extends State { fromDateComponent(), Text( LocaleKeys.to.tr(context: context), - style: TextStyle( - color: AppColors.calenderTextColor, - fontSize: 14.f, - fontWeight: FontWeight.w600, - letterSpacing: -.2 - ), - ).paddingSymmetrical(24.h,0.h), + style: TextStyle(color: AppColors.calenderTextColor, fontSize: 14.f, fontWeight: FontWeight.w600, letterSpacing: -.2), + ).paddingSymmetrical(24.h, 0.h), toDateComponent(), ], ), @@ -126,8 +154,7 @@ class _DateRangeSelectorState extends State { ), startRangeSelectionColor: AppColors.primaryRedColor, endRangeSelectionColor: AppColors.primaryRedColor, - rangeSelectionColor: - AppColors.primaryRedColor.withOpacity(0.1), + rangeSelectionColor: AppColors.primaryRedColor.withOpacity(0.1), rangeTextStyle: TextStyle( fontFamily: "Poppins", ), @@ -144,8 +171,7 @@ class _DateRangeSelectorState extends State { fontWeight: FontWeight.bold, ), ), - onSelectionChanged: - (DateRangePickerSelectionChangedArgs args) { + onSelectionChanged: (DateRangePickerSelectionChangedArgs args) { print("the value is ${args.value}"); if (args.value is PickerDateRange) { final PickerDateRange range = args.value; @@ -153,11 +179,10 @@ class _DateRangeSelectorState extends State { end = range.endDate; model.fromDate = start; model.toDate = end; - if(end == null) { - scheduleMicrotask((){ + if (end == null) { + scheduleMicrotask(() { model.resetCurrentlySelectedRange(); }); - } } }, @@ -169,7 +194,7 @@ class _DateRangeSelectorState extends State { Row( children: [ Consumer( - builder: (_, model, __) => Visibility( + builder: (_, model, __) => Visibility( visible: (model.fromDate != null || model.toDate != null), child: Expanded( child: Row( @@ -192,7 +217,9 @@ class _DateRangeSelectorState extends State { height: 56.h, ), ), - SizedBox(width: 16.h,) + SizedBox( + width: 16.h, + ) ], ), ), @@ -210,7 +237,6 @@ class _DateRangeSelectorState extends State { textColor: AppColors.textGreenColor, icon: AppAssets.reminder_bell, iconColor: AppColors.textGreenColor, - height: 56.h, ), ), @@ -221,11 +247,620 @@ class _DateRangeSelectorState extends State { ); } + Widget _buildDesignV2() { + return ChangeNotifierProvider( + create: (_) => DateRangCalenderModel(appState: getIt(), navigationService: getIt(), dialogService: getIt()), + child: Consumer( + builder: (context, calendarModel, child) { + // Check if current language is Arabic + final bool isArabic = context.locale.languageCode == 'ar'; + + return Padding( + padding: EdgeInsets.symmetric(horizontal: 0.h), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + // Conditionally show calendar toggle + if (widget.showCalendarToggle) + Selector( + selector: (_, model) => model.getSelectedTabIndex, + builder: (context, selectedIndex, child) => CustomTabBar( + activeBackgroundColor: AppColors.secondaryLightRedColor, + activeTextColor: AppColors.primaryRedColor, + initialIndex: selectedIndex, + tabs: [CustomTabBarModel(null, LocaleKeys.gregorianDate.tr()), CustomTabBarModel(null, LocaleKeys.hijriDate.tr())], + onTabChange: (index) { + final calendarModel = Provider.of(context, listen: false); + calendarModel.setTabIndex(index); + + // Notify parent widget about calendar type change (e.g., AuthenticationViewModel) + final isGregorian = index == 0; + widget.onCalendarTypeChanged?.call(isGregorian); + print('📅 Calendar type changed: ${isGregorian ? "Gregorian" : "Hijri"}'); + + // Reset view mode and Hijri display when switching calendar types + setState(() { + _viewMode = PickerViewMode.date; + _currentHijriDisplay = null; + }); + }, + ), + ), + if (widget.showCalendarToggle) + SizedBox( + height: 16.w, + ), + + Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 20.h, hasShadow: false), + padding: EdgeInsets.all(16.h), + child: Column( + children: [ + // Show custom header for both calendar types + _buildCalendarHeader(isArabic, calendarModel), + // Wrap all views in SizedBox for consistent height + SizedBox( + height: 272.h, // Fixed height for calendar body only (no header) + child: Material( + color: AppColors.whiteColor, + // Rebuild when view mode or calendar type changes + key: ValueKey('${calendarModel.getSelectedTabIndex}-$_viewMode'), + child: _viewMode == PickerViewMode.month + ? _buildMonthPicker(isArabic, calendarModel) + : _viewMode == PickerViewMode.year + ? _buildYearPicker(isArabic, calendarModel) + : (calendarModel.isHijri ? _buildHijriCalendar(isArabic) : _buildGregorianCalendar(isArabic)), + ), + ), + ], + ), + ), + // Only Select button for V2 (no cancel button) + CustomButton( + text: LocaleKeys.select.tr(context: context), + onPressed: () { + // Don't reset calendar type - keep user's preference + Navigator.of(context).pop(); + // For single date selection, pass the same date as both start and end + widget.onRangeSelected(model.fromDate, model.fromDate); + }, + backgroundColor: AppColors.primaryRedColor, + borderColor: Colors.transparent, + textColor: AppColors.whiteColor, + height: 56.h, + ).paddingOnly(top: 24.h), + // Bottom image from ui2.png + SizedBox(height: 16.h), + ], + ), + ); + }, + ), + ); + } + + // Build Gregorian calendar (Design V2 - Single Date Selection) + Widget _buildGregorianCalendar(bool isArabic) { + return SfDateRangePicker( + controller: _calendarController, + selectionMode: DateRangePickerSelectionMode.single, + showNavigationArrow: false, + headerHeight: 0, + // Hide built-in header, use custom header + backgroundColor: AppColors.whiteColor, + monthViewSettings: DateRangePickerMonthViewSettings( + viewHeaderStyle: DateRangePickerViewHeaderStyle( + backgroundColor: AppColors.whiteColor, + textStyle: TextStyle( + fontSize: 12.f, + fontWeight: FontWeight.w600, + letterSpacing: -0.46, + color: AppColors.textColor, + ), + ), + showTrailingAndLeadingDates: false, + dayFormat: "EEE", + ), + // Custom cell builder for square border selection + cellBuilder: (BuildContext context, DateRangePickerCellDetails cellDetails) { + if (cellDetails.date != DateTime(0)) { + final isToday = cellDetails.date.day == DateTime.now().day && cellDetails.date.month == DateTime.now().month && cellDetails.date.year == DateTime.now().year; + final isSelected = _calendarController.selectedDate != null && + cellDetails.date.day == _calendarController.selectedDate!.day && + cellDetails.date.month == _calendarController.selectedDate!.month && + cellDetails.date.year == _calendarController.selectedDate!.year; + + return Container( + alignment: Alignment.center, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(8.h), + border: isSelected ? Border.all(color: AppColors.primaryRedColor, width: 2) : null, + color: Colors.transparent, + ), + child: Text( + cellDetails.date.day.toString(), + style: TextStyle( + fontFamily: "Poppins", + fontSize: 12.f, + color: AppColors.textColor, + fontWeight: isToday ? FontWeight.bold : (isSelected ? FontWeight.w600 : FontWeight.normal), + ), + ), + ); + } + return Container(); + }, + selectionShape: DateRangePickerSelectionShape.rectangle, + selectionRadius: 8.h, + selectionColor: Colors.transparent, + selectionTextStyle: TextStyle( + fontFamily: "Poppins", + color: AppColors.textColor, + fontWeight: FontWeight.w600, + ), + todayHighlightColor: Colors.transparent, + monthCellStyle: DateRangePickerMonthCellStyle( + textStyle: TextStyle( + fontFamily: "Poppins", + fontSize: 12.f, + color: AppColors.textColor, + ), + todayTextStyle: TextStyle( + fontFamily: "Poppins", + color: AppColors.textColor, + fontWeight: FontWeight.bold, + ), + ), + onViewChanged: (DateRangePickerViewChangedArgs args) { + // Trigger rebuild when month changes + WidgetsBinding.instance.addPostFrameCallback((_) { + if (mounted) { + setState(() {}); + } + }); + }, + onSelectionChanged: (DateRangePickerSelectionChangedArgs args) { + if (args.value is DateTime) { + setState(() { + start = args.value; + end = args.value; + }); + model.updateSelectedDate(args.value); + } + }, + ); + } + + // Build Hijri calendar (Design V2 - Single Date Selection) + // Note: SfDateRangePicker doesn't have built-in Hijri support + // Using Gregorian calendar with Hijri date conversion in the model + Widget _buildHijriCalendar(bool isArabic) { + final calendarModel = Provider.of(context, listen: false); + + return SfDateRangePicker( + controller: _calendarController, + selectionMode: DateRangePickerSelectionMode.single, + showNavigationArrow: false, + headerHeight: 0, + backgroundColor: AppColors.whiteColor, + monthViewSettings: DateRangePickerMonthViewSettings( + viewHeaderStyle: DateRangePickerViewHeaderStyle( + backgroundColor: AppColors.whiteColor, + textStyle: TextStyle( + fontSize: 12.f, + fontWeight: FontWeight.w600, + letterSpacing: -0.46, + color: AppColors.textColor, + ), + ), + showTrailingAndLeadingDates: false, + dayFormat: "EEE", + ), + cellBuilder: (BuildContext context, DateRangePickerCellDetails cellDetails) { + if (cellDetails.date != DateTime(0)) { + // Use cached Hijri conversion + final dateKey = '${cellDetails.date.year}-${cellDetails.date.month}-${cellDetails.date.day}'; + final hijriDate = _hijriCache.putIfAbsent(dateKey, () => calendarModel.gregorianToHijri(cellDetails.date)); + + final isToday = cellDetails.date.day == DateTime.now().day && cellDetails.date.month == DateTime.now().month && cellDetails.date.year == DateTime.now().year; + final isSelected = _calendarController.selectedDate != null && + cellDetails.date.day == _calendarController.selectedDate!.day && + cellDetails.date.month == _calendarController.selectedDate!.month && + cellDetails.date.year == _calendarController.selectedDate!.year; + + return Container( + alignment: Alignment.center, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(8.h), + border: isSelected ? Border.all(color: AppColors.primaryRedColor, width: 2) : null, + color: Colors.transparent, + ), + child: Text( + hijriDate.day.toString(), + style: TextStyle( + fontFamily: "Poppins", + fontSize: 12.f, + color: AppColors.textColor, + fontWeight: isToday ? FontWeight.bold : (isSelected ? FontWeight.w600 : FontWeight.normal), + ), + ), + ); + } + return Container(); + }, + selectionShape: DateRangePickerSelectionShape.rectangle, + selectionRadius: 8.h, + selectionColor: Colors.transparent, + selectionTextStyle: TextStyle( + fontFamily: "Poppins", + color: AppColors.textColor, + fontWeight: FontWeight.w600, + ), + todayHighlightColor: Colors.transparent, + monthCellStyle: DateRangePickerMonthCellStyle( + textStyle: TextStyle( + fontFamily: "Poppins", + fontSize: 12.f, + color: AppColors.textColor, + ), + todayTextStyle: TextStyle( + fontFamily: "Poppins", + color: AppColors.textColor, + fontWeight: FontWeight.bold, + ), + ), + onViewChanged: (DateRangePickerViewChangedArgs args) { + // Clear cache when month changes to avoid stale data + _hijriCache.clear(); + WidgetsBinding.instance.addPostFrameCallback((_) { + if (mounted) { + setState(() {}); + } + }); + }, + onSelectionChanged: (DateRangePickerSelectionChangedArgs args) { + if (args.value is DateTime) { + setState(() { + start = args.value; + end = args.value; + }); + model.updateSelectedDate(args.value); + } + }, + ); + } + + // Build unified calendar header for both Gregorian and Hijri + Widget _buildCalendarHeader(bool isArabic, DateRangCalenderModel calendarModel) { + final displayedDate = _calendarController.displayDate ?? DateTime.now(); + + String monthText; + String yearText; + + if (calendarModel.isHijri) { + // Use tracked Hijri display date if available, otherwise convert from displayed Gregorian date + final hijriDate = _currentHijriDisplay ?? calendarModel.gregorianToHijri(displayedDate); + final monthName = calendarModel.getMonthNameLocalized(hijriDate.month, isArabic); + monthText = monthName; + yearText = hijriDate.year.toString(); + } else { + final monthNames = isArabic + ? ['يناير', 'فبراير', 'مارس', 'أبريل', 'مايو', 'يونيو', 'يوليو', 'أغسطس', 'سبتمبر', 'أكتوبر', 'نوفمبر', 'ديسمبر'] + : ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']; + monthText = monthNames[displayedDate.month - 1]; + yearText = displayedDate.year.toString(); + } + + return Padding( + padding: EdgeInsets.only(bottom: 8.h), + child: SizedBox( + height: 40.h, + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Row( + children: [ + // Month text - clickable + GestureDetector( + onTap: () { + setState(() { + _viewMode = _viewMode == PickerViewMode.month ? PickerViewMode.date : PickerViewMode.month; + }); + }, + child: Text( + monthText, + style: TextStyle( + fontSize: 18.f, + fontWeight: FontWeight.w600, + letterSpacing: -0.46, + color: AppColors.primaryRedColor, + fontFamily: "Poppins", + ), + textAlign: isArabic ? TextAlign.right : TextAlign.left, + ), + ), + SizedBox(width: 8.h), + // Year text - clickable + GestureDetector( + onTap: () { + setState(() { + _viewMode = _viewMode == PickerViewMode.year ? PickerViewMode.date : PickerViewMode.year; + }); + }, + child: Text( + yearText, + style: TextStyle( + fontSize: 18.f, + fontWeight: FontWeight.w600, + letterSpacing: -0.46, + color: AppColors.primaryRedColor, + fontFamily: "Poppins", + ), + textAlign: isArabic ? TextAlign.right : TextAlign.left, + ), + ), + ], + ), + Row( + children: [ + IconButton( + icon: Icon(Icons.chevron_left, color: AppColors.primaryRedColor), + onPressed: () { + if (_viewMode == PickerViewMode.date) { + _calendarController.backward!(); + // Update tracked Hijri display when navigating months + if (calendarModel.isHijri) { + setState(() { + _currentHijriDisplay = null; // Will recalculate on next build + }); + } + } else if (_viewMode == PickerViewMode.year) { + // Navigate years backward by 12 + final currentDate = _calendarController.displayDate ?? DateTime.now(); + if (calendarModel.isHijri) { + // For Hijri, convert back and forth + final hijriDate = _currentHijriDisplay ?? calendarModel.gregorianToHijri(currentDate); + try { + final newHijriDate = HijriGregDate(day: 1, month: hijriDate.month, year: hijriDate.year - 12); + final newGregorianDate = calendarModel.hijriToGregorian(newHijriDate); + _calendarController.displayDate = DateTime(newGregorianDate.year, newGregorianDate.month, 1); + _currentHijriDisplay = newHijriDate; + } catch (e) { + // Fallback + _calendarController.displayDate = DateTime(currentDate.year - 10, currentDate.month, 1); + } + } else { + _calendarController.displayDate = DateTime(currentDate.year - 12, currentDate.month, 1); + } + setState(() {}); + } + }, + padding: EdgeInsets.zero, + constraints: BoxConstraints(), + ), + SizedBox(width: 8.h), + IconButton( + icon: Icon(Icons.chevron_right, color: AppColors.primaryRedColor), + onPressed: () { + if (_viewMode == PickerViewMode.date) { + _calendarController.forward!(); + // Update tracked Hijri display when navigating months + if (calendarModel.isHijri) { + setState(() { + _currentHijriDisplay = null; // Will recalculate on next build + }); + } + } else if (_viewMode == PickerViewMode.year) { + // Navigate years forward by 12 + final currentDate = _calendarController.displayDate ?? DateTime.now(); + if (calendarModel.isHijri) { + // For Hijri, convert back and forth + final hijriDate = _currentHijriDisplay ?? calendarModel.gregorianToHijri(currentDate); + try { + final newHijriDate = HijriGregDate(day: 1, month: hijriDate.month, year: hijriDate.year + 12); + final newGregorianDate = calendarModel.hijriToGregorian(newHijriDate); + _calendarController.displayDate = DateTime(newGregorianDate.year, newGregorianDate.month, 1); + _currentHijriDisplay = newHijriDate; + } catch (e) { + // Fallback + _calendarController.displayDate = DateTime(currentDate.year + 10, currentDate.month, 1); + } + } else { + _calendarController.displayDate = DateTime(currentDate.year + 12, currentDate.month, 1); + } + setState(() {}); + } + }, + padding: EdgeInsets.zero, + constraints: BoxConstraints(), + ), + ], + ), + ], + ), + ), + ); + } + + // Build month picker grid + Widget _buildMonthPicker(bool isArabic, DateRangCalenderModel calendarModel) { + final displayedDate = _calendarController.displayDate ?? DateTime.now(); + final currentDate = DateTime.now(); + + int currentMonth; + int currentYear; + int displayedYear; + + if (calendarModel.isHijri) { + // For Hijri calendar + final hijriCurrent = calendarModel.gregorianToHijri(currentDate); + final hijriDisplayed = calendarModel.gregorianToHijri(displayedDate); + currentMonth = hijriCurrent.month; + currentYear = hijriCurrent.year; + displayedYear = hijriDisplayed.year; + } else { + // For Gregorian calendar + currentMonth = currentDate.month; + currentYear = currentDate.year; + displayedYear = displayedDate.year; + } + + List monthNames; + if (calendarModel.isHijri) { + monthNames = isArabic ? DateRangCalenderModel.hijriMonthNamesArabic : DateRangCalenderModel.hijriMonthNamesEnglish; + } else { + monthNames = isArabic ? DateRangCalenderModel.gregorianMonthNamesArabic : DateRangCalenderModel.gregorianMonthNamesEnglish; + } + + return GridView.builder( + padding: EdgeInsets.all(8.h), + gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 3, childAspectRatio: 2.5, crossAxisSpacing: 8.h, mainAxisSpacing: 8.h), + itemCount: 12, + itemBuilder: (context, index) { + final monthIndex = index + 1; + final isCurrentMonth = currentMonth == monthIndex && currentYear == displayedYear; + + return GestureDetector( + onTap: () { + // Update the displayed month based on calendar type + if (calendarModel.isHijri) { + // Convert Hijri month to Gregorian date + try { + final hijriDate = HijriGregDate(day: 1, month: monthIndex, year: displayedYear); + final gregorianDate = calendarModel.hijriToGregorian(hijriDate); + _calendarController.displayDate = DateTime(gregorianDate.year, gregorianDate.month, 1); + // Track the Hijri month/year for accurate header display + _currentHijriDisplay = hijriDate; + // Clear cache since we changed the month + _hijriCache.clear(); + } catch (e) { + // Fallback if conversion fails + _calendarController.displayDate = DateTime(displayedDate.year, monthIndex, 1); + } + } else { + // Gregorian month - direct update + _calendarController.displayDate = DateTime(displayedYear, monthIndex, 1); + } + + // Switch back to date view + setState(() { + _viewMode = PickerViewMode.date; + }); + }, + child: Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(8.h), + border: isCurrentMonth ? Border.all(color: AppColors.primaryRedColor, width: 2) : null, + color: Colors.transparent, + ), + child: Center( + child: Text( + monthNames[index], + style: TextStyle( + fontFamily: "Poppins", + fontSize: 14.f, + color: AppColors.textColor, + fontWeight: isCurrentMonth ? FontWeight.w600 : FontWeight.normal, + ), + textAlign: TextAlign.center, + ), + ), + ), + ); + }, + ); + } + + // Build year picker grid + Widget _buildYearPicker(bool isArabic, DateRangCalenderModel calendarModel) { + final displayedDate = _calendarController.displayDate ?? DateTime.now(); + final currentYear = DateTime.now().year; + + int displayedYear; + int currentDisplayYear; + int startYear; + + if (calendarModel.isHijri) { + // For Hijri calendar + final hijriDisplayed = calendarModel.gregorianToHijri(displayedDate); + final hijriCurrent = calendarModel.gregorianToHijri(DateTime.now()); + displayedYear = hijriDisplayed.year; + currentDisplayYear = hijriCurrent.year; + startYear = (displayedYear ~/ 12) * 12; + } else { + // For Gregorian calendar + displayedYear = displayedDate.year; + currentDisplayYear = currentYear; + startYear = (displayedYear ~/ 12) * 12; + } + + return GridView.builder( + padding: EdgeInsets.all(8.h), + gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 3, + childAspectRatio: 2.5, + crossAxisSpacing: 8.h, + mainAxisSpacing: 8.h, + ), + itemCount: 12, + itemBuilder: (context, index) { + final year = startYear + index; + final isCurrentYear = currentDisplayYear == year; + + return GestureDetector( + onTap: () { + // Update the displayed year based on calendar type + if (calendarModel.isHijri) { + // Convert Hijri year to Gregorian date + try { + final currentHijriMonth = _currentHijriDisplay?.month ?? calendarModel.gregorianToHijri(displayedDate).month; + final hijriDate = HijriGregDate(day: 1, month: currentHijriMonth, year: year); + final gregorianDate = calendarModel.hijriToGregorian(hijriDate); + _calendarController.displayDate = DateTime(gregorianDate.year, gregorianDate.month, 1); + // Track the Hijri month/year for accurate header display + _currentHijriDisplay = hijriDate; + } catch (e) { + // Fallback if conversion fails + _calendarController.displayDate = DateTime(displayedDate.year, displayedDate.month, 1); + } + } else { + // Gregorian year - direct update + _calendarController.displayDate = DateTime(year, displayedDate.month, 1); + } + + // Switch back to date view + setState(() { + _viewMode = PickerViewMode.date; + }); + }, + child: Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(8.h), + border: isCurrentYear ? Border.all(color: AppColors.primaryRedColor, width: 2) : null, + color: Colors.transparent, + ), + child: Center( + child: Text( + year.toString(), + style: TextStyle( + fontFamily: "Poppins", + fontSize: 14.f, + color: AppColors.textColor, + fontWeight: isCurrentYear ? FontWeight.w600 : FontWeight.normal, + ), + textAlign: TextAlign.center, + ), + ), + ), + ); + }, + ); + } + fromDateComponent() { return Consumer( builder: (_, model, __) { - return displayDate(LocaleKeys.startDate.tr(context: context), - model.getDateString(model.fromDate), model.fromDate == null); + return displayDate(LocaleKeys.startDate.tr(context: context), model.getDateString(model.fromDate), model.fromDate == null); }, ); } @@ -233,21 +868,16 @@ class _DateRangeSelectorState extends State { toDateComponent() { return Consumer( builder: (_, model, __) { - return displayDate(LocaleKeys.endDate.tr(context: context), - model.getDateString(model.toDate), model.toDate == null); + return displayDate(LocaleKeys.endDate.tr(context: context), model.getDateString(model.toDate), model.toDate == null); }, ); } displayDate(String label, String? date, bool isNotSelected) => Expanded( - child: Row( + child: Row( spacing: 12.h, children: [ - Utils.buildSvgWithAssets( - icon: AppAssets.rangeCalendar, - iconColor: isNotSelected ? AppColors.borderOnlyColor: AppColors.blackColor , - height: 24, - width: 24), + Utils.buildSvgWithAssets(icon: AppAssets.rangeCalendar, iconColor: isNotSelected ? AppColors.borderOnlyColor : AppColors.blackColor, height: 24, width: 24), Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ @@ -271,7 +901,7 @@ class _DateRangeSelectorState extends State { ) ], ), - ); + ); selectionChip(DateRangeSelectorRangeViewModel model) { return Row( @@ -279,59 +909,46 @@ class _DateRangeSelectorState extends State { children: [ AppCustomChipWidget( labelText: LocaleKeys.thisWeek.tr(context: context), - backgroundColor: model.currentlySelectedRange == Range.WEEKLY - ? AppColors.primaryRedColor.withOpacity(0.1) - : AppColors.whiteColor, + backgroundColor: model.currentlySelectedRange == Range.WEEKLY ? AppColors.primaryRedColor.withOpacity(0.1) : AppColors.whiteColor, shape: RoundedRectangleBorder( side: BorderSide( - color: model.currentlySelectedRange == Range.WEEKLY - ? AppColors.primaryRedBorderColor - : AppColors.chipBorderColorOpacity20, + color: model.currentlySelectedRange == Range.WEEKLY ? AppColors.primaryRedBorderColor : AppColors.chipBorderColorOpacity20, width: 1, ), borderRadius: BorderRadius.circular(10)), - ).onPress((){ + ).onPress(() { _calendarController.selectedRange = null; model.currentlySelectedRange = Range.WEEKLY; model.calculateDatesFromRange(); }), AppCustomChipWidget( labelText: LocaleKeys.lastMonth.tr(context: context), - backgroundColor: model.currentlySelectedRange == Range.LAST_MONTH - ? AppColors.primaryRedColor.withOpacity(0.1) - : AppColors.whiteColor, + backgroundColor: model.currentlySelectedRange == Range.LAST_MONTH ? AppColors.primaryRedColor.withOpacity(0.1) : AppColors.whiteColor, shape: RoundedRectangleBorder( side: BorderSide( - color: model.currentlySelectedRange == Range.LAST_MONTH - ? AppColors.primaryRedBorderColor - : AppColors.chipBorderColorOpacity20, + color: model.currentlySelectedRange == Range.LAST_MONTH ? AppColors.primaryRedBorderColor : AppColors.chipBorderColorOpacity20, width: 1, ), borderRadius: BorderRadius.circular(10)), - ).onPress((){ + ).onPress(() { _calendarController.selectedRange = null; model.currentlySelectedRange = Range.LAST_MONTH; model.calculateDatesFromRange(); }), AppCustomChipWidget( labelText: LocaleKeys.lastSixMonths.tr(context: context), - backgroundColor: model.currentlySelectedRange == Range.LAST_6MONTH - ? AppColors.primaryRedColor.withOpacity(0.1) - : AppColors.whiteColor, + backgroundColor: model.currentlySelectedRange == Range.LAST_6MONTH ? AppColors.primaryRedColor.withOpacity(0.1) : AppColors.whiteColor, shape: RoundedRectangleBorder( side: BorderSide( - color: model.currentlySelectedRange == Range.LAST_6MONTH - ? AppColors.primaryRedBorderColor - : AppColors.chipBorderColorOpacity20, + color: model.currentlySelectedRange == Range.LAST_6MONTH ? AppColors.primaryRedBorderColor : AppColors.chipBorderColorOpacity20, width: 1, ), borderRadius: BorderRadius.circular(10)), isEnglishOnly: true, - ).onPress((){ + ).onPress(() { _calendarController.selectedRange = null; model.currentlySelectedRange = Range.LAST_6MONTH; model.calculateDatesFromRange(); - }), AppCustomChipWidget( richText: Row( @@ -341,23 +958,18 @@ class _DateRangeSelectorState extends State { ], ), labelText: "${LocaleKeys.year.tr(context: context)} ${model.getCurrentYear}", - backgroundColor: model.currentlySelectedRange == Range.THIS_YEAR - ? AppColors.primaryRedColor.withOpacity(0.1) - : AppColors.whiteColor, + backgroundColor: model.currentlySelectedRange == Range.THIS_YEAR ? AppColors.primaryRedColor.withOpacity(0.1) : AppColors.whiteColor, shape: RoundedRectangleBorder( side: BorderSide( - color: model.currentlySelectedRange == Range.THIS_YEAR - ? AppColors.primaryRedBorderColor - : AppColors.chipBorderColorOpacity20, + color: model.currentlySelectedRange == Range.THIS_YEAR ? AppColors.primaryRedBorderColor : AppColors.chipBorderColorOpacity20, width: 1, ), borderRadius: BorderRadius.circular(10)), isEnglishOnly: true, - ).onPress((){ + ).onPress(() { _calendarController.selectedRange = null; model.currentlySelectedRange = Range.THIS_YEAR; model.calculateDatesFromRange(); - }), ], ); diff --git a/lib/widgets/date_range_selector/models/calendar_design_type.dart b/lib/widgets/date_range_selector/models/calendar_design_type.dart new file mode 100644 index 00000000..5cbc8129 --- /dev/null +++ b/lib/widgets/date_range_selector/models/calendar_design_type.dart @@ -0,0 +1,5 @@ +enum CalendarDesignType { + defaultUI, + designV2, +} + diff --git a/lib/widgets/date_range_selector/viewmodel/date_range_calendar_model.dart b/lib/widgets/date_range_selector/viewmodel/date_range_calendar_model.dart new file mode 100644 index 00000000..54c23a72 --- /dev/null +++ b/lib/widgets/date_range_selector/viewmodel/date_range_calendar_model.dart @@ -0,0 +1,555 @@ +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/app_state.dart'; +import 'package:hmg_patient_app_new/services/dialog_service.dart'; +import 'package:hmg_patient_app_new/services/error_handler_service.dart'; + +// ==================== Hijri Date Classes ==================== + +/// Represents a Hijri date with day, month, and year components. +class HijriGregDate { + final int day; + final int month; + final int year; + + HijriGregDate({required this.day, required this.month, required this.year}) + : assert(day >= 1 && day <= 30, 'Day must be between 1 and 30'), + assert(month >= 1 && month <= 12, 'Month must be between 1 and 12'), + assert(year > 0, 'Year must be positive'); + + @override + String toString() => '$day/$month/$year H'; + + @override + bool operator ==(Object other) { + if (identical(this, other)) return true; + return other is HijriGregDate && other.day == day && other.month == month && other.year == year; + } + + @override + int get hashCode => day.hashCode ^ month.hashCode ^ year.hashCode; +} + +/// Utility class for converting between Hijri and Gregorian calendars. +class HijriGregConverter { + static const int _hijriEpoch = 1948439; + + static HijriGregDate gregorianToHijri(DateTime gregorianDate) { + int julianDay = _gregorianToJulian(gregorianDate); + return _julianToHijri(julianDay); + } + + static DateTime hijriToGregorian(HijriGregDate hijriDate) { + int julianDay = _hijriToJulian(hijriDate); + return _julianToGregorian(julianDay); + } + + static int _gregorianToJulian(DateTime date) { + int year = date.year; + int month = date.month; + int day = date.day; + + if (month <= 2) { + year--; + month += 12; + } + + int a = year ~/ 100; + int b = 2 - a + (a ~/ 4); + + return (365.25 * (year + 4716)).floor() + (30.6001 * (month + 1)).floor() + day + b - 1524; + } + + static DateTime _julianToGregorian(int julianDay) { + int a = julianDay + 32044; + int b = (4 * a + 3) ~/ 146097; + int c = a - (146097 * b) ~/ 4; + int d = (4 * c + 3) ~/ 1461; + int e = c - (1461 * d) ~/ 4; + int m = (5 * e + 2) ~/ 153; + + int day = e - (153 * m + 2) ~/ 5 + 1; + int month = m + 3 - 12 * (m ~/ 10); + int year = 100 * b + d - 4800 + m ~/ 10; + + return DateTime(year, month, day); + } + + static HijriGregDate _julianToHijri(int julianDay) { + int daysSinceEpoch = julianDay - _hijriEpoch; + int hijriYear = (daysSinceEpoch * 33 ~/ 10631) + 1; + + int yearStartJulian = _hijriYearStartJulian(hijriYear); + while (yearStartJulian > julianDay) { + hijriYear--; + yearStartJulian = _hijriYearStartJulian(hijriYear); + } + while (yearStartJulian + _hijriYearLength(hijriYear) <= julianDay) { + hijriYear++; + yearStartJulian = _hijriYearStartJulian(hijriYear); + } + + int dayOfYear = julianDay - yearStartJulian + 1; + int month = 1; + int dayInMonth = dayOfYear; + + while (month <= 12) { + int monthLength = _hijriMonthLength(hijriYear, month); + if (dayInMonth <= monthLength) { + break; + } + dayInMonth -= monthLength; + month++; + } + + if (dayInMonth < 1) dayInMonth = 1; + if (dayInMonth > 30) dayInMonth = 30; + + return HijriGregDate(day: dayInMonth, month: month, year: hijriYear); + } + + static int _hijriToJulian(HijriGregDate hijriDate) { + int yearStart = _hijriYearStartJulian(hijriDate.year); + int dayOfYear = 0; + + for (int i = 1; i < hijriDate.month; i++) { + dayOfYear += _hijriMonthLength(hijriDate.year, i); + } + + dayOfYear += hijriDate.day - 1; + return yearStart + dayOfYear; + } + + static int _hijriYearStartJulian(int hijriYear) { + if (hijriYear <= 1) return _hijriEpoch; + + int totalDays = 0; + for (int year = 1; year < hijriYear; year++) { + totalDays += _hijriYearLength(year); + } + + return _hijriEpoch + totalDays; + } + + static int _hijriYearLength(int year) { + return _isHijriLeapYear(year) ? 355 : 354; + } + + static int _hijriMonthLength(int year, int month) { + if (month <= 0 || month > 12) return 30; + + const List monthLengths = [30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29]; + int length = monthLengths[month - 1]; + + if (month == 12 && _isHijriLeapYear(year)) { + length = 30; + } + + return length; + } + + static bool _isHijriLeapYear(int year) { + if (year <= 0) return false; + const leapYears = [2, 5, 7, 10, 13, 16, 18, 21, 24, 26, 29]; + int yearInCycle = ((year - 1) % 30) + 1; + return leapYears.contains(yearInCycle); + } + + static int getHijriMonthLength(int year, int month) { + return _hijriMonthLength(year, month); + } + + static bool isHijriLeapYear(int year) { + return _isHijriLeapYear(year); + } +} + +// ==================== Main Model ==================== + +enum CalendarType { + gregorian, + hijri, +} + +class DateRangCalenderModel extends ChangeNotifier { + final AppState appState; + final ErrorHandlerService navigationService; + final DialogService dialogService; + + // Static variable to persist calendar type preference across instances + static CalendarType _persistedCalendarType = CalendarType.gregorian; + static int _persistedTabIndex = 0; + + DateRangCalenderModel({required this.appState, required this.navigationService, required this.dialogService}) { + // Initialize from persisted state + _initializeFromPersistedState(); + } + + int _selectedTabIndex = 0; + CalendarType _calendarType = CalendarType.gregorian; + + void _initializeFromPersistedState() { + // Load from static persisted values + _selectedTabIndex = _persistedTabIndex; + _calendarType = _persistedCalendarType; + } + + // Umm al-Qura calendar adjustment (in days) + // This offset corrects the astronomical calculation to match the official Saudi calendar + static const int _ummAlQuraOffset = -1; + + // Hijri month names in English (short form) + static const List _hijriMonthNamesShort = [ + 'Muh', + 'Saf', + 'Rab I', + 'Rab II', + 'Jum I', + 'Jum II', + 'Raj', + 'Sha', + 'Ram', + 'Shaw', + 'Dhu Q', + 'Dhu H', + ]; + + // Hijri month names in English (full form) - public for month picker + static const List hijriMonthNamesEnglish = [ + 'Muharram', + 'Safar', + 'Rabi\' I', + 'Rabi\' II', + 'Jumada I', + 'Jumada II', + 'Rajab', + 'Sha\'ban', + 'Ramadan', + 'Shawwal', + 'Dhu al-Qi\'dah', + 'Dhu al-Hijjah', + ]; + + // Hijri month names in Arabic (short form) + static const List _hijriMonthNamesShortArabic = [ + 'محرم', + 'صفر', + 'ربيع الأول', + 'ربيع الثاني', + 'جمادى الأولى', + 'جمادى الثانية', + 'رجب', + 'شعبان', + 'رمضان', + 'شوال', + 'ذو القعدة', + 'ذو الحجة', + ]; + + // Hijri month names in Arabic (full form) - public for month picker + static const List hijriMonthNamesArabic = [ + 'محرم', + 'صفر', + 'ربيع الأول', + 'ربيع الثاني', + 'جمادى الأولى', + 'جمادى الثانية', + 'رجب', + 'شعبان', + 'رمضان', + 'شوال', + 'ذو القعدة', + 'ذو الحجة', + ]; + + // Gregorian month names (short form) + static const List _gregorianMonthNames = [ + 'Jan', + 'Feb', + 'Mar', + 'Apr', + 'May', + 'Jun', + 'Jul', + 'Aug', + 'Sep', + 'Oct', + 'Nov', + 'Dec', + ]; + + // Gregorian month names in English (full form) - public for month picker + static const List gregorianMonthNamesEnglish = [ + 'January', + 'February', + 'March', + 'April', + 'May', + 'June', + 'July', + 'August', + 'September', + 'October', + 'November', + 'December', + ]; + + // Gregorian month names in Arabic + static const List _gregorianMonthNamesArabic = [ + 'يناير', + 'فبراير', + 'مارس', + 'أبريل', + 'مايو', + 'يونيو', + 'يوليو', + 'أغسطس', + 'سبتمبر', + 'أكتوبر', + 'نوفمبر', + 'ديسمبر', + ]; + + // Gregorian month names in Arabic (full form) - public for month picker + static const List gregorianMonthNamesArabic = [ + 'يناير', + 'فبراير', + 'مارس', + 'أبريل', + 'مايو', + 'يونيو', + 'يوليو', + 'أغسطس', + 'سبتمبر', + 'أكتوبر', + 'نوفمبر', + 'ديسمبر', + ]; + + // Weekday names in English (short form) + static const List _weekdayNamesEnglish = [ + 'Sun', + 'Mon', + 'Tue', + 'Wed', + 'Thu', + 'Fri', + 'Sat', + ]; + + // Weekday names in Arabic (short form) + static const List _weekdayNamesArabic = [ + 'أحد', + 'اثنين', + 'ثلاثاء', + 'أربعاء', + 'خميس', + 'جمعة', + 'سبت', + ]; + + int get getSelectedTabIndex => _selectedTabIndex; + + CalendarType get calendarType => _calendarType; + + set selectedTabIndex(int value) { + _selectedTabIndex = value; + _calendarType = value == 0 ? CalendarType.gregorian : CalendarType.hijri; + notifyListeners(); + } + + void setTabIndex(int index) { + _selectedTabIndex = index; + _calendarType = index == 0 ? CalendarType.gregorian : CalendarType.hijri; + // Persist the selection for next time the widget opens + _persistCalendarTypePreference(); + notifyListeners(); + } + + void _persistCalendarTypePreference() { + // Store the preference in static variables so it persists when widget reopens + _persistedTabIndex = _selectedTabIndex; + _persistedCalendarType = _calendarType; + } + + bool get isGregorian => _calendarType == CalendarType.gregorian; + + bool get isHijri => _calendarType == CalendarType.hijri; + + /// Reset to Gregorian and clear persisted preference + /// Call this only when explicitly needed (e.g., logout) + void reset({bool force = false}) { + if (force) { + // Force reset - clear both instance and persisted state + _selectedTabIndex = 0; + _calendarType = CalendarType.gregorian; + _persistedTabIndex = 0; + _persistedCalendarType = CalendarType.gregorian; + notifyListeners(); + } + // If not forcing, keep the user's preference (persisted state remains) + } + + /// Clear persisted calendar type preference (reset to Gregorian on next open) + static void clearPersistedPreference() { + _persistedTabIndex = 0; + _persistedCalendarType = CalendarType.gregorian; + } + + // ==================== Conversion Methods ==================== + + /// Converts Gregorian DateTime to Hijri date with Umm al-Qura correction + HijriGregDate gregorianToHijri(DateTime gregorianDate) { + // Apply Umm al-Qura offset for accurate Saudi calendar + final adjustedDate = gregorianDate.add(Duration(days: _ummAlQuraOffset)); + return HijriGregConverter.gregorianToHijri(adjustedDate); + } + + /// Converts Hijri date to Gregorian DateTime with Umm al-Qura correction + DateTime hijriToGregorian(HijriGregDate hijriDate) { + final gregorianDate = HijriGregConverter.hijriToGregorian(hijriDate); + // Reverse the Umm al-Qura offset + return gregorianDate.subtract(Duration(days: _ummAlQuraOffset)); + } + + // ==================== Date Formatting Methods ==================== + + /// Formats a date based on the current calendar type + /// Returns formatted string like "14 Apr,26" for Gregorian or "14 Muh,1447" for Hijri + String formatDate(DateTime? date) { + if (date == null) return "-"; + + if (isGregorian) { + return formatGregorianDate(date); + } else { + return formatHijriDate(date); + } + } + + /// Formats a Gregorian date + /// Format: "dd MMM,yy" (e.g., "14 Apr,26") + String formatGregorianDate(DateTime date) { + String year = date.year.toString().substring(2); + String month = _gregorianMonthNames[date.month - 1]; + String day = date.day.toString(); + return '$day $month,$year'; + } + + /// Formats a date as Hijri + /// Format: "dd MMM,yyyy" (e.g., "14 Muh,1447") + String formatHijriDate(DateTime gregorianDate) { + HijriGregDate hijriDate = gregorianToHijri(gregorianDate); + String month = _hijriMonthNamesShort[hijriDate.month - 1]; + return '${hijriDate.day} $month,${hijriDate.year}'; + } + + /// Gets month name based on current calendar type + String getMonthName(int month) { + if (isGregorian) { + return _gregorianMonthNames[month - 1]; + } else { + return _hijriMonthNamesShort[month - 1]; + } + } + + /// Gets month name in Arabic based on current calendar type + String getMonthNameArabic(int month) { + if (isGregorian) { + return _gregorianMonthNamesArabic[month - 1]; + } else { + return _hijriMonthNamesShortArabic[month - 1]; + } + } + + /// Gets month name with language support + String getMonthNameLocalized(int month, bool isArabic) { + return isArabic ? getMonthNameArabic(month) : getMonthName(month); + } + + /// Gets weekday name in English + String getWeekdayName(int weekday) { + // weekday: 1 = Monday, 7 = Sunday in DateTime + // Convert to Sunday = 0 index + int index = weekday % 7; + return _weekdayNamesEnglish[index]; + } + + /// Gets weekday name in Arabic + String getWeekdayNameArabic(int weekday) { + // weekday: 1 = Monday, 7 = Sunday in DateTime + // Convert to Sunday = 0 index + int index = weekday % 7; + return _weekdayNamesArabic[index]; + } + + /// Gets weekday name with language support + String getWeekdayNameLocalized(int weekday, bool isArabic) { + return isArabic ? getWeekdayNameArabic(weekday) : getWeekdayName(weekday); + } + + /// Converts a date string to display format based on calendar type + String formatDateString(String? dateString) { + if (dateString == null || dateString.isEmpty) return "-"; + + try { + DateTime date = DateTime.parse(dateString); + return formatDate(date); + } catch (e) { + return "-"; + } + } + + // ==================== Date Range Methods ==================== + + /// Formats a date range based on current calendar type + /// Returns formatted string like "14 Apr,26 - 20 Apr,26" for Gregorian + String formatDateRange(DateTime? startDate, DateTime? endDate) { + if (startDate == null || endDate == null) return "-"; + + String start = formatDate(startDate); + String end = formatDate(endDate); + return '$start - $end'; + } + + /// Gets the current date in the selected calendar format + String getCurrentDateFormatted() { + return formatDate(DateTime.now()); + } + + // ==================== Calendar Type Specific Helpers ==================== + + /// Gets the year based on calendar type + int getCurrentYear() { + if (isGregorian) { + return DateTime.now().year; + } else { + return gregorianToHijri(DateTime.now()).year; + } + } + + /// Gets formatted year string based on calendar type + String getFormattedYear(DateTime date) { + if (isGregorian) { + return date.year.toString(); + } else { + return gregorianToHijri(date).year.toString(); + } + } + + /// Checks if a year is leap year based on calendar type + bool isLeapYear(int year) { + if (isGregorian) { + return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0); + } else { + return HijriGregConverter.isHijriLeapYear(year); + } + } + + /// Gets the number of days in a month based on calendar type + int getDaysInMonth(int year, int month) { + if (isGregorian) { + return DateTime(year, month + 1, 0).day; + } else { + return HijriGregConverter.getHijriMonthLength(year, month); + } + } +} diff --git a/lib/widgets/date_range_selector/viewmodel/date_range_view_model.dart b/lib/widgets/date_range_selector/viewmodel/date_range_view_model.dart index 3f67b6a6..e92d0817 100644 --- a/lib/widgets/date_range_selector/viewmodel/date_range_view_model.dart +++ b/lib/widgets/date_range_selector/viewmodel/date_range_view_model.dart @@ -85,4 +85,12 @@ class DateRangeSelectorRangeViewModel extends ChangeNotifier { notifyListeners(); } + /// Update both fromDate and toDate (for single date selection in V2) + void updateSelectedDate(DateTime? date) { + _fromDate = date; + _toDate = date; + _currentlySelectedRange = null; + notifyListeners(); + } + } diff --git a/lib/widgets/input_widget.dart b/lib/widgets/input_widget.dart index d8a74d17..51948f01 100644 --- a/lib/widgets/input_widget.dart +++ b/lib/widgets/input_widget.dart @@ -1,6 +1,6 @@ +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; -import 'package:hijri_gregorian_calendar/hijri_gregorian_calendar.dart'; import 'package:hmg_patient_app_new/core/app_assets.dart'; import 'package:hmg_patient_app_new/core/app_export.dart'; import 'package:hmg_patient_app_new/core/app_state.dart'; @@ -9,9 +9,14 @@ import 'package:hmg_patient_app_new/core/enums.dart'; import 'package:hmg_patient_app_new/core/utils/utils.dart'; import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/generated/locale_kesy.g.dart'; import 'package:hmg_patient_app_new/theme/colors.dart'; +import 'package:hmg_patient_app_new/widgets/common_bottom_sheet.dart'; +import 'package:hmg_patient_app_new/widgets/date_range_selector/date_range_calender.dart'; +import 'package:hmg_patient_app_new/widgets/date_range_selector/models/calendar_design_type.dart'; import 'package:hmg_patient_app_new/widgets/dropdown/country_dropdown_widget.dart'; import 'package:hmg_patient_app_new/widgets/time_picker_widget.dart'; +import 'dart:ui' as ui; class TextInputWidget extends StatelessWidget { final String labelText; @@ -222,26 +227,26 @@ class TextInputWidget extends StatelessWidget { decoration: RoundedRectangleBorder().toSmoothCornerDecoration(borderRadius: 12.r, color: AppColors.whiteColor), child: GestureDetector( onTap: () async { - bool isGregorian = true; - final picked = await showHijriGregBottomSheet(context, - isShowTimeSlots: true, - switcherIcon: Utils.buildSvgWithAssets(icon: AppAssets.language, width: 24.h, height: 24.h), - language: appState.getLanguageCode()!, - initialDate: DateTime.now(), + showCommonBottomSheetWithoutHeight( + title: LocaleKeys.selectDate.tr(context: context), + context, + child: DateRangeSelector( + onRangeSelected: (DateTime? start, DateTime? end) { + var picked = start.toString().split(" ").first; + if (picked != null && onChange != null) { + onChange!(picked.toString()); + } + }, + designType: CalendarDesignType.designV2, showCalendarToggle: isHideSwitcher == true ? false : true, - // fontFamily: appState.getLanguageCode() == "ar" ? "GESSTwo" : "Poppins", - fontFamily: "Poppins", - okWidget: Padding(padding: EdgeInsets.only(right: 8.h), child: Utils.buildSvgWithAssets(icon: AppAssets.confirm, width: 24.h, height: 24.h)), - cancelWidget: Padding(padding: EdgeInsets.only(right: 8.h), child: Utils.buildSvgWithAssets(icon: AppAssets.cancel, iconColor: Colors.white, width: 24.h, height: 24.h)), - onCalendarTypeChanged: (bool value) { - isGregorian = value; - }); - if (picked != null && onChange != null) { - if (onCalendarTypeChanged != null) { - onCalendarTypeChanged!.call(isGregorian); - } - onChange!(picked.toString()); - } + onCalendarTypeChanged: onCalendarTypeChanged, + ), + isFullScreen: false, + isCloseButtonVisible: true, + callBackFunc: () { + // Don't reset calendar type - persist user's preference + }, + ); }, child: Utils.buildSvgWithAssets(icon: isArrowTrailing ? AppAssets.arrow_down : AppAssets.calendar), ), @@ -299,13 +304,11 @@ class TextInputWidget extends StatelessWidget { return Builder( builder: (context) { return Directionality( - textDirection: isArabic ? TextDirection.rtl : TextDirection.ltr, + textDirection: isArabic ? ui.TextDirection.rtl : ui.TextDirection.ltr, child: Localizations.override( - context: context, locale: const Locale('en', 'US'), // Force English locale for TextField child: TextField( - hintLocales: const [Locale('en', 'US')], enabled: isEnable, scrollPadding: EdgeInsets.zero, @@ -314,7 +317,7 @@ class TextInputWidget extends StatelessWidget { readOnly: isReadOnly, textAlignVertical: TextAlignVertical.top, textAlign: isArabic ? TextAlign.right : TextAlign.left, - textDirection: TextDirection.ltr, + textDirection: ui.TextDirection.ltr, onChanged: onChange, focusNode: focusNode ?? _focusNode, autofocus: autoFocus, @@ -346,7 +349,6 @@ class TextInputWidget extends StatelessWidget { isDense: true, hintText: hintText, hintStyle: TextStyle( - fontFamily: isArabic ? 'CairoArabic' : 'Poppins', fontSize: 14.f, height: 21 / 16, @@ -356,7 +358,7 @@ class TextInputWidget extends StatelessWidget { ), prefixIconConstraints: BoxConstraints(minWidth: 30.h), prefixIcon: prefix == null ? null : "+${prefix!}".toText14(letterSpacing: -1, color: AppColors.textColor, isBold: true), - contentPadding: EdgeInsets.only(right:isArabic ? 10.w :0), + contentPadding: EdgeInsets.only(right: isArabic ? 10.w : 0), border: InputBorder.none, focusedBorder: InputBorder.none, enabledBorder: InputBorder.none, @@ -484,4 +486,3 @@ class _ThousandSeparatorInputFormatter extends TextInputFormatter { ); } } - diff --git a/pubspec.yaml b/pubspec.yaml index 7f14f57c..4d853184 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -71,7 +71,8 @@ dependencies: firebase_analytics: ^11.5.1 firebase_crashlytics: ^4.3.8 jiffy: ^6.4.3 - hijri_gregorian_calendar: ^0.1.1 +# hijri_gregorian_calendar: +# path: /Users/aamir/StudioProjects/hijri_gregorian_calendar sms_otp_auto_verify: ^2.2.0 web: any flutter_staggered_animations: ^1.1.1 From c2dcf95d52c953d5ec6f62d192faffe56e0bdee8 Mon Sep 17 00:00:00 2001 From: Sultan khan Date: Tue, 14 Apr 2026 20:07:17 +0300 Subject: [PATCH 32/45] update and fix --- lib/features/radiology/radiology_repo.dart | 24 ++- .../appointment_details_page.dart | 4 +- .../widgets/appointment_card.dart | 60 +++--- .../health_calculators_page.dart | 10 +- .../add_health_tracker_entry_page.dart | 17 +- .../health_trackers/health_trackers_page.dart | 2 +- .../hmg_services/services_page.dart | 97 ++------- .../hmg_services/widgets/weather_widget.dart | 194 ++++++++++++++++++ .../insurance_approval_details_page.dart | 14 +- .../widgets/insurance_approval_card.dart | 34 ++- .../weather/weather_details_page.dart | 185 +++++++++++++++++ lib/widgets/input_widget.dart | 6 +- lib/widgets/time_picker_widget.dart | 77 +++---- 13 files changed, 551 insertions(+), 173 deletions(-) create mode 100644 lib/presentation/hmg_services/widgets/weather_widget.dart create mode 100644 lib/presentation/weather/weather_details_page.dart diff --git a/lib/features/radiology/radiology_repo.dart b/lib/features/radiology/radiology_repo.dart index 30b078ef..7374b247 100644 --- a/lib/features/radiology/radiology_repo.dart +++ b/lib/features/radiology/radiology_repo.dart @@ -42,7 +42,7 @@ class RadiologyRepoImp implements RadiologyRepo { failure = failureType; }, onSuccess: (response, statusCode, {messageStatus, errorMessage}) { - final radOrders; + List radOrders = []; try { if (response['FinalRadiologyList'] != null && response['FinalRadiologyList'].length != 0) { final list = response['FinalRadiologyList']; @@ -52,10 +52,18 @@ class RadiologyRepoImp implements RadiologyRepo { .cast(); } else { final list = response['FinalRadiologyListAPI']; - radOrders = list - .map((item) => PatientRadiologyResponseModel.fromJson(item as Map)) - .toList() - .cast(); + if(list != null && list.length != 0) { + radOrders = list + .map((item) => PatientRadiologyResponseModel.fromJson(item as Map)) + .toList() + .cast(); + } + } + + // Check if radOrders is empty and set failure + if (radOrders.isEmpty) { + failure = ServerFailure(errorMessage ?? "No radiology orders found"); + return; } apiResponse = GenericApiModel>( @@ -203,6 +211,12 @@ class RadiologyRepoImp implements RadiologyRepo { } } + // Check if radOrders is empty and set failure + if (radOrders.isEmpty) { + failure = ServerFailure(errorMessage ?? "No radiology orders found for this appointment"); + return; + } + apiResponse = GenericApiModel>( messageStatus: messageStatus, statusCode: statusCode, diff --git a/lib/presentation/appointments/appointment_details_page.dart b/lib/presentation/appointments/appointment_details_page.dart index 66d2b151..dfdde83a 100644 --- a/lib/presentation/appointments/appointment_details_page.dart +++ b/lib/presentation/appointments/appointment_details_page.dart @@ -430,8 +430,8 @@ class _AppointmentDetailsPageState extends State { const Spacer(), BellAnimatedSwitch( key: _bellSwitchKey, - width: 48.w, - height: 30.h, + width: 56.w, + height: 38.h, initialValue: widget.patientAppointmentHistoryResponseModel.hasReminder ?? false, activeColor: AppColors.successColor.withOpacity(0.2), inactiveColor: AppColors.lightGrayBGColor, diff --git a/lib/presentation/appointments/widgets/appointment_card.dart b/lib/presentation/appointments/widgets/appointment_card.dart index fabb9043..505afcdf 100644 --- a/lib/presentation/appointments/widgets/appointment_card.dart +++ b/lib/presentation/appointments/widgets/appointment_card.dart @@ -717,35 +717,37 @@ class _AppointmentCardState extends State { // Countdown Timer - DD : HH : MM : SS format with labels - // Row( - // mainAxisAlignment: MainAxisAlignment.center, - // crossAxisAlignment: CrossAxisAlignment.start, - // children: [ - // // Days - // _buildTimeUnit( - // _timeRemaining != null ? _timeRemaining!.inDays.toString().padLeft(2, '0') : '00', - // LocaleKeys.days.tr(context: context), - // ), - // _buildTimeSeparator(), - // // Hours - // _buildTimeUnit( - // _timeRemaining != null ? _timeRemaining!.inHours.remainder(24).toString().padLeft(2, '0') : '00', - // LocaleKeys.hours.tr(context: context), - // ), - // _buildTimeSeparator(), - // // Minutes - // _buildTimeUnit( - // _timeRemaining != null ? _timeRemaining!.inMinutes.remainder(60).toString().padLeft(2, '0') : '00', - // LocaleKeys.minutes.tr(context: context), - // ), - // _buildTimeSeparator(), - // // Seconds - // _buildTimeUnit( - // _timeRemaining != null ? _timeRemaining!.inSeconds.remainder(60).toString().padLeft(2, '0') : '00', - // LocaleKeys.seconds.tr(context: context), - // ), - // ], - // ), + Directionality( + textDirection: ui.TextDirection.ltr, + child:Row( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + // Days + _buildTimeUnit( + _timeRemaining != null ? _timeRemaining!.inDays.toString().padLeft(2, '0') : '00', + LocaleKeys.days.tr(context: context), + ), + _buildTimeSeparator(), + // Hours + _buildTimeUnit( + _timeRemaining != null ? _timeRemaining!.inHours.remainder(24).toString().padLeft(2, '0') : '00', + LocaleKeys.hours.tr(context: context), + ), + _buildTimeSeparator(), + // Minutes + _buildTimeUnit( + _timeRemaining != null ? _timeRemaining!.inMinutes.remainder(60).toString().padLeft(2, '0') : '00', + LocaleKeys.minutes.tr(context: context), + ), + _buildTimeSeparator(), + // Seconds + _buildTimeUnit( + _timeRemaining != null ? _timeRemaining!.inSeconds.remainder(60).toString().padLeft(2, '0') : '00', + LocaleKeys.seconds.tr(context: context), + ), + ], + )), SizedBox(height: 24.h), // Green Acknowledge button with checkmark icon CustomButton( diff --git a/lib/presentation/health_calculators_and_converts/health_calculators_page.dart b/lib/presentation/health_calculators_and_converts/health_calculators_page.dart index 877a5d9b..a7fe0ef5 100644 --- a/lib/presentation/health_calculators_and_converts/health_calculators_page.dart +++ b/lib/presentation/health_calculators_and_converts/health_calculators_page.dart @@ -135,8 +135,8 @@ class _HealthCalculatorsPageState extends State { crossAxisAlignment: CrossAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.center, children: [ - LocaleKeys.bloodSugar.tr().toText16(isBold: true), - LocaleKeys.trackYourGlucoseLevels.tr().toText12( + LocaleKeys.bloodSugar.tr(context: context).toText16(isBold: true), + LocaleKeys.trackYourGlucoseLevels.tr(context: context).toText12( isBold: true, color: Color(0xFF8F9AA3), ) @@ -168,7 +168,7 @@ class _HealthCalculatorsPageState extends State { child: Column( crossAxisAlignment: CrossAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.center, - children: [LocaleKeys.bloodCholesterol.tr().toText16(isBold: true), LocaleKeys.monitorCholesterolLevels.tr().toText12(isBold: true, color: Color(0xFF8F9AA3))], + children: [LocaleKeys.bloodCholesterol.tr(context: context).toText16(isBold: true), LocaleKeys.monitorCholesterolLevels.tr(context: context).toText12(isBold: true, color: Color(0xFF8F9AA3))], ), ), SizedBox(width: 12.w), @@ -195,8 +195,8 @@ class _HealthCalculatorsPageState extends State { crossAxisAlignment: CrossAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.center, children: [ - LocaleKeys.triglyceridesFatBlood.tr().toText16(isBold: true), - LocaleKeys.understandTriglyceridesImpact.tr().toText12(isBold: true, color: Color(0xFF8F9AA3)) + LocaleKeys.triglyceridesFatBlood.tr(context: context).toText16(isBold: true), + LocaleKeys.understandTriglyceridesImpact.tr(context: context).toText12(isBold: true, color: Color(0xFF8F9AA3)) ], ), ), diff --git a/lib/presentation/health_trackers/add_health_tracker_entry_page.dart b/lib/presentation/health_trackers/add_health_tracker_entry_page.dart index 0305eebf..829c4a95 100644 --- a/lib/presentation/health_trackers/add_health_tracker_entry_page.dart +++ b/lib/presentation/health_trackers/add_health_tracker_entry_page.dart @@ -154,7 +154,8 @@ class _AddHealthTrackerEntryPageState extends State { } // Show success message and pop back - void _showSuccessAndPop() { + + void _showSuccessAndPop() async{ showCommonBottomSheetWithoutHeight( context, child: Utils.getSuccessWidget( @@ -164,7 +165,13 @@ class _AddHealthTrackerEntryPageState extends State { }, isCloseButtonVisible: false, isDismissible: true, - isFullScreen: false, isAutoDismiss: true); + isFullScreen: false, isAutoDismiss: false); + await Future.delayed(Duration(milliseconds: 2000)).then((value) { + if (mounted){ + Navigator.pop(context); + Navigator.pop(context); + } + }); } // Reusable method to build selection row widget @@ -366,7 +373,7 @@ class _AddHealthTrackerEntryPageState extends State { crossAxisAlignment: CrossAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.start, children: [ - "Unit".toText12(isBold: true, color: AppColors.inputLabelTextColor), + LocaleKeys.unit.tr(context: context).toText12(isBold: true, color: AppColors.inputLabelTextColor), unit.toText12(isBold: true, color: AppColors.textColor), ], ), @@ -473,7 +480,7 @@ class _AddHealthTrackerEntryPageState extends State { controller: dateController, isReadOnly: true, isArrowTrailing: true, - labelText: "Date", + labelText: LocaleKeys.date.tr(context: context), hintText: LocaleKeys.pickADate.tr(context: context), focusNode: FocusNode(), isEnable: true, @@ -503,7 +510,7 @@ class _AddHealthTrackerEntryPageState extends State { controller: timeController, isReadOnly: true, isArrowTrailing: true, - labelText: "Time", + labelText: LocaleKeys.time.tr(context: context), hintText: LocaleKeys.selectMeasureTime.tr(context: context), focusNode: FocusNode(), isEnable: true, diff --git a/lib/presentation/health_trackers/health_trackers_page.dart b/lib/presentation/health_trackers/health_trackers_page.dart index e974773c..e066b106 100644 --- a/lib/presentation/health_trackers/health_trackers_page.dart +++ b/lib/presentation/health_trackers/health_trackers_page.dart @@ -84,7 +84,7 @@ class _HealthTrackersPageState extends State { iconBgColor: AppColors.primaryRedColor, icon: AppAssets.bloodSugarOnlyIcon, title: LocaleKeys.bloodSugar.tr(context: context), - description: "Track your glucose levels, understand trends, and get personalized insights for better health.", + description: LocaleKeys.trackYourGlucoseLevels.tr(context: context), onTap: () { context.navigateWithName( AppRoutes.healthTrackerDetailPage, diff --git a/lib/presentation/hmg_services/services_page.dart b/lib/presentation/hmg_services/services_page.dart index 4f648c96..56923038 100644 --- a/lib/presentation/hmg_services/services_page.dart +++ b/lib/presentation/hmg_services/services_page.dart @@ -32,6 +32,7 @@ import 'package:hmg_patient_app_new/presentation/hmg_services/services_view.dart import 'package:hmg_patient_app_new/presentation/home/data/landing_page_data.dart'; import 'package:hmg_patient_app_new/presentation/home/service_info_page.dart'; import 'package:hmg_patient_app_new/presentation/home/widgets/large_service_card.dart'; +import 'package:hmg_patient_app_new/presentation/hmg_services/widgets/weather_widget.dart'; import 'package:hmg_patient_app_new/presentation/medical_file/medical_file_page.dart'; import 'package:hmg_patient_app_new/presentation/parking/paking_page.dart'; import 'package:hmg_patient_app_new/presentation/servicesPriceList/services_price_list_page.dart'; @@ -378,8 +379,8 @@ class _ServicesPageState extends State { void initState() { // TODO: implement initState super.initState(); - //weatherVM = getIt(); - // weatherVM.fetchCityInfoList(); + weatherVM = getIt(); + weatherVM.fetchCityInfoList(); } @@ -390,85 +391,18 @@ class _ServicesPageState extends State { medicalFileViewModel = Provider.of(context); hmgServices.removeWhere((element) => Utils.havePrivilege(element.action) == false); - return Scaffold( - backgroundColor: AppColors.bgScaffoldColor, - body: CollapsingListView( - title: LocaleKeys.exploreServices.tr(), - isLeading: widget.showBackIcon, - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - // Row( - // children: [ - // Flexible( - // child: Container( - // padding: EdgeInsets.all(16.w), - // decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 24.r, hasShadow: false), - // child: Column( - // children: [ - // Row( - // children: [ - // Utils.buildSvgWithAssets(icon: "assets/images/svg/cloudyweather.svg", width: 64.w, height: 64.w).onPress(() { - // // locationUtils?.getCurrentLocation(); - // print(getIt.get().userLat); - // print(getIt.get().userLong); - // }), - // SizedBox(width: 12.w), - // Column( - // crossAxisAlignment: CrossAxisAlignment.start, - // children: [ - // "August 19, 2025 - Tuesday, 11:25 ".toText12(fontWeight: FontWeight.w500, color: AppColors.greyTextColor), - // SizedBox( - // height: 4.w, - // ), - // "Cloudy 38oC".toText16(isBold: true, weight: FontWeight.w600), - // SizedBox( - // height: 4.w, - // ), - // "Health tips based on current weather".toText12(color: AppColors.greyTextColor, fontWeight: FontWeight.w500) - // ], - // ), - // ], - // ), - // SizedBox(height: 16.w), - // Container( - // padding: EdgeInsets.all(16.w), - // decoration: RoundedRectangleBorder().toSmoothCornerDecoration( - // color: AppColors.lightGrayBGColor, - // borderRadius: 10.r, - // hasShadow: false, - // ), - // child: Row( - // crossAxisAlignment: CrossAxisAlignment.center, - // mainAxisAlignment: MainAxisAlignment.spaceBetween, - // children: [ - // Row( - // children: [ - // Utils.buildSvgWithAssets(icon: "assets/images/svg/morning.svg", width: 24.w, height: 24.h), - // SizedBox(width: 4.w), - // DateTime.now().toLocal().toString().substring(11, 16).toText14(isBold: true), - // ], - // ), - // SizedBox(width: 25.w), - // DateTime.now().toLocal().toString().substring(11, 16).toText14(isBold: true), - // SizedBox(width: 25.w), - // Row( - // children: [ - // Utils.buildSvgWithAssets(icon: "assets/images/svg/evening.svg", width: 24.w, height: 24.h), - // SizedBox(width: 4.w), - // DateTime.now().toLocal().toString().substring(11, 16).toText14(isBold: true), - // ], - // ), - // ], - // ).expanded, - // ).paddingSymmetrical(0.w, 8.w) - // ], - // ), - // ), - // ) - // ], - // ).paddingSymmetrical(24.w, 0.w), - SizedBox(height: 16.h), + return ChangeNotifierProvider.value( + value: weatherVM, + child: Scaffold( + backgroundColor: AppColors.bgScaffoldColor, + body: CollapsingListView( + title: LocaleKeys.exploreServices.tr(), + isLeading: widget.showBackIcon, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const WeatherWidget(), + SizedBox(height: 16.h), LocaleKeys.medicalAndCareServices.tr().toText18(isBold: true).paddingSymmetrical(24.w, 0), SizedBox(height: 16.h), GridView.builder( @@ -910,6 +844,7 @@ class _ServicesPageState extends State { ], ), ), + ), ); } } diff --git a/lib/presentation/hmg_services/widgets/weather_widget.dart b/lib/presentation/hmg_services/widgets/weather_widget.dart new file mode 100644 index 00000000..4c353763 --- /dev/null +++ b/lib/presentation/hmg_services/widgets/weather_widget.dart @@ -0,0 +1,194 @@ +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/app_export.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/features/weather/weather_view_model.dart'; +import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; +import 'package:hmg_patient_app_new/presentation/weather/weather_details_page.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; +import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart'; +import 'package:hmg_patient_app_new/widgets/routes/custom_page_route.dart'; +import 'package:provider/provider.dart'; + +class WeatherWidget extends StatelessWidget { + final bool showButton; + + const WeatherWidget({super.key, this.showButton = true}); + + String _getWeatherIcon(String? categoryValue) { + if (categoryValue == null) return "assets/images/svg/cloudyweather.svg"; + + final lowerValue = categoryValue.toLowerCase(); + if (lowerValue.contains('sunny') || lowerValue.contains('clear')) { + return "assets/images/svg/morning.svg"; + } else if (lowerValue.contains('cloudy') || lowerValue.contains('cloud')) { + return "assets/images/svg/cloudyweather.svg"; + } else if (lowerValue.contains('rain')) { + return "assets/images/svg/cloudyweather.svg"; + } + return "assets/images/svg/cloudyweather.svg"; + } + + String _formatDateTime(DateTime dateTime) { + final formatter = DateFormat('MMMM dd, yyyy - EEEE, HH:mm'); + return formatter.format(dateTime); + } + + + @override + Widget build(BuildContext context) { + return Consumer( + builder: (context, weatherVM, child) { + final currentCity = weatherVM.cityInfoList.isNotEmpty + ? weatherVM.cityInfoList.first + : null; + + final now = DateTime.now(); + final temperature = currentCity?.temperature; + final healthTip = LocaleKeys.healthTipsBasedOnCurrentWeather.tr(); + + return Row( + children: [ + Flexible( + child: Container( + padding: EdgeInsets.all(16.w), + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 24.r, + hasShadow: false, + ), + child: weatherVM.isLoading + ? _buildLoadingState() + : Column( + children: [ + Row( + children: [ + Utils.buildSvgWithAssets( + icon: _getWeatherIcon(currentCity?.categoryValue), + width: 64.w, + height: 64.w, + ), + SizedBox(width: 12.w), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + _formatDateTime(now).toText12( + fontWeight: FontWeight.w500, + color: AppColors.greyTextColor, + ), + SizedBox(height: 4.w), + "$temperature°C" + .toText16( + isBold: true, + weight: FontWeight.w600, + ), + SizedBox(height: 4.w), + healthTip.toText12( + color: AppColors.greyTextColor, + fontWeight: FontWeight.w500, + maxLine: 2, + ), + ], + ), + ), + ], + ), + if (showButton) ...[ + SizedBox(height: 16.w), + CustomButton( + text: LocaleKeys.viewDetails.tr(context: context), + onPressed: () { + Navigator.of(context).push( + CustomPageRoute( + page: ChangeNotifierProvider.value( + value: weatherVM, + child: const WeatherDetailsPage(), + ), + ), + ); + }, + padding: EdgeInsets.zero, + backgroundColor: AppColors.secondaryLightRedColor, + borderColor: AppColors.secondaryLightRedColor, + textColor: AppColors.primaryRedColor, + fontSize: 14.f, + fontWeight: FontWeight.w600, + borderRadius: 10.r, + height: 40.h, + ), + ], + ], + ), + ), + ), + ], + ).paddingSymmetrical(24.w, 0.w); + }, + ); + } + + Widget _buildLoadingState() { + return Column( + children: [ + Row( + children: [ + Container( + width: 64.w, + height: 64.w, + decoration: BoxDecoration( + color: AppColors.lightGrayBGColor, + borderRadius: BorderRadius.circular(12.r), + ), + ), + SizedBox(width: 12.w), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + width: double.infinity, + height: 12.h, + decoration: BoxDecoration( + color: AppColors.lightGrayBGColor, + borderRadius: BorderRadius.circular(6.r), + ), + ), + SizedBox(height: 8.h), + Container( + width: 100.w, + height: 16.h, + decoration: BoxDecoration( + color: AppColors.lightGrayBGColor, + borderRadius: BorderRadius.circular(8.r), + ), + ), + SizedBox(height: 8.h), + Container( + width: double.infinity, + height: 12.h, + decoration: BoxDecoration( + color: AppColors.lightGrayBGColor, + borderRadius: BorderRadius.circular(6.r), + ), + ), + ], + ), + ), + ], + ), + SizedBox(height: 16.w), + Container( + height: 56.h, + decoration: BoxDecoration( + color: AppColors.lightGrayBGColor, + borderRadius: BorderRadius.circular(10.r), + ), + ), + ], + ); + } +} + diff --git a/lib/presentation/insurance/insurance_approval_details_page.dart b/lib/presentation/insurance/insurance_approval_details_page.dart index 6589bc4e..6d8e2524 100644 --- a/lib/presentation/insurance/insurance_approval_details_page.dart +++ b/lib/presentation/insurance/insurance_approval_details_page.dart @@ -53,8 +53,16 @@ class InsuranceApprovalDetailsPage extends StatelessWidget { children: [ AppCustomChipWidget( labelText: insuranceApprovalResponseModel.approvalStatusDescption, - backgroundColor: insuranceApprovalResponseModel.status == 9 ? AppColors.successColor.withOpacity(0.1) : AppColors.primaryRedColor.withOpacity(0.1), - textColor: insuranceApprovalResponseModel.status == 9 ? AppColors.successColor : AppColors.primaryRedColor, + backgroundColor: insuranceApprovalResponseModel.status == 9 + ? AppColors.successColor.withValues(alpha: 0.1) + : (insuranceApprovalResponseModel.approvalStatusDescption?.toLowerCase().contains('partial') == true || insuranceApprovalResponseModel.status == 8) + ? AppColors.warningColorYellow.withValues(alpha: 0.1) + : AppColors.primaryRedColor.withValues(alpha: 0.1), + textColor: insuranceApprovalResponseModel.status == 9 + ? AppColors.successColor + : (insuranceApprovalResponseModel.approvalStatusDescption?.toLowerCase().contains('partial') == true || insuranceApprovalResponseModel.status == 8) + ? AppColors.warningColorYellow + : AppColors.primaryRedColor, ), AppCustomChipWidget( icon: (!insuranceApprovalResponseModel.isLiveCareAppointment! ? AppAssets.walkin_appointment_icon : AppAssets.small_livecare_icon), @@ -65,7 +73,7 @@ class InsuranceApprovalDetailsPage extends StatelessWidget { ), AppCustomChipWidget( labelText: appState.isArabic() ? insuranceApprovalResponseModel.isInOutPatientDescriptionN! : insuranceApprovalResponseModel.isInOutPatientDescription!, - backgroundColor: AppColors.warningColorYellow.withOpacity(0.1), + backgroundColor: AppColors.warningColorYellow.withValues(alpha: 0.1), textColor: AppColors.warningColorYellow, ), ], diff --git a/lib/presentation/insurance/widgets/insurance_approval_card.dart b/lib/presentation/insurance/widgets/insurance_approval_card.dart index b50e199f..a12a26b6 100644 --- a/lib/presentation/insurance/widgets/insurance_approval_card.dart +++ b/lib/presentation/insurance/widgets/insurance_approval_card.dart @@ -24,6 +24,34 @@ class InsuranceApprovalCard extends StatelessWidget { AppState appState; bool isLoading; + /// Helper method to determine if approval is partially approved + bool _isPartiallyApproved() { + final description = insuranceApprovalResponseModel.approvalStatusDescption?.toLowerCase() ?? ''; + return description.contains('partial') || insuranceApprovalResponseModel.status == 8; + } + + /// Helper method to get chip background color based on approval status + Color _getChipBackgroundColor() { + if (insuranceApprovalResponseModel.status == 9) { + return AppColors.successColor.withValues(alpha: 0.1); + } else if (_isPartiallyApproved()) { + return AppColors.warningColorYellow.withValues(alpha: 0.1); + } else { + return AppColors.primaryRedColor.withValues(alpha: 0.1); + } + } + + /// Helper method to get chip text color based on approval status + Color _getChipTextColor() { + if (insuranceApprovalResponseModel.status == 9) { + return AppColors.successColor; + } else if (_isPartiallyApproved()) { + return AppColors.warningColorYellow; + } else { + return AppColors.primaryRedColor; + } + } + @override Widget build(BuildContext context) { return Container( @@ -45,8 +73,8 @@ class InsuranceApprovalCard extends StatelessWidget { children: [ AppCustomChipWidget( labelText: isLoading ? "Approved" : insuranceApprovalResponseModel.approvalStatusDescption, - backgroundColor: insuranceApprovalResponseModel.status == 9 ? AppColors.successColor.withOpacity(0.1) : AppColors.primaryRedColor.withOpacity(0.1), - textColor: insuranceApprovalResponseModel.status == 9 ? AppColors.successColor : AppColors.primaryRedColor, + backgroundColor: isLoading ? AppColors.successColor.withValues(alpha: 0.1) : _getChipBackgroundColor(), + textColor: isLoading ? AppColors.successColor : _getChipTextColor(), ).toShimmer2(isShow: isLoading), AppCustomChipWidget( icon: isLoading ? AppAssets.walkin_appointment_icon : (!insuranceApprovalResponseModel.isLiveCareAppointment! ? AppAssets.walkin_appointment_icon : AppAssets.small_livecare_icon), @@ -69,7 +97,7 @@ class InsuranceApprovalCard extends StatelessWidget { : appState.isArabic() ? insuranceApprovalResponseModel.isInOutPatientDescriptionN! : insuranceApprovalResponseModel.isInOutPatientDescription!, - backgroundColor: AppColors.warningColorYellow.withOpacity(0.1), + backgroundColor: AppColors.warningColorYellow.withValues(alpha: 0.1), textColor: AppColors.warningColorYellow, ).toShimmer2(isShow: isLoading), ], diff --git a/lib/presentation/weather/weather_details_page.dart b/lib/presentation/weather/weather_details_page.dart new file mode 100644 index 00000000..0057f9b6 --- /dev/null +++ b/lib/presentation/weather/weather_details_page.dart @@ -0,0 +1,185 @@ +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/app_export.dart'; +import 'package:hmg_patient_app_new/core/app_state.dart'; +import 'package:hmg_patient_app_new/core/dependencies.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/features/weather/models/waether_cities_model.dart'; +import 'package:hmg_patient_app_new/features/weather/weather_view_model.dart'; +import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; +import 'package:hmg_patient_app_new/presentation/hmg_services/widgets/weather_widget.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; +import 'package:hmg_patient_app_new/widgets/appbar/collapsing_list_view.dart'; +import 'package:provider/provider.dart'; + +class WeatherDetailsPage extends StatelessWidget { + const WeatherDetailsPage({super.key}); + + Color _getColorFromColorName(ColorName? colorName) { + if (colorName == null) return AppColors.successColor; + + switch (colorName) { + case ColorName.GREEN: + return AppColors.successColor; + case ColorName.ORANGE: + return AppColors.warningColor; + case ColorName.RED: + return AppColors.errorColor; + } + } + + Color _getBackgroundColorFromColorName(ColorName? colorName) { + if (colorName == null) return AppColors.successLightColor.withValues(alpha: 0.1); + + switch (colorName) { + case ColorName.GREEN: + return AppColors.successLightColor.withValues(alpha: 0.1); + case ColorName.ORANGE: + return AppColors.warningLightColor.withValues(alpha: 0.1); + case ColorName.RED: + return AppColors.errorLightColor.withValues(alpha: 0.1); + } + } + + IconData _getIconFromCategory(String? category) { + if (category == null) return Icons.wb_sunny_outlined; + + final lowerCategory = category.toLowerCase(); + if (lowerCategory.contains('walking') || lowerCategory.contains('activity')) { + return Icons.directions_walk; + } else if (lowerCategory.contains('weather') || lowerCategory.contains('temperature')) { + return Icons.thermostat_outlined; + } else if (lowerCategory.contains('elderly') || lowerCategory.contains('hiking')) { + return Icons.elderly; + } + return Icons.wb_sunny_outlined; + } + + @override + Widget build(BuildContext context) { + return Consumer( + builder: (context, weatherVM, child) { + return Scaffold( + backgroundColor: AppColors.bgScaffoldColor, + body: CollapsingListView( + title: LocaleKeys.healthWeatherIndicators.tr(), + isLeading: true, + child: weatherVM.isLoading + ? Center( + child: CircularProgressIndicator( + color: AppColors.primaryRedColor, + ), + ) + : Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + // Reuse WeatherWidget at the top (without the button) + const WeatherWidget(showButton: false), + + SizedBox(height: 16.h), + + // Categories List (Sliders) + ...weatherVM.cityInfoList.map((cityInfo) { + return _buildCategoryCard( + description: cityInfo.name ?? '', + categoryLabel: cityInfo.category ?? '', + color: _getColorFromColorName(cityInfo.colorName), + backgroundColor: _getBackgroundColorFromColorName(cityInfo.colorName), + icon: _getIconFromCategory(cityInfo.category), + ); + }), + + SizedBox(height: 24.h), + ], + ), + ), + ); + }, + ); + } + + Widget _buildCategoryCard({ + required String description, + required String categoryLabel, + required Color color, + required Color backgroundColor, + required IconData icon, + }) { + return Container( + margin: EdgeInsets.only(bottom: 16.h), + padding: EdgeInsets.all(16.w), + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 16.r, + hasShadow: false, + ), + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + // Icon + Container( + width: 40.w, + height: 40.w, + decoration: BoxDecoration( + color: backgroundColor, + borderRadius: BorderRadius.circular(8.r), + ), + child: Icon( + icon, + color: color, + size: 24.w, + ), + ), + SizedBox(width: 12.w), + // Content + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + description.toText14( + isBold: true, + color: AppColors.textColor, + ), + SizedBox(height: 8.h), + // Progress bar + Container( + height: 4.h, + decoration: BoxDecoration( + color: AppColors.lightGrayBGColor, + borderRadius: BorderRadius.circular(2.r), + ), + child: FractionallySizedBox( + alignment: Alignment.centerLeft, + widthFactor: 0.7, + child: Container( + decoration: BoxDecoration( + color: color, + borderRadius: BorderRadius.circular(2.r), + ), + ), + ), + ), + ], + ), + ), + SizedBox(width: 12.w), + // Category Label + Container( + padding: EdgeInsets.symmetric(horizontal: 12.w, vertical: 6.h), + decoration: BoxDecoration( + color: backgroundColor, + borderRadius: BorderRadius.circular(8.r), + ), + child: categoryLabel.toText12( + color: color, + fontWeight: FontWeight.w600, + maxLine: 1 + ), + ), + ], + ), + ).paddingSymmetrical(24.w, 0.w); + } +} + diff --git a/lib/widgets/input_widget.dart b/lib/widgets/input_widget.dart index d8a74d17..b1a0883f 100644 --- a/lib/widgets/input_widget.dart +++ b/lib/widgets/input_widget.dart @@ -269,10 +269,10 @@ class TextInputWidget extends StatelessWidget { final picked = await TimePickerWidget.show( context, initialTime: initialTime, - use24HourFormat: false, // You can make this configurable if needed + use24HourFormat: true, onTimeSelected: (time) { if (onChange != null) { - final formattedTime = TimePickerWidget.formatTime(time); + final formattedTime = TimePickerWidget.formatTime(time, use24HourFormat: true); onChange!(formattedTime); } }, @@ -280,7 +280,7 @@ class TextInputWidget extends StatelessWidget { // Update controller if time was picked if (picked != null && controller != null) { - controller!.text = TimePickerWidget.formatTime(picked); + controller!.text = TimePickerWidget.formatTime(picked, use24HourFormat: true); } }, child: Utils.buildSvgWithAssets(icon: isArrowTrailing ? AppAssets.arrow_down : AppAssets.alarm_clock_icon), diff --git a/lib/widgets/time_picker_widget.dart b/lib/widgets/time_picker_widget.dart index fd5cb409..eadbf5f3 100644 --- a/lib/widgets/time_picker_widget.dart +++ b/lib/widgets/time_picker_widget.dart @@ -1,3 +1,5 @@ +import 'dart:ui' as ui; + import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; @@ -126,48 +128,50 @@ class _TimePickerBottomSheetState extends State<_TimePickerBottomSheet> { @override Widget build(BuildContext context) { - return Container( - decoration: BoxDecoration( - color: AppColors.whiteColor, - borderRadius: BorderRadius.only( - topLeft: Radius.circular(20.r), - topRight: Radius.circular(20.r), + return Directionality( + textDirection: ui.TextDirection.ltr, + child: Container( + decoration: BoxDecoration( + color: AppColors.whiteColor, + borderRadius: BorderRadius.only( + topLeft: Radius.circular(20.r), + topRight: Radius.circular(20.r), + ), ), - ), - child: SafeArea( - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - // Header - Container( - padding: EdgeInsets.symmetric(horizontal: 20.w, vertical: 16.h), - decoration: BoxDecoration( - border: Border( - bottom: BorderSide( - color: AppColors.dividerColor, - width: 1, + child: SafeArea( + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + // Header + Container( + padding: EdgeInsets.symmetric(horizontal: 20.w, vertical: 16.h), + decoration: BoxDecoration( + border: Border( + bottom: BorderSide( + color: AppColors.dividerColor, + width: 1, + ), ), ), - ), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - LocaleKeys.selectTime.tr(context: context).toText18( - weight: FontWeight.w600, - color: AppColors.textColor, + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + LocaleKeys.selectTime.tr(context: context).toText18( + weight: FontWeight.w600, + color: AppColors.textColor, + ), + GestureDetector( + onTap: () => Navigator.pop(context), + child: Utils.buildSvgWithAssets( + icon: AppAssets.cancel, + width: 24.h, + height: 24.h, + iconColor: AppColors.textColor, ), - GestureDetector( - onTap: () => Navigator.pop(context), - child: Utils.buildSvgWithAssets( - icon: AppAssets.cancel, - width: 24.h, - height: 24.h, - iconColor: AppColors.textColor, ), - ), - ], + ], + ), ), - ), // Time Picker SizedBox( @@ -345,6 +349,7 @@ class _TimePickerBottomSheetState extends State<_TimePickerBottomSheet> { ], ), ), + ), ); } } From 2d36d91ab64408719ded157cbf6127aa9d645855 Mon Sep 17 00:00:00 2001 From: tahaalam Date: Tue, 14 Apr 2026 20:26:35 +0300 Subject: [PATCH 33/45] language and stepper changes --- assets/langs/ar-SA.json | 98 ++++++++++--------- assets/langs/en-US.json | 3 +- lib/core/api/api_client.dart | 4 +- .../emergency_services_repo.dart | 2 +- .../emergency_services_view_model.dart | 24 +++++ lib/generated/locale_keys.g.dart | 4 + .../call_ambulance/tracking_screen.dart | 6 +- lib/widgets/stepper/stepper_widget.dart | 10 +- 8 files changed, 93 insertions(+), 58 deletions(-) diff --git a/assets/langs/ar-SA.json b/assets/langs/ar-SA.json index 0975dc01..9c8f8982 100644 --- a/assets/langs/ar-SA.json +++ b/assets/langs/ar-SA.json @@ -2,7 +2,7 @@ "english": "الإنجليزية", "arabic": "العربية", "login": "تسجيل الدخول", - "noDataAvailable": "لا توجد بيانات متاحة", + "noDataAvailable": "لا توجد طلبات معلقة حالياً", "noRatingAvailable": "لا يوجد تقييم متاح", "doctorDoesNotHaveRating": "لم يحصل هذا الطبيب على أي تقييمات بعد.", "confirm": "تأكيد", @@ -21,7 +21,7 @@ "mySchedule": "جدولي", "logout": "تسجيل الخروج", "respirationRate": "معدل التنفس", - "bookAppo": "حجز موعد", + "bookAppo": "تأكيد الحجز", "searchBy": "البحث بواسطة:", "clinic": "عيادة", "byClinic": "حسب العيادة", @@ -40,7 +40,7 @@ "noResultFound": "لم يتم العثور على نتائج", "noSearchResultFound": "لم يتم العثور على نتائج", "pleaseEnterProductName": "يرجى إدخال اسم المنتج", - "bookNow": "حجز موعد", + "bookNow": "تأكيد الحجز", "docInfo": "معلومات الطبيب", "appoInfo": "معلومات الموعد", "availableAppo": "المواعيد المتاحة", @@ -99,7 +99,7 @@ "payment": "الدفع", "onlinePayment": "عبر الإنترنت", "onlinePaymentSubtitle": "الدفع", - "cancelNocaps": "إلغاء", + "cancelNocaps": "الاحتفاظ بالموعد", "setReminder": "تذكير", "nationalIdNumber": "رقم الهوية / الإقام", "medicalFileNumber": "رقم الملف الطبي", @@ -217,7 +217,7 @@ "heightUnit": "وحدة الطول", "weightUnit": "وحدة الوزن", "unit": "الوحدة", - "request": "طلب", + "request": "الطلبات", "memberName": "اسم العضو", "switchLogin": "عرض", "removeMember": "إزالة", @@ -258,7 +258,7 @@ "comprehensiveMedicalCheckup": "فحص طبي شامل", "hmgService": "خدمة HMG", "viewAllHabibMedicalService": "عرض جميع خدمات الحبيب الطبية", - "viewAll": "عرض الكل", + "viewAll": "عرض جميع الخدمات <", "view": "عرض", "contactUs": "اتصل بنا", "contactUsLocation": "ص.ب: 91877 - الرياض 11643، طريق الملك فهد - العليا - المملكة العربية السعودية", @@ -291,7 +291,7 @@ "locationa": "الموقع", "callNow": "اتصل الآن", "ambulancerequest": "طلب إسعاف", - "requestA": "طلب", + "requestA": "الطلبات", "noBookedAppointments": "لا توجد مواعيد محجوزة", "noConfirmedAppointments": "لا توجد مواعيد مؤكدة", "noArrivedAppointments": "لا توجد مواعيد تم تسجيل الوصول إليها", @@ -355,7 +355,7 @@ "labOrders": "طلبات المختبر", "billNo": "رقم الفاتورة:", "prescriptions": "الوصفات", - "history": "التاريخ", + "history": "سجل الطلبات", "orderNo": "رقم الطلب", "orderDetails": "تفاصيل الطلب", "deliveryDriverTrack": "تتبع السائق", @@ -410,7 +410,7 @@ "waterConsumedInMonth": "الماء المستهلك في شهر", "theVerificationCodeExpiresIn": "ينتهي رمز التحقق في", "pleaseEnterTheVerificationCode": "يرجى إدخال رمز التحقق المرسل إلى", - "eyeMeasurements": "قياسات العين", + "eyeMeasurements": "فحوصات النظر", "measurements": "قياسات", "classes": "نظارات", "contactLens": "عدسات لاصقة", @@ -437,7 +437,7 @@ "startDay": "يوم البدء", "endDay": "يوم الانتهاء", "days": "أيام ", - "pleaseVerify": "يرجى التحقق ", + "pleaseVerify": "إضافة", "scheduleTime": "وقت الجدولة", "askDoctor": "اسأل الطبيب", "doctorResponses": "ردود الطبيب", @@ -457,7 +457,7 @@ "infoRadiology": "تتيح لك هذه الخدمة عرض تقارير وصور الأشعة في مجموعة الحبيب الطبية بالإضافة إلى إرسال التقرير عبر البريد الإلكتروني.", "noReviewsAvailable": "لا توجد تقييمات متاحة", "noLocationAvailable": "لا توجد مواقع متاحة", - "orders": "الطلبات", + "orders": "سجل الطلبات", "lakum": "لكم", "lakumMsg": "لا توجد تفاصيل عن النقاط", "lakumPoint": "نقطة", @@ -607,7 +607,7 @@ "selectGender": "اختر الجنس", "iAmA": "أنا ...", "selectAge": "اختر عمرك", - "select": "اختر", + "select": "تأكيد الموعد", "iAm": "أنا", "yearsOld": "سنوات", "dragPoint": "اسحب النقطة لتغيير عمرك", @@ -801,15 +801,15 @@ "continuePlan": "متابعة خطة العلاج؟", "aboutApp": "حول التطبيق", "dontHaveAccount": "ليس لديك حساب؟", - "loginOrRegister": "تسجيل الدخول أو التسجيل", + "loginOrRegister": "تسجيل الدخول / إنشاء حساب", "myFiles": "ملفاتي", "resultsPending": "النتائج معلقة", "resultsAvailable": "النتائج متاحة", - "viewReport": "عرض التقرير", + "viewReport": "التفاصيل", "checkAvailability": "التحقق من التوفر", "readInstructions": "قراءة التعليمات", "searchLabReport": "ابحث عن تقرير المختبر", - "prescriptionDeliveryError": "هذه العيادة لا تدعم إعادة صرف الدواء", + "prescriptionDeliveryError": "خدمة إعادة الصرف والتوصيل غير متاحة لهذه العيادة.", "receiveOtpToast": "أين تود تلقي رمز التحقق OTP؟", "enterPhoneNumber": "إدخال رقم الجوال", "enterEmailDesc": "أدخل عنوان بريدك الإلكتروني لإكمال عملية إنشاء ملف طبي", @@ -890,12 +890,12 @@ "clearAllFilters": "اعادة تعيين", "filters": "التخصيص", "searchClinic": "بحث عن عيادة", - "normal": "عادي", + "normal": "طبيعي", "attention": "انتباه", - "monitor": "مراقبة", + "monitor": "يتطلب متابعة", "noSpecialResult": "لا توجد نتائج خاصة", "setTheDateRange": "تعيين النطاق الزمني", - "historyFlowchart": "مخطط تدفق التاريخ", + "historyFlowchart": "السجل التاريخي", "to": "إلى", "startDate": "تاريخ البدء", "endDate": "تاريخ الانتهاء", @@ -911,7 +911,7 @@ "appointmentStatus": "حالة الموعد", "doctorWillCallYou": "سيتصل بك الطبيب عندما يقترب موعدك.", "getDirections": "الاتجاهات", - "notifyMeBeforeAppointment": "تنبيه قبل الموعد", + "notifyMeBeforeAppointment": "تنبيهي قبل الموعد", "fetchingLabResults": "جاري جلب نتائج المختبر...", "fetchingRadiologyResults": "جاري جلب نتائج الأشعة...", "fetchingAppointmentPrescriptions": "جاري جلب وصفات الموعد...", @@ -919,7 +919,7 @@ "amountBeforeTax": "المبلغ قبل الضريبة", "rebookAppointment": "إعادة حجز الموعد", "fetchingDoctorSchedulePleaseWait": "جاري جلب جدول الطبيب، يرجى الانتظار...", - "pickADate": "اختر تاريخاً", + "pickADate": "اختيار الوقت والتاريخ", "confirmingAppointmentPleaseWait": "جاري تأكيد الموعد، يرجى الانتظار...", "appointmentConfirmedSuccessfully": "تم تأكيد الموعد بنجاح", "appointmentPayment": "دفع الموعد", @@ -1117,7 +1117,7 @@ "trackingDetails": "تفاصيل التتبع", "cancelRequest": "إلغاء الطلب", "shareLocationWhatsapp": "مشاركة موقعك المباشر على واتساب", - "pleaseWaitForCall": "يرجى انتظار المكالمة", + "pleaseWaitForCall": "ستتلقى مكالمة لتأكيد طلبك قريباً.", "toHospitalLower": "إلى المستشفى", "contact": "اتصال", "failed": "فشل", @@ -1142,18 +1142,18 @@ "allFacilities": "جميع المرافق", "selectLocation": "اختر الموقع", "pleaseSelectTheLocation": "يرجى اختيار الموقع", - "viewLocationGoogleMaps": "عرض الموقع على خرائط جوجل", + "viewLocationGoogleMaps": "الاتجاهات", "callAmbulance": "استدعاء سيارة إسعاف", "requestAmbulanceInEmergency": "طلب سيارة إسعاف في حالة الطوارئ من المنزل أو المستشفى", "confirmation": "استمرار", - "areYouSureYouWantToCallAmbulance": "هل أنت متأكد أنك تريد استدعاء سيارة إسعاف؟", - "getDetailsOfNearestBranch": "احصل على تفاصيل أقرب فرع بما في ذلك الاتجاهات", + "areYouSureYouWantToCallAmbulance": "هل تود تأكيد طلب سيارة الإسعاف؟", + "getDetailsOfNearestBranch": "الحصول على تفاصيل أقرب مركز طوارئ والاتجاهات إليه", "areYouSureYouWantToCallRRT": "هل أنت متأكد أنك تريد استدعاء فريق الاستجابة السريعة (RRT)؟", "priorERCheckInToSkipLine": "تسجيل الوصول المسبق في الطوارئ لتجاوز الطابور والدفع في الاستقبال.", "areYouSureYouWantToMakeERCheckIn": "هل أنت متأكد أنك تريد إجراء تسجيل وصول الطوارئ؟", - "checkingYourERAppointmentStatus": "جاري التحقق من حالة موعد الطوارئ الخاص بك...", + "checkingYourERAppointmentStatus": "جارٍ التحقق من حالة طلبك...", "transportOptions": "خيارات النقل", - "selectHospitalForAdvancePayment": "يرجى اختيار المستشفى الذي ترغب في دفع مبلغ مقدم له.", + "selectHospitalForAdvancePayment": "يرجى تحديد المستشفى أولاً.", "recharge": "إعادة الشحن", "activityLevel": "مستوى النشاط", "selectActivityLevel": "حدد مستوى النشاط", @@ -1164,10 +1164,10 @@ "selectBodyFrameSize": "حدد حجم إطار الجسم", "averageCycleLength": "متوسط طول الدورة الشهرية (عادةً 28 يومًا)", "averageLutealPhase": "متوسط طول المرحلة الأصفرية (عادةً 14 يومًا)", - "convert": "يتحول", + "convert": "تحويل الوحدات", "calculate": "احسب", "healthCalculators": "الحاسبات الصحية", - "healthConverters": "محول الوحدات الصحية", + "healthConverters": "تحويل الوحدات", "generalHealth": "الصحة العامة", "relatedToBMICalories": "متعلق بمؤشر كتلة الجسم والسعرات الحرارية ودهون الجسم وما إلى ذلك للبقاء على اطلاع دائم بصحتك.", "selectCalculator": "اختر الحاسبة", @@ -1246,7 +1246,7 @@ "loginToViewMedicalFile": "سجل الدخول لعرض ملفك الطبي", "addMember": "إضافة عضو", "addFamilyMember": "إضافة فرد من العائلة", - "pleaseFillBelowFieldToAddNewFamilyMember": "يرجى ملء الحقل أدناه لإضافة فرد جديد من العائلة إلى ملفك الشخصي", + "pleaseFillBelowFieldToAddNewFamilyMember": "أدخل البيانات أدناه لإضافة فرد جديد إلى عائلتك", "healthTools": "الادوات الصحية", "supportServices": "خدمات الدعم", "virtualTour": "جولة افتراضية", @@ -1318,7 +1318,7 @@ "allMedications": "جميع الأدوية", "youDontHaveAnyPrescriptionsYet": "ليس لديك أي وصفات طبية بعد.", "youDontHaveAnyCompletedVisitsYet": "ليس لديك أي زيارات مكتملة بعد", - "others": "أخرى", + "others": "سجلات أخرى", "allergyInfo": "معلومات الحساسية", "vaccineInfo": "معلومات اللقاحات", "updateInsuranceInfo": "تحديث التأمين", @@ -1350,7 +1350,7 @@ "selectAProfile": "الرجاء تحديد ملف تعريف", "switchFamilyFile": "قم بالتبديل من قائمة الملفات الطبية أدناه", "medicalFiles": "الملفات الطبية", - "addANewFamilyMember": "إضافة فرد جديد من العائلة", + "addANewFamilyMember": "إضافة فرد جديد", "viewInvoiceDetails": "عرض تفاصيل الفاتورة", "outPatient": "مريض خارجي", "invoiceDetails": "تفاصيل الفاتورة", @@ -1398,7 +1398,7 @@ "previous": "سابق", "selectedOrgans": "الهيئات المختارة", "noOrgansSelected": "لم يتم تحديد أي أعضاء بعد", - "organSelector": "اين تشعر بالالم", + "organSelector": "حدد موقع الألم", "noPredictionsAvailable": "لا توجد تنبؤات متاحة", "areYouSureYouWantToRestartOrganSelection": "هل تريد الخروج؟", "possibleConditions": "الحالات المحتملة", @@ -1413,10 +1413,10 @@ "failedToLoadImage": "فشل تحميل الصورة", "typeNotification": "النوع", "pleaseSelectAtLeastOneOptionBeforeProceeding": "يرجى اختيار خيار واحد على الأقل قبل المتابعة", - "suggestions": "الاقتراحات", + "suggestions": "التوصيات", "pleaseGoBackAndSelectOrgansFirst": "يرجى العودة واختيار الأعضاء أولاً", "symptomsSelector": "محدد الأعراض", - "possibleSymptomsRelatedTo": "الأعراض المحتملة المتعلقة بـ", + "possibleSymptomsRelatedTo": "أعراض مرتبطة بـ", "suggestionAIListDescription": "هذه قائمة بالأعراض المقترحة من قبل الذكاء الاصطناعي، بناءً على المعلومات التي تم جمعها حتى الآن خلال المقابلة", "analyzing": "جاري التحليل...", "seekMedicalAdvice": "اطلب المشورة الطبية", @@ -1433,13 +1433,13 @@ "noQuestionItemsAvailable": "لا توجد عناصر أسئلة متاحة", "pleaseAnswerAllQuestionsBeforeProceeding": "يرجى الإجابة على جميع الأسئلة قبل المتابعة", "triage": "الفرز", - "areYouSureYouWantToExitProgress": "هل أنت متأكد أنك تريد الخروج؟ سيتم فقدان تقدمك.", + "areYouSureYouWantToExitProgress": "هل تود الخروج؟ ستفقد تقدمك الحالي.", "noQuestionAvailable": "لا يوجد سؤال متاح", - "possibleSymptom": "عرض محتمل: ", - "symptomsCheckerFindingScore": "- درجة نتائج فاحص الأعراض", + "possibleSymptom": "تشخيص محتمل", + "symptomsCheckerFindingScore": "نسبة التطابق", "notSet": "غير محدد", "years": "سنوات", - "symptomsChecker": "فاحص الأعراض", + "symptomsChecker": "مدقق الاعراض", "helloIsYourInformationUpToDate": "مرحباً {name}، هل معلوماتك محدثة؟", "noEditAll": "لا، تعديل الكل", "yesItIs": "نعم", @@ -1565,11 +1565,11 @@ "yesPleaseINeedHelp": "نعم، من فضلك أريد المساعدة", "aiOverView": "AI ملخص", "generateAiAnalysis": "التحليل باستخدام الذكاء الاصطناعي", - "aiAnalysis": "AI تحليل", + "aiAnalysis": "تحليل الذكاء الاصطناعي", "prediction": "التوقعات", "prevention": "الوقاية", - "disclaimer": "تنبيه", - "thisAboveInfo": "المعلومات المذكورة أعلاه مُولّدة بواسطة AI بناءً على نتائج تحاليلك المخبرية، وهي لأغراض إعلامية فقط. لا ينبغي اعتبارها تشخيصًا طبيًا أو خطة علاجية. استشر طبيبك دائمًا للحصول على نصيحة طبية مُخصصة قبل اتخاذ أي قرارات تتعلق بصحتك.", + "disclaimer": "إخلاء مسؤولية", + "thisAboveInfo": "المعلومات أعلاه مُوَلّدة بواسطة الذكاء الاصطناعي بناءً على نتائج تحاليلك المخبرية، وهي لأغراض إعلامية فقط. لا ينبغي اعتبارها تشخيصًا طبيًا أو خطة علاجية. استشر طبيبك دائمًا للحصول على نصيحة طبية مُخصصة قبل اتخاذ أي قرارات تتعلق بصحتك.", "aiDisclaimer": "سيتم مشاركة بيانات نتائج تحاليلك المخبرية بشكل آمن مع خدمة الذكاء الاصطناعي لدينا لتحليلها. يساعد هذا في تقديم رؤى صحية مُخصصة. هل ترغب في المتابعة؟", "consent": "نتائج المختبر", "bmiNormalDescription": "مؤشر كتلة جسمك ضمن المعدل الصحي. استمر في اتباع نظام غذائي متوازن، وممارسة النشاط البدني بانتظام، وإجراء الفحوصات الدورية للحفاظ على صحة جيدة. راقب أي تغييرات ملحوظة مع مرور الوقت.", @@ -1612,8 +1612,8 @@ "noFreeSlot": "لا توجد مواعيد متاحة في التاريخ المحدد. يرجى اختيار تاريخ آخر أو إعادة المحاولة لاحقاً.", "noThanksIKnowTheClinic": "لا، شكراً. أنا أعرف العيادة.", "unableToSendOTP": "تعذر إرسال رمز التحقق لمرة واحدة", - "loadingAIAnalysis": "نقوم بتحليل نتائجك، يرجى التحلي بالصبر والسماح للذكاء الاصطناعي بالقيام بالمهمة، قد يستغرق هذا بعض الوقت.", - "symptoms": "أعراض", + "loadingAIAnalysis": "جارٍ تحليل النتائج بواسطة الذكاء الاصطناعي، يرجى الانتظار...", + "symptoms": "مدقق الاعراض", "insuranceInActive": "التأمين غير نشط", "insuranceInActiveContactSupport": "لديك تأمين ساري المفعول، ولكنه غير مُفعّل حاليًا في مجموعة حبيب الطبية. يُرجى التواصل مع خدمة عملاء مجموعة حبيب الطبية.", "updateAppNow": "تحديث التطبيق الآن", @@ -1641,7 +1641,7 @@ "hmgPolicies": "سياسات مجموعة الحبيب الطبية", "darkMode": "الوضع الداكن", "featureComingSoonDescription": "هذه الميزة ستتوفر قريباً. نحن نعمل جاهدين لإضافة ميزات أكثر تميزاً إلى التطبيق. انتظرونا لمتابعة التحديثات.", - "generateAiAnalysisResult": "قم بإجراء تحليل لهذا المختبر AI", + "generateAiAnalysisResult": "تحليل النتائج بالذكاء الاصطناعي", "ratings": "التقييمات", "hmgPharmacyText": "وجهتك الالكترونية الشاملة للأدوية ومنتجات العناية بالصحة", "insuranceRequestSubmittedSuccessfully": "تم إرسال طلب تحديث بيانات التأمين بنجاح. سيتم إعلامك بمجرد الانتهاء.", @@ -1653,7 +1653,7 @@ "giveLocationPermissionForNearestList": "يرجى منح إذن الوصول إلى الموقع من إعدادات التطبيق لعرض أقرب المواقع.", "sortByLocation": "الترتيب حسب الموقع", "timeForFirstReminder": "وقت التذكير الأول", - "reminderRemovalNote": "يمكنك إزالتها من التقويم الخاص بك لاحقاً عن طريق إيقاف تشغيل التذكير", + "reminderRemovalNote": "يمكنك إلغاء التذكير لاحقاً من التقويم.", "communicationLanguage": "لغة التواصل", "cmcServiceHeader": "فحص صحي شامل: تشخيص متقدم، معلومات صحية مفصلة", @@ -1747,8 +1747,12 @@ "searchFor" : "بحث عن", "m": "متر", "inch": "انش", - "updateEmailAddressTitle": "تحديث البريد الالكتروني: ", + "updateEmailAddressTitle": "أدخل البريد الإلكتروني الجديد: ", "enterNewNewContactNumber": "الرجاء اضافة رقم اتصال في حالة الطوارئ: ", "nationalIdFileNumber": "رقم الهوية / الإقامة / الملف", - "finda": "البحث عن" + "finda": "البحث عن", + "errorFetchingData": "حدث خطأ أثناء تحميل البيانات", + "negative": "سلبي", + "calculateCaloriesBasedOnFactors": "حساب السعرات الحرارية اليومية بناءً على عدة عوامل مثل الطول، الوزن، العمر، الجنس، والنشاط البدني اليومي.", + "conformationCall": "ستتلقى مكالمة لتأكيد طلبك قريباً." } diff --git a/assets/langs/en-US.json b/assets/langs/en-US.json index c75f2ae8..2b38f796 100644 --- a/assets/langs/en-US.json +++ b/assets/langs/en-US.json @@ -1741,7 +1741,8 @@ "nationalIdFileNumber": "National ID/File Number", "finda": "Find a", "calculateCaloriesBasedOnFactors": "Calculates daily calorie intake based on several factors including: height, weight, age, gender and daily physical activity.", - "insurance2": "Insurance" + "insurance2": "Insurance", + "conformationCall": "You will receive a call from HMG for confirmation " } 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/features/emergency_services/emergency_services_repo.dart b/lib/features/emergency_services/emergency_services_repo.dart index 582c4a58..caf8a152 100644 --- a/lib/features/emergency_services/emergency_services_repo.dart +++ b/lib/features/emergency_services/emergency_services_repo.dart @@ -259,7 +259,7 @@ class EmergencyServicesRepoImp implements EmergencyServicesRepo { Failure? failure; await apiClient.post( body: {}, - "$GET_ALL_TRANSPORTATIONS_ORDERS?patientID=$id", + "$GET_ALL_TRANSPORTATIONS_ORDERS?patientID=1018977", isRCService: true, onFailure: (error, statusCode, {messageStatus, failureType}) { failure = failureType; diff --git a/lib/features/emergency_services/emergency_services_view_model.dart b/lib/features/emergency_services/emergency_services_view_model.dart index 255f4892..55e355fa 100644 --- a/lib/features/emergency_services/emergency_services_view_model.dart +++ b/lib/features/emergency_services/emergency_services_view_model.dart @@ -792,6 +792,7 @@ class EmergencyServicesViewModel extends ChangeNotifier { allOrders.clear(); allOrders.addAll(ambulanceOrders ?? []); allOrders.addAll(ordersRRT?.completedOrders ?? []); + _sortOrdersByDate(allOrders); changeOrderDisplayItems(OrderDislpay.ALL); notifyListeners(); }, @@ -966,6 +967,7 @@ class EmergencyServicesViewModel extends ChangeNotifier { allOrders.clear(); allOrders.addAll(ambulanceOrders ?? []); allOrders.addAll(ordersRRT?.completedOrders ?? []); + _sortOrdersByDate(allOrders); changeOrderDisplayItems(OrderDislpay.ALL); notifyListeners(); }, @@ -1003,9 +1005,31 @@ class EmergencyServicesViewModel extends ChangeNotifier { orderDisplayList = ambulanceOrders ?? []; break; } + _sortOrdersByDate(orderDisplayList); notifyListeners(); } + void _sortOrdersByDate(List list) { + list.sort((a, b) { + final String? dateA = _getCreatedDate(a); + final String? dateB = _getCreatedDate(b); + final bool hasDateA = dateA != null && dateA.contains('/Date('); + final bool hasDateB = dateB != null && dateB.contains('/Date('); + if (!hasDateA && !hasDateB) return 0; + if (!hasDateA) return 1; + if (!hasDateB) return -1; + final parsedA = DateUtil.convertStringToDate(dateA); + final parsedB = DateUtil.convertStringToDate(dateB); + return parsedB.compareTo(parsedA); + }); + } + + String? _getCreatedDate(dynamic order) { + if (order is AmbulanceRequestOrdersModel) return order.created; + if (order is GetCMCAllOrdersResponseModel) return order.created; + return null; + } + void openRRT() { if (appState.isAuthenticated) { if (agreedToTermsAndCondition == false) { diff --git a/lib/generated/locale_keys.g.dart b/lib/generated/locale_keys.g.dart index 75653984..ea0c7fa0 100644 --- a/lib/generated/locale_keys.g.dart +++ b/lib/generated/locale_keys.g.dart @@ -1741,5 +1741,9 @@ abstract class LocaleKeys { static const enterNewNewContactNumber = 'enterNewNewContactNumber'; static const nationalIdFileNumber = 'nationalIdFileNumber'; static const finda = 'finda'; + static const errorFetchingData = 'errorFetchingData'; + static const negative = 'negative'; + static const calculateCaloriesBasedOnFactors = 'calculateCaloriesBasedOnFactors'; + static const conformationCall = 'conformationCall'; } diff --git a/lib/presentation/emergency_services/call_ambulance/tracking_screen.dart b/lib/presentation/emergency_services/call_ambulance/tracking_screen.dart index 7c7f5db6..a714ab56 100644 --- a/lib/presentation/emergency_services/call_ambulance/tracking_screen.dart +++ b/lib/presentation/emergency_services/call_ambulance/tracking_screen.dart @@ -149,7 +149,7 @@ class TrackingScreen extends StatelessWidget { borderColor: AppColors.primaryRedColor, textColor: Colors.white, icon: AppAssets.cancel, - height: 40.h, + height: 56.h, iconSize: 18.w, ), ], @@ -240,7 +240,7 @@ class TrackingScreen extends StatelessWidget { backgroundColor: AppColors.lightRedButtonColor, iconColor: AppColors.primaryRedColor, borderColor: Colors.transparent, - height: 40.h, + height: 56.h, ), ) ], @@ -273,7 +273,7 @@ class TrackingScreen extends StatelessWidget { informationRegardingTrackingSection() { return Column( crossAxisAlignment: CrossAxisAlignment.start, - children: [currentStatus(), SizedBox(height: 4.h), "You will receive a call from HMG for confirmation ".toText12(color: AppColors.greyTextColor, isBold: true)], + children: [currentStatus(), SizedBox(height: 4.h)], ); } diff --git a/lib/widgets/stepper/stepper_widget.dart b/lib/widgets/stepper/stepper_widget.dart index 5d901ac8..9946c1ae 100644 --- a/lib/widgets/stepper/stepper_widget.dart +++ b/lib/widgets/stepper/stepper_widget.dart @@ -12,10 +12,11 @@ class StepperWidget extends StatelessWidget { @override Widget build(BuildContext context) { - return oneProgressBar(width, activeColor, hasThumb); + return oneProgressBar(context, width, activeColor, hasThumb); } - Widget oneProgressBar(double width, Color color, bool hasThumb) { + Widget oneProgressBar(BuildContext context, double width, Color color, bool hasThumb) { + final isRtl = Directionality.of(context) == TextDirection.rtl; return Row( children: [ AnimatedSize( @@ -42,8 +43,9 @@ class StepperWidget extends StatelessWidget { Visibility( visible: hasThumb, child: Positioned( - top: -6.h, // move thumb above bar center - left: width - 22.h, // move to right end + top: -6.h, + left: isRtl ? 4.h : null, + right: isRtl ? null : 4.h, child: thumb(color), ), ) From c1c434789e7c8faaa8135b38962c7cb87dc66e33 Mon Sep 17 00:00:00 2001 From: Sultan khan Date: Tue, 14 Apr 2026 20:43:48 +0300 Subject: [PATCH 34/45] Rad Description & Ai Description --- assets/langs/ar-SA.json | 6 ++++-- assets/langs/en-US.json | 8 ++++++-- lib/generated/locale_keys.g.dart | 2 ++ .../radiology/radiology_ai_analysis_detailed_page.dart | 4 ++-- .../radiology/radiology_ai_analysis_widget.dart | 2 +- 5 files changed, 15 insertions(+), 7 deletions(-) diff --git a/assets/langs/ar-SA.json b/assets/langs/ar-SA.json index 7b6c06d4..bd66e84a 100644 --- a/assets/langs/ar-SA.json +++ b/assets/langs/ar-SA.json @@ -1569,7 +1569,7 @@ "prediction": "التوقعات", "prevention": "الوقاية", "disclaimer": "تنبيه", - "thisAboveInfo": "المعلومات المذكورة أعلاه مُولّدة بواسطة AI بناءً على نتائج تحاليلك المخبرية، وهي لأغراض إعلامية فقط. لا ينبغي اعتبارها تشخيصًا طبيًا أو خطة علاجية. استشر طبيبك دائمًا للحصول على نصيحة طبية مُخصصة قبل اتخاذ أي قرارات تتعلق بصحتك.", + "thisAboveInfo": "تم تحليل نتائج المختبرهذه بواسطة الذكاء الاصطناعي، وهي لا تُعدّ نصيحة طبية. استشر طبيبك المختص للتشخيص والعلاج.", "aiDisclaimer": "سيتم مشاركة بيانات نتائج تحاليلك المخبرية بشكل آمن مع خدمة الذكاء الاصطناعي لدينا لتحليلها. يساعد هذا في تقديم رؤى صحية مُخصصة. هل ترغب في المتابعة؟", "consent": "نتائج المختبر", "bmiNormalDescription": "مؤشر كتلة جسمك ضمن المعدل الصحي. استمر في اتباع نظام غذائي متوازن، وممارسة النشاط البدني بانتظام، وإجراء الفحوصات الدورية للحفاظ على صحة جيدة. راقب أي تغييرات ملحوظة مع مرور الوقت.", @@ -1749,5 +1749,7 @@ "inch": "انش", "updateEmailAddressTitle": "تحديث البريد الالكتروني: ", "enterNewNewContactNumber": "الرجاء اضافة رقم اتصال في حالة الطواريء: ", - "nationalIdFileNumber": "رقم الهوية / الإقامة / الملف" + "nationalIdFileNumber": "رقم الهوية / الإقامة / الملف", + "radiologyLabResults": "نتائج الأشعة", + "disclaimerRadiology": "تم تحليل نتائج الأشعة هذه بواسطة الذكاء الاصطناعي، وهي لا تُعدّ نصيحة طبية. استشر طبيبك المختص للتشخيص والعلاج." } diff --git a/assets/langs/en-US.json b/assets/langs/en-US.json index dee355f6..ba780f18 100644 --- a/assets/langs/en-US.json +++ b/assets/langs/en-US.json @@ -1571,7 +1571,7 @@ "prediction": "Prediction", "prevention": "Prevention", "disclaimer": "Disclaimer", - "thisAboveInfo": "The above information is generated by AI based on your lab results and is intended for informational purposes only. It should not be considered a medical diagnosis or treatment plan. Always consult with your healthcare provider for personalized medical advice and before making any health-related decisions.", + "thisAboveInfo": "This Lab result was analyzed by AI, and it is not medical advice. Consult your healthcare provider for diagnosis and treatment.", "aiDisclaimer": "Your lab result data will be securely shared with our AI Analyzer for analysis. This helps provide personalized health insights. Do you want to proceed?", "consent": "Consent", "bmiNormalDescription": "Your BMI is within the healthy range. Continue a balanced diet, regular physical activity, and routine checkups to maintain good health. Monitor any significant changes over time.", @@ -1738,5 +1738,9 @@ "inch": "in", "updateEmailAddressTitle": "Enter the new email address to be updated: ", "enterNewNewContactNumber": "Enter the new emergency contact number to be updated: ", - "nationalIdFileNumber": "National ID/File Number" + "nationalIdFileNumber": "National ID/File Number", + "radiologyLabResults": "Radiology Results", + "disclaimerRadiology": "This radiology result was analyzed by AI, and it is not medical advice. Consult your healthcare provider for diagnosis and treatment." +} + } diff --git a/lib/generated/locale_keys.g.dart b/lib/generated/locale_keys.g.dart index 51d64b07..f6334bb4 100644 --- a/lib/generated/locale_keys.g.dart +++ b/lib/generated/locale_keys.g.dart @@ -1740,5 +1740,7 @@ abstract class LocaleKeys { static const updateEmailAddressTitle = 'updateEmailAddressTitle'; static const enterNewNewContactNumber = 'enterNewNewContactNumber'; static const nationalIdFileNumber = 'nationalIdFileNumber'; + static const radiologyLabResults = 'radiologyLabResults'; + static const disclaimerRadiology = 'disclaimerRadiology'; } diff --git a/lib/presentation/radiology/radiology_ai_analysis_detailed_page.dart b/lib/presentation/radiology/radiology_ai_analysis_detailed_page.dart index 78a3a097..a3e00e79 100644 --- a/lib/presentation/radiology/radiology_ai_analysis_detailed_page.dart +++ b/lib/presentation/radiology/radiology_ai_analysis_detailed_page.dart @@ -79,7 +79,7 @@ class _RadiologyAiAnalysisDetailedPageState extends State Date: Tue, 14 Apr 2026 20:56:17 +0300 Subject: [PATCH 35/45] Rad Description & Ai Description --- lib/widgets/input_widget.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/widgets/input_widget.dart b/lib/widgets/input_widget.dart index 63870e25..8b43d1ed 100644 --- a/lib/widgets/input_widget.dart +++ b/lib/widgets/input_widget.dart @@ -9,7 +9,7 @@ import 'package:hmg_patient_app_new/core/enums.dart'; import 'package:hmg_patient_app_new/core/utils/utils.dart'; import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; -import 'package:hmg_patient_app_new/generated/locale_kesy.g.dart'; +import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; import 'package:hmg_patient_app_new/theme/colors.dart'; import 'package:hmg_patient_app_new/widgets/common_bottom_sheet.dart'; import 'package:hmg_patient_app_new/widgets/date_range_selector/date_range_calender.dart'; From 66e23197c546c5a2ba6ebad0609acd40f9940c35 Mon Sep 17 00:00:00 2001 From: tahaalam Date: Wed, 15 Apr 2026 10:39:08 +0300 Subject: [PATCH 36/45] referral lingual change --- assets/langs/ar-SA.json | 9 ++++- assets/langs/en-US.json | 9 ++++- .../emergency_services_view_model.dart | 38 ++++++++++--------- lib/generated/locale_keys.g.dart | 6 +++ .../e_referral/new_e_referral.dart | 2 +- .../widget/e_referral_other_details.dart | 4 +- .../widget/e_referral_patient_info.dart | 14 +++++-- .../widget/e_referral_requester_form.dart | 6 +-- .../widget/search_e_referral_form.dart | 26 +++++++------ 9 files changed, 73 insertions(+), 41 deletions(-) diff --git a/assets/langs/ar-SA.json b/assets/langs/ar-SA.json index 2ad381a8..de64d1ad 100644 --- a/assets/langs/ar-SA.json +++ b/assets/langs/ar-SA.json @@ -1757,7 +1757,12 @@ "calculateCaloriesBasedOnFactors": "حساب السعرات الحرارية اليومية بناءً على عدة عوامل مثل الطول، الوزن، العمر، الجنس، والنشاط البدني اليومي.", "conformationCall": "ستتلقى مكالمة لتأكيد طلبك قريباً.", "radiologyLabResults": "نتائج الأشعة", - "disclaimerRadiology": "تم تحليل نتائج الأشعة هذه بواسطة الذكاء الاصطناعي، وهي لا تُعدّ نصيحة طبية. استشر طبيبك المختص للتشخيص والعلاج." - + "disclaimerRadiology": "تم تحليل نتائج الأشعة هذه بواسطة الذكاء الاصطناعي، وهي لا تُعدّ نصيحة طبية. استشر طبيبك المختص للتشخيص والعلاج.", + "enterIdentificationNumberWithNoStar": "أدخل رقم الهوية", + "enterReferralNumber": "أدخل رقم الإحالة", + "referralNumber": "رقم الإحالة", + "phoneHint": "5xxxxxxxx", + "selectSearchCriteria": "اختر معيار البحث", + "selectCriteria": "اختيار المعيار" } diff --git a/assets/langs/en-US.json b/assets/langs/en-US.json index 7c4f2ab4..bc596d82 100644 --- a/assets/langs/en-US.json +++ b/assets/langs/en-US.json @@ -1745,8 +1745,13 @@ "insurance2": "Insurance", "conformationCall": "You will receive a call from HMG for confirmation ", "radiologyLabResults": "Radiology Results", - "disclaimerRadiology": "This radiology result was analyzed by AI, and it is not medical advice. Consult your healthcare provider for diagnosis and treatment." - + "disclaimerRadiology": "This radiology result was analyzed by AI, and it is not medical advice. Consult your healthcare provider for diagnosis and treatment.", + "enterIdentificationNumberWithNoStar": "Enter Identification Number", + "enterReferralNumber": "Enter Referral Number", + "referralNumber": "Referral Number", + "phoneHint": "5xxxxxxxx", + "selectSearchCriteria": "Select the Search Criteria", + "selectCriteria": "Select Criteria" } diff --git a/lib/features/emergency_services/emergency_services_view_model.dart b/lib/features/emergency_services/emergency_services_view_model.dart index 55e355fa..b74318f4 100644 --- a/lib/features/emergency_services/emergency_services_view_model.dart +++ b/lib/features/emergency_services/emergency_services_view_model.dart @@ -792,7 +792,6 @@ class EmergencyServicesViewModel extends ChangeNotifier { allOrders.clear(); allOrders.addAll(ambulanceOrders ?? []); allOrders.addAll(ordersRRT?.completedOrders ?? []); - _sortOrdersByDate(allOrders); changeOrderDisplayItems(OrderDislpay.ALL); notifyListeners(); }, @@ -967,7 +966,6 @@ class EmergencyServicesViewModel extends ChangeNotifier { allOrders.clear(); allOrders.addAll(ambulanceOrders ?? []); allOrders.addAll(ordersRRT?.completedOrders ?? []); - _sortOrdersByDate(allOrders); changeOrderDisplayItems(OrderDislpay.ALL); notifyListeners(); }, @@ -996,32 +994,38 @@ class EmergencyServicesViewModel extends ChangeNotifier { this.currentlyDisplayedOrder = currentlyDisplayedOrder; switch (currentlyDisplayedOrder) { case OrderDislpay.ALL: - orderDisplayList = allOrders; + orderDisplayList = List.from(allOrders); break; case OrderDislpay.RRT: - orderDisplayList = ordersRRT?.completedOrders ?? []; + orderDisplayList = List.from(ordersRRT?.completedOrders ?? []); break; case OrderDislpay.AMBULANCE: - orderDisplayList = ambulanceOrders ?? []; + orderDisplayList = List.from(ambulanceOrders ?? []); break; } - _sortOrdersByDate(orderDisplayList); + + orderDisplayList = _sortOrdersByDate(orderDisplayList); notifyListeners(); } - void _sortOrdersByDate(List list) { + List _sortOrdersByDate(List list) { list.sort((a, b) { - final String? dateA = _getCreatedDate(a); - final String? dateB = _getCreatedDate(b); - final bool hasDateA = dateA != null && dateA.contains('/Date('); - final bool hasDateB = dateB != null && dateB.contains('/Date('); - if (!hasDateA && !hasDateB) return 0; - if (!hasDateA) return 1; - if (!hasDateB) return -1; - final parsedA = DateUtil.convertStringToDate(dateA); - final parsedB = DateUtil.convertStringToDate(dateB); - return parsedB.compareTo(parsedA); + final DateTime? dateA = _parseCreatedDate(a); + final DateTime? dateB = _parseCreatedDate(b); + print("the dateA is $dateA and dateB is $dateB"); + if (dateA == null && dateB == null) return 0; + if (dateA == null) return 1; + if (dateB == null) return -1; + return dateB.compareTo(dateA); }); + return list; + } + + DateTime? _parseCreatedDate(dynamic order) { + final String? raw = _getCreatedDate(order); + + + return DateTime.tryParse(raw??""); } String? _getCreatedDate(dynamic order) { diff --git a/lib/generated/locale_keys.g.dart b/lib/generated/locale_keys.g.dart index 5ced1efb..66c7c094 100644 --- a/lib/generated/locale_keys.g.dart +++ b/lib/generated/locale_keys.g.dart @@ -1748,5 +1748,11 @@ abstract class LocaleKeys { static const conformationCall = 'conformationCall'; static const radiologyLabResults = 'radiologyLabResults'; static const disclaimerRadiology = 'disclaimerRadiology'; + static const enterIdentificationNumberWithNoStar = 'enterIdentificationNumberWithNoStar'; + static const enterReferralNumber = 'enterReferralNumber'; + static const referralNumber = 'referralNumber'; + static const phoneHint = 'phoneHint'; + static const selectSearchCriteria = 'selectSearchCriteria'; + static const selectCriteria = 'selectCriteria'; } diff --git a/lib/presentation/e_referral/new_e_referral.dart b/lib/presentation/e_referral/new_e_referral.dart index 8631fa62..b9d54942 100644 --- a/lib/presentation/e_referral/new_e_referral.dart +++ b/lib/presentation/e_referral/new_e_referral.dart @@ -193,7 +193,7 @@ class _NewReferralPageState extends State { children: List.generate(3, (index) { // Fill current step and all previous completed steps if (index <= _currentStep) { - return StepperWidget(widthOfOneState, AppColors.primaryRedColor, true, 4.h); + return StepperWidget(widthOfOneState, AppColors.primaryRedColor, index == _currentStep, 4.h); } else { return StepperWidget(widthOfOneState, AppColors.greyLightColor, false, 4.h); } diff --git a/lib/presentation/e_referral/widget/e_referral_other_details.dart b/lib/presentation/e_referral/widget/e_referral_other_details.dart index 579f281f..c30b67c3 100644 --- a/lib/presentation/e_referral/widget/e_referral_other_details.dart +++ b/lib/presentation/e_referral/widget/e_referral_other_details.dart @@ -142,8 +142,8 @@ class _OtherDetailsStepState extends State { Widget _buildBranchField(BuildContext context, ReferralFormManager formManager) { return DropdownWidget( - labelText: 'Branch', - hintText: formManager.formData.branch?.desciption ?? "Select Branch", + labelText: LocaleKeys.branch.tr(), + hintText: formManager.formData.branch?.desciption ?? LocaleKeys.selectBranch.tr(), isEnable: false, hasSelectionCustomIcon: true, labelColor: Colors.black, diff --git a/lib/presentation/e_referral/widget/e_referral_patient_info.dart b/lib/presentation/e_referral/widget/e_referral_patient_info.dart index efbac168..a30c0c3e 100644 --- a/lib/presentation/e_referral/widget/e_referral_patient_info.dart +++ b/lib/presentation/e_referral/widget/e_referral_patient_info.dart @@ -2,9 +2,11 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'dart:ui' as ui; import 'package:hmg_patient_app_new/core/app_export.dart'; +import 'package:hmg_patient_app_new/core/app_state.dart'; import 'package:hmg_patient_app_new/core/utils/validation_utils.dart'; import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/features/hmg_services/models/resq_models/get_all_cities_resp_model.dart'; import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; import 'package:hmg_patient_app_new/presentation/e_referral/e_referral_form_manager.dart'; import 'package:provider/provider.dart'; @@ -14,6 +16,8 @@ import 'package:hmg_patient_app_new/widgets/dropdown/dropdown_widget.dart'; import 'package:hmg_patient_app_new/widgets/input_widget.dart'; import 'package:hmg_patient_app_new/widgets/common_bottom_sheet.dart'; +import '../../../core/dependencies.dart' show getIt; + class PatientInformationStep extends StatefulWidget { const PatientInformationStep({super.key}); @@ -171,8 +175,8 @@ class PatientInformationStepState extends State { Widget _buildPatientCityField(BuildContext context, ReferralFormManager formManager) { return DropdownWidget( - labelText: 'City', - hintText: formManager.formData.patientCity?.description ?? LocaleKeys.selectCity.tr(context: context), + labelText: LocaleKeys.city.tr(), + hintText: getLocaleDescription(formManager.formData.patientCity) ?? LocaleKeys.selectCity.tr(context: context), isEnable: false, hasSelectionCustomIcon: true, labelColor: Colors.black, @@ -187,6 +191,10 @@ class PatientInformationStepState extends State { }); } + String? getLocaleDescription(GetAllCitiesResponseModel? patientCity){ + return getIt.get().isArabic() ? patientCity?.descriptionN: patientCity?.description; + } + void _showCityBottomSheet(BuildContext context, ReferralFormManager formManager) { @@ -217,7 +225,7 @@ class PatientInformationStepState extends State { itemBuilder: (context, index) { final city = cities[index]; return ListTile( - title: (city.description ?? 'Unknown').toText14(), + title: (getLocaleDescription(city) ?? 'Unknown').toText14(), onTap: () { formManager.updatePatientCity(city); Navigator.pop(context); diff --git a/lib/presentation/e_referral/widget/e_referral_requester_form.dart b/lib/presentation/e_referral/widget/e_referral_requester_form.dart index d57abe23..926aab4f 100644 --- a/lib/presentation/e_referral/widget/e_referral_requester_form.dart +++ b/lib/presentation/e_referral/widget/e_referral_requester_form.dart @@ -116,9 +116,9 @@ class RequesterFormStepState extends State { Widget _buildRelationshipField(BuildContext context, ReferralFormManager formManager) { return DropdownWidget( labelText: LocaleKeys.relationship.tr(context: context), - hintText: formManager.formData.relationship?.textEn ?? LocaleKeys.selectRelation.tr(context: context), + hintText: formManager.formData.relationship?.text ?? LocaleKeys.selectRelation.tr(context: context), isEnable: false, - selectedValue: formManager.formData.relationship?.textEn ?? LocaleKeys.selectRelation.tr(context: context), + selectedValue: formManager.formData.relationship?.text ?? LocaleKeys.selectRelation.tr(context: context), errorMessage: formManager.errors.relationship, hasError: !ValidationUtils.isNullOrEmpty(formManager.errors.relationship), hasSelectionCustomIcon: false, @@ -182,7 +182,7 @@ class RequesterFormStepState extends State { itemBuilder: (context, index) { final relationship = hmgServicesVM.relationTypes[index]; return ListTile( - title:relationship.textEn?.toText14(), + title:relationship.text?.toText14(), onTap: () { formManager.updateRelationship(relationship); Navigator.pop(context); diff --git a/lib/presentation/e_referral/widget/search_e_referral_form.dart b/lib/presentation/e_referral/widget/search_e_referral_form.dart index 33697d5e..c19b8a40 100644 --- a/lib/presentation/e_referral/widget/search_e_referral_form.dart +++ b/lib/presentation/e_referral/widget/search_e_referral_form.dart @@ -1,6 +1,9 @@ import 'package:flutter/material.dart'; +import 'package:easy_localization/easy_localization.dart'; +import 'package:hmg_patient_app_new/core/app_export.dart'; import 'package:hmg_patient_app_new/core/utils/validation_utils.dart'; import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; import 'package:hmg_patient_app_new/presentation/e_referral/e_referral_form_manager.dart'; import 'package:provider/provider.dart'; import 'package:hmg_patient_app_new/core/app_assets.dart'; @@ -69,12 +72,13 @@ class SearchEReferralFormFormState extends State { autofocus: true, child: TextInputWidget( controller: _searchController, - padding: const EdgeInsets.symmetric(horizontal: 16.0), - hintText: formManager.searchCriteria == 0 ? "Enter Identification Number" : "Enter Referral Number", - labelText: formManager.searchCriteria == 0 ? "Identification Number" : "Referral Number", + hintText: formManager.searchCriteria == 0 ? LocaleKeys.enterIdentificationNumber.tr() : LocaleKeys.enterReferralNumber.tr(), + labelText: formManager.searchCriteria == 0 ? LocaleKeys.identificationNumber.tr() : LocaleKeys.referralNumber.tr(), keyboardType: TextInputType.number, fontFamily: "Poppins", errorMessage: formManager.errors.searchValue, + padding: EdgeInsets.symmetric(vertical: 14.h, horizontal: 16.h), + hasError: !ValidationUtils.isNullOrEmpty(formManager.errors.searchValue), onChange: (value) { formManager.updateSearchValue(value ?? ''); @@ -90,10 +94,10 @@ class SearchEReferralFormFormState extends State { autofocus: false, child: TextInputWidget( autoFocus: false, - labelText: 'Phone Number', - hintText: "5xxxxxxxx", + labelText: LocaleKeys.phoneNumber.tr(), + hintText: LocaleKeys.phoneHint.tr(), controller: _phoneController, - padding: const EdgeInsets.all(8), + padding: const EdgeInsets.symmetric(horizontal: 16.0, vertical: 8.0), keyboardType: TextInputType.number, fontFamily: "Poppins", onChange: (value) { @@ -122,8 +126,8 @@ class SearchEReferralFormFormState extends State { Widget _buildSelectionField(BuildContext context, ReferralFormManager formManager) { return DropdownWidget( - labelText: "Select the Search Criteria", - hintText: formManager.searchCriteria == 0 ? "Identification Number" : "Referral Number", + labelText: LocaleKeys.selectCriteria.tr(), + hintText: formManager.searchCriteria == 0 ? LocaleKeys.identificationNumber.tr() : LocaleKeys.referralNumber.tr(), isEnable: false, hasSelectionCustomIcon: false, labelColor: Colors.black, @@ -137,13 +141,13 @@ class SearchEReferralFormFormState extends State { void _showCriteriaBottomSheet(BuildContext context, ReferralFormManager formManager) { final criteriaList = [ - {0: 'Identification Number'}, - {1: 'Referral Number'}, + {0: LocaleKeys.identificationNumber.tr()}, + {1: LocaleKeys.referralNumber.tr()}, ]; showCommonBottomSheetWithoutHeight( context, - title: "Select Criteria", + title: LocaleKeys.selectCriteria.tr(), child: ListView.separated( shrinkWrap: true, physics: const BouncingScrollPhysics(), From 94993fa6fbdcd0f5fa763eee27e35d46ad8420f7 Mon Sep 17 00:00:00 2001 From: Sultan khan Date: Wed, 15 Apr 2026 14:19:12 +0300 Subject: [PATCH 37/45] fixes and updates --- .../book_appointment/select_clinic_page.dart | 3 +- .../hmg_services/widgets/weather_widget.dart | 2 +- ...scription_delivery_order_summary_page.dart | 8 +++ .../weather/weather_details_page.dart | 58 ++++++++++++++++++- 4 files changed, 66 insertions(+), 5 deletions(-) diff --git a/lib/presentation/book_appointment/select_clinic_page.dart b/lib/presentation/book_appointment/select_clinic_page.dart index 1cbe0e58..131b4d3d 100644 --- a/lib/presentation/book_appointment/select_clinic_page.dart +++ b/lib/presentation/book_appointment/select_clinic_page.dart @@ -62,7 +62,8 @@ class _SelectClinicPageState extends State { scheduleMicrotask(() { bookAppointmentsViewModel.getClinics(); }); - name = (widget.calculatorType!.name.toLowerCase() =="bmi"? widget.calculatorType!.name.toUpperCase(): widget.calculatorType!.name.toCamelCase)??""; + + name = (widget.calculatorType?.name.toLowerCase() =="bmi"? widget.calculatorType?.name.toUpperCase(): widget.calculatorType?.name.toCamelCase)??""; super.initState(); } diff --git a/lib/presentation/hmg_services/widgets/weather_widget.dart b/lib/presentation/hmg_services/widgets/weather_widget.dart index 4c353763..6c055e76 100644 --- a/lib/presentation/hmg_services/widgets/weather_widget.dart +++ b/lib/presentation/hmg_services/widgets/weather_widget.dart @@ -32,7 +32,7 @@ class WeatherWidget extends StatelessWidget { } String _formatDateTime(DateTime dateTime) { - final formatter = DateFormat('MMMM dd, yyyy - EEEE, HH:mm'); + final formatter = DateFormat('MMMM dd, yyyy - EEEE, HH:mm', 'en_US'); return formatter.format(dateTime); } diff --git a/lib/presentation/prescriptions/prescription_delivery_order_summary_page.dart b/lib/presentation/prescriptions/prescription_delivery_order_summary_page.dart index 3a287a44..b1d7b331 100644 --- a/lib/presentation/prescriptions/prescription_delivery_order_summary_page.dart +++ b/lib/presentation/prescriptions/prescription_delivery_order_summary_page.dart @@ -7,11 +7,13 @@ import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; import 'package:hmg_patient_app_new/features/prescriptions/prescriptions_view_model.dart'; import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; +import 'package:hmg_patient_app_new/presentation/prescriptions/prescription_delivery_orders_list_page.dart'; import 'package:hmg_patient_app_new/theme/colors.dart'; import 'package:hmg_patient_app_new/widgets/appbar/collapsing_list_view.dart'; import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart'; import 'package:hmg_patient_app_new/widgets/common_bottom_sheet.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'; class PrescriptionDeliveryOrderSummaryPage extends StatelessWidget { @@ -130,6 +132,12 @@ class PrescriptionDeliveryOrderSummaryPage extends StatelessWidget { child: Utils.getSuccessWidget(loadingText: LocaleKeys.requestSubmittedSuccessfully.tr(context: context)), callBackFunc: () { Navigator.of(context).pop(); + prescriptionsViewModel.getPrescriptionOrdersList(); + Navigator.of(context).push( + CustomPageRoute( + page: PrescriptionDeliveryOrdersListPage(), + ), + ); }, title: "", isCloseButtonVisible: true, diff --git a/lib/presentation/weather/weather_details_page.dart b/lib/presentation/weather/weather_details_page.dart index 0057f9b6..6943b3ee 100644 --- a/lib/presentation/weather/weather_details_page.dart +++ b/lib/presentation/weather/weather_details_page.dart @@ -42,6 +42,58 @@ class WeatherDetailsPage extends StatelessWidget { } } + /// Get color based on category label + Color _getColorFromCategory(String? categoryLabel) { + if (categoryLabel == null) return AppColors.successColor; + + final category = categoryLabel.toLowerCase().trim(); + + // Green: Low, Beneficial + if (category.contains('low') || category.contains('beneficial')) { + return AppColors.successColor; + } + // Yellow: Fair + else if (category.contains('fair')) { + return AppColors.warningColorYellow; + } + // Red: Very High, At High Risk + else if (category.contains('very high') || category.contains('at high risk')) { + return AppColors.errorColor; + } + // Orange: Risk, High (but not "very high" or "at high risk") + else if (category.contains('risk') || category.contains('high')) { + return AppColors.warningColor; + } + + return AppColors.successColor; // Default to green + } + + /// Get background color based on category label + Color _getBackgroundFromCategory(String? categoryLabel) { + if (categoryLabel == null) return AppColors.successLightColor.withValues(alpha: 0.1); + + final category = categoryLabel.toLowerCase().trim(); + + // Green: Low, Beneficial + if (category.contains('low') || category.contains('beneficial')) { + return AppColors.successLightColor.withValues(alpha: 0.1); + } + // Yellow: Fair + else if (category.contains('fair')) { + return AppColors.warningColorYellow.withValues(alpha: 0.1); + } + // Red: Very High, At High Risk + else if (category.contains('very high') || category.contains('at high risk')) { + return AppColors.errorLightColor.withValues(alpha: 0.1); + } + // Orange: Risk, High (but not "very high" or "at high risk") + else if (category.contains('risk') || category.contains('high')) { + return AppColors.warningLightColor.withValues(alpha: 0.1); + } + + return AppColors.successLightColor.withValues(alpha: 0.1); // Default to green + } + IconData _getIconFromCategory(String? category) { if (category == null) return Icons.wb_sunny_outlined; @@ -84,8 +136,8 @@ class WeatherDetailsPage extends StatelessWidget { return _buildCategoryCard( description: cityInfo.name ?? '', categoryLabel: cityInfo.category ?? '', - color: _getColorFromColorName(cityInfo.colorName), - backgroundColor: _getBackgroundColorFromColorName(cityInfo.colorName), + color: _getColorFromCategory(cityInfo.category), + backgroundColor: _getBackgroundFromCategory(cityInfo.category), icon: _getIconFromCategory(cityInfo.category), ); }), @@ -173,7 +225,7 @@ class WeatherDetailsPage extends StatelessWidget { ), child: categoryLabel.toText12( color: color, - fontWeight: FontWeight.w600, + isBold: true, maxLine: 1 ), ), From bf9b88e79c28f0574e75187a784a46be766f4266 Mon Sep 17 00:00:00 2001 From: tahaalam Date: Wed, 15 Apr 2026 14:22:58 +0300 Subject: [PATCH 38/45] map prescriptiojn changes date sorting for the rrt and amublance history. weather issue, e refferal langauge --- .../svg/location_unavailable_filled.svg | 4 + ...location_unavailable_filled_background.svg | 5 + assets/langs/ar-SA.json | 4 +- assets/langs/en-US.json | 3 +- lib/core/app_assets.dart | 2 + lib/core/location_util.dart | 26 ++- lib/core/utils/date_util.dart | 11 + .../emergency_services_view_model.dart | 8 +- .../location/location_view_model.dart | 7 +- .../prescriptions_view_model.dart | 5 +- lib/features/weather/weather_view_model.dart | 21 +- lib/generated/locale_keys.g.dart | 1 + .../RRT/rrt_map_screen.dart | 4 +- .../RRT/rrt_request_type_select.dart | 2 +- .../call_ambulance/call_ambulance_page.dart | 4 +- .../widget/ambulance_history_item.dart | 2 +- .../history/widget/rrt_item.dart | 2 +- .../widgets/location_input_bottom_sheet.dart | 5 +- .../hmg_services/services_page.dart | 2 +- .../hmg_services/widgets/weather_widget.dart | 192 ++++++++++++------ .../home_health_care/hhc_procedures_page.dart | 5 +- .../prescription_detail_page.dart | 2 +- .../prescriptions_list_page.dart | 2 +- lib/widgets/map/map_utility_screen.dart | 4 +- 24 files changed, 237 insertions(+), 86 deletions(-) create mode 100644 assets/images/svg/location_unavailable_filled.svg create mode 100644 assets/images/svg/location_unavailable_filled_background.svg diff --git a/assets/images/svg/location_unavailable_filled.svg b/assets/images/svg/location_unavailable_filled.svg new file mode 100644 index 00000000..8bc315c1 --- /dev/null +++ b/assets/images/svg/location_unavailable_filled.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/images/svg/location_unavailable_filled_background.svg b/assets/images/svg/location_unavailable_filled_background.svg new file mode 100644 index 00000000..cb3fa768 --- /dev/null +++ b/assets/images/svg/location_unavailable_filled_background.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/assets/langs/ar-SA.json b/assets/langs/ar-SA.json index de64d1ad..8e4dbce3 100644 --- a/assets/langs/ar-SA.json +++ b/assets/langs/ar-SA.json @@ -1763,6 +1763,6 @@ "referralNumber": "رقم الإحالة", "phoneHint": "5xxxxxxxx", "selectSearchCriteria": "اختر معيار البحث", - "selectCriteria": "اختيار المعيار" - + "selectCriteria": "اختيار المعيار", + "locationServicesDisabled": "حالة الطقس غير متوفرة لتعطيل خدمات الموقع. يرجى تفعيل خدمات الموقع لتتمكن من رؤية معلومات الطقس." } diff --git a/assets/langs/en-US.json b/assets/langs/en-US.json index bc596d82..f31a7166 100644 --- a/assets/langs/en-US.json +++ b/assets/langs/en-US.json @@ -1751,7 +1751,8 @@ "referralNumber": "Referral Number", "phoneHint": "5xxxxxxxx", "selectSearchCriteria": "Select the Search Criteria", - "selectCriteria": "Select Criteria" + "selectCriteria": "Select Criteria", + "locationServicesDisabled": "Weather is unavailable because location services are disabled. Please enable location services to see the weather information." } diff --git a/lib/core/app_assets.dart b/lib/core/app_assets.dart index aab9e25d..c3811a94 100644 --- a/lib/core/app_assets.dart +++ b/lib/core/app_assets.dart @@ -119,6 +119,8 @@ class AppAssets { static const String search_by_region_icon = '$svgBasePath/search_by_region_icon.svg'; static const String location_red = '$svgBasePath/location_red.svg'; static const String location_unavailable = '$svgBasePath/location_unavailable.svg'; + static const String location_unavailable_filled = '$svgBasePath/location_unavailable_filled.svg'; + static const String location_unavailable_filled_background = '$svgBasePath/location_unavailable_filled_background.svg'; static const String livecare_clinic_icon = '$svgBasePath/livecare_clinic_icon.svg'; static const String immediate_service_icon = '$svgBasePath/immediate_service_icon.svg'; static const String no_visit_icon = '$svgBasePath/no_visit_icon.svg'; diff --git a/lib/core/location_util.dart b/lib/core/location_util.dart index c56c63d4..52a2e93d 100644 --- a/lib/core/location_util.dart +++ b/lib/core/location_util.dart @@ -89,7 +89,7 @@ class LocationUtils { } } - LocationPermission permissionGranted = await Geolocator.checkPermission(); + LocationPermission permissionGranted = await Geolocator.checkPermission(); if (permissionGranted == LocationPermission.denied) { permissionGranted = await Geolocator.requestPermission(); if (permissionGranted != LocationPermission.whileInUse && permissionGranted != LocationPermission.always) { @@ -257,6 +257,30 @@ class LocationUtils { appState.userLong = locationData.longitude; } + Future isLocationPermissionEnabled() async { + if (Platform.isIOS || (await isGMSDevice ?? true)) { + return await _isGMSLocationPermissionEnabled(); + } else { + return await _isHMSLocationPermissionEnabled(); + } + } + + Future _isGMSLocationPermissionEnabled() async { + bool serviceEnabled = await Geolocator.isLocationServiceEnabled(); + if (!serviceEnabled) return false; + + LocationPermission permission = await Geolocator.checkPermission(); + return permission == LocationPermission.whileInUse || permission == LocationPermission.always; + } + + Future _isHMSLocationPermissionEnabled() async { + bool serviceEnabled = await Geolocator.isLocationServiceEnabled(); + if (!serviceEnabled) return false; + + LocationPermission permission = await Geolocator.checkPermission(); + return permission == LocationPermission.whileInUse || permission == LocationPermission.always; + } + void getHMSLocation({VoidCallback? onFailure, Function(LatLng p1)? onSuccess, VoidCallback? onLocationDeniedForever}) async { try { var location = Location(); diff --git a/lib/core/utils/date_util.dart b/lib/core/utils/date_util.dart index 6c4e7bec..5aa48b07 100644 --- a/lib/core/utils/date_util.dart +++ b/lib/core/utils/date_util.dart @@ -599,6 +599,17 @@ class DateUtil { return '${hours} hr ${minutes} min'; } + + /// Parses an ISO 8601 date string that may have more than 6 fractional-second digits. + /// e.g. '2026-04-12T12:07:35.4226413' → truncates to 6 digits before parsing. + static DateTime? parseISODate(String? date) { + if (date == null || date.isEmpty) return null; + final truncated = date.replaceFirstMapped( + RegExp(r'(\.\d{6})\d+'), + (m) => m.group(1)!, + ); + return DateTime.tryParse(truncated); + } } extension OnlyDate on DateTime { diff --git a/lib/features/emergency_services/emergency_services_view_model.dart b/lib/features/emergency_services/emergency_services_view_model.dart index b74318f4..83d2a564 100644 --- a/lib/features/emergency_services/emergency_services_view_model.dart +++ b/lib/features/emergency_services/emergency_services_view_model.dart @@ -54,6 +54,7 @@ import 'package:hmg_patient_app_new/widgets/map/map_utility_screen.dart'; import 'package:hmg_patient_app_new/widgets/order_tracking/order_tracking_state.dart'; import 'package:hmg_patient_app_new/widgets/routes/custom_page_route.dart'; import 'package:huawei_map/huawei_map.dart' as HMSCameraServices; +import 'package:provider/provider.dart'; import 'package:url_launcher/url_launcher.dart'; import '../location/GeocodeResponse.dart'; @@ -1010,8 +1011,8 @@ class EmergencyServicesViewModel extends ChangeNotifier { List _sortOrdersByDate(List list) { list.sort((a, b) { - final DateTime? dateA = _parseCreatedDate(a); - final DateTime? dateB = _parseCreatedDate(b); + final int? dateA = _parseCreatedDate(a)?.millisecondsSinceEpoch; + final int? dateB = _parseCreatedDate(b)?.millisecondsSinceEpoch; print("the dateA is $dateA and dateB is $dateB"); if (dateA == null && dateB == null) return 0; if (dateA == null) return 1; @@ -1034,7 +1035,7 @@ class EmergencyServicesViewModel extends ChangeNotifier { return null; } - void openRRT() { + void openRRT(BuildContext context) { if (appState.isAuthenticated) { if (agreedToTermsAndCondition == false) { dialogService.showErrorBottomSheet( @@ -1068,6 +1069,7 @@ class EmergencyServicesViewModel extends ChangeNotifier { return; } placeValueInController(); + context.read().placeValueInController(); locationUtils!.getLocation( isShowConfirmDialog: true, onSuccess: (position) async { diff --git a/lib/features/location/location_view_model.dart b/lib/features/location/location_view_model.dart index 5b0eef6d..460eb0f1 100644 --- a/lib/features/location/location_view_model.dart +++ b/lib/features/location/location_view_model.dart @@ -18,7 +18,6 @@ class LocationViewModel extends ChangeNotifier { final ErrorHandlerService errorHandlerService; LocationViewModel({required this.locationRepo, required this.errorHandlerService}) { - placeValueInController(); } List predictions = []; @@ -31,7 +30,9 @@ class LocationViewModel extends ChangeNotifier { Completer? gmsController; Completer? hmsController; - + get isGMSAvailable { + return getIt.get().isGMSAvailable; + } HMSCameraServices.CameraPosition getHMSLocation() { return HMSCameraServices.CameraPosition(target: HMSCameraServices.LatLng(getIt().userLat, getIt().userLong), zoom: 18); } @@ -43,7 +44,7 @@ class LocationViewModel extends ChangeNotifier { } void placeValueInController() async { - if (await getIt().isGMSAvailable) { + if (isGMSAvailable) { gmsController = Completer(); } else { hmsController = Completer(); diff --git a/lib/features/prescriptions/prescriptions_view_model.dart b/lib/features/prescriptions/prescriptions_view_model.dart index b9c29072..0f09f1e9 100644 --- a/lib/features/prescriptions/prescriptions_view_model.dart +++ b/lib/features/prescriptions/prescriptions_view_model.dart @@ -20,6 +20,7 @@ import 'package:hmg_patient_app_new/services/navigation_service.dart'; import 'package:hmg_patient_app_new/widgets/map/map_utility_screen.dart'; import 'package:hmg_patient_app_new/widgets/routes/custom_page_route.dart'; import 'package:permission_handler/permission_handler.dart'; +import 'package:provider/provider.dart'; class PrescriptionsViewModel extends ChangeNotifier { bool isPrescriptionsOrdersLoading = false; @@ -255,7 +256,9 @@ class PrescriptionsViewModel extends ChangeNotifier { ); } - void initiatePrescriptionDelivery() async { + void initiatePrescriptionDelivery(BuildContext context) async { + context.read().placeValueInController(); + getIt.get().getLocation( isShowConfirmDialog: true, onSuccess: (position) async { diff --git a/lib/features/weather/weather_view_model.dart b/lib/features/weather/weather_view_model.dart index 0e3a3285..874630d2 100644 --- a/lib/features/weather/weather_view_model.dart +++ b/lib/features/weather/weather_view_model.dart @@ -1,13 +1,17 @@ import 'package:flutter/cupertino.dart'; +import 'package:hmg_patient_app_new/core/dependencies.dart'; import 'package:hmg_patient_app_new/core/location_util.dart'; import 'package:hmg_patient_app_new/features/weather/models/waether_cities_model.dart'; import 'package:hmg_patient_app_new/features/weather/weather_repo.dart'; import 'package:hmg_patient_app_new/services/error_handler_service.dart'; +import '../../core/app_state.dart' show AppState; + class WeatherMonitorViewModel extends ChangeNotifier { WeatherRepo weatherRepo; ErrorHandlerService errorHandlerService; LocationUtils locationUtils; + bool isLocationAvailable = false; WeatherMonitorViewModel({required this.weatherRepo, required this.errorHandlerService, required this.locationUtils}); @@ -18,11 +22,12 @@ class WeatherMonitorViewModel extends ChangeNotifier { Future fetchCityInfoList({Function(dynamic)? onSuccess, Function(String)? onError}) async { isLoading = true; + notifyListeners(); _cityInfoList.clear(); - locationUtils.getLocation( isShowConfirmDialog: true, onSuccess: (position) async { + isLocationAvailable = true; final result = await weatherRepo.getCityInfo(); result.fold( (failure) async { @@ -52,4 +57,18 @@ class WeatherMonitorViewModel extends ChangeNotifier { ); }); } + + Future checkIfTheLocationIsEnabledOrNot() async { + bool value = await locationUtils.isLocationPermissionEnabled(); + isLocationAvailable = value; + notifyListeners(); + return value; + + } + + void initiateFetchWeather() async { + if(await checkIfTheLocationIsEnabledOrNot()){ + fetchCityInfoList(); + } + } } diff --git a/lib/generated/locale_keys.g.dart b/lib/generated/locale_keys.g.dart index 66c7c094..0452d7a1 100644 --- a/lib/generated/locale_keys.g.dart +++ b/lib/generated/locale_keys.g.dart @@ -1754,5 +1754,6 @@ abstract class LocaleKeys { static const phoneHint = 'phoneHint'; static const selectSearchCriteria = 'selectSearchCriteria'; static const selectCriteria = 'selectCriteria'; + static const locationServicesDisabled = 'locationServicesDisabled'; } diff --git a/lib/presentation/emergency_services/RRT/rrt_map_screen.dart b/lib/presentation/emergency_services/RRT/rrt_map_screen.dart index bd5407b6..1a603dc3 100644 --- a/lib/presentation/emergency_services/RRT/rrt_map_screen.dart +++ b/lib/presentation/emergency_services/RRT/rrt_map_screen.dart @@ -559,7 +559,9 @@ class RrtMapScreen extends StatelessWidget { context, child: SizedBox( height: MediaQuery.sizeOf(context).height * .8, - child: LocationInputBottomSheet(), + child: LocationInputBottomSheet( + moveCameraController:(location) => context.read().moveController(location) , + ), ), isFullScreen: false, isCloseButtonVisible: true, diff --git a/lib/presentation/emergency_services/RRT/rrt_request_type_select.dart b/lib/presentation/emergency_services/RRT/rrt_request_type_select.dart index 3b095ecf..79172db3 100644 --- a/lib/presentation/emergency_services/RRT/rrt_request_type_select.dart +++ b/lib/presentation/emergency_services/RRT/rrt_request_type_select.dart @@ -140,7 +140,7 @@ class RrtRequestTypeSelect extends StatelessWidget { ), CustomButton(text: LocaleKeys.next.tr(), onPressed: () { Navigator.pop(context); - emergencyServicesVM.openRRT(); + emergencyServicesVM.openRRT(context); }, isDisabled: !emergencyServicesVM.agreedToTermsAndCondition, ) diff --git a/lib/presentation/emergency_services/call_ambulance/call_ambulance_page.dart b/lib/presentation/emergency_services/call_ambulance/call_ambulance_page.dart index 3ac19814..c891e565 100644 --- a/lib/presentation/emergency_services/call_ambulance/call_ambulance_page.dart +++ b/lib/presentation/emergency_services/call_ambulance/call_ambulance_page.dart @@ -577,7 +577,9 @@ class CallAmbulancePage extends StatelessWidget { context, child: SizedBox( height: MediaQuery.sizeOf(context).height * .8, - child: LocationInputBottomSheet(), + child: LocationInputBottomSheet( + moveCameraController:(location) => context.read().moveController(location) , + ), ), isFullScreen: false, isCloseButtonVisible: true, diff --git a/lib/presentation/emergency_services/history/widget/ambulance_history_item.dart b/lib/presentation/emergency_services/history/widget/ambulance_history_item.dart index 67bdcbd8..52d820a3 100644 --- a/lib/presentation/emergency_services/history/widget/ambulance_history_item.dart +++ b/lib/presentation/emergency_services/history/widget/ambulance_history_item.dart @@ -42,7 +42,7 @@ class AmbulanceHistoryItem extends StatelessWidget { Row( spacing: 4.w, children: [ - chip(Utils.getDayMonthYearDateFormatted(DateUtil.convertStringToDate(order.time)), AppAssets.calendar, AppColors.blackBgColor), + chip(Utils.getDayMonthYearDateFormatted(DateUtil.parseISODate(order.created)), AppAssets.calendar, AppColors.blackBgColor), chip(LocaleKeys.ambulancerequest.tr(context: context), AppAssets.ambulance, AppColors.blackBgColor), ], ), diff --git a/lib/presentation/emergency_services/history/widget/rrt_item.dart b/lib/presentation/emergency_services/history/widget/rrt_item.dart index c85f12a5..d3c0e340 100644 --- a/lib/presentation/emergency_services/history/widget/rrt_item.dart +++ b/lib/presentation/emergency_services/history/widget/rrt_item.dart @@ -42,7 +42,7 @@ class RRTItem extends StatelessWidget { Row( spacing: 4.w, children: [ - chip(Utils.getDayMonthYearDateFormatted(DateUtil.convertStringToDate(order.time)), AppAssets.calendar, AppColors.blackBgColor), + chip(Utils.getDayMonthYearDateFormatted(DateUtil.parseISODate(order.created)), AppAssets.calendar, AppColors.blackBgColor), chip(LocaleKeys.rapidResponseTeam.tr(context: context), AppAssets.ic_rrt_vehicle, AppColors.blackBgColor), ], ), diff --git a/lib/presentation/emergency_services/widgets/location_input_bottom_sheet.dart b/lib/presentation/emergency_services/widgets/location_input_bottom_sheet.dart index 4b66abd9..9b1209c8 100644 --- a/lib/presentation/emergency_services/widgets/location_input_bottom_sheet.dart +++ b/lib/presentation/emergency_services/widgets/location_input_bottom_sheet.dart @@ -23,8 +23,9 @@ import '../../../theme/colors.dart'; class LocationInputBottomSheet extends StatelessWidget { final Debouncer debouncer = Debouncer(milliseconds: 500); + final Function(Location)? moveCameraController; - LocationInputBottomSheet({super.key}); + LocationInputBottomSheet({super.key, this.moveCameraController}); @override Widget build(BuildContext context) { @@ -106,7 +107,7 @@ class LocationInputBottomSheet extends StatelessWidget { Navigator.of(context).pop(); var location = context.read().placeDetails; if(location != null) { - context.read().moveController( + moveCameraController?.call( Location(lat: location.lat, lng: location.lng)); } }); diff --git a/lib/presentation/hmg_services/services_page.dart b/lib/presentation/hmg_services/services_page.dart index 56923038..734401fe 100644 --- a/lib/presentation/hmg_services/services_page.dart +++ b/lib/presentation/hmg_services/services_page.dart @@ -380,7 +380,7 @@ class _ServicesPageState extends State { // TODO: implement initState super.initState(); weatherVM = getIt(); - weatherVM.fetchCityInfoList(); + weatherVM.initiateFetchWeather(); } diff --git a/lib/presentation/hmg_services/widgets/weather_widget.dart b/lib/presentation/hmg_services/widgets/weather_widget.dart index 4c353763..27b13924 100644 --- a/lib/presentation/hmg_services/widgets/weather_widget.dart +++ b/lib/presentation/hmg_services/widgets/weather_widget.dart @@ -1,10 +1,12 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; import 'package:hmg_patient_app_new/core/app_export.dart'; import 'package:hmg_patient_app_new/core/utils/utils.dart'; import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; import 'package:hmg_patient_app_new/features/weather/weather_view_model.dart'; +import 'package:hmg_patient_app_new/features/weather/models/waether_cities_model.dart'; import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; import 'package:hmg_patient_app_new/presentation/weather/weather_details_page.dart'; import 'package:hmg_patient_app_new/theme/colors.dart'; @@ -39,15 +41,20 @@ class WeatherWidget extends StatelessWidget { @override Widget build(BuildContext context) { - return Consumer( - builder: (context, weatherVM, child) { - final currentCity = weatherVM.cityInfoList.isNotEmpty - ? weatherVM.cityInfoList.first - : null; + return Selector cityInfoList})>( + selector: (_, vm) => (isLoading: vm.isLoading, isLocationAvailable: vm.isLocationAvailable, cityInfoList: vm.cityInfoList), + builder: (context, state, child) { + if (state.isLoading) { + return _buildLoadingState().paddingSymmetrical(24.w, 0.w); + } + if (!state.isLocationAvailable) { + return noWeatherWidget(context).paddingSymmetrical(24.w, 0.w); + } + final currentCity = state.cityInfoList.isNotEmpty ? state.cityInfoList.first : null; final now = DateTime.now(); final temperature = currentCity?.temperature; - final healthTip = LocaleKeys.healthTipsBasedOnCurrentWeather.tr(); + final healthTip = LocaleKeys.healthTipsBasedOnCurrentWeather.tr(); return Row( children: [ @@ -59,69 +66,66 @@ class WeatherWidget extends StatelessWidget { borderRadius: 24.r, hasShadow: false, ), - child: weatherVM.isLoading - ? _buildLoadingState() - : Column( - children: [ - Row( + child: Column( + children: [ + Row( + children: [ + Utils.buildSvgWithAssets( + icon: _getWeatherIcon(currentCity?.categoryValue), + width: 64.w, + height: 64.w, + ), + SizedBox(width: 12.w), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, children: [ - Utils.buildSvgWithAssets( - icon: _getWeatherIcon(currentCity?.categoryValue), - width: 64.w, - height: 64.w, + _formatDateTime(now).toText12( + fontWeight: FontWeight.w500, + color: AppColors.greyTextColor, ), - SizedBox(width: 12.w), - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - _formatDateTime(now).toText12( - fontWeight: FontWeight.w500, - color: AppColors.greyTextColor, - ), - SizedBox(height: 4.w), - "$temperature°C" - .toText16( - isBold: true, - weight: FontWeight.w600, - ), - SizedBox(height: 4.w), - healthTip.toText12( - color: AppColors.greyTextColor, - fontWeight: FontWeight.w500, - maxLine: 2, - ), - ], - ), + SizedBox(height: 4.w), + "$temperature°C".toText16( + isBold: true, + weight: FontWeight.w600, + ), + SizedBox(height: 4.w), + healthTip.toText12( + color: AppColors.greyTextColor, + fontWeight: FontWeight.w500, + maxLine: 2, ), ], ), - if (showButton) ...[ - SizedBox(height: 16.w), - CustomButton( - text: LocaleKeys.viewDetails.tr(context: context), - onPressed: () { - Navigator.of(context).push( - CustomPageRoute( - page: ChangeNotifierProvider.value( - value: weatherVM, - child: const WeatherDetailsPage(), - ), - ), - ); - }, - padding: EdgeInsets.zero, - backgroundColor: AppColors.secondaryLightRedColor, - borderColor: AppColors.secondaryLightRedColor, - textColor: AppColors.primaryRedColor, - fontSize: 14.f, - fontWeight: FontWeight.w600, - borderRadius: 10.r, - height: 40.h, + ), + ], + ), + if (showButton) ...[ + SizedBox(height: 16.w), + CustomButton( + text: LocaleKeys.viewDetails.tr(context: context), + onPressed: () { + Navigator.of(context).push( + CustomPageRoute( + page: ChangeNotifierProvider.value( + value: context.read(), + child: const WeatherDetailsPage(), + ), ), - ], - ], + ); + }, + padding: EdgeInsets.zero, + backgroundColor: AppColors.secondaryLightRedColor, + borderColor: AppColors.secondaryLightRedColor, + textColor: AppColors.primaryRedColor, + fontSize: 14.f, + fontWeight: FontWeight.w600, + borderRadius: 10.r, + height: 40.h, ), + ], + ], + ), ), ), ], @@ -130,6 +134,70 @@ class WeatherWidget extends StatelessWidget { ); } + Widget noWeatherWidget(BuildContext context){ + return Container( + padding: EdgeInsets.all(16.w), + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 24.r, + hasShadow: false, + ), + child:Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + + Container( + height: 48.h, + width: 48.h, + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.greyColor, + borderRadius: 12.r, + hasShadow: false, + ), + child: Padding( + padding: EdgeInsets.all(12.h), + child: Utils.buildSvgWithAssets( + icon: AppAssets.location_unavailable_filled, + fit: BoxFit.contain, + applyThemeColor: false + ), + ), + ), + + + + SizedBox(width: 12.w), + Expanded( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.max, + children: [ + _formatDateTime(DateTime.now()).toText12( + fontWeight: FontWeight.w500, + color: AppColors.greyTextColor, + ), + SizedBox(height: 4.w), + + "--".toText16( + isBold: true, + weight: FontWeight.w600, + ), + SizedBox(height: 4.w), + LocaleKeys.locationServicesDisabled.tr().toText12( + color: AppColors.greyTextColor, + fontWeight: FontWeight.w500, + maxLine: 2, + ), + ], + ), + ), + ], + )).onPress((){ + context.read().fetchCityInfoList(); + }); + } + Widget _buildLoadingState() { return Column( children: [ diff --git a/lib/presentation/home_health_care/hhc_procedures_page.dart b/lib/presentation/home_health_care/hhc_procedures_page.dart index 2ece0598..fca3f9c4 100644 --- a/lib/presentation/home_health_care/hhc_procedures_page.dart +++ b/lib/presentation/home_health_care/hhc_procedures_page.dart @@ -12,6 +12,7 @@ import 'package:hmg_patient_app_new/features/authentication/authentication_view_ import 'package:hmg_patient_app_new/features/hmg_services/hmg_services_view_model.dart'; import 'package:hmg_patient_app_new/features/hmg_services/models/resq_models/get_cmc_all_orders_resp_model.dart'; import 'package:hmg_patient_app_new/features/hmg_services/models/resq_models/get_cmc_services_resp_model.dart'; +import 'package:hmg_patient_app_new/features/location/location_view_model.dart'; import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; import 'package:hmg_patient_app_new/presentation/home_health_care/hhc_order_detail_page.dart'; import 'package:hmg_patient_app_new/presentation/home_health_care/hhc_selection_review_page.dart'; @@ -395,9 +396,11 @@ class _HhcProceduresPageState extends State { final navigationServices = getIt.get(); final appState = getIt.get(); final hmgServicesViewModel = context.read(); + if (hmgServicesViewModel.selectedHhcServices.isNotEmpty) { - hmgServicesViewModel.setSelectedServiceForHhcOrder(hmgServicesViewModel.selectedHhcServices.first); + context.read().placeValueInController(); + hmgServicesViewModel.setSelectedServiceForHhcOrder(hmgServicesViewModel.selectedHhcServices.first); bool result = await navigationServices.push( CustomPageRoute( page: MapUtilityScreen( diff --git a/lib/presentation/prescriptions/prescription_detail_page.dart b/lib/presentation/prescriptions/prescription_detail_page.dart index f2ac16c9..a13dbcdd 100644 --- a/lib/presentation/prescriptions/prescription_detail_page.dart +++ b/lib/presentation/prescriptions/prescription_detail_page.dart @@ -250,7 +250,7 @@ class _PrescriptionDetailPageState extends State { LoaderBottomSheet.showLoader(loadingText: LocaleKeys.fetchingPrescriptionDetails.tr(context: context)); await prescriptionsViewModel.getPrescriptionDetails(widget.prescriptionsResponseModel, onSuccess: (val) { LoaderBottomSheet.hideLoader(); - prescriptionsViewModel.initiatePrescriptionDelivery(); + prescriptionsViewModel.initiatePrescriptionDelivery(context); }, onError: (err) { LoaderBottomSheet.hideLoader(); print(err); diff --git a/lib/presentation/prescriptions/prescriptions_list_page.dart b/lib/presentation/prescriptions/prescriptions_list_page.dart index 483b1ad0..1291c2da 100644 --- a/lib/presentation/prescriptions/prescriptions_list_page.dart +++ b/lib/presentation/prescriptions/prescriptions_list_page.dart @@ -195,7 +195,7 @@ class _PrescriptionsListPageState extends State { LoaderBottomSheet.showLoader(loadingText: LocaleKeys.fetchingPrescriptionDetails.tr(context: context)); await prescriptionsViewModel.getPrescriptionDetails(prescriptionsViewModel.patientPrescriptionOrders[index], onSuccess: (val) { LoaderBottomSheet.hideLoader(); - prescriptionsViewModel.initiatePrescriptionDelivery(); + prescriptionsViewModel.initiatePrescriptionDelivery(context); }); } }, diff --git a/lib/widgets/map/map_utility_screen.dart b/lib/widgets/map/map_utility_screen.dart index a24317e6..a1915f4d 100644 --- a/lib/widgets/map/map_utility_screen.dart +++ b/lib/widgets/map/map_utility_screen.dart @@ -210,7 +210,9 @@ class MapUtilityScreen extends StatelessWidget { context, child: SizedBox( height: MediaQuery.sizeOf(context).height * .8, - child: LocationInputBottomSheet(), + child: LocationInputBottomSheet( + moveCameraController:(location) => context.read().moveController(location) , + ), ), isFullScreen: false, isCloseButtonVisible: true, From 1515fc57e53600788cf0dfb5d09ba0ae5a0ee00d Mon Sep 17 00:00:00 2001 From: aamir-csol Date: Wed, 15 Apr 2026 14:43:44 +0300 Subject: [PATCH 39/45] Localization --- assets/langs/ar-SA.json | 109 +++++++++--------- assets/langs/en-US.json | 69 +++++------ .../widgets/otp_verification_screen.dart | 6 +- lib/generated/locale_keys.g.dart | 4 + .../widgets/appointment_card.dart | 2 +- .../authentication/quick_login.dart | 4 +- .../book_appointment_page.dart | 4 +- .../book_appointment/doctor_profile_page.dart | 2 +- .../widgets/appointment_calendar.dart | 2 +- .../add_health_tracker_entry_page.dart | 31 ++--- .../home/data/landing_page_data.dart | 8 +- lib/presentation/home/landing_page.dart | 4 +- .../home/widgets/habib_wallet_card.dart | 2 +- .../prescriptions/prescription_item_view.dart | 56 ++++----- .../family_files/family_file_add_widget.dart | 2 +- lib/widgets/map/map_utility_screen.dart | 3 +- 16 files changed, 152 insertions(+), 156 deletions(-) diff --git a/assets/langs/ar-SA.json b/assets/langs/ar-SA.json index 2ad381a8..4c365d5d 100644 --- a/assets/langs/ar-SA.json +++ b/assets/langs/ar-SA.json @@ -2,11 +2,11 @@ "english": "الإنجليزية", "arabic": "العربية", "login": "تسجيل الدخول", - "noDataAvailable": "لا توجد طلبات معلقة حالياً", + "noDataAvailable": "لا توجد طلبات", "noRatingAvailable": "لا يوجد تقييم متاح", "doctorDoesNotHaveRating": "لم يحصل هذا الطبيب على أي تقييمات بعد.", "confirm": "تأكيد", - "loadingText": "جارٍ التحقق...", + "loadingText": "يرجى الانتظار…", "kilometerUnit": "كم", "dashboardScreenToolbarTitle": "الرئيسية", "settings": "الإعدادات", @@ -21,7 +21,7 @@ "mySchedule": "جدولي", "logout": "تسجيل الخروج", "respirationRate": "معدل التنفس", - "bookAppo": "تأكيد الحجز", + "bookAppo": "حجز موعد", "searchBy": "البحث بواسطة:", "clinic": "عيادة", "byClinic": "حسب العيادة", @@ -40,7 +40,7 @@ "noResultFound": "لم يتم العثور على نتائج", "noSearchResultFound": "لم يتم العثور على نتائج", "pleaseEnterProductName": "يرجى إدخال اسم المنتج", - "bookNow": "تأكيد الحجز", + "bookNow": "حجز موعد", "docInfo": "معلومات الطبيب", "appoInfo": "معلومات الموعد", "availableAppo": "المواعيد المتاحة", @@ -95,7 +95,7 @@ "add": "إضافة", "reminder": "حفظ", "location": "المواقع", - "online": "عبر الإنترنت", + "online": "متصل", "payment": "الدفع", "onlinePayment": "عبر الإنترنت", "onlinePaymentSubtitle": "الدفع", @@ -126,7 +126,7 @@ "submit": "تحديث", "forgotDesc": "أدخل رقم الهاتف المحمول لاستلام رقم الملف الطبي عبر الرسائل القصيرة", "dob": "تاريخ الميلاد", - "hijriDate": "الت��ريخ الهجري", + "hijriDate": "التاريخ الهجري", "gregorianDate": "التاريخ الميلادي", "verifyLoginWith": "يرجى اختيار واحدة من الخيارات التالية للتحقق", "registerUser": "تسجيل", @@ -258,7 +258,7 @@ "comprehensiveMedicalCheckup": "فحص طبي شامل", "hmgService": "خدمة HMG", "viewAllHabibMedicalService": "عرض جميع خدمات الحبيب الطبية", - "viewAll": "عرض جميع الخدمات <", + "viewAll": "عرض الكل", "view": "عرض", "contactUs": "اتصل بنا", "contactUsLocation": "ص.ب: 91877 - الرياض 11643، طريق الملك فهد - العليا - المملكة العربية السعودية", @@ -330,7 +330,7 @@ "allergiesSubtitle": "القائمة", "myVaccines": "لقاحاتي", "myVaccinesSubtitle": "القائمة", - "medical": "طبي", + "medical": "الطبي", "medicalSubtitle": "التقرير", "monthly": "شهري", "monthlySubtitle": "التقرير", @@ -769,7 +769,7 @@ "infoTodo": "تم تصميم هذه الخدمة لتمكينك من الحصول على رابط سريع لقائمة المهام التي تحتاج القيام بها", "familyInfo": "من خلال هذه الخدمة، ستتمكن من ربط ملفات عائلتك الطبية بملفك الطبي حتى تتمكن من إدارة سجلاتهم عن طريق تسجيل الدخول إلى ملفك الطبي.", "rrtdDetails": "تقدم فريق الاستجابة السريعة خدمة طبية شاملة لجميع أنواع الحالات العاجلة والمستقرة من جميع الأعمار، بما في ذلك البالغين والمرضى الأطفال، وتغطي الخدمة فريق طبي مدرب تدريبًا عاليًا ومجهز تجهيزًا كاملاً قادرًا على تقديم أفضل رعاية طبية في منزل المريض.", - "homeHealthCareText": "أعلى معاييرالرعاية و الخدمات الطبية في راحة منزلك", + "homeHealthCareText": "أعلى معايير الرعاية و الخدمات الطبية في راحة منزلك", "onlineCheckInAgreement": "تسجيل الوصول عبر الإنترنت مخصص للحالات التي لا تهدد الحياة. اتصل بالهلال الأحمر (997) أو اذهب إلى أقرب قسم طوارئ إذا كان هناك: \n\nعلامات السكتة الدماغية أو النوبة القلبية \nhالة من النوبات أو الإغماء \nهناك إصابة تهدد الطرف أو الحياة \nصورة لإصابات خطيرة", "infoEreferral": "تتيح لك هذه الخدمة تقديم طلب إحالة من أي مقدم رعاية صحية سواء داخل أو خارج المملكة العربية السعودية إلى أي من مستشفيات HMG، عن طريق ملء بعض بيانات المريض وإرفاق التقارير الطبية، علاوة على ذلك يمكنك تتبع حالة الطلب (قيد المعالجة، مقبول أو مرفوض)", "erConsultation": "تتيح لك هذه الخدمة إجراء استشارة افتراضية عبر الإنترنت عبر مكالمة فيديو مباشرة مع الطبيب من أي مكان وفي أي وقت.", @@ -809,12 +809,12 @@ "checkAvailability": "التحقق من التوفر", "readInstructions": "قراءة التعليمات", "searchLabReport": "ابحث عن تقرير المختبر", - "prescriptionDeliveryError": "خدمة إعادة الصرف والتوصيل غير متاحة لهذه العيادة.", - "receiveOtpToast": "أين تود تلقي رمز التحقق OTP؟", + "prescriptionDeliveryError": "خدمة الصرف والتوصيل غير متاحة", + "receiveOtpToast": "رمز التحقق", "enterPhoneNumber": "إدخال رقم الجوال", "enterEmailDesc": "أدخل عنوان بريدك الإلكتروني لإكمال عملية إنشاء ملف طبي", "enterPhoneDesc": "أدخل رقم جوالك لاستلام رمز التحقق ", - "pleaseChooseOption": "الرجاء اختيار من الخيارات أدناه لتلقي رمز التحقق OTP", + "pleaseChooseOption": "اين ترغب في استلام رمز التحقق؟", "prepareToElevate": "رعايتك الصحية تبدأ من هنا", "iAcceptTermsConditions": "الموافقة على الشروط والأحكام", "alreadyHaveAccount": "لديك حساب؟", @@ -828,12 +828,14 @@ "uae": "الإمارات العربية المتحدة", "malE": "ذكر", "loginBy": "تسجيل الدخول بواسطة", - "loginByOTP": "تسجيل الدخول بواسطة OTP", + "loginByOTP": "تسجيل الدخول بواسطة رمزالتحقق", "guest": "زائر", "switchAccount": "تبديل الحساب", "lastLoginBy": "آخر تسجيل دخول بواسطة", - "allSet": "جاهز! الآن يمكنك تسجيل الدخول باستخدام Face ID أو البصمة", - "enableQuickLogin": "تمكين تسجيل الدخول السريع", + "allSet": "الآن يمكنك تسجيل الدخول باستخدام بصمة الوجه أو البصمة", + "quickLogin": "الدخول السريع", + "enableQuickLogin": "تسجيل الدخول السريع", + "enableQuickLoginBtn": "الدخول السريع", "enableMsg": "تمكين تسجيل الدخول السريع سيسمح بالتحقق من خلال Face ID / Biometric الخاص بجهازك الحالي", "notNow": "ليس الآن", "pendingActivation": "في انتظار التنشيط", @@ -852,8 +854,8 @@ "selectHospitalSubTitle": "يرجى اختيار المستشفى للموعد", "iAcceptThe": "أوافق على", "personalDetailsVerification": "التحقق من التفاصيل الشخصية", - "otpVerification": "إدخال رمز التحقق", - "weHaveSendOTP": "لقد أرسلنا OTP إلى", + "otpVerification": "رمز التحقق", + "weHaveSendOTP": "تم ارسال رمز التحقق الى", "via": "عبر", "forRegistrationVerification": "للتحقق من التسجيل", "didntReceiveIt": "لم يصلك الرمز؟", @@ -885,10 +887,10 @@ "hmgHospitals": "المستشفيات", "hmcMedicalClinic": "المراكز الطبية", "applyFilter": "تطبيق", - "facilityAndLocation": "المرفق والموقع", - "regionAndLocation": "المنطقة والمواقع", + "facilityAndLocation": "المنشآت", + "regionAndLocation": "المنطقة", "clearAllFilters": "اعادة تعيين", - "filters": "التخصيص", + "filters": "تحديد البحث", "searchClinic": "بحث عن عيادة", "normal": "طبيعي", "attention": "انتباه", @@ -903,7 +905,7 @@ "walkin": "موعد", "laserClinic": "عيادة الليزر", "continueString": "يكمل", - "covid_info": "تجري مستشفيات د. سليمان الحبيب فحص فيروس كورونا المستجد وتصدر شهادات السفر على مدار الساعة، طوال أيام الأسبوع، وبسرعة ودقة عالية. يمكن للراغبين في الاستفادة من هذه الخدمة زيارة أحد فروع مستشفيات د. سليمان الحبيب وإجراء فحص كورونا خلال بضع دقائق والحصول على النتائج خلال عدة ساعات خدمة فحص فيروس كورونا Covid 19 بتقنية PCR للكشف عن الفيروس وفقاً لأعلى المعايير العالمية وبأحدث أجهزة RT-PCR عالية الدقة (GeneXpert الأمريكي وغيره)، وهي طرق معتمدة من قبل هيئة الغذاء والدواء وكذلك من قبل المركز السعودي للوقاية من الأمراض المُعدية", + "covid_info": "تجري مستشفيات د. سليمان الحبيب فحص فيروس كورونا المستجد وتصدر شهادات السفر على مدار الساعة، طوال أيام الأسبوع، وبسرعة ودقة عالية. يمكن للراغبين في الاستفادة من هذه الخدمة زيارة أحد فروع مستشفيات د. سليمان الحبيب وإجراء فحص كورونا خلال بضع دقائق والحصول على النتائج خلال عدة ساعات خدمة فحص فيروس كورونا Covid 19 بتقنية PCR للكشف عن الفيروس وفقاً لأعلى المعايير العالمية وبأحدث أجهزة RT-PCR عالية الدقة (GeneXpert الأمريكي وغيره)، وهي طرق معتمدة من قبل هيئة الغذاء والدواء وكذلك من قبل المركز السعودي للوقاية من الأمراض المُعدية", "appointmentDetails": "تفاصيل الموعد", "checkingDoctorAvailability": "جاري التحقق من توفر الطبيب...", "cancellingAppointmentPleaseWait": "جاري إلغاء الموعد، يرجى الانتظار...", @@ -928,7 +930,7 @@ "paymentFailedPleaseTryAgain": "فشل الدفع! يرجى المحاولة مرة أخرى.", "appointmentCheckIn": "تسجيل حضور الموعد", "insuranceExpiredOrInactive": "التأمين غير ساري (منتهي او غير مفعل)", - "totalAmountToPay": "المبلغ الإجمالي المستحق", + "totalAmountToPay": "المبلغ الإجمالي", "vat15": "ضريبة القيمة المضافة (15%)", "general": "عام", "liveCare": "لايف كير", @@ -970,22 +972,22 @@ "viewNearestAppos": "عرض أقرب المواعيد المتاحة", "noDoctorFound": "لم يتم العثور على طبيب مطابق للمعايير المحددة...", "yesPleasImInAHurry": "نعم من فضلك، أنا في عجلة من أمري", - "fetchingFeesPleaseWait": "جاري جلب الرسوم، يرجى الانتظار...", + "fetchingFeesPleaseWait": "يرجى الانتظار...", "noThanksPhysicalVisit": "لا، شكراً. أفضل الزيارة الشخصية", "offline": "غير متصل", "videoCall": "مكالمة فيديو", - "liveVideoCallWithHMGDoctors": "مكالمة فيديو مباشرة مع أطباء مجموعة الحبيب الطبية", - "liveAudioCallWithHMGDoctors": "مكالمة صوتية مباشرة مع أطباء مجموعة الحبيب الطبية", + "liveVideoCallWithHMGDoctors": "مكالمة فيديو مباشرة مع مختص", + "liveAudioCallWithHMGDoctors": "مكالمة صوتية مباشرة مع مختص", "audioCall": "مكالمة صوتية", "phoneCall": "مكالمة هاتفية", - "livePhoneCallWithHMGDoctors": "مكالمة هاتفية مباشرة مع أطباء مجموعة الحبيب الطبية", - "reviewLiveCareRequest": "مراجعة طلب لايف كير", - "selectedLiveCareType": "نوع لايف كير المحدد", - "selectLiveCareCallType": "اختر نوع مكالمة لايف كير", + "livePhoneCallWithHMGDoctors": "مكالمة هاتفية مباشرة مع مختص", + "reviewLiveCareRequest": "تفاصيل الطلب", + "selectedLiveCareType": "نوع الطلب", + "selectLiveCareCallType": "نوع مكالمة لايف كير", "confirmingLiveCareRequest": "جاري تأكيد طلب لايف كير، يرجى الانتظار...", "unknownErrorOccurred": "حدث خطأ غير معروف...", "liveCarePermissionsMessage": "يتطلب لايف كير أذونات الكاميرا والميكروفون والموقع والإشعارات لتمكين الاستشارة الافتراضية بين المريض والطبيب، يرجى السماح بهذه الأذونات للمتابعة.", - "liveCarePayment": "دفع لايف كير", + "liveCarePayment": "الدفع", "mada": "مدى", "visaOrMastercard": "فيزا أو ماستركارد", "tamara": "تمارا", @@ -1008,7 +1010,7 @@ "bookingWaitingAppointment": "جاري حجز موعد الانتظار، يرجى الانتظار...", "enterValidIDorIqama": "يرجى إدخال رقم هوية وطنية أو رقم ملف صالح", "selectAppointment": "اختر الموعد", - "rebookSameDoctor": "أعد الحجز مع نفس الطبيب", + "rebookSameDoctor": "حجز موعد", "queueing": "قائمة الانتظار", "inQueue": "في قائمة الانتظار", "yourTurn": "دورك", @@ -1097,11 +1099,11 @@ "hereIsYourReferralNumber": "هذا هو رقم الإحالة الخاص بك #: ", "searchEReferral": "البحث عن إحالة إلكترونية", "enterRequiredInfoToSearch": "يرجى إدخال المعلومات المطلوبة للبحث عن إحالة إلكترونية", - "selectPickupDirection": "اختر اتجاه الاستلام", + "selectPickupDirection": "اختر الاتجاه", "selectDirection": "اختر الاتجاه", "toHospital": "إلى المستشفى", "fromHospital": "من المستشفى", - "selectWay": "اختر الطريقة", + "selectWay": "الاتجاهات", "oneWay": "اتجاه واحد", "twoWay": "اتجاهين", "selectPickupDetails": "اختر تفاصيل الاستلام", @@ -1113,7 +1115,7 @@ "haveAnyAppointment": "هل لديك أي موعد", "amountPaidAtHospital": "الدفع عند الوصول للمستشفى", "submitRequest": "تأكيد الطلب", - "enterPickupLocationManually": "أدخل موقع الاستلام يدوياً", + "enterPickupLocationManually": "تحديد موقع الاستلام", "enterPickupLocation": "أدخل موقع الاستلام", "trackingDetails": "تفاصيل التتبع", "cancelRequest": "إلغاء الطلب", @@ -1149,13 +1151,13 @@ "confirmation": "استمرار", "areYouSureYouWantToCallAmbulance": "هل تود تأكيد طلب سيارة الإسعاف؟", "getDetailsOfNearestBranch": "الحصول على تفاصيل أقرب مركز طوارئ والاتجاهات إليه", - "areYouSureYouWantToCallRRT": "هل أنت متأكد أنك تريد استدعاء فريق الاستجابة السريعة (RRT)؟", + "areYouSureYouWantToCallRRT": "هل تريد استدعاء فريق الاستجابة السريعة؟", "priorERCheckInToSkipLine": "تسجيل الوصول المسبق في الطوارئ لتجاوز الطابور والدفع في الاستقبال.", - "areYouSureYouWantToMakeERCheckIn": "هل أنت متأكد أنك تريد إجراء تسجيل وصول الطوارئ؟", - "checkingYourERAppointmentStatus": "جارٍ التحقق من حالة طلبك...", + "areYouSureYouWantToMakeERCheckIn": "هل تريد إجراء تسجيل وصول الطوارئ؟", + "checkingYourERAppointmentStatus": "يرجى الانتظار…", "transportOptions": "خيارات النقل", "selectHospitalForAdvancePayment": "يرجى تحديد المستشفى أولاً.", - "recharge": "إعادة الشحن", + "recharge": "اضافة رصيد", "activityLevel": "مستوى النشاط", "selectActivityLevel": "حدد مستوى النشاط", "caloriesPerDay": "السعرات الحرارية في اليوم الواحد", @@ -1287,8 +1289,8 @@ "requestedServices": "الخدمات المطلوبة", "selectServices": "اختر الخدمات", "selectedServices": "الخدمات المختارة", - "createNewRequest": "إنشاء طلب جديد", - "youHaveNoPendingRequests": "ليس لديك أي طلبات معلقة.", + "createNewRequest": "طلب جديد", + "youHaveNoPendingRequests": "ليس لديك أي طلبات", "noInsuranceDataFound": "لم يتم العثور على بيانات التأمين...", "noInsuranceUpdateRequest": "لم يتم العثور على أي طلبات لتحديث بيانات التأمين.", "policyNumberInsurancePage": "الوثيقة: {number}", @@ -1427,7 +1429,7 @@ "colorScience": "دلالات الألوان", "noNeedToVisitDoctor": "لا حاجة لزيارة الطبيب", "commonSymptom": "الأعراض الشائعة", - "bookAppointment": "احجز موعد", + "bookAppointment": "حجز موعد", "notApplicable": "لا ينطبق", "emergencyTriage": "طوارئ", "emergencyEvidenceDetected": "تم اكتشاف دليل طوارئ. يرجى طلب العناية الطبية.", @@ -1563,9 +1565,9 @@ "insuranceAndPayments": "التأمين والمدفوعات", "trackerAndOthers": "المتتبع وأخرى", "bmi": "مؤشر كتلة الجسم", - "yesPleaseINeedHelp": "نعم، من فضلك أريد المساعدة", + "yesPleaseINeedHelp": "نعم، احتاج مساعدة", "aiOverView": "AI ملخص", - "generateAiAnalysis": "التحليل باستخدام الذكاء الاصطناعي", + "generateAiAnalysis": "تحليل الذكاء الاصطناعي", "aiAnalysis": "تحليل الذكاء الاصطناعي", "prediction": "التوقعات", "prevention": "الوقاية", @@ -1611,7 +1613,7 @@ "servicePriceListRights": "يحق للمريض الحصول على متابعة مجانية في غضون 14 يومًا من الزيارة الأولى", "serviceName": "اسم الخدمة", "noFreeSlot": "لا توجد مواعيد متاحة في التاريخ المحدد. يرجى اختيار تاريخ آخر أو إعادة المحاولة لاحقاً.", - "noThanksIKnowTheClinic": "لا، شكراً. أنا أعرف العيادة.", + "noThanksIKnowTheClinic": "لا، شكراً", "unableToSendOTP": "تعذر إرسال رمز التحقق لمرة واحدة", "loadingAIAnalysis": "جارٍ تحليل النتائج بواسطة الذكاء الاصطناعي، يرجى الانتظار...", "symptoms": "مدقق الاعراض", @@ -1653,10 +1655,9 @@ "sortByNearestLocation": "حسب الأقرب الى موقعك", "giveLocationPermissionForNearestList": "يرجى منح إذن الوصول إلى الموقع من إعدادات التطبيق لعرض أقرب المواقع.", "sortByLocation": "الترتيب حسب الموقع", - "timeForFirstReminder": "وقت التذكير الأول", + "timeForFirstReminder": "اضافةتذكير", "reminderRemovalNote": "يمكنك إلغاء التذكير لاحقاً من التقويم.", "communicationLanguage": "لغة التواصل", - "cmcServiceHeader": "فحص صحي شامل: تشخيص متقدم، معلومات صحية مفصلة", "cmcServiceDescription": "احصل على معلومات تفصيلية عن صحتك من خلال خدمات التشخيص المتقدمة لدينا. افهم جسمك بشكل أفضل لمستقبل صحي.", "eReferralServiceHeader": "نظام الإحالة الإلكترونية في مستشفى حبيب: تبسيط عملية إحالة المرضى", @@ -1685,8 +1686,8 @@ "acknowledged": "إغلاق", "searchLabResults": "بحث نتائج المختبر", "callForAssistance": "اتصل للحصول على المساعدة الفورية", - "oneWaySubtitle": "نقل م ن الموقع إلى المستشفى", - "twoWaySubtitle": "نقل من الموقع إلى المستشفى والعودة مرة أخرى", + "oneWaySubtitle": "نقل من الموقع إلى المستشفى", + "twoWaySubtitle": "نقل من الموقع إلى المستشفى والعودة", "toHospitalSubtitle": "نقل من موقعك الحالي إلى المستشفى", "fromHospitalSubtitle": "نقل من المستشفى إلى منزلك", "clinicSchedule": "جدول العيادة", @@ -1697,7 +1698,7 @@ "pendingAncillaryOrders": "مدفوعات طلبات الاضافية", "liveCarePermissions": "يتطلب لايف كير أذونات الكاميرا والميكروفون وإشعارات، يرجى السماح لها بالمتابعة.", "containsImage": "يحتوي على صورة", - "servicesSelected": "الخدمة (الخدمات) المختارة", + "servicesSelected": "الخدمة / الخدمات", "selectMedicalFileFromFamily": "اختر ملف طبي من عائلتك", "anyFileFromHMG": "أي ملف طبي نشط من مجموعة حبيب الطبية", "noDistance": "المسافة غير متوفرة", @@ -1723,7 +1724,7 @@ "openCamera": "افتح الكاميرا", "openGallery": "افتح المعرض", "openFiles": "فتح الملفات", - "generateAiAnalysisRadResult": "نتيجة الاشعة بالذكاء الاصطناعي", + "generateAiAnalysisRadResult": "النتيجة بالذكاء الاصطناعي", "grantLocationPermission": "يرجى منح إذن الوصول إلى الموقع من إعدادات التطبيق للحصول على نتائج أفضل.", "NoBookedAppointments": "لا توجد مواعيد محجوزة", "aiDisclaimerRad": "سيتم مشاركة بيانات نتائج الأشعة الخاصة بك بشكل آمن مع محلل الذكاء الاصطناعي لدينا لتحليلها. يساعد هذا في توفير رؤى صحية مخصصة. هل ترغب في المتابعة؟", @@ -1745,7 +1746,7 @@ "sendingAskDrRequest": "جارٍ إرسال الطلب...", "askDrRequestSentSuccess": "تم إرسال الطلب بنجاح، وسيتواصل معك الطبيب قريباً.", "onlineCheckIn24HoursOnly": "لا تتوفر خدمة تسجيل الوصول عبر الإنترنت إلا خلال 4 ساعات من موعد الحجز.لا تتوفر خدمة تسجيل الوصول عبر الإنترنت إلا خلال 4 ساعات من موعد الحجز.", - "searchFor" : "بحث عن", + "searchFor": "بحث عن", "m": "متر", "inch": "انش", "updateEmailAddressTitle": "أدخل البريد الإلكتروني الجديد: ", @@ -1757,7 +1758,7 @@ "calculateCaloriesBasedOnFactors": "حساب السعرات الحرارية اليومية بناءً على عدة عوامل مثل الطول، الوزن، العمر، الجنس، والنشاط البدني اليومي.", "conformationCall": "ستتلقى مكالمة لتأكيد طلبك قريباً.", "radiologyLabResults": "نتائج الأشعة", - "disclaimerRadiology": "تم تحليل نتائج الأشعة هذه بواسطة الذكاء الاصطناعي، وهي لا تُعدّ نصيحة طبية. استشر طبيبك المختص للتشخيص والعلاج." - - + "disclaimerRadiology": "تم تحليل نتائج الأشعة هذه بواسطة الذكاء الاصطناعي، وهي لا تُعدّ نصيحة طبية. استشر طبيبك المختص للتشخيص والعلاج.", + "selectDateTimeKey": "اختيار", + "medicalKey": "الطبية" } diff --git a/assets/langs/en-US.json b/assets/langs/en-US.json index 7c4f2ab4..f473e9ae 100644 --- a/assets/langs/en-US.json +++ b/assets/langs/en-US.json @@ -6,7 +6,7 @@ "noRatingAvailable": "No Rating Available", "doctorDoesNotHaveRating": "This doctor does not have any ratings yet.", "confirm": "Confirm", - "loadingText": "Loading, please wait...", + "loadingText": "Please wait...", "kilometerUnit": "KM", "dashboardScreenToolbarTitle": "Home", "settings": "Settings", @@ -21,7 +21,7 @@ "mySchedule": "My Schedule", "logout": "Logout", "respirationRate": "Respiration Rate", - "bookAppo": "Book Appointment", + "bookAppo": "New Appointment", "searchBy": "Search By:", "clinic": "Clinic", "byClinic": "By Clinic", @@ -443,7 +443,7 @@ "serviceInformation": "Service Information", "homeHealthCare": "Home Health Care", "noAppointmentAvailable": "No Available Appointments", - "homeHealthCareText": "Clinical excellence and specialized care in the comfort of your own home", + "homeHealthCareText": "Clinical excellence and specialized care in the comfort of your home", "loginRegister": "Login/Register", "orderLog": "Order Log", "infoLab": "This service allows you to view the results of all laboratory tests performed in Al Habib Medical Group as well as sending the report via e-mail.", @@ -791,11 +791,11 @@ "aboutApp": "About the app", "aboutPoints": "Online Appointment Booking & rescheduling, Insurance approval status, Find A doctor, Ask your doctor, Medical prescriptions, Lab results, Hospitals contact numbers, Doctor profiles, Hospitals locations, Pharmacies Locations, Hospital's Virtual Tour, Official Social Media, Vaccines Schedule, Health Calculators, Other Services", "termsConditions": "These Online Services Terms of Use (Service Terms) govern certain online services provided by Dr Sulaiman Al Habib Medical Services Group Company (HMG, we, us, our)...", - "receiveOtpToast": "Where would you like to receive OTP?", + "receiveOtpToast": "OTP", "enterPhoneNumber": "Enter Phone Number", "enterEmailDesc": "Enter your email address to complete the process of creating a medical file", "enterPhoneDesc": "Enter your phone number to receive OTP verification code", - "pleaseChooseOption": "Please select from the below options to receive OTP", + "pleaseChooseOption": "Please select an option below to receive your OTP.", "dontHaveAccount": "Don't have an account?", "loginOrRegister": "Login or Register", "myFiles": "My Files", @@ -812,8 +812,8 @@ "loginNow": "Login Now", "notice": "Notice", "oR": "OR", - "sendOTPWHATSAPP": "Send me OTP on Whatsapp", - "sendOTPSMS": "Send me OTP on SMS", + "sendOTPWHATSAPP": "Whatsapp", + "sendOTPSMS": "SMS", "fullName": "Full Name", "married": "Married", "uae": "United Arab Emirates", @@ -822,8 +822,10 @@ "loginByOTP": "Login By OTP", "guest": "Guest", "switchAccount": "Switch Account", - "allSet": "All Set! Now you can login with Face ID or Biometric", + "allSet": "Now you can login with Face ID or Biometric", + "quickLogin": "Quick Login", "enableQuickLogin": "Enable Quick Login", + "enableQuickLoginBtn": "Quick Login", "enableMsg": "Enabling the quick login will verify through your existing device Face ID / Biometric", "notNow": "Not Now", "pendingActivation": "Pending Activation", @@ -919,7 +921,7 @@ "paymentFailedPleaseTryAgain": "Payment Failed! Please try again.", "appointmentCheckIn": "Appointment check in", "insuranceExpiredOrInactive": "Insurance expired or inactive", - "totalAmountToPay": "Total amount to pay", + "totalAmountToPay": "Total Amount", "vat15": "VAT 15%", "general": "General", "liveCare": "LiveCare", @@ -934,7 +936,7 @@ "immediateConsultation": "Immediate Consultation", "scheduledConsultation": "Scheduled Consultation", "pharmaLiveCare": "Pharma LiveCare", - "notSureHelpMeChooseClinic": "Not sure? help me choose a clinic!", + "notSureHelpMeChooseClinic": "Need help choosing a clinic?", "mentionYourSymptomsAndFindDoctors": "Tell us your symptoms, and we’ll recommend the best-suited specialists for your care", "immediateService": "Immediate service", "noNeedToWaitGetMedicalConsultation": "No need to wait, you will get medical consultation immediately via video call", @@ -961,22 +963,22 @@ "viewNearestAppos": "View nearest available appointments", "noDoctorFound": "No Doctor found for selected criteria...", "yesPleasImInAHurry": "Yes please, I am in a hurry", - "fetchingFeesPleaseWait": "Fetching fees, Please wait...", + "fetchingFeesPleaseWait": "Please wait...", "noThanksPhysicalVisit": "No, Thanks. I would like a physical visit", "offline": "Offline", "videoCall": "Video Call", - "liveVideoCallWithHMGDoctors": "Live Video Call with HMG Doctors", - "liveAudioCallWithHMGDoctors": "Live Audio Call with HMG Doctors", + "liveVideoCallWithHMGDoctors": "Live video call with a specialist", + "liveAudioCallWithHMGDoctors": "Live audio call with a specialist", "audioCall": "Audio Call", "phoneCall": "Phone Call", - "livePhoneCallWithHMGDoctors": "Live Phone Call with HMG Doctors", - "reviewLiveCareRequest": "Review LiveCare Request", - "selectedLiveCareType": "Selected LiveCare Type", - "selectLiveCareCallType": "Select LiveCare call type", + "livePhoneCallWithHMGDoctors": "Live phone call with a specialist", + "reviewLiveCareRequest": "LiveCare Request Details", + "selectedLiveCareType": "LiveCare Type", + "selectLiveCareCallType": "LiveCare Call Type", "confirmingLiveCareRequest": "Confirming LiveCare request, Please wait...", "unknownErrorOccurred": "Unknown error occurred...", "liveCarePermissionsMessage": "LiveCare requires Camera, Microphone, Location & Notifications permissions to enable virtual consultation between patient & doctor, Please allow these to proceed.", - "liveCarePayment": "LiveCare Payment", + "liveCarePayment": "Payment", "mada": "Mada", "visaOrMastercard": "Visa or Mastercard", "tamara": "Tamara", @@ -998,8 +1000,8 @@ "processingCheckIn": "Processing Check-In...", "bookingWaitingAppointment": "Booking Waiting Appointment, Please wait...", "enterValidIDorIqama": "Please enter a valid national ID or file number", - "selectAppointment": "Select Axppointment", - "rebookSameDoctor": "Rebook with same doctor", + "selectAppointment": "Select Appointment", + "rebookSameDoctor": "New Appointment", "queueing": "Queueing", "inQueue": "In Queue", "yourTurn": "Your Turn", @@ -1088,7 +1090,7 @@ "hereIsYourReferralNumber": "Here is your Referral #: ", "searchEReferral": "Search E-Referral", "enterRequiredInfoToSearch": "Please enter the required information to search for an e-referral", - "selectPickupDirection": "Select Pickup Direction", + "selectPickupDirection": "Pickup Direction", "selectDirection": "Select Direction", "toHospital": "To Hospital", "fromHospital": "From Hospital", @@ -1143,10 +1145,10 @@ "areYouSureYouWantToCallRRT": "Are you sure you want to call Rapid Response Team (RRT)?", "priorERCheckInToSkipLine": "Prior ER Check-In to skip the line & payment at the reception.", "areYouSureYouWantToMakeERCheckIn": "Are you sure you want to request an online ER check-in?", - "checkingYourERAppointmentStatus": "Checking your ER Appointment status...", + "checkingYourERAppointmentStatus": "Please Wait...", "transportOptions": "Transport Options", "selectHospitalForAdvancePayment": "Please select the hospital you want to make an advance payment for.", - "recharge": "Recharge", + "recharge": "Add Funds", "activityLevel": "Activity Level", "selectActivityLevel": "Select Activity Level", "caloriesPerDay": "Calories Per Day", @@ -1230,7 +1232,7 @@ "medicalAndCareServices": "Medical & Healthcare Services", "hmgServices": "HMG Services", "personalServices": "Personal Services", - "habibWallet": "Habib Wallet", + "habibWallet": "HMG Wallet", "habibWallet2": "Habib Wallet", "loginToViewWalletBalance": "Login to view your wallet balance", "loginToViewMedicalFile": "Login to view your medical file", @@ -1276,8 +1278,8 @@ "requestedServices": "Requested Services", "selectServices": "Select Services", "selectedServices": "Selected Services", - "createNewRequest": "Create new request", - "youHaveNoPendingRequests": "You have no pending requests.", + "createNewRequest": "New Request", + "youHaveNoPendingRequests": "You have no pending requests", "noInsuranceinsurance2DataFound": "No insurance data found...", "noInsuranceUpdateRequest": "No insurance update requests found.", "policyNumberInsurancePage": "Policy: {number}", @@ -1296,7 +1298,7 @@ "lastTested": "Last Tested", "byVisit": "By Visit", "byTest": "By Test", - "results": "results", + "results": "Results", "viewResults": "View Results", "rebook": "Rebook", "noOphthalmologyAppointments": "No Ophthalmology appointments found...", @@ -1554,7 +1556,7 @@ "insuranceAndPayments": "Insurance & Payments", "trackerAndOthers": "Tracker & Others", "bmi": "BMI", - "yesPleaseINeedHelp": "Yes, Please I need help", + "yesPleaseINeedHelp": "Yes, Please", "confirmYourLocation": "Confirm Your Location", "confirmYourLocationDesc": "Please confirm your present location to view appropriate directions.", "insideHospital": "I am inside the hospital", @@ -1564,7 +1566,7 @@ "servicePriceListRights": "The patient has the right to a free follow-up within 14 days of initial visit", "serviceName": "Service Name", "noFreeSlot": "No free slot available for the selected date. Please select another date or check back later.", - "noThanksIKnowTheClinic": "No, Thanks. I Know the clinic", + "noThanksIKnowTheClinic": "No, Thanks", "unableToSendOTP": "Unable to send Verification OTP", "aiOverView": "AI Overview", "generateAiAnalysis": "Generate AI analysis for this order", @@ -1640,7 +1642,7 @@ "verifyInsurance": "Verify Insurance", "tests": "tests", "calendarPermissionAlert": "Please grant calendar access permission from app settings to set medication reminder.", - "timeForFirstReminder": "Time for 1st reminder", + "timeForFirstReminder": "Add Reminder", "reminderRemovalNote": "You can remove it from your calendar later by switching off the reminder", "sortByLocation": "Sort by location", "sortByNearestLocation": "Sort by nearest to your location", @@ -1675,7 +1677,7 @@ "searchLabResults": "Search lab results", "callForAssistance": "Call for immediate assistance", "oneWaySubtitle": "Pickup from location to hospital", - "twoWaySubtitle": "Round trip from location to hospital and back", + "twoWaySubtitle": "Round trip from location to hospital", "toHospitalSubtitle": "Transfer from your current location to the hospital", "fromHospitalSubtitle": "Transfer from the hospital back to your home", "clinicSchedule": "Clinic Schedule", @@ -1746,8 +1748,9 @@ "conformationCall": "You will receive a call from HMG for confirmation ", "radiologyLabResults": "Radiology Results", "disclaimerRadiology": "This radiology result was analyzed by AI, and it is not medical advice. Consult your healthcare provider for diagnosis and treatment." - - +, + "selectDateTimeKey": "Select", + "medicalKey": "Medical" } diff --git a/lib/features/authentication/widgets/otp_verification_screen.dart b/lib/features/authentication/widgets/otp_verification_screen.dart index 9e80dbb9..b3b5e3eb 100644 --- a/lib/features/authentication/widgets/otp_verification_screen.dart +++ b/lib/features/authentication/widgets/otp_verification_screen.dart @@ -558,9 +558,9 @@ class _OTPVerificationScreenState extends State { LocaleKeys.via.tr(context: context).toText15(color: AppColors.inputLabelTextColor, letterSpacing: -0.4), (widget.isFormFamilyFile ? LoginTypeEnum.sms.displayName : authVM.loginTypeEnum.displayName) .toText15(color: AppColors.inputLabelTextColor, isBold: true, letterSpacing: -0.4), - appState.getUserRegistrationPayload.isRegister != null && appState.getUserRegistrationPayload.isRegister == true - ? LocaleKeys.forRegistrationVerification.tr(context: context).toText15(color: AppColors.inputLabelTextColor, letterSpacing: -0.4) - : LocaleKeys.forLoginVerification.tr(context: context).toText15(color: AppColors.inputLabelTextColor, letterSpacing: -0.4), + // appState.getUserRegistrationPayload.isRegister != null && appState.getUserRegistrationPayload.isRegister == true + // ? LocaleKeys.forRegistrationVerification.tr(context: context).toText15(color: AppColors.inputLabelTextColor, letterSpacing: -0.4) + // : LocaleKeys.forLoginVerification.tr(context: context).toText15(color: AppColors.inputLabelTextColor, letterSpacing: -0.4), ], ), diff --git a/lib/generated/locale_keys.g.dart b/lib/generated/locale_keys.g.dart index 5ced1efb..4770dbad 100644 --- a/lib/generated/locale_keys.g.dart +++ b/lib/generated/locale_keys.g.dart @@ -832,7 +832,9 @@ abstract class LocaleKeys { static const switchAccount = 'switchAccount'; static const lastLoginBy = 'lastLoginBy'; static const allSet = 'allSet'; + static const quickLogin = 'quickLogin'; static const enableQuickLogin = 'enableQuickLogin'; + static const enableQuickLoginBtn = 'enableQuickLoginBtn'; static const enableMsg = 'enableMsg'; static const notNow = 'notNow'; static const pendingActivation = 'pendingActivation'; @@ -1748,5 +1750,7 @@ abstract class LocaleKeys { static const conformationCall = 'conformationCall'; static const radiologyLabResults = 'radiologyLabResults'; static const disclaimerRadiology = 'disclaimerRadiology'; + static const selectDateTimeKey = 'selectDateTimeKey'; + static const medicalKey = 'medicalKey'; } diff --git a/lib/presentation/appointments/widgets/appointment_card.dart b/lib/presentation/appointments/widgets/appointment_card.dart index 505afcdf..8b178c47 100644 --- a/lib/presentation/appointments/widgets/appointment_card.dart +++ b/lib/presentation/appointments/widgets/appointment_card.dart @@ -197,7 +197,7 @@ class _AppointmentCardState extends State { ).toShimmer2(isShow: widget.isLoading), AppCustomChipWidget( labelText: - widget.isLoading ? 'OutPatient' : (appState.isArabic() ? widget.patientAppointmentHistoryResponseModel.isInOutPatientDescriptionN! : widget.patientAppointmentHistoryResponseModel.isInOutPatientDescription!), + widget.isLoading ? 'OutPatient' : (appState.isArabic() ? widget.patientAppointmentHistoryResponseModel.isInOutPatientDescriptionN! : widget.patientAppointmentHistoryResponseModel.isInOutPatientDescription!), backgroundColor: AppColors.warningColorYellow.withValues(alpha: 0.1), textColor: AppColors.warningColorYellow, ).toShimmer2(isShow: widget.isLoading), diff --git a/lib/presentation/authentication/quick_login.dart b/lib/presentation/authentication/quick_login.dart index 319402b0..6b80f6e8 100644 --- a/lib/presentation/authentication/quick_login.dart +++ b/lib/presentation/authentication/quick_login.dart @@ -68,7 +68,7 @@ class QuickLoginState extends State { // Image.asset(AppAssets.lockIcon, height: 100), Utils.buildSvgWithAssets(icon: AppAssets.biometricLockIcon, iconColor: AppColors.textColor, width: 100.h, height: 100.h), SizedBox(height: 10.h), - LocaleKeys.enableQuickLogin.tr(context: context).toText26(isBold: true), + LocaleKeys.quickLogin.tr(context: context).toText26(isBold: true), // Text( // ' TranslationBase.of(context).enableQuickLogin', // style: context.dynamicTextStyle( @@ -95,7 +95,7 @@ class QuickLoginState extends State { children: [ Expanded( child: CustomButton( - text: LocaleKeys.enableQuickLogin.tr(context: context), + text: LocaleKeys.enableQuickLoginBtn.tr(context: context), onPressed: () { widget.onPressed(); }, diff --git a/lib/presentation/book_appointment/book_appointment_page.dart b/lib/presentation/book_appointment/book_appointment_page.dart index aa32782f..d0ef2a4f 100644 --- a/lib/presentation/book_appointment/book_appointment_page.dart +++ b/lib/presentation/book_appointment/book_appointment_page.dart @@ -472,7 +472,7 @@ class _BookAppointmentPageState extends State { crossAxisAlignment: CrossAxisAlignment.start, children: [ LocaleKeys.searchByClinic.tr(context: context).toText14(color: AppColors.textColor, isBold: true), - LocaleKeys.tapToSelectClinic.tr(context: context).toText12(color: AppColors.primaryRedColor, isBold: true), + LocaleKeys.tapToSelect.tr(context: context).toText12(color: AppColors.primaryRedColor, isBold: true), ], ), ], @@ -534,7 +534,7 @@ class _BookAppointmentPageState extends State { crossAxisAlignment: CrossAxisAlignment.start, children: [ LocaleKeys.searchByRegion.tr(context: context).toText14(color: AppColors.textColor, isBold: true), - LocaleKeys.centralRegion.tr(context: context).toText12(color: AppColors.primaryRedColor, isBold: true), + LocaleKeys.tapToSelect.tr(context: context).toText12(color: AppColors.primaryRedColor, isBold: true), ], ), ], diff --git a/lib/presentation/book_appointment/doctor_profile_page.dart b/lib/presentation/book_appointment/doctor_profile_page.dart index dbb885b3..29e1c824 100644 --- a/lib/presentation/book_appointment/doctor_profile_page.dart +++ b/lib/presentation/book_appointment/doctor_profile_page.dart @@ -236,7 +236,7 @@ class DoctorProfilePage extends StatelessWidget { onSuccess: (dynamic respData) async { LoaderBottomSheet.hideLoader(); showCommonBottomSheetWithoutHeight( - title: LocaleKeys.pickADate.tr(), + title: LocaleKeys.pickADate.tr() , context, child: AppointmentCalendar(), isFullScreen: false, diff --git a/lib/presentation/book_appointment/widgets/appointment_calendar.dart b/lib/presentation/book_appointment/widgets/appointment_calendar.dart index ef1cc273..9e83a70d 100644 --- a/lib/presentation/book_appointment/widgets/appointment_calendar.dart +++ b/lib/presentation/book_appointment/widgets/appointment_calendar.dart @@ -189,7 +189,7 @@ class _AppointmentCalendarState extends State { SizedBox(height: 16.h), CustomButton( - text: LocaleKeys.select.tr(context: context), + text: LocaleKeys.selectDateTimeKey.tr(context: context), isDisabled: dayEvents.isEmpty, onPressed: () async { if (appState.isAuthenticated) { diff --git a/lib/presentation/health_trackers/add_health_tracker_entry_page.dart b/lib/presentation/health_trackers/add_health_tracker_entry_page.dart index 829c4a95..966b543f 100644 --- a/lib/presentation/health_trackers/add_health_tracker_entry_page.dart +++ b/lib/presentation/health_trackers/add_health_tracker_entry_page.dart @@ -155,19 +155,15 @@ class _AddHealthTrackerEntryPageState extends State { // Show success message and pop back - void _showSuccessAndPop() async{ - showCommonBottomSheetWithoutHeight( - context, - child: Utils.getSuccessWidget( - loadingText: _getSuccessMessage(), + void _showSuccessAndPop() async { + showCommonBottomSheetWithoutHeight(context, + child: Utils.getSuccessWidget( + loadingText: _getSuccessMessage(), ).paddingSymmetrical(0.h, 24.h), callBackFunc: () { // Navigator.pop(context); - }, - isCloseButtonVisible: false, - isDismissible: true, - isFullScreen: false, isAutoDismiss: false); + }, isCloseButtonVisible: false, isDismissible: true, isFullScreen: false, isAutoDismiss: false); await Future.delayed(Duration(milliseconds: 2000)).then((value) { - if (mounted){ + if (mounted) { Navigator.pop(context); Navigator.pop(context); } @@ -193,9 +189,7 @@ class _AddHealthTrackerEntryPageState extends State { onChanged: (_) => onTap(), materialTapTargetSize: MaterialTapTargetSize.shrinkWrap, ), - (useUpperCase ? value.toUpperCase() : value.toCamelCase) - .toText16(isBold: true, textOverflow: TextOverflow.ellipsis, maxlines: 1) - .expanded, + (useUpperCase ? value.toUpperCase() : value.toCamelCase).toText16(isBold: true, textOverflow: TextOverflow.ellipsis, maxlines: 1).expanded, ], ).onPress(onTap), ); @@ -238,7 +232,7 @@ class _AddHealthTrackerEntryPageState extends State { onOkPressed: () {}, ); } - + // Blood Sugar unit selection void _showBloodSugarUnitSelectionBottomSheet(BuildContext context, HealthTrackersViewModel viewModel) { FocusScope.of(context).unfocus(); @@ -476,6 +470,7 @@ class _AddHealthTrackerEntryPageState extends State { Widget _buildDateTimeFields() { return Column( children: [ + SizedBox(width: 8.w), TextInputWidget( controller: dateController, isReadOnly: true, @@ -506,6 +501,8 @@ class _AddHealthTrackerEntryPageState extends State { } }, ), + Divider(height: 1, color: AppColors.dividerColor), + SizedBox(width: 8.w), TextInputWidget( controller: timeController, isReadOnly: true, @@ -546,11 +543,7 @@ class _AddHealthTrackerEntryPageState extends State { body: CollapsingListView( title: _getPageTitle(), bottomChild: Container( - decoration: RoundedRectangleBorder().toSmoothCornerDecoration( - color: AppColors.whiteColor, - borderRadius: 24.r, - hasShadow: true, - ), + decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 24.r, hasShadow: true), child: Padding( padding: EdgeInsets.all(24.w), child: CustomButton( diff --git a/lib/presentation/home/data/landing_page_data.dart b/lib/presentation/home/data/landing_page_data.dart index d0a15af6..53bea1e8 100644 --- a/lib/presentation/home/data/landing_page_data.dart +++ b/lib/presentation/home/data/landing_page_data.dart @@ -105,8 +105,8 @@ class LandingPageData { ServiceCardData( serviceName: "prescriptions", icon: AppAssets.my_prescription_icon, - title: getIt.get().isArabic()?LocaleKeys.details2:LocaleKeys.medicinesSubtitle, - subtitle: getIt.get().isArabic()?LocaleKeys.medicinesSubtitle:LocaleKeys.details2, + title: getIt.get().isArabic()?LocaleKeys.medicinesSubtitle:LocaleKeys.medicalKey, + subtitle: getIt.get().isArabic()?LocaleKeys.medicalKey:LocaleKeys.medicinesSubtitle, backgroundColor: AppColors.whiteColor, iconColor: AppColors.blackColor, textColor: AppColors.blackColor, @@ -115,8 +115,8 @@ class LandingPageData { ServiceCardData( serviceName: "insurance_update", icon: AppAssets.insurance_update_icon, - title: LocaleKeys.medical, - subtitle: getIt.get().isArabic()?LocaleKeys.insurance2: LocaleKeys.details2, + title: getIt.get().isArabic()?LocaleKeys.insurance :LocaleKeys.insurance, + subtitle: getIt.get().isArabic()?LocaleKeys.medical: LocaleKeys.details2, backgroundColor: AppColors.whiteColor, iconColor: AppColors.blackColor, textColor: AppColors.blackColor, diff --git a/lib/presentation/home/landing_page.dart b/lib/presentation/home/landing_page.dart index 2807c57e..bd574bfa 100644 --- a/lib/presentation/home/landing_page.dart +++ b/lib/presentation/home/landing_page.dart @@ -630,7 +630,7 @@ class _LandingPageState extends State { LocaleKeys.quickLinks.tr(context: context).toText16(isBold: true), Row( children: [ - LocaleKeys.viewMedicalFile.tr(context: context).toText14(color: AppColors.primaryRedColor, isBold: true), + LocaleKeys.viewMedicalFileLandingPage.tr(context: context).toText14(color: AppColors.primaryRedColor, isBold: true), SizedBox(width: 2.h), Icon(Icons.arrow_forward_ios, color: AppColors.primaryRedColor, size: 14.h), ], @@ -798,7 +798,7 @@ class _LandingPageState extends State { LocaleKeys.services2.tr(context: context).toText18(isBold: true), Row( children: [ - LocaleKeys.viewAllServices.tr(context: context).toText14(color: AppColors.primaryRedColor, isBold: true), + LocaleKeys.viewAll.tr(context: context).toText14(color: AppColors.primaryRedColor, isBold: true), SizedBox(width: 2.h), Icon(Icons.arrow_forward_ios, color: AppColors.primaryRedColor, size: 14.h), ], diff --git a/lib/presentation/home/widgets/habib_wallet_card.dart b/lib/presentation/home/widgets/habib_wallet_card.dart index e96f35c3..88c2f2b1 100644 --- a/lib/presentation/home/widgets/habib_wallet_card.dart +++ b/lib/presentation/home/widgets/habib_wallet_card.dart @@ -57,7 +57,7 @@ class HabibWalletCard extends StatelessWidget { // Row( // mainAxisAlignment: MainAxisAlignment.spaceBetween, // children: [ - LocaleKeys.habibWallet2.tr(context: context).toText16(isBold: true, letterSpacing: -0.2), + LocaleKeys.habibWallet.tr(context: context).toText16(isBold: true, letterSpacing: -0.2), // Container( // height: 40.h, // width: 40.h, diff --git a/lib/presentation/prescriptions/prescription_item_view.dart b/lib/presentation/prescriptions/prescription_item_view.dart index 83c2f7f1..086b3f83 100644 --- a/lib/presentation/prescriptions/prescription_item_view.dart +++ b/lib/presentation/prescriptions/prescription_item_view.dart @@ -68,7 +68,8 @@ class PrescriptionItemView extends StatelessWidget { labelText: "${LocaleKeys.dailyDoses.tr(context: context)}: ${isLoading ? "" : prescriptionVM.prescriptionDetailsList[index].doseDailyQuantity}", ).toShimmer2(isShow: isLoading), AppCustomChipWidget( - labelText: "${LocaleKeys.days.tr(context: context)}: ${isLoading ? "" : prescriptionVM.prescriptionDetailsList[index].days}", isEnglishOnly: true, + labelText: "${LocaleKeys.days.tr(context: context)}: ${isLoading ? "" : prescriptionVM.prescriptionDetailsList[index].days}", + isEnglishOnly: true, ).toShimmer2(isShow: isLoading), ], ).paddingSymmetrical(16.h, 0.h), @@ -112,24 +113,17 @@ class PrescriptionItemView extends StatelessWidget { if (await prescriptionVM.checkIfReminderExistForPrescription(index)) { prescriptionVM.prescriptionDetailsList[index].hasReminder = true; - LoaderBottomSheet.showLoader(loadingText: "Removing Reminders"); - bool resultValue = await calender.checkAndRemoveMultipleItems(id: prescriptionVM.prescriptionDetailsList[index].itemID.toString()); - - prescriptionVM.setPrescriptionItemReminder(newValue, prescriptionVM.prescriptionDetailsList[index]); - LoaderBottomSheet.hideLoader(); - return; + LoaderBottomSheet.showLoader(loadingText: "Removing Reminders"); + bool resultValue = await calender.checkAndRemoveMultipleItems(id: prescriptionVM.prescriptionDetailsList[index].itemID.toString()); + prescriptionVM.setPrescriptionItemReminder(newValue, prescriptionVM.prescriptionDetailsList[index]); + LoaderBottomSheet.hideLoader(); + return; } else { DateTime startDate = DateTime.now(); prescriptionVM.serSelectedTime(startDate); DateTime endDate = DateTime(startDate.year, startDate.month, startDate.day + prescriptionVM.prescriptionDetailsList[index].days!.toInt()); - showCommonBottomSheetWithoutHeight( - context, - child: bottomSheetContent(context), - title: LocaleKeys.timeForFirstReminder.tr(), - - isCloseButtonVisible: true - ); + showCommonBottomSheetWithoutHeight(context, child: bottomSheetContent(context), title: LocaleKeys.timeForFirstReminder.tr(), isCloseButtonVisible: true); // BottomSheetUtils().showReminderBottomSheet( // context, @@ -219,23 +213,23 @@ class PrescriptionItemView extends StatelessWidget { CustomButton( backgroundColor: AppColors.successColor, borderColor: AppColors.successColor, - text: LocaleKeys.confirm.tr(), onPressed: () async { - CalenderUtilsNew calender = CalenderUtilsNew.instance; - bool isEventAdded = await calender.createMultipleEvents( - reminderMinutes: 10, - frequencyNumber: prescriptionVM.prescriptionDetailsList[index].frequencyNumber?.toInt(), - days: prescriptionVM.prescriptionDetailsList[index].days!.toInt(), - orderDate: prescriptionVM.prescriptionDetailsList[index].orderDate!, - itemDescriptionN: prescriptionVM.prescriptionDetailsList[index].itemDescription!, - route: prescriptionVM.prescriptionDetailsList[index].route!, - onFailure: (errorMessage) => prescriptionVM.showError(errorMessage), - prescriptionNumber: prescriptionVM.prescriptionDetailsList[index].itemID.toString(), - scheduleDateTime: prescriptionVM.selectedReminderTime, - ); - prescriptionVM.setPrescriptionItemReminder(isEventAdded, prescriptionVM.prescriptionDetailsList[index]); - Navigator.of(context).pop(); - }) - + text: LocaleKeys.add.tr(), + onPressed: () async { + CalenderUtilsNew calender = CalenderUtilsNew.instance; + bool isEventAdded = await calender.createMultipleEvents( + reminderMinutes: 10, + frequencyNumber: prescriptionVM.prescriptionDetailsList[index].frequencyNumber?.toInt(), + days: prescriptionVM.prescriptionDetailsList[index].days!.toInt(), + orderDate: prescriptionVM.prescriptionDetailsList[index].orderDate!, + itemDescriptionN: prescriptionVM.prescriptionDetailsList[index].itemDescription!, + route: prescriptionVM.prescriptionDetailsList[index].route!, + onFailure: (errorMessage) => prescriptionVM.showError(errorMessage), + prescriptionNumber: prescriptionVM.prescriptionDetailsList[index].itemID.toString(), + scheduleDateTime: prescriptionVM.selectedReminderTime, + ); + prescriptionVM.setPrescriptionItemReminder(isEventAdded, prescriptionVM.prescriptionDetailsList[index]); + Navigator.of(context).pop(); + }) ], ); } diff --git a/lib/widgets/family_files/family_file_add_widget.dart b/lib/widgets/family_files/family_file_add_widget.dart index ff19fa28..92a14fd8 100644 --- a/lib/widgets/family_files/family_file_add_widget.dart +++ b/lib/widgets/family_files/family_file_add_widget.dart @@ -89,7 +89,7 @@ class _FamilyFileAddWidgetState extends State { ), SizedBox(height: 20.h), CustomButton( - text: LocaleKeys.pleaseVerify.tr(context: context), + text: LocaleKeys.add.tr(context: context), onPressed: () { FocusScope.of(context).unfocus(); if (ValidationUtils.isValidatedIdAndPhoneWithCountryValidation( diff --git a/lib/widgets/map/map_utility_screen.dart b/lib/widgets/map/map_utility_screen.dart index a24317e6..b7e3a326 100644 --- a/lib/widgets/map/map_utility_screen.dart +++ b/lib/widgets/map/map_utility_screen.dart @@ -176,7 +176,8 @@ class MapUtilityScreen extends StatelessWidget { width: MediaQuery.sizeOf(context).width, child: TextInputWidget( labelText: LocaleKeys.enterPickupLocationManually.tr(context: context), - hintText: LocaleKeys.enterPickupLocation.tr(context: context), + hintText: "" , + // hintText: LocaleKeys.enterPickupLocation.tr(context: context) , controller: TextEditingController( text: vm.geocodeResponse?.results.first.formattedAddress ?? vm.selectedPrediction?.description, ), From 929a25d9a41e97909283f86e4f612944b9480a6d Mon Sep 17 00:00:00 2001 From: Sultan khan Date: Wed, 15 Apr 2026 14:46:06 +0300 Subject: [PATCH 40/45] no message --- assets/langs/ar-SA.json | 4 ++-- assets/langs/en-US.json | 4 ++-- .../widgets/blood_cholesterol.dart | 4 +++- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/assets/langs/ar-SA.json b/assets/langs/ar-SA.json index 2ad381a8..243497ab 100644 --- a/assets/langs/ar-SA.json +++ b/assets/langs/ar-SA.json @@ -1757,7 +1757,7 @@ "calculateCaloriesBasedOnFactors": "حساب السعرات الحرارية اليومية بناءً على عدة عوامل مثل الطول، الوزن، العمر، الجنس، والنشاط البدني اليومي.", "conformationCall": "ستتلقى مكالمة لتأكيد طلبك قريباً.", "radiologyLabResults": "نتائج الأشعة", - "disclaimerRadiology": "تم تحليل نتائج الأشعة هذه بواسطة الذكاء الاصطناعي، وهي لا تُعدّ نصيحة طبية. استشر طبيبك المختص للتشخيص والعلاج." - + "disclaimerRadiology": "تم تحليل نتائج الأشعة هذه بواسطة الذكاء الاصطناعي، وهي لا تُعدّ نصيحة طبية. استشر طبيبك المختص للتشخيص والعلاج.", + "convertBloodcholesterolInfo":"حول قيمة كوليسترول الدم بين ملجم/ديسيلتر و مليمول/لتر" } diff --git a/assets/langs/en-US.json b/assets/langs/en-US.json index 7c4f2ab4..e7f06232 100644 --- a/assets/langs/en-US.json +++ b/assets/langs/en-US.json @@ -1745,8 +1745,8 @@ "insurance2": "Insurance", "conformationCall": "You will receive a call from HMG for confirmation ", "radiologyLabResults": "Radiology Results", - "disclaimerRadiology": "This radiology result was analyzed by AI, and it is not medical advice. Consult your healthcare provider for diagnosis and treatment." - + "disclaimerRadiology": "This radiology result was analyzed by AI, and it is not medical advice. Consult your healthcare provider for diagnosis and treatment.", + "convertBloodcholesterolInfo": "Convert blood cholesterol values between mg/dL and mmol/L. " } diff --git a/lib/presentation/health_calculators_and_converts/widgets/blood_cholesterol.dart b/lib/presentation/health_calculators_and_converts/widgets/blood_cholesterol.dart index 53bdf1bf..d24463bf 100644 --- a/lib/presentation/health_calculators_and_converts/widgets/blood_cholesterol.dart +++ b/lib/presentation/health_calculators_and_converts/widgets/blood_cholesterol.dart @@ -1,4 +1,6 @@ +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; import 'package:provider/provider.dart'; import 'package:hmg_patient_app_new/core/app_assets.dart'; import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; @@ -121,7 +123,7 @@ class _BloodCholesterolWidgetState extends State { Utils.buildSvgWithAssets(icon: AppAssets.globe, width: 18.w, height: 18.w), SizedBox(width: 12.w), Expanded( - child: "Convert blood cholesterol values between mg/dL and mmol/L. ".toText12(isBold: true, color: AppColors.inputLabelTextColor), + child:LocaleKeys.convertBloodcholesterolInfo.tr(context: context).toText12(isBold: true, color: AppColors.inputLabelTextColor), ), ], ).paddingSymmetrical(0.w, 16.w), From 6b4d43caf36eb401c90ecf680bf67200441dd80e Mon Sep 17 00:00:00 2001 From: tahaalam Date: Wed, 15 Apr 2026 14:58:41 +0300 Subject: [PATCH 41/45] referral hardcoded string changes --- assets/langs/ar-SA.json | 7 +++++++ assets/langs/en-US.json | 12 ++++++++++-- lib/generated/locale_keys.g.dart | 7 +++++++ 3 files changed, 24 insertions(+), 2 deletions(-) diff --git a/assets/langs/ar-SA.json b/assets/langs/ar-SA.json index 4c365d5d..25cd078b 100644 --- a/assets/langs/ar-SA.json +++ b/assets/langs/ar-SA.json @@ -1759,6 +1759,13 @@ "conformationCall": "ستتلقى مكالمة لتأكيد طلبك قريباً.", "radiologyLabResults": "نتائج الأشعة", "disclaimerRadiology": "تم تحليل نتائج الأشعة هذه بواسطة الذكاء الاصطناعي، وهي لا تُعدّ نصيحة طبية. استشر طبيبك المختص للتشخيص والعلاج.", + "enterIdentificationNumberWithNoStar": "أدخل رقم الهوية", + "enterReferralNumber": "أدخل رقم الإحالة", + "referralNumber": "رقم الإحالة", + "phoneHint": "5xxxxxxxx", + "selectSearchCriteria": "اختر معيار البحث", + "selectCriteria": "اختيار المعيار", + "locationServicesDisabled": "حالة الطقس غير متوفرة لتعطيل خدمات الموقع. يرجى تفعيل خدمات الموقع لتتمكن من رؤية معلومات الطقس.", "selectDateTimeKey": "اختيار", "medicalKey": "الطبية" } diff --git a/assets/langs/en-US.json b/assets/langs/en-US.json index f473e9ae..b7b5ca67 100644 --- a/assets/langs/en-US.json +++ b/assets/langs/en-US.json @@ -1747,10 +1747,18 @@ "insurance2": "Insurance", "conformationCall": "You will receive a call from HMG for confirmation ", "radiologyLabResults": "Radiology Results", - "disclaimerRadiology": "This radiology result was analyzed by AI, and it is not medical advice. Consult your healthcare provider for diagnosis and treatment." -, + "disclaimerRadiology": "This radiology result was analyzed by AI, and it is not medical advice. Consult your healthcare provider for diagnosis and treatment.", + "enterIdentificationNumberWithNoStar": "Enter Identification Number", + "enterReferralNumber": "Enter Referral Number", + "referralNumber": "Referral Number", + "phoneHint": "5xxxxxxxx", + "selectSearchCriteria": "Select the Search Criteria", + "selectCriteria": "Select Criteria", + "locationServicesDisabled": "Weather is unavailable because location services are disabled. Please enable location services to see the weather information.", + "selectDateTimeKey": "Select", "medicalKey": "Medical" + } diff --git a/lib/generated/locale_keys.g.dart b/lib/generated/locale_keys.g.dart index 4770dbad..c7c924ef 100644 --- a/lib/generated/locale_keys.g.dart +++ b/lib/generated/locale_keys.g.dart @@ -1750,6 +1750,13 @@ abstract class LocaleKeys { static const conformationCall = 'conformationCall'; static const radiologyLabResults = 'radiologyLabResults'; static const disclaimerRadiology = 'disclaimerRadiology'; + static const enterIdentificationNumberWithNoStar = 'enterIdentificationNumberWithNoStar'; + static const enterReferralNumber = 'enterReferralNumber'; + static const referralNumber = 'referralNumber'; + static const phoneHint = 'phoneHint'; + static const selectSearchCriteria = 'selectSearchCriteria'; + static const selectCriteria = 'selectCriteria'; + static const locationServicesDisabled = 'locationServicesDisabled'; static const selectDateTimeKey = 'selectDateTimeKey'; static const medicalKey = 'medicalKey'; From cfcbaa85a305f4e52e52cfe0ca76201836f6ecd6 Mon Sep 17 00:00:00 2001 From: tahaalam Date: Wed, 15 Apr 2026 20:18:56 +0300 Subject: [PATCH 42/45] LANGUAGE CHANGES --- assets/images/svg/document.svg | 5 + assets/images/svg/report.svg | 4 + assets/images/svg/sucess.svg | 3 + assets/langs/ar-SA.json | 30 +- assets/langs/en-US.json | 35 +- lib/core/app_assets.dart | 3 + lib/core/enums.dart | 32 +- lib/generated/locale_keys.g.dart | 17 + .../blood_donation/blood_donation_page.dart | 2 +- .../widgets/select_gender_widget.dart | 2 +- .../book_appointment_page.dart | 2 +- .../book_appointment/select_clinic_page.dart | 2 +- .../comprehensive_checkup_page.dart | 2 +- .../emergency_services_page.dart | 2 +- .../emergency_services/nearest_er_page.dart | 2 +- .../health_calculators_page.dart | 17 +- .../widgets/bf.dart | 348 ++++++------------ .../widgets/blood_sugar.dart | 4 +- .../widgets/bmr.dart | 83 +++-- .../widgets/calories.dart | 241 ++++++------ .../widgets/crabs.dart | 2 +- .../widgets/ibw.dart | 66 ++-- .../medical_file/medical_file_page.dart | 135 ++++--- .../widgets/medical_report_card.dart | 101 +++++ .../prescriptions/prescription_item_view.dart | 2 +- 25 files changed, 621 insertions(+), 521 deletions(-) create mode 100644 assets/images/svg/document.svg create mode 100644 assets/images/svg/report.svg create mode 100644 assets/images/svg/sucess.svg create mode 100644 lib/presentation/medical_file/widgets/medical_report_card.dart diff --git a/assets/images/svg/document.svg b/assets/images/svg/document.svg new file mode 100644 index 00000000..5073ead5 --- /dev/null +++ b/assets/images/svg/document.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/assets/images/svg/report.svg b/assets/images/svg/report.svg new file mode 100644 index 00000000..b5ca54b1 --- /dev/null +++ b/assets/images/svg/report.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/images/svg/sucess.svg b/assets/images/svg/sucess.svg new file mode 100644 index 00000000..6df93d5e --- /dev/null +++ b/assets/images/svg/sucess.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/langs/ar-SA.json b/assets/langs/ar-SA.json index a8df3819..b95b6709 100644 --- a/assets/langs/ar-SA.json +++ b/assets/langs/ar-SA.json @@ -680,8 +680,8 @@ "noOffersAvailable": "لا توجد عروض متاحة!", "accessibility": "وضع الوصول", "orderStatus": "حالة الطلب", - "findUs": "اعثر علينا", - "liveChat": "دردشة مباشرة", + "findUs": "فروعنا", + "liveChat": "محادثة مباشرة", "service": "خدمة", "hmgServiceLabel": "خدمة مجموعة الحبيب الطبية", "healthWeatherIndicators": "مؤشرات الطقس الصحية", @@ -1049,9 +1049,9 @@ "noServicesAvailable": "لا توجد خدمات متاحة", "selectAService": "اختر خدمة", "comprehensiveCheckup": "الفحص الشامل", - "viewNearestHMGLocations": "عرض أقرب مواقع مجموعة الحبيب الطبية", + "viewNearestHMGLocations": "عرض أقرب فرع", "provideFeedbackOnServices": "قدم ملاحظاتك على خدماتنا", - "liveChatWithHMG": "خيار الدردشة المباشرة مع مجموعة الحبيب الطبية", + "liveChatWithHMG": "حدث مباشرة مع الموظف", "send": "إرسال", "status": "الحالة", "sendingFeedback": "جاري إرسال الملاحظات...", @@ -1160,11 +1160,18 @@ "recharge": "اضافة رصيد", "activityLevel": "مستوى النشاط", "selectActivityLevel": "حدد مستوى النشاط", + "almostInactive": "غير نشط تقريبًا (بدون تمارين)", + "lightlyActive": "نشاط خفيف", + "lightlyActive13Days": "نشاط خفيف (١-٣) أيام في الأسبوع", + "superActive": "نشاط مكثف (تمارين شاقة جدًا)", "caloriesPerDay": "السعرات الحرارية في اليوم الواحد", "dietType": "نوع النظام الغذائي", "selectDietType": "حدد نوع النظام الغذائي", "bodyFrameSize": "حجم إطار الجسم", "selectBodyFrameSize": "حدد حجم إطار الجسم", + "bodyFrameSmall": "صغير (الأصابع متداخلة)", + "bodyFrameMedium": "متوسط (الأصابع متلامسة)", + "bodyFrameLarge": "كبير (الأصابع لا تتلامس)", "averageCycleLength": "متوسط طول الدورة الشهرية (عادةً 28 يومًا)", "averageLutealPhase": "متوسط طول المرحلة الأصفرية (عادةً 14 يومًا)", "convert": "تحويل الوحدات", @@ -1255,7 +1262,7 @@ "virtualTour": "جولة افتراضية", "carParking": "موقف السيارات", "latestNews": "آخر الأخبار", - "hmgContact": "اتصل بمجموعة الحبيب الطبية", + "hmgContact": "تواصل معنا", "durationCannotExceed90": "لا يجوز أن تتجاوز المدة 90 دقيقة", "unexpectedError": "حدث خطأ غير متوقع", "gettingAmbulanceTransportOption": "جاري الحصول على خيارات نقل الإسعاف", @@ -1334,6 +1341,7 @@ "askYourDoctor": "اسأل طبيبك", "internetPairing": "الاقتران بالإنترنت", "requested": "مطلوب", + "readyToDownload": "جاهز للتحميل", "youDontHaveAnyMedicalReportsYet": "ليس لديك أي تقارير طبية بعد.", "requestMedicalReport": "طلب تقرير طبي", "youDoNotHaveAnyAppointmentsToRequestMedicalReport": "ليس لديك أي مواعيد لطلب تقرير طبي.", @@ -1705,7 +1713,7 @@ "enterAmount": "يرجى إدخال المبلغ للمتابعة.", "selectHospitalContinue": "يرجى اختيار المستشفى للمتابعة.", "year": "سنة", - "notifyPrescription": "أبلغني قبل وقت الاستهلاك", + "notifyPrescription": "تنبيه قبل موعد الجرعة", "doctorRatingAppointment": "طبيب\nتصنيف", "ratingSubmitted": "تم إرسال التقييم", "rateTheDoctor": "يرجى تقييم الطبيب", @@ -1768,6 +1776,14 @@ "locationServicesDisabled": "حالة الطقس غير متوفرة لتعطيل خدمات الموقع. يرجى تفعيل خدمات الموقع لتتمكن من رؤية معلومات الطقس.", "selectDateTimeKey": "اختيار", "medicalKey": "الطبية", - "convertBloodcholesterolInfo":"حول قيمة كوليسترول الدم بين ملجم/ديسيلتر و مليمول/لتر" + "convertBloodcholesterolInfo":"حول قيمة كوليسترول الدم بين ملجم/ديسيلتر و مليمول/لتر", + "carbsAlert": "حساب نسب المغذيات (الكربوهيدرات ،البروتين والدهون) بالسعرات الحرارية والقرامات وفقا لنسب محددة مسبقا", + "bodyFatAlert": "يحسب بناءً على الحجم", + "ibwAlert": "حساب الوزن المثالي بناءً على الطول، الوزن، وبنية الجسم", + "glucoseAlert":"تغيير وحدات القياس بين مليجرام لكل ديسيلتر و ملي مول لكل لتر", + "selectBloodGroup": "اختر الفصيلة", + "routePrescription": "طريقة الاستخدام", + "noNearestER": "لا يوجد طوارئ قريب منك", + "loginToUseServiceLiveCare": "تحتاج إلى تسجيل الدخول لاستخدام هذه الخدمة" } diff --git a/assets/langs/en-US.json b/assets/langs/en-US.json index ee1c1d01..d0900bd8 100644 --- a/assets/langs/en-US.json +++ b/assets/langs/en-US.json @@ -944,7 +944,7 @@ "doctorWillContact": "Doctor will contact you", "specialisedDoctorWillContactYou": "A specialized doctor will contact you and will be able to view your medical history", "freeMedicineDelivery": "Free medicine delivery", - "offersFreeMedicineDelivery": "Offers free medicine delivery for the LiveCare appointment", + "offersFreeMedicineDelivery": "Receive free medicine delivery with your LiveCare appointment.", "dentalChiefComplaints": "Dental Chief Complaints", "viewAvailableAppointments": "View available appointments", "doctorProfile": "Doctor Profile", @@ -1136,14 +1136,14 @@ "allFacilities": "All Facilities", "selectLocation": "Select Location", "pleaseSelectTheLocation": "Please select the location", - "viewLocationGoogleMaps": "View Location on Google Maps", + "viewLocationGoogleMaps": "Get Directions on Google Maps", "callAmbulance": "Call Ambulance", - "requestAmbulanceInEmergency": "Request an ambulance in emergency from home or hospital", + "requestAmbulanceInEmergency": "Request an ambulance for immediate assistance in cases of emergency.", "confirmation": "Confirmation", "areYouSureYouWantToCallAmbulance": "Are you sure you want to call an ambulance?", - "getDetailsOfNearestBranch": "Get the details of nearest branch including directions", + "getDetailsOfNearestBranch": "Find the nearest ER and get directions.", "areYouSureYouWantToCallRRT": "Are you sure you want to call Rapid Response Team (RRT)?", - "priorERCheckInToSkipLine": "Prior ER Check-In to skip the line & payment at the reception.", + "priorERCheckInToSkipLine": "Check in before you arrive to the ER to skip the line & payment at reception.", "areYouSureYouWantToMakeERCheckIn": "Are you sure you want to request an online ER check-in?", "checkingYourERAppointmentStatus": "Please Wait...", "transportOptions": "Transport Options", @@ -1151,11 +1151,18 @@ "recharge": "Add Funds", "activityLevel": "Activity Level", "selectActivityLevel": "Select Activity Level", + "almostInactive": "Almost Inactive (no exercise)", + "lightlyActive": "Lightly active", + "lightlyActive13Days": "Lightly active (1-3) days per week", + "superActive": "Super active (very hard exercise)", "caloriesPerDay": "Calories Per Day", "dietType": "Diet Type", "selectDietType": "Select Diet Type", "bodyFrameSize": "Body Frame Size", "selectBodyFrameSize": "Select Body Frame Size", + "bodyFrameSmall": "Small (fingers overlaps)", + "bodyFrameMedium": "Medium (fingers touch)", + "bodyFrameLarge": "Large (fingers don't touch)", "averageCycleLength": "Average Cycle Length (Usually 28 days)", "averageLutealPhase": "Average Luteal Phase Length(Usually 14 days)", "convert": "Convert", @@ -1323,6 +1330,7 @@ "askYourDoctor": "Ask Your Doctor", "internetPairing": "Internet Pairing", "requested": "Requested", + "readyToDownload": "Ready to download", "youDontHaveAnyMedicalReportsYet": "You don't have any medical reports yet.", "requestMedicalReport": "Request medical report", "youDoNotHaveAnyAppointmentsToRequestMedicalReport": "You do not have any appointments to request a medical report.", @@ -1662,8 +1670,8 @@ "smartWatchServiceDescription": "Seamlessly connect your smartwatch to our health app for effortless data tracking and personalized insights.", "liveChatServiceHeader": "24/7 Expert\nAssistance", "liveChatServiceDescription": "Need help ? Our live chat connects you with expert support for any questions about features, settings, or troubleshooting.", - "emergencyServiceHeader": "ER Check-in, Faster Than Ever. Call ambulance / Rapid Response Team instantly", - "emergencyServiceDescription": "In a medical emergency? Our ambulances and rapid response teams are on standby 24/7. Plus, quick ER check-in for faster care.", + "emergencyServiceHeader": "Emergency Care, Faster than Ever.", + "emergencyServiceDescription": "Facing a medical emergency? Our ambulances are on standby 24/7 for your immediate assistance.", "homeHealthCareServiceHeader": "Premium care, delivered right to your doorstep", "homeHealthCareServiceDescription": "We provide the highest degree of patient care at home in a value-oriented, efficient, and professional manner.", "profileOnlyText": "Profile", @@ -1705,7 +1713,7 @@ "overWeight": "OverWeight", "underWeight": "UnderWeight", "nearestGate": "Nearest Gate", - "RRTDDetails": "The Rapid response team provides a comprehensive medical service for all sorts of urgent and stable cases of all ages, including adult and paediatric patients.", + "RRTDDetails": "Comprehensive medical services for stable and urgent cases, available for all ages.", "fromHospitalSubtitle": "Transfer from the hospital back to your home", "normalMapType": "Default", "satelliteMapType": "Satellite", @@ -1758,7 +1766,16 @@ "selectDateTimeKey": "Select", "medicalKey": "Medical" , - "convertBloodcholesterolInfo": "Convert blood cholesterol values between mg/dL and mmol/L. " + "convertBloodcholesterolInfo": "Convert blood cholesterol values between mg/dL and mmol/L. ", + "carbsAlert":"Calculate carbohydrate based protein and fat ration in calories and grams according to a pre set ratio.", + "bodyFatAlert": "Estimate the total body fat based on the size.", + "ibwAlert": "Calculates the ideal body weight based on height, weight and body size.", + "glucoseAlert":"Convert blood glucose values between mg/dL and mmol/L. (1 mmol/L ≈ 18.0182 mg/dL)", + "selectBloodGroup": "Select Blood Group", + "routePrescription": "Route", + "noNearestER": "No nearest Er Around you", + "loginToUseServiceLiveCare": "Log In to Use This Service" + } diff --git a/lib/core/app_assets.dart b/lib/core/app_assets.dart index c3811a94..7800d244 100644 --- a/lib/core/app_assets.dart +++ b/lib/core/app_assets.dart @@ -17,6 +17,9 @@ class AppAssets { static const String email = '$svgBasePath/email.svg'; static const String globe = '$svgBasePath/globe.svg'; static const String globeOther = '$svgBasePath/globe_other.svg'; + static const String document = '$svgBasePath/document.svg'; + static const String report = '$svgBasePath/report.svg'; + static const String sucess = '$svgBasePath/sucess.svg'; // static const String globeOther = '$svgBasePath/globe_other.svg'; static const String cancel = '$svgBasePath/cancel.svg'; diff --git a/lib/core/enums.dart b/lib/core/enums.dart index 2d42a2ae..4ac919e7 100644 --- a/lib/core/enums.dart +++ b/lib/core/enums.dart @@ -5,8 +5,11 @@ // unverified, // } +import 'package:easy_localization/easy_localization.dart'; import 'package:hmg_patient_app_new/core/app_state.dart'; import 'package:hmg_patient_app_new/core/dependencies.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; enum AuthMethodTypesEnum { sms, whatsApp, fingerPrint, faceID, moreOptions } @@ -20,6 +23,17 @@ enum SelectionTypeEnum { dropdown, calendar, search, time } enum GenderTypeEnum { male, female } +extension GenderTypeEnumExtension on GenderTypeEnum { + String get displayName { + switch (this) { + case GenderTypeEnum.male: + return LocaleKeys.malE.tr(); + case GenderTypeEnum.female: + return LocaleKeys.femaleGender.tr(); + } + } +} + enum MaritalStatusTypeEnum { single, married, divorced, widowed } enum ChipTypeEnum { success, error, alert, info, warning, lightBg, primaryRed } @@ -68,7 +82,7 @@ extension HealthCalculatorExtenshion on HealthCalculatorsTypeEnum { case HealthCalculatorsTypeEnum.bodyFat: return isArabic ? "دهون الجسم" : "Body Fat Calculator"; case HealthCalculatorsTypeEnum.crabsProteinFat: - return isArabic ? "حاسبة البروتين والدهون في سرطان البحر" : "Crabs Protein & Fat Calculator"; + return isArabic ? "حاسبة المغذيات" : "Crabs Protein & Fat Calculator"; case HealthCalculatorsTypeEnum.ovulation: return isArabic ? "فترة الإباضة" : "Ovulation Period"; case HealthCalculatorsTypeEnum.deliveryDueDate: @@ -80,6 +94,22 @@ extension HealthCalculatorExtenshion on HealthCalculatorsTypeEnum { case HealthCalculatorsTypeEnum.triglycerides: return isArabic ? "الدهون الثلاثية في الدم" : "Triglycerides Fat Blood"; } + } + + String get title { + AppState appState = getIt.get(); + bool isArabic = appState.getLanguageID() == 1 ? true : false; + switch (this) { + case HealthCalculatorsTypeEnum.crabsProteinFat: + return isArabic ? "نتيجة المغذيات" : "Nutrient Results"; + case HealthCalculatorsTypeEnum.calories: + return isArabic ? "سعراتك الحرارية" : "Calories"; + + case HealthCalculatorsTypeEnum.calories: + return isArabic ? "مؤشر كتلة الجسم" : "BMI"; + default: + return "Your ${this.name.toCamelCase}"; + } } static LoginTypeEnum? fromValue(int value) { diff --git a/lib/generated/locale_keys.g.dart b/lib/generated/locale_keys.g.dart index c7c924ef..581f1ea0 100644 --- a/lib/generated/locale_keys.g.dart +++ b/lib/generated/locale_keys.g.dart @@ -1158,11 +1158,18 @@ abstract class LocaleKeys { static const recharge = 'recharge'; static const activityLevel = 'activityLevel'; static const selectActivityLevel = 'selectActivityLevel'; + static const almostInactive = 'almostInactive'; + static const lightlyActive = 'lightlyActive'; + static const lightlyActive13Days = 'lightlyActive13Days'; + static const superActive = 'superActive'; static const caloriesPerDay = 'caloriesPerDay'; static const dietType = 'dietType'; static const selectDietType = 'selectDietType'; static const bodyFrameSize = 'bodyFrameSize'; static const selectBodyFrameSize = 'selectBodyFrameSize'; + static const bodyFrameSmall = 'bodyFrameSmall'; + static const bodyFrameMedium = 'bodyFrameMedium'; + static const bodyFrameLarge = 'bodyFrameLarge'; static const averageCycleLength = 'averageCycleLength'; static const averageLutealPhase = 'averageLutealPhase'; static const convert = 'convert'; @@ -1330,6 +1337,7 @@ abstract class LocaleKeys { static const askYourDoctor = 'askYourDoctor'; static const internetPairing = 'internetPairing'; static const requested = 'requested'; + static const readyToDownload = 'readyToDownload'; static const youDontHaveAnyMedicalReportsYet = 'youDontHaveAnyMedicalReportsYet'; static const requestMedicalReport = 'requestMedicalReport'; static const youDoNotHaveAnyAppointmentsToRequestMedicalReport = 'youDoNotHaveAnyAppointmentsToRequestMedicalReport'; @@ -1759,5 +1767,14 @@ abstract class LocaleKeys { static const locationServicesDisabled = 'locationServicesDisabled'; static const selectDateTimeKey = 'selectDateTimeKey'; static const medicalKey = 'medicalKey'; + static const convertBloodcholesterolInfo = 'convertBloodcholesterolInfo'; + static const carbsAlert = 'carbsAlert'; + static const bodyFatAlert = 'bodyFatAlert'; + static const ibwAlert = 'ibwAlert'; + static const glucoseAlert = 'glucoseAlert'; + static const selectBloodGroup = 'selectBloodGroup'; + static const routePrescription = 'routePrescription'; + static const noNearestER = 'noNearestER'; + static const loginToUseServiceLiveCare = 'loginToUseServiceLiveCare'; } diff --git a/lib/presentation/blood_donation/blood_donation_page.dart b/lib/presentation/blood_donation/blood_donation_page.dart index c6767c2d..4a2a7cc4 100644 --- a/lib/presentation/blood_donation/blood_donation_page.dart +++ b/lib/presentation/blood_donation/blood_donation_page.dart @@ -219,7 +219,7 @@ class _BloodDonationPageState extends State { ], ).onPress(() { showCommonBottomSheetWithoutHeight(context, - title: LocaleKeys.select.tr(context: context), + title: LocaleKeys.selectBloodGroup.tr(context: context), isDismissible: true, child: SelectBloodGroupWidget(isArabic: appState.isArabic(), bloodDonationViewModel: bloodDonationVM), callBackFunc: () {}); diff --git a/lib/presentation/blood_donation/widgets/select_gender_widget.dart b/lib/presentation/blood_donation/widgets/select_gender_widget.dart index 0d360a80..fc8863d8 100644 --- a/lib/presentation/blood_donation/widgets/select_gender_widget.dart +++ b/lib/presentation/blood_donation/widgets/select_gender_widget.dart @@ -37,7 +37,7 @@ class SelectGenderWidget extends StatelessWidget { child: Column( crossAxisAlignment: CrossAxisAlignment.start, spacing: 8.h, - children: [GenderTypeEnum.values[index].name.toCamelCase.toText16(color: AppColors.textColor, isBold: true)], + children: [GenderTypeEnum.values[index].displayName.toCamelCase.toText16(color: AppColors.textColor, isBold: true)], ), ), Transform.flip( diff --git a/lib/presentation/book_appointment/book_appointment_page.dart b/lib/presentation/book_appointment/book_appointment_page.dart index d0ef2a4f..15b019e9 100644 --- a/lib/presentation/book_appointment/book_appointment_page.dart +++ b/lib/presentation/book_appointment/book_appointment_page.dart @@ -907,7 +907,7 @@ class _BookAppointmentPageState extends State { ), SizedBox(height: 36.h), CustomButton( - text: LocaleKeys.loginToUseService.tr(), + text: LocaleKeys.loginToUseServiceLiveCare.tr(), onPressed: () async { await authVM.onLoginPressed(); }, diff --git a/lib/presentation/book_appointment/select_clinic_page.dart b/lib/presentation/book_appointment/select_clinic_page.dart index 131b4d3d..fc102b4d 100644 --- a/lib/presentation/book_appointment/select_clinic_page.dart +++ b/lib/presentation/book_appointment/select_clinic_page.dart @@ -80,7 +80,7 @@ class _SelectClinicPageState extends State { appState = getIt.get(); if (widget.calculatorType != null) { return CollapsingListView( - title: "Your ${widget.calculatorType!.name.toCamelCase}", + title: widget.calculatorType!.title, bottomChild: Container( decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, customBorder: BorderRadius.only(topLeft: Radius.circular(24.r), topRight: Radius.circular(24.r))), padding: EdgeInsets.symmetric(vertical: 20.h, horizontal: 20.h), diff --git a/lib/presentation/comprehensive_checkup/comprehensive_checkup_page.dart b/lib/presentation/comprehensive_checkup/comprehensive_checkup_page.dart index 589764c1..07e26b6f 100644 --- a/lib/presentation/comprehensive_checkup/comprehensive_checkup_page.dart +++ b/lib/presentation/comprehensive_checkup/comprehensive_checkup_page.dart @@ -250,7 +250,7 @@ class _ComprehensiveCheckupPageState extends State { physics: NeverScrollableScrollPhysics(), itemBuilder: (context, index) { final service = services[index]; - final serviceName = service.text ?? service.textN ?? ''; + final serviceName = getIt.get().isArabic()? service.textN??service.text??"" : service.text??service.textN ?? ''; final price = service.priceTotal ?? 0.0; return RadioListTileWidget( value: service.iD ?? 0, diff --git a/lib/presentation/emergency_services/emergency_services_page.dart b/lib/presentation/emergency_services/emergency_services_page.dart index 3d5470a8..2d4ef828 100644 --- a/lib/presentation/emergency_services/emergency_services_page.dart +++ b/lib/presentation/emergency_services/emergency_services_page.dart @@ -90,7 +90,7 @@ class _EmergencyServicesPageState extends State { crossAxisAlignment: CrossAxisAlignment.start, children: [ LocaleKeys.callAmbulance.tr().toText16(isBold: true, color: AppColors.blackColor), - LocaleKeys.requestAmbulanceInEmergency.tr().toText12(color: AppColors.greyTextColor, isBold: true), + LocaleKeys.requestAmbulanceInEmergency.tr().toText12(color: AppColors.greyTextColor, isBold: true), ], ), ), diff --git a/lib/presentation/emergency_services/nearest_er_page.dart b/lib/presentation/emergency_services/nearest_er_page.dart index ea9a1517..97e601d5 100644 --- a/lib/presentation/emergency_services/nearest_er_page.dart +++ b/lib/presentation/emergency_services/nearest_er_page.dart @@ -92,7 +92,7 @@ class _NearestErPageState extends State { }, ); } else { - return Center(child: Utils.getNoDataWidget(context, noDataText: "No nearest Er Around you")); + return Center(child: Utils.getNoDataWidget(context, noDataText: LocaleKeys.noNearestER.tr())); } }), ), diff --git a/lib/presentation/health_calculators_and_converts/health_calculators_page.dart b/lib/presentation/health_calculators_and_converts/health_calculators_page.dart index a7fe0ef5..8b351ecf 100644 --- a/lib/presentation/health_calculators_and_converts/health_calculators_page.dart +++ b/lib/presentation/health_calculators_and_converts/health_calculators_page.dart @@ -146,7 +146,10 @@ class _HealthCalculatorsPageState extends State { SizedBox( width: 12.w, ), - Utils.buildSvgWithAssets(icon: AppAssets.arrowRight, width: 24.w, height: 24.h, fit: BoxFit.contain, iconColor: AppColors.textColor), + Transform.flip( + flipX: getIt.get().isArabic(), + child: Utils.buildSvgWithAssets(icon: AppAssets.arrowRight, width: 24.w, height: 24.h, + fit: BoxFit.contain, iconColor: AppColors.textColor),), ], ).paddingAll(16.w)) .onPress(() { @@ -172,8 +175,10 @@ class _HealthCalculatorsPageState extends State { ), ), SizedBox(width: 12.w), - Utils.buildSvgWithAssets(icon: AppAssets.arrowRight, width: 24.w, height: 24.h, fit: BoxFit.contain, iconColor: AppColors.textColor), - ], + Transform.flip( + flipX: getIt.get().isArabic(), + child: Utils.buildSvgWithAssets(icon: AppAssets.arrowRight, width: 24.w, height: 24.h, + fit: BoxFit.contain, iconColor: AppColors.textColor),), ], ).paddingAll(16.w)) .onPress(() { Navigator.of(context).push( @@ -201,8 +206,10 @@ class _HealthCalculatorsPageState extends State { ), ), SizedBox(width: 12.w), - Utils.buildSvgWithAssets(icon: AppAssets.arrowRight, width: 24.w, height: 24.h, fit: BoxFit.contain, iconColor: AppColors.textColor), - ], + Transform.flip( + flipX: getIt.get().isArabic(), + child: Utils.buildSvgWithAssets(icon: AppAssets.arrowRight, width: 24.w, height: 24.h, + fit: BoxFit.contain, iconColor: AppColors.textColor),), ], ).paddingAll(16.w)) .onPress(() { Navigator.of(context).push( diff --git a/lib/presentation/health_calculators_and_converts/widgets/bf.dart b/lib/presentation/health_calculators_and_converts/widgets/bf.dart index d71566a2..a2d804b0 100644 --- a/lib/presentation/health_calculators_and_converts/widgets/bf.dart +++ b/lib/presentation/health_calculators_and_converts/widgets/bf.dart @@ -26,7 +26,19 @@ class _BodyFatWidgetState extends State { final TextEditingController _neckController = TextEditingController(); final TextEditingController _waistController = TextEditingController(); final TextEditingController _hipController = TextEditingController(); - final List _heightUnits = ['cm', 'm', 'ft', 'in']; + + final Map _heightUnits = { + 'cm': LocaleKeys.cm, + 'm': LocaleKeys.m, + 'ft': LocaleKeys.ft, + 'in': LocaleKeys.inch, + }; + + final Map _genders = { + 'Male': LocaleKeys.malE, + 'Female': LocaleKeys.femaleGender, + }; + String selectedHeightUnit = 'cm'; String selectedNeckUnit = 'in'; String selectedWaistUnit = 'in'; @@ -82,6 +94,7 @@ class _BodyFatWidgetState extends State { decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 24.r, hasShadow: true), child: Column( children: [ + // === GENDER ROW === Row( crossAxisAlignment: CrossAxisAlignment.center, children: [ @@ -95,7 +108,7 @@ class _BodyFatWidgetState extends State { mainAxisAlignment: MainAxisAlignment.start, children: [ LocaleKeys.selectGender.tr(context: context).toText12(isBold: true, color: AppColors.inputLabelTextColor), - selectedGender.toText12(isBold: true, color: AppColors.textColor), + (_genders[selectedGender] ?? selectedGender).tr().toText12(isBold: true, color: AppColors.textColor), ], ), ], @@ -105,7 +118,6 @@ class _BodyFatWidgetState extends State { SizedBox(width: 4.w), ], ).paddingSymmetrical(0.w, 16.w).onPress(() { - List _genders = ["Male", "Female"]; dialogService.showFamilyBottomSheetWithoutHWithChild( label: LocaleKeys.selectGender.tr(context: context), message: "", @@ -116,7 +128,8 @@ class _BodyFatWidgetState extends State { shrinkWrap: true, itemCount: _genders.length, itemBuilder: (context, index) { - final unit = _genders[index]; + final key = _genders.keys.elementAt(index); + final localeKey = _genders[key]!; return Column( crossAxisAlignment: CrossAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.start, @@ -127,7 +140,7 @@ class _BodyFatWidgetState extends State { spacing: 8.h, children: [ Radio( - value: unit, + value: key, groupValue: selectedGender, activeColor: AppColors.errorColor, onChanged: (String? value) { @@ -140,13 +153,13 @@ class _BodyFatWidgetState extends State { }, materialTapTargetSize: MaterialTapTargetSize.shrinkWrap, ), - unit.toCamelCase.toText16(isBold: true, textOverflow: TextOverflow.ellipsis, maxlines: 1).expanded, + localeKey.tr().toText16(isBold: true, textOverflow: TextOverflow.ellipsis, maxlines: 1).expanded, ], ).onPress(() { setState(() { - selectedGender = unit; - _onInputChanged(); + selectedGender = key; }); + _onInputChanged(); Navigator.pop(context); }), ), @@ -162,6 +175,7 @@ class _BodyFatWidgetState extends State { ); }), Divider(height: 1, color: Color(0xFFEEEEEE)), + // === HEIGHT ROW === Row( crossAxisAlignment: CrossAxisAlignment.center, children: [ @@ -208,72 +222,24 @@ class _BodyFatWidgetState extends State { crossAxisAlignment: CrossAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.start, children: [ - "Unit".toText12(isBold: true, color: AppColors.inputLabelTextColor), - selectedHeightUnit.toText12(isBold: true, color: AppColors.textColor), + LocaleKeys.unit.tr(context: context).toText12(isBold: true, color: AppColors.inputLabelTextColor), + (_heightUnits[selectedHeightUnit] ?? selectedHeightUnit).tr().toText12(isBold: true, color: AppColors.textColor), ], ), SizedBox(width: 12.w), Utils.buildSvgWithAssets(icon: AppAssets.arrow_down) ], ).onPress(() { - dialogService.showFamilyBottomSheetWithoutHWithChild( - label: LocaleKeys.unit.tr(context: context), - message: "", - child: Container( - padding: EdgeInsets.only(left: 16.w, right: 16.w, top: 4.h, bottom: 4.h), - decoration: BoxDecoration(color: AppColors.whiteColor, borderRadius: BorderRadius.circular(20.r)), - child: ListView.separated( - shrinkWrap: true, - itemCount: _heightUnits.length, - itemBuilder: (context, index) { - final unit = _heightUnits[index]; - return Column( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisAlignment: MainAxisAlignment.start, - children: [ - SizedBox( - height: 70, - child: Row( - spacing: 8.h, - children: [ - Radio( - value: unit, - groupValue: selectedHeightUnit, - activeColor: AppColors.errorColor, - onChanged: (String? value) { - if (value == null) return; - setState(() { - selectedHeightUnit = value; - }); - Navigator.pop(context); - }, - materialTapTargetSize: MaterialTapTargetSize.shrinkWrap, - ), - unit.toUpperCase().toText16(isBold: true, textOverflow: TextOverflow.ellipsis, maxlines: 1).expanded, - ], - ).onPress(() { - setState(() { - selectedHeightUnit = unit; - _onInputChanged(); - }); - Navigator.pop(context); - }), - ), - ], - ); - }, - separatorBuilder: (BuildContext context, int index) { - return Divider(height: 1, color: Color(0xFFEEEEEE)); - }, - ), - ), - onOkPressed: () {}, - ); + _showUnitBottomSheet(context, dialogService, selectedHeightUnit, (value) { + setState(() { selectedHeightUnit = value; }); + _onInputChanged(); + }); }), ), ], ).paddingSymmetrical(0.w, 16.w), Divider(height: 1, color: Color(0xFFEEEEEE)), + // === NECK ROW === Row( crossAxisAlignment: CrossAxisAlignment.center, children: [ @@ -302,12 +268,7 @@ class _BodyFatWidgetState extends State { hintText: '7', hintStyle: TextStyle(color: Colors.grey), ), - style: const TextStyle( - fontSize: 14, - fontWeight: FontWeight.bold, - color: Colors.black87, - height: 1.0, - ), + style: const TextStyle(fontSize: 14, fontWeight: FontWeight.bold, color: Colors.black87, height: 1.0), ), ) ], @@ -326,71 +287,23 @@ class _BodyFatWidgetState extends State { mainAxisAlignment: MainAxisAlignment.start, children: [ LocaleKeys.unit.tr(context: context).toText12(isBold: true, color: AppColors.inputLabelTextColor), - selectedNeckUnit.toText12(isBold: true, color: AppColors.textColor), + (_heightUnits[selectedNeckUnit] ?? selectedNeckUnit).tr().toText12(isBold: true, color: AppColors.textColor), ], ), SizedBox(width: 12.w), Utils.buildSvgWithAssets(icon: AppAssets.arrow_down) ], ).onPress(() { - dialogService.showFamilyBottomSheetWithoutHWithChild( - label: LocaleKeys.unit.tr(context: context), - message: "", - child: Container( - padding: EdgeInsets.only(left: 16.w, right: 16.w, top: 4.h, bottom: 4.h), - decoration: BoxDecoration(color: AppColors.whiteColor, borderRadius: BorderRadius.circular(20.r)), - child: ListView.separated( - shrinkWrap: true, - itemCount: _heightUnits.length, - itemBuilder: (context, index) { - final unit = _heightUnits[index]; - return Column( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisAlignment: MainAxisAlignment.start, - children: [ - SizedBox( - height: 70, - child: Row( - spacing: 8.h, - children: [ - Radio( - value: unit, - groupValue: selectedNeckUnit, - activeColor: AppColors.errorColor, - onChanged: (String? value) { - if (value == null) return; - setState(() { - selectedNeckUnit = value; - }); - Navigator.pop(context); - }, - materialTapTargetSize: MaterialTapTargetSize.shrinkWrap, - ), - unit.toUpperCase().toText16(isBold: true, textOverflow: TextOverflow.ellipsis, maxlines: 1).expanded, - ], - ).onPress(() { - setState(() { - selectedNeckUnit = unit; - _onInputChanged(); - }); - Navigator.pop(context); - }), - ), - ], - ); - }, - separatorBuilder: (BuildContext context, int index) { - return Divider(height: 1, color: Color(0xFFEEEEEE)); - }, - ), - ), - onOkPressed: () {}, - ); + _showUnitBottomSheet(context, dialogService, selectedNeckUnit, (value) { + setState(() { selectedNeckUnit = value; }); + _onInputChanged(); + }); }), ), ], ).paddingSymmetrical(0.w, 16.w), Divider(height: 1, color: Color(0xFFEEEEEE)), + // === WAIST ROW === Row( crossAxisAlignment: CrossAxisAlignment.center, children: [ @@ -419,12 +332,7 @@ class _BodyFatWidgetState extends State { hintText: '30', hintStyle: TextStyle(color: Colors.grey), ), - style: const TextStyle( - fontSize: 14, - fontWeight: FontWeight.bold, - color: Colors.black87, - height: 1.0, - ), + style: const TextStyle(fontSize: 14, fontWeight: FontWeight.bold, color: Colors.black87, height: 1.0), ), ) ], @@ -442,72 +350,24 @@ class _BodyFatWidgetState extends State { crossAxisAlignment: CrossAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.start, children: [ - "Unit".toText12(isBold: true, color: AppColors.inputLabelTextColor), - selectedWaistUnit.toText12(isBold: true, color: AppColors.textColor), + LocaleKeys.unit.tr(context: context).toText12(isBold: true, color: AppColors.inputLabelTextColor), + (_heightUnits[selectedWaistUnit] ?? selectedWaistUnit).tr().toText12(isBold: true, color: AppColors.textColor), ], ), SizedBox(width: 12.w), Utils.buildSvgWithAssets(icon: AppAssets.arrow_down) ], ).onPress(() { - dialogService.showFamilyBottomSheetWithoutHWithChild( - label: LocaleKeys.unit.tr(context: context), - message: "", - child: Container( - padding: EdgeInsets.only(left: 16.w, right: 16.w, top: 4.h, bottom: 4.h), - decoration: BoxDecoration(color: AppColors.whiteColor, borderRadius: BorderRadius.circular(20.r)), - child: ListView.separated( - shrinkWrap: true, - itemCount: _heightUnits.length, - itemBuilder: (context, index) { - final unit = _heightUnits[index]; - return Column( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisAlignment: MainAxisAlignment.start, - children: [ - SizedBox( - height: 70, - child: Row( - spacing: 8.h, - children: [ - Radio( - value: unit, - groupValue: selectedWaistUnit, - activeColor: AppColors.errorColor, - onChanged: (String? value) { - if (value == null) return; - setState(() { - selectedWaistUnit = value; - }); - Navigator.pop(context); - }, - materialTapTargetSize: MaterialTapTargetSize.shrinkWrap, - ), - unit.toUpperCase().toText16(isBold: true, textOverflow: TextOverflow.ellipsis, maxlines: 1).expanded, - ], - ).onPress(() { - setState(() { - selectedWaistUnit = unit; - _onInputChanged(); - }); - Navigator.pop(context); - }), - ), - ], - ); - }, - separatorBuilder: (BuildContext context, int index) { - return Divider(height: 1, color: Color(0xFFEEEEEE)); - }, - ), - ), - onOkPressed: () {}, - ); + _showUnitBottomSheet(context, dialogService, selectedWaistUnit, (value) { + setState(() { selectedWaistUnit = value; }); + _onInputChanged(); + }); }), ), ], ).paddingSymmetrical(0.w, 16.w), Divider(height: 1, color: Color(0xFFEEEEEE)), + // === HIP ROW === Row( crossAxisAlignment: CrossAxisAlignment.center, children: [ @@ -536,12 +396,7 @@ class _BodyFatWidgetState extends State { hintText: '0', hintStyle: TextStyle(color: Colors.grey), ), - style: const TextStyle( - fontSize: 14, - fontWeight: FontWeight.bold, - color: Colors.black87, - height: 1.0, - ), + style: const TextStyle(fontSize: 14, fontWeight: FontWeight.bold, color: Colors.black87, height: 1.0), ), ) ], @@ -560,66 +415,17 @@ class _BodyFatWidgetState extends State { mainAxisAlignment: MainAxisAlignment.start, children: [ LocaleKeys.unit.tr(context: context).toText12(isBold: true, color: AppColors.inputLabelTextColor), - selectedHipUnit.toText12(isBold: true, color: AppColors.textColor), + (_heightUnits[selectedHipUnit] ?? selectedHipUnit).tr().toText12(isBold: true, color: AppColors.textColor), ], ), SizedBox(width: 12.w), Utils.buildSvgWithAssets(icon: AppAssets.arrow_down) ], ).onPress(() { - dialogService.showFamilyBottomSheetWithoutHWithChild( - label: LocaleKeys.unit.tr(context: context), - message: "", - child: Container( - padding: EdgeInsets.only(left: 16.w, right: 16.w, top: 4.h, bottom: 4.h), - decoration: BoxDecoration(color: AppColors.whiteColor, borderRadius: BorderRadius.circular(20.r)), - child: ListView.separated( - shrinkWrap: true, - itemCount: _heightUnits.length, - itemBuilder: (context, index) { - final unit = _heightUnits[index]; - return Column( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisAlignment: MainAxisAlignment.start, - children: [ - SizedBox( - height: 70, - child: Row( - spacing: 8.h, - children: [ - Radio( - value: unit, - groupValue: selectedHipUnit, - activeColor: AppColors.errorColor, - onChanged: (String? value) { - if (value == null) return; - setState(() { - selectedHipUnit = value; - }); - Navigator.pop(context); - }, - materialTapTargetSize: MaterialTapTargetSize.shrinkWrap, - ), - unit.toUpperCase().toText16(isBold: true, textOverflow: TextOverflow.ellipsis, maxlines: 1).expanded, - ], - ).onPress(() { - setState(() { - selectedHipUnit = unit; - _onInputChanged(); - }); - Navigator.pop(context); - }), - ), - ], - ); - }, - separatorBuilder: (BuildContext context, int index) { - return Divider(height: 1, color: Color(0xFFEEEEEE)); - }, - ), - ), - onOkPressed: () {}, - ); + _showUnitBottomSheet(context, dialogService, selectedHipUnit, (value) { + setState(() { selectedHipUnit = value; }); + _onInputChanged(); + }); }), ), ], @@ -631,7 +437,7 @@ class _BodyFatWidgetState extends State { Utils.buildSvgWithAssets(icon: AppAssets.globe, width: 18.w, height: 18.w), SizedBox(width: 12.w), Expanded( - child: "Estimate the total body fat based on the size.".toText12(isBold: true, color: AppColors.inputLabelTextColor), + child: LocaleKeys.bodyFatAlert.tr().toText12(isBold: true, color: AppColors.inputLabelTextColor), ), ], ).paddingSymmetrical(0.w, 16.w), @@ -640,4 +446,56 @@ class _BodyFatWidgetState extends State { ); }); } + + void _showUnitBottomSheet(BuildContext context, DialogService dialogService, String currentValue, Function(String) onSelected) { + dialogService.showFamilyBottomSheetWithoutHWithChild( + label: LocaleKeys.unit.tr(context: context), + message: "", + child: Container( + padding: EdgeInsets.only(left: 16.w, right: 16.w, top: 4.h, bottom: 4.h), + decoration: BoxDecoration(color: AppColors.whiteColor, borderRadius: BorderRadius.circular(20.r)), + child: ListView.separated( + shrinkWrap: true, + itemCount: _heightUnits.length, + itemBuilder: (context, index) { + final key = _heightUnits.keys.elementAt(index); + final localeKey = _heightUnits[key]!; + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + SizedBox( + height: 70, + child: Row( + spacing: 8.h, + children: [ + Radio( + value: key, + groupValue: currentValue, + activeColor: AppColors.errorColor, + onChanged: (String? value) { + if (value == null) return; + onSelected(value); + Navigator.pop(context); + }, + materialTapTargetSize: MaterialTapTargetSize.shrinkWrap, + ), + localeKey.tr().toText16(isBold: true, textOverflow: TextOverflow.ellipsis, maxlines: 1).expanded, + ], + ).onPress(() { + onSelected(key); + Navigator.pop(context); + }), + ), + ], + ); + }, + separatorBuilder: (BuildContext context, int index) { + return Divider(height: 1, color: Color(0xFFEEEEEE)); + }, + ), + ), + onOkPressed: () {}, + ); + } } diff --git a/lib/presentation/health_calculators_and_converts/widgets/blood_sugar.dart b/lib/presentation/health_calculators_and_converts/widgets/blood_sugar.dart index f2110646..670236de 100644 --- a/lib/presentation/health_calculators_and_converts/widgets/blood_sugar.dart +++ b/lib/presentation/health_calculators_and_converts/widgets/blood_sugar.dart @@ -1,4 +1,6 @@ +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; import 'package:provider/provider.dart'; import 'package:hmg_patient_app_new/core/app_assets.dart'; import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; @@ -129,7 +131,7 @@ class _BloodSugarWidgetState extends State { ), SizedBox(width: 12.w), Expanded( - child: "Convert blood glucose values between mg/dL and mmol/L. (1 mmol/L ≈ 18.0182 mg/dL)".toText12( + child: LocaleKeys.glucoseAlert.tr().toText12( isBold: true, color: AppColors.inputLabelTextColor, ), diff --git a/lib/presentation/health_calculators_and_converts/widgets/bmr.dart b/lib/presentation/health_calculators_and_converts/widgets/bmr.dart index 003faf06..2b013549 100644 --- a/lib/presentation/health_calculators_and_converts/widgets/bmr.dart +++ b/lib/presentation/health_calculators_and_converts/widgets/bmr.dart @@ -26,8 +26,31 @@ class _BMRWidgetState extends State { final TextEditingController _heightController = TextEditingController(); final TextEditingController _weightController = TextEditingController(); final TextEditingController _ageController = TextEditingController(); - final List _heightUnits = ['cm', 'm', 'ft', 'in']; - final List _weightUnits = ['kg', 'lb']; + + final Map _heightUnits = { + 'cm': LocaleKeys.cm, + 'm': LocaleKeys.m, + 'ft': LocaleKeys.ft, + 'in': LocaleKeys.inch, + }; + + final Map _weightUnits = { + 'kg': LocaleKeys.kg, + 'lb': LocaleKeys.lb, + }; + + final Map _genders = { + 'Male': LocaleKeys.malE, + 'Female': LocaleKeys.femaleGender, + }; + + final Map _activityLevels = { + 'Almost Inactive (no exercise)': LocaleKeys.almostInactive, + 'Lightly active': LocaleKeys.lightlyActive, + 'Lightly active (1-3) days per week': LocaleKeys.lightlyActive13Days, + 'Super active (very hard exercise)': LocaleKeys.superActive, + }; + String selectedHeightUnit = 'cm'; String selectedWeightUnit = 'kg'; String selectedActivityLevel = 'Lightly active'; @@ -90,7 +113,7 @@ class _BMRWidgetState extends State { mainAxisAlignment: MainAxisAlignment.start, children: [ LocaleKeys.selectGender.tr(context: context).toText12(isBold: true, color: AppColors.inputLabelTextColor), - selectedGender.toCamelCase.toText12(isBold: true, color: AppColors.textColor), + (_genders[selectedGender] ?? selectedGender).tr().toText12(isBold: true, color: AppColors.textColor), ], ), ], @@ -100,8 +123,6 @@ class _BMRWidgetState extends State { SizedBox(width: 4.w), ], ).paddingSymmetrical(0.w, 16.w).onPress(() { - List _genders = ["Male", "Female"]; - dialogService.showFamilyBottomSheetWithoutHWithChild( label: LocaleKeys.selectGender.tr(context: context), message: "", @@ -112,7 +133,8 @@ class _BMRWidgetState extends State { shrinkWrap: true, itemCount: _genders.length, itemBuilder: (context, index) { - final unit = _genders[index]; + final key = _genders.keys.elementAt(index); + final localeKey = _genders[key]!; return Column( crossAxisAlignment: CrossAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.start, @@ -123,12 +145,11 @@ class _BMRWidgetState extends State { spacing: 8.h, children: [ Radio( - value: unit, + value: key, groupValue: selectedGender, activeColor: AppColors.errorColor, onChanged: (String? value) { if (value == null) return; - print(value); setState(() { selectedGender = value; }); @@ -137,11 +158,11 @@ class _BMRWidgetState extends State { }, materialTapTargetSize: MaterialTapTargetSize.shrinkWrap, ), - unit.toCamelCase.toText16(isBold: true, textOverflow: TextOverflow.ellipsis, maxlines: 1).expanded, + localeKey.tr().toText16(isBold: true, textOverflow: TextOverflow.ellipsis, maxlines: 1).expanded, ], ).onPress(() { setState(() { - selectedGender = unit; + selectedGender = key; }); _onInputChanged(); Navigator.pop(context); @@ -243,7 +264,7 @@ class _BMRWidgetState extends State { mainAxisAlignment: MainAxisAlignment.start, children: [ LocaleKeys.unit.tr(context: context).toText12(isBold: true, color: AppColors.inputLabelTextColor), - selectedHeightUnit.toText12(isBold: true, color: AppColors.textColor), + (_heightUnits[selectedHeightUnit] ?? selectedHeightUnit).tr().toText12(isBold: true, color: AppColors.textColor), ], ), SizedBox(width: 12.w), @@ -260,7 +281,8 @@ class _BMRWidgetState extends State { shrinkWrap: true, itemCount: _heightUnits.length, itemBuilder: (context, index) { - final unit = _heightUnits[index]; + final key = _heightUnits.keys.elementAt(index); + final localeKey = _heightUnits[key]!; return Column( crossAxisAlignment: CrossAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.start, @@ -271,7 +293,7 @@ class _BMRWidgetState extends State { spacing: 8.h, children: [ Radio( - value: unit, + value: key, groupValue: selectedHeightUnit, activeColor: AppColors.errorColor, onChanged: (String? value) { @@ -284,13 +306,13 @@ class _BMRWidgetState extends State { }, materialTapTargetSize: MaterialTapTargetSize.shrinkWrap, ), - unit.toUpperCase().toText16(isBold: true, textOverflow: TextOverflow.ellipsis, maxlines: 1).expanded, + localeKey.tr().toText16(isBold: true, textOverflow: TextOverflow.ellipsis, maxlines: 1).expanded, ], ).onPress(() { setState(() { - selectedHeightUnit = unit; - _onInputChanged(); + selectedHeightUnit = key; }); + _onInputChanged(); Navigator.pop(context); }), ), @@ -361,7 +383,7 @@ class _BMRWidgetState extends State { mainAxisAlignment: MainAxisAlignment.start, children: [ "Unit".toText12(isBold: true, color: AppColors.inputLabelTextColor), - selectedWeightUnit.toText12(isBold: true, color: AppColors.textColor), + (_weightUnits[selectedWeightUnit] ?? selectedWeightUnit).tr().toText12(isBold: true, color: AppColors.textColor), ], ), SizedBox(width: 12.w), @@ -378,7 +400,8 @@ class _BMRWidgetState extends State { shrinkWrap: true, itemCount: _weightUnits.length, itemBuilder: (context, index) { - final unit = _weightUnits[index]; + final key = _weightUnits.keys.elementAt(index); + final localeKey = _weightUnits[key]!; return Column( crossAxisAlignment: CrossAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.start, @@ -389,7 +412,7 @@ class _BMRWidgetState extends State { spacing: 8.h, children: [ Radio( - value: unit, + value: key, groupValue: selectedWeightUnit, activeColor: AppColors.errorColor, onChanged: (String? value) { @@ -402,13 +425,13 @@ class _BMRWidgetState extends State { }, materialTapTargetSize: MaterialTapTargetSize.shrinkWrap, ), - unit.toUpperCase().toText16(isBold: true, textOverflow: TextOverflow.ellipsis, maxlines: 1).expanded, + localeKey.tr().toText16(isBold: true, textOverflow: TextOverflow.ellipsis, maxlines: 1).expanded, ], ).onPress(() { setState(() { - selectedWeightUnit = unit; - _onInputChanged(); + selectedWeightUnit = key; }); + _onInputChanged(); Navigator.pop(context); }), ), @@ -440,7 +463,7 @@ class _BMRWidgetState extends State { mainAxisAlignment: MainAxisAlignment.start, children: [ LocaleKeys.activityLevel.tr(context: context).toText12(isBold: true, color: AppColors.inputLabelTextColor), - selectedActivityLevel.toText12(isBold: true, color: AppColors.textColor), + (_activityLevels[selectedActivityLevel] ?? selectedActivityLevel).tr().toText12(isBold: true, color: AppColors.textColor), ], ), ], @@ -450,7 +473,6 @@ class _BMRWidgetState extends State { SizedBox(width: 4.w), ], ).paddingSymmetrical(0.w, 16.w).onPress(() { - List _activity = ["Almost Inactive (no exercise)", "Lightly active", "Lightly active (1-3) days per week", "Super active (very hard exercise)"]; dialogService.showFamilyBottomSheetWithoutHWithChild( label: LocaleKeys.selectActivityLevel.tr(context: context), message: "", @@ -459,9 +481,10 @@ class _BMRWidgetState extends State { decoration: BoxDecoration(color: AppColors.whiteColor, borderRadius: BorderRadius.circular(20.r)), child: ListView.separated( shrinkWrap: true, - itemCount: _activity.length, + itemCount: _activityLevels.length, itemBuilder: (context, index) { - final unit = _activity[index]; + final key = _activityLevels.keys.elementAt(index); + final localeKey = _activityLevels[key]!; return Column( crossAxisAlignment: CrossAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.start, @@ -472,7 +495,7 @@ class _BMRWidgetState extends State { spacing: 8.h, children: [ Radio( - value: unit, + value: key, groupValue: selectedActivityLevel, activeColor: AppColors.errorColor, onChanged: (String? value) { @@ -485,13 +508,13 @@ class _BMRWidgetState extends State { }, materialTapTargetSize: MaterialTapTargetSize.shrinkWrap, ), - unit.toCamelCase.toText16(isBold: true, textOverflow: TextOverflow.ellipsis, maxlines: 1).expanded, + localeKey.tr().toText16(isBold: true, textOverflow: TextOverflow.ellipsis, maxlines: 1).expanded, ], ).onPress(() { setState(() { - selectedActivityLevel = unit; - _onInputChanged(); + selectedActivityLevel = key; }); + _onInputChanged(); Navigator.pop(context); }), ), diff --git a/lib/presentation/health_calculators_and_converts/widgets/calories.dart b/lib/presentation/health_calculators_and_converts/widgets/calories.dart index d354ce8e..ad31cd6c 100644 --- a/lib/presentation/health_calculators_and_converts/widgets/calories.dart +++ b/lib/presentation/health_calculators_and_converts/widgets/calories.dart @@ -26,8 +26,31 @@ class _CaloriesWidgetState extends State { final TextEditingController _heightController = TextEditingController(); final TextEditingController _weightController = TextEditingController(); final TextEditingController _ageController = TextEditingController(); - final List _heightUnits = ['cm', 'm', 'ft', 'in']; - final List _weightUnits = ['kg', 'lb']; + + final Map _heightUnits = { + 'cm': LocaleKeys.cm, + 'm': LocaleKeys.m, + 'ft': LocaleKeys.ft, + 'in': LocaleKeys.inch, + }; + + final Map _weightUnits = { + 'kg': LocaleKeys.kg, + 'lb': LocaleKeys.lb, + }; + + final Map _genders = { + 'Male': LocaleKeys.malE, + 'Female': LocaleKeys.femaleGender, + }; + + final Map _activityLevels = { + 'Almost Inactive (no exercise)': LocaleKeys.almostInactive, + 'Lightly active': LocaleKeys.lightlyActive, + 'Lightly active (1-3) days per week': LocaleKeys.lightlyActive13Days, + 'Super active (very hard exercise)': LocaleKeys.superActive, + }; + String selectedHeightUnit = 'cm'; String selectedWeightUnit = 'kg'; String selectedActivityLevel = 'Lightly active'; @@ -69,7 +92,6 @@ class _CaloriesWidgetState extends State { @override Widget build(BuildContext context) { DialogService dialogService = getIt(); - AppState appState = getIt(); return Consumer(builder: (context, provider, _) { return Container( @@ -78,6 +100,7 @@ class _CaloriesWidgetState extends State { decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 24.r, hasShadow: true), child: Column( children: [ + // === GENDER ROW === Row( crossAxisAlignment: CrossAxisAlignment.center, children: [ @@ -90,8 +113,8 @@ class _CaloriesWidgetState extends State { crossAxisAlignment: CrossAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.start, children: [ - "Select Gender".toText12(isBold: true, color: AppColors.inputLabelTextColor), - selectedGender.toCamelCase.toText12(isBold: true, color: AppColors.textColor), + LocaleKeys.selectGender.tr(context: context).toText12(isBold: true, color: AppColors.inputLabelTextColor), + (_genders[selectedGender] ?? selectedGender).tr().toText12(isBold: true, color: AppColors.textColor), ], ), ], @@ -101,8 +124,6 @@ class _CaloriesWidgetState extends State { SizedBox(width: 4.w), ], ).paddingSymmetrical(0.w, 16.w).onPress(() { - List _genders = ["Male", "Female"]; - dialogService.showFamilyBottomSheetWithoutHWithChild( label: LocaleKeys.selectGender.tr(context: context), message: "", @@ -113,7 +134,8 @@ class _CaloriesWidgetState extends State { shrinkWrap: true, itemCount: _genders.length, itemBuilder: (context, index) { - final unit = _genders[index]; + final key = _genders.keys.elementAt(index); + final localeKey = _genders[key]!; return Column( crossAxisAlignment: CrossAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.start, @@ -124,7 +146,7 @@ class _CaloriesWidgetState extends State { spacing: 8.h, children: [ Radio( - value: unit, + value: key, groupValue: selectedGender, activeColor: AppColors.errorColor, onChanged: (String? value) { @@ -137,13 +159,13 @@ class _CaloriesWidgetState extends State { }, materialTapTargetSize: MaterialTapTargetSize.shrinkWrap, ), - unit.toCamelCase.toText16(isBold: true, textOverflow: TextOverflow.ellipsis, maxlines: 1).expanded, + localeKey.tr().toText16(isBold: true, textOverflow: TextOverflow.ellipsis, maxlines: 1).expanded, ], ).onPress(() { setState(() { - selectedGender = unit; - _onInputChanged(); + selectedGender = key; }); + _onInputChanged(); Navigator.pop(context); }), ), @@ -159,6 +181,7 @@ class _CaloriesWidgetState extends State { ); }), Divider(height: 1, color: Color(0xFFEEEEEE)), + // === AGE ROW (unchanged) === Row( crossAxisAlignment: CrossAxisAlignment.center, children: [ @@ -196,6 +219,7 @@ class _CaloriesWidgetState extends State { ], ).paddingSymmetrical(0.w, 16.w), Divider(height: 1, color: Color(0xFFEEEEEE)), + // === HEIGHT ROW === Row( crossAxisAlignment: CrossAxisAlignment.center, children: [ @@ -242,72 +266,24 @@ class _CaloriesWidgetState extends State { crossAxisAlignment: CrossAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.start, children: [ - "Unit".toText12(isBold: true, color: AppColors.inputLabelTextColor), - selectedHeightUnit.toText12(isBold: true, color: AppColors.textColor), + LocaleKeys.unit.tr(context: context).toText12(isBold: true, color: AppColors.inputLabelTextColor), + (_heightUnits[selectedHeightUnit] ?? selectedHeightUnit).tr().toText12(isBold: true, color: AppColors.textColor), ], ), SizedBox(width: 12.w), Utils.buildSvgWithAssets(icon: AppAssets.arrow_down) ], ).onPress(() { - dialogService.showFamilyBottomSheetWithoutHWithChild( - label: LocaleKeys.unit.tr(context: context), - message: "", - child: Container( - padding: EdgeInsets.only(left: 16.w, right: 16.w, top: 4.h, bottom: 4.h), - decoration: BoxDecoration(color: AppColors.whiteColor, borderRadius: BorderRadius.circular(20.r)), - child: ListView.separated( - shrinkWrap: true, - itemCount: _heightUnits.length, - itemBuilder: (context, index) { - final unit = _heightUnits[index]; - return Column( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisAlignment: MainAxisAlignment.start, - children: [ - SizedBox( - height: 70, - child: Row( - spacing: 8.h, - children: [ - Radio( - value: unit, - groupValue: selectedHeightUnit, - activeColor: AppColors.errorColor, - onChanged: (String? value) { - if (value == null) return; - setState(() { - selectedHeightUnit = value; - }); - Navigator.pop(context); - }, - materialTapTargetSize: MaterialTapTargetSize.shrinkWrap, - ), - unit.toUpperCase().toText16(isBold: true, textOverflow: TextOverflow.ellipsis, maxlines: 1).expanded, - ], - ).onPress(() { - setState(() { - selectedHeightUnit = unit; - _onInputChanged(); - }); - Navigator.pop(context); - }), - ), - ], - ); - }, - separatorBuilder: (BuildContext context, int index) { - return Divider(height: 1, color: Color(0xFFEEEEEE)); - }, - ), - ), - onOkPressed: () {}, - ); + _showUnitBottomSheet(context, dialogService, _heightUnits, selectedHeightUnit, (value) { + setState(() { selectedHeightUnit = value; }); + _onInputChanged(); + }); }), ), ], ).paddingSymmetrical(0.w, 16.w), Divider(height: 1, color: Color(0xFFEEEEEE)), + // === WEIGHT ROW === Row( crossAxisAlignment: CrossAxisAlignment.center, children: [ @@ -359,73 +335,24 @@ class _CaloriesWidgetState extends State { crossAxisAlignment: CrossAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.start, children: [ - "Unit".toText12(isBold: true, color: AppColors.inputLabelTextColor), - selectedWeightUnit.toText12(isBold: true, color: AppColors.textColor), + LocaleKeys.unit.tr(context: context).toText12(isBold: true, color: AppColors.inputLabelTextColor), + (_weightUnits[selectedWeightUnit] ?? selectedWeightUnit).tr().toText12(isBold: true, color: AppColors.textColor), ], ), SizedBox(width: 12.w), Utils.buildSvgWithAssets(icon: AppAssets.arrow_down) ], ).onPress(() { - dialogService.showFamilyBottomSheetWithoutHWithChild( - label: LocaleKeys.unit.tr(context: context), - message: "", - child: Container( - padding: EdgeInsets.only(left: 16.w, right: 16.w, top: 4.h, bottom: 4.h), - decoration: BoxDecoration(color: AppColors.whiteColor, borderRadius: BorderRadius.circular(20.r)), - child: ListView.separated( - shrinkWrap: true, - itemCount: _weightUnits.length, - itemBuilder: (context, index) { - final unit = _weightUnits[index]; - return Column( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisAlignment: MainAxisAlignment.start, - children: [ - SizedBox( - height: 70, - child: Row( - spacing: 8.h, - children: [ - Radio( - value: unit, - groupValue: selectedWeightUnit, - activeColor: AppColors.errorColor, - onChanged: (String? value) { - if (value == null) return; - setState(() { - selectedWeightUnit = value; - }); - _onInputChanged(); - Navigator.pop(context); - }, - materialTapTargetSize: MaterialTapTargetSize.shrinkWrap, - ), - unit.toUpperCase().toText16(isBold: true, textOverflow: TextOverflow.ellipsis, maxlines: 1).expanded, - ], - ).onPress(() { - setState(() { - selectedWeightUnit = unit; - _onInputChanged(); - }); - Navigator.pop(context); - }), - ), - ], - ); - }, - separatorBuilder: (BuildContext context, int index) { - return Divider(height: 1, color: Color(0xFFEEEEEE)); - }, - ), - ), - onOkPressed: () {}, - ); + _showUnitBottomSheet(context, dialogService, _weightUnits, selectedWeightUnit, (value) { + setState(() { selectedWeightUnit = value; }); + _onInputChanged(); + }); }), ), ], ).paddingSymmetrical(0.w, 16.w), Divider(height: 1, color: Color(0xFFEEEEEE)), + // === ACTIVITY LEVEL ROW === Row( crossAxisAlignment: CrossAxisAlignment.center, children: [ @@ -439,7 +366,7 @@ class _CaloriesWidgetState extends State { mainAxisAlignment: MainAxisAlignment.start, children: [ LocaleKeys.activityLevel.tr(context: context).toText12(isBold: true, color: AppColors.inputLabelTextColor), - selectedActivityLevel.toText12(isBold: true, color: AppColors.textColor), + (_activityLevels[selectedActivityLevel] ?? selectedActivityLevel).tr().toText12(isBold: true, color: AppColors.textColor), ], ), ], @@ -449,7 +376,6 @@ class _CaloriesWidgetState extends State { SizedBox(width: 4.w), ], ).paddingSymmetrical(0.w, 16.w).onPress(() { - List _activity = ["Almost Inactive (no exercise)", "Lightly active", "Lightly active (1-3) days per week", "Super active (very hard exercise)"]; dialogService.showFamilyBottomSheetWithoutHWithChild( label: LocaleKeys.selectActivityLevel.tr(context: context), message: "", @@ -458,9 +384,10 @@ class _CaloriesWidgetState extends State { decoration: BoxDecoration(color: AppColors.whiteColor, borderRadius: BorderRadius.circular(20.r)), child: ListView.separated( shrinkWrap: true, - itemCount: _activity.length, + itemCount: _activityLevels.length, itemBuilder: (context, index) { - final unit = _activity[index]; + final key = _activityLevels.keys.elementAt(index); + final localeKey = _activityLevels[key]!; return Column( crossAxisAlignment: CrossAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.start, @@ -471,7 +398,7 @@ class _CaloriesWidgetState extends State { spacing: 8.h, children: [ Radio( - value: unit, + value: key, groupValue: selectedActivityLevel, activeColor: AppColors.errorColor, onChanged: (String? value) { @@ -484,13 +411,13 @@ class _CaloriesWidgetState extends State { }, materialTapTargetSize: MaterialTapTargetSize.shrinkWrap, ), - unit.toCamelCase.toText16(isBold: true, textOverflow: TextOverflow.ellipsis, maxlines: 1).expanded, + localeKey.tr().toText16(isBold: true, textOverflow: TextOverflow.ellipsis, maxlines: 1).expanded, ], ).onPress(() { setState(() { - selectedActivityLevel = unit; - _onInputChanged(); + selectedActivityLevel = key; }); + _onInputChanged(); Navigator.pop(context); }), ), @@ -522,4 +449,56 @@ class _CaloriesWidgetState extends State { ); }); } + + void _showUnitBottomSheet(BuildContext context, DialogService dialogService, Map units, String currentValue, Function(String) onSelected) { + dialogService.showFamilyBottomSheetWithoutHWithChild( + label: LocaleKeys.unit.tr(context: context), + message: "", + child: Container( + padding: EdgeInsets.only(left: 16.w, right: 16.w, top: 4.h, bottom: 4.h), + decoration: BoxDecoration(color: AppColors.whiteColor, borderRadius: BorderRadius.circular(20.r)), + child: ListView.separated( + shrinkWrap: true, + itemCount: units.length, + itemBuilder: (context, index) { + final key = units.keys.elementAt(index); + final localeKey = units[key]!; + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + SizedBox( + height: 70, + child: Row( + spacing: 8.h, + children: [ + Radio( + value: key, + groupValue: currentValue, + activeColor: AppColors.errorColor, + onChanged: (String? value) { + if (value == null) return; + onSelected(value); + Navigator.pop(context); + }, + materialTapTargetSize: MaterialTapTargetSize.shrinkWrap, + ), + localeKey.tr().toText16(isBold: true, textOverflow: TextOverflow.ellipsis, maxlines: 1).expanded, + ], + ).onPress(() { + onSelected(key); + Navigator.pop(context); + }), + ), + ], + ); + }, + separatorBuilder: (BuildContext context, int index) { + return Divider(height: 1, color: Color(0xFFEEEEEE)); + }, + ), + ), + onOkPressed: () {}, + ); + } } diff --git a/lib/presentation/health_calculators_and_converts/widgets/crabs.dart b/lib/presentation/health_calculators_and_converts/widgets/crabs.dart index e3e7c1e3..8a2f6343 100644 --- a/lib/presentation/health_calculators_and_converts/widgets/crabs.dart +++ b/lib/presentation/health_calculators_and_converts/widgets/crabs.dart @@ -187,7 +187,7 @@ class _CrabsWidgetState extends State { Utils.buildSvgWithAssets(icon: AppAssets.globe, width: 18.w, height: 18.w), SizedBox(width: 12.w), Expanded( - child: "Calculate carbohydrate based protein and fat ration in calories and grams according to a pre set ratio." + child: LocaleKeys.carbsAlert.tr() .toText12(isBold: true, color: AppColors.inputLabelTextColor), ), ], diff --git a/lib/presentation/health_calculators_and_converts/widgets/ibw.dart b/lib/presentation/health_calculators_and_converts/widgets/ibw.dart index 070e373e..f9d7e964 100644 --- a/lib/presentation/health_calculators_and_converts/widgets/ibw.dart +++ b/lib/presentation/health_calculators_and_converts/widgets/ibw.dart @@ -24,12 +24,24 @@ class IdealBodyWeightWidget extends StatefulWidget { class _IdealBodyWeightWidgetState extends State { final TextEditingController _heightController = TextEditingController(); final TextEditingController _weightController = TextEditingController(); - final List _heightUnits = ['cm', 'm', 'ft', 'in']; - final List _weightUnits = ['kg', 'lb']; + final Map _heightUnits = { + 'cm': LocaleKeys.cm, + 'm': LocaleKeys.m, + 'ft': LocaleKeys.ft, + 'in': LocaleKeys.inch, + }; + final Map _weightUnits = { + 'kg': LocaleKeys.kg, + 'lb': LocaleKeys.lb, + }; + final Map _bodyFrameSizes = { + 'Small (fingers overlaps)': LocaleKeys.bodyFrameSmall, + 'Medium (fingers touch)': LocaleKeys.bodyFrameMedium, + "Large (fingers don't touch)": LocaleKeys.bodyFrameLarge, + }; String selectedHeightUnit = 'cm'; String selectedWeightUnit = 'kg'; String selectedBodyFrameSize = 'Medium (fingers touch)'; - Function(String)? onUnitSelected; @override void initState() { @@ -117,7 +129,7 @@ class _IdealBodyWeightWidgetState extends State { mainAxisAlignment: MainAxisAlignment.start, children: [ LocaleKeys.unit.tr(context: context).toText12(isBold: true, color: AppColors.inputLabelTextColor), - selectedHeightUnit.toText12(isBold: true, color: AppColors.textColor), + (_heightUnits[selectedHeightUnit] ?? selectedHeightUnit).tr().toText12(isBold: true, color: AppColors.textColor), ], ), SizedBox(width: 12.w), @@ -134,7 +146,8 @@ class _IdealBodyWeightWidgetState extends State { shrinkWrap: true, itemCount: _heightUnits.length, itemBuilder: (context, index) { - final unit = _heightUnits[index]; + final key = _heightUnits.keys.elementAt(index); + final localeKey = _heightUnits[key]!; return Column( crossAxisAlignment: CrossAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.start, @@ -145,7 +158,7 @@ class _IdealBodyWeightWidgetState extends State { spacing: 8.h, children: [ Radio( - value: unit, + value: key, groupValue: selectedHeightUnit, activeColor: AppColors.errorColor, onChanged: (String? value) { @@ -153,17 +166,18 @@ class _IdealBodyWeightWidgetState extends State { setState(() { selectedHeightUnit = value; }); + _onInputChanged(); Navigator.pop(context); }, materialTapTargetSize: MaterialTapTargetSize.shrinkWrap, ), - unit.toUpperCase().toText16(isBold: true, textOverflow: TextOverflow.ellipsis, maxlines: 1).expanded, + localeKey.tr().toText16(isBold: true, textOverflow: TextOverflow.ellipsis, maxlines: 1).expanded, ], ).onPress(() { setState(() { - selectedHeightUnit = unit; - _onInputChanged(); + selectedHeightUnit = key; }); + _onInputChanged(); Navigator.pop(context); }), ), @@ -234,7 +248,7 @@ class _IdealBodyWeightWidgetState extends State { mainAxisAlignment: MainAxisAlignment.start, children: [ LocaleKeys.unit.tr(context: context).toText12(isBold: true, color: AppColors.inputLabelTextColor), - selectedWeightUnit.toText12(isBold: true, color: AppColors.textColor), + (_weightUnits[selectedWeightUnit] ?? selectedWeightUnit).tr().toText12(isBold: true, color: AppColors.textColor), ], ), SizedBox(width: 12.w), @@ -251,7 +265,8 @@ class _IdealBodyWeightWidgetState extends State { shrinkWrap: true, itemCount: _weightUnits.length, itemBuilder: (context, index) { - final unit = _weightUnits[index]; + final key = _weightUnits.keys.elementAt(index); + final localeKey = _weightUnits[key]!; return Column( crossAxisAlignment: CrossAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.start, @@ -262,7 +277,7 @@ class _IdealBodyWeightWidgetState extends State { spacing: 8.h, children: [ Radio( - value: unit, + value: key, groupValue: selectedWeightUnit, activeColor: AppColors.errorColor, onChanged: (String? value) { @@ -270,16 +285,18 @@ class _IdealBodyWeightWidgetState extends State { setState(() { selectedWeightUnit = value; }); + _onInputChanged(); + Navigator.pop(context); }, materialTapTargetSize: MaterialTapTargetSize.shrinkWrap, ), - unit.toUpperCase().toText16(isBold: true, textOverflow: TextOverflow.ellipsis, maxlines: 1).expanded, + localeKey.tr().toText16(isBold: true, textOverflow: TextOverflow.ellipsis, maxlines: 1).expanded, ], ).onPress(() { setState(() { - selectedWeightUnit = unit; - _onInputChanged(); + selectedWeightUnit = key; }); + _onInputChanged(); Navigator.pop(context); }), ), @@ -311,7 +328,7 @@ class _IdealBodyWeightWidgetState extends State { mainAxisAlignment: MainAxisAlignment.start, children: [ LocaleKeys.bodyFrameSize.tr(context: context).toText12(isBold: true, color: AppColors.inputLabelTextColor), - selectedBodyFrameSize.toText12(isBold: true, color: AppColors.textColor), + (_bodyFrameSizes[selectedBodyFrameSize] ?? selectedBodyFrameSize).tr().toText12(isBold: true, color: AppColors.textColor), ], ), ], @@ -321,7 +338,6 @@ class _IdealBodyWeightWidgetState extends State { SizedBox(width: 4.w), ], ).paddingSymmetrical(0.w, 16.w).onPress(() { - List _activity = ["Small (fingers overlaps)", "Medium (fingers touch)", "Large (fingers don't touch)"]; dialogService.showFamilyBottomSheetWithoutHWithChild( label: LocaleKeys.selectBodyFrameSize.tr(context: context), message: "", @@ -330,9 +346,10 @@ class _IdealBodyWeightWidgetState extends State { decoration: BoxDecoration(color: AppColors.whiteColor, borderRadius: BorderRadius.circular(20.r)), child: ListView.separated( shrinkWrap: true, - itemCount: _activity.length, + itemCount: _bodyFrameSizes.length, itemBuilder: (context, index) { - final unit = _activity[index]; + final key = _bodyFrameSizes.keys.elementAt(index); + final localeKey = _bodyFrameSizes[key]!; return Column( crossAxisAlignment: CrossAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.start, @@ -343,7 +360,7 @@ class _IdealBodyWeightWidgetState extends State { spacing: 8.h, children: [ Radio( - value: unit, + value: key, groupValue: selectedBodyFrameSize, activeColor: AppColors.errorColor, onChanged: (String? value) { @@ -351,17 +368,18 @@ class _IdealBodyWeightWidgetState extends State { setState(() { selectedBodyFrameSize = value; }); + _onInputChanged(); Navigator.pop(context); }, materialTapTargetSize: MaterialTapTargetSize.shrinkWrap, ), - unit.toCamelCase.toText16(isBold: true, textOverflow: TextOverflow.ellipsis, maxlines: 1).expanded, + localeKey.tr().toText16(isBold: true, textOverflow: TextOverflow.ellipsis, maxlines: 1).expanded, ], ).onPress(() { setState(() { - selectedBodyFrameSize = unit; - _onInputChanged(); + selectedBodyFrameSize = key; }); + _onInputChanged(); Navigator.pop(context); }), ), @@ -383,7 +401,7 @@ class _IdealBodyWeightWidgetState extends State { Utils.buildSvgWithAssets(icon: AppAssets.globe, width: 18.w, height: 18.w), SizedBox(width: 12.w), Expanded( - child: "Calculates the ideal body weight based on height, weight and body size.".toText12(isBold: true, color: AppColors.inputLabelTextColor), + child: LocaleKeys.ibwAlert.tr().toText12(isBold: true, color: AppColors.inputLabelTextColor), ), ], ).paddingSymmetrical(0.w, 16.w), diff --git a/lib/presentation/medical_file/medical_file_page.dart b/lib/presentation/medical_file/medical_file_page.dart index 89839f0d..d17ba896 100644 --- a/lib/presentation/medical_file/medical_file_page.dart +++ b/lib/presentation/medical_file/medical_file_page.dart @@ -27,6 +27,7 @@ import 'package:hmg_patient_app_new/features/insurance/insurance_view_model.dart import 'package:hmg_patient_app_new/features/lab/lab_view_model.dart'; import 'package:hmg_patient_app_new/features/medical_file/medical_file_view_model.dart'; import 'package:hmg_patient_app_new/features/medical_file/models/family_file_response_model.dart'; +import 'package:hmg_patient_app_new/features/medical_file/models/patient_medical_response_model.dart'; import 'package:hmg_patient_app_new/features/medical_file/models/patient_sickleave_response_model.dart'; import 'package:hmg_patient_app_new/features/monthly_report/monthly_report_view_model.dart'; import 'package:hmg_patient_app_new/features/my_appointments/models/resp_models/patient_appointment_history_response_model.dart'; @@ -59,6 +60,7 @@ import 'package:hmg_patient_app_new/presentation/medical_file/widgets/lab_rad_ca import 'package:hmg_patient_app_new/presentation/medical_file/widgets/health_tracker_menu_card.dart'; import 'package:hmg_patient_app_new/presentation/medical_file/widgets/health_tools_card.dart'; import 'package:hmg_patient_app_new/presentation/medical_file/widgets/medical_file_card.dart'; +import 'package:hmg_patient_app_new/presentation/medical_file/widgets/medical_report_card.dart'; import 'package:hmg_patient_app_new/presentation/medical_file/widgets/patient_sick_leave_card.dart'; import 'package:hmg_patient_app_new/presentation/medical_report/medical_reports_page.dart'; import 'package:hmg_patient_app_new/presentation/monthly_report/monthly_report.dart'; @@ -132,6 +134,8 @@ class _MedicalFilePageState extends State { medicalFileViewModel.setIsPatientSickLeaveListLoading(true); medicalFileViewModel.getPatientSickLeaveList(); medicalFileViewModel.onTabChanged(0); + medicalFileViewModel.setIsPatientMedicalReportsLoading(true); + medicalFileViewModel.getPatientMedicalReportList(); // Load vital signs hmgServicesViewModel.getPatientVitalSign(); } @@ -1285,65 +1289,78 @@ class _MedicalFilePageState extends State { ).paddingSymmetrical(0.w, 0.h); }), SizedBox(height: 16.h), - GridView( - gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( - crossAxisCount: 3, - crossAxisSpacing: 10.h, - mainAxisSpacing: 16.w, - mainAxisExtent: 110.h, - ), - physics: NeverScrollableScrollPhysics(), - padding: EdgeInsets.zero, - shrinkWrap: true, - children: [ - // MedicalFileCard( - // label: LocaleKeys.monthlyReports.tr(context: context), - // textColor: AppColors.blackColor, - // backgroundColor: AppColors.whiteColor, - // svgIcon: AppAssets.monthly_reports_icon, - // isLargeText: true, - // iconSize: 36.h, - // ).onPress(() { - // monthlyReportViewModel.setHealthSummaryEnabled(cacheService.getBool(key: CacheConst.isMonthlyReportEnabled) ?? false); - // Navigator.of(context).push( - // CustomPageRoute( - // page: MonthlyReport(), - // ), - // ); - // }), - MedicalFileCard( - label: LocaleKeys.medicalReports.tr(context: context), - textColor: AppColors.blackColor, - backgroundColor: AppColors.whiteColor, - svgIcon: AppAssets.medical_reports_icon, - isLargeText: true, - iconSize: 36.w, - ).onPress(() { - medicalFileViewModel.setIsPatientMedicalReportsLoading(true); - medicalFileViewModel.getPatientMedicalReportList(); - Navigator.of(context).push( - CustomPageRoute( - page: MedicalReportsPage(), - ), - ); - }), - // MedicalFileCard( - // label: LocaleKeys.sickLeaveReport.tr(context: context), - // textColor: AppColors.blackColor, - // backgroundColor: AppColors.whiteColor, - // svgIcon: AppAssets.sick_leave_report_icon, - // isLargeText: true, - // iconSize: 36.h, - // ).onPress(() { - // Navigator.of(context).push( - // CustomPageRoute( - // page: PatientSickleavesListPage(), - // ), - // ); - // }), - ], - ).paddingSymmetrical(0.w, 0.0), - SizedBox(height: 24.h), + Selector listRequest, List listReady})>( + selector: (context, vm) => (isLoading: vm.isPatientMedicalReportsListLoading, listRequest: vm.patientMedicalReportRequestedList, listReady: vm.patientMedicalReportReadyList), + builder: (context, data, _){ + print("isloading are ${data.isLoading}"); + print("listRequest are ${data.listRequest}"); + print("listReady are ${data.listReady}"); + return MedicalReportCard( + isLoading: data.isLoading, listRequest: data.listRequest, listReady: data.listReady + ); + }, + ) + // GridView( + // gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( + // crossAxisCount: 3, + // crossAxisSpacing: 10.h, + // mainAxisSpacing: 16.w, + // mainAxisExtent: 110.h, + // ), + // physics: NeverScrollableScrollPhysics(), + // padding: EdgeInsets.zero, + // shrinkWrap: true, + // children: [ + // // MedicalFileCard( + // // label: LocaleKeys.monthlyReports.tr(context: context), + // // textColor: AppColors.blackColor, + // // backgroundColor: AppColors.whiteColor, + // // svgIcon: AppAssets.monthly_reports_icon, + // // isLargeText: true, + // // iconSize: 36.h, + // // ).onPress(() { + // // monthlyReportViewModel.setHealthSummaryEnabled(cacheService.getBool(key: CacheConst.isMonthlyReportEnabled) ?? false); + // // Navigator.of(context).push( + // // CustomPageRoute( + // // page: MonthlyReport(), + // // ), + // // ); + // // }), + // ///todo te changes of the medical report should be displayed here. + // /// + // + // // MedicalFileCard( + // // label: LocaleKeys.medicalReports.tr(context: context), + // // textColor: AppColors.blackColor, + // // backgroundColor: AppColors.whiteColor, + // // svgIcon: AppAssets.medical_reports_icon, + // // isLargeText: true, + // // iconSize: 36.w, + // // ).onPress(() { + // // + // // Navigator.of(context).push( + // // CustomPageRoute( + // // page: MedicalReportsPage(), + // // ), + // // ); + // // }), + // // MedicalFileCard( + // // label: LocaleKeys.sickLeaveReport.tr(context: context), + // // textColor: AppColors.blackColor, + // // backgroundColor: AppColors.whiteColor, + // // svgIcon: AppAssets.sick_leave_report_icon, + // // isLargeText: true, + // // iconSize: 36.h, + // // ).onPress(() { + // // Navigator.of(context).push( + // // CustomPageRoute( + // // page: PatientSickleavesListPage(), + // // ), + // // ); + // // }), + // ], + // ).paddingSymmetrical(0.w, 0.0), + ,SizedBox(height: 24.h), ], ); case 3: diff --git a/lib/presentation/medical_file/widgets/medical_report_card.dart b/lib/presentation/medical_file/widgets/medical_report_card.dart new file mode 100644 index 00000000..4759a65b --- /dev/null +++ b/lib/presentation/medical_file/widgets/medical_report_card.dart @@ -0,0 +1,101 @@ +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/app_export.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/features/medical_file/models/patient_medical_response_model.dart'; +import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; +import 'package:hmg_patient_app_new/presentation/medical_report/medical_reports_page.dart'; +import 'package:hmg_patient_app_new/presentation/monthly_report/monthly_report.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; +import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart'; +import 'package:hmg_patient_app_new/widgets/chip/app_custom_chip_widget.dart'; +import 'package:hmg_patient_app_new/widgets/routes/custom_page_route.dart'; + +class MedicalReportCard extends StatelessWidget { + final bool isLoading; + final List listRequest; + final List listReady; + final VoidCallback? onViewDetails; + + const MedicalReportCard({ + super.key, + required this.isLoading, + required this.listRequest, + required this.listReady, + this.onViewDetails, + }); + + + + @override + Widget build(BuildContext context) { + return Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 24, + hasShadow: true, + ), + child: Padding( + padding: EdgeInsets.all(16.h), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + LocaleKeys.medicalReport.tr().toText18( + isBold: true, + weight: FontWeight.w700, + ).toShimmer2(isShow: isLoading), + SizedBox(height: 12.h), + Wrap( + spacing: 8.w, + runSpacing: 8.h, + children: [ + if ( listRequest.isNotEmpty ) + AppCustomChipWidget( + labelText: '${listRequest.length.toString().padLeft(2, '0')} ${LocaleKeys.requested.tr()}', + icon: AppAssets.document, + iconColor: AppColors.alertColor, + textColor: AppColors.alertColor, + backgroundColor: AppColors.warningColorYellow.withOpacity(.2), + iconSize: 14.w, + ), + if (listReady.isNotEmpty) + AppCustomChipWidget( + labelText: '${listRequest.length.toString().padLeft(2, '0')} ${LocaleKeys.readyToDownload.tr()}', + icon: AppAssets.sucess, + iconColor: AppColors.successColor, + textColor: AppColors.successColor, + backgroundColor: AppColors.switchBackgroundColor, + iconSize: 14.w, + ), + ], + ).toShimmer2(isShow: isLoading), + SizedBox(height: 16.h), + CustomButton( + text: LocaleKeys.viewDetails.tr(), + icon: AppAssets.report, + borderWidth: 0, + isDisabled: false, + onPressed: (){ + Navigator.of(context).push( + CustomPageRoute( + page: MedicalReportsPage(), + ), + ); + }, + backgroundColor: AppColors.lightRedButtonColor, + borderColor: AppColors.lightRedButtonColor, + textColor: AppColors.primaryRedColor, + iconColor: AppColors.primaryRedColor, + fontSize: 14.f, + fontWeight: FontWeight.w600, + borderRadius: 12.r, + height: 48.h, + ).toShimmer2(isShow: isLoading), + ], + ), + ), + ); + } +} diff --git a/lib/presentation/prescriptions/prescription_item_view.dart b/lib/presentation/prescriptions/prescription_item_view.dart index 086b3f83..66ba13ed 100644 --- a/lib/presentation/prescriptions/prescription_item_view.dart +++ b/lib/presentation/prescriptions/prescription_item_view.dart @@ -59,7 +59,7 @@ class PrescriptionItemView extends StatelessWidget { runSpacing: 6.h, children: [ AppCustomChipWidget( - labelText: "${LocaleKeys.route.tr(context: context)}: ${isLoading ? "" : prescriptionVM.prescriptionDetailsList[index].route}", + labelText: "${LocaleKeys.routePrescription.tr(context: context)}: ${isLoading ? "" : prescriptionVM.prescriptionDetailsList[index].route}", ).toShimmer2(isShow: isLoading), AppCustomChipWidget( labelText: "${LocaleKeys.frequency.tr(context: context)}: ${isLoading ? "" : prescriptionVM.prescriptionDetailsList[index].frequency}", From 1849a90b32e91bfd3a70b8751baed20ff632d23b Mon Sep 17 00:00:00 2001 From: aamir-csol Date: Wed, 15 Apr 2026 20:22:30 +0300 Subject: [PATCH 43/45] Localization --- assets/langs/ar-SA.json | 61 +++---- assets/langs/en-US.json | 10 +- .../authentication_view_model.dart | 2 +- .../health_trackers_view_model.dart | 133 ++++++++++++--- .../water_monitor_view_model.dart | 161 ++++++++++++++++-- lib/generated/locale_keys.g.dart | 4 + .../appointments/my_doctors_page.dart | 2 +- .../authentication/quick_login.dart | 4 +- .../book_appointment/select_clinic_page.dart | 60 ++++--- .../er_online_checkin_home.dart | 25 +-- .../widgets/ovulation.dart | 7 +- .../add_health_tracker_entry_page.dart | 13 +- .../health_tracker_detail_page.dart | 16 +- .../insurance/insurance_home_page.dart | 2 +- .../medical_file/medical_file_page.dart | 14 +- .../patient_sickleaves_list_page.dart | 2 +- .../medical_file/vaccine_list_page.dart | 2 +- .../symptoms_checker/suggestions_screen.dart | 2 +- .../water_monitor_settings_page.dart | 32 ++-- .../widgets/cup_bottomsheet_widgets.dart | 8 +- .../date_range_calender.dart | 8 +- lib/widgets/input_widget.dart | 102 +++++------ 22 files changed, 461 insertions(+), 209 deletions(-) diff --git a/assets/langs/ar-SA.json b/assets/langs/ar-SA.json index 4c365d5d..0be22fd2 100644 --- a/assets/langs/ar-SA.json +++ b/assets/langs/ar-SA.json @@ -303,7 +303,7 @@ "labSubtitle": "نتائج", "medicines": "الأدوية", "medicinesSubtitle": "الوصفات", - "vitalSigns": "علامات حيوية", + "vitalSigns": "العلامات الحيوية", "vitalSignsSubTitle": "التقارير", "vitalSignNormal": "طبيعي", "vitalSignLow": "منخفض", @@ -335,7 +335,7 @@ "monthly": "شهري", "monthlySubtitle": "التقرير", "sick": "مريض", - "sick2": "المريضة", + "sick2": "المرضية", "sickSubtitle": "الإجازات", "myBalance": "رصيدي", "myBalanceSubtitle": "الرصيد", @@ -349,7 +349,7 @@ "askYourSubtitle": "طبيبك", "internet": "الإنترنت", "internetSubtitle": "الاقتران", - "chatbot": "الدرد��ة الآلية", + "chatbot": "الدردة الآلية", "chatbotSubtitle": "", "timeLine": "الخط الزمني", "labOrders": "طلبات المختبر", @@ -835,7 +835,7 @@ "allSet": "الآن يمكنك تسجيل الدخول باستخدام بصمة الوجه أو البصمة", "quickLogin": "الدخول السريع", "enableQuickLogin": "تسجيل الدخول السريع", - "enableQuickLoginBtn": "الدخول السريع", + "enableQuickLoginBtn": " تفعيل الدخول السريع", "enableMsg": "تمكين تسجيل الدخول السريع سيسمح بالتحقق من خلال Face ID / Biometric الخاص بجهازك الحالي", "notNow": "ليس الآن", "pendingActivation": "في انتظار التنشيط", @@ -946,7 +946,7 @@ "scheduledConsultation": "استشارة مجدولة", "pharmaLiveCare": "لايف كير الصيدلية", "notSureHelpMeChooseClinic": "هل تريد مساعدة في اختيار العياة؟", - "mentionYourSymptomsAndFindDoctors": "اذكر أعراضك واعثر على قائمة الأطباء وفقاً لذلك", + "mentionYourSymptomsAndFindDoctors": "أدخل حالتك الصحية للحصول على قائمة الأطباء", "immediateService": "خدمة فورية", "noNeedToWaitGetMedicalConsultation": "لا حاجة للانتظار، ستحصل على استشارة طبية فورية عبر مكالمة فيديو", "noVisitRequired": "لا حاجة للزيارة", @@ -1031,7 +1031,7 @@ "upcoming": "القادمة", "completed": "المكتملة", "noAppointmentsYet": "ليس لديك أي مواعيد بعد.", - "viewProfile": "عرض الملف الشخصي", + "viewProfile": "الملف الشخصي", "choosePreferredHospitalForService": "اختر المستشفى المفضل لديك للخدمة", "noHospitalsFound": "لم يتم العثور على مستشفيات", "cancelOrderConfirmation": "هل أنت متأكد أنك تريد إلغاء هذا الطلب؟", @@ -1111,16 +1111,16 @@ "selectDetails": "اختر التفاصيل", "work": "العمل", "pick": "استلام", - "insideTheHome": "داخل المنزل", + "insideTheHome": "من المنزل", "haveAnyAppointment": "هل لديك أي موعد", "amountPaidAtHospital": "الدفع عند الوصول للمستشفى", "submitRequest": "تأكيد الطلب", "enterPickupLocationManually": "تحديد موقع الاستلام", "enterPickupLocation": "أدخل موقع الاستلام", - "trackingDetails": "تفاصيل التتبع", + "trackingDetails": "استدعاء سيارة إسعاف", "cancelRequest": "إلغاء الطلب", "shareLocationWhatsapp": "مشاركة موقعك المباشر على واتساب", - "pleaseWaitForCall": "ستتلقى مكالمة لتأكيد طلبك قريباً.", + "pleaseWaitForCall": "سنتصل بك قريبًا لتأكيد الطلب", "toHospitalLower": "إلى المستشفى", "contact": "اتصال", "failed": "فشل", @@ -1129,7 +1129,7 @@ "onTheWayToHospital": " في الطريق إلى المستشفى", "arrivedAtHospital": "وصل إلى المستشفى", "orderCancel": "إلغاء الطلب", - "emergencyCheckIn": "تسجيل الطوارئ الإلكتروني", + "emergencyCheckIn": "تسجيل الوصول في الطواريء", "erOnlineCheckInDescription": "تتيح هذه الخدمة للمرضى تسجيل موعد الطوارئ قبل الوصول.", "erOnlineCheckInSuccess": "تم تسجيل وصول الطوارئ بنجاح. الرجاء التوجه إلى منطقة الانتظار.", "erOnlineCheckInError": "حدث خطأ غير متوقع أثناء عملية التسجيل. يرجى التواصل مع الدعم.", @@ -1157,7 +1157,7 @@ "checkingYourERAppointmentStatus": "يرجى الانتظار…", "transportOptions": "خيارات النقل", "selectHospitalForAdvancePayment": "يرجى تحديد المستشفى أولاً.", - "recharge": "اضافة رصيد", + "recharge": "شحن المحفظة", "activityLevel": "مستوى النشاط", "selectActivityLevel": "حدد مستوى النشاط", "caloriesPerDay": "السعرات الحرارية في اليوم الواحد", @@ -1238,14 +1238,13 @@ "healthCalculatorsServices": "حاسبات\nالصحة", "healthConvertersServices": "محولات\nالصحة", "smartWatchesServices": "الساعات\nالذكية", - "exploreServices": "قائمة الخدمات او الخدمات", + "exploreServices": "قائمة الخدمات", "medicalAndCareServices": "خدمات الرعاية الطبية", "hmgServices": "خدمات مجموعة الحبيب الطبية", "personalServices": "الخدمات الشخصية", "habibWallet": "محفظة الحبيب", "habibWallet2": "المحفظة", "loginToViewWalletBalance": "سجل الدخول لعرض رصيد محفظتك", - "recharge": "إعادة الشحن", "loginToViewMedicalFile": "سجل الدخول لعرض ملفك الطبي", "addMember": "إضافة عضو", "addFamilyMember": "إضافة فرد من العائلة", @@ -1300,7 +1299,7 @@ "noInsuranceApprovals": "لم تحصل على أي موافقات تأمينية حتى الآن.", "noInsuranceWithHMG": "ليس لديك تأمين مسجل لدى مجموعة الحبيب الطبية.", "referenceRange": "النطاق المرجعي", - "downloadReport": "تحميل التقارير", + "downloadReport": "تحميل", "generatingReport": "جارٍ إنشاء التقرير، يرجى الانتظار...", "noLabResults": "لا يوجد نتائج", "labResultDetails": "تفاصيل نتائج المختبر", @@ -1312,29 +1311,29 @@ "results": "نتائج", "viewResults": "عرض النتائج", "rebook": "إعادة الحجز", - "noOphthalmologyAppointments": "لم يتم العثور على أي مواعيد في قسم طب العيون...", - "noVitalSignsRecordedYet": "لا توجد علامات حيوية مسجلة بعد", + "noOphthalmologyAppointments": "لم يتم العثور على أي مواعيد", + "noVitalSignsRecordedYet": "لا توجد علامات حيوية", "appointmentsAndVisits": "المواعيد", "labAndRadiology": "المختبر والأشعة", "activeMedicationsAndPrescriptions": "الوصفات الطبية", "allPrescriptions": "جميع الوصفات", "allMedications": "جميع الأدوية", - "youDontHaveAnyPrescriptionsYet": "ليس لديك أي وصفات طبية بعد.", - "youDontHaveAnyCompletedVisitsYet": "ليس لديك أي زيارات مكتملة بعد", - "others": "سجلات أخرى", + "youDontHaveAnyPrescriptionsYet": "ليس لديك أي وصفات طبية", + "youDontHaveAnyCompletedVisitsYet": "ليس لديك أي زيارات مكتملة", + "others": "خدمات أخرى", "allergyInfo": "معلومات الحساسية", "vaccineInfo": "معلومات اللقاحات", "updateInsuranceInfo": "تحديث التأمين", - "myInvoicesList": "قائمة فواتيري", - "ancillaryOrdersList": "قائمة الطلبات المساعدة", - "youDontHaveAnySickLeavesYet": "ليس لديك أي إجازات مرضية بعد.", + "myInvoicesList": "و الفواتير", + "ancillaryOrdersList": "الخدمات الطبية المساندة", + "youDontHaveAnySickLeavesYet": "ليس لديك أي إجازات مرضية", "medicalReports": "التقارير الطبية", "sickLeaveReport": "تقرير الإجازة المرضية", "weightTracker": "متتبع الوزن", "askYourDoctor": "اسأل طبيبك", "internetPairing": "الاقتران بالإنترنت", "requested": "مطلوب", - "youDontHaveAnyMedicalReportsYet": "ليس لديك أي تقارير طبية بعد.", + "youDontHaveAnyMedicalReportsYet": "ليس لديك أي تقارير طبية", "requestMedicalReport": "طلب تقرير طبي", "youDoNotHaveAnyAppointmentsToRequestMedicalReport": "ليس لديك أي مواعيد لطلب تقرير طبي.", "areYouSureYouWantToRequestMedicalReport": "هل أنت متأكد أنك تريد طلب تقرير طبي لهذا الموعد؟", @@ -1369,7 +1368,7 @@ "parkingDate": "التاريخ: {date}", "parkedSince": "متوقف منذ: {time}", "resetDirection": "إعادة تعيين الاتجاه", - "noPrescriptionOrdersYet": "ليس لديك أي طلبات وصفات طبية حتى الآن.", + "noPrescriptionOrdersYet": "ليس لديك أي طلبات.", "fetchingPrescriptionPDFPleaseWait": "جاري جلب ملف الوصفة الطبية، يرجى الانتظار...", "ratingValue": "التقييم: {rating}", "downloadPrescription": "تحميل الوصفة الطبية", @@ -1562,7 +1561,7 @@ "liveCareServiceDesc": "احصل على استشارة طبية من طبيب مختص عبر مكالمة فيديو", "bloodGroup": "فصيلة الدم: {bloodType}", "medicalServices": "الخدمات الطبية", - "insuranceAndPayments": "التأمين والمدفوعات", + "insuranceAndPayments": "التأمين و الفواتير", "trackerAndOthers": "المتتبع وأخرى", "bmi": "مؤشر كتلة الجسم", "yesPleaseINeedHelp": "نعم، احتاج مساعدة", @@ -1574,7 +1573,7 @@ "disclaimer": "إخلاء مسؤولية", "thisAboveInfo": "تم تحليل نتائج المختبرهذه بواسطة الذكاء الاصطناعي، وهي لا تُعدّ نصيحة طبية. استشر طبيبك المختص للتشخيص والعلاج.", "aiDisclaimer": "سيتم مشاركة بيانات نتائج تحاليلك المخبرية بشكل آمن مع خدمة الذكاء الاصطناعي لدينا لتحليلها. يساعد هذا في تقديم رؤى صحية مُخصصة. هل ترغب في المتابعة؟", - "consent": "نتائج المختبر", + "consent": "تحليل الذكاء الاصطناعي", "bmiNormalDescription": "مؤشر كتلة جسمك ضمن المعدل الصحي. استمر في اتباع نظام غذائي متوازن، وممارسة النشاط البدني بانتظام، وإجراء الفحوصات الدورية للحفاظ على صحة جيدة. راقب أي تغييرات ملحوظة مع مرور الوقت.", "bmiUnderweightDescription": "يشير مؤشر كتلة الجسم إلى أنك تعاني من نقص الوزن. لذا، يُنصح بزيادة السعرات الحرارية المتناولة من خلال تناول الأطعمة الغنية بالعناصر الغذائية، وممارسة تمارين المقاومة لبناء العضلات، واستشارة أخصائي رعاية صحية للتحقق من وجود أسباب كامنة.", "bmiOverweightDescription": "يشير مؤشر كتلة الجسم إلى زيادة الوزن. لذا، يُنصح بالسعي إلى إنقاص الوزن تدريجياً وبشكل مستدام من خلال تقليل السعرات الحرارية بشكل معتدل، وممارسة النشاط البدني بانتظام، واختيار الأطعمة الصحية. استشر طبيبك قبل إجراء أي تغييرات جذرية في نمط حياتك.", @@ -1709,7 +1708,7 @@ "doctorRatingAppointment": "طبيب\nتصنيف", "ratingSubmitted": "تم إرسال التقييم", "rateTheDoctor": "يرجى تقييم الطبيب", - "downloadInvoice": "تنزيل الفاتورة", + "downloadInvoice": "تحميل", "approvalDetails": "تفاصيل الموافقة", "obese": "سمين", "overWeight": "وزن زائد", @@ -1756,9 +1755,13 @@ "errorFetchingData": "حدث خطأ أثناء تحميل البيانات", "negative": "سلبي", "calculateCaloriesBasedOnFactors": "حساب السعرات الحرارية اليومية بناءً على عدة عوامل مثل الطول، الوزن، العمر، الجنس، والنشاط البدني اليومي.", - "conformationCall": "ستتلقى مكالمة لتأكيد طلبك قريباً.", + "conformationCall": "سنتصل بك قريبًا لتأكيد الطلب", "radiologyLabResults": "نتائج الأشعة", "disclaimerRadiology": "تم تحليل نتائج الأشعة هذه بواسطة الذكاء الاصطناعي، وهي لا تُعدّ نصيحة طبية. استشر طبيبك المختص للتشخيص والعلاج.", "selectDateTimeKey": "اختيار", - "medicalKey": "الطبية" + "medicalKey": "الطبية", + "doctors2": "أطباء", + "illurgyInfomation": "الحساسية", + "vaccineInfomation": "التطعيمات", + "approvals1": "موافقات" } diff --git a/assets/langs/en-US.json b/assets/langs/en-US.json index f473e9ae..a9dc77ff 100644 --- a/assets/langs/en-US.json +++ b/assets/langs/en-US.json @@ -825,7 +825,7 @@ "allSet": "Now you can login with Face ID or Biometric", "quickLogin": "Quick Login", "enableQuickLogin": "Enable Quick Login", - "enableQuickLoginBtn": "Quick Login", + "enableQuickLoginBtn": "Enable Quick Login", "enableMsg": "Enabling the quick login will verify through your existing device Face ID / Biometric", "notNow": "Not Now", "pendingActivation": "Pending Activation", @@ -1313,7 +1313,7 @@ "others": "Others", "allergyInfo": "Allergy Info", "vaccineInfo": "Vaccine Info", - "updateInsuranceInfo": "Update Insurance", + "updateInsuranceInfo": "Insurance Update", "myInvoicesList": "My Invoices List", "ancillaryOrdersList": "Ancillary Orders List", "youDontHaveAnySickLeavesYet": "You don't have any sick leaves yet.", @@ -1750,7 +1750,11 @@ "disclaimerRadiology": "This radiology result was analyzed by AI, and it is not medical advice. Consult your healthcare provider for diagnosis and treatment." , "selectDateTimeKey": "Select", - "medicalKey": "Medical" + "medicalKey": "Medical", + "doctors2": "Doctor", + "illurgyInfomation": "Allergy", + "vaccineInfomation": "Vaccine", + "approvals1": "Approvals" } diff --git a/lib/features/authentication/authentication_view_model.dart b/lib/features/authentication/authentication_view_model.dart index ca31b663..eb922652 100644 --- a/lib/features/authentication/authentication_view_model.dart +++ b/lib/features/authentication/authentication_view_model.dart @@ -1120,7 +1120,7 @@ class AuthenticationViewModel extends ChangeNotifier { _dialogService.showPhoneNumberPickerSheet( // label: "Where would you like to receive OTP?", label: LocaleKeys.receiveOtpToast.tr(), - message: "Please select from the below options to receive OTP.", + message: _appState.isArabic() ? "يرجى الاختيار من الخيارات أدناه لاستلام رمز التحقق." "Please select from the below options to receive OTP.", onSMSPress: () { checkUserAuthentication(otpTypeEnum: OTPTypeEnum.sms); }, diff --git a/lib/features/health_trackers/health_trackers_view_model.dart b/lib/features/health_trackers/health_trackers_view_model.dart index 8fcbee01..6b16fdc3 100644 --- a/lib/features/health_trackers/health_trackers_view_model.dart +++ b/lib/features/health_trackers/health_trackers_view_model.dart @@ -34,13 +34,25 @@ class HealthTrackersViewModel extends ChangeNotifier { String? get errorMessage => _errorMessage; - List get durationFilters => ["Week", "Month", "Year"]; + final List durationFiltersEn = ["Week", "Month", "Year"]; + final List durationFiltersAr = ["أسبوع", "شهر", "سنة"]; + + List get durationFilters => getIt.get().isArabic() ? durationFiltersAr : durationFiltersEn; String _selectedDuration = "Week"; bool _isGraphView = true; String get selectedDurationFilter => _selectedDuration; + // Get the localized display value for the selected duration + String get selectedDurationFilterDisplay { + final index = durationFiltersEn.indexOf(_selectedDuration); + if (index >= 0) { + return getIt.get().isArabic() ? durationFiltersAr[index] : durationFiltersEn[index]; + } + return _selectedDuration; + } + bool get isGraphView => _isGraphView; final List bloodSugarUnit = ['mg/dlt', 'mol/L']; @@ -90,7 +102,15 @@ class HealthTrackersViewModel extends ChangeNotifier { // Setters with notification void setFilterDuration(String duration) async { - _selectedDuration = duration; + // Map Arabic values to English keys + if (getIt.get().isArabic()) { + final index = durationFiltersAr.indexOf(duration); + if (index >= 0 && index < durationFiltersEn.length) { + _selectedDuration = durationFiltersEn[index]; + } + } else { + _selectedDuration = duration; + } notifyListeners(); } @@ -107,26 +127,73 @@ class HealthTrackersViewModel extends ChangeNotifier { // ==================== WEIGHT FORM FIELDS ==================== final List weightUnits = ['kg', 'lb']; + final List weightUnitsEn = ['kg', 'lb']; + final List weightUnitsAr = ['كجم', 'رطل']; + String _selectedWeightUnit = 'kg'; String get selectedWeightUnit => _selectedWeightUnit; + List getWeightUnitsList() { + return getIt.get().isArabic() ? weightUnitsAr : weightUnitsEn; + } + void setWeightUnit(String unit) { - _selectedWeightUnit = unit; + // Map Arabic values to English keys + if (getIt.get().isArabic()) { + final index = weightUnitsAr.indexOf(unit); + if (index >= 0 && index < weightUnitsEn.length) { + _selectedWeightUnit = weightUnitsEn[index]; + } + } else { + _selectedWeightUnit = unit; + } notifyListeners(); } + // Get the localized display value for the selected weight unit + String get selectedWeightUnitDisplay { + final index = weightUnitsEn.indexOf(_selectedWeightUnit); + if (index >= 0) { + return getIt.get().isArabic() ? weightUnitsAr[index] : weightUnitsEn[index]; + } + return _selectedWeightUnit; + } + // ==================== BLOOD PRESSURE FORM FIELDS ==================== - final List measuredArmList = ['Left Arm', 'Right Arm']; + final List measuredArmListEn = ['Left Arm', 'Right Arm']; + final List measuredArmListAr = ['الذراع الأيسر', 'الذراع الأيمن']; + String _selectedMeasuredArm = ''; String get selectedMeasuredArm => _selectedMeasuredArm; + List getMeasuredArmList() { + return getIt.get().isArabic() ? measuredArmListAr : measuredArmListEn; + } + void setMeasuredArm(String arm) { - _selectedMeasuredArm = arm; + // Map Arabic values to English keys + if (getIt.get().isArabic()) { + final index = measuredArmListAr.indexOf(arm); + if (index >= 0 && index < measuredArmListEn.length) { + _selectedMeasuredArm = measuredArmListEn[index]; + } + } else { + _selectedMeasuredArm = arm; + } notifyListeners(); } + // Get the localized display value for the selected measured arm + String get selectedMeasuredArmDisplay { + final index = measuredArmListEn.indexOf(_selectedMeasuredArm); + if (index >= 0) { + return getIt.get().isArabic() ? measuredArmListAr[index] : measuredArmListEn[index]; + } + return _selectedMeasuredArm; + } + // Text Controllers TextEditingController weightController = TextEditingController(); TextEditingController bloodSugarController = TextEditingController(); @@ -952,33 +1019,35 @@ class HealthTrackersViewModel extends ChangeNotifier { // Validation method String? _validateBloodSugarEntry(String dateTime) { + final isArabic = getIt.get().isArabic(); + // Validate blood sugar value if (bloodSugarController.text.trim().isEmpty) { - return "Please enter blood sugar value"; + return isArabic ? "الرجاء إدخال مستوى سكر الدم" : "Please enter blood sugar value"; } final bloodSugarValue = double.tryParse(bloodSugarController.text.trim()); if (bloodSugarValue == null) { - return "Please enter a valid number"; + return isArabic ? "الرجاء إدخال رقم صحيح" : "Please enter a valid number"; } if (bloodSugarValue <= 0) { - return "Blood sugar value must be greater than 0"; + return isArabic ? "يجب أن يكون مستوى سكر الدم أكبر من 0" : "Blood sugar value must be greater than 0"; } // Validate reasonable range (typical ranges) if (bloodSugarValue > 1000) { - return "Blood sugar value seems too high. Please check and enter again"; + return isArabic ? "مستوى سكر الدم يبدو مرتفع جداً. يرجى التحقق وإدخالها مرة أخرى" : "Blood sugar value seems too high. Please check and enter again"; } // Validate date time if (dateTime.trim().isEmpty) { - return "Please select date and time"; + return isArabic ? "الرجاء اختيار التاريخ والوقت" : "Please select date and time"; } // Validate measure time if (_selectedBloodSugarMeasureTime.isEmpty) { - return "Please select when the measurement was taken"; + return isArabic ? "الرجاء اختيار وقت القياس" : "Please select when the measurement was taken"; } return null; // No errors @@ -991,6 +1060,8 @@ class HealthTrackersViewModel extends ChangeNotifier { Function()? onSuccess, Function(String error)? onFailure, }) async { + final isArabic = getIt.get().isArabic(); + // Validate final validationError = _validateBloodSugarEntry(dateTime); if (validationError != null) { @@ -1025,13 +1096,13 @@ class HealthTrackersViewModel extends ChangeNotifier { notifyListeners(); if (onSuccess != null) onSuccess(); } else { - _errorMessage = "Failed to save blood sugar entry. Please try again"; + _errorMessage = isArabic ? "فشل حفظ قراءة سكر الدم. يرجى المحاولة مرة أخرى" : "Failed to save blood sugar entry. Please try again"; notifyListeners(); if (onFailure != null) onFailure(_errorMessage!); } } catch (e) { log('Error in saveBloodSugarEntry: $e'); - _errorMessage = "An error occurred. Please try again"; + _errorMessage = isArabic ? "حدث خطأ. يرجى المحاولة مرة أخرى" : "An error occurred. Please try again"; isLoading = false; notifyListeners(); if (onFailure != null) onFailure(_errorMessage!); @@ -1042,21 +1113,23 @@ class HealthTrackersViewModel extends ChangeNotifier { // Validate weight entry before saving String? _validateWeightEntry(String dateTime) { + final isArabic = getIt.get().isArabic(); + // Validate weight value final weightValue = weightController.text.trim(); if (weightValue.isEmpty) { - return "Please enter weight value"; + return isArabic ? "الرجاء إدخال قيمة الوزن" : "Please enter weight value"; } // Check if it's a valid number final parsedValue = double.tryParse(weightValue); if (parsedValue == null || parsedValue <= 0) { - return "Please enter a valid weight value"; + return isArabic ? "الرجاء إدخال قيمة وزن صحيحة" : "Please enter a valid weight value"; } // Validate date time if (dateTime.trim().isEmpty) { - return "Please select date and time"; + return isArabic ? "الرجاء تحديد التاريخ والوقت" : "Please select date and time"; } return null; // No errors @@ -1068,6 +1141,8 @@ class HealthTrackersViewModel extends ChangeNotifier { Function()? onSuccess, Function(String error)? onFailure, }) async { + final isArabic = getIt.get().isArabic(); + // Validate final validationError = _validateWeightEntry(dateTime); if (validationError != null) { @@ -1100,13 +1175,13 @@ class HealthTrackersViewModel extends ChangeNotifier { notifyListeners(); if (onSuccess != null) onSuccess(); } else { - _errorMessage = "Failed to save weight entry. Please try again"; + _errorMessage = isArabic ? "فشل حفظ قراءة الوزن. يرجى المحاولة مرة أخرى" : "Failed to save weight entry. Please try again"; notifyListeners(); if (onFailure != null) onFailure(_errorMessage!); } } catch (e) { log('Error in saveWeightEntry: $e'); - _errorMessage = "An error occurred. Please try again"; + _errorMessage = isArabic ? "حدث خطأ. يرجى المحاولة مرة أخرى" : "An error occurred. Please try again"; isLoading = false; notifyListeners(); if (onFailure != null) onFailure(_errorMessage!); @@ -1117,34 +1192,36 @@ class HealthTrackersViewModel extends ChangeNotifier { // Validate blood pressure entry before saving String? _validateBloodPressureEntry(String dateTime) { + final isArabic = getIt.get().isArabic(); + // Validate systolic value final systolicValue = systolicController.text.trim(); if (systolicValue.isEmpty) { - return "Please enter systolic value"; + return isArabic ? "الرجاء إدخال القيمة الانقباضية" : "Please enter systolic value"; } final parsedSystolic = int.tryParse(systolicValue); if (parsedSystolic == null || parsedSystolic <= 0) { - return "Please enter a valid systolic value"; + return isArabic ? "الرجاء إدخال قيمة صحيحة للضغط الانقباضي" : "Please enter a valid systolic value"; } // Validate diastolic value final diastolicValue = diastolicController.text.trim(); if (diastolicValue.isEmpty) { - return "Please enter diastolic value"; + return isArabic ? "الرجاء إدخال قيمة الضغط الانبساطي" : "Please enter diastolic value"; } final parsedDiastolic = int.tryParse(diastolicValue); if (parsedDiastolic == null || parsedDiastolic <= 0) { - return "Please enter a valid diastolic value"; + return isArabic ? "الرجاء إدخال قيمة صحيحة للضغط الانبساطي" : "Please enter a valid diastolic value"; } // Validate arm selection if (_selectedMeasuredArm.isEmpty) { - return "Please select measured arm"; + return isArabic ? "الرجاء اختيار الذراع المقاسة" : "Please select measured arm"; } // Validate date time if (dateTime.trim().isEmpty) { - return "Please select date and time"; + return isArabic ? "الرجاء تحديد التاريخ والوقت" : "Please select date and time"; } return null; // No errors @@ -1156,6 +1233,8 @@ class HealthTrackersViewModel extends ChangeNotifier { Function()? onSuccess, Function(String error)? onFailure, }) async { + final isArabic = getIt.get().isArabic(); + // Validate final validationError = _validateBloodPressureEntry(dateTime); if (validationError != null) { @@ -1171,7 +1250,7 @@ class HealthTrackersViewModel extends ChangeNotifier { try { // Get measured arm index (0 = Left Arm, 1 = Right Arm) - final measuredArmIndex = measuredArmList.indexOf(_selectedMeasuredArm); + final measuredArmIndex = measuredArmListEn.indexOf(_selectedMeasuredArm); // Call API final success = await addOrUpdateBloodPressureResult( @@ -1192,13 +1271,13 @@ class HealthTrackersViewModel extends ChangeNotifier { notifyListeners(); if (onSuccess != null) onSuccess(); } else { - _errorMessage = "Failed to save blood pressure entry. Please try again"; + _errorMessage = isArabic ? "فشل حفظ قراءة ضغط الدم. يرجى المحاولة مرة أخرى" : "Failed to save blood pressure entry. Please try again"; notifyListeners(); if (onFailure != null) onFailure(_errorMessage!); } } catch (e) { log('Error in saveBloodPressureEntry: $e'); - _errorMessage = "An error occurred. Please try again"; + _errorMessage = isArabic ? "حدث خطأ. يرجى المحاولة مرة أخرى" : "An error occurred. Please try again"; isLoading = false; notifyListeners(); if (onFailure != null) onFailure(_errorMessage!); diff --git a/lib/features/water_monitor/water_monitor_view_model.dart b/lib/features/water_monitor/water_monitor_view_model.dart index 1ef2ef65..5234a559 100644 --- a/lib/features/water_monitor/water_monitor_view_model.dart +++ b/lib/features/water_monitor/water_monitor_view_model.dart @@ -40,7 +40,20 @@ class WaterMonitorViewModel extends ChangeNotifier { // Units final List heightUnits = ['cm', 'm', 'ft', 'in']; + final List heightUnitsEn = ['cm', 'm', 'ft', 'in']; + final List heightUnitsAr = ['سم', 'م', 'قدم', 'بوصة']; + final List weightUnits = ['kg', 'lb']; + final List weightUnitsEn = ['kg', 'lb']; + final List weightUnitsAr = ['كجم', 'رطل']; + + List getHeightUnitsList() { + return getIt.get().isArabic() ? heightUnitsAr : heightUnitsEn; + } + + List getWeightUnitsList() { + return getIt.get().isArabic() ? weightUnitsAr : weightUnitsEn; + } // Selected values String _selectedHeightUnit = 'cm'; @@ -62,8 +75,26 @@ class WaterMonitorViewModel extends ChangeNotifier { String get selectedHeightUnit => _selectedHeightUnit; + // Get the localized display value for the selected height unit + String get selectedHeightUnitDisplay { + final index = heightUnitsEn.indexOf(_selectedHeightUnit); + if (index >= 0) { + return getIt.get().isArabic() ? heightUnitsAr[index] : heightUnitsEn[index]; + } + return _selectedHeightUnit; + } + String get selectedWeightUnit => _selectedWeightUnit; + // Get the localized display value for the selected weight unit + String get selectedWeightUnitDisplay { + final index = weightUnitsEn.indexOf(_selectedWeightUnit); + if (index >= 0) { + return getIt.get().isArabic() ? weightUnitsAr[index] : weightUnitsEn[index]; + } + return _selectedWeightUnit; + } + String get selectedActivityLevel => _selectedActivityLevel; String get selectedNumberOfReminders => _selectedNumberOfReminders; @@ -75,17 +106,75 @@ class WaterMonitorViewModel extends ChangeNotifier { bool get isGraphView => _isGraphView; // Activity level options - List get activityLevels => - ["Almost Inactive (no exercise)", "Lightly active", "Lightly active (1-3) days per week", "Super active (very hard exercise)"]; + final List activityLevelsEn = [ + "Almost Inactive (no exercise)", + "Lightly active", + "Lightly active (1-3) days per week", + "Super active (very hard exercise)" + ]; + + final List activityLevelsAr = [ + "غير نشط تقريباً (بدون تمرين)", + "نشط قليلاً", + "نشط قليلاً (1-3) أيام في الأسبوع", + "نشط جداً (تمرين شاق جداً)" + ]; + + List get activityLevels => getIt.get().isArabic() ? activityLevelsAr : activityLevelsEn; + + // Get the localized display value for the selected activity level + String get selectedActivityLevelDisplay { + final index = activityLevelsEn.indexOf(_selectedActivityLevel); + if (index >= 0) { + return getIt.get().isArabic() ? activityLevelsAr[index] : activityLevelsEn[index]; + } + return _selectedActivityLevel; + } // Reminder options - List get reminderOptions => ["1 Time", "2 Time", "3 Time", "4 Time", "5 Time", "6 Time"]; + final List reminderOptionsEn = ["1 Time", "2 Time", "3 Time", "4 Time", "5 Time", "6 Time"]; + final List reminderOptionsAr = ["مرة واحدة", "مرتين", "3 مرات", "4 مرات", "5 مرات", "6 مرات"]; + + List get reminderOptions => getIt.get().isArabic() ? reminderOptionsAr : reminderOptionsEn; + + // Get the localized display value for the selected number of reminders + String get selectedNumberOfRemindersDisplay { + final index = reminderOptionsEn.indexOf(_selectedNumberOfReminders); + if (index >= 0) { + return getIt.get().isArabic() ? reminderOptionsAr[index] : reminderOptionsEn[index]; + } + return _selectedNumberOfReminders; + } // Gender options - List get genderOptions => ["Male", "Female"]; + final List genderOptionsEn = ["Male", "Female"]; + final List genderOptionsAr = ["ذكر", "أنثى"]; + + List get genderOptions => getIt.get().isArabic() ? genderOptionsAr : genderOptionsEn; + + // Get the localized display value for the selected gender + String get selectedGenderDisplay { + final index = genderOptionsEn.indexOf(_selectedGender); + if (index >= 0) { + return getIt.get().isArabic() ? genderOptionsAr[index] : genderOptionsEn[index]; + } + return _selectedGender; + } + + // Duration Options + final List durationFiltersEn = ["Daily", "Weekly", "Monthly"]; + final List durationFiltersAr = ["يومي", "أسبوعي", "شهري"]; -//Duration Options - List get durationFilters => ["Daily", "Weekly", "Monthly"]; + List get durationFilters => getIt.get().isArabic() ? durationFiltersAr : durationFiltersEn; + + // Get the localized display value for the selected duration + String get selectedDurationFilterDisplay { + final index = durationFiltersEn.indexOf(_selectedDuration); + if (index >= 0) { + return getIt.get().isArabic() ? durationFiltersAr[index] : durationFiltersEn[index]; + } + return _selectedDuration; + } // Network/data final AppState _appState = GetIt.instance(); @@ -503,7 +592,15 @@ class WaterMonitorViewModel extends ChangeNotifier { // Setters with notification void setFilterDuration(String duration) async { - _selectedDuration = duration; + // Map Arabic values to English keys + if (getIt.get().isArabic()) { + final index = durationFiltersAr.indexOf(duration); + if (index >= 0 && index < durationFiltersEn.length) { + _selectedDuration = durationFiltersEn[index]; + } + } else { + _selectedDuration = duration; + } notifyListeners(); // Fetch new progress data when duration filter changes await fetchUserProgressForMonitoring(); @@ -517,27 +614,67 @@ class WaterMonitorViewModel extends ChangeNotifier { // Setters with notification void setGender(String gender) { - _selectedGender = gender; + // Map Arabic values to English keys + if (getIt.get().isArabic()) { + final index = genderOptionsAr.indexOf(gender); + if (index >= 0 && index < genderOptionsEn.length) { + _selectedGender = genderOptionsEn[index]; + } + } else { + _selectedGender = gender; + } notifyListeners(); } void setHeightUnit(String unit) { - _selectedHeightUnit = unit; + // Map Arabic values to English keys + if (getIt.get().isArabic()) { + final index = heightUnitsAr.indexOf(unit); + if (index >= 0 && index < heightUnitsEn.length) { + _selectedHeightUnit = heightUnitsEn[index]; + } + } else { + _selectedHeightUnit = unit; + } notifyListeners(); } void setWeightUnit(String unit) { - _selectedWeightUnit = unit; + // Map Arabic values to English keys + if (getIt.get().isArabic()) { + final index = weightUnitsAr.indexOf(unit); + if (index >= 0 && index < weightUnitsEn.length) { + _selectedWeightUnit = weightUnitsEn[index]; + } + } else { + _selectedWeightUnit = unit; + } notifyListeners(); } void setActivityLevel(String level) { - _selectedActivityLevel = level; + // Map Arabic values to English keys + if (getIt.get().isArabic()) { + final index = activityLevelsAr.indexOf(level); + if (index >= 0 && index < activityLevelsEn.length) { + _selectedActivityLevel = activityLevelsEn[index]; + } + } else { + _selectedActivityLevel = level; + } notifyListeners(); } void setNumberOfReminders(String number) { - _selectedNumberOfReminders = number; + // Map Arabic values to English keys + if (getIt.get().isArabic()) { + final index = reminderOptionsAr.indexOf(number); + if (index >= 0 && index < reminderOptionsEn.length) { + _selectedNumberOfReminders = reminderOptionsEn[index]; + } + } else { + _selectedNumberOfReminders = number; + } notifyListeners(); } diff --git a/lib/generated/locale_keys.g.dart b/lib/generated/locale_keys.g.dart index 4770dbad..5f3a974c 100644 --- a/lib/generated/locale_keys.g.dart +++ b/lib/generated/locale_keys.g.dart @@ -1752,5 +1752,9 @@ abstract class LocaleKeys { static const disclaimerRadiology = 'disclaimerRadiology'; static const selectDateTimeKey = 'selectDateTimeKey'; static const medicalKey = 'medicalKey'; + static const doctors2 = 'doctors2'; + static const illurgyInfomation = 'illurgyInfomation'; + static const vaccineInfomation = 'vaccineInfomation'; + static const approvals1 = 'approvals1'; } diff --git a/lib/presentation/appointments/my_doctors_page.dart b/lib/presentation/appointments/my_doctors_page.dart index 93733770..7cf8155a 100644 --- a/lib/presentation/appointments/my_doctors_page.dart +++ b/lib/presentation/appointments/my_doctors_page.dart @@ -222,7 +222,7 @@ class _MyDoctorsPageState extends State { richText: Row( children: [ "${group.length} ".toText10(isEnglishOnly: true), - "${LocaleKeys.doctors.tr(context: context)} ".toText10() + "${LocaleKeys.doctors2.tr(context: context)} ".toText10() ], ), // labelText: "${group.length} ${'doctors'}", diff --git a/lib/presentation/authentication/quick_login.dart b/lib/presentation/authentication/quick_login.dart index 6b80f6e8..133e38ef 100644 --- a/lib/presentation/authentication/quick_login.dart +++ b/lib/presentation/authentication/quick_login.dart @@ -77,8 +77,8 @@ class QuickLoginState extends State { // color: Colors.black, // ), // ), - SizedBox(height: 5.h), - LocaleKeys.enableQuickLogin.tr(context: context).toText16(color: AppColors.quickLoginColor), + // SizedBox(height: 5.h), + // LocaleKeys.enableQuickLogin.tr(context: context).toText16(color: AppColors.quickLoginColor), // Description // Text( // 'TranslationBase.of(context).enableMsg', diff --git a/lib/presentation/book_appointment/select_clinic_page.dart b/lib/presentation/book_appointment/select_clinic_page.dart index 131b4d3d..b8f44e78 100644 --- a/lib/presentation/book_appointment/select_clinic_page.dart +++ b/lib/presentation/book_appointment/select_clinic_page.dart @@ -63,7 +63,7 @@ class _SelectClinicPageState extends State { bookAppointmentsViewModel.getClinics(); }); - name = (widget.calculatorType?.name.toLowerCase() =="bmi"? widget.calculatorType?.name.toUpperCase(): widget.calculatorType?.name.toCamelCase)??""; + name = (widget.calculatorType?.name.toLowerCase() == "bmi" ? widget.calculatorType?.name.toUpperCase() : widget.calculatorType?.name.toCamelCase) ?? ""; super.initState(); } @@ -80,28 +80,29 @@ class _SelectClinicPageState extends State { appState = getIt.get(); if (widget.calculatorType != null) { return CollapsingListView( - title: "Your ${widget.calculatorType!.name.toCamelCase}", + title: appState.isArabic() ? widget.calculatorType!.displayName.toCamelCase : "Your ${widget.calculatorType!.displayName.toCamelCase}", bottomChild: Container( decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, customBorder: BorderRadius.only(topLeft: Radius.circular(24.r), topRight: Radius.circular(24.r))), padding: EdgeInsets.symmetric(vertical: 20.h, horizontal: 20.h), child: CustomButton( - text: LocaleKeys.bookAppo.tr(context: context), - onPressed: () { - if (widget.calculatedResult["clinicId"] == null) { - bookAppointmentsViewModel.setIsDoctorsListLoading(true); - bookAppointmentsViewModel.isGetDocForHealthCal = true; - bookAppointmentsViewModel.calculationID = widget.calculatedResult["calculationID"]; - Navigator.push(context, CustomPageRoute(page: SelectDoctorPage())); - } else { - onClinicSelected(GetClinicsListResponseModel(clinicID: widget.calculatedResult["clinicId"], clinicDescription: "asdfds", clinicDescriptionN: "asdfds")); - } - }, - icon: null, - fontSize: 16.f, - backgroundColor: AppColors.primaryRedColor, - borderColor: AppColors.primaryRedColor, - borderRadius: 12.r, - fontWeight: FontWeight.w600,), + text: LocaleKeys.bookAppo.tr(context: context), + onPressed: () { + if (widget.calculatedResult["clinicId"] == null) { + bookAppointmentsViewModel.setIsDoctorsListLoading(true); + bookAppointmentsViewModel.isGetDocForHealthCal = true; + bookAppointmentsViewModel.calculationID = widget.calculatedResult["calculationID"]; + Navigator.push(context, CustomPageRoute(page: SelectDoctorPage())); + } else { + onClinicSelected(GetClinicsListResponseModel(clinicID: widget.calculatedResult["clinicId"], clinicDescription: "asdfds", clinicDescriptionN: "asdfds")); + } + }, + icon: null, + fontSize: 16.f, + backgroundColor: AppColors.primaryRedColor, + borderColor: AppColors.primaryRedColor, + borderRadius: 12.r, + fontWeight: FontWeight.w600, + ), ), child: getCalculatorResultWidget(type: widget.calculatorType!, calculatedResult: widget.calculatedResult).paddingSymmetrical(18.w, 24.h), ); @@ -269,6 +270,7 @@ class _SelectClinicPageState extends State { } Widget resultWidget({required HealthCalculatorsTypeEnum type, dynamic calculatedResult}) { + AppState appState = getIt(); return Column( children: [ if (type == HealthCalculatorsTypeEnum.bmi) ...[ @@ -658,7 +660,7 @@ class _SelectClinicPageState extends State { borderRadius: 8.h, textColor: AppColors.textColor), SizedBox(height: 16.h), - "Fertility Window".toText16(color: AppColors.textColor, isBold: true), + appState.isArabic() ? "فترة الخصوبة".toText16(color: AppColors.textColor, isBold: true) : "Fertility Window".toText16(color: AppColors.textColor, isBold: true), SizedBox(height: 8.h), Row( children: [ @@ -678,8 +680,11 @@ class _SelectClinicPageState extends State { ], ), SizedBox(height: 8.h), - "This is your fertile window. Maintaining a healthy calorie range supports your body during this period, considering your Basal Metabolic Rate and activity. Your Body Mass Index is within the healthy range." - .toText12(height: 1.5, color: AppColors.textColorLight, isBold: true) + appState.isArabic() + ? "هذه هي فترة خصوبتك. يساعد الحفاظ على نطاق صحي من السعرات الحرارية في دعم جسمك خلال هذه الفترة، مع مراعاة معدل الأيض الأساسي ومستوى نشاطك. مؤشر كتلة جسمك ضمن النطاق الصحي." + .toText12(height: 1.5, color: AppColors.textColorLight, isBold: true) + : "This is your fertile window. Maintaining a healthy calorie range supports your body during this period, considering your Basal Metabolic Rate and activity. Your Body Mass Index is within the healthy range." + .toText12(height: 1.5, color: AppColors.textColorLight, isBold: true) ], ), ), @@ -700,7 +705,7 @@ class _SelectClinicPageState extends State { ), Row( children: [ - "Tips to keep in mind".toText16(color: AppColors.textColor, isBold: true), + appState.isArabic() ? "نصائح هامة".toText16(color: AppColors.textColor, isBold: true) : "Tips to keep in mind".toText16(color: AppColors.textColor, isBold: true), ], ), ], @@ -708,13 +713,13 @@ class _SelectClinicPageState extends State { SizedBox(height: 8.h), Column( children: [ - _buildTipRow("Drink before you feel thirsty."), + _buildTipRow(appState.isArabic() ? "اشربي الماء قبل الشعور بالعطش" : "Drink before you feel thirsty."), SizedBox(height: 4.h), - _buildTipRow("Keep a refillable bottle next to you."), + _buildTipRow(appState.isArabic() ? "احتفظي بزجاجة ماء قابلة لإعادة التعبئة بجانبك" : "Keep a refillable bottle next to you."), SizedBox(height: 4.h), - _buildTipRow("Track your daily intake to stay motivated."), + _buildTipRow(appState.isArabic() ? "تابعي استهلاكك اليومي للحفاظ على حماسك" : "Track your daily intake to stay motivated."), SizedBox(height: 4.h), - _buildTipRow("Choose sparkling water instead of soda."), + _buildTipRow(appState.isArabic() ? "اختاري المياه الفوارة بدلاً من المشروبات الغازية" : "Choose sparkling water instead of soda."), ], ).paddingOnly(left: 4.w, right: 4.w) ], @@ -1378,6 +1383,7 @@ class _SelectClinicPageState extends State { } } } + bookAppointmentsViewModel.addListener(listener); if (regionalViewModel.regionBottomSheetType == RegionBottomSheetType.FOR_REGION || regionalViewModel.regionBottomSheetType == RegionBottomSheetType.REGION_FOR_DENTAL_AND_LASER) { diff --git a/lib/presentation/emergency_services/er_online_checkin/er_online_checkin_home.dart b/lib/presentation/emergency_services/er_online_checkin/er_online_checkin_home.dart index bb9f3ffd..3c8a4770 100644 --- a/lib/presentation/emergency_services/er_online_checkin/er_online_checkin_home.dart +++ b/lib/presentation/emergency_services/er_online_checkin/er_online_checkin_home.dart @@ -49,18 +49,21 @@ class ErOnlineCheckinHome extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.center, children: [ - Utils.buildSvgWithAssets(icon: AppAssets.immediate_service_icon, width: 58.h, height: 58.h), - SizedBox(width: 18.h), - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - LocaleKeys.onlineCheckIn.tr().toText18(color: AppColors.textColor, isBold: true), - LocaleKeys.erOnlineCheckInDescription.tr().toText14(color: AppColors.greyTextColor, isBold: true), - ], - ), - ), + Utils.getNoDataWidget(context) + // Utils.buildSvgWithAssets(icon: AppAssets.immediate_service_icon, width: 58.h, height: 58.h), + // SizedBox(width: 18.h), + // Expanded( + // child: Column( + // crossAxisAlignment: CrossAxisAlignment.start, + // children: [ + // LocaleKeys.onlineCheckIn.tr().toText18(color: AppColors.textColor, isBold: true), + // LocaleKeys.erOnlineCheckInDescription.tr().toText14(color: AppColors.greyTextColor, isBold: true), + // ], + // ), + // ), ], ), ], diff --git a/lib/presentation/health_calculators_and_converts/widgets/ovulation.dart b/lib/presentation/health_calculators_and_converts/widgets/ovulation.dart index 3cfd72f8..1769f0bc 100644 --- a/lib/presentation/health_calculators_and_converts/widgets/ovulation.dart +++ b/lib/presentation/health_calculators_and_converts/widgets/ovulation.dart @@ -1,5 +1,7 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/app_state.dart'; +import 'package:hmg_patient_app_new/core/dependencies.dart'; import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; import 'package:provider/provider.dart'; import 'package:hmg_patient_app_new/core/app_assets.dart'; @@ -56,6 +58,7 @@ class _OvulationWidgetState extends State { @override Widget build(BuildContext context) { + AppState appState = getIt(); return Consumer(builder: (context, provider, _) { return Container( margin: EdgeInsets.zero, @@ -165,7 +168,9 @@ class _OvulationWidgetState extends State { Utils.buildSvgWithAssets(icon: AppAssets.globe, width: 18.w, height: 18.w), SizedBox(width: 12.w), Expanded( - child: "Calculate ovulation and fertile window based on last period, cycle length and luteal phase.".toText12(isBold: true, color: AppColors.inputLabelTextColor), + child: appState.isArabic() + ? "احسب فترة الإباضة وفترة الخصوبة بناءً على آخر دورة شهرية وطول الدورة الشهرية ومرحلة الجسم الأصفر.".toText12(isBold: true, color: AppColors.inputLabelTextColor) + : "Calculate ovulation and fertile window based on last period, cycle length and luteal phase.".toText12(isBold: true, color: AppColors.inputLabelTextColor), ), ], ).paddingSymmetrical(0.w, 16.w), diff --git a/lib/presentation/health_trackers/add_health_tracker_entry_page.dart b/lib/presentation/health_trackers/add_health_tracker_entry_page.dart index 966b543f..9f7f01cf 100644 --- a/lib/presentation/health_trackers/add_health_tracker_entry_page.dart +++ b/lib/presentation/health_trackers/add_health_tracker_entry_page.dart @@ -265,8 +265,8 @@ class _AddHealthTrackerEntryPageState extends State { _showSelectionBottomSheet( context: context, title: LocaleKeys.selectUnit.tr(context: context), - items: viewModel.weightUnits, - selectedValue: viewModel.selectedWeightUnit, + items: viewModel.getWeightUnitsList(), + selectedValue: viewModel.selectedWeightUnitDisplay, onSelected: viewModel.setWeightUnit, useUpperCase: false, ); @@ -278,8 +278,8 @@ class _AddHealthTrackerEntryPageState extends State { _showSelectionBottomSheet( context: context, title: LocaleKeys.selectArm.tr(context: context), - items: viewModel.measuredArmList, - selectedValue: viewModel.selectedMeasuredArm, + items: viewModel.getMeasuredArmList(), + selectedValue: viewModel.selectedMeasuredArmDisplay, onSelected: viewModel.setMeasuredArm, useUpperCase: false, ); @@ -442,7 +442,7 @@ class _AddHealthTrackerEntryPageState extends State { icon: AppAssets.bodyIcon, iconColor: AppColors.greyTextColor, label: LocaleKeys.selectArm.tr(context: context), - value: viewModel.selectedMeasuredArm, + value: viewModel.selectedMeasuredArmDisplay, onRowTap: () => _showMeasuredArmSelectionBottomSheet(context, viewModel), ), _buildDateTimeFields(), @@ -458,7 +458,7 @@ class _AddHealthTrackerEntryPageState extends State { icon: AppAssets.weightScale, label: LocaleKeys.enterWeight.tr(context: context), inputField: _buildTextField(viewModel.weightController, '', keyboardType: TextInputType.number), - unit: viewModel.selectedWeightUnit, + unit: viewModel.selectedWeightUnitDisplay, onUnitTap: () => _showWeightUnitSelectionBottomSheet(context, viewModel), ), _buildDateTimeFields(), @@ -487,6 +487,7 @@ class _AddHealthTrackerEntryPageState extends State { leadingIcon: AppAssets.calendarGrey, selectionType: SelectionTypeEnum.calendar, isHideSwitcher: true, + btnTitle: LocaleKeys.add.tr(context: context), onCalendarTypeChanged: (val) {}, onChange: (val) { if (val == null) return; diff --git a/lib/presentation/health_trackers/health_tracker_detail_page.dart b/lib/presentation/health_trackers/health_tracker_detail_page.dart index 28e035b0..35956588 100644 --- a/lib/presentation/health_trackers/health_tracker_detail_page.dart +++ b/lib/presentation/health_trackers/health_tracker_detail_page.dart @@ -92,13 +92,15 @@ class _HealthTrackerDetailPageState extends State { /// Get empty state message based on tracker type String _getEmptyStateMessage() { + final isArabic = getIt.get().isArabic(); + switch (widget.trackerType) { case HealthTrackerTypeEnum.bloodSugar: - return "Please add data to track your Blood Sugar"; + return isArabic ? "الرجاء إضافة قراءة جديدة لتتبع سكر الدم" : "Please add data to track your Blood Sugar"; case HealthTrackerTypeEnum.bloodPressure: - return "Please add data to track your Blood Pressure"; + return isArabic ? "الرجاء إضافة قراءة جديدة لتتبع ضغط الدم" : "Please add data to track your Blood Pressure"; case HealthTrackerTypeEnum.weightTracker: - return "Please add data to track your Weight"; + return isArabic ? "الرجاء إضافة قراءة جديدة لتتبع الوزن" : "Please add data to track your Weight"; } } @@ -188,7 +190,7 @@ class _HealthTrackerDetailPageState extends State { context: context, title: LocaleKeys.selectDuration.tr(), items: viewModel.durationFilters, - selectedValue: viewModel.selectedDurationFilter, + selectedValue: viewModel.selectedDurationFilterDisplay, onSelected: viewModel.setFilterDuration, ); } @@ -304,7 +306,7 @@ class _HealthTrackerDetailPageState extends State { child: Row( crossAxisAlignment: CrossAxisAlignment.end, children: [ - viewModel.selectedDurationFilter.toText12(isBold: true), + viewModel.selectedDurationFilterDisplay.toText12(isBold: true), SizedBox(width: 4.w), Utils.buildSvgWithAssets(icon: AppAssets.arrow_down, height: 16.h), ], @@ -573,6 +575,8 @@ class _HealthTrackerDetailPageState extends State { } Widget _buildEmptyStateWidget() { + final isArabic = getIt.get().isArabic(); + return SizedBox( height: MediaQuery.of(context).size.height * 0.5, child: Center( @@ -587,7 +591,7 @@ class _HealthTrackerDetailPageState extends State { width: 48.w, ), SizedBox(height: 16.h), - "You do not have any data available.".toText14( + (isArabic ? "ليس لديك أي بيانات متاحة." : "You do not have any data available.").toText14( weight: FontWeight.w600, color: AppColors.textColor, isCenter: true, diff --git a/lib/presentation/insurance/insurance_home_page.dart b/lib/presentation/insurance/insurance_home_page.dart index 985de895..2bbe6f7d 100644 --- a/lib/presentation/insurance/insurance_home_page.dart +++ b/lib/presentation/insurance/insurance_home_page.dart @@ -47,7 +47,7 @@ class _InsuranceHomePageState extends State { appState = getIt.get(); insuranceViewModel = Provider.of(context, listen: false); return CollapsingListView( - title: "${LocaleKeys.insurance.tr(context: context)} ${LocaleKeys.updateInsurance.tr(context: context)}", + title: "${LocaleKeys.updateInsurance.tr(context: context)} ${LocaleKeys.insurance.tr(context: context)}", // history: () { // // insuranceViewModel.setIsInsuranceHistoryLoading(true); // // insuranceViewModel.getPatientInsuranceCardHistory(); diff --git a/lib/presentation/medical_file/medical_file_page.dart b/lib/presentation/medical_file/medical_file_page.dart index 89839f0d..ab8ca725 100644 --- a/lib/presentation/medical_file/medical_file_page.dart +++ b/lib/presentation/medical_file/medical_file_page.dart @@ -743,7 +743,7 @@ class _MedicalFilePageState extends State { Expanded( child: LabRadCard( icon: AppAssets.radiology_icon, - labelText: "${LocaleKeys.radiology.tr(context: context)} ${LocaleKeys.results.tr(context: context)}", + labelText: LocaleKeys.radiologyLabResults.tr(context: context), // labOrderTests: ["Complete blood count", "Creatinine", "Blood Sugar", // labOrderTests: ["Chest X-ray", "Abdominal Ultrasound", "Dental X-ray"], labOrderTests: [], @@ -1077,7 +1077,7 @@ class _MedicalFilePageState extends State { ); }), MedicalFileCard( - label: "Allergy Information".needTranslation, + label: LocaleKeys.illurgyInfomation.tr(), textColor: AppColors.blackColor, backgroundColor: AppColors.whiteColor, svgIcon: AppAssets.allergy_info_icon, @@ -1092,7 +1092,7 @@ class _MedicalFilePageState extends State { ); }), MedicalFileCard( - label: "Vaccine Information".needTranslation, + label: LocaleKeys.vaccineInfomation.tr(), textColor: AppColors.blackColor, backgroundColor: AppColors.whiteColor, svgIcon: AppAssets.vaccine_info_icon, @@ -1187,7 +1187,7 @@ class _MedicalFilePageState extends State { Navigator.of(context).push(CustomPageRoute(page: InsuranceHomePage())); }), MedicalFileCard( - label: "${LocaleKeys.insurance.tr(context: context)} ${LocaleKeys.approvals.tr(context: context)}", + label: "${LocaleKeys.approvals1.tr(context: context)} ${LocaleKeys.insurance.tr(context: context)}", textColor: AppColors.blackColor, backgroundColor: AppColors.whiteColor, svgIcon: AppAssets.insurance_approval_icon, @@ -1241,7 +1241,7 @@ class _MedicalFilePageState extends State { Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - "${LocaleKeys.sick.tr(context: context)} ${LocaleKeys.sickSubtitle.tr(context: context)}".toText16(isBold: true), + "${LocaleKeys.sickSubtitle.tr(context: context)} ${LocaleKeys.sick2.tr(context: context)}".toText16(isBold: true), Row( children: [ LocaleKeys.viewAll.tr(context: context).toText12(color: AppColors.primaryRedColor), @@ -1550,7 +1550,7 @@ class _MedicalFilePageState extends State { icon: AppAssets.heightVital, label: LocaleKeys.height.tr(context: context), value: _formatValue(vitalSign.heightCm), - unit: 'cm', + unit: LocaleKeys.cm.tr(), status: null, onTap: onTap, ), @@ -1568,7 +1568,7 @@ class _MedicalFilePageState extends State { icon: AppAssets.weightVital, label: LocaleKeys.weight.tr(context: context), value: _formatValue(vitalSign.weightKg), - unit: 'kg', + unit: LocaleKeys.kg.tr(), status: vitalSign.weightKg != null ? _getWeightStatus(vitalSign.bodyMassIndex) : null, onTap: onTap, ), diff --git a/lib/presentation/medical_file/patient_sickleaves_list_page.dart b/lib/presentation/medical_file/patient_sickleaves_list_page.dart index 42d94ce7..3f8c0bc2 100644 --- a/lib/presentation/medical_file/patient_sickleaves_list_page.dart +++ b/lib/presentation/medical_file/patient_sickleaves_list_page.dart @@ -53,7 +53,7 @@ class _PatientSickleavesListPageState extends State { return Scaffold( backgroundColor: AppColors.bgScaffoldColor, body: CollapsingListView( - title: "${LocaleKeys.sick.tr(context: context)} ${LocaleKeys.sickSubtitle.tr(context: context)}", + title: "${LocaleKeys.sickSubtitle.tr(context: context)} ${LocaleKeys.sick.tr(context: context)}", child: SingleChildScrollView( child: Consumer(builder: (context, model, child) { return Column( diff --git a/lib/presentation/medical_file/vaccine_list_page.dart b/lib/presentation/medical_file/vaccine_list_page.dart index 06f1a6d5..d6c29676 100644 --- a/lib/presentation/medical_file/vaccine_list_page.dart +++ b/lib/presentation/medical_file/vaccine_list_page.dart @@ -50,7 +50,7 @@ class _VaccineListPageState extends State { return Scaffold( backgroundColor: AppColors.bgScaffoldColor, body: CollapsingListView( - title: LocaleKeys.vaccineInfo.tr(context: context), + title: LocaleKeys.vaccineInfomation.tr(context: context), child: SingleChildScrollView( child: Consumer(builder: (context, medicalFileVM, child) { return Column( diff --git a/lib/presentation/symptoms_checker/suggestions_screen.dart b/lib/presentation/symptoms_checker/suggestions_screen.dart index 8fc58fd7..60b4df19 100644 --- a/lib/presentation/symptoms_checker/suggestions_screen.dart +++ b/lib/presentation/symptoms_checker/suggestions_screen.dart @@ -199,7 +199,7 @@ class _SuggestionsScreenState extends State { children: [ Expanded( child: CollapsingListView( - title: LocaleKeys.suggestions.tr(), + title: LocaleKeys.suggestions.tr() , leadingCallback: () => context.pop(), child: viewModel.isSuggestionsLoading ? _buildLoadingShimmer() diff --git a/lib/presentation/water_monitor/water_monitor_settings_page.dart b/lib/presentation/water_monitor/water_monitor_settings_page.dart index 5c47bc38..367cecc5 100644 --- a/lib/presentation/water_monitor/water_monitor_settings_page.dart +++ b/lib/presentation/water_monitor/water_monitor_settings_page.dart @@ -2,6 +2,7 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:hmg_patient_app_new/core/app_assets.dart'; import 'package:hmg_patient_app_new/core/app_export.dart'; +import 'package:hmg_patient_app_new/core/app_state.dart'; import 'package:hmg_patient_app_new/core/dependencies.dart'; import 'package:hmg_patient_app_new/core/utils/utils.dart'; import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; @@ -53,9 +54,7 @@ class _WaterMonitorSettingsPageState extends State { onChanged: (_) => onTap(), materialTapTargetSize: MaterialTapTargetSize.shrinkWrap, ), - (useUpperCase ? value.toUpperCase() : value.toCamelCase) - .toText16(isBold: true, textOverflow: TextOverflow.ellipsis, maxlines: 1) - .expanded, + (useUpperCase ? value.toUpperCase() : value.toCamelCase).toText16(isBold: true, textOverflow: TextOverflow.ellipsis, maxlines: 1).expanded, ], ).onPress(onTap), ); @@ -103,7 +102,7 @@ class _WaterMonitorSettingsPageState extends State { context: context, title: LocaleKeys.selectGender.tr(context: context), items: viewModel.genderOptions, - selectedValue: viewModel.selectedGender, + selectedValue: viewModel.selectedGenderDisplay, onSelected: viewModel.setGender, ); } @@ -112,8 +111,8 @@ class _WaterMonitorSettingsPageState extends State { _showSelectionBottomSheet( context: context, title: LocaleKeys.selectUnit.tr(context: context), - items: viewModel.heightUnits, - selectedValue: viewModel.selectedHeightUnit, + items: viewModel.getHeightUnitsList(), + selectedValue: viewModel.selectedHeightUnitDisplay, onSelected: viewModel.setHeightUnit, useUpperCase: true, ); @@ -123,8 +122,8 @@ class _WaterMonitorSettingsPageState extends State { _showSelectionBottomSheet( context: context, title: LocaleKeys.selectUnit.tr(context: context), - items: viewModel.weightUnits, - selectedValue: viewModel.selectedWeightUnit, + items: viewModel.getWeightUnitsList(), + selectedValue: viewModel.selectedWeightUnitDisplay, onSelected: viewModel.setWeightUnit, useUpperCase: true, ); @@ -135,7 +134,7 @@ class _WaterMonitorSettingsPageState extends State { context: context, title: LocaleKeys.selectActivityLevel.tr(context: context), items: viewModel.activityLevels, - selectedValue: viewModel.selectedActivityLevel, + selectedValue: viewModel.selectedActivityLevelDisplay, onSelected: viewModel.setActivityLevel, ); } @@ -145,7 +144,7 @@ class _WaterMonitorSettingsPageState extends State { context: context, title: LocaleKeys.selectNumberOfReminders.tr(context: context), items: viewModel.reminderOptions, - selectedValue: viewModel.selectedNumberOfReminders, + selectedValue: viewModel.selectedNumberOfRemindersDisplay, onSelected: viewModel.setNumberOfReminders, ); } @@ -184,6 +183,7 @@ class _WaterMonitorSettingsPageState extends State { VoidCallback? onRowTap, bool showDivider = true, }) { + AppState appState = getIt(); return Column( children: [ Row( @@ -231,7 +231,7 @@ class _WaterMonitorSettingsPageState extends State { crossAxisAlignment: CrossAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.start, children: [ - "Unit".toText12(isBold: true, color: AppColors.inputLabelTextColor), + appState.isArabic() ? "الوحدة".toText12(isBold: true, color: AppColors.inputLabelTextColor) : "Unit".toText12(isBold: true, color: AppColors.inputLabelTextColor), unit.toText12(isBold: true, color: AppColors.textColor), ], ), @@ -307,7 +307,7 @@ class _WaterMonitorSettingsPageState extends State { _buildSettingsRow( icon: AppAssets.genderIcon, label: LocaleKeys.selectGender.tr(context: context), - value: viewModel.selectedGender, + value: viewModel.selectedGenderDisplay, onRowTap: () => _showGenderSelectionBottomsheet(context, viewModel), ), _buildSettingsRow( @@ -327,7 +327,7 @@ class _WaterMonitorSettingsPageState extends State { '175', keyboardType: TextInputType.number, ), - unit: viewModel.selectedHeightUnit, + unit: viewModel.selectedHeightUnitDisplay, onUnitTap: () => _showHeightUnitSelectionBottomSheet(context, viewModel), ), _buildSettingsRow( @@ -338,19 +338,19 @@ class _WaterMonitorSettingsPageState extends State { '75', keyboardType: TextInputType.number, ), - unit: viewModel.selectedWeightUnit, + unit: viewModel.selectedWeightUnitDisplay, onUnitTap: () => _showWeightUnitSelectionBottomsheet(context, viewModel), ), _buildSettingsRow( icon: AppAssets.dumbellIcon, label: LocaleKeys.activityLevel.tr(context: context), - value: viewModel.selectedActivityLevel, + value: viewModel.selectedActivityLevelDisplay, onRowTap: () => _showActivityLevelSelectionBottomsheet(context, viewModel), ), _buildSettingsRow( icon: AppAssets.notificationIconGrey, label: LocaleKeys.numberOfRemindersInADay.tr(context: context), - value: viewModel.selectedNumberOfReminders, + value: viewModel.selectedNumberOfRemindersDisplay, onRowTap: () => _showNumberOfRemindersSelectionBottomsheet(context, viewModel), showDivider: false, ), diff --git a/lib/presentation/water_monitor/widgets/cup_bottomsheet_widgets.dart b/lib/presentation/water_monitor/widgets/cup_bottomsheet_widgets.dart index 40018b61..058f14e8 100644 --- a/lib/presentation/water_monitor/widgets/cup_bottomsheet_widgets.dart +++ b/lib/presentation/water_monitor/widgets/cup_bottomsheet_widgets.dart @@ -2,6 +2,8 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:hmg_patient_app_new/core/app_assets.dart'; import 'package:hmg_patient_app_new/core/app_export.dart'; +import 'package:hmg_patient_app_new/core/app_state.dart'; +import 'package:hmg_patient_app_new/core/dependencies.dart'; import 'package:hmg_patient_app_new/core/utils/utils.dart'; import 'package:hmg_patient_app_new/extensions/route_extensions.dart'; import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; @@ -17,13 +19,15 @@ import 'package:uuid/uuid.dart'; /// Bottom sheet to switch between existing cups or add new custom cup void showSwitchCupBottomSheet(BuildContext context) { + final isArabic = getIt.get().isArabic(); + return showCommonBottomSheetWithoutHeight( context, titleWidget: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - "Switch Cups".toText20(isBold: true), - "Select your preferred cup size".toText16(isBold: true, color: AppColors.greyTextColor), + (isArabic ? "تبديل الأكواب" : "Switch Cups").toText20(isBold: true), + (isArabic ? "اختر حجم الكوب المفضل لديك" : "Select your preferred cup size").toText16(isBold: true, color: AppColors.greyTextColor), ], ), child: SwitchCupBottomSheet(), diff --git a/lib/widgets/date_range_selector/date_range_calender.dart b/lib/widgets/date_range_selector/date_range_calender.dart index 2bc5788b..463f516a 100644 --- a/lib/widgets/date_range_selector/date_range_calender.dart +++ b/lib/widgets/date_range_selector/date_range_calender.dart @@ -28,6 +28,7 @@ class DateRangeSelector extends StatefulWidget { final CalendarDesignType designType; final bool showCalendarToggle; final OnCalendarTypeChanged? onCalendarTypeChanged; + final String? btnTitle; const DateRangeSelector({ super.key, @@ -35,6 +36,7 @@ class DateRangeSelector extends StatefulWidget { this.designType = CalendarDesignType.defaultUI, this.showCalendarToggle = true, this.onCalendarTypeChanged, + this.btnTitle, }); @override @@ -83,7 +85,7 @@ class _DateRangeSelectorState extends State { _calendarController.selectedRange = PickerDateRange(model.fromDate, model.toDate); - return widget.designType == CalendarDesignType.designV2 ? _buildDesignV2() : _buildDefaultUI(); + return widget.designType == CalendarDesignType.designV2 ? _buildDesignV2(widget.btnTitle) : _buildDefaultUI(); } Widget _buildDefaultUI() { @@ -247,7 +249,7 @@ class _DateRangeSelectorState extends State { ); } - Widget _buildDesignV2() { + Widget _buildDesignV2(String? btnTitle) { return ChangeNotifierProvider( create: (_) => DateRangCalenderModel(appState: getIt(), navigationService: getIt(), dialogService: getIt()), child: Consumer( @@ -317,7 +319,7 @@ class _DateRangeSelectorState extends State { ), // Only Select button for V2 (no cancel button) CustomButton( - text: LocaleKeys.select.tr(context: context), + text: btnTitle ?? LocaleKeys.select.tr(context: context), onPressed: () { // Don't reset calendar type - keep user's preference Navigator.of(context).pop(); diff --git a/lib/widgets/input_widget.dart b/lib/widgets/input_widget.dart index 8b43d1ed..9242cfcd 100644 --- a/lib/widgets/input_widget.dart +++ b/lib/widgets/input_widget.dart @@ -45,6 +45,7 @@ class TextInputWidget extends StatelessWidget { final Widget? suffix; final Color? labelColor; final Function(String)? onSubmitted; + final String? btnTitle; // new multiline options final bool isMultiline; @@ -59,45 +60,45 @@ class TextInputWidget extends StatelessWidget { // final List countryList; // final Function(Country)? onCountryChange; - TextInputWidget({ - super.key, - required this.labelText, - required this.hintText, - this.controller, - this.onChange, - this.onCalendarTypeChanged, - this.prefix, - this.isEnable = true, - this.isBorderAllowed = true, - this.isAllowRadius = true, - this.isReadOnly = false, - this.keyboardType = TextInputType.number, - this.focusNode, - this.autoFocus = false, - this.padding, - this.isAllowLeadingIcon = false, - this.leadingIcon, - this.isCountryDropDown = false, - this.hasError = false, - this.errorMessage, - this.onCountryChange, - this.selectionType, - this.fontSize, - this.isWalletAmountInput = false, - this.suffix, - this.labelColor, - this.onSubmitted, - this.hintColor, - // multiline defaults - this.isMultiline = false, - this.minLines = 3, - this.maxLines = 6, - this.isHideSwitcher, - this.isArrowTrailing, - this.fontFamily, - // this.countryList = const [], - // this.onCountryChange, - }); + TextInputWidget( + {super.key, + required this.labelText, + required this.hintText, + this.controller, + this.onChange, + this.onCalendarTypeChanged, + this.prefix, + this.isEnable = true, + this.isBorderAllowed = true, + this.isAllowRadius = true, + this.isReadOnly = false, + this.keyboardType = TextInputType.number, + this.focusNode, + this.autoFocus = false, + this.padding, + this.isAllowLeadingIcon = false, + this.leadingIcon, + this.isCountryDropDown = false, + this.hasError = false, + this.errorMessage, + this.onCountryChange, + this.selectionType, + this.fontSize, + this.isWalletAmountInput = false, + this.suffix, + this.labelColor, + this.onSubmitted, + this.hintColor, + // multiline defaults + this.isMultiline = false, + this.minLines = 3, + this.maxLines = 6, + this.isHideSwitcher, + this.isArrowTrailing, + this.fontFamily, + // this.countryList = const [], + // this.onCountryChange, + this.btnTitle}); final FocusNode _focusNode = FocusNode(); @@ -218,7 +219,6 @@ class TextInputWidget extends StatelessWidget { } Widget _buildTrailingIcon(BuildContext context, {bool isArrowTrailing = false}) { - final AppState appState = getIt.get(); return Container( height: 40.h, width: 40.w, @@ -227,20 +227,20 @@ class TextInputWidget extends StatelessWidget { decoration: RoundedRectangleBorder().toSmoothCornerDecoration(borderRadius: 12.r, color: AppColors.whiteColor), child: GestureDetector( onTap: () async { - showCommonBottomSheetWithoutHeight( + showCommonBottomSheetWithoutHeight( title: LocaleKeys.selectDate.tr(context: context), context, child: DateRangeSelector( - onRangeSelected: (DateTime? start, DateTime? end) { - var picked = start.toString().split(" ").first; - if (picked != null && onChange != null) { - onChange!(picked.toString()); - } - }, - designType: CalendarDesignType.designV2, - showCalendarToggle: isHideSwitcher == true ? false : true, - onCalendarTypeChanged: onCalendarTypeChanged, - ), + onRangeSelected: (DateTime? start, DateTime? end) { + var picked = start.toString().split(" ").first; + if (picked != null && onChange != null) { + onChange!(picked.toString()); + } + }, + designType: CalendarDesignType.designV2, + showCalendarToggle: isHideSwitcher == true ? false : true, + onCalendarTypeChanged: onCalendarTypeChanged, + btnTitle: btnTitle ?? LocaleKeys.done.tr()), isFullScreen: false, isCloseButtonVisible: true, callBackFunc: () { From 256537cfb3d4cf4ac7fe39197792ca15809dda71 Mon Sep 17 00:00:00 2001 From: Sultan khan Date: Wed, 15 Apr 2026 20:27:50 +0300 Subject: [PATCH 44/45] update and fix --- assets/langs/ar-SA.json | 14 +- assets/langs/en-US.json | 12 +- lib/core/api/api_client.dart | 1 + lib/core/api_consts.dart | 1 + lib/core/app_assets.dart | 2 +- lib/core/utils/push_notification_handler.dart | 127 ++++++++++++++++-- .../prescriptions_view_model.dart | 17 +++ lib/generated/locale_keys.g.dart | 8 ++ .../blood_donation/blood_donation_page.dart | 12 +- .../widgets/select_gender_widget.dart | 12 +- .../immediate_livecare_payment_details.dart | 1 + .../comprehensive_checkup_page.dart | 5 +- .../widgets/blood_cholesterol.dart | 4 +- .../widgets/triglycerides.dart | 8 +- .../hmg_services/services_page.dart | 90 ++++++------- .../smartwatches/smartwatch_home_page.dart | 2 +- lib/splashPage.dart | 59 +++++--- 17 files changed, 278 insertions(+), 97 deletions(-) diff --git a/assets/langs/ar-SA.json b/assets/langs/ar-SA.json index a8df3819..96d967d4 100644 --- a/assets/langs/ar-SA.json +++ b/assets/langs/ar-SA.json @@ -1238,7 +1238,7 @@ "healthCalculatorsServices": "حاسبات\nالصحة", "healthConvertersServices": "محولات\nالصحة", "smartWatchesServices": "الساعات\nالذكية", - "exploreServices": "قائمة الخدمات او الخدمات", + "exploreServices": "تصفح الخدمات", "medicalAndCareServices": "خدمات الرعاية الطبية", "hmgServices": "خدمات مجموعة الحبيب الطبية", "personalServices": "الخدمات الشخصية", @@ -1471,7 +1471,7 @@ "covered": "مغطى", "vatPercent": "ضريبة القيمة المضافة (15%)", "proceedToPayment": "المتابعة للدفع", - "supportedSmartWatches": "الساعات الذكية المدعومة", + "supportedSmartWatches": "كيف تعمل؟", "pleaseMakeSureSamsungWatchConnected": "يرجى التأكد من أن ساعة Samsung الخاصة بك متصلة بهاتفك، ومتزامنة ومحدثة بشكل نشط.", "beforeSyncingDataFollowInstructions": "قبل مزامنة البيانات، يرجى التأكد من اتباع التعليمات بشكل صحيح.", "viewWatchInstructions": "عرض تعليمات الساعة", @@ -1768,6 +1768,12 @@ "locationServicesDisabled": "حالة الطقس غير متوفرة لتعطيل خدمات الموقع. يرجى تفعيل خدمات الموقع لتتمكن من رؤية معلومات الطقس.", "selectDateTimeKey": "اختيار", "medicalKey": "الطبية", - "convertBloodcholesterolInfo":"حول قيمة كوليسترول الدم بين ملجم/ديسيلتر و مليمول/لتر" - + "convertBloodcholesterolInfo":"حول قيمة كوليسترول الدم بين ملجم/ديسيلتر و مليمول/لتر", + "mldl": "مليجرام لكل ديسيلتر", + "mmol": "ملي مول لكل لتر", + "triglycerideInfo": "تغيير وحدات القياس بين مليجرام لكل ديسيلتر و ملي مول لكل لتر", + "selectSmartWatch": "تعيين", + "selectBloodDonationCity": "اختر المدينة", + "selectBloodDonationGender": "اختر الجنس", + "selectBloodType": "اختر الفصيلة" } diff --git a/assets/langs/en-US.json b/assets/langs/en-US.json index ee1c1d01..25a16577 100644 --- a/assets/langs/en-US.json +++ b/assets/langs/en-US.json @@ -1756,9 +1756,15 @@ "selectCriteria": "Select Criteria", "locationServicesDisabled": "Weather is unavailable because location services are disabled. Please enable location services to see the weather information.", "selectDateTimeKey": "Select", - "medicalKey": "Medical" -, - "convertBloodcholesterolInfo": "Convert blood cholesterol values between mg/dL and mmol/L. " + "medicalKey": "Medical", + "convertBloodcholesterolInfo": "Convert blood cholesterol values between mg/dL and mmol/L. ", + "mldl": "مليجرام لكل ديسيلتر", + "mmol": "ملي مول لكل لتر", + "triglycerideInfo": "Convert triglyceride values between mg/dL and mmol/L.", + "selectSmartWatch": "Select", + "selectBloodDonationCity": "Select City", + "selectBloodDonationGender": "Select Gender", + "selectBloodType": "Select Blood Type" } diff --git a/lib/core/api/api_client.dart b/lib/core/api/api_client.dart index 374ac9d1..3c71281c 100644 --- a/lib/core/api/api_client.dart +++ b/lib/core/api/api_client.dart @@ -172,6 +172,7 @@ class ApiClientImp implements ApiClient { // body['VersionID'] = ApiConsts.appVersionID.toString(); if (!isExternal) { body['VersionID'] = ApiConsts.appVersionID.toString(); + if(!isRCService) body['Channel'] = ApiConsts.appChannelId.toString(); body['IPAdress'] = ApiConsts.appIpAddress; body['generalid'] = ApiConsts.appGeneralId; diff --git a/lib/core/api_consts.dart b/lib/core/api_consts.dart index 819691be..ff39fa70 100644 --- a/lib/core/api_consts.dart +++ b/lib/core/api_consts.dart @@ -189,6 +189,7 @@ class ApiConsts { static final createEReferral = "Services/Patients.svc/REST/CreateEReferral"; static final getEReferrals = "Services/Patients.svc/REST/GetEReferrals"; + //WATER CONSUMPTION static String h2oGetUserProgress = "Services/H2ORemainder.svc/REST/H2O_GetUserProgress"; static String h2oInsertUserActivity = "Services/H2ORemainder.svc/REST/H2O_InsertUserActivity"; diff --git a/lib/core/app_assets.dart b/lib/core/app_assets.dart index c3811a94..feb2c196 100644 --- a/lib/core/app_assets.dart +++ b/lib/core/app_assets.dart @@ -401,7 +401,7 @@ class AppAssets { static const String lockIcon = '$pngBasePath/lock-icon.png'; static const String dummyUser = '$pngBasePath/dummy_user.png'; static const String comprehensiveCheckupEn = '$pngBasePath/cc_en.png'; - static const String comprehensiveCheckupAr = '$pngBasePath/cc_er.png'; + static const String comprehensiveCheckupAr = '$pngBasePath/cc_ar.png'; static const String maleIcon = '$pngBasePath/male_icon.png'; static const String femaleIcon = '$pngBasePath/female_icon.png'; diff --git a/lib/core/utils/push_notification_handler.dart b/lib/core/utils/push_notification_handler.dart index 770961de..c82c608d 100644 --- a/lib/core/utils/push_notification_handler.dart +++ b/lib/core/utils/push_notification_handler.dart @@ -9,17 +9,27 @@ import 'package:firebase_messaging/firebase_messaging.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_callkit_incoming/entities/android_params.dart'; +import 'package:flutter_callkit_incoming/entities/call_event.dart'; import 'package:flutter_callkit_incoming/entities/call_kit_params.dart'; import 'package:flutter_callkit_incoming/entities/ios_params.dart'; import 'package:flutter_callkit_incoming/entities/notification_params.dart'; import 'package:flutter_callkit_incoming/flutter_callkit_incoming.dart'; import 'package:flutter_ios_voip_kit_karmm/call_state_type.dart'; import 'package:flutter_ios_voip_kit_karmm/flutter_ios_voip_kit.dart'; +import 'package:hmg_patient_app_new/core/api_consts.dart'; import 'package:hmg_patient_app_new/core/cache_consts.dart'; import 'package:hmg_patient_app_new/core/utils/utils.dart'; +import 'package:hmg_patient_app_new/core/api/api_client.dart'; +import 'package:hmg_patient_app_new/core/dependencies.dart'; import 'package:permission_handler/permission_handler.dart'; import 'package:uuid/uuid.dart'; +// Global tracking variables for call state +bool _isCallInProgress = false; +String? _currentCallId; +Timer? _callTimeoutTimer; +String? _currentSessionId; // Store session ID for API call + // |--> Push Notification Background @pragma('vm:entry-point') Future backgroundMessageHandler(dynamic message) async { @@ -39,34 +49,36 @@ callPage(String sessionID, String token) async {} _incomingCall(Map data) async { print('the value of the _incomingCall remote message is $data'); - // LandingPage.incomingCallData = IncomingCallData.fromJson(data); - // var dataItem = await AppSharedPreferences().getObject('call_data'); - // if(dataItem != null ) return; // to stop repeated attempt to invoke the call - // if (LandingPage.isOpenCallPage == false) { - // LandingPage.isOpenCallPage = true; + // Check if there's already a call in progress to prevent duplicates + if (_isCallInProgress && _currentCallId != null) { + print('⚠️ Call already in progress (ID: $_currentCallId), ignoring duplicate notification'); + return; + } String roomID = data['session_id'] ?? ''; String callTypeID = data['AppointmentNo'] ?? ''; - // GetIt.instance().saveString(key: CacheConst.zoomRoomID, value: roomID); - // GetIt.instance().saveBool(key: CacheConst.isAppOpenedFromCall, value: true); + // Generate unique call ID + var _currentUuid = Uuid().v4(); + _currentCallId = _currentUuid; + _isCallInProgress = true; + _currentSessionId = roomID; // Store session ID for decline API call + + print('📞 Starting new call with ID: $_currentCallId, Session: $_currentSessionId'); await Utils.saveStringFromPrefs(CacheConst.zoomRoomID, roomID); await Utils.saveStringFromPrefs(CacheConst.callTypeID, callTypeID); await Utils.saveBoolFromPrefs(CacheConst.isAppOpenedFromCall, true); - WidgetsFlutterBinding.ensureInitialized(); int callKitType = callTypeID == '2' ? 0 : 1; - var _currentUuid = Uuid().v4(); CallKitParams callKitParams = CallKitParams( id: _currentUuid, nameCaller: "Dr Al Habib", appName: 'Dr Al Habib', avatar: 'https://play-lh.googleusercontent.com/FBNNpxb7m6eM6wtW7MV1Ffp6OXOGLI38q47zcvP29OCYA1yhYH5mZzl5itZi0TgOyZpG', - // handle: LandingPage.incomingCallData.name, type: callKitType, textAccept: 'Accept', textDecline: 'Decline', @@ -85,8 +97,8 @@ _incomingCall(Map data) async { duration: 30000, extra: { 'userId': '1a2b3c4d', - 'callTypeID': callTypeID, // Store actual callTypeID here - 'roomID': roomID, // Store roomID here for backup + 'callTypeID': callTypeID, + 'roomID': roomID, }, headers: {'apiKey': 'Abc@123!', 'platform': 'flutter'}, android: const AndroidParams( @@ -96,10 +108,10 @@ _incomingCall(Map data) async { isShowLogo: false, logoUrl: "https://play-lh.googleusercontent.com/FBNNpxb7m6eM6wtW7MV1Ffp6OXOGLI38q47zcvP29OCYA1yhYH5mZzl5itZi0TgOyZpG", ringtonePath: 'system_ringtone_default', - backgroundColor: '#ED1C2B', + backgroundColor: '#2E3039', backgroundUrl: 'https://saudipedia.com/en/saudipediaen/uploads/images/2024/08/02/97358.jpg', actionColor: '#4CAF50', - textColor: '#000000', + textColor: '#FFFFFF', incomingCallNotificationChannelName: "Incoming Call", missedCallNotificationChannelName: "Missed Call", isShowCallID: false), @@ -120,12 +132,89 @@ _incomingCall(Map data) async { ringtonePath: 'system_ringtone_default', ), ); + FlutterCallkitIncoming.unsilenceEvents(); await FlutterCallkitIncoming.showCallkitIncoming(callKitParams); + // Start 60-second timeout timer to auto-dismiss call + _callTimeoutTimer?.cancel(); // Cancel any existing timer + _callTimeoutTimer = Timer(Duration(seconds: 40), () async { + print('⏱️ Call timeout (60 seconds) - auto dismissing call notification'); + await _endCallAndCleanup(_currentUuid); + }); + await Future.delayed(Duration(milliseconds: 500)); } +// Helper method to end call and cleanup +Future _endCallAndCleanup(String callId, {bool isDeclined = false}) async { + try { + print('🧹 Cleaning up call: $callId'); + + // If call was declined, update session status via API + if (isDeclined && _currentSessionId != null && _currentSessionId!.isNotEmpty) { + await _updateSessionStatus(_currentSessionId!, 3, 'Patient'); + } + + // End the specific call + await FlutterCallkitIncoming.endCall(callId); + + // Clear all calls to ensure clean state + await FlutterCallkitIncoming.endAllCalls(); + + // Reset tracking flags + _isCallInProgress = false; + _currentCallId = null; + _currentSessionId = null; + + // Cancel timer + _callTimeoutTimer?.cancel(); + _callTimeoutTimer = null; + + // Clear cache + await Utils.saveBoolFromPrefs(CacheConst.isAppOpenedFromCall, false); + await Utils.saveStringFromPrefs(CacheConst.zoomRoomID, ''); + await Utils.saveStringFromPrefs(CacheConst.callTypeID, ''); + + print('✅ Call and push notification cleanup completed successfully'); + } catch (e) { + print('❌ Error during call cleanup: $e'); + // Force reset flags even if there's an error + _isCallInProgress = false; + _currentCallId = null; + _currentSessionId = null; + _callTimeoutTimer?.cancel(); + _callTimeoutTimer = null; + } +} + +// Helper method to update session status via API +Future _updateSessionStatus(String sessionId, int sessionStatus, String sessionEndedBy) async { + try { + + final apiClient = getIt.get(); + + Map requestBody = { + "Open_SessionID": sessionId, + "SessionStatus": sessionStatus, + "SessionEndedBy": sessionEndedBy + }; + + await apiClient.post( + CHANGE_PATIENT_ER_SESSION, + body: requestBody, + onSuccess: (response, statusCode, {messageStatus, errorMessage}) { + print('✅ Session status updated successfully: $response'); + }, + onFailure: (error, statusCode, {messageStatus, failureType}) { + print('❌ Failed to update session status: $error'); + }, + ); + } catch (e) { + print('❌ Exception updating session status: $e'); + } +} + Future openCallPage(BuildContext context) async { try { // if (incomingCallData!.background == "0") { @@ -291,6 +380,10 @@ class PushNotificationHandler { try { print('🎈 example: onDidRejectIncomingCall $uuid - $callerId'); timeOutTimer.cancel(); + // Cleanup on reject with API call + if (_currentCallId != null) { + await _endCallAndCleanup(_currentCallId!, isDeclined: true); + } } catch (err) {} }; @@ -301,6 +394,12 @@ class PushNotificationHandler { print('🎈 example: onDidAcceptIncomingCall $uuid - $callerId'); await voIPKit.acceptIncomingCall(callerState: CallStateType.calling); await voIPKit.callConnected(); + + // Cleanup on accept - cancel timer and reset flags + _callTimeoutTimer?.cancel(); + _callTimeoutTimer = null; + _isCallInProgress = false; + _currentCallId = null; await Future.delayed(Duration(seconds: 2)).then((val) async { await voIPKit.endCall(); }); diff --git a/lib/features/prescriptions/prescriptions_view_model.dart b/lib/features/prescriptions/prescriptions_view_model.dart index 0f09f1e9..c374b3e2 100644 --- a/lib/features/prescriptions/prescriptions_view_model.dart +++ b/lib/features/prescriptions/prescriptions_view_model.dart @@ -306,6 +306,23 @@ class PrescriptionsViewModel extends ChangeNotifier { } else if (apiResponse.messageStatus == 1) { isPrescriptionsDeliveryOrdersLoading = false; prescriptionsOrderList = apiResponse.data!; + + // Sort by created date (newest first) + prescriptionsOrderList.sort((a, b) { + try { + if (a.created == null && b.created == null) return 0; + if (a.created == null) return 1; + if (b.created == null) return -1; + + DateTime dateA = DateTime.parse(a.created!); + DateTime dateB = DateTime.parse(b.created!); + return dateB.compareTo(dateA); // Descending order (newest first) + } catch (e) { + print('Error parsing date for sorting: $e'); + return 0; + } + }); + notifyListeners(); if (onSuccess != null) { onSuccess(apiResponse); diff --git a/lib/generated/locale_keys.g.dart b/lib/generated/locale_keys.g.dart index c7c924ef..49bd90b9 100644 --- a/lib/generated/locale_keys.g.dart +++ b/lib/generated/locale_keys.g.dart @@ -1759,5 +1759,13 @@ abstract class LocaleKeys { static const locationServicesDisabled = 'locationServicesDisabled'; static const selectDateTimeKey = 'selectDateTimeKey'; static const medicalKey = 'medicalKey'; + static const convertBloodcholesterolInfo = 'convertBloodcholesterolInfo'; + static const mldl = 'mldl'; + static const mmol = 'mmol'; + static const triglycerideInfo = 'triglycerideInfo'; + static const selectSmartWatch = 'selectSmartWatch'; + static const selectBloodDonationCity = 'selectBloodDonationCity'; + static const selectBloodDonationGender = 'selectBloodDonationGender'; + static const selectBloodType = 'selectBloodType'; } diff --git a/lib/presentation/blood_donation/blood_donation_page.dart b/lib/presentation/blood_donation/blood_donation_page.dart index c6767c2d..4a8f91a6 100644 --- a/lib/presentation/blood_donation/blood_donation_page.dart +++ b/lib/presentation/blood_donation/blood_donation_page.dart @@ -148,8 +148,8 @@ class _BloodDonationPageState extends State { children: [ LocaleKeys.city.tr().toText16(color: AppColors.textColor, isBold: true), (appState.isArabic() - ? (bloodDonationVM.selectedCity?.descriptionN ?? LocaleKeys.select.tr()) - : bloodDonationVM.selectedCity?.description ?? LocaleKeys.select.tr(context: context)) + ? (bloodDonationVM.selectedCity?.descriptionN ?? LocaleKeys.selectBloodDonationCity.tr()) + : bloodDonationVM.selectedCity?.description ?? LocaleKeys.selectBloodDonationCity.tr(context: context)) .toText14(color: AppColors.greyTextColor, isBold: true), ], ), @@ -176,8 +176,8 @@ class _BloodDonationPageState extends State { children: [ LocaleKeys.gender.tr().toText16(color: AppColors.textColor, isBold: true), (appState.isArabic() - ? (bloodDonationVM.selectedGender?.typeAr ?? LocaleKeys.select.tr()) - : bloodDonationVM.selectedGender?.type ?? LocaleKeys.select.tr(context: context)) + ? (bloodDonationVM.selectedGender?.typeAr ?? LocaleKeys.selectBloodDonationGender.tr()) + : bloodDonationVM.selectedGender?.type ?? LocaleKeys.selectBloodDonationGender.tr(context: context)) .toText14(color: AppColors.greyTextColor, isBold: true), ], ), @@ -208,8 +208,8 @@ class _BloodDonationPageState extends State { LocaleKeys.bloodType.tr().toText16(color: AppColors.textColor, isBold: true), // bloodDonationVM.selectedBloodType?.toText14(color: AppColors.greyTextColor, isBold: true), (appState.isArabic() - ? (bloodDonationVM.selectedBloodType ?? LocaleKeys.select.tr()) - : bloodDonationVM.selectedBloodType ?? LocaleKeys.select.tr(context: context)) + ? (bloodDonationVM.selectedBloodType ?? LocaleKeys.selectBloodType.tr()) + : bloodDonationVM.selectedBloodType ?? LocaleKeys.selectBloodType.tr(context: context)) .toText14(color: AppColors.greyTextColor, isBold: true) ], ), diff --git a/lib/presentation/blood_donation/widgets/select_gender_widget.dart b/lib/presentation/blood_donation/widgets/select_gender_widget.dart index 0d360a80..1368c4e3 100644 --- a/lib/presentation/blood_donation/widgets/select_gender_widget.dart +++ b/lib/presentation/blood_donation/widgets/select_gender_widget.dart @@ -37,7 +37,12 @@ class SelectGenderWidget extends StatelessWidget { child: Column( crossAxisAlignment: CrossAxisAlignment.start, spacing: 8.h, - children: [GenderTypeEnum.values[index].name.toCamelCase.toText16(color: AppColors.textColor, isBold: true)], + children: [ + (isArabic + ? GenderTypeEnum.values[index].typeAr + : GenderTypeEnum.values[index].type) + .toText16(color: AppColors.textColor, isBold: true) + ], ), ), Transform.flip( @@ -52,7 +57,10 @@ class SelectGenderWidget extends StatelessWidget { ), ], ).paddingSymmetrical(16.h, 16.h).onPress(() { - bloodDonationViewModel.onGenderChange(GenderTypeEnum.values[index].name.toCamelCase); + final genderValue = isArabic + ? GenderTypeEnum.values[index].typeAr + : GenderTypeEnum.values[index].type; + bloodDonationViewModel.onGenderChange(genderValue); Navigator.of(context).pop(); })); }, 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 1228e1e4..b3801113 100644 --- a/lib/presentation/book_appointment/livecare/immediate_livecare_payment_details.dart +++ b/lib/presentation/book_appointment/livecare/immediate_livecare_payment_details.dart @@ -240,6 +240,7 @@ class ImmediateLiveCarePaymentDetails extends StatelessWidget { ], ).paddingSymmetrical(24.h, 0.h), (immediateLiveCareVM.liveCareImmediateAppointmentFeesList.total == "0" || immediateLiveCareVM.liveCareImmediateAppointmentFeesList.total == "0.0") + // (true) ? CustomButton( text: LocaleKeys.confirmLiveCare.tr(context: context), onPressed: () async { diff --git a/lib/presentation/comprehensive_checkup/comprehensive_checkup_page.dart b/lib/presentation/comprehensive_checkup/comprehensive_checkup_page.dart index 589764c1..0761ab6c 100644 --- a/lib/presentation/comprehensive_checkup/comprehensive_checkup_page.dart +++ b/lib/presentation/comprehensive_checkup/comprehensive_checkup_page.dart @@ -250,7 +250,10 @@ class _ComprehensiveCheckupPageState extends State { physics: NeverScrollableScrollPhysics(), itemBuilder: (context, index) { final service = services[index]; - final serviceName = service.text ?? service.textN ?? ''; + final appStateLocal = getIt.get(); + final serviceName = appStateLocal.isArabic() + ? (service.textN ?? service.text ?? '') + : (service.text ?? service.textN ?? ''); final price = service.priceTotal ?? 0.0; return RadioListTileWidget( value: service.iD ?? 0, diff --git a/lib/presentation/health_calculators_and_converts/widgets/blood_cholesterol.dart b/lib/presentation/health_calculators_and_converts/widgets/blood_cholesterol.dart index d24463bf..14b956e0 100644 --- a/lib/presentation/health_calculators_and_converts/widgets/blood_cholesterol.dart +++ b/lib/presentation/health_calculators_and_converts/widgets/blood_cholesterol.dart @@ -78,7 +78,7 @@ class _BloodCholesterolWidgetState extends State { child: Column( children: [ _buildInputField( - label: "MG/DL", + label: LocaleKeys.mldl.tr(), hint: "120", controller: _mgdlController, focusNode: _mgdlFocus, @@ -107,7 +107,7 @@ class _BloodCholesterolWidgetState extends State { ], ), _buildInputField( - label: "MMOL/L", + label:LocaleKeys.mmol.tr(), hint: "3.1", controller: _mmolController, focusNode: _mmolFocus, diff --git a/lib/presentation/health_calculators_and_converts/widgets/triglycerides.dart b/lib/presentation/health_calculators_and_converts/widgets/triglycerides.dart index b61eaaed..dd5eb0f0 100644 --- a/lib/presentation/health_calculators_and_converts/widgets/triglycerides.dart +++ b/lib/presentation/health_calculators_and_converts/widgets/triglycerides.dart @@ -1,4 +1,6 @@ +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; import 'package:provider/provider.dart'; import 'package:hmg_patient_app_new/core/app_assets.dart'; import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; @@ -80,7 +82,7 @@ class _TriglyceridesWidgetState extends State { child: Column( children: [ _buildInputField( - label: "MG/DL", + label: LocaleKeys.mldl.tr(), hint: "150", controller: _mgdlController, focusNode: _mgdlFocus, @@ -111,7 +113,7 @@ class _TriglyceridesWidgetState extends State { ), _buildInputField( - label: "MMOL/L", + label: LocaleKeys.mmol, hint: "1.7", controller: _mmolController, focusNode: _mmolFocus, @@ -134,7 +136,7 @@ class _TriglyceridesWidgetState extends State { SizedBox(width: 12.w), Expanded( child: - "Convert triglyceride values between mg/dL and mmol/L." + LocaleKeys.triglycerideInfo.tr() .toText12( isBold: true, color: AppColors.inputLabelTextColor, diff --git a/lib/presentation/hmg_services/services_page.dart b/lib/presentation/hmg_services/services_page.dart index 734401fe..af6672ea 100644 --- a/lib/presentation/hmg_services/services_page.dart +++ b/lib/presentation/hmg_services/services_page.dart @@ -105,51 +105,51 @@ class _ServicesPageState extends State { ); } }), - HmgServicesComponentModel( - 11, - LocaleKeys.indoorNavigation.tr(), - "", - AppAssets.indoor_nav_icon, - bgColor: Color(0xff45A2F8), - true, - route: null, - onTap: () { - showCommonBottomSheetWithoutHeight( - title: LocaleKeys.selectHospital.tr(), - GetIt.instance().navigatorKey.currentContext!, - child: ChangeNotifierProvider( - create: (context) => HospitalSelectionBottomSheetViewModel(getIt()), - child: Consumer( - builder: (_, vm, __) => HospitalBottomSheetBody( - searchText: vm.searchController, - displayList: vm.displayList, - onFacilityClicked: (value) { - vm.setSelectedFacility(value); - vm.getDisplayList(); - }, - onHospitalClicked: (hospital) { - Navigator.pop(GetIt.instance().navigatorKey.currentContext!); - vm.openPenguin(hospital); - }, - onHospitalSearch: (value) { - vm.searchHospitals(value ?? ""); - }, - selectedFacility: vm.selectedFacility, - hmcCount: vm.hmcCount, - hmgCount: vm.hmgCount, - ), - ), - ), - isFullScreen: false, - isCloseButtonVisible: true, - hasBottomPadding: false, - backgroundColor: AppColors.bottomSheetBgColor, - callBackFunc: () { - GetIt.instance().navigatorKey.currentContext!.read().clearSearchText(); - }, - ); - }, - ), + // HmgServicesComponentModel( + // 11, + // LocaleKeys.indoorNavigation.tr(), + // "", + // AppAssets.indoor_nav_icon, + // bgColor: Color(0xff45A2F8), + // true, + // route: null, + // onTap: () { + // showCommonBottomSheetWithoutHeight( + // title: LocaleKeys.selectHospital.tr(), + // GetIt.instance().navigatorKey.currentContext!, + // child: ChangeNotifierProvider( + // create: (context) => HospitalSelectionBottomSheetViewModel(getIt()), + // child: Consumer( + // builder: (_, vm, __) => HospitalBottomSheetBody( + // searchText: vm.searchController, + // displayList: vm.displayList, + // onFacilityClicked: (value) { + // vm.setSelectedFacility(value); + // vm.getDisplayList(); + // }, + // onHospitalClicked: (hospital) { + // Navigator.pop(GetIt.instance().navigatorKey.currentContext!); + // vm.openPenguin(hospital); + // }, + // onHospitalSearch: (value) { + // vm.searchHospitals(value ?? ""); + // }, + // selectedFacility: vm.selectedFacility, + // hmcCount: vm.hmcCount, + // hmgCount: vm.hmgCount, + // ), + // ), + // ), + // isFullScreen: false, + // isCloseButtonVisible: true, + // hasBottomPadding: false, + // backgroundColor: AppColors.bottomSheetBgColor, + // callBackFunc: () { + // GetIt.instance().navigatorKey.currentContext!.read().clearSearchText(); + // }, + // ); + // }, + // ), HmgServicesComponentModel(11, LocaleKeys.eReferralServices.tr(), "", AppAssets.eReferral, bgColor: AppColors.eReferralCardColor, true, route: null, onTap: () async { if (getIt.get().isAuthenticated) { getIt.get().pushPageRoute(AppRoutes.eReferralPage); diff --git a/lib/presentation/smartwatches/smartwatch_home_page.dart b/lib/presentation/smartwatches/smartwatch_home_page.dart index b6c98ee9..53e562e6 100644 --- a/lib/presentation/smartwatches/smartwatch_home_page.dart +++ b/lib/presentation/smartwatches/smartwatch_home_page.dart @@ -85,7 +85,7 @@ class SmartwatchHomePage extends StatelessWidget { Image.asset("assets/images/png/smartwatches/apple-watch-5.jpg", width: 136.w, height: 136.h).paddingSymmetrical(24.w, 8.h), "Apple Watch".needTranslation.toText16(isBold: true), CustomButton( - text: LocaleKeys.select.tr(context: context), + text: LocaleKeys.selectSmartWatch.tr(context: context), onPressed: () { context.read().setSelectedWatchType(SmartWatchTypes.apple, "assets/images/png/smartwatches/apple-watch-5.jpg"); getIt.get().pushPage(page: SmartwatchInstructionsPage( diff --git a/lib/splashPage.dart b/lib/splashPage.dart index c7be036f..7fe97e6f 100644 --- a/lib/splashPage.dart +++ b/lib/splashPage.dart @@ -5,6 +5,7 @@ import 'package:flutter_callkit_incoming/entities/call_event.dart'; import 'package:flutter_callkit_incoming/flutter_callkit_incoming.dart'; import 'package:flutter_zoom_videosdk/native/zoom_videosdk.dart'; import 'package:get_it/get_it.dart'; +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/app_assets.dart'; import 'package:hmg_patient_app_new/core/app_export.dart'; @@ -182,9 +183,22 @@ class _SplashScreenState extends State { } break; case Event.actionCallDecline: - print('actionCallConnected Event Received: ------->'); + print('actionCallDecline Event Received: ------->'); + + // Get session ID from cache + String sessionId = await Utils.getStringFromPrefs(CacheConst.zoomRoomID); + // + // // Update session status to 3 (declined by patient) + // if (sessionId.isNotEmpty) { + await _updateSessionStatus(sessionId, 3, 'Patient'); + // } + await FlutterCallkitIncoming.endAllCalls(); GetIt.instance().remove(key: CacheConst.isAppOpenedFromCall); + + // Clear cache + await Utils.saveStringFromPrefs(CacheConst.zoomRoomID, ''); + await Utils.saveStringFromPrefs(CacheConst.callTypeID, ''); break; case Event.actionCallEnded: break; @@ -220,20 +234,35 @@ class _SplashScreenState extends State { /// load the Privilege from service Future loadPrivilege() async { - // ProjectViewModel projectProvider = Provider.of(context, listen: false); - // projectProvider.setPrivilegeModelList(privilege: _privilegeService.privilegeModelList); - // projectProvider.setVidaPlusProjectList(_privilegeService.vidaPlusProjectListModel); - // projectProvider.setHMCProjectList(_privilegeService.hMCProjectListModel); - // projectProvider.setProjectsDetailList(_privilegeService.projectDetailListModel); - // double lat = await AppSharedPreferences().getDouble(USER_LAT) ?? 0.0; - // double long = await AppSharedPreferences().getDouble(USER_LONG) ?? 0.0; - // AppSharedPreferences().clear(); // Clearing Shared Preferences On App Launch - // await AppSharedPreferences().setDouble(USER_LAT, lat); - // await AppSharedPreferences().setDouble(USER_LONG, long); - // AppSharedPreferences().setString(APP_LANGUAGE, projectProvider.isArabic ? "ar" : "en"); - // var themeNotifier = Provider.of(context, listen: false); - // themeNotifier.setTheme(defaultTheme(fontName: projectProvider.isArabic ? 'Cairo' : 'Poppins')); - // PushNotificationHandler().init(context); // Asyncronously + // ...existing code... + } + + /// Update session status when call is declined + Future _updateSessionStatus(String sessionId, int sessionStatus, String sessionEndedBy) async { + try { + print('📡 Updating session status - SessionID: $sessionId, Status: $sessionStatus, EndedBy: $sessionEndedBy'); + + final apiClient = getIt.get(); + String sessionID = await Utils.getStringFromPrefs(CacheConst.zoomRoomID); + Map requestBody = { + "Open_SessionID": sessionID, + "SessionStatus": sessionStatus, + "SessionEndedBy": sessionEndedBy + }; + + await apiClient.post( + CHANGE_PATIENT_ER_SESSION, + body: requestBody, + onSuccess: (response, statusCode, {messageStatus, errorMessage}) { + print('✅ Session status updated successfully: $response'); + }, + onFailure: (error, statusCode, {messageStatus, failureType}) { + print('❌ Failed to update session status: $error'); + }, + ); + } catch (e) { + print('❌ Exception updating session status: $e'); + } } @override From bf7b0d922e14e5da53cfffef87dd18a26796192a Mon Sep 17 00:00:00 2001 From: tahaalam Date: Wed, 15 Apr 2026 20:52:12 +0300 Subject: [PATCH 45/45] weather permission issue --- lib/features/weather/weather_view_model.dart | 28 +++++++++++++++++++ .../hmg_services/widgets/weather_widget.dart | 7 +++-- 2 files changed, 32 insertions(+), 3 deletions(-) diff --git a/lib/features/weather/weather_view_model.dart b/lib/features/weather/weather_view_model.dart index 874630d2..32b97753 100644 --- a/lib/features/weather/weather_view_model.dart +++ b/lib/features/weather/weather_view_model.dart @@ -1,9 +1,15 @@ +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/cupertino.dart'; import 'package:hmg_patient_app_new/core/dependencies.dart'; import 'package:hmg_patient_app_new/core/location_util.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.dart'; import 'package:hmg_patient_app_new/features/weather/models/waether_cities_model.dart'; import 'package:hmg_patient_app_new/features/weather/weather_repo.dart'; +import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; import 'package:hmg_patient_app_new/services/error_handler_service.dart'; +import 'package:hmg_patient_app_new/services/navigation_service.dart'; +import 'package:hmg_patient_app_new/widgets/common_bottom_sheet.dart'; +import 'package:permission_handler/permission_handler.dart' show openAppSettings; import '../../core/app_state.dart' show AppState; @@ -24,8 +30,30 @@ class WeatherMonitorViewModel extends ChangeNotifier { isLoading = true; notifyListeners(); _cityInfoList.clear(); + locationUtils.isShowConfirmDialog = true; locationUtils.getLocation( isShowConfirmDialog: true, + onFailure: (){ + isLoading = false; + notifyListeners(); + showCommonBottomSheetWithoutHeight( + title: LocaleKeys.notice.tr(), + getIt.get().navigatorKey.currentContext!, + child: Utils.getWarningWidget( + loadingText: LocaleKeys.grantLocationPermission.tr(), + isShowActionButtons: true, + onCancelTap: () { + getIt.get().pop(); + }, + onConfirmTap: () async { + getIt.get().pop(); + openAppSettings(); + }), + callBackFunc: () {}, + isFullScreen: false, + isCloseButtonVisible: true, + ); + }, onSuccess: (position) async { isLocationAvailable = true; final result = await weatherRepo.getCityInfo(); diff --git a/lib/presentation/hmg_services/widgets/weather_widget.dart b/lib/presentation/hmg_services/widgets/weather_widget.dart index b54ab78e..ca365111 100644 --- a/lib/presentation/hmg_services/widgets/weather_widget.dart +++ b/lib/presentation/hmg_services/widgets/weather_widget.dart @@ -44,12 +44,13 @@ class WeatherWidget extends StatelessWidget { return Selector cityInfoList})>( selector: (_, vm) => (isLoading: vm.isLoading, isLocationAvailable: vm.isLocationAvailable, cityInfoList: vm.cityInfoList), builder: (context, state, child) { - if (state.isLoading) { - return _buildLoadingState().paddingSymmetrical(24.w, 0.w); - } if (!state.isLocationAvailable) { return noWeatherWidget(context).paddingSymmetrical(24.w, 0.w); } + if (state.isLoading) { + return _buildLoadingState().paddingSymmetrical(24.w, 0.w); + } + final currentCity = state.cityInfoList.isNotEmpty ? state.cityInfoList.first : null; final now = DateTime.now();

    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 z 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 z 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 ?tdcfmaA3CU%#N7CC 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 submitAmbulanceRequest(GeocodeResult? result, PlaceDetails? place, PlacePrediction? placePrediction) async { + if (false == haveAnAppointment && null == selectedHospital) { + dialogService.showErrorBottomSheet(message: LocaleKeys.selectHospital.tr()); + return; + } PatientER_RC request = createRequest(result, place, placePrediction); navServices.push(CustomPageRoute(page: RequestingServicesPage())); @@ -802,19 +810,19 @@ class EmergencyServicesViewModel extends ChangeNotifier { request.patientERTransportationMethod = selectedTransportOption; transportationDetails.pickupUrgency = 1; switch (callingPlace) { - case AmbulanceCallingPlace.FROM_HOSPITAL: - transportationDetails.dropoffLatitude = selectedHospital!.latitude; - transportationDetails.dropoffLongitude = selectedHospital!.longitude; - transportationDetails.dropoffLocationName = selectedHospital!.name; + case AmbulanceCallingPlace.TO_HOSPITAL: + transportationDetails.dropoffLatitude = selectedHospital?.latitude; + transportationDetails.dropoffLongitude = selectedHospital?.longitude; + transportationDetails.dropoffLocationName = selectedHospital?.name; transportationDetails.pickupLatitude = ((result?.geometry.location.lat) ?? place?.lat)?.toStringAsFixed(6); transportationDetails.pickupLongitude = ((result?.geometry.location.lng) ?? place?.lng)?.toStringAsFixed(6); transportationDetails.pickupLocationName = result?.formattedAddress ?? placePrediction?.description; transportationDetails.direction = 1; break; - case AmbulanceCallingPlace.TO_HOSPITAL: - transportationDetails.pickupLatitude = selectedHospital!.latitude; - transportationDetails.pickupLongitude = selectedHospital!.longitude; - transportationDetails.pickupLocationName = selectedHospital!.name; + case AmbulanceCallingPlace.FROM_HOSPITAL: + transportationDetails.pickupLatitude = selectedHospital?.latitude; + transportationDetails.pickupLongitude = selectedHospital?.longitude; + transportationDetails.pickupLocationName = selectedHospital?.name; transportationDetails.dropoffLatitude = ((result?.geometry.location.lat) ?? place?.lat)?.toStringAsFixed(6); transportationDetails.dropoffLongitude = ((result?.geometry.location.lng) ?? place?.lng)?.toStringAsFixed(6); transportationDetails.dropoffLocationName = result?.formattedAddress ?? placePrediction?.description; diff --git a/lib/presentation/emergency_services/call_ambulance/call_ambulance_page.dart b/lib/presentation/emergency_services/call_ambulance/call_ambulance_page.dart index 55958048..3ac19814 100644 --- a/lib/presentation/emergency_services/call_ambulance/call_ambulance_page.dart +++ b/lib/presentation/emergency_services/call_ambulance/call_ambulance_page.dart @@ -53,8 +53,8 @@ class CallAmbulancePage extends StatelessWidget { ExpandableBottomSheet( bottomSheetType: context.watch().bottomSheetType, children: { - BottomSheetType.EXPANDED: ExpanedBottomSheet(context), - BottomSheetType.FIXED: FixedBottomSheet(context), + BottomSheetType.EXPANDED: ExpandedBottomSheet(context), + BottomSheetType.FIXED: pickUpDetailAndAppointementSection(context), }, ), ], @@ -92,7 +92,7 @@ class CallAmbulancePage extends StatelessWidget { ); } - Widget FixedBottomSheet(BuildContext context) { + Widget ExpandedBottomSheet(BuildContext context) { return GestureDetector( onVerticalDragUpdate: (details) { // if(details.delta.dy<0){ @@ -172,7 +172,11 @@ class CallAmbulancePage extends StatelessWidget { CustomButton( text: LocaleKeys.selectDetails.tr(context: context), onPressed: () { - context.read().updateBottomSheetState(BottomSheetType.EXPANDED); + LocationViewModel locationViewModel = context.read(); + GeocodeResponse? response = locationViewModel.geocodeResponse; + PlaceDetails? placeDetails = locationViewModel.placeDetails; + PlacePrediction? placePrediction = locationViewModel.selectedPrediction; + context.read().submitAmbulanceRequest(response?.results.first, placeDetails, placePrediction); }) ], ).paddingOnly(top: 24.h, bottom: 32.h, left: 24.h, right: 24.h), @@ -185,7 +189,7 @@ class CallAmbulancePage extends StatelessWidget { ); } - Widget ExpanedBottomSheet(BuildContext context) { + Widget pickUpDetailAndAppointementSection(BuildContext context) { return GestureDetector( onVerticalDragUpdate: (details) { if (details.delta.dy > 0) { @@ -324,28 +328,34 @@ class CallAmbulancePage extends StatelessWidget { ) ], ), + if(AmbulanceCallingPlace.TO_HOSPITAL == context.read().callingPlace) + Row( + children: [ + hospitalAndPickUpItemContent( + title: LocaleKeys.appointment.tr(context: context), + subTitle: LocaleKeys.haveAnyAppointment.tr(context: context), + leadingIcon: AppAssets.appointment_calendar_icon, + ), + CustomSwitch( + value: context.watch().haveAnAppointment, + onChanged: (value) async { + // if (value) { + // openAppointmentList(context); + // } + await context.read().updateAppointment(value); + if (context.read().appointments?.isNotEmpty == true) { + openAppointmentList(context); + } + }, + ) + ], + ), - Row( - children: [ - hospitalAndPickUpItemContent( - title: LocaleKeys.appointment.tr(context: context), - subTitle: LocaleKeys.haveAnyAppointment.tr(context: context), - leadingIcon: AppAssets.appointment_calendar_icon, - ), - CustomSwitch( - value: context.watch().haveAnAppointment, - onChanged: (value) async { - // if (value) { - // openAppointmentList(context); - // } - await context.read().updateAppointment(value); - if (context.read().appointments?.isNotEmpty == true) { - openAppointmentList(context); - } - }, - ) - ], - ), + + // Visibility( + // visible: , + // child: + // ), ], ).paddingAll(16.h), ); @@ -460,12 +470,8 @@ class CallAmbulancePage extends StatelessWidget { CustomButton( text: LocaleKeys.submitRequest.tr(context: context), onPressed: () { - LocationViewModel locationViewModel = context.read(); - GeocodeResponse? response = locationViewModel.geocodeResponse; - PlaceDetails? placeDetails = locationViewModel.placeDetails; - PlacePrediction? placePrediction = locationViewModel.selectedPrediction; - context.read().submitAmbulanceRequest(response?.results.first, placeDetails, placePrediction); - }) + context.read().updateBottomSheetState(BottomSheetType.EXPANDED); + }) ], ).paddingOnly(top: 24.h, bottom: 12.h, left: 24.h, right: 24.h), ), @@ -582,21 +588,24 @@ class CallAmbulancePage extends StatelessWidget { } hospitalField(BuildContext context) { - return DecoratedBox( - decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 12.h), - child: Row( - children: [ - hospitalAndPickUpItemContent( - title: LocaleKeys.selectHospital.tr(context: context), - subTitle: context.read().getSelectedHospitalName() ?? LocaleKeys.selectHospital.tr(context: context), - leadingIcon: AppAssets.hospital, - ), - Utils.buildSvgWithAssets(icon: AppAssets.down_cheveron, width: 24.h, height: 24.h).paddingAll(16.h) - ], - ).onPress(() { - showHospitalBottomSheet(context); - }).paddingSymmetrical( - 10.w, 12.h), + return Visibility( + visible: false == context.watch().haveAnAppointment, + child: DecoratedBox( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 12.h), + child: Row( + children: [ + hospitalAndPickUpItemContent( + title: LocaleKeys.selectHospital.tr(context: context), + subTitle: context.read().getSelectedHospitalName() ?? LocaleKeys.selectHospital.tr(context: context), + leadingIcon: AppAssets.hospital, + ), + Utils.buildSvgWithAssets(icon: AppAssets.down_cheveron, width: 24.h, height: 24.h).paddingAll(16.h) + ], + ).onPress(() { + showHospitalBottomSheet(context); + }).paddingSymmetrical( + 10.w, 12.h), + ), ); } diff --git a/lib/presentation/emergency_services/call_ambulance/tracking_screen.dart b/lib/presentation/emergency_services/call_ambulance/tracking_screen.dart index 0f4c587b..7c7f5db6 100644 --- a/lib/presentation/emergency_services/call_ambulance/tracking_screen.dart +++ b/lib/presentation/emergency_services/call_ambulance/tracking_screen.dart @@ -73,7 +73,10 @@ class TrackingScreen extends StatelessWidget { child: SingleChildScrollView( child: Column( children: [ - animationSection(), + Padding( + padding: EdgeInsetsDirectional.only(top:16.h,start: 16.w,end: 16.w ), + child: animationSection(context), + ), Column( spacing: 16.h, children: [orderStatus(context), orderTrackingId(context), contactSection()], @@ -83,12 +86,12 @@ class TrackingScreen extends StatelessWidget { ); } - animationSection() { + animationSection(BuildContext context) { switch (state) { case OrderTrackingState.waitingForCall: case OrderTrackingState.dispactched: case OrderTrackingState.returning: - return Lottie.asset(AppAnimations.ambulance, repeat: true, reverse: false, width: 260.h, height: 200.h); + return showImage(order != null ? AppAssets.ambulance_section : AppAssets.rrt_section, context); case OrderTrackingState.ended: return Lottie.asset(AppAnimations.checkmark, repeat: true, width: 260.h, height: 200.h); case OrderTrackingState.failed: @@ -489,6 +492,18 @@ class TrackingScreen extends StatelessWidget { ); } + showImage(String imageUrl, BuildContext context) { + return Utils.buildImgWithAssetsWithBorderRadius( + icon: imageUrl, + iconColor: Colors.transparent, + width: MediaQuery.sizeOf(context).width, + height: 380.h, + borderRadius: 24.r, + border: 1.r/// did this as the function that is being called is wrongly coupled with the border radius and border, and in some cases like the ambulance and rrt section we don't need any + /// border or border radius + ); + } + // Widget rrtOrderData() { // return Row( // spacing: 8.h, diff --git a/lib/widgets/order_tracking/request_tracking.dart b/lib/widgets/order_tracking/request_tracking.dart index f07c0b19..519a41c2 100644 --- a/lib/widgets/order_tracking/request_tracking.dart +++ b/lib/widgets/order_tracking/request_tracking.dart @@ -26,12 +26,7 @@ class OrderTrackingWidget extends StatelessWidget { Widget? getBarAndDot(OrderTrackingState? state, BuildContext context, double width) { - print("the parent padding value is $parentPaddingValue"); - print("the parent padding value is ${(parentPaddingValue+24)}"); - print("the width - (parentPaddingValue+24) ${(width - (parentPaddingValue+24))}"); double widthOfOneState = (width/4) - (parentPaddingValue+8.h); - print("te width of one state is $widthOfOneState"); - print("the value of${width/4}"); if(state == null) { return Row( children: List.generate(4, (index) { From a144f30f425309486bb3f27eafd283dc22854247 Mon Sep 17 00:00:00 2001 From: Sultan khan Date: Sun, 12 Apr 2026 12:39:12 +0300 Subject: [PATCH 05/45] no message --- assets/langs/ar-SA.json | 1 + assets/langs/en-US.json | 1 + lib/core/api/api_client.dart | 6 +- .../models/ui_models/vital_sign_ui_model.dart | 69 ++++++++++++++----- .../insurance/insurance_view_model.dart | 1 + .../my_invoices/my_invoices_view_model.dart | 2 + lib/generated/codegen_loader.g.dart | 2 + lib/generated/locale_keys.g.dart | 1 + .../vital_sign/vital_sign_page.dart | 4 +- 9 files changed, 65 insertions(+), 22 deletions(-) diff --git a/assets/langs/ar-SA.json b/assets/langs/ar-SA.json index 08adc616..5304cc8f 100644 --- a/assets/langs/ar-SA.json +++ b/assets/langs/ar-SA.json @@ -307,6 +307,7 @@ "vitalSignObese": "بدين", "vitalSignOverweight": "زيادة الوزن", "vitalSignUnderweight": "نقص الوزن", + "vitalSignSkinny": "نحيف جداً", "myMedical": "نشط", "myMedicalSubtitle": "الأدوية", "myDoctor": "أطبائي", diff --git a/assets/langs/en-US.json b/assets/langs/en-US.json index 18484fc1..febd8632 100644 --- a/assets/langs/en-US.json +++ b/assets/langs/en-US.json @@ -306,6 +306,7 @@ "vitalSignObese": "Obese", "vitalSignOverweight": "Overweight", "vitalSignUnderweight": "Underweight", + "vitalSignSkinny": "Underweight", "myMedical": "Active", "myMedicalSubtitle": "Medications", "myDoctor": "My Doctors", diff --git a/lib/core/api/api_client.dart b/lib/core/api/api_client.dart index 374ac9d1..30ea3eba 100644 --- a/lib/core/api/api_client.dart +++ b/lib/core/api/api_client.dart @@ -198,9 +198,9 @@ class ApiClientImp implements ApiClient { url = "https://hmgwebservices.com/Services/NHIC.svc/REST/GetPatientInfo"; 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/features/hmg_services/models/ui_models/vital_sign_ui_model.dart b/lib/features/hmg_services/models/ui_models/vital_sign_ui_model.dart index ea0782bd..6fb24066 100644 --- a/lib/features/hmg_services/models/ui_models/vital_sign_ui_model.dart +++ b/lib/features/hmg_services/models/ui_models/vital_sign_ui_model.dart @@ -11,6 +11,7 @@ enum VitalSignStatus { obese, overweight, underweight, + skinny, } /// UI-only helper model for Vital Sign cards. @@ -34,8 +35,9 @@ class VitalSignUiModel { /// /// Rules: /// - Height is always blue. - /// - High, Obese, Overweight => red scheme. - /// - Low, Underweight => yellow scheme. + /// - High, Obese => red scheme. + /// - Overweight => orange scheme. + /// - Low, Underweight, Skinny => yellow scheme. /// - Otherwise => green scheme (Normal). static VitalSignUiModel scheme({required VitalSignStatus? status, required String label}) { final l = label.toLowerCase(); @@ -50,10 +52,8 @@ class VitalSignUiModel { ); } - // High, Obese, Overweight => red scheme (health concerns) - if (status == VitalSignStatus.high || - status == VitalSignStatus.obese || - status == VitalSignStatus.overweight) { + // High, Obese => red scheme (health concerns) + if (status == VitalSignStatus.high || status == VitalSignStatus.obese) { return VitalSignUiModel( iconBg: AppColors.chipSecondaryLightRedColor, iconFg: AppColors.primaryRedColor, @@ -62,8 +62,20 @@ class VitalSignUiModel { ); } - // Low, Underweight => yellow scheme (warning) - if (status == VitalSignStatus.low || status == VitalSignStatus.underweight) { + // Overweight => orange scheme (warning) + if (status == VitalSignStatus.overweight) { + return VitalSignUiModel( + iconBg: AppColors.warningColorYellow.withValues(alpha: 0.12), + iconFg: AppColors.warningColorYellow, + chipBg: AppColors.warningColorYellow.withValues(alpha: 0.12), + chipFg: AppColors.warningColorYellow, + ); + } + + // Low, Underweight, Skinny => yellow scheme (warning) + if (status == VitalSignStatus.low || + status == VitalSignStatus.underweight || + status == VitalSignStatus.skinny) { final Color yellowBg = AppColors.highAndLow.withValues(alpha: 0.12); return VitalSignUiModel( iconBg: yellowBg, @@ -98,6 +110,8 @@ class VitalSignUiModel { return LocaleKeys.vitalSignOverweight.tr(); case VitalSignStatus.underweight: return LocaleKeys.vitalSignUnderweight.tr(); + case VitalSignStatus.skinny: + return LocaleKeys.vitalSignSkinny.tr(); } } @@ -131,22 +145,30 @@ class VitalSignUiModel { return null; } - // BMI >= 25 (Overweight or Obese) => High - if (bmiResult >= 25) { - return VitalSignStatus.high; + // BMI >= 30 (Obese) => Red + if (bmiResult >= 30) { + return VitalSignStatus.obese; + } + // BMI >= 25 (Overweight) => Orange + else if (bmiResult >= 25) { + return VitalSignStatus.overweight; } - // BMI >= 18.5 and < 25 => Normal + // BMI >= 18.5 (Normal) => Green else if (bmiResult >= 18.5) { return VitalSignStatus.normal; } - // BMI < 18.5 (Underweight) => Low + // BMI >= 16 (Underweight) => Yellow + else if (bmiResult >= 16) { + return VitalSignStatus.underweight; + } + // BMI < 16 (Skinny/Severely underweight) => Yellow else { - return VitalSignStatus.low; + return VitalSignStatus.skinny; } } /// Weight status based on BMI with detailed classification - /// Returns: Obese, Overweight, Normal, Underweight + /// Returns: Obese, Overweight, Normal, Underweight, Skinny static VitalSignStatus? weightStatus(dynamic bmi) { // Return null if BMI is not available or is 0 final double bmiResult = double.tryParse(bmi.toString()) ?? 0; @@ -155,15 +177,26 @@ class VitalSignUiModel { return null; } + // BMI >= 30 (Obese) => Red if (bmiResult >= 30) { return VitalSignStatus.obese; - } else if (bmiResult >= 25) { + } + // BMI >= 25 (Overweight) => Orange + else if (bmiResult >= 25) { return VitalSignStatus.overweight; - } else if (bmiResult >= 18.5) { + } + // BMI >= 18.5 (Normal) => Green + else if (bmiResult >= 18.5) { return VitalSignStatus.normal; - } else { + } + // BMI >= 16 (Underweight) => Yellow + else if (bmiResult >= 16) { return VitalSignStatus.underweight; } + // BMI < 16 (Skinny/Severely underweight) => Yellow + else { + return VitalSignStatus.skinny; + } } } diff --git a/lib/features/insurance/insurance_view_model.dart b/lib/features/insurance/insurance_view_model.dart index 28210d39..621ebe4c 100644 --- a/lib/features/insurance/insurance_view_model.dart +++ b/lib/features/insurance/insurance_view_model.dart @@ -191,6 +191,7 @@ class InsuranceViewModel extends ChangeNotifier { notifyListeners(); }, (apiResponse) { + patientInsuranceApprovalsList =[]; if (apiResponse.messageStatus == 2) { // dialogService.showErrorDialog(message: apiResponse.errorMessage!, onOkPressed: () {}); } else if (apiResponse.messageStatus == 1) { diff --git a/lib/features/my_invoices/my_invoices_view_model.dart b/lib/features/my_invoices/my_invoices_view_model.dart index cd18026c..631efd5b 100644 --- a/lib/features/my_invoices/my_invoices_view_model.dart +++ b/lib/features/my_invoices/my_invoices_view_model.dart @@ -52,6 +52,8 @@ class MyInvoicesViewModel extends ChangeNotifier { notifyListeners(); }, (apiResponse) { + _originalInvoicesList =[]; + allInvoicesList =[]; if (apiResponse.messageStatus == 2) { // dialogService.showErrorDialog(message: apiResponse.errorMessage!, onOkPressed: () {}); } else if (apiResponse.messageStatus == 1) { diff --git a/lib/generated/codegen_loader.g.dart b/lib/generated/codegen_loader.g.dart index 17950a46..7287071a 100644 --- a/lib/generated/codegen_loader.g.dart +++ b/lib/generated/codegen_loader.g.dart @@ -322,6 +322,7 @@ class CodegenLoader extends AssetLoader{ "vitalSignObese": "بدين", "vitalSignOverweight": "زيادة الوزن", "vitalSignUnderweight": "نقص الوزن", + "vitalSignSkinny": "نحيف جداً", "myMedical": "نشط", "myMedicalSubtitle": "الأدوية", "myDoctor": "أطبائي", @@ -2034,6 +2035,7 @@ static const Map _en_US = { "vitalSignObese": "Obese", "vitalSignOverweight": "Overweight", "vitalSignUnderweight": "Underweight", + "vitalSignSkinny": "Underweight", "myMedical": "Active", "myMedicalSubtitle": "Medications", "myDoctor": "My Doctors", diff --git a/lib/generated/locale_keys.g.dart b/lib/generated/locale_keys.g.dart index 1bd8019d..c2cac71e 100644 --- a/lib/generated/locale_keys.g.dart +++ b/lib/generated/locale_keys.g.dart @@ -308,6 +308,7 @@ abstract class LocaleKeys { static const vitalSignObese = 'vitalSignObese'; static const vitalSignOverweight = 'vitalSignOverweight'; static const vitalSignUnderweight = 'vitalSignUnderweight'; + static const vitalSignSkinny = 'vitalSignSkinny'; static const myMedical = 'myMedical'; static const myMedicalSubtitle = 'myMedicalSubtitle'; static const myDoctor = 'myDoctor'; diff --git a/lib/presentation/vital_sign/vital_sign_page.dart b/lib/presentation/vital_sign/vital_sign_page.dart index f712aa77..255ba606 100644 --- a/lib/presentation/vital_sign/vital_sign_page.dart +++ b/lib/presentation/vital_sign/vital_sign_page.dart @@ -236,7 +236,9 @@ class _VitalSignPageState extends State { fit: StackFit.expand, children: [ Image.asset( - AppAssets.bmiFullBody, + getIt.get().getAuthenticatedUser()?.gender == 1 + ? AppAssets.fullBodyFrontMale + : AppAssets.fullBodyFrontFemale, fit: BoxFit.cover, alignment: Alignment.topCenter, ), From 2b0f8b45b071e6ed29d533a7763bcfd6babbc275 Mon Sep 17 00:00:00 2001 From: aamir-csol Date: Sun, 12 Apr 2026 17:01:17 +0300 Subject: [PATCH 06/45] appointment reminder & weather --- android/app/src/main/AndroidManifest.xml | 3 +- assets/images/svg/cloudyweather.svg | 49 ++ assets/images/svg/evening.svg | 9 + assets/images/svg/morning.svg | 9 + lib/core/dependencies.dart | 5 + .../medical_file/medical_file_view_model.dart | 17 +- .../my_appointments_view_model.dart | 105 ++++ .../weather/models/waether_cities_model.dart | 257 +++++++++ lib/features/weather/weather_repo.dart | 72 +++ lib/features/weather/weather_view_model.dart | 55 ++ lib/main.dart | 4 + .../appointment_details_page.dart | 410 +++++++------- .../review_appointment_page.dart | 120 ++-- .../hmg_services/services_page.dart | 521 ++++++++++-------- 14 files changed, 1142 insertions(+), 494 deletions(-) create mode 100644 assets/images/svg/cloudyweather.svg create mode 100644 assets/images/svg/evening.svg create mode 100644 assets/images/svg/morning.svg create mode 100644 lib/features/weather/models/waether_cities_model.dart create mode 100644 lib/features/weather/weather_repo.dart create mode 100644 lib/features/weather/weather_view_model.dart diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 0e1749d6..d3899285 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -39,7 +39,7 @@ - + @@ -52,7 +52,6 @@ - diff --git a/assets/images/svg/cloudyweather.svg b/assets/images/svg/cloudyweather.svg new file mode 100644 index 00000000..6f8ebb47 --- /dev/null +++ b/assets/images/svg/cloudyweather.svg @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/images/svg/evening.svg b/assets/images/svg/evening.svg new file mode 100644 index 00000000..7932d78d --- /dev/null +++ b/assets/images/svg/evening.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/assets/images/svg/morning.svg b/assets/images/svg/morning.svg new file mode 100644 index 00000000..0f0d9904 --- /dev/null +++ b/assets/images/svg/morning.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/lib/core/dependencies.dart b/lib/core/dependencies.dart index 3b7253db..f451f0d5 100644 --- a/lib/core/dependencies.dart +++ b/lib/core/dependencies.dart @@ -64,6 +64,8 @@ import 'package:hmg_patient_app_new/features/todo_section/todo_section_repo.dart import 'package:hmg_patient_app_new/features/todo_section/todo_section_view_model.dart'; import 'package:hmg_patient_app_new/features/water_monitor/water_monitor_repo.dart'; import 'package:hmg_patient_app_new/features/water_monitor/water_monitor_view_model.dart'; +import 'package:hmg_patient_app_new/features/weather/weather_repo.dart'; +import 'package:hmg_patient_app_new/features/weather/weather_view_model.dart'; import 'package:hmg_patient_app_new/features/health_trackers/health_trackers_view_model.dart'; import 'package:hmg_patient_app_new/services/analytics/analytics_service.dart'; import 'package:hmg_patient_app_new/services/cache_service.dart'; @@ -164,6 +166,7 @@ class AppDependencies { getIt.registerLazySingleton(() => SymptomsCheckerRepoImp(loggerService: getIt(), apiClient: getIt())); getIt.registerLazySingleton(() => BloodDonationRepoImp(loggerService: getIt(), apiClient: getIt())); getIt.registerLazySingleton(() => WaterMonitorRepoImp(loggerService: getIt(), apiClient: getIt())); + getIt.registerLazySingleton(() => WeatherRepoImp(loggerService: getIt(), apiClient: getIt())); getIt.registerLazySingleton(() => MyInvoicesRepoImp(loggerService: getIt(), apiClient: getIt())); getIt.registerLazySingleton(() => HealthTrackersRepoImp(loggerService: getIt(), apiClient: getIt())); getIt.registerLazySingleton(() => MonthlyReportRepoImp(loggerService: getIt(), apiClient: getIt())); @@ -299,6 +302,8 @@ class AppDependencies { getIt.registerLazySingleton(() => WaterMonitorViewModel(waterMonitorRepo: getIt(), errorHandlerService: getIt())); + getIt.registerLazySingleton(() => WeatherMonitorViewModel(weatherRepo: getIt(), errorHandlerService: getIt(), locationUtils: 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())); diff --git a/lib/features/medical_file/medical_file_view_model.dart b/lib/features/medical_file/medical_file_view_model.dart index 05f82208..fc3990f9 100644 --- a/lib/features/medical_file/medical_file_view_model.dart +++ b/lib/features/medical_file/medical_file_view_model.dart @@ -41,6 +41,7 @@ class MedicalFileViewModel extends ChangeNotifier { List patientSickLeavesViewList = []; bool isSickLeavesSortByClinic = true; + // bool isSickLeavesDataNeedsReloading = true; List patientAllergiesList = []; @@ -165,13 +166,13 @@ class MedicalFileViewModel extends ChangeNotifier { setIsPatientSickLeaveListLoading(bool val) { // if (val && isSickLeavesDataNeedsReloading) { - patientSickLeaveList.clear(); - patientSickLeavesByClinic.clear(); - patientSickLeavesByHospital.clear(); - patientSickLeavesViewList.clear(); - patientSickLeavePDFBase64 = ""; - isSickLeavesSortByClinic = true; - isPatientSickLeaveListLoading = val; + patientSickLeaveList.clear(); + patientSickLeavesByClinic.clear(); + patientSickLeavesByHospital.clear(); + patientSickLeavesViewList.clear(); + patientSickLeavePDFBase64 = ""; + isSickLeavesSortByClinic = true; + isPatientSickLeaveListLoading = val; // } notifyListeners(); } @@ -774,4 +775,6 @@ class MedicalFileViewModel extends ChangeNotifier { }, ); } + + } diff --git a/lib/features/my_appointments/my_appointments_view_model.dart b/lib/features/my_appointments/my_appointments_view_model.dart index 73f8d331..842c4a61 100644 --- a/lib/features/my_appointments/my_appointments_view_model.dart +++ b/lib/features/my_appointments/my_appointments_view_model.dart @@ -2,6 +2,7 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:get_it/get_it.dart'; import 'package:hmg_patient_app_new/core/app_state.dart'; +import 'package:hmg_patient_app_new/core/utils/calender_utils_new.dart'; import 'package:hmg_patient_app_new/core/utils/date_util.dart'; import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; import 'package:hmg_patient_app_new/core/utils/utils.dart'; @@ -1109,4 +1110,108 @@ class MyAppointmentsViewModel extends ChangeNotifier { }, ); } + + /// Creates a reminder for the appointment + /// Shows a bottom sheet to select reminder time and creates calendar event + Future createReminder({ + required BuildContext context, + required PatientAppointmentHistoryResponseModel patientAppointmentHistoryResponseModel, + Function(bool)? onSuccess, + Function(String)? onError, + }) async { + try { + CalenderUtilsNew calender = CalenderUtilsNew.instance; + DateTime endDate = DateUtil.convertStringToDate(patientAppointmentHistoryResponseModel.appointmentDate); + + BottomSheetUtils().showReminderBottomSheet( + context, + endDate, + patientAppointmentHistoryResponseModel.doctorNameObj ?? "", + "${patientAppointmentHistoryResponseModel.appointmentNo}", + "", + "", + title: "Appointment with ${patientAppointmentHistoryResponseModel.doctorNameObj}", + description: "${patientAppointmentHistoryResponseModel.doctorNameObj} will be having an appointment on ${patientAppointmentHistoryResponseModel.appointmentDate}", + onSuccess: () { + setAppointmentReminder(true, patientAppointmentHistoryResponseModel); + if (onSuccess != null) { + onSuccess(true); + } + }, + isMultiAllowed: true, + onMultiDateSuccess: (int selectedIndex) async { + bool isEventAddedOrRemoved = await calender.createOrUpdateEvent( + title: "Appointment Reminder with ${patientAppointmentHistoryResponseModel.doctorNameObj} on ${DateUtil.convertStringToDate(patientAppointmentHistoryResponseModel.appointmentDate)}, Appointment #${patientAppointmentHistoryResponseModel.appointmentNo}", + description: "Appointment Reminder with ${patientAppointmentHistoryResponseModel.doctorNameObj} in ${patientAppointmentHistoryResponseModel.projectName}", + scheduleDateTime: DateUtil.convertStringToDate(patientAppointmentHistoryResponseModel.appointmentDate), + eventId: "${patientAppointmentHistoryResponseModel.appointmentNo}", + location: '', + reminderMinutes: selectedIndex, + ); + + setAppointmentReminder(isEventAddedOrRemoved, patientAppointmentHistoryResponseModel); + + if (onSuccess != null) { + onSuccess(isEventAddedOrRemoved); + } + }, + ); + } catch (e) { + if (onError != null) { + onError(e.toString()); + } + } + } + + /// Deletes the reminder for the appointment + /// Removes the calendar event associated with the appointment + Future deleteReminder({ + required PatientAppointmentHistoryResponseModel patientAppointmentHistoryResponseModel, + Function(bool)? onSuccess, + Function(String)? onError, + }) async { + try { + CalenderUtilsNew calender = CalenderUtilsNew.instance; + + bool isEventRemoved = await calender.checkAndRemove( + id: "${patientAppointmentHistoryResponseModel.appointmentNo}", + ); + + // Update the reminder status (inverted because we're removing) + setAppointmentReminder(!isEventRemoved, patientAppointmentHistoryResponseModel); + + if (onSuccess != null) { + onSuccess(isEventRemoved); + } + } catch (e) { + if (onError != null) { + onError(e.toString()); + } + } + } + + /// Toggle reminder for an appointment + /// Creates or deletes reminder based on the current state + Future toggleReminder({ + required BuildContext context, + required bool shouldCreateReminder, + required PatientAppointmentHistoryResponseModel patientAppointmentHistoryResponseModel, + Function(bool)? onSuccess, + Function(String)? onError, + }) async { + if (shouldCreateReminder) { + await createReminder( + context: context, + patientAppointmentHistoryResponseModel: patientAppointmentHistoryResponseModel, + onSuccess: onSuccess, + onError: onError, + ); + } else { + await deleteReminder( + patientAppointmentHistoryResponseModel: patientAppointmentHistoryResponseModel, + onSuccess: onSuccess, + onError: onError, + ); + } + } } diff --git a/lib/features/weather/models/waether_cities_model.dart b/lib/features/weather/models/waether_cities_model.dart new file mode 100644 index 00000000..6a434bff --- /dev/null +++ b/lib/features/weather/models/waether_cities_model.dart @@ -0,0 +1,257 @@ +import 'dart:convert'; + +class GetCityInfoList { + CategoriesNames? categoriesNames; + String? category; + String? categoryValue; + int? cityId; + String? cityName; + String? cityNameN; + ColorName? colorName; + String? createdOn; + String? id; + int? iniceId; + bool? isOrderEmpty; + bool? isValuesReversed; + bool? language; + double? latitude; + double? longitude; + String? name; + int? orderNum; + double? temperature; + String? value; + + GetCityInfoList({ + this.categoriesNames, + this.category, + this.categoryValue, + this.cityId, + this.cityName, + this.cityNameN, + this.colorName, + this.createdOn, + this.id, + this.iniceId, + this.isOrderEmpty, + this.isValuesReversed, + this.language, + this.latitude, + this.longitude, + this.name, + this.orderNum, + this.temperature, + this.value, + }); + + factory GetCityInfoList.fromRawJson(String str) => GetCityInfoList.fromJson(json.decode(str)); + + String toRawJson() => json.encode(toJson()); + + factory GetCityInfoList.fromJson(Map json) { + ColorName? parseColorName(dynamic value) { + if (value == null) return null; + try { + return colorNameValues.map[value.toString()]; + } catch (e) { + print("Unknown color name: $value"); + return null; + } + } + + CategoriesNames? parseCategoriesNames(dynamic value) { + if (value == null) return null; + try { + return CategoriesNames.fromJson(value as Map); + } catch (e) { + print("Error parsing CategoriesNames: $e"); + return null; + } + } + + return GetCityInfoList( + categoriesNames: parseCategoriesNames(json["CategoriesNames"]), + category: json["Category"], + categoryValue: json["CategoryValue"], + cityId: json["CityID"], + cityName: json["CityName"], + cityNameN: json["CityNameN"], + colorName: parseColorName(json["ColorName"]), + createdOn: json["CreatedOn"], + id: json["ID"], + iniceId: json["IniceID"], + isOrderEmpty: json["IsOrderEmpty"], + isValuesReversed: json["IsValuesReversed"], + language: json["Language"], + latitude: json["Latitude"]?.toDouble(), + longitude: json["Longitude"]?.toDouble(), + name: json["Name"], + orderNum: json["OrderNum"], + temperature: json["Temperature"]?.toDouble(), + value: json["Value"], + ); + } + + Map toJson() => { + "CategoriesNames": categoriesNames?.toJson(), + "Category": category, + "CategoryValue": categoryValue, + "CityID": cityId, + "CityName": cityName, + "CityNameN": cityNameN, + "ColorName": colorNameValues.reverse[colorName], + "CreatedOn": createdOn, + "ID": id, + "IniceID": iniceId, + "IsOrderEmpty": isOrderEmpty, + "IsValuesReversed": isValuesReversed, + "Language": language, + "Latitude": latitude, + "Longitude": longitude, + "Name": name, + "OrderNum": orderNum, + "Temperature": temperature, + "Value": value, + }; +} + +class CategoriesNames { + Category1? category1; + Category2? category2; + Category3? category3; + Category4? category4; + Category5? category5; + + CategoriesNames({ + this.category1, + this.category2, + this.category3, + this.category4, + this.category5, + }); + + factory CategoriesNames.fromRawJson(String str) => CategoriesNames.fromJson(json.decode(str)); + + String toRawJson() => json.encode(toJson()); + + factory CategoriesNames.fromJson(Map json) { + T? parseEnum(dynamic value, EnumValues enumValues, String enumName) { + if (value == null) return null; + try { + return enumValues.map[value.toString()]; + } catch (e) { + print("Unknown $enumName value: $value"); + return null; + } + } + + return CategoriesNames( + category1: parseEnum(json["Category1"], category1Values, "Category1"), + category2: parseEnum(json["Category2"], category2Values, "Category2"), + category3: parseEnum(json["Category3"], category3Values, "Category3"), + category4: parseEnum(json["Category4"], category4Values, "Category4"), + category5: parseEnum(json["Category5"], category5Values, "Category5"), + ); + } + + Map toJson() => { + "Category1": category1Values.reverse[category1], + "Category2": category2Values.reverse[category2], + "Category3": category3Values.reverse[category3], + "Category4": category4Values.reverse[category4], + "Category5": category5Values.reverse[category5], + }; +} + +enum Category1 { + AT_EXTREME_RISK, + CATEGORY1_EXTREME, + EXTREME, + POOR +} + +final category1Values = EnumValues({ + "At Extreme Risk": Category1.AT_EXTREME_RISK, + "Extreme\u000d\n": Category1.CATEGORY1_EXTREME, + "Extreme": Category1.EXTREME, + "Poor": Category1.POOR +}); + +enum Category2 { + AT_HIGH_RISK, + CATEGORY2_VERY_HIGH, + FAIR, + VERY_HIGH +} + +final category2Values = EnumValues({ + "At High Risk": Category2.AT_HIGH_RISK, + "Very High\u000d\n": Category2.CATEGORY2_VERY_HIGH, + "Fair": Category2.FAIR, + "Very High": Category2.VERY_HIGH +}); + +enum Category3 { + AT_RISK, + CATEGORY3_HIGH, + GOOD, + HIGH +} + +final category3Values = EnumValues({ + "At Risk": Category3.AT_RISK, + "High\u000d\n": Category3.CATEGORY3_HIGH, + "Good": Category3.GOOD, + "High": Category3.HIGH +}); + +enum Category4 { + CATEGORY4_MODERATE, + MODERATE, + NEUTRAL, + VERY_GOOD +} + +final category4Values = EnumValues({ + "Moderate\u000d\n": Category4.CATEGORY4_MODERATE, + "Moderate": Category4.MODERATE, + "Neutral": Category4.NEUTRAL, + "Very Good": Category4.VERY_GOOD +}); + +enum Category5 { + BENEFICIAL, + CATEGORY5_LOW, + EXCELLENT, + LOW +} + +final category5Values = EnumValues({ + "Beneficial": Category5.BENEFICIAL, + "Low\u000d\n": Category5.CATEGORY5_LOW, + "Excellent": Category5.EXCELLENT, + "Low": Category5.LOW +}); + +enum ColorName { + GREEN, + ORANGE, + RED +} + +final colorNameValues = EnumValues({ + "green": ColorName.GREEN, + "orange": ColorName.ORANGE, + "red": ColorName.RED +}); + +class EnumValues { + Map map; + late Map reverseMap; + + EnumValues(this.map); + + Map get reverse { + reverseMap = map.map((k, v) => MapEntry(v, k)); + return reverseMap; + } +} diff --git a/lib/features/weather/weather_repo.dart b/lib/features/weather/weather_repo.dart new file mode 100644 index 00000000..26bf0a32 --- /dev/null +++ b/lib/features/weather/weather_repo.dart @@ -0,0 +1,72 @@ +import 'package:dartz/dartz.dart'; +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/core/location_util.dart'; +import 'package:hmg_patient_app_new/features/weather/models/waether_cities_model.dart'; +import 'package:hmg_patient_app_new/services/logger_service.dart'; + +abstract class WeatherRepo { + Future>>> getCityInfo(); +} + +class WeatherRepoImp implements WeatherRepo { + final ApiClient apiClient; + final LoggerService loggerService; + + WeatherRepoImp({required this.loggerService, required this.apiClient}); + + @override + Future>>> getCityInfo() async { + Map request = {}; + + try { + GenericApiModel>? apiResponse; + Failure? failure; + await apiClient.post( + WEATHER_INDICATOR, + body: request, + onFailure: (error, statusCode, {messageStatus, failureType}) { + failure = failureType; + }, + onSuccess: (response, statusCode, {messageStatus, errorMessage}) { + try { + loggerService.logInfo("Weather API Response: $response"); + final list = response['GetCityInfo_List']; + + if (list == null || list.isEmpty) { + loggerService.logInfo("Weather API returned empty or null list"); + // Return empty list if no city info + apiResponse = GenericApiModel>( + messageStatus: messageStatus, + statusCode: statusCode, + errorMessage: null, + data: [], + ); + return; + } + + loggerService.logInfo("Parsing ${list.length} city info items"); + final cityInfoList = list.map((item) => GetCityInfoList.fromJson(item as Map)).toList().cast(); + + apiResponse = GenericApiModel>( + messageStatus: messageStatus, + statusCode: statusCode, + errorMessage: null, + data: cityInfoList, + ); + } catch (e) { + loggerService.logError("Error parsing weather data: $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/weather/weather_view_model.dart b/lib/features/weather/weather_view_model.dart new file mode 100644 index 00000000..0e3a3285 --- /dev/null +++ b/lib/features/weather/weather_view_model.dart @@ -0,0 +1,55 @@ +import 'package:flutter/cupertino.dart'; +import 'package:hmg_patient_app_new/core/location_util.dart'; +import 'package:hmg_patient_app_new/features/weather/models/waether_cities_model.dart'; +import 'package:hmg_patient_app_new/features/weather/weather_repo.dart'; +import 'package:hmg_patient_app_new/services/error_handler_service.dart'; + +class WeatherMonitorViewModel extends ChangeNotifier { + WeatherRepo weatherRepo; + ErrorHandlerService errorHandlerService; + LocationUtils locationUtils; + + WeatherMonitorViewModel({required this.weatherRepo, required this.errorHandlerService, required this.locationUtils}); + + final List _cityInfoList = []; + bool isLoading = false; + + List get cityInfoList => _cityInfoList; + + Future fetchCityInfoList({Function(dynamic)? onSuccess, Function(String)? onError}) async { + isLoading = true; + _cityInfoList.clear(); + + locationUtils.getLocation( + isShowConfirmDialog: true, + onSuccess: (position) async { + final result = await weatherRepo.getCityInfo(); + result.fold( + (failure) async { + isLoading = false; + notifyListeners(); + await errorHandlerService.handleError(failure: failure); + if (onError != null) { + onError(failure.toString()); + } + }, + (apiResponse) { + isLoading = false; + if (apiResponse.messageStatus == 2) { + notifyListeners(); + if (onError != null) { + onError(apiResponse.errorMessage ?? "Unknown error"); + } + } else if (apiResponse.messageStatus == 1) { + final cities = apiResponse.data ?? []; + _cityInfoList.addAll(cities); + notifyListeners(); + if (onSuccess != null) { + onSuccess(apiResponse); + } + } + }, + ); + }); + } +} diff --git a/lib/main.dart b/lib/main.dart index e9b599c9..6f086c34 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -10,6 +10,7 @@ import 'package:flutter/services.dart'; import 'package:hmg_patient_app_new/core/app_state.dart'; import 'package:hmg_patient_app_new/core/dependencies.dart'; import 'package:hmg_patient_app_new/core/utils/utils.dart'; +import 'package:hmg_patient_app_new/features/weather/weather_view_model.dart'; import 'package:hmg_patient_app_new/theme/colors.dart'; import 'package:hmg_patient_app_new/features/ask_doctor/ask_doctor_view_model.dart'; import 'package:hmg_patient_app_new/features/authentication/authentication_view_model.dart'; @@ -242,6 +243,9 @@ void main() async { ), ChangeNotifierProvider( create: (_) => getIt.get(), + ) , + ChangeNotifierProvider( + create: (_) => getIt.get(), ) ], child: MyApp()), ), // Wrap your app diff --git a/lib/presentation/appointments/appointment_details_page.dart b/lib/presentation/appointments/appointment_details_page.dart index ef3b0c94..3db1bfdf 100644 --- a/lib/presentation/appointments/appointment_details_page.dart +++ b/lib/presentation/appointments/appointment_details_page.dart @@ -7,7 +7,6 @@ import 'package:hmg_patient_app_new/core/api_consts.dart'; import 'package:hmg_patient_app_new/core/app_assets.dart'; import 'package:hmg_patient_app_new/core/app_state.dart'; import 'package:hmg_patient_app_new/core/dependencies.dart'; -import 'package:hmg_patient_app_new/core/utils/calender_utils_new.dart'; import 'package:hmg_patient_app_new/core/utils/date_util.dart'; import 'package:hmg_patient_app_new/core/utils/penguin_method_channel.dart'; import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; @@ -196,11 +195,13 @@ class _AppointmentDetailsPageState extends State { }, onError: (err) { LoaderBottomSheet.hideLoader(); - showCommonBottomSheetWithoutHeight( - context, + showCommonBottomSheetWithoutHeight(context, child: Utils.getErrorWidget(loadingText: err.toString()), callBackFunc: () {}, - title: "", isCloseButtonVisible: true, isDismissible: false, isFullScreen: false); + title: "", + isCloseButtonVisible: true, + isDismissible: false, + isFullScreen: false); }); }), callBackFunc: () {}, @@ -359,22 +360,24 @@ class _AppointmentDetailsPageState extends State { ], ), SizedBox(height: 8.h), - bookAppointmentsViewModel.appointmentNearestGateResponseModel != null ? Wrap( - direction: Axis.horizontal, - spacing: 8.w, - runSpacing: 8.h, - children: [ - AppCustomChipWidget( - labelText: bookAppointmentsVM.isAppointmentNearestGateLoading - ? "Floor: Ground Floor" + bookAppointmentsViewModel.appointmentNearestGateResponseModel != null + ? Wrap( + direction: Axis.horizontal, + spacing: 8.w, + runSpacing: 8.h, + children: [ + AppCustomChipWidget( + labelText: bookAppointmentsVM.isAppointmentNearestGateLoading + ? "Floor: Ground Floor" : "${LocaleKeys.floor.tr(context: context)}: ${getIt.get().isArabic() ? bookAppointmentsViewModel.appointmentNearestGateResponseModel!.clinicLocationN : bookAppointmentsViewModel.appointmentNearestGateResponseModel!.clinicLocation}", ).toShimmer2(isShow: bookAppointmentsVM.isAppointmentNearestGateLoading), - AppCustomChipWidget( - labelText: + AppCustomChipWidget( + labelText: "${LocaleKeys.nearestGate.tr(context: context)}: ${getIt.get().isArabic() ? bookAppointmentsVM.appointmentNearestGateResponseModel!.nearestGateNumberN : bookAppointmentsVM.appointmentNearestGateResponseModel!.nearestGateNumber}") .toShimmer2(isShow: bookAppointmentsVM.isAppointmentNearestGateLoading), - ], - ) : SizedBox.shrink(), + ], + ) + : SizedBox.shrink(), ], ), ), @@ -405,53 +408,40 @@ class _AppointmentDetailsPageState extends State { // activeTrackColor: AppColors.successColor.withValues(alpha: .15), value: widget.patientAppointmentHistoryResponseModel.hasReminder!, onChanged: (newValue) async { - CalenderUtilsNew calender = CalenderUtilsNew.instance; - bool isEventAddedOrRemoved = false; - if(newValue == true){ - DateTime startDate = DateTime.now(); - DateTime endDate = DateUtil.convertStringToDate(widget - .patientAppointmentHistoryResponseModel.appointmentDate); - BottomSheetUtils().showReminderBottomSheet( - context, - endDate, - widget.patientAppointmentHistoryResponseModel.doctorNameObj??"", - "${widget.patientAppointmentHistoryResponseModel.appointmentNo}"??"", - "", - "", - title: "Appointment with ${widget.patientAppointmentHistoryResponseModel.doctorNameObj}", - description: - "${widget.patientAppointmentHistoryResponseModel.doctorNameObj} will be having an appointment on ${widget.patientAppointmentHistoryResponseModel.appointmentDate}", - onSuccess: () { - setState(() { - myAppointmentsViewModel.setAppointmentReminder(newValue, widget.patientAppointmentHistoryResponseModel); - }); - }, - isMultiAllowed: true, - onMultiDateSuccess: (int selectedIndex) async { - isEventAddedOrRemoved = await calender.createOrUpdateEvent( - title: - "Appointment Reminder with ${widget.patientAppointmentHistoryResponseModel.doctorNameObj} on ${DateUtil.convertStringToDate(widget.patientAppointmentHistoryResponseModel.appointmentDate)}, Appointment #${widget.patientAppointmentHistoryResponseModel.appointmentNo}", - description: - "Appointment Reminder with ${widget.patientAppointmentHistoryResponseModel.doctorNameObj} in ${widget.patientAppointmentHistoryResponseModel.projectName}", - scheduleDateTime: DateUtil.convertStringToDate(widget - .patientAppointmentHistoryResponseModel.appointmentDate), - eventId: "${widget.patientAppointmentHistoryResponseModel.appointmentNo}", - location: '', - reminderMinutes: selectedIndex - ); - setState(() { - myAppointmentsViewModel.setAppointmentReminder(isEventAddedOrRemoved, widget.patientAppointmentHistoryResponseModel); - }); - }, - ); - }else { - isEventAddedOrRemoved = await calender.checkAndRemove( id:"${widget.patientAppointmentHistoryResponseModel.appointmentNo}", ); - setState(() { - myAppointmentsViewModel.setAppointmentReminder(!isEventAddedOrRemoved, widget.patientAppointmentHistoryResponseModel); - }); - } - - + await myAppointmentsViewModel.toggleReminder( + context: context, + shouldCreateReminder: newValue, + patientAppointmentHistoryResponseModel: widget.patientAppointmentHistoryResponseModel, + onSuccess: (result) { + showCommonBottomSheet( + context, + child: Utils.getSuccessWidget( + loadingText: newValue ? LocaleKeys.reminderSuccess.tr(context: context) : LocaleKeys.reminderCancelSuccess.tr(context: context), + ), + callBackFunc: (str) {}, + title: "", + isCloseButtonVisible: false, + isDismissible: true, + isFullScreen: false, + isAutoDismiss: true, + height: ResponsiveExtension.screenHeight * 0.3, + ); + }, + onError: (error) { + setState(() { + // Revert the switch if there was an error + widget.patientAppointmentHistoryResponseModel.hasReminder = !newValue; + }); + showCommonBottomSheetWithoutHeight( + context, + title: LocaleKeys.notice.tr(context: context), + child: Utils.getErrorWidget(loadingText: error), + callBackFunc: () {}, + isFullScreen: false, + isCloseButtonVisible: true, + ); + }, + ); }, ), ], @@ -471,106 +461,116 @@ class _AppointmentDetailsPageState extends State { ), physics: NeverScrollableScrollPhysics(), padding: EdgeInsets.zero, - shrinkWrap: true, - children: [ - MedicalFileCard( - label: LocaleKeys.labResults.tr(context: context), - textColor: AppColors.blackColor, - backgroundColor: AppColors.whiteColor, - svgIcon: AppAssets.lab_result_icon, - isLargeText: true, - iconSize: 36.w, - ).onPress(() async { - LoaderBottomSheet.showLoader(loadingText: LocaleKeys.fetchingLabResults.tr(context: context)); - await labViewModel.getLabResultsByAppointmentNo( - appointmentNo: widget.patientAppointmentHistoryResponseModel.appointmentNo, - projectID: widget.patientAppointmentHistoryResponseModel.projectID, - clinicID: widget.patientAppointmentHistoryResponseModel.clinicID, - doctorID: widget.patientAppointmentHistoryResponseModel.doctorID, - doctorName: widget.patientAppointmentHistoryResponseModel.doctorNameObj!, - clinicName: widget.patientAppointmentHistoryResponseModel.clinicName!, - projectName: widget.patientAppointmentHistoryResponseModel.projectName!, - appointmentDate: widget.patientAppointmentHistoryResponseModel.appointmentDate!, - onSuccess: (val) { - LoaderBottomSheet.hideLoader(); - }, - onError: (err) { - LoaderBottomSheet.hideLoader(); - showCommonBottomSheetWithoutHeight( - context, - child: Utils.getErrorWidget(loadingText: err), - callBackFunc: () {}, - isFullScreen: false, - isCloseButtonVisible: true, - ); - }, - ); - }), - MedicalFileCard( - label: "${LocaleKeys.radiology.tr(context: context)} ${LocaleKeys.radiologySubtitle.tr(context: context)}", - textColor: AppColors.blackColor, - backgroundColor: AppColors.whiteColor, - svgIcon: AppAssets.radiology_icon, - isLargeText: true, - iconSize: 36.w, - ).onPress(() async { - LoaderBottomSheet.showLoader(loadingText: LocaleKeys.fetchingRadiologyResults.tr(context: context)); - await radiologyViewModel.getPatientRadiologyOrdersByAppointment( - appointmentNo: widget.patientAppointmentHistoryResponseModel.appointmentNo, - projectID: widget.patientAppointmentHistoryResponseModel.projectID, - onSuccess: (val) { - LoaderBottomSheet.hideLoader(); - }, - onError: (err) { - LoaderBottomSheet.hideLoader(); - showCommonBottomSheetWithoutHeight( - context, - child: Utils.getErrorWidget(loadingText: err), - callBackFunc: () {}, - isFullScreen: false, - isCloseButtonVisible: true, - ); - }, - ); - }), - MedicalFileCard( - label: LocaleKeys.prescriptions.tr(context: context), - textColor: AppColors.blackColor, - backgroundColor: AppColors.whiteColor, - svgIcon: AppAssets.prescription_item_icon, - isLargeText: true, - iconSize: 36.w, - ).onPress(() async { - LoaderBottomSheet.showLoader(loadingText: LocaleKeys.fetchingAppointmentPrescriptions.tr(context: context)); - await prescriptionsViewModel.getPrescriptionDetails( - getPrescriptionRequestModel(), - onSuccess: (val) { - LoaderBottomSheet.hideLoader(); - if (val.data.isNotEmpty) { - PatientPrescriptionsResponseModel patientPrescriptionsResponseModel = PatientPrescriptionsResponseModel( - doctorImageURL: widget.patientAppointmentHistoryResponseModel.doctorImageURL, - doctorName: widget.patientAppointmentHistoryResponseModel.doctorNameObj, - appointmentDate: widget.patientAppointmentHistoryResponseModel.appointmentDate, - clinicDescription: widget.patientAppointmentHistoryResponseModel.clinicName, - decimalDoctorRate: widget.patientAppointmentHistoryResponseModel.decimalDoctorRate, - name: widget.patientAppointmentHistoryResponseModel.projectName, - isHomeMedicineDeliverySupported: val.data.first.isHomeMedicineDeliverySupported ?? false, - projectID: widget.patientAppointmentHistoryResponseModel.projectID, - clinicID: widget.patientAppointmentHistoryResponseModel.clinicID, - doctorID: widget.patientAppointmentHistoryResponseModel.doctorID, - setupID: widget.patientAppointmentHistoryResponseModel.setupID, - isInOutPatient: widget.patientAppointmentHistoryResponseModel.isInOutPatient, - appointmentNo: widget.patientAppointmentHistoryResponseModel.appointmentNo, - episodeID: widget.patientAppointmentHistoryResponseModel.episodeID, - dischargeNo: 0, + shrinkWrap: true, + children: [ + MedicalFileCard( + label: LocaleKeys.labResults.tr(context: context), + textColor: AppColors.blackColor, + backgroundColor: AppColors.whiteColor, + svgIcon: AppAssets.lab_result_icon, + isLargeText: true, + iconSize: 36.w, + ).onPress(() async { + LoaderBottomSheet.showLoader(loadingText: LocaleKeys.fetchingLabResults.tr(context: context)); + await labViewModel.getLabResultsByAppointmentNo( + appointmentNo: widget.patientAppointmentHistoryResponseModel.appointmentNo, + projectID: widget.patientAppointmentHistoryResponseModel.projectID, + clinicID: widget.patientAppointmentHistoryResponseModel.clinicID, + doctorID: widget.patientAppointmentHistoryResponseModel.doctorID, + doctorName: widget.patientAppointmentHistoryResponseModel.doctorNameObj!, + clinicName: widget.patientAppointmentHistoryResponseModel.clinicName!, + projectName: widget.patientAppointmentHistoryResponseModel.projectName!, + appointmentDate: widget.patientAppointmentHistoryResponseModel.appointmentDate!, + onSuccess: (val) { + LoaderBottomSheet.hideLoader(); + }, + onError: (err) { + LoaderBottomSheet.hideLoader(); + showCommonBottomSheetWithoutHeight( + context, + child: Utils.getErrorWidget(loadingText: err), + callBackFunc: () {}, + isFullScreen: false, + isCloseButtonVisible: true, ); - Navigator.of(context).push( - CustomPageRoute( - page: PrescriptionDetailPage( - isFromAppointments: true, prescriptionsResponseModel: patientPrescriptionsResponseModel), - ), + }, + ); + }), + MedicalFileCard( + label: "${LocaleKeys.radiology.tr(context: context)} ${LocaleKeys.radiologySubtitle.tr(context: context)}", + textColor: AppColors.blackColor, + backgroundColor: AppColors.whiteColor, + svgIcon: AppAssets.radiology_icon, + isLargeText: true, + iconSize: 36.w, + ).onPress(() async { + LoaderBottomSheet.showLoader(loadingText: LocaleKeys.fetchingRadiologyResults.tr(context: context)); + await radiologyViewModel.getPatientRadiologyOrdersByAppointment( + appointmentNo: widget.patientAppointmentHistoryResponseModel.appointmentNo, + projectID: widget.patientAppointmentHistoryResponseModel.projectID, + onSuccess: (val) { + LoaderBottomSheet.hideLoader(); + }, + onError: (err) { + LoaderBottomSheet.hideLoader(); + showCommonBottomSheetWithoutHeight( + context, + child: Utils.getErrorWidget(loadingText: err), + callBackFunc: () {}, + isFullScreen: false, + isCloseButtonVisible: true, ); - } else { + }, + ); + }), + MedicalFileCard( + label: LocaleKeys.prescriptions.tr(context: context), + textColor: AppColors.blackColor, + backgroundColor: AppColors.whiteColor, + svgIcon: AppAssets.prescription_item_icon, + isLargeText: true, + iconSize: 36.w, + ).onPress(() async { + LoaderBottomSheet.showLoader(loadingText: LocaleKeys.fetchingAppointmentPrescriptions.tr(context: context)); + await prescriptionsViewModel.getPrescriptionDetails( + getPrescriptionRequestModel(), + onSuccess: (val) { + LoaderBottomSheet.hideLoader(); + if (val.data.isNotEmpty) { + PatientPrescriptionsResponseModel patientPrescriptionsResponseModel = PatientPrescriptionsResponseModel( + doctorImageURL: widget.patientAppointmentHistoryResponseModel.doctorImageURL, + doctorName: widget.patientAppointmentHistoryResponseModel.doctorNameObj, + appointmentDate: widget.patientAppointmentHistoryResponseModel.appointmentDate, + clinicDescription: widget.patientAppointmentHistoryResponseModel.clinicName, + decimalDoctorRate: widget.patientAppointmentHistoryResponseModel.decimalDoctorRate, + name: widget.patientAppointmentHistoryResponseModel.projectName, + isHomeMedicineDeliverySupported: val.data.first.isHomeMedicineDeliverySupported ?? false, + projectID: widget.patientAppointmentHistoryResponseModel.projectID, + clinicID: widget.patientAppointmentHistoryResponseModel.clinicID, + doctorID: widget.patientAppointmentHistoryResponseModel.doctorID, + setupID: widget.patientAppointmentHistoryResponseModel.setupID, + isInOutPatient: widget.patientAppointmentHistoryResponseModel.isInOutPatient, + appointmentNo: widget.patientAppointmentHistoryResponseModel.appointmentNo, + episodeID: widget.patientAppointmentHistoryResponseModel.episodeID, + dischargeNo: 0, + ); + Navigator.of(context).push( + CustomPageRoute( + page: PrescriptionDetailPage(isFromAppointments: true, prescriptionsResponseModel: patientPrescriptionsResponseModel), + ), + ); + } else { + showCommonBottomSheetWithoutHeight( + context, + child: Utils.getErrorWidget(loadingText: LocaleKeys.noPrescriptionsForAppointment.tr(context: context)), + callBackFunc: () {}, + isFullScreen: false, + isCloseButtonVisible: true, + ); + } + }, + onError: (err) { + LoaderBottomSheet.hideLoader(); showCommonBottomSheetWithoutHeight( context, child: Utils.getErrorWidget(loadingText: LocaleKeys.noPrescriptionsForAppointment.tr(context: context)), @@ -578,40 +578,29 @@ class _AppointmentDetailsPageState extends State { isFullScreen: false, isCloseButtonVisible: true, ); - } - }, - onError: (err) { - LoaderBottomSheet.hideLoader(); - showCommonBottomSheetWithoutHeight( - context, - child: Utils.getErrorWidget(loadingText: LocaleKeys.noPrescriptionsForAppointment.tr(context: context)), - callBackFunc: () {}, - isFullScreen: false, - isCloseButtonVisible: true, - ); - }, - ); - // Navigator.of(context).push( - // CustomPageRoute( - // page: VaccineListPage(), - // ), - // ); - }), - MedicalFileCard( - label: LocaleKeys.doctorResponses.tr(context: context), - textColor: AppColors.blackColor, - backgroundColor: AppColors.whiteColor, - svgIcon: AppAssets.ask_doctor_medical_file_icon, - isLargeText: true, - iconSize: 36.w, - ).onPress(() { - getIt.get().initAskDoctorViewModel(); - getIt.get().getDoctorResponses(); - Navigator.of(context).push( - CustomPageRoute( - page: DoctorResponsePage(), - ), - ); + }, + ); + // Navigator.of(context).push( + // CustomPageRoute( + // page: VaccineListPage(), + // ), + // ); + }), + MedicalFileCard( + label: LocaleKeys.doctorResponses.tr(context: context), + textColor: AppColors.blackColor, + backgroundColor: AppColors.whiteColor, + svgIcon: AppAssets.ask_doctor_medical_file_icon, + isLargeText: true, + iconSize: 36.w, + ).onPress(() { + getIt.get().initAskDoctorViewModel(); + getIt.get().getDoctorResponses(); + Navigator.of(context).push( + CustomPageRoute( + page: DoctorResponsePage(), + ), + ); }), myAppointmentsVM.isAppointmentRatedResponseLoading ? MedicalFileCard( @@ -882,8 +871,7 @@ class _AppointmentDetailsPageState extends State { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - if (widget.patientAppointmentHistoryResponseModel.nextAction == 15 || - widget.patientAppointmentHistoryResponseModel.nextAction == 20) + if (widget.patientAppointmentHistoryResponseModel.nextAction == 15 || widget.patientAppointmentHistoryResponseModel.nextAction == 20) Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ @@ -891,10 +879,7 @@ class _AppointmentDetailsPageState extends State { mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ LocaleKeys.amountBeforeTax.tr(context: context).toText18(isBold: true), - Utils.getPaymentAmountWithSymbol( - widget.patientAppointmentHistoryResponseModel.patientShare!.toString().toText16(isBold: true), - AppColors.blackColor, - 13, + Utils.getPaymentAmountWithSymbol(widget.patientAppointmentHistoryResponseModel.patientShare!.toString().toText16(isBold: true), AppColors.blackColor, 13, isSaudiCurrency: true), ], ), @@ -902,9 +887,7 @@ class _AppointmentDetailsPageState extends State { Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Expanded( - child: LocaleKeys.upcomingPaymentNow - .tr(context: context).toText12(isBold: true, color: AppColors.greyTextColor)), + Expanded(child: LocaleKeys.upcomingPaymentNow.tr(context: context).toText12(isBold: true, color: AppColors.greyTextColor)), "VAT 15%(${widget.patientAppointmentHistoryResponseModel.patientTaxAmount})".toText14(isBold: true, color: AppColors.greyTextColor, letterSpacing: -0.64), ], ), @@ -919,10 +902,7 @@ class _AppointmentDetailsPageState extends State { Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Utils.getPaymentAmountWithSymbol( - widget.patientAppointmentHistoryResponseModel.patientShareWithTax!.toString().toText24(isBold: true), - AppColors.blackColor, - 17, + Utils.getPaymentAmountWithSymbol(widget.patientAppointmentHistoryResponseModel.patientShareWithTax!.toString().toText24(isBold: true), AppColors.blackColor, 17, isSaudiCurrency: true), ], ), @@ -945,11 +925,11 @@ class _AppointmentDetailsPageState extends State { borderColor: AppColors.primaryRedColor, textColor: Colors.white, fontSize: 16.f, - fontWeight: FontWeight.w600, + fontWeight: FontWeight.w600, borderRadius: 12.r, - padding: EdgeInsets.symmetric(horizontal: 10.w), - height: 50.h, - icon: AppAssets.add_icon, + padding: EdgeInsets.symmetric(horizontal: 10.w), + height: 50.h, + icon: AppAssets.add_icon, iconColor: Colors.white, iconSize: 18.h, ).paddingSymmetrical(16.h, 24.h) @@ -959,8 +939,7 @@ class _AppointmentDetailsPageState extends State { handleAppointmentNextAction(widget.patientAppointmentHistoryResponseModel.nextAction); }, backgroundColor: AppointmentType.getNextActionButtonColor(widget.patientAppointmentHistoryResponseModel.nextAction), - borderColor: - AppointmentType.getNextActionButtonColor(widget.patientAppointmentHistoryResponseModel.nextAction).withOpacity(0.01), + borderColor: AppointmentType.getNextActionButtonColor(widget.patientAppointmentHistoryResponseModel.nextAction).withOpacity(0.01), textColor: widget.patientAppointmentHistoryResponseModel.nextAction == 15 ? AppColors.textColor : Colors.white, fontSize: 16.f, fontWeight: FontWeight.w600, @@ -1121,8 +1100,7 @@ class _AppointmentDetailsPageState extends State { myAppointmentsViewModel.initAppointmentsViewModel(); myAppointmentsViewModel.getPatientAppointments(true, false); Navigator.of(context).pop(); - }, title: "", height: ResponsiveExtension.screenHeight * 0.3, isAutoDismiss: true, isCloseButtonVisible: true, isDismissible: false, isFullScreen: false, - isSuccessDialog: true); + }, title: "", height: ResponsiveExtension.screenHeight * 0.3, isAutoDismiss: true, isCloseButtonVisible: true, isDismissible: false, isFullScreen: false, isSuccessDialog: true); }); // LoaderBottomSheet.hideLoader(); case 15: diff --git a/lib/presentation/book_appointment/review_appointment_page.dart b/lib/presentation/book_appointment/review_appointment_page.dart index 689e6cf3..6a1838f9 100644 --- a/lib/presentation/book_appointment/review_appointment_page.dart +++ b/lib/presentation/book_appointment/review_appointment_page.dart @@ -90,12 +90,14 @@ class _ReviewAppointmentPageState extends State { .toString() .toText16(isBold: true, maxlines: 1), SizedBox(width: 12.w), - (bookAppointmentsViewModel.selectedDoctor.nationalityFlagURL != null && bookAppointmentsViewModel.selectedDoctor.nationalityFlagURL!.isNotEmpty )? Image.network( - bookAppointmentsViewModel.selectedDoctor.nationalityFlagURL ?? "https://hmgwebservices.com/Images/flag/SAU.png", - width: 20.h, - height: 15.h, - fit: BoxFit.cover, - ) : SizedBox.shrink(), + (bookAppointmentsViewModel.selectedDoctor.nationalityFlagURL != null && bookAppointmentsViewModel.selectedDoctor.nationalityFlagURL!.isNotEmpty) + ? Image.network( + bookAppointmentsViewModel.selectedDoctor.nationalityFlagURL ?? "https://hmgwebservices.com/Images/flag/SAU.png", + width: 20.h, + height: 15.h, + fit: BoxFit.cover, + ) + : SizedBox.shrink(), ], ), SizedBox(height: 2.h), @@ -162,7 +164,9 @@ class _ReviewAppointmentPageState extends State { runSpacing: 4.h, children: [ AppCustomChipWidget(labelText: "${appState.getAuthenticatedUser()!.age} ${LocaleKeys.yearsOld.tr(context: context)}"), - AppCustomChipWidget(labelText: "${LocaleKeys.gender.tr(context: context)}: ${appState.getAuthenticatedUser()?.gender == 1 ? LocaleKeys.malE.tr(context: context) : LocaleKeys.femaleGender.tr(context: context)}"), + AppCustomChipWidget( + labelText: + "${LocaleKeys.gender.tr(context: context)}: ${appState.getAuthenticatedUser()?.gender == 1 ? LocaleKeys.malE.tr(context: context) : LocaleKeys.femaleGender.tr(context: context)}"), ], ), ], @@ -191,19 +195,19 @@ class _ReviewAppointmentPageState extends State { bookAppointmentsViewModel.appointmentNearestGateResponseModel != null ? Wrap( direction: Axis.horizontal, - spacing: 8.w, - runSpacing: 8.h, - children: [ - AppCustomChipWidget( - labelText: bookAppointmentsVM.isAppointmentNearestGateLoading - ? "Floor: Ground Floor" + spacing: 8.w, + runSpacing: 8.h, + children: [ + AppCustomChipWidget( + labelText: bookAppointmentsVM.isAppointmentNearestGateLoading + ? "Floor: Ground Floor" : "${LocaleKeys.floor.tr(context: context)} ${getIt.get().isArabic() ? bookAppointmentsViewModel.appointmentNearestGateResponseModel!.clinicLocationN : bookAppointmentsViewModel.appointmentNearestGateResponseModel!.clinicLocation}", ).toShimmer2(isShow: bookAppointmentsVM.isAppointmentNearestGateLoading), - AppCustomChipWidget( - labelText: + AppCustomChipWidget( + labelText: "${LocaleKeys.nearestGate.tr(context: context)} ${getIt.get().isArabic() ? bookAppointmentsVM.appointmentNearestGateResponseModel!.nearestGateNumberN : bookAppointmentsVM.appointmentNearestGateResponseModel!.nearestGateNumber}") .toShimmer2(isShow: bookAppointmentsVM.isAppointmentNearestGateLoading), - ], + ], ) : SizedBox.shrink(), ], @@ -329,23 +333,16 @@ class _ReviewAppointmentPageState extends State { LoaderBottomSheet.hideLoader(); await Future.delayed(Duration(milliseconds: 50)).then((value) async { // LoaderBottomSheet.showLoader(loadingText: LocaleKeys.appointmentSuccess.tr()); - showCommonBottomSheetWithoutHeight( - context, - child: Utils.getSuccessWidget(loadingText: LocaleKeys.appointmentSuccess.tr()), - callBackFunc: () { - bookAppointmentsViewModel.setIsPatientRescheduleAppointment(false); - bookAppointmentsViewModel.setIsLiveCareSchedule(false); - Navigator.pushAndRemoveUntil( - context, - CustomPageRoute( - page: LandingNavigation(), - ), - (r) => false); - }, - isFullScreen: false, - isCloseButtonVisible: false, - isAutoDismiss: true - ); + showCommonBottomSheetWithoutHeight(context, child: Utils.getSuccessWidget(loadingText: LocaleKeys.appointmentSuccess.tr()), callBackFunc: () { + bookAppointmentsViewModel.setIsPatientRescheduleAppointment(false); + bookAppointmentsViewModel.setIsLiveCareSchedule(false); + Navigator.pushAndRemoveUntil( + context, + CustomPageRoute( + page: LandingNavigation(), + ), + (r) => false); + }, isFullScreen: false, isCloseButtonVisible: false, isAutoDismiss: true); }); }); } else { @@ -368,23 +365,48 @@ class _ReviewAppointmentPageState extends State { }, onSuccess: (apiResp) async { LoaderBottomSheet.hideLoader(); await Future.delayed(Duration(milliseconds: 50)).then((value) async { - showCommonBottomSheetWithoutHeight( - context, - child: Utils.getSuccessWidget(loadingText: LocaleKeys.appointmentSuccess.tr()).paddingSymmetrical(0.h, 24.h), - callBackFunc: () { - bookAppointmentsViewModel.setIsLiveCareSchedule(false); - bookAppointmentsViewModel.setIsPatientRescheduleAppointment(false); - Navigator.pushAndRemoveUntil( - context, - CustomPageRoute( - page: LandingNavigation(), - ), - (r) => false); + showCommonBottomSheetWithoutHeight(context, child: Utils.getSuccessWidget(loadingText: LocaleKeys.appointmentSuccess.tr()).paddingSymmetrical(0.h, 24.h), callBackFunc: () async { + bookAppointmentsViewModel.setIsLiveCareSchedule(false); + bookAppointmentsViewModel.setIsPatientRescheduleAppointment(false); + bool newValue = true; + await myAppointmentsViewModel.toggleReminder( + context: context, + shouldCreateReminder: newValue, + patientAppointmentHistoryResponseModel: apiResp.patientAppointmentHistoryResponseModel, + onSuccess: (result) { + showCommonBottomSheet( + context, + child: Utils.getSuccessWidget( + loadingText: newValue ? LocaleKeys.reminderSuccess.tr(context: context) : LocaleKeys.reminderCancelSuccess.tr(context: context), + ), + callBackFunc: (str) { + Navigator.pushAndRemoveUntil(context, CustomPageRoute(page: LandingNavigation()), (r) => false); + }, + title: "", + isCloseButtonVisible: false, + isDismissible: true, + isFullScreen: false, + isAutoDismiss: true, + height: ResponsiveExtension.screenHeight * 0.3, + ); + }, + onError: (error) { + setState(() { + apiResp.patientAppointmentHistoryResponseModel.hasReminder = !newValue; + }); + showCommonBottomSheetWithoutHeight( + context, + title: LocaleKeys.notice.tr(context: context), + child: Utils.getErrorWidget(loadingText: error), + callBackFunc: () { + Navigator.pushAndRemoveUntil(context, CustomPageRoute(page: LandingNavigation()), (r) => false); + }, + isFullScreen: false, + isCloseButtonVisible: true, + ); }, - isFullScreen: false, - isCloseButtonVisible: false, - isAutoDismiss: true - ); + ); + }, isFullScreen: false, isCloseButtonVisible: false, isAutoDismiss: true); }); }); } diff --git a/lib/presentation/hmg_services/services_page.dart b/lib/presentation/hmg_services/services_page.dart index 770a5cbe..c92d47e5 100644 --- a/lib/presentation/hmg_services/services_page.dart +++ b/lib/presentation/hmg_services/services_page.dart @@ -6,6 +6,7 @@ import 'package:hmg_patient_app_new/core/app_assets.dart'; import 'package:hmg_patient_app_new/core/app_export.dart'; import 'package:hmg_patient_app_new/core/app_state.dart'; import 'package:hmg_patient_app_new/core/enums.dart'; +import 'package:hmg_patient_app_new/core/location_util.dart'; import 'package:hmg_patient_app_new/core/utils/utils.dart'; import 'package:hmg_patient_app_new/extensions/route_extensions.dart'; import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; @@ -19,6 +20,7 @@ import 'package:hmg_patient_app_new/features/hmg_services/models/ui_models/hmg_s import 'package:hmg_patient_app_new/features/hospital/hospital_selection_view_model.dart'; import 'package:hmg_patient_app_new/features/medical_file/medical_file_view_model.dart'; import 'package:hmg_patient_app_new/features/water_monitor/water_monitor_view_model.dart'; +import 'package:hmg_patient_app_new/features/weather/weather_view_model.dart'; import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; import 'package:hmg_patient_app_new/presentation/blood_donation/blood_donation_page.dart'; import 'package:hmg_patient_app_new/presentation/book_appointment/book_appointment_page.dart'; @@ -47,47 +49,46 @@ import '../../core/dependencies.dart' show getIt; import '../../features/qr_parking/qr_parking_view_model.dart'; import '../emergency_services/call_ambulance/widgets/HospitalBottomSheetBody.dart'; -class ServicesPage extends StatelessWidget { +class ServicesPage extends StatefulWidget { bool showBackIcon; ServicesPage({super.key, this.showBackIcon = true}); + @override + State createState() => _ServicesPageState(); +} + +class _ServicesPageState extends State { late BloodDonationViewModel bloodDonationViewModel; + late MedicalFileViewModel medicalFileViewModel; + late WeatherMonitorViewModel weatherVM; + late final List hmgServices = [ HmgServicesComponentModel(11, LocaleKeys.emergencyServices.tr(), "", AppAssets.emergency_services_icon, bgColor: AppColors.primaryRedColor, true, route: null, onTap: () async { // if (getIt.get().isAuthenticated) { - // getIt.get().flushData(); - // getIt.get().getTransportationOrders( - // showLoader: false, - // ); - // getIt.get().getRRTOrders( - // showLoader: false, - // ); - Navigator.of(getIt.get().navigatorKey.currentContext!).push( - CustomPageRoute( - page: EmergencyServicesPage(), - settings: const RouteSettings(name: '/EmergencyServicesPage'), - ), - ); + // getIt.get().flushData(); + // getIt.get().getTransportationOrders( + // showLoader: false, + // ); + // getIt.get().getRRTOrders( + // showLoader: false, + // ); + Navigator.of(getIt.get().navigatorKey.currentContext!).push( + CustomPageRoute( + page: EmergencyServicesPage(), + settings: const RouteSettings(name: '/EmergencyServicesPage'), + ), + ); // } else { // await getIt.get().onLoginPressed(); // } }), - HmgServicesComponentModel( - 11, - LocaleKeys.bookAppointment.tr(), - "", - AppAssets.appointment_calendar_icon, - bgColor: AppColors.bookAppointment, - true, - route: null, - onTap: () { - getIt.get().onTabChanged(0); - Navigator.of(getIt().navigatorKey.currentContext!).push(CustomPageRoute(page: BookAppointmentPage())); - } - ), + HmgServicesComponentModel(11, LocaleKeys.bookAppointment.tr(), "", AppAssets.appointment_calendar_icon, bgColor: AppColors.bookAppointment, true, route: null, onTap: () { + getIt.get().onTabChanged(0); + Navigator.of(getIt().navigatorKey.currentContext!).push(CustomPageRoute(page: BookAppointmentPage())); + }), HmgServicesComponentModel(5, LocaleKeys.completeCheckup.tr(), "", AppAssets.comprehensiveCheckup, bgColor: AppColors.bgGreenColor, true, route: null, onTap: () async { if (getIt.get().isAuthenticated) { getIt.get().pushPageRoute(AppRoutes.comprehensiveCheckupPage); @@ -164,33 +165,31 @@ class ServicesPage extends StatelessWidget { } }), HmgServicesComponentModel( - 3, - LocaleKeys.bloodDonation.tr(context: getIt.get().navigatorKey.currentContext!), - "".needTranslation, - AppAssets.blood_donation_icon, - bgColor: AppColors.bloodDonationCardColor, - true, - route: null, - onTap: () { - if (getIt.get().isAuthenticated) { - Navigator.of(getIt().navigatorKey.currentContext!).push( - CustomPageRoute( - page: BloodDonationPage(), - ), - ); - } else { - Navigator.of(getIt().navigatorKey.currentContext!).push( - CustomPageRoute( - page: ServiceInfoPage( - serviceName: LocaleKeys.bloodDonation.tr(), - serviceHeader: LocaleKeys.bloodDonationServiceHeader.tr(), - serviceDescription: LocaleKeys.bloodDonationServiceDescription.tr(), - serviceImage: AppAssets.bloodDonationService), - ), - ); - } + 3, + LocaleKeys.bloodDonation.tr(context: getIt.get().navigatorKey.currentContext!), + "".needTranslation, + AppAssets.blood_donation_icon, + bgColor: AppColors.bloodDonationCardColor, + true, + route: null, onTap: () { + if (getIt.get().isAuthenticated) { + Navigator.of(getIt().navigatorKey.currentContext!).push( + CustomPageRoute( + page: BloodDonationPage(), + ), + ); + } else { + Navigator.of(getIt().navigatorKey.currentContext!).push( + CustomPageRoute( + page: ServiceInfoPage( + serviceName: LocaleKeys.bloodDonation.tr(), + serviceHeader: LocaleKeys.bloodDonationServiceHeader.tr(), + serviceDescription: LocaleKeys.bloodDonationServiceDescription.tr(), + serviceImage: AppAssets.bloodDonationService), + ), + ); } - ), + }), HmgServicesComponentModel( 113, LocaleKeys.servicePriceList.tr(context: getIt.get().navigatorKey.currentContext!), @@ -375,21 +374,100 @@ class ServicesPage extends StatelessWidget { ), ]; + @override + void initState() { + // TODO: implement initState + super.initState(); + weatherVM = getIt(); + weatherVM.fetchCityInfoList(); + } + + + @override Widget build(BuildContext context) { bloodDonationViewModel = Provider.of(context); medicalFileViewModel = Provider.of(context); - hmgServices.removeWhere((element) => Utils.havePrivilege(element.action) == false); return Scaffold( backgroundColor: AppColors.bgScaffoldColor, body: CollapsingListView( title: LocaleKeys.exploreServices.tr(), - isLeading: showBackIcon, + isLeading: widget.showBackIcon, child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ + Row( + children: [ + Flexible( + child: Container( + padding: EdgeInsets.all(16.w), + decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 24.r, hasShadow: false), + child: Column( + children: [ + Row( + children: [ + Utils.buildSvgWithAssets(icon: "assets/images/svg/cloudyweather.svg", width: 64.w, height: 64.w).onPress(() { + // locationUtils?.getCurrentLocation(); + print(getIt.get().userLat); + print(getIt.get().userLong); + }), + SizedBox(width: 12.w), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + "August 19, 2025 - Tuesday, 11:25 ".toText12(fontWeight: FontWeight.w500, color: AppColors.greyTextColor), + SizedBox( + height: 4.w, + ), + "Cloudy 38oC".toText16(isBold: true, weight: FontWeight.w600), + SizedBox( + height: 4.w, + ), + "Health tips based on current weather".toText12(color: AppColors.greyTextColor, fontWeight: FontWeight.w500) + ], + ), + ], + ), + SizedBox(height: 16.w), + Container( + padding: EdgeInsets.all(16.w), + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.lightGrayBGColor, + borderRadius: 10.r, + hasShadow: false, + ), + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Row( + children: [ + Utils.buildSvgWithAssets(icon: "assets/images/svg/morning.svg", width: 24.w, height: 24.h), + SizedBox(width: 4.w), + DateTime.now().toLocal().toString().substring(11, 16).toText14(isBold: true), + ], + ), + SizedBox(width: 25.w), + DateTime.now().toLocal().toString().substring(11, 16).toText14(isBold: true), + SizedBox(width: 25.w), + Row( + children: [ + Utils.buildSvgWithAssets(icon: "assets/images/svg/evening.svg", width: 24.w, height: 24.h), + SizedBox(width: 4.w), + DateTime.now().toLocal().toString().substring(11, 16).toText14(isBold: true), + ], + ), + ], + ).expanded, + ).paddingSymmetrical(0.w, 8.w) + ], + ), + ), + ) + ], + ).paddingSymmetrical(24.w, 0.w), SizedBox(height: 16.h), LocaleKeys.medicalAndCareServices.tr().toText18(isBold: true).paddingSymmetrical(24.w, 0), SizedBox(height: 16.h), @@ -440,173 +518,176 @@ class ServicesPage extends StatelessWidget { ), ), SizedBox(height: 24.h), - getIt.get().isAuthenticated ? Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - LocaleKeys.personalServices.tr().toText18(isBold: true).paddingSymmetrical(24.w, 0), - SizedBox(height: 16.h), - Row( - children: [ - Expanded( - child: Container( - height: 183.h, - width: 183.h, - padding: EdgeInsets.all(16.w), - decoration: RoundedRectangleBorder().toSmoothCornerDecoration( - color: AppColors.whiteColor, - borderRadius: 20.r, - hasShadow: false, - ), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Row( - spacing: 8.w, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Utils.buildSvgWithAssets(icon: AppAssets.wallet, width: 40.w, height: 40.h, applyThemeColor: false), - LocaleKeys.habibWallet.tr().toText14(isBold: true, maxlines: 2).expanded, - Utils.buildSvgWithAssets(icon: getIt.get().isArabic() ? AppAssets.arrow_back : AppAssets.arrow_forward), - ], - ), - Spacer(), - getIt.get().isAuthenticated - ? Consumer(builder: (context, habibWalletVM, child) { - return Utils.getPaymentAmountWithSymbol2(num.parse(NumberFormat.decimalPattern().format(habibWalletVM.habibWalletAmount)), isExpanded: false, letterSpacing: -1) - .toShimmer2(isShow: habibWalletVM.isWalletAmountLoading, radius: 12.r, width: 80.w, height: 24.h); - }) - : LocaleKeys.loginToViewWalletBalance.tr().toText12(isBold: true, maxLine: 2), - Spacer(), - getIt.get().isAuthenticated - ? CustomButton( - height: 40.h, - icon: AppAssets.recharge_icon, - iconSize: 24.w, - iconColor: AppColors.infoColor, - textColor: AppColors.infoColor, - text: LocaleKeys.recharge.tr(), - borderWidth: 0.w, - isBold: true, - borderColor: Colors.transparent, - backgroundColor: Color(0xff45A2F8).withValues(alpha: 0.08), - padding: EdgeInsets.all(8.w), - fontSize: 14.f, - onPressed: () { - Navigator.of(context).push(CustomPageRoute(page: RechargeWalletPage())); - }, - ) - : SizedBox.shrink(), - ], - ).onPress(() async { - if (getIt.get().isAuthenticated) { - Navigator.of(context).push(CustomPageRoute(page: HabibWalletPage())); - } else { - await getIt.get().onLoginPressed(); - } - }), - ), - ), - SizedBox(width: 16.w), - Expanded( - child: Container( - height: 183.h, - width: 183.h, - padding: EdgeInsets.all(16.w), - decoration: RoundedRectangleBorder().toSmoothCornerDecoration( - color: AppColors.whiteColor, - borderRadius: 20.r, - hasShadow: false, - ), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Row( - spacing: 8.w, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Utils.buildSvgWithAssets(icon: AppAssets.services_medical_file_icon, width: 40.w, height: 40.h, applyThemeColor: false), - LocaleKeys.medicalFile.tr().toText16(isBold: true, maxlines: 2).expanded, - Utils.buildSvgWithAssets(icon: getIt.get().isArabic() ? AppAssets.arrow_back : AppAssets.arrow_forward), - ], + getIt.get().isAuthenticated + ? Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + LocaleKeys.personalServices.tr().toText18(isBold: true).paddingSymmetrical(24.w, 0), + SizedBox(height: 16.h), + Row( + children: [ + Expanded( + child: Container( + height: 183.h, + width: 183.h, + padding: EdgeInsets.all(16.w), + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 20.r, + hasShadow: false, + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + spacing: 8.w, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Utils.buildSvgWithAssets(icon: AppAssets.wallet, width: 40.w, height: 40.h, applyThemeColor: false), + LocaleKeys.habibWallet.tr().toText14(isBold: true, maxlines: 2).expanded, + Utils.buildSvgWithAssets(icon: getIt.get().isArabic() ? AppAssets.arrow_back : AppAssets.arrow_forward), + ], + ), + Spacer(), + getIt.get().isAuthenticated + ? Consumer(builder: (context, habibWalletVM, child) { + return Utils.getPaymentAmountWithSymbol2(num.parse(NumberFormat.decimalPattern().format(habibWalletVM.habibWalletAmount)), + isExpanded: false, letterSpacing: -1) + .toShimmer2(isShow: habibWalletVM.isWalletAmountLoading, radius: 12.r, width: 80.w, height: 24.h); + }) + : LocaleKeys.loginToViewWalletBalance.tr().toText12(isBold: true, maxLine: 2), + Spacer(), + getIt.get().isAuthenticated + ? CustomButton( + height: 40.h, + icon: AppAssets.recharge_icon, + iconSize: 24.w, + iconColor: AppColors.infoColor, + textColor: AppColors.infoColor, + text: LocaleKeys.recharge.tr(), + borderWidth: 0.w, + isBold: true, + borderColor: Colors.transparent, + backgroundColor: Color(0xff45A2F8).withValues(alpha: 0.08), + padding: EdgeInsets.all(8.w), + fontSize: 14.f, + onPressed: () { + Navigator.of(context).push(CustomPageRoute(page: RechargeWalletPage())); + }, + ) + : SizedBox.shrink(), + ], + ).onPress(() async { + if (getIt.get().isAuthenticated) { + Navigator.of(context).push(CustomPageRoute(page: HabibWalletPage())); + } else { + await getIt.get().onLoginPressed(); + } + }), ), - Spacer(), - getIt.get().isAuthenticated - ? Wrap( - spacing: -12.h, - // runSpacing: 0.h, - children: [ - Utils.buildImgWithAssets( - icon: AppAssets.babyGirlImg, - height: 32.h, - width: 32.w, - border: 1, - fit: BoxFit.contain, - borderRadius: 50.r, - ), - Utils.buildImgWithAssets( - icon: AppAssets.femaleImg, - height: 32.h, - width: 32.w, - border: 1, - borderRadius: 50.r, - fit: BoxFit.contain, - ), - Utils.buildImgWithAssets( - icon: AppAssets.maleImg, - height: 32.h, - width: 32.w, - border: 1, - borderRadius: 50.r, - fit: BoxFit.contain, - ), - ], - ) - : LocaleKeys.loginToViewMedicalFile.tr().toText12(isBold: true, maxLine: 2), - Spacer(), - getIt.get().isAuthenticated - ? CustomButton( - height: 40.h, - icon: AppAssets.add_icon, - iconSize: 24.h, - iconColor: AppColors.primaryRedColor, - textColor: AppColors.primaryRedColor, - text: LocaleKeys.addMember.tr(), - borderWidth: 0.w, - isBold: true, - borderColor: Colors.transparent, - backgroundColor: AppColors.primaryRedColor.withValues(alpha: 0.08), - padding: EdgeInsets.all(8.w), - fontSize: 14.f, - onPressed: () { - DialogService dialogService = getIt.get(); - medicalFileViewModel.clearAuthValues(); - dialogService.showAddFamilyFileSheet( - label: LocaleKeys.addFamilyMember.tr(), - message: LocaleKeys.pleaseFillBelowFieldToAddNewFamilyMember.tr(), - onVerificationPress: () { - medicalFileViewModel.addFamilyFile(otpTypeEnum: OTPTypeEnum.sms); - }); - }, - ) - : SizedBox.shrink(), - ], - ).onPress(() async { - if (getIt.get().isAuthenticated) { - Navigator.of(context).push( - CustomPageRoute( - page: MedicalFilePage(), + ), + SizedBox(width: 16.w), + Expanded( + child: Container( + height: 183.h, + width: 183.h, + padding: EdgeInsets.all(16.w), + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 20.r, + hasShadow: false, ), - ); - } else { - await getIt.get().onLoginPressed(); - } - }), - ), - ), - ], - ).paddingSymmetrical(24.w, 0), - ], - ) : SizedBox(), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + spacing: 8.w, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Utils.buildSvgWithAssets(icon: AppAssets.services_medical_file_icon, width: 40.w, height: 40.h, applyThemeColor: false), + LocaleKeys.medicalFile.tr().toText16(isBold: true, maxlines: 2).expanded, + Utils.buildSvgWithAssets(icon: getIt.get().isArabic() ? AppAssets.arrow_back : AppAssets.arrow_forward), + ], + ), + Spacer(), + getIt.get().isAuthenticated + ? Wrap( + spacing: -12.h, + // runSpacing: 0.h, + children: [ + Utils.buildImgWithAssets( + icon: AppAssets.babyGirlImg, + height: 32.h, + width: 32.w, + border: 1, + fit: BoxFit.contain, + borderRadius: 50.r, + ), + Utils.buildImgWithAssets( + icon: AppAssets.femaleImg, + height: 32.h, + width: 32.w, + border: 1, + borderRadius: 50.r, + fit: BoxFit.contain, + ), + Utils.buildImgWithAssets( + icon: AppAssets.maleImg, + height: 32.h, + width: 32.w, + border: 1, + borderRadius: 50.r, + fit: BoxFit.contain, + ), + ], + ) + : LocaleKeys.loginToViewMedicalFile.tr().toText12(isBold: true, maxLine: 2), + Spacer(), + getIt.get().isAuthenticated + ? CustomButton( + height: 40.h, + icon: AppAssets.add_icon, + iconSize: 24.h, + iconColor: AppColors.primaryRedColor, + textColor: AppColors.primaryRedColor, + text: LocaleKeys.addMember.tr(), + borderWidth: 0.w, + isBold: true, + borderColor: Colors.transparent, + backgroundColor: AppColors.primaryRedColor.withValues(alpha: 0.08), + padding: EdgeInsets.all(8.w), + fontSize: 14.f, + onPressed: () { + DialogService dialogService = getIt.get(); + medicalFileViewModel.clearAuthValues(); + dialogService.showAddFamilyFileSheet( + label: LocaleKeys.addFamilyMember.tr(), + message: LocaleKeys.pleaseFillBelowFieldToAddNewFamilyMember.tr(), + onVerificationPress: () { + medicalFileViewModel.addFamilyFile(otpTypeEnum: OTPTypeEnum.sms); + }); + }, + ) + : SizedBox.shrink(), + ], + ).onPress(() async { + if (getIt.get().isAuthenticated) { + Navigator.of(context).push( + CustomPageRoute( + page: MedicalFilePage(), + ), + ); + } else { + await getIt.get().onLoginPressed(); + } + }), + ), + ), + ], + ).paddingSymmetrical(24.w, 0), + ], + ) + : SizedBox(), SizedBox(height: 24.h), LocaleKeys.healthTools.tr().toText18(isBold: true).paddingSymmetrical(24.w, 0), SizedBox(height: 16.h), From cfea843c4fb0e68b8962085572f04020979919f9 Mon Sep 17 00:00:00 2001 From: Sultan khan Date: Sun, 12 Apr 2026 18:20:23 +0300 Subject: [PATCH 07/45] updates and fixes --- assets/images/png/female_bmi.png | Bin 0 -> 586823 bytes assets/langs/ar-SA.json | 4 + assets/langs/en-US.json | 2 + lib/core/api/api_client.dart | 6 +- lib/core/api_consts.dart | 2 +- lib/core/app_assets.dart | 1 + .../emergency_services_repo.dart | 2 +- ...nt_appointment_history_response_model.dart | 4 + lib/generated/codegen_loader.g.dart | 4 + lib/generated/locale_keys.g.dart | 4 + .../appointment_details_page.dart | 200 +++++++++++++++++- .../widgets/appointment_card.dart | 170 +++++++-------- .../symptoms_checker/triage_screen.dart | 2 +- .../vital_sign/vital_sign_page.dart | 4 +- 14 files changed, 290 insertions(+), 115 deletions(-) create mode 100644 assets/images/png/female_bmi.png diff --git a/assets/images/png/female_bmi.png b/assets/images/png/female_bmi.png new file mode 100644 index 0000000000000000000000000000000000000000..437f1dc1e91c4b2c8c1d8d588f87bddeeab82bcd GIT binary patch literal 586823 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