From aae48f2555c4b7e74f550f0ac421cd9b8e65a9dc Mon Sep 17 00:00:00 2001 From: haroon amjad Date: Sun, 24 Apr 2022 12:34:10 +0300 Subject: [PATCH] Android permission dialog updates --- assets/applepay.json | 4 +- assets/images/new/payment/tamara.png | Bin 0 -> 106442 bytes lib/config/config.dart | 5 +- lib/config/localized_values.dart | 163 ++++-- .../tamara_installment_details.dart | 97 ++++ lib/core/service/client/base_app_client.dart | 4 +- lib/core/service/hospital_service.dart | 50 +- lib/core/viewModels/qr_view_model.dart | 21 +- .../NewCMC/new_cmc_page.dart | 2 +- .../NewCMC/new_cmc_step_tow_page.dart | 44 +- .../new_e_referral_step_three_page.dart | 1 - .../new_Home_health_care_step_tow_page.dart | 43 +- .../new_home_health_care_page.dart | 49 +- .../all_habib_medical_service_page2.dart | 22 +- lib/pages/BookAppointment/BookSuccess.dart | 12 +- .../widgets/reminder_dialog.dart | 29 +- .../covid-payment-summary.dart | 11 +- lib/pages/ToDoList/ToDo.dart | 499 +++++++++--------- lib/pages/ToDoList/payment_method_select.dart | 186 ++++++- .../fragments/home_page_fragment2.dart | 1 - lib/pages/landing/landing_page.dart | 387 +++++--------- lib/pages/landing/widgets/services_view.dart | 27 +- lib/pages/livecare/widgets/clinic_list.dart | 8 +- .../ask_doctor/ViewDoctorResponsesPage.dart | 77 ++- .../medical/ask_doctor/doctor_response.dart | 11 +- .../medical/balance/advance_payment_page.dart | 7 +- .../medical/balance/confirm_payment_page.dart | 38 +- .../PrescriptionIDeliveryAddressPage.dart | 56 +- .../prescription_items_page.dart | 7 +- .../syncHealthData.dart | 38 +- lib/pages/settings/general_setting.dart | 4 +- .../appointment_services/GetDoctorsList.dart | 10 + .../permission/permission_service.dart | 27 +- lib/uitl/HMGNetworkConnectivity.dart | 134 ++--- lib/uitl/location_util.dart | 28 +- lib/uitl/translations_delegate_base.dart | 10 + lib/uitl/utils.dart | 99 +++- lib/widgets/bottom_options/BottomSheet.dart | 116 ++-- lib/widgets/in_app_browser/InAppBrowser.dart | 89 +++- .../others/floating_button_search.dart | 20 +- pubspec.yaml | 2 +- 41 files changed, 1596 insertions(+), 842 deletions(-) create mode 100644 assets/images/new/payment/tamara.png create mode 100644 lib/core/model/my_balance/tamara_installment_details.dart diff --git a/assets/applepay.json b/assets/applepay.json index b33de32d..7817eb67 100644 --- a/assets/applepay.json +++ b/assets/applepay.json @@ -5,8 +5,8 @@ "displayName": "Sulaiman Al Habib", "merchantCapabilities": [ "3DS", - "credit", - "debit" + "debit", + "credit" ], "supportedNetworks": [ "visa", diff --git a/assets/images/new/payment/tamara.png b/assets/images/new/payment/tamara.png new file mode 100644 index 0000000000000000000000000000000000000000..ce9a2b15f7d1308fdfde7631bf8945d3330e5526 GIT binary patch literal 106442 zcmeFZbzD?`&^EjvAt0iJbcl3IcNlaDNcYm+4NItql+@DFAks@WsC2h9(%rqpa}eWq z-|zeH^WOs>*u#l$&RjEd%^ZRhAZp13r*U z#pJ|5pptNm3xk`h6ktguIS|N$1_bhb0|K1`r+imIAZIoZXk8x!;*SG?@a>XnUI_vh z+>F(wOyuN148ZYS5HbQb=nim%0DOZGh<^129D$?}i2oidA<+H42N47cGzTI5x*r76 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 #? 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

^%EL00_2P(2~*J+Zs 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 buhE{#W?Ng^`weNw8Gyjk)z4*}Q$iB}vi3wN literal 0 HcmV?d00001 diff --git a/lib/config/config.dart b/lib/config/config.dart index fee1b035..abe2ca0d 100644 --- a/lib/config/config.dart +++ b/lib/config/config.dart @@ -392,7 +392,7 @@ var UPDATE_COVID_QUESTIONNAIRE = 'Services/Doctors.svc/REST/COVID19_Questionnar var CHANNEL = 3; var GENERAL_ID = 'Cs2020@2016\$2958'; var IP_ADDRESS = '10.20.10.20'; -var VERSION_ID = 7.3; +var VERSION_ID = 7.6; var SETUP_ID = '91877'; var LANGUAGE = 2; var PATIENT_OUT_SA = 0; @@ -711,6 +711,9 @@ var GET_DENTAL_APPOINTMENT_INVOICE = var SEND_DENTAL_APPOINTMENT_INVOICE_EMAIL = "Services/Notifications.svc/REST/SendInvoiceForDental"; +var GET_TAMARA_PLAN = + 'https://mdlaboratories.com/tamara/Home/GetInstallments'; + class AppGlobal { static var context; diff --git a/lib/config/localized_values.dart b/lib/config/localized_values.dart index 23777d82..fc913a3d 100644 --- a/lib/config/localized_values.dart +++ b/lib/config/localized_values.dart @@ -278,8 +278,14 @@ const Map localizedValues = { "viewAll": {"en": "View All", 'ar': 'عرض الكل'}, "view": {"en": "View", 'ar': 'عرض'}, "ContactUs": {"en": "Contact Us", 'ar': 'الوصول إلينا'}, - "contactUsLocation": {"en": "P.O.Box: 91877 - Riyadh 11643, King Fahad Road - Olaya - Kingdom of Saudi Arabia", 'ar': 'صندوق بريد: 91877 - الرياض 11643 ، طريق الملك فهد - العليا - المملكة العربية السعودية'}, - "contactUsTime": {"en": "Saturday - Wednesday 8:00 AM - 10 PM, Thursday 8:00 AM- 8:00 PM, Friday 2:00 PM - 8:00 PM", 'ar': " السبت – الأربعاء 08:00 ص – 10:00 م , الخميس 08:00 ص – 08:00 م, الجمعة 02:00 م - 08:00 م"}, + "contactUsLocation": { + "en": "P.O.Box: 91877 - Riyadh 11643, King Fahad Road - Olaya - Kingdom of Saudi Arabia", + 'ar': 'صندوق بريد: 91877 - الرياض 11643 ، طريق الملك فهد - العليا - المملكة العربية السعودية' + }, + "contactUsTime": { + "en": "Saturday - Wednesday 8:00 AM - 10 PM, Thursday 8:00 AM- 8:00 PM, Friday 2:00 PM - 8:00 PM", + 'ar': " السبت – الأربعاء 08:00 ص – 10:00 م , الخميس 08:00 ص – 08:00 م, الجمعة 02:00 م - 08:00 م" + }, "ViewAllWaysReachUs": {"en": "View All Ways Reach Us", 'ar': 'جميع طرق الاتصال بنا'}, "medicalProfile": {"en": "Medical Profile", 'ar': 'الملف الطبي'}, "consultation": {"en": "Consultation", "ar": "استشارة"}, @@ -615,6 +621,7 @@ const Map localizedValues = { "shippingAddress": {"en": "SHIPPING ADDRESS", "ar": "عنوان الشحن"}, "changeAddress": {"en": "Change Address", "ar": "تغيير العنوان"}, "selectPaymentOption": {"en": "Select Payment Option", "ar": "حدد طريقة الدفع"}, + "selectTamaraPlan": {"en": "Select Tamara Payment Plan", "ar": "حدد خطة الدفع تمارا"}, "changeMethod": {"en": "Change Method", "ar": "تغيير طريقة الدفع"}, "reviewOrder": {"en": "Review Order", "ar": "مراجعة الطلب"}, "active": {"en": "ACTIVE", "ar": "فعال"}, @@ -879,10 +886,7 @@ const Map localizedValues = { }, "failedToAccessHmgServices": {"en": "Connected with HMG Network,\n\nBut failed to access HMG services", "ar": "Connected with HMG Network,\n\nBut failed to access HMG services"}, "offerAndPackages": {"en": "Offers and Packages", "ar": "العروض والباقات"}, - "offerAndPackagesDetails": { - "en": "This service allows you to view all HMG Offers:", - "ar": "This service allows you to view all HMG Offers:" - }, + "offerAndPackagesDetails": {"en": "This service allows you to view all HMG Offers:", "ar": "This service allows you to view all HMG Offers:"}, "InvoiceNo": {"en": "Invoice No", "ar": "رقم الفاتورة"}, "InvoiceDate": {"en": "Invoice Date", "ar": "تاريخ الفاتورة"}, "SpecialResult": {"en": " Special Result", "ar": "نتيجة خاصة"}, @@ -958,8 +962,10 @@ const Map localizedValues = { "iAcceptTermsConditions": {"en": "I Accept the Terms and Conditions", "ar": "أوافق على الشروط والأحكام"}, "YouCanPayByTheFollowingOptions": {"en": "You can pay by the following options:", "ar": "يمكنك الدفع عن طريق الخيارات التالية:"}, "RRTDDetails": { - "en": "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.", - "ar": "فريق الاستجابة السريعة يقوم بتقديم رعاية صحية متكاملة لجميع الحالات الطارئة و المستقرة، الخدمة تشمل جميع الأعمار بما في ذلك حالات الأطفال، تشمل الخدمة إرسال فريق طبي كامل الجاهزية و على مستوى عالي من التدريب قادر على تقديم أفضل رعاية صحية من داخل المنزل." + "en": + "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.", + "ar": + "فريق الاستجابة السريعة يقوم بتقديم رعاية صحية متكاملة لجميع الحالات الطارئة و المستقرة، الخدمة تشمل جميع الأعمار بما في ذلك حالات الأطفال، تشمل الخدمة إرسال فريق طبي كامل الجاهزية و على مستوى عالي من التدريب قادر على تقديم أفضل رعاية صحية من داخل المنزل." }, "rrtService": {"en": "RRT Service", "ar": "خدمة RRT"}, "bill-amount": {"en": "Bill Amount", "ar": "مبلغ الفاتورة"}, @@ -1632,28 +1638,41 @@ const Map localizedValues = { "medicalFileSubtitle": {"en": "Details", "ar": "ملفي الطبي"}, "healthConvertersTitle": {"en": "Health", "ar": "تحويل"}, "healthConvertersSubtitle": {"en": "Converters", "ar": "القياسات"}, - "syncHealthData": { "en": "Sync Health Data", "ar": "مزامنة البيانات الصحية" }, - "steps": { "en": "Steps", "ar": "الخطوات" }, - "avgSteps": { "en": "Average Steps", "ar": "متوسط الخطوات" }, - "avgDistance": { "en": "Average Distance", "ar": "متوسط المسافة" }, + "syncHealthData": {"en": "Sync Health Data", "ar": "مزامنة البيانات الصحية"}, + "steps": {"en": "Steps", "ar": "الخطوات"}, + "avgSteps": {"en": "Average Steps", "ar": "متوسط الخطوات"}, + "avgDistance": {"en": "Average Distance", "ar": "متوسط المسافة"}, "enterDetails": {"en": "Enter Details", "ar": "أدخل التفاصيل"}, - "avgHeartRate": { "en": "Average Heart Rate", "ar": "متوسط معدل ضربات القلب" }, - "alreadySynced": { "en": "Already Synced", "ar": "متزامنة" }, - "sync-instructions-intro1": { "en": "It Seems like you haven't synced your health data with the Dr. Alhabib App before. To proceed further, you need to sync your health data with the Dr. Alhabib App", "ar": "يبدو أنك لم تقم بمزامنة بياناتك الصحية مع تطبيق Dr. Alhabib App من قبل. للمتابعة ، تحتاج إلى مزامنة بياناتك الصحية مع تطبيق Dr. Alhabib" }, - "sync-instructions-intro2": { "en": "Before syncing data, please make sure that you have followed the instructions properly", "ar": "قبل مزامنة البيانات ، يرجى التأكد من اتباع التعليمات بشكل صحيح." }, - "sync-instructions-intro3": { "en": "Before syncing data, please make sure that following instructions are met:", "ar": "قبل مزامنة البيانات ، يرجى التأكد من تلبية الإرشادات التالية:" }, - "ios-instructions-1": { "en": "Make sure that you have installed 'Health' App & 'Watch' App from Apple Store.", "ar": "تأكد من أنك قمت بتثبيت تطبيق 'Health' App & 'Watch' من متجر Apple." }, - "ios-instructions-2": { "en": "Make sure that your Apple Watch is connected with the Watch & Health Apps.", "ar": "تأكد من اتصال Apple Watch بتطبيقات Watch & Health." }, - "ios-instructions-3": { "en": "Make sure that data like heart rate, steps, distance etc. are being shown on your health app.", "ar": "تأكد من عرض بيانات مثل معدل ضربات القلب والخطوات والمسافة وما إلى ذلك على تطبيق صحتك." }, - "supportedWatches": { "en": "Supported SmartWatches", "ar": "الساعات الذكية المدعومة" }, - "watchInstructions": { "en": "View watch instructions", "ar": "عرض تعليمات الساعة" }, + "avgHeartRate": {"en": "Average Heart Rate", "ar": "متوسط معدل ضربات القلب"}, + "alreadySynced": {"en": "Already Synced", "ar": "متزامنة"}, + "sync-instructions-intro1": { + "en": "It Seems like you haven't synced your health data with the Dr. Alhabib App before. To proceed further, you need to sync your health data with the Dr. Alhabib App", + "ar": "يبدو أنك لم تقم بمزامنة بياناتك الصحية مع تطبيق Dr. Alhabib App من قبل. للمتابعة ، تحتاج إلى مزامنة بياناتك الصحية مع تطبيق Dr. Alhabib" + }, + "sync-instructions-intro2": {"en": "Before syncing data, please make sure that you have followed the instructions properly", "ar": "قبل مزامنة البيانات ، يرجى التأكد من اتباع التعليمات بشكل صحيح."}, + "sync-instructions-intro3": {"en": "Before syncing data, please make sure that following instructions are met:", "ar": "قبل مزامنة البيانات ، يرجى التأكد من تلبية الإرشادات التالية:"}, + "ios-instructions-1": {"en": "Make sure that you have installed 'Health' App & 'Watch' App from Apple Store.", "ar": "تأكد من أنك قمت بتثبيت تطبيق 'Health' App & 'Watch' من متجر Apple."}, + "ios-instructions-2": {"en": "Make sure that your Apple Watch is connected with the Watch & Health Apps.", "ar": "تأكد من اتصال Apple Watch بتطبيقات Watch & Health."}, + "ios-instructions-3": { + "en": "Make sure that data like heart rate, steps, distance etc. are being shown on your health app.", + "ar": "تأكد من عرض بيانات مثل معدل ضربات القلب والخطوات والمسافة وما إلى ذلك على تطبيق صحتك." + }, + "supportedWatches": {"en": "Supported SmartWatches", "ar": "الساعات الذكية المدعومة"}, + "watchInstructions": {"en": "View watch instructions", "ar": "عرض تعليمات الساعة"}, "monthlyTab": {"en": "Monthly", "ar": "شهري"}, "moreSupportedWatches": {"en": "More Supported Smartwatches...", "ar": "المزيد من الساعات الذكية المدعومة..."}, - "android-instructions-1": { "en": "Make sure that you have installed 'WearOS' & 'Google Fit' apps from Google PlayStore.", "ar": "تأكد من تثبيت تطبيقات 'WearOS' و 'Google Fit' من متجر Google PlayStore." }, - "android-instructions-2": { "en": "Make sure that you have installed your watch related apps from Google PlayStore.", "ar": "تأكد من أنك قمت بتثبيت التطبيقات المتعلقة بالساعات من Google PlayStore." }, - "android-instructions-3": { "en": "Make sure that your Smart Watch is connected with the WearOS app & your watch apps.", "ar": "تأكد من أن ساعتك الذكية متصلة بتطبيق WearOS وتطبيقات ساعتك." }, - "android-instructions-4": { "en": "Make sure that your smart watch apps are linked/associated with Google Fit App.", "ar": "تأكد من أن تطبيقات ساعتك الذكية مرتبطة / مرتبطة بتطبيق Google Fit." }, "android-instructions-5": { "en": "Make sure that data like heart rate, steps, distance etc. are being shown on your watch app & on Google Fit app & both are in sync.", "ar": "تأكد من عرض بيانات مثل معدل ضربات القلب والخطوات والمسافة وما إلى ذلك على تطبيق الساعة وعلى تطبيق Google Fit وكلاهما في حالة مزامنة." }, - "tamaraInstPlan" : { "en": "Select the tamara installment plan", "ar": "حدد خطة تقسيط تمارة" }, + "android-instructions-1": { + "en": "Make sure that you have installed 'WearOS' & 'Google Fit' apps from Google PlayStore.", + "ar": "تأكد من تثبيت تطبيقات 'WearOS' و 'Google Fit' من متجر Google PlayStore." + }, + "android-instructions-2": {"en": "Make sure that you have installed your watch related apps from Google PlayStore.", "ar": "تأكد من أنك قمت بتثبيت التطبيقات المتعلقة بالساعات من Google PlayStore."}, + "android-instructions-3": {"en": "Make sure that your Smart Watch is connected with the WearOS app & your watch apps.", "ar": "تأكد من أن ساعتك الذكية متصلة بتطبيق WearOS وتطبيقات ساعتك."}, + "android-instructions-4": {"en": "Make sure that your smart watch apps are linked/associated with Google Fit App.", "ar": "تأكد من أن تطبيقات ساعتك الذكية مرتبطة / مرتبطة بتطبيق Google Fit."}, + "android-instructions-5": { + "en": "Make sure that data like heart rate, steps, distance etc. are being shown on your watch app & on Google Fit app & both are in sync.", + "ar": "تأكد من عرض بيانات مثل معدل ضربات القلب والخطوات والمسافة وما إلى ذلك على تطبيق الساعة وعلى تطبيق Google Fit وكلاهما في حالة مزامنة." + }, + "tamaraInstPlan": {"en": "Select the tamara installment plan", "ar": "حدد خطة تقسيط تمارة"}, "onlineTag": {"en": "Online", "ar": "مفتوح"}, "offlineTag": {"en": "Offline", "ar": "مغلق"}, "viewDocList": {"en": "View List of Doctors", "ar": "عرض قائمة الأطباء"}, @@ -1665,7 +1684,7 @@ const Map localizedValues = { "RRTTitle": {"en": "RRT", "ar": "خدمة فريق"}, "RRTSubTitle": {"en": "Service", "ar": "الاستجابة السريع"}, "transportation": {"en": "Transportation", "ar": "النقل"}, - + "installments": {"en": "Installments", "ar": "أقساط"}, "neck": {"en": "Neck", "ar": "رقبه"}, "waist": {"en": "Waist", "ar": "وسط"}, "hip": {"en": "Hip", "ar": "ورك او نتوء"}, @@ -1674,47 +1693,56 @@ const Map localizedValues = { "babyAge": {"en": "Baby Age", "ar": "عمر الطفل الآن:"}, "babyAgeAvail": {"en": "baby age is not available", "ar": "عمر الطفل غير متوفر"}, "deliveryDue": {"en": "The delivery due date is estimated to be on the", "ar": "من المقدر أن يكون تاريخ استحقاق التسليم في"}, - "almostInactive": {"en": "Almost Inactive(Little or no exercises)", "ar": "شبه غير نشط (تمارين قليلة أو معدومة)"}, "lightActive1": {"en": "Lighty Active (1-3) days per week", "ar": "Lighty Active (1-3) أيام في الأسبوع"}, "veryActive": {"en": "very Active(6-7) days per week", "ar": "نشط جدا (6-7) أيام في الأسبوع"}, "superActive": {"en": "Super Active(very hard exercises)", "ar": "سوبر نشط (تمارين صعبة للغاية)"}, - "dailyIntake": {"en": "Daily intake is", "ar": "المدخول اليومي"}, "calculateAmount": {"en": "Calculates the amount of energy that the person’s body expends in a day", "ar": "تحسب كمية الطاقة التي يبذلها جسم الشخص في اليوم"}, "bodyWillBurn": {"en": "This means the body will burn", "ar": "هذا يعني أن الجسم سوف يحترق"}, - "caloriesEachDay": {"en": "calories each day, if engaged in no activity for the entire day.. Note: Daily calorie requirement is", "ar": "السعرات الحرارية في كل يوم ، إذا لم تمارس أي نشاط طوال اليوم .. ملاحظة: متطلبات السعرات الحرارية اليومية هي"}, + "caloriesEachDay": { + "en": "calories each day, if engaged in no activity for the entire day.. Note: Daily calorie requirement is", + "ar": "السعرات الحرارية في كل يوم ، إذا لم تمارس أي نشاط طوال اليوم .. ملاحظة: متطلبات السعرات الحرارية اليومية هي" + }, "maintainWeight": {"en": "calories, to maintain the current weight.", "ar": "السعرات الحرارية للحفاظ على الوزن الحالي."}, - "mediumFinger": {"en": "Medium(fingers touch)", "ar": "متوسطة (لمسة الأصابع)"}, "smallFinger": {"en": "Small(fingers overlap)", "ar": "صغير (أصابع متداخلة)"}, "largeFinger": {"en": "Large(fingers don\'n touch)", "ar": "كبير (لا تلمس الأصابع)"}, "idealBodyWeight": {"en": "Calculates the ideal body weight based on height, Weight, and Body Size", "ar": "يحسب وزن الجسم المثالي بناءً على الطول والوزن وحجم الجسم"}, "bodyFrameSize": {"en": "Body Frame Size", "ar": "حجم إطار الجسم"}, - "idealWeightRange": {"en": "Ideal weight range is", "ar": "نطاق الوزن المثالي هو"}, "currentWeightPerfect": {"en": "Congratulations! The current weight is perfect and considered healthy", "ar": "تهانينا! الوزن الحالي مثالي ويعتبر صحي"}, "littleBitWeightMore": {"en": "This means that the weight is a little bit more than ideal weight by", "ar": "هذا يعني أن الوزن أكثر قليلاً من الوزن المثالي به"}, - "consultWithDoctor": {"en": "May wish to consult with the doctor for medical help. Click to view our list of Doctors", "ar": "قد ترغب في استشارة الطبيب للحصول على مساعدة طبية. انقر لعرض قائمة الأطباء لدينا"}, + "consultWithDoctor": { + "en": "May wish to consult with the doctor for medical help. Click to view our list of Doctors", + "ar": "قد ترغب في استشارة الطبيب للحصول على مساعدة طبية. انقر لعرض قائمة الأطباء لدينا" + }, "excessiveObesity": {"en": "Means that you suffer from excessive obesity by", "ar": "يعني أنك تعاني من السمنة المفرطة بها"}, - "mayWish": {"en": "May wish to consult with the doctor for medical help. Click to view our list of\n Doctors", "ar": "قد ترغب في استشارة الطبيب للحصول على مساعدة طبية. انقر لعرض قائمة الأطباء \ n الخاصة بنا"}, - + "mayWish": { + "en": "May wish to consult with the doctor for medical help. Click to view our list of\n Doctors", + "ar": "قد ترغب في استشارة الطبيب للحصول على مساعدة طبية. انقر لعرض قائمة الأطباء \ n الخاصة بنا" + }, "essential": {"en": "The category falls under essential", "ar": "الفئة تندرج تحت الأساسية"}, "athlete": {"en": "The category falls under athlete", "ar": "فئة تندرج تحت رياضي"}, "fitness": {"en": "The category falls under fitness", "ar": "الفئة تندرج تحت اللياقة البدنية"}, "acceptable": {"en": "The category falls under acceptable", "ar": "الفئة تندرج تحت مقبول"}, "underObese": {"en": "The category falls under obese", "ar": "تندرج الفئة تحت السمنة"}, - "crossedLimits": {"en": "Please check the value you have entered, since the body fat percentage has crosed the limits.", "ar": "يرجى التحقق من القيمة التي أدخلتها ، لأن نسبة الدهون في الجسم تجاوزت الحدود."}, - "lowLimits": {"en": "Please check the value you have entered, since the body fat percentage cannot be this low.", "ar": "يرجى التحقق من القيمة التي أدخلتها ، حيث لا يمكن أن تكون نسبة الدهون في الجسم منخفضة."}, + "crossedLimits": { + "en": "Please check the value you have entered, since the body fat percentage has crosed the limits.", + "ar": "يرجى التحقق من القيمة التي أدخلتها ، لأن نسبة الدهون في الجسم تجاوزت الحدود." + }, + "lowLimits": { + "en": "Please check the value you have entered, since the body fat percentage cannot be this low.", + "ar": "يرجى التحقق من القيمة التي أدخلتها ، حيث لا يمكن أن تكون نسبة الدهون في الجسم منخفضة." + }, "estimates": {"en": "Estimates the total body fat based on\nthe size", "ar": "تقدير إجمالي الدهون في الجسم بناءً على \ n الحجم"}, - "myCart": {"en": "My Cart", "ar": "عربة التسوق"}, "browseOffers": {"en": "Browse offers by clinic", "ar": "تصفح العروض حسب العيادة"}, - "inactiveAct":{"en":"Almost inactive (little or no exercise)","ar":"غير نشط تقريبا (ممارسة الرياضة قليلة أو منعدمة)"}, - "light":{"en":"Lightly active (1-3) days per week","ar":"خفيف النشاط (1-3 أيام في الأسبوع)"}, - "moderate":{"en":"Moderately active (3-5) days per week)","ar":"معتدل النشاط (3-5 أيام في الأسبوع)"}, - "very":{"en":"Very active (6-7) days per week)","ar":"نشط جداُ (6-7 أيام في الأسبوع)"}, - "super":{"en":"Super active (very hard exercise)","ar":"عالي النشاط (ممارسة الرياضة الصعبة)"}, + "inactiveAct": {"en": "Almost inactive (little or no exercise)", "ar": "غير نشط تقريبا (ممارسة الرياضة قليلة أو منعدمة)"}, + "light": {"en": "Lightly active (1-3) days per week", "ar": "خفيف النشاط (1-3 أيام في الأسبوع)"}, + "moderate": {"en": "Moderately active (3-5) days per week)", "ar": "معتدل النشاط (3-5 أيام في الأسبوع)"}, + "very": {"en": "Very active (6-7) days per week)", "ar": "نشط جداُ (6-7 أيام في الأسبوع)"}, + "super": {"en": "Super active (very hard exercise)", "ar": "عالي النشاط (ممارسة الرياضة الصعبة)"}, "resultCalories": {"en": "Daily intake is (#) calories", "ar": "الإحتياج اليومي (#) سعرة حرارية"}, "bmrDesc": {"en": "Calculates the amount of energy that the person’s body expends in a day", "ar": "معدل الأيض القاعدي: هو حساب كمية الطاقة التي يحتاجها الجسم في اليوم الواحد"}, "idealWeightDesc": {"en": "Calculates the ideal body weight based on height, Weight, and Body Size", "ar": "حساب الوزن المثالي والوزن الصحي للجسم على أساس الطول، والوزن ،والجسم"}, @@ -1723,20 +1751,28 @@ const Map localizedValues = { "bodyFrameMedium": {"en": "Medium (fingers touch)", "ar": "متوسط (الأصابع تتلامس)"}, "bodyFrameLarge": {"en": "Large (fingers don't touch)", "ar": "عريض (الأصابع لا تتلامس)"}, "bodyFatDesc": {"en": "Estimates the total body fat based on the size", "ar": "حساب الدهون في الجسم بناءاً على الحجم"}, - - "obeseBodyFat":{"en":"The category falls under Obese.","ar":"تندرج تحت فئة دهون جسم سمين"}, - "invalid":{"en":"Invalid input for calculation.","ar":"البيانات المدخلة غير صالحة للحساب"}, - "more":{"en":"Please check the value you have entered, since the body fat percentage has crossed the limits.","ar":"يرجى التحقق من القيمة التي أدخلتها ، نظرًا لأن نسبة الدهون في الجسم قد تجاوزت الحدود"}, - "less":{"en":"Please check the value you have entered, since the body fat percentage cannot be this low.","ar":"يرجى التحقق من القيمة التي أدخلتها ، نظرًا لأن نسبة الدهون في الجسم لا يمكن أن تكون منخفضة"}, - "carbProteinDesc": {"en": "Calculates carbohydrate protein and fat ratio in calories and grams according to a pre-set ratio", "ar": "حساب نسب الكربوهيدرات و البروتينات و الدهون بالسعرات الحرارية والغرامات وفقا لنسب محددة مسبقا"}, + "obeseBodyFat": {"en": "The category falls under Obese.", "ar": "تندرج تحت فئة دهون جسم سمين"}, + "invalid": {"en": "Invalid input for calculation.", "ar": "البيانات المدخلة غير صالحة للحساب"}, + "more": { + "en": "Please check the value you have entered, since the body fat percentage has crossed the limits.", + "ar": "يرجى التحقق من القيمة التي أدخلتها ، نظرًا لأن نسبة الدهون في الجسم قد تجاوزت الحدود" + }, + "less": { + "en": "Please check the value you have entered, since the body fat percentage cannot be this low.", + "ar": "يرجى التحقق من القيمة التي أدخلتها ، نظرًا لأن نسبة الدهون في الجسم لا يمكن أن تكون منخفضة" + }, + "carbProteinDesc": { + "en": "Calculates carbohydrate protein and fat ratio in calories and grams according to a pre-set ratio", + "ar": "حساب نسب الكربوهيدرات و البروتينات و الدهون بالسعرات الحرارية والغرامات وفقا لنسب محددة مسبقا" + }, "calDay": {"en": "Calories Per Day", "ar": "السعرات الحرارية في اليوم الواحد"}, "notSure": {"en": "Not sure? click here", "ar": "غير متأكد؟ اضغط هنا"}, "selectDiet": {"en": "Select Diet Type", "ar": "حدد نوع النظام الغذائي"}, - "dietVeryLow":{"en":"Very Low Carb","ar":"حمية منخفضة جدا في الكربوهيدرات"}, - "dietLow":{"en":"Low Carb","ar":"حمية منخفضة الكربوهيدرات"}, - "dietModerate":{"en":"Moderate Carb","ar":"حمية معتدلة الكربوهيدرات"}, - "dietUSDA":{"en":"USDA Guidelines","ar":"ارشادات وزارة الزراعة الأمريكية"}, - "dietZone":{"en":"Zone Diet","ar":"حمية زون"}, + "dietVeryLow": {"en": "Very Low Carb", "ar": "حمية منخفضة جدا في الكربوهيدرات"}, + "dietLow": {"en": "Low Carb", "ar": "حمية منخفضة الكربوهيدرات"}, + "dietModerate": {"en": "Moderate Carb", "ar": "حمية معتدلة الكربوهيدرات"}, + "dietUSDA": {"en": "USDA Guidelines", "ar": "ارشادات وزارة الزراعة الأمريكية"}, + "dietZone": {"en": "Zone Diet", "ar": "حمية زون"}, "Protein": {"en": "Protein", "ar": "بروتين"}, "Cals": {"en": "Cals", "ar": "كالس"}, "gramsPerDay": {"en": "Grams Per Day", "ar": "غرام في اليوم"}, @@ -1758,7 +1794,20 @@ const Map localizedValues = { "ancillaryOrderPaymentSuccess": {"en": "Your payment for selected orders has been made successfully.", "ar": "تم سداد دفعتك للطلبات المحددة بنجاح."}, "connectTitle": {"en": "Connect", "ar": "تواصل"}, "connectSubtitle": {"en": "With us", "ar": "معنا"}, - "covidConsent": {"en": "Covid-19 Test feature allows you to book an appointment for the Covid-19 Lab test within HMG branches, where a swab sample will be collected & processed. Once the result has been processed, we shall notify you via SMS on your registered mobile number & the test result will also be available in the Lab Results section of this app. Please note that this result is only available to you & not publicly available to anyone else. Also we are using below permissions:\n\n GPS Location to show the nearest hospitals & ER Locations from your location.\n Bluetooth permission to connect blood pressure & blood sugar devices with the app to analyze the data.\n Camera permission to enable virtual consultation between patient & doctor.\n Calendar permission to set reminders for Virtual & Normal Appointments.\n Audio permission to access voice command features.\n Wifi state permission to connect to HMG Wifi when you visit the hospital.\n Read & write external storage to upload images & documents in E-Referral function.\n\n Please accept to confirm & proceed.", "ar": "تتيح لك ميزة اختبار كوفيد19 حجز موعد في احد فروع مجموعة الحبيب الطبية ، حيث سيتم اخذ عينة المسحة ومعالجتها. بمجرد معالجة النتيجة ، سنخطرك عبر رسالة نصية قصيرة على رقم هاتفك المحمول المسجل وستكون نتيجة الاختبار متاحة أيضًا على التطبيق في قسم نتائج المختبر. يرجى ملاحظة أن هذه النتيجة متاحة لك فقط وليست متاحة للجمهور او اي شخص آخر. الرجاء الموافقة للتأكيد والمتابعة."}, + "covidConsent": { + "en": + "Covid-19 Test feature allows you to book an appointment for the Covid-19 Lab test within HMG branches, where a swab sample will be collected & processed. Once the result has been processed, we shall notify you via SMS on your registered mobile number & the test result will also be available in the Lab Results section of this app. Please note that this result is only available to you & not publicly available to anyone else.", + "ar": + "تتيح لك ميزة اختبار كوفيد19 حجز موعد في احد فروع مجموعة الحبيب الطبية ، حيث سيتم اخذ عينة المسحة ومعالجتها. بمجرد معالجة النتيجة ، سنخطرك عبر رسالة نصية قصيرة على رقم هاتفك المحمول المسجل وستكون نتيجة الاختبار متاحة أيضًا على التطبيق في قسم نتائج المختبر. يرجى ملاحظة أن هذه النتيجة متاحة لك فقط وليست متاحة للجمهور او اي شخص آخر. الرجاء الموافقة للتأكيد والمتابعة." + }, "covidConsentHeader": {"en": "User Consent", "ar": "موافقة المستخدم"}, "drawOverAppsPermission": {"en": "Please allow the Al-Habib Medical Group application to appear on the top of the screen when receiving the call from the doctor for LiveCare service.", "ar": "الرجاء السماح لتطبيق مجموعة الحبيب الطبية للظهورعلى سطح الشاشة عند استلام الاتصال من الطبيب لخدمة اللايف كير"}, -}; \ No newline at end of file + "cameraPermissionDialog": { "en": "Dr. Al Habib app needs to access Camera to enable virtual consultation between patient & doctor, attach images and scan QR for parking service.", "ar": "يحتاج تطبيق دكتور الحبيب الى صلاحية الوصول إلى الكاميرا لخدمة الاستشارة الافتراضية بين المريض والطبيب وإرفاق الصور ومسح رمز الاستجابة السريع لخدمة مواقف السيارات." }, + "galleryPermission": { "en": "Dr. Al Habib app needs to access Read & write external storage to upload images & documents in the E-Referral module and renew and update the insurance cards.", "ar": "يحتاج تطبيق دكتور الحبيب إلى صلاحية الوصول إلى معرض الصور وذلك لتحميل الصور والمستندات لخدمة الإحالة الإلكترونية وكذلك لخدمة تجديد بطاقات التأمين وتحديثها." }, + "locationPermissionDialog": { "en": "Dr. Al Habib app collects location data to show the nearest HMG hospitals and ER Locations and provides health care services to your location and Health weather indicators service and the medication delivery.", "ar": "يحتاج تطبيق دكتور الحبيب إلى صلاحية الوصول الى الموقع لإظهار أقرب مستشفيات المجموعة، مواقع الطوارئ، تقديم خدمات الرعاية الصحية إلى موقعك، خدمة مؤشرات الطقس الصحية وكذلك خدمة توصيل الأدوية." }, + "calendarPermission": { "en": "Dr. Al Habib app collects calendar data to modify and set reminders for Appointments", "ar": "يحتاج تطبيق دكتور الحبيب إلى صلاحية الوصول الى التقويم وذلك لاضافة تذكيرات بالمواعيد في التقويم." }, + "recordAudioPermission": { "en": "Dr. Al Habib app needs audio permission to enable voice command features.", "ar": "يحتاج تطبيق دكتور الحبيب إلى صلاحية الوصول الى الصوت لتفعيل خدمة الأوامر الصوتية." }, + "wifiPermission": { "en": "Dr. Al Habib app needs to access WiFi state permission to connect to the HMG WiFi network from within the app when you visit the hospital.", "ar": "يحتاج تطبيق دكتور الحبيب إلى الوصول إلى الواي فاي للاتصال بشبكة الواي فاي في المجموعة عند زيارة المستشفى." }, + "physicalActivityPermission": { "en": "Dr. Al Habib app collects physical activity data to read heart rate, steps & distance from your smartwatch & send it to your doctor.", "ar": "يحتاج تطبيق دكتور الحبيب إلى الوصول إلى بيانات النشاط البدني لقراءة معدل ضربات القلب والخطوات والمسافة من ساعتك الذكية وتحميلها على ملفك الطبي حتى يتمكن الطبيب من الاطلاع عليها." }, + "bluetoothPermission": { "en": "Dr. Al Habib app needs to access Bluetooth permission to connect blood pressure & blood sugar devices with the app to analyze the data", "ar": "يحتاج تطبيق دكتور الحبيب إلى الوصول إلى البلوتوث لربط أجهزة ضغط الدم وسكر الدم بالتطبيق لتحليل البيانات وتحميلها على ملفك الطبي حتى يتمكن الطبيب من الاطلاع عليها." } +}; diff --git a/lib/core/model/my_balance/tamara_installment_details.dart b/lib/core/model/my_balance/tamara_installment_details.dart new file mode 100644 index 00000000..33e331d7 --- /dev/null +++ b/lib/core/model/my_balance/tamara_installment_details.dart @@ -0,0 +1,97 @@ +class TamaraInstallmentDetails { + String name; + String description; + MinLimit minLimit; + MinLimit maxLimit; + List supportedInstalments; + + TamaraInstallmentDetails( + {this.name, + this.description, + this.minLimit, + this.maxLimit, + this.supportedInstalments}); + + TamaraInstallmentDetails.fromJson(Map json) { + name = json['name']; + description = json['description']; + minLimit = json['minLimit'] != null + ? new MinLimit.fromJson(json['minLimit']) + : null; + maxLimit = json['maxLimit'] != null + ? new MinLimit.fromJson(json['maxLimit']) + : null; + if (json['supportedInstalments'] != null) { + supportedInstalments = []; + json['supportedInstalments'].forEach((v) { + supportedInstalments.add(new SupportedInstalments.fromJson(v)); + }); + } + } + + Map toJson() { + final Map data = new Map(); + data['name'] = this.name; + data['description'] = this.description; + if (this.minLimit != null) { + data['minLimit'] = this.minLimit.toJson(); + } + if (this.maxLimit != null) { + data['maxLimit'] = this.maxLimit.toJson(); + } + if (this.supportedInstalments != null) { + data['supportedInstalments'] = + this.supportedInstalments.map((v) => v.toJson()).toList(); + } + return data; + } +} + +class MinLimit { + String currency; + int amount; + + MinLimit({this.currency, this.amount}); + + MinLimit.fromJson(Map json) { + currency = json['currency']; + amount = json['amount']; + } + + Map toJson() { + final Map data = new Map(); + data['currency'] = this.currency; + data['amount'] = this.amount; + return data; + } +} + +class SupportedInstalments { + int instalments; + MinLimit minLimit; + MinLimit maxLimit; + + SupportedInstalments({this.instalments, this.minLimit, this.maxLimit}); + + SupportedInstalments.fromJson(Map json) { + instalments = json['instalments']; + minLimit = json['minLimit'] != null + ? new MinLimit.fromJson(json['minLimit']) + : null; + maxLimit = json['maxLimit'] != null + ? new MinLimit.fromJson(json['maxLimit']) + : null; + } + + Map toJson() { + final Map data = new Map(); + data['instalments'] = this.instalments; + if (this.minLimit != null) { + data['minLimit'] = this.minLimit.toJson(); + } + if (this.maxLimit != null) { + data['maxLimit'] = this.maxLimit.toJson(); + } + return data; + } +} diff --git a/lib/core/service/client/base_app_client.dart b/lib/core/service/client/base_app_client.dart index abca9e5d..2e0dec60 100644 --- a/lib/core/service/client/base_app_client.dart +++ b/lib/core/service/client/base_app_client.dart @@ -128,8 +128,8 @@ class BaseAppClient { // body['IdentificationNo'] = 2076117163; // body['MobileNo'] = "966503109207"; - // body['PatientID'] = 3114694; //3844083 - // body['TokenID'] = "@dm!n"; + body['PatientID'] = 3628809; //3844083 + body['TokenID'] = "@dm!n"; // Patient ID: 3027574 // Mobile no.: 0502303285 diff --git a/lib/core/service/hospital_service.dart b/lib/core/service/hospital_service.dart index 46bc95f9..a8fa2978 100644 --- a/lib/core/service/hospital_service.dart +++ b/lib/core/service/hospital_service.dart @@ -1,8 +1,15 @@ +import 'dart:io'; + import 'package:diplomaticquarterapp/config/config.dart'; import 'package:diplomaticquarterapp/config/shared_pref_kay.dart'; import 'package:diplomaticquarterapp/core/model/hospitals/hospitals_model.dart'; import 'package:diplomaticquarterapp/core/service/base_service.dart'; +import 'package:diplomaticquarterapp/services/permission/permission_service.dart'; +import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; +import 'package:diplomaticquarterapp/uitl/utils.dart'; +import 'package:flutter/material.dart'; import 'package:geolocator/geolocator.dart'; +import 'package:progress_hud_v2/generated/i18n.dart'; class HospitalService extends BaseService { List _hospitals = List(); @@ -13,26 +20,46 @@ class HospitalService extends BaseService { double _longitude; _getCurrentLocation() async { - await Geolocator.getLastKnownPosition().then((value) { - _latitude = value.latitude; - _longitude = value.longitude; - }).catchError((e) { - _longitude = 0; - _latitude = 0; - }); + if (await PermissionService.isLocationEnabled()) { + Geolocator.getLastKnownPosition().then((value) { + _latitude = value.latitude; + _longitude = value.longitude; + }).catchError((e) { + _longitude = 0; + _latitude = 0; + }); + } else { + if (Platform.isAndroid) { + Utils.showPermissionConsentDialog(AppGlobal.context, TranslationBase.of(AppGlobal.context).locationPermissionDialog, () { + Geolocator.getLastKnownPosition().then((value) { + _latitude = value.latitude; + _longitude = value.longitude; + }).catchError((e) { + _longitude = 0; + _latitude = 0; + }); + }); + } else { + Geolocator.getLastKnownPosition().then((value) { + _latitude = value.latitude; + _longitude = value.longitude; + }).catchError((e) { + _longitude = 0; + _latitude = 0; + }); + } + } } Future getHospitals({bool isResBasedOnLoc = true}) async { - if(isResBasedOnLoc) - await _getCurrentLocation(); + if (isResBasedOnLoc) await _getCurrentLocation(); Map body = Map(); body['Latitude'] = await this.sharedPref.getDouble(USER_LAT); body['Longitude'] = await this.sharedPref.getDouble(USER_LONG); body['IsOnlineCheckIn'] = isResBasedOnLoc; body['PatientOutSA'] = 0; - await baseAppClient.post(GET_PROJECT, - onSuccess: (dynamic response, int statusCode) { + await baseAppClient.post(GET_PROJECT, onSuccess: (dynamic response, int statusCode) { _hospitals.clear(); response['ListProject'].forEach((hospital) { _hospitals.add(HospitalsModel.fromJson(hospital)); @@ -42,5 +69,4 @@ class HospitalService extends BaseService { super.error = error; }, body: body); } - } diff --git a/lib/core/viewModels/qr_view_model.dart b/lib/core/viewModels/qr_view_model.dart index da597a0b..3c14e195 100644 --- a/lib/core/viewModels/qr_view_model.dart +++ b/lib/core/viewModels/qr_view_model.dart @@ -1,11 +1,16 @@ import 'dart:convert'; +import 'dart:io'; import 'package:barcode_scan2/barcode_scan2.dart'; +import 'package:diplomaticquarterapp/config/config.dart'; import 'package:diplomaticquarterapp/config/shared_pref_kay.dart'; import 'package:diplomaticquarterapp/core/enum/viewstate.dart'; import 'package:diplomaticquarterapp/core/model/qr/qr_parking_model.dart'; import 'package:diplomaticquarterapp/core/service/qr_service.dart'; import 'package:diplomaticquarterapp/core/viewModels/base_view_model.dart'; +import 'package:diplomaticquarterapp/services/permission/permission_service.dart'; +import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; +import 'package:diplomaticquarterapp/uitl/utils.dart'; import '../../locator.dart'; @@ -16,7 +21,7 @@ class QrViewModel extends BaseViewModel { readQr() async { //TODO fix the barcode scan - String result = (await BarcodeScanner.scan())?.rawContent; + String result = await readQR(); var data = json.decode(result); var qRParkingID = data['QRParkingID']; setState(ViewState.BusyLocal); @@ -37,6 +42,20 @@ class QrViewModel extends BaseViewModel { } } + readQR() async { + if (await PermissionService.isCameraEnabled()) { + return (await BarcodeScanner.scan())?.rawContent; + } else { + if (Platform.isAndroid) { + Utils.showPermissionConsentDialog(AppGlobal.context, TranslationBase.of(AppGlobal.context).cameraPermissionDialog, () async { + return (await BarcodeScanner.scan())?.rawContent; + }); + } else { + return (await BarcodeScanner.scan())?.rawContent; + } + } + } + getIsSaveParking() async { setState(ViewState.Busy); var parking = await sharedPref.getObject(IS_GO_TO_PARKING); diff --git a/lib/pages/AlHabibMedicalService/ComprehensiveMedicalCheckup/NewCMC/new_cmc_page.dart b/lib/pages/AlHabibMedicalService/ComprehensiveMedicalCheckup/NewCMC/new_cmc_page.dart index 4a7f33f0..b6dfde7a 100644 --- a/lib/pages/AlHabibMedicalService/ComprehensiveMedicalCheckup/NewCMC/new_cmc_page.dart +++ b/lib/pages/AlHabibMedicalService/ComprehensiveMedicalCheckup/NewCMC/new_cmc_page.dart @@ -59,7 +59,7 @@ class _NewCMCPageState extends State with TickerProviderStateMixin { _controller = new PageController(); - _getCurrentLocation(); + // _getCurrentLocation(); } _getCurrentLocation() async { diff --git a/lib/pages/AlHabibMedicalService/ComprehensiveMedicalCheckup/NewCMC/new_cmc_step_tow_page.dart b/lib/pages/AlHabibMedicalService/ComprehensiveMedicalCheckup/NewCMC/new_cmc_step_tow_page.dart index 42c8186a..ae3be830 100644 --- a/lib/pages/AlHabibMedicalService/ComprehensiveMedicalCheckup/NewCMC/new_cmc_step_tow_page.dart +++ b/lib/pages/AlHabibMedicalService/ComprehensiveMedicalCheckup/NewCMC/new_cmc_step_tow_page.dart @@ -1,14 +1,16 @@ import 'dart:async'; +import 'dart:io'; import 'package:diplomaticquarterapp/config/shared_pref_kay.dart'; import 'package:diplomaticquarterapp/core/model/AlHabibMedicalService/ComprehensiveMedicalCheckup/cmc_insert_pres_order_request_model.dart'; import 'package:diplomaticquarterapp/core/model/ImagesInfo.dart'; import 'package:diplomaticquarterapp/core/service/AlHabibMedicalService/customer_addresses_service.dart'; import 'package:diplomaticquarterapp/core/viewModels/AlHabibMedicalService/cmc_view_model.dart'; -import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; +import 'package:diplomaticquarterapp/services/permission/permission_service.dart'; import 'package:diplomaticquarterapp/theme/colors.dart'; import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; +import 'package:diplomaticquarterapp/uitl/utils.dart'; import 'package:diplomaticquarterapp/uitl/utils_new.dart'; import 'package:diplomaticquarterapp/widgets/app_map/google_huawei_map.dart'; import 'package:diplomaticquarterapp/widgets/buttons/secondary_button.dart'; @@ -20,7 +22,6 @@ import 'package:geolocator/geolocator.dart'; import 'package:google_maps_flutter/google_maps_flutter.dart'; import 'package:google_maps_place_picker/google_maps_place_picker.dart'; import 'package:permission_handler/permission_handler.dart'; -import 'package:provider/provider.dart'; import 'cmc_location_page.dart'; import 'new_cmc_step_three_page.dart'; @@ -61,24 +62,31 @@ class _NewCMCStepTowPageState extends State { currentPostion = LatLng(lat, long); setMap(); } else { - if (await Permission.location.request().isGranted) { - var position = await GeolocatorPlatform.instance.getCurrentPosition(desiredAccuracy: LocationAccuracy.low); - currentPostion = LatLng(position.latitude, position.longitude); - latitude = position.latitude; - longitude = position.longitude; - setMap(); + if (await PermissionService.isLocationEnabled()) { + Geolocator.getLastKnownPosition().then((value) { + latitude = value.latitude; + longitude = value.longitude; + currentPostion = LatLng(latitude, longitude); + setMap(); + }); } else { - requestPermissions().then( - (value) async { - if (value[Permission.location].isGranted) { - var position = await GeolocatorPlatform.instance.getCurrentPosition(desiredAccuracy: LocationAccuracy.low); - currentPostion = LatLng(position.latitude, position.longitude); - latitude = position.latitude; - longitude = position.longitude; + if (Platform.isAndroid) { + Utils.showPermissionConsentDialog(context, TranslationBase.of(context).locationPermissionDialog, () { + Geolocator.getLastKnownPosition().then((value) { + latitude = value.latitude; + longitude = value.longitude; + currentPostion = LatLng(latitude, longitude); setMap(); - } - }, - ); + }); + }); + } else { + Geolocator.getLastKnownPosition().then((value) { + latitude = value.latitude; + longitude = value.longitude; + currentPostion = LatLng(latitude, longitude); + setMap(); + }); + } } } } diff --git a/lib/pages/AlHabibMedicalService/E-Referral/New_E_Referral/new_e_referral_step_three_page.dart b/lib/pages/AlHabibMedicalService/E-Referral/New_E_Referral/new_e_referral_step_three_page.dart index cf6428c8..7bacad65 100644 --- a/lib/pages/AlHabibMedicalService/E-Referral/New_E_Referral/new_e_referral_step_three_page.dart +++ b/lib/pages/AlHabibMedicalService/E-Referral/New_E_Referral/new_e_referral_step_three_page.dart @@ -328,7 +328,6 @@ class _NewEReferralStepThreePageState extends State { ImageOptions.showImageOptions(context, (String image, File file) { setState(() { EReferralAttachment eReferralAttachment = new EReferralAttachment(fileName: 'image ${medicalReportImages.length + 1}.png', base64String: image); - insuredPatientImages = [eReferralAttachment]; }); }); diff --git a/lib/pages/AlHabibMedicalService/HomeHealthCare/NewHomeHealthCare/new_Home_health_care_step_tow_page.dart b/lib/pages/AlHabibMedicalService/HomeHealthCare/NewHomeHealthCare/new_Home_health_care_step_tow_page.dart index a872acee..8614f521 100644 --- a/lib/pages/AlHabibMedicalService/HomeHealthCare/NewHomeHealthCare/new_Home_health_care_step_tow_page.dart +++ b/lib/pages/AlHabibMedicalService/HomeHealthCare/NewHomeHealthCare/new_Home_health_care_step_tow_page.dart @@ -1,14 +1,16 @@ import 'dart:async'; +import 'dart:io'; import 'package:diplomaticquarterapp/config/shared_pref_kay.dart'; import 'package:diplomaticquarterapp/core/model/AlHabibMedicalService/HomeHealthCare/patient_er_insert_pres_order_request_model.dart'; import 'package:diplomaticquarterapp/core/service/AlHabibMedicalService/customer_addresses_service.dart'; import 'package:diplomaticquarterapp/core/viewModels/AlHabibMedicalService/home_health_care_view_model.dart'; import 'package:diplomaticquarterapp/pages/AlHabibMedicalService/HomeHealthCare/NewHomeHealthCare/new_Home_health_care_step_three_page.dart'; -import 'package:diplomaticquarterapp/pages/BookAppointment/widgets/reminder_dialog.dart'; +import 'package:diplomaticquarterapp/services/permission/permission_service.dart'; import 'package:diplomaticquarterapp/theme/colors.dart'; import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; +import 'package:diplomaticquarterapp/uitl/utils.dart'; import 'package:diplomaticquarterapp/uitl/utils_new.dart'; import 'package:diplomaticquarterapp/widgets/app_map/google_huawei_map.dart'; import 'package:diplomaticquarterapp/widgets/buttons/defaultButton.dart'; @@ -20,7 +22,6 @@ import 'package:flutter/material.dart'; import 'package:geolocator/geolocator.dart'; import 'package:google_maps_flutter/google_maps_flutter.dart'; import 'package:google_maps_place_picker/google_maps_place_picker.dart'; -import 'package:permission_handler/permission_handler.dart'; import 'location_page.dart'; @@ -78,24 +79,30 @@ class _NewHomeHealthCareStepTowPageState extends State with Tick void initState() { super.initState(); _controller = new PageController(); - _getCurrentLocation(); + // _getCurrentLocation(); } _getCurrentLocation() async { - await Geolocator.getLastKnownPosition().then((value) { - _latitude = value.latitude; - _longitude = value.longitude; - }).catchError((e) { - _longitude = 0; - _latitude = 0; - }); + if (await PermissionService.isLocationEnabled()) { + Geolocator.getLastKnownPosition().then((value) { + _latitude = value.latitude; + _longitude = value.longitude; + }).catchError((e) { + _longitude = 0; + _latitude = 0; + }); + } else { + if (Platform.isAndroid) { + Utils.showPermissionConsentDialog(context, TranslationBase.of(context).locationPermissionDialog, () { + Geolocator.getLastKnownPosition().then((value) { + _latitude = value.latitude; + _longitude = value.longitude; + }).catchError((e) { + _longitude = 0; + _latitude = 0; + }); + }); + } else { + Geolocator.getLastKnownPosition().then((value) { + _latitude = value.latitude; + _longitude = value.longitude; + }).catchError((e) { + _longitude = 0; + _latitude = 0; + }); + } + } + + // await Geolocator.getLastKnownPosition().then((value) { + // _latitude = value.latitude; + // _longitude = value.longitude; + // }).catchError((e) { + // _longitude = 0; + // _latitude = 0; + // }); } @override diff --git a/lib/pages/AlHabibMedicalService/all_habib_medical_service_page2.dart b/lib/pages/AlHabibMedicalService/all_habib_medical_service_page2.dart index fa4751e1..5d0694ed 100644 --- a/lib/pages/AlHabibMedicalService/all_habib_medical_service_page2.dart +++ b/lib/pages/AlHabibMedicalService/all_habib_medical_service_page2.dart @@ -1,3 +1,5 @@ +import 'dart:io'; + import 'package:diplomaticquarterapp/config/shared_pref_kay.dart'; import 'package:diplomaticquarterapp/core/service/weather_service.dart'; import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; @@ -5,10 +7,12 @@ import 'package:diplomaticquarterapp/models/Authentication/authenticated_user.da import 'package:diplomaticquarterapp/models/hmg_services.dart'; import 'package:diplomaticquarterapp/pages/landing/widgets/services_view.dart'; import 'package:diplomaticquarterapp/services/authentication/auth_provider.dart'; +import 'package:diplomaticquarterapp/services/permission/permission_service.dart'; import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart'; import 'package:diplomaticquarterapp/uitl/date_uitl.dart'; import 'package:diplomaticquarterapp/uitl/location_util.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; +import 'package:diplomaticquarterapp/uitl/utils.dart'; import 'package:diplomaticquarterapp/uitl/utils_new.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; import 'package:diplomaticquarterapp/widgets/transitions/fade_page.dart'; @@ -40,10 +44,22 @@ class _AllHabibMedicalSevicePage2State extends State super.initState(); WidgetsBinding.instance.addPostFrameCallback((timeStamp) { locationUtils = new LocationUtils(isShowConfirmDialog: true, context: context); - WidgetsBinding.instance.addPostFrameCallback((_) => {Geolocator.getLastKnownPosition().then((value) => setLocation(value))}); + WidgetsBinding.instance.addPostFrameCallback((_) async => { + if (await PermissionService.isLocationEnabled()) + {Geolocator.getLastKnownPosition().then((value) => setLocation(value))} + else + { + if (Platform.isAndroid) + { + Utils.showPermissionConsentDialog(context, TranslationBase.of(context).locationPermissionDialog, () { + Geolocator.getLastKnownPosition().then((value) => setLocation(value)); + }) + } + else + {Geolocator.getLastKnownPosition().then((value) => setLocation(value))} + } + }); }); - // getPatientAppointmentHistory1(); - // getFamilyFiles(); } initialiseHmgServices(bool isLogin) { diff --git a/lib/pages/BookAppointment/BookSuccess.dart b/lib/pages/BookAppointment/BookSuccess.dart index 6f65eb25..e7db06e4 100644 --- a/lib/pages/BookAppointment/BookSuccess.dart +++ b/lib/pages/BookAppointment/BookSuccess.dart @@ -506,7 +506,7 @@ class _BookSuccessState extends State { appo.projectName = widget.patientShareResponse.projectName; appo.appointmentNo = widget.patientShareResponse.appointmentNo; - Navigator.push(context, FadePage(page: PaymentMethod(onSelectedMethod: (String metohd) { + Navigator.push(context, FadePage(page: PaymentMethod(onSelectedMethod: (String metohd, [String selectedInstallmentPlan]) { setState(() {}); }))).then((value) { if (value != null) { @@ -516,7 +516,7 @@ class _BookSuccessState extends State { }); } - openPayment(String paymentMethod, AuthenticatedUser authenticatedUser, double amount, PatientShareResponse patientShareResponse, AppoitmentAllHistoryResultList appo) async { + openPayment(List paymentMethod, AuthenticatedUser authenticatedUser, double amount, PatientShareResponse patientShareResponse, AppoitmentAllHistoryResultList appo) async { widget.browser = new MyInAppBrowser(onExitCallback: onBrowserExit, appo: appo, onLoadStartCallback: onBrowserLoadStart, context: context); widget.browser.openPaymentBrowser( @@ -525,7 +525,7 @@ class _BookSuccessState extends State { Utils.getAppointmentTransID(appo.projectID, appo.clinicID, appo.appointmentNo), appo.projectID.toString(), authenticatedUser.emailAddress, - paymentMethod, + paymentMethod[0], authenticatedUser.patientType, authenticatedUser.firstName, authenticatedUser.patientID, @@ -537,7 +537,8 @@ class _BookSuccessState extends State { widget.patientShareResponse.appointmentDate, widget.patientShareResponse.appointmentNo, widget.patientShareResponse.clinicID, - widget.patientShareResponse.doctorID); + widget.patientShareResponse.doctorID, + paymentMethod[1]); // } } @@ -575,7 +576,8 @@ class _BookSuccessState extends State { String amount = res['Amount']; String payment_method = res['PaymentMethod']; final currency = projectViewModel.user.outSA == 0 ? "sar" : 'aed'; - projectViewModel.analytics.appointment.payment_success(appointment_type: 'regular', payment_method: payment_method, clinic: appo.clinicName, hospital: appo.projectName, txn_amount: "$amount", txn_currency: currency, txn_number: txn_ref); + projectViewModel.analytics.appointment.payment_success( + appointment_type: 'regular', payment_method: payment_method, clinic: appo.clinicName, hospital: appo.projectName, txn_amount: "$amount", txn_currency: currency, txn_number: txn_ref); createAdvancePayment(res, appo); } else { GifLoaderDialogUtils.hideDialog(context); diff --git a/lib/pages/BookAppointment/widgets/reminder_dialog.dart b/lib/pages/BookAppointment/widgets/reminder_dialog.dart index eece4d9f..3e6c0450 100644 --- a/lib/pages/BookAppointment/widgets/reminder_dialog.dart +++ b/lib/pages/BookAppointment/widgets/reminder_dialog.dart @@ -1,8 +1,12 @@ +import 'dart:io'; + import 'package:diplomaticquarterapp/analytics/google-analytics.dart'; import 'package:diplomaticquarterapp/locator.dart'; +import 'package:diplomaticquarterapp/services/permission/permission_service.dart'; import 'package:diplomaticquarterapp/theme/colors.dart'; import 'package:diplomaticquarterapp/uitl/CalendarUtils.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; +import 'package:diplomaticquarterapp/uitl/utils.dart'; import 'package:diplomaticquarterapp/uitl/utils_new.dart'; import 'package:diplomaticquarterapp/widgets/buttons/defaultButton.dart'; import 'package:flutter/material.dart'; @@ -17,16 +21,23 @@ Future> requestPermissions() async { showReminderDialog(BuildContext context, DateTime dateTime, String doctorName, String eventId, String appoDateFormatted, String appoTimeFormatted, {Function onSuccess, String title, String description, Function(int) onMultiDateSuccess}) async { - if (await Permission.calendar.request().isGranted) { - _showReminderDialog(context, dateTime, doctorName, eventId, appoDateFormatted, appoTimeFormatted, - onSuccess: onSuccess, title: title, description: description, onMultiDateSuccess: onMultiDateSuccess); + if (Platform.isAndroid) { + if (await PermissionService.isCameraEnabled()) { + _showReminderDialog(context, dateTime, doctorName, eventId, appoDateFormatted, appoTimeFormatted, + onSuccess: onSuccess, title: title, description: description, onMultiDateSuccess: onMultiDateSuccess); + } else { + Utils.showPermissionConsentDialog(context, TranslationBase.of(context).calendarPermission, () async { + if (await Permission.calendar.request().isGranted) { + _showReminderDialog(context, dateTime, doctorName, eventId, appoDateFormatted, appoTimeFormatted, + onSuccess: onSuccess, title: title, description: description, onMultiDateSuccess: onMultiDateSuccess); + } + }); + } } else { - requestPermissions().then((results) { - if (results[Permission.calendar].isGranted) { - _showReminderDialog(context, dateTime, doctorName, eventId, appoDateFormatted, appoTimeFormatted, - onSuccess: onSuccess, title: title, description: description, onMultiDateSuccess: onMultiDateSuccess); - } - }); + if (await Permission.calendar.request().isGranted) { + _showReminderDialog(context, dateTime, doctorName, eventId, appoDateFormatted, appoTimeFormatted, + onSuccess: onSuccess, title: title, description: description, onMultiDateSuccess: onMultiDateSuccess); + } } } diff --git a/lib/pages/Covid-DriveThru/covid-payment-summary.dart b/lib/pages/Covid-DriveThru/covid-payment-summary.dart index 84126109..3c8c95b9 100644 --- a/lib/pages/Covid-DriveThru/covid-payment-summary.dart +++ b/lib/pages/Covid-DriveThru/covid-payment-summary.dart @@ -27,6 +27,7 @@ class CovidPaymentSummary extends StatefulWidget { PatientShareResponse patientShareResponse; String selectedPaymentMethod; + String selectedInstallmentPlan; MyInAppBrowser browser; AuthenticatedUser authenticatedUser; AppSharedPreferences sharedPref = AppSharedPreferences(); @@ -104,8 +105,9 @@ class _CovidPaymentSummaryState extends State { InkWell( onTap: () { showDraggableDialog(context, PaymentMethod( - onSelectedMethod: (String metohd) { + onSelectedMethod: (String metohd, [String selectedInstallmentPlan]) { widget.selectedPaymentMethod = metohd; + widget.selectedInstallmentPlan = selectedInstallmentPlan; setState(() {}); }, )); @@ -226,7 +228,9 @@ class _CovidPaymentSummaryState extends State { widget.patientShareResponse.appointmentDate, widget.patientShareResponse.appointmentNo, widget.patientShareResponse.clinicID, - widget.patientShareResponse.doctorID); + widget.patientShareResponse.doctorID, + widget.selectedInstallmentPlan + ); } onBrowserLoadStart(String url) { @@ -352,6 +356,9 @@ class _CovidPaymentSummaryState extends State { case "ApplePay": return 'assets/images/new/payment/Apple_Pay.png'; break; + case "TAMARA": + return 'assets/images/new/payment/tamara.png'; + break; } return 'assets/images/new/payment/Mada.png'; diff --git a/lib/pages/ToDoList/ToDo.dart b/lib/pages/ToDoList/ToDo.dart index da90ffc3..41a22c0b 100644 --- a/lib/pages/ToDoList/ToDo.dart +++ b/lib/pages/ToDoList/ToDo.dart @@ -130,263 +130,270 @@ class _ToDoState extends State with SingleTickerProviderStateMixin { controller: _tabController, children: [ Container( - child: widget.appoList.length != 0 ? ListView.builder( - scrollDirection: Axis.vertical, - shrinkWrap: true, - physics: ScrollPhysics(), - padding: EdgeInsets.all(0.0), - itemCount: widget.appoList.length, - itemBuilder: (context, index) { - return Container( - width: double.infinity, - margin: EdgeInsets.only(left: 12.0, right: 12.0, top: 12.0), - decoration: cardRadius(12), - padding: EdgeInsets.all(16), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Row( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Padding( - padding: const EdgeInsets.only(top: 4.0), - child: widget.appoList[index].clinicID == 265 - ? Container( - margin: EdgeInsets.only(left: 5.0, right: 5.0), - child: SvgPicture.asset("assets/images/new/CoronaIcon.svg", width: 35.0, height: 35.0), - ) - : widget.appoList[index].isLiveCareAppointment - ? SvgPicture.asset("assets/images/new/virtual.svg") - : SvgPicture.asset("assets/images/new/hospital-visit.svg"), - - // SvgPicture.asset("assets/images/new/virtual.svg"), - ), - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Padding( - padding: const EdgeInsets.only(left: 8.0, right: 8.0), - child: Text( - widget.appoList[index].clinicID == 265 - ? TranslationBase.of(context).covidTestTodo - : widget.appoList[index].isLiveCareAppointment - ? TranslationBase.of(context).liveCareAppo - : TranslationBase.of(context).walkinAppo, - style: TextStyle(fontSize: 12, fontWeight: FontWeight.w600, color: Color(0xff2B353E), letterSpacing: -0.48)), - ), - Padding( - padding: const EdgeInsets.only(left: 8.0, right: 8.0), - child: CountdownTimer( - controller: new CountdownTimerController(endTime: DateTime.now().millisecondsSinceEpoch + (widget.appoList[index].remaniningHoursTocanPay * 1000) * 60), - widgetBuilder: (_, CurrentRemainingTime time) { - return time != null - ? Text( - '${time.days != null ? time.days : "0"}:${time.hours != null ? time.hours.toString().length == 1 ? "0" + time.hours.toString() : time.hours : "00"}:${time.min}:${time.sec} ' + - TranslationBase.of(context).upcomingTimeLeft, - style: TextStyle(fontSize: 12, fontWeight: FontWeight.w600, color: CustomColors.accentColor, letterSpacing: -0.48)) - : Container(); - }, + child: widget.appoList.length != 0 + ? ListView.builder( + scrollDirection: Axis.vertical, + shrinkWrap: true, + physics: ScrollPhysics(), + padding: EdgeInsets.all(0.0), + itemCount: widget.appoList.length, + itemBuilder: (context, index) { + return Container( + width: double.infinity, + margin: EdgeInsets.only(left: 12.0, right: 12.0, top: 12.0), + decoration: cardRadius(12), + padding: EdgeInsets.all(16), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: const EdgeInsets.only(top: 4.0), + child: widget.appoList[index].clinicID == 265 + ? Container( + margin: EdgeInsets.only(left: 5.0, right: 5.0), + child: SvgPicture.asset("assets/images/new/CoronaIcon.svg", width: 35.0, height: 35.0), + ) + : widget.appoList[index].isLiveCareAppointment + ? SvgPicture.asset("assets/images/new/virtual.svg") + : SvgPicture.asset("assets/images/new/hospital-visit.svg"), + + // SvgPicture.asset("assets/images/new/virtual.svg"), ), - ), - ], - ), - ], - ), - Container( - child: InkWell( - onTap: () { - performNextAction(widget.appoList[index]); - }, - child: Container( - padding: EdgeInsets.symmetric(vertical: 8, horizontal: 14), - decoration: BoxDecoration( - color: getNextActionButtonColor(widget.appoList[index].nextAction), - border: Border.all(color: Colors.white, width: 1), - borderRadius: BorderRadius.circular(6), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: const EdgeInsets.only(left: 8.0, right: 8.0), + child: Text( + widget.appoList[index].clinicID == 265 + ? TranslationBase.of(context).covidTestTodo + : widget.appoList[index].isLiveCareAppointment + ? TranslationBase.of(context).liveCareAppo + : TranslationBase.of(context).walkinAppo, + style: TextStyle(fontSize: 12, fontWeight: FontWeight.w600, color: Color(0xff2B353E), letterSpacing: -0.48)), + ), + Padding( + padding: const EdgeInsets.only(left: 8.0, right: 8.0), + child: CountdownTimer( + controller: + new CountdownTimerController(endTime: DateTime.now().millisecondsSinceEpoch + (widget.appoList[index].remaniningHoursTocanPay * 1000) * 60), + widgetBuilder: (_, CurrentRemainingTime time) { + return time != null + ? Text( + '${time.days != null ? time.days : "0"}:${time.hours != null ? time.hours.toString().length == 1 ? "0" + time.hours.toString() : time.hours : "00"}:${time.min}:${time.sec} ' + + TranslationBase.of(context).upcomingTimeLeft, + style: TextStyle(fontSize: 12, fontWeight: FontWeight.w600, color: CustomColors.accentColor, letterSpacing: -0.48)) + : Container(); + }, + ), + ), + ], + ), + ], ), - child: Text( - getNextActionText(widget.appoList[index].nextAction), - style: TextStyle(fontSize: 12, fontWeight: FontWeight.w600, color: Colors.white, letterSpacing: -0.4), + Container( + child: InkWell( + onTap: () { + performNextAction(widget.appoList[index]); + }, + child: Container( + padding: EdgeInsets.symmetric(vertical: 8, horizontal: 14), + decoration: BoxDecoration( + color: getNextActionButtonColor(widget.appoList[index].nextAction), + border: Border.all(color: Colors.white, width: 1), + borderRadius: BorderRadius.circular(6), + ), + child: Text( + getNextActionText(widget.appoList[index].nextAction), + style: TextStyle(fontSize: 12, fontWeight: FontWeight.w600, color: Colors.white, letterSpacing: -0.4), + ), + ), + ), ), + ], + ), + Padding( + padding: const EdgeInsets.only(top: 8.0), + child: Text( + widget.appoList[index].doctorTitle + " " + widget.appoList[index].doctorNameObj, + style: TextStyle(fontSize: 16, fontWeight: FontWeight.w600, color: Color(0xff2E303A), letterSpacing: -0.64, height: 25 / 16), ), ), - ), - ], - ), - Padding( - padding: const EdgeInsets.only(top: 8.0), - child: Text( - widget.appoList[index].doctorTitle + " " + widget.appoList[index].doctorNameObj, - style: TextStyle(fontSize: 16, fontWeight: FontWeight.w600, color: Color(0xff2E303A), letterSpacing: -0.64, height: 25 / 16), - ), - ), - Row( - mainAxisSize: MainAxisSize.min, - children: [ - LargeAvatar( - name: widget.appoList[index].doctorTitle + " " + widget.appoList[index].doctorNameObj, - url: widget.appoList[index].doctorImageURL, - width: 52, - height: 52, - ), - SizedBox(width: 11), - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + Row( mainAxisSize: MainAxisSize.min, children: [ - MyRichText(TranslationBase.of(context).clinic + ": ", widget.appoList[index].clinicName, projectViewModel.isArabic), - MyRichText(TranslationBase.of(context).appointmentDate + ": ", - DateUtil.getDayMonthYearHourMinuteDateFormatted(DateUtil.convertStringToDate(widget.appoList[index].appointmentDate)), projectViewModel.isArabic), - MyRichText(TranslationBase.of(context).branch, widget.appoList[index].projectName, projectViewModel.isArabic), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - mainAxisSize: MainAxisSize.max, - children: [ - RatingBar.readOnly( - initialRating: widget.appoList[index].actualDoctorRate.toDouble(), - size: 16.0, - filledColor: Color(0XFFD02127), - emptyColor: Color(0XFFD02127), - isHalfAllowed: true, - halfFilledIcon: Icons.star_half, - filledIcon: Icons.star, - emptyIcon: Icons.star_border, - ), - ], + LargeAvatar( + name: widget.appoList[index].doctorTitle + " " + widget.appoList[index].doctorNameObj, + url: widget.appoList[index].doctorImageURL, + width: 52, + height: 52, + ), + SizedBox(width: 11), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + MyRichText(TranslationBase.of(context).clinic + ": ", widget.appoList[index].clinicName, projectViewModel.isArabic), + MyRichText(TranslationBase.of(context).appointmentDate + ": ", + DateUtil.getDayMonthYearHourMinuteDateFormatted(DateUtil.convertStringToDate(widget.appoList[index].appointmentDate)), projectViewModel.isArabic), + MyRichText(TranslationBase.of(context).branch, widget.appoList[index].projectName, projectViewModel.isArabic), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + mainAxisSize: MainAxisSize.max, + children: [ + RatingBar.readOnly( + initialRating: widget.appoList[index].actualDoctorRate.toDouble(), + size: 16.0, + filledColor: Color(0XFFD02127), + emptyColor: Color(0XFFD02127), + isHalfAllowed: true, + halfFilledIcon: Icons.star_half, + filledIcon: Icons.star, + emptyIcon: Icons.star_border, + ), + ], + ), + ], + ), ), ], ), - ), - ], - ), - Padding( - padding: const EdgeInsets.only(top: 12.0), - child: Text( - getNextActionDescription(widget.appoList[index].nextAction), - style: TextStyle(fontSize: 10, fontWeight: FontWeight.w600, color: Color(0xff2E303A), letterSpacing: -0.48, height: 25 / 16), - ), - ), - InkWell( - onTap: () { - navigateToAppointmentDetails(context, widget.appoList[index]); - }, - child: Padding( - padding: const EdgeInsets.only(top: 0.0), - child: Text( - TranslationBase.of(context).moreDetails, - style: TextStyle( - fontSize: 10, fontWeight: FontWeight.w600, color: CustomColors.accentColor, letterSpacing: -0.48, height: 25 / 16, decoration: TextDecoration.underline), - ), - ), - ), - ], - ), - ); - }, - ) : getNoDataWidget(context), - ), - Container( - child: widget.obGyneAppoList.length != 0 ? ListView.builder( - scrollDirection: Axis.vertical, - shrinkWrap: true, - physics: ScrollPhysics(), - padding: EdgeInsets.all(0.0), - itemCount: widget.obGyneAppoList.length, - itemBuilder: (context, index) { - return Container( - width: double.infinity, - margin: EdgeInsets.only(left: 12.0, right: 12.0, top: 12.0), - decoration: cardRadius(12), - padding: EdgeInsets.all(16), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Row( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Padding( - padding: const EdgeInsets.only(top: 0.0), - child: Container( - margin: EdgeInsets.only(left: 5.0, right: 5.0), - child: SvgPicture.asset("assets/images/new/ultrasound.svg", width: 20.0, height: 20.0), - ), - ), - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Padding( - padding: const EdgeInsets.only(left: 8.0, right: 8.0), - child: Text(TranslationBase.of(context).walkinAppo, - style: TextStyle(fontSize: 12, fontWeight: FontWeight.w600, color: Color(0xff2B353E), letterSpacing: -0.48)), - ), - ], + Padding( + padding: const EdgeInsets.only(top: 12.0), + child: Text( + getNextActionDescription(widget.appoList[index].nextAction), + style: TextStyle(fontSize: 10, fontWeight: FontWeight.w600, color: Color(0xff2E303A), letterSpacing: -0.48, height: 25 / 16), ), - ], - ), - Container( - child: InkWell( + ), + InkWell( onTap: () { - getOBGyneDoctorsList(widget.obGyneAppoList[index].projectID, widget.obGyneAppoList[index].setupID, widget.obGyneAppoList[index]); + navigateToAppointmentDetails(context, widget.appoList[index]); }, - child: Container( - padding: EdgeInsets.symmetric(vertical: 8, horizontal: 14), - decoration: BoxDecoration( - color: CustomColors.green, - border: Border.all(color: Colors.white, width: 1), - borderRadius: BorderRadius.circular(6), - ), + child: Padding( + padding: const EdgeInsets.only(top: 0.0), child: Text( - TranslationBase.of(context).bookNow, - style: TextStyle(fontSize: 12, fontWeight: FontWeight.w600, color: Colors.white, letterSpacing: -0.4), + TranslationBase.of(context).moreDetails, + style: TextStyle( + fontSize: 10, fontWeight: FontWeight.w600, color: CustomColors.accentColor, letterSpacing: -0.48, height: 25 / 16, decoration: TextDecoration.underline), ), ), ), - ), - ], - ), - Padding( - padding: const EdgeInsets.only(top: 8.0), - child: Text( - TranslationBase.of(context).dr + " " + widget.obGyneAppoList[index].doctorName, - style: TextStyle(fontSize: 16, fontWeight: FontWeight.w600, color: Color(0xff2E303A), letterSpacing: -0.64, height: 25 / 16), + ], ), - ), - Row( - mainAxisSize: MainAxisSize.min, - children: [ - LargeAvatar( - name: TranslationBase.of(context).dr + " " + widget.obGyneAppoList[index].doctorName, - url: "https://hmgwebservices.com/Images/MobileImages/DUBAI/unkown.png", - width: 52, - height: 52, - ), - SizedBox(width: 11), - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + ); + }, + ) + : getNoDataWidget(context), + ), + Container( + child: widget.obGyneAppoList.length != 0 + ? ListView.builder( + scrollDirection: Axis.vertical, + shrinkWrap: true, + physics: ScrollPhysics(), + padding: EdgeInsets.all(0.0), + itemCount: widget.obGyneAppoList.length, + itemBuilder: (context, index) { + return Container( + width: double.infinity, + margin: EdgeInsets.only(left: 12.0, right: 12.0, top: 12.0), + decoration: cardRadius(12), + padding: EdgeInsets.all(16), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: const EdgeInsets.only(top: 0.0), + child: Container( + margin: EdgeInsets.only(left: 5.0, right: 5.0), + child: SvgPicture.asset("assets/images/new/ultrasound.svg", width: 20.0, height: 20.0), + ), + ), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: const EdgeInsets.only(left: 8.0, right: 8.0), + child: Text(TranslationBase.of(context).walkinAppo, + style: TextStyle(fontSize: 12, fontWeight: FontWeight.w600, color: Color(0xff2B353E), letterSpacing: -0.48)), + ), + ], + ), + ], + ), + Container( + child: InkWell( + onTap: () { + getOBGyneDoctorsList(widget.obGyneAppoList[index].projectID, widget.obGyneAppoList[index].setupID, widget.obGyneAppoList[index]); + }, + child: Container( + padding: EdgeInsets.symmetric(vertical: 8, horizontal: 14), + decoration: BoxDecoration( + color: CustomColors.green, + border: Border.all(color: Colors.white, width: 1), + borderRadius: BorderRadius.circular(6), + ), + child: Text( + TranslationBase.of(context).bookNow, + style: TextStyle(fontSize: 12, fontWeight: FontWeight.w600, color: Colors.white, letterSpacing: -0.4), + ), + ), + ), + ), + ], + ), + Padding( + padding: const EdgeInsets.only(top: 8.0), + child: Text( + TranslationBase.of(context).dr + " " + widget.obGyneAppoList[index].doctorName, + style: TextStyle(fontSize: 16, fontWeight: FontWeight.w600, color: Color(0xff2E303A), letterSpacing: -0.64, height: 25 / 16), + ), + ), + Row( mainAxisSize: MainAxisSize.min, children: [ - MyRichText(TranslationBase.of(context).clinic + ": ", widget.obGyneAppoList[index].clinicDescription, projectViewModel.isArabic), - MyRichText(TranslationBase.of(context).orderDate + ": ", - DateUtil.getDayMonthYearHourMinuteDateFormatted(DateUtil.convertStringToDate(widget.obGyneAppoList[index].orderDate)).split(" ")[0], projectViewModel.isArabic), - MyRichText(TranslationBase.of(context).branch, widget.obGyneAppoList[index].projectDescription, projectViewModel.isArabic), + LargeAvatar( + name: TranslationBase.of(context).dr + " " + widget.obGyneAppoList[index].doctorName, + url: "https://hmgwebservices.com/Images/MobileImages/DUBAI/unkown.png", + width: 52, + height: 52, + ), + SizedBox(width: 11), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + MyRichText(TranslationBase.of(context).clinic + ": ", widget.obGyneAppoList[index].clinicDescription, projectViewModel.isArabic), + MyRichText( + TranslationBase.of(context).orderDate + ": ", + DateUtil.getDayMonthYearHourMinuteDateFormatted(DateUtil.convertStringToDate(widget.obGyneAppoList[index].orderDate)).split(" ")[0], + projectViewModel.isArabic), + MyRichText(TranslationBase.of(context).branch, widget.obGyneAppoList[index].projectDescription, projectViewModel.isArabic), + ], + ), + ), ], ), - ), - ], - ), - ], - ), - ); - }, - ) : getNoDataWidget(context), + ], + ), + ); + }, + ) + : getNoDataWidget(context), ), ], ), @@ -701,7 +708,15 @@ class _ToDoState extends State with SingleTickerProviderStateMixin { } navigateToSearchResults(context, List docList, List patientDoctorAppointmentListHospital, OBGyneProcedureListResponse obGyneProcedureListResponse) { - Navigator.push(context, FadePage(page: SearchResults(isLiveCareAppointment: false, isObGyneAppointment: true, doctorsList: docList, patientDoctorAppointmentListHospital: patientDoctorAppointmentListHospital, obGyneProcedureListResponse: obGyneProcedureListResponse))); + Navigator.push( + context, + FadePage( + page: SearchResults( + isLiveCareAppointment: false, + isObGyneAppointment: true, + doctorsList: docList, + patientDoctorAppointmentListHospital: patientDoctorAppointmentListHospital, + obGyneProcedureListResponse: obGyneProcedureListResponse))); } getPatientAppointmentHistory() { @@ -821,7 +836,7 @@ class _ToDoState extends State with SingleTickerProviderStateMixin { }); } - openPayment(String paymentMethod, AuthenticatedUser authenticatedUser, double amount, PatientShareResponse patientShareResponse, AppoitmentAllHistoryResultList appo) { + openPayment(List paymentMethod, AuthenticatedUser authenticatedUser, double amount, PatientShareResponse patientShareResponse, AppoitmentAllHistoryResultList appo) { widget.browser = new MyInAppBrowser(onExitCallback: onBrowserExit, appo: appo, onLoadStartCallback: onBrowserLoadStart, context: context); widget.browser.openPaymentBrowser( @@ -830,7 +845,7 @@ class _ToDoState extends State with SingleTickerProviderStateMixin { Utils.getAppointmentTransID(appo.projectID, appo.clinicID, appo.appointmentNo), appo.projectID.toString(), authenticatedUser.emailAddress, - paymentMethod, + paymentMethod[0], authenticatedUser.patientType, authenticatedUser.firstName, authenticatedUser.patientID, @@ -842,12 +857,14 @@ class _ToDoState extends State with SingleTickerProviderStateMixin { appo.appointmentDate, appo.appointmentNo, appo.clinicID, - appo.doctorID); + appo.doctorID, + paymentMethod[1]); } onBrowserLoadStart(String url) { print("onBrowserLoadStart"); print(url); + // Uri myUri = Uri.parse(url); MyInAppBrowser.successURLS.forEach((element) { if (url.contains(element)) { @@ -929,13 +946,13 @@ class _ToDoState extends State with SingleTickerProviderStateMixin { } Future navigateToPaymentMethod(context, PatientShareResponse patientShareResponse, AppoitmentAllHistoryResultList appo) async { - Navigator.push(context, FadePage(page: PaymentMethod(onSelectedMethod: (String metohd) { + Navigator.push(context, FadePage(page: PaymentMethod(onSelectedMethod: (String metohd, [String selectedInstallmentPlan]) { setState(() {}); }))).then((value) { print(value); getPatientAppointmentHistory(); - if (value != null){ + if (value != null) { final appType = appo.isLiveCareAppointment ? 'livecare' : 'regular'; projectViewModel.analytics.appointment.payment_method(appointment_type: appType, clinic: appo.clinicName, payment_method: value, payment_type: 'appointment'); openPayment(value, projectViewModel.user, double.parse(patientShareResponse.patientShareWithTax.toString()), patientShareResponse, appo); diff --git a/lib/pages/ToDoList/payment_method_select.dart b/lib/pages/ToDoList/payment_method_select.dart index 97c6d3ce..c3af41a3 100644 --- a/lib/pages/ToDoList/payment_method_select.dart +++ b/lib/pages/ToDoList/payment_method_select.dart @@ -1,14 +1,14 @@ import 'dart:io'; -import 'package:diplomaticquarterapp/analytics/google-analytics.dart'; -import 'package:diplomaticquarterapp/locator.dart'; +import 'package:diplomaticquarterapp/core/model/my_balance/tamara_installment_details.dart'; +import 'package:diplomaticquarterapp/services/appointment_services/GetDoctorsList.dart'; import 'package:diplomaticquarterapp/theme/colors.dart'; +import 'package:diplomaticquarterapp/uitl/gif_loader_dialog_utils.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:diplomaticquarterapp/uitl/utils_new.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; -import 'package:pay/pay.dart'; class PaymentMethod extends StatefulWidget { Function onSelectedMethod; @@ -22,6 +22,8 @@ class PaymentMethod extends StatefulWidget { class _PaymentMethodState extends State { String selectedPaymentMethod = "MADA"; + TamaraInstallmentDetails tamaraInstallmentDetails; + String selectedInstallmentPlan; @override Widget build(BuildContext context) { @@ -190,6 +192,55 @@ class _PaymentMethodState extends State { ), ), ), + Container( + width: double.infinity, + child: InkWell( + onTap: () { + updateSelectedPaymentMethod("TAMARA"); + }, + child: Card( + elevation: 0.0, + margin: EdgeInsets.fromLTRB(8.0, 16.0, 8.0, 8.0), + color: Colors.white, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(10), + side: selectedPaymentMethod == "TAMARA" ? BorderSide(color: Colors.green, width: 2.0) : BorderSide(color: Colors.transparent, width: 0.0), + ), + child: Padding( + padding: const EdgeInsets.all(12.0), + child: Row( + children: [ + Container( + width: 24, + height: 24, + decoration: containerColorRadiusBorderWidth(selectedPaymentMethod == "TAMARA" ? CustomColors.accentColor : Colors.transparent, 100, Colors.grey, 0.5), + ), + mWidth(12), + Container( + height: 60.0, + padding: EdgeInsets.all(0.0), + width: 60, + child: Image.asset("assets/images/new/payment/tamara.png"), + ), + mFlex(1), + if (selectedPaymentMethod == "TAMARA") + Container( + decoration: containerRadius(CustomColors.green, 200), + padding: EdgeInsets.only(top: 6, bottom: 6, left: 12, right: 12), + child: Text( + TranslationBase.of(context).paymentSelected, + style: TextStyle( + color: Colors.white, + fontSize: 11, + ), + ), + ), + ], + ), + ), + ), + ), + ), if (widget.isShowInstallments) Container( width: double.infinity, @@ -303,12 +354,113 @@ class _PaymentMethodState extends State { bottomSheet: Container( padding: EdgeInsets.all(16), color: Colors.white, - child: - Container( + child: selectedPaymentMethod == "TAMARA" + ? Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text(TranslationBase.of(context).selectTamaraPlan, style: TextStyle(fontSize: 16.0, fontWeight: FontWeight.bold)), + Container( + height: 60.0, + padding: EdgeInsets.all(0.0), + width: 60, + child: Image.asset("assets/images/new/payment/tamara.png"), + ), + ], + ), + ), + Column( + children: [ + ...List.generate( + tamaraInstallmentDetails.supportedInstalments.length, + (index) => Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox( + height: 1, + ), + Row( + children: [ + Expanded( + flex: 1, + child: InkWell( + onTap: () { + setState(() { + selectedInstallmentPlan = tamaraInstallmentDetails.supportedInstalments[index].instalments.toString(); + // getPaymentInfo(context, widget.projectID.toString(), widget.selectedProcedure.procedureID); + }); + }, + child: Row( + children: [ + Radio( + value: tamaraInstallmentDetails.supportedInstalments[index].instalments.toString(), + groupValue: selectedInstallmentPlan, + activeColor: Colors.red[800], + toggleable: true, + onChanged: (value) { + setState(() { + selectedInstallmentPlan = value; + print(selectedInstallmentPlan); + }); + }, + ), + Text( + tamaraInstallmentDetails.supportedInstalments[index].instalments.toString() + " " + TranslationBase.of(context).installments, + style: TextStyle( + fontSize: 12.0, + letterSpacing: -0.48, + fontWeight: FontWeight.w600, + ), + ), + ], + ), + ), + ) + ], + ), + ], + ), + ), + Container( + width: MediaQuery.of(context).size.width, + height: 50.0, + color: Colors.white, + child: ButtonTheme( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(10.0), + ), + minWidth: MediaQuery.of(context).size.height * 0.1, + height: 45.0, + child: RaisedButton( + color: CustomColors.green, + textColor: Colors.white, + disabledTextColor: Colors.white, + disabledColor: new Color(0xFFbcc2c4), + elevation: 0, + onPressed: () { + widget.onSelectedMethod(selectedPaymentMethod, selectedInstallmentPlan); + Navigator.pop(context, [selectedPaymentMethod, selectedInstallmentPlan]); + }, + child: Text(TranslationBase.of(context).confirm.toUpperCase(), + style: TextStyle( + fontSize: 14.0, + fontWeight: FontWeight.w600, + )), + ), + ), + ), + ], + ), + ], + ) + : Container( width: MediaQuery.of(context).size.width, height: 50.0, color: Colors.white, - // margin: EdgeInsets.fromLTRB(20.0, 10.0, 20.0, 20.0), child: ButtonTheme( shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(10.0), @@ -322,8 +474,8 @@ class _PaymentMethodState extends State { disabledColor: new Color(0xFFbcc2c4), elevation: 0, onPressed: () { - widget.onSelectedMethod(selectedPaymentMethod); - Navigator.pop(context, selectedPaymentMethod); + widget.onSelectedMethod(selectedPaymentMethod, selectedInstallmentPlan); + Navigator.pop(context, [selectedPaymentMethod, selectedInstallmentPlan]); }, child: Text(TranslationBase.of(context).confirm.toUpperCase(), style: TextStyle( @@ -341,5 +493,23 @@ class _PaymentMethodState extends State { setState(() { selectedPaymentMethod = selectedMethod; }); + if (selectedMethod == "TAMARA") { + getTamaraPaymentDetails(); + } + } + + getTamaraPaymentDetails() { + GifLoaderDialogUtils.showMyDialog(context); + DoctorsListService service = new DoctorsListService(); + service.getTamaraPaymentDetails(context).then((res) { + tamaraInstallmentDetails = TamaraInstallmentDetails.fromJson(res); + print(tamaraInstallmentDetails.name); + selectedInstallmentPlan = tamaraInstallmentDetails.supportedInstalments[0].instalments.toString(); + GifLoaderDialogUtils.hideDialog(context); + setState(() {}); + }).catchError((err) { + GifLoaderDialogUtils.hideDialog(context); + print(err); + }); } } diff --git a/lib/pages/landing/fragments/home_page_fragment2.dart b/lib/pages/landing/fragments/home_page_fragment2.dart index 64b4379f..7e9ed25c 100644 --- a/lib/pages/landing/fragments/home_page_fragment2.dart +++ b/lib/pages/landing/fragments/home_page_fragment2.dart @@ -70,7 +70,6 @@ class _HomePageFragment2State extends State { @override Widget build(BuildContext context) { projectViewModel = Provider.of(context); - print(""); initialiseHmgServices(false); var appoCountProvider = Provider.of(context); var userProvider = Provider.of(context); diff --git a/lib/pages/landing/landing_page.dart b/lib/pages/landing/landing_page.dart index 03522eeb..5b4a6bd1 100644 --- a/lib/pages/landing/landing_page.dart +++ b/lib/pages/landing/landing_page.dart @@ -1,5 +1,3 @@ -import 'dart:io'; - import 'package:diplomaticquarterapp/config/config.dart'; import 'package:diplomaticquarterapp/config/shared_pref_kay.dart'; import 'package:diplomaticquarterapp/core/model/ImagesInfo.dart'; @@ -12,11 +10,9 @@ import 'package:diplomaticquarterapp/models/Authentication/authenticated_user.da import 'package:diplomaticquarterapp/models/Authentication/select_device_imei_res.dart'; import 'package:diplomaticquarterapp/models/LiveCare/IncomingCallData.dart'; import 'package:diplomaticquarterapp/pages/BookAppointment/Search.dart'; -import 'package:diplomaticquarterapp/pages/Covid-DriveThru/covid-drivethru-location.dart'; import 'package:diplomaticquarterapp/pages/DrawerPages/family/my-family.dart'; import 'package:diplomaticquarterapp/pages/ToDoList/ToDo.dart'; import 'package:diplomaticquarterapp/pages/landing/home_page_2.dart'; -import 'package:diplomaticquarterapp/pages/livecare/incoming_call.dart'; import 'package:diplomaticquarterapp/pages/medical/medical_profile_page_new.dart'; import 'package:diplomaticquarterapp/services/authentication/auth_provider.dart'; import 'package:diplomaticquarterapp/services/clinic_services/get_clinic_service.dart'; @@ -25,21 +21,17 @@ import 'package:diplomaticquarterapp/services/robo_search/event_provider.dart'; import 'package:diplomaticquarterapp/theme/colors.dart'; import 'package:diplomaticquarterapp/uitl/HMGNetworkConnectivity.dart'; import 'package:diplomaticquarterapp/uitl/LocalNotification.dart'; -import 'package:diplomaticquarterapp/uitl/PlatformBridge.dart'; import 'package:diplomaticquarterapp/uitl/SignalRUtil.dart'; import 'package:diplomaticquarterapp/uitl/app_toast.dart'; import 'package:diplomaticquarterapp/uitl/gif_loader_dialog_utils.dart'; import 'package:diplomaticquarterapp/uitl/location_util.dart'; -import 'package:diplomaticquarterapp/uitl/navigation_service.dart'; import 'package:diplomaticquarterapp/uitl/push-notification-handler.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:diplomaticquarterapp/widgets/bottom_navigation/bottom_nav_bar.dart'; import 'package:diplomaticquarterapp/widgets/buttons/floatingActionButton.dart'; -import 'package:diplomaticquarterapp/widgets/dialogs/covid_consent_dialog.dart'; import 'package:diplomaticquarterapp/widgets/drawer/app_drawer_widget.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; import 'package:diplomaticquarterapp/widgets/others/not_auh_page.dart'; -import 'package:diplomaticquarterapp/widgets/transitions/fade_page.dart'; import 'package:firebase_messaging/firebase_messaging.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; @@ -51,7 +43,6 @@ import 'package:provider/provider.dart'; import '../../locator.dart'; import '../../routes.dart'; - class LandingPage extends StatefulWidget { static LandingPage shared; _LandingPageState state; @@ -100,10 +91,10 @@ class _LandingPageState extends State with WidgetsBindingObserver { void _requestIOSPermissions() { flutterLocalNotificationsPlugin.resolvePlatformSpecificImplementation()?.requestPermissions( - alert: true, - badge: true, - sound: true, - ); + alert: true, + badge: true, + sound: true, + ); } bool isPageNavigated = false; @@ -117,9 +108,7 @@ class _LandingPageState extends State with WidgetsBindingObserver { DateTime now = DateTime.now(); if (currentBackPressTime == null || now.difference(currentBackPressTime) > Duration(seconds: 2)) { currentBackPressTime = now; - AppToast.showToast(message: TranslationBase - .of(context) - .pressAgain); + AppToast.showToast(message: TranslationBase.of(context).pressAgain); return Future.value(false); } return Future.value(true); @@ -146,18 +135,13 @@ class _LandingPageState extends State with WidgetsBindingObserver { Navigator.push( context, MaterialPageRoute( - builder: (cxt) => - NotAutPage( - title: TranslationBase - .of(context) - .myFamilyFiles, - description: TranslationBase - .of(context) - .familyInfo, - infoList: [], - imagesInfo: imagesInfo, - icon: "assets/images/new/bottom_nav/family_files.svg", - ), + builder: (cxt) => NotAutPage( + title: TranslationBase.of(context).myFamilyFiles, + description: TranslationBase.of(context).familyInfo, + infoList: [], + imagesInfo: imagesInfo, + icon: "assets/images/new/bottom_nav/family_files.svg", + ), ), ); return; @@ -170,18 +154,13 @@ class _LandingPageState extends State with WidgetsBindingObserver { Navigator.push( context, MaterialPageRoute( - builder: (cxt) => - NotAutPage( - title: TranslationBase - .of(context) - .todoList, - description: TranslationBase - .of(context) - .infoTodo, - infoList: [], - imagesInfo: imagesInfo, - icon: "assets/images/new/bottom_nav/todo.svg", - ), + builder: (cxt) => NotAutPage( + title: TranslationBase.of(context).todoList, + description: TranslationBase.of(context).infoTodo, + infoList: [], + imagesInfo: imagesInfo, + icon: "assets/images/new/bottom_nav/todo.svg", + ), ), ); return; @@ -259,7 +238,7 @@ class _LandingPageState extends State with WidgetsBindingObserver { pageController = PageController(keepPage: true); _firebaseMessaging.setAutoInitEnabled(true); - locationUtils = new LocationUtils(isShowConfirmDialog: false, context: context); + // locationUtils = new LocationUtils(isShowConfirmDialog: false, context: context); WidgetsBinding.instance.addPostFrameCallback((_) { if (projectViewModel.isLogin && !projectViewModel.isLoginChild) { familyFileProvider.getSharedRecordByStatus(); @@ -269,49 +248,18 @@ class _LandingPageState extends State with WidgetsBindingObserver { // HMG (Guest/Internet) Wifi Access [Zohaib Kambrani] // for now commented to reduce this call will enable it when needed HMGNetworkConnectivity(context).start(); - - requestPermissions().then((results) { - locationUtils.getCurrentLocation(); - _firebaseMessaging.getToken().then((String token) { - print("Firebase Token: " + token); - sharedPref.setString(PUSH_TOKEN, token); - if (token != null) { - DEVICE_TOKEN = token; - if (!projectViewModel.isLoginChild) { - checkUserStatus(token); - } + _firebaseMessaging.getToken().then((String token) { + print("Firebase Token: " + token); + sharedPref.setString(PUSH_TOKEN, token); + if (token != null) { + DEVICE_TOKEN = token; + if (!projectViewModel.isLoginChild) { + checkUserStatus(token); } - }); - if (results[Permission.location].isGranted) {} - // if (results[Permission.storage].isGranted) ; - // if (results[Permission.camera].isGranted) ; - // if (results[Permission.photos].isGranted) ; - // if (results[Permission.accessMediaLocation].isGranted) ; - // if (results[Permission.calendar].isGranted) ; + } }); } - Future> requestPermissions() async { - var permissionResults = [ - Permission.location, - Permission.locationAlways, - // Permission.storage, - // Permission.camera, - // Permission.photos, - // Permission.notification, - // Permission.accessMediaLocation, - // Permission.calendar, - // Permission.activityRecognition - ].request(); - - // var permissionsGranted = await deviceCalendarPlugin.hasPermissions(); - // if (permissionsGranted.isSuccess && !permissionsGranted.data) { - // permissionsGranted = await deviceCalendarPlugin.requestPermissions(); - // if (!permissionsGranted.isSuccess || !permissionsGranted.data) {} - // } - return permissionResults; - } - void setUserValues(value) async { if (value != null) sharedPref.setObject(IMEI_USER_DATA, value); } @@ -377,18 +325,17 @@ class _LandingPageState extends State with WidgetsBindingObserver { if (await sharedPref.getObject(USER_PROFILE) != null) { var data = AuthenticatedUser.fromJson(await sharedPref.getObject(USER_PROFILE)); if (data != null) { - authService.getDashboard().then((value) => - { - if (value != null) - { - setState(() { - notificationCount = - value['List_PatientDashboard'][0]['UnreadPatientNotificationCount'] > 99 ? '99+' : value['List_PatientDashboard'][0]['UnreadPatientNotificationCount'].toString(); - model.setState(model.count, true, notificationCount); - sharedPref.setString(NOTIFICATION_COUNT, notificationCount); - }) - } - }); + authService.getDashboard().then((value) => { + if (value != null) + { + setState(() { + notificationCount = + value['List_PatientDashboard'][0]['UnreadPatientNotificationCount'] > 99 ? '99+' : value['List_PatientDashboard'][0]['UnreadPatientNotificationCount'].toString(); + model.setState(model.count, true, notificationCount); + sharedPref.setString(NOTIFICATION_COUNT, notificationCount); + }) + } + }); } } } @@ -401,102 +348,90 @@ class _LandingPageState extends State with WidgetsBindingObserver { return Scaffold( appBar: currentTab == 0 ? PreferredSize( - preferredSize: Size.fromHeight(currentTab == 0 ? 45 : 0.0), - child: AppBar( - elevation: 0, - backgroundColor: CustomColors.backgroudGreyColor, - textTheme: TextTheme( - headline6: TextStyle(color: Theme - .of(context) - .textTheme - .headline1 - .color, fontWeight: FontWeight.bold), - ), - title: Text( - getText(currentTab).toUpperCase(), - style: TextStyle( - fontWeight: FontWeight.bold, - color: currentTab == 0 ? CustomColors.backgroudGreyColor : Theme - .of(context) - .textTheme - .headline1 - .color, - fontFamily: projectViewModel.isArabic ? 'Cairo' : 'Poppins'), - // bold: true, - ), - leading: Builder( - builder: (BuildContext context) { - return new Stack( - children: [ - currentTab == 0 - ? IconButton( - icon: SvgPicture.asset("assets/images/new/menu.svg"), - color: Theme - .of(context) - .textTheme - .headline1 - .color, - onPressed: () => Scaffold.of(context).openDrawer(), - ) - : IconButton( - icon: Icon(Icons.arrow_back), - onPressed: () { - setState(() { - currentTab = 0; - }); - - pageController.jumpToPage(0); - }, - ), - projectViewModel.isLogin && model.notificationsCount != null && !projectViewModel.isLoginChild - ? new Positioned( - right: projectViewModel.isArabic ? 35 : 0, - top: 5, - child: new Container( - padding: EdgeInsets.all(4), - decoration: new BoxDecoration( - color: CustomColors.accentColor, - borderRadius: BorderRadius.circular(20), - ), - constraints: BoxConstraints( - minWidth: 20, - minHeight: 20, - ), - child: new Text( - model.notificationsCount.toString(), - style: new TextStyle( - color: Colors.white, - fontSize: projectViewModel.isArabic ? 8 : 9, - ), - textAlign: TextAlign.center, - ), - ), - ) - : SizedBox() + preferredSize: Size.fromHeight(currentTab == 0 ? 45 : 0.0), + child: AppBar( + elevation: 0, + backgroundColor: CustomColors.backgroudGreyColor, + textTheme: TextTheme( + headline6: TextStyle(color: Theme.of(context).textTheme.headline1.color, fontWeight: FontWeight.bold), + ), + title: Text( + getText(currentTab).toUpperCase(), + style: TextStyle( + fontWeight: FontWeight.bold, + color: currentTab == 0 ? CustomColors.backgroudGreyColor : Theme.of(context).textTheme.headline1.color, + fontFamily: projectViewModel.isArabic ? 'Cairo' : 'Poppins'), + // bold: true, + ), + leading: Builder( + builder: (BuildContext context) { + return new Stack( + children: [ + currentTab == 0 + ? IconButton( + icon: SvgPicture.asset("assets/images/new/menu.svg"), + color: Theme.of(context).textTheme.headline1.color, + onPressed: () => Scaffold.of(context).openDrawer(), + ) + : IconButton( + icon: Icon(Icons.arrow_back), + onPressed: () { + setState(() { + currentTab = 0; + }); + + pageController.jumpToPage(0); + }, + ), + projectViewModel.isLogin && model.notificationsCount != null && !projectViewModel.isLoginChild + ? new Positioned( + right: projectViewModel.isArabic ? 35 : 0, + top: 5, + child: new Container( + padding: EdgeInsets.all(4), + decoration: new BoxDecoration( + color: CustomColors.accentColor, + borderRadius: BorderRadius.circular(20), + ), + constraints: BoxConstraints( + minWidth: 20, + minHeight: 20, + ), + child: new Text( + model.notificationsCount.toString(), + style: new TextStyle( + color: Colors.white, + fontSize: projectViewModel.isArabic ? 8 : 9, + ), + textAlign: TextAlign.center, + ), + ), + ) + : SizedBox() + ], + ); + }, + ), + actions: [ + // IconButton( + // //iconSize: 70, + // icon: Icon( + // projectViewModel.isLogin ? Icons.settings : Icons.login, + // color: Theme.of(context).textTheme.headline1.color, + // ), + // onPressed: () { + // if (projectViewModel.isLogin) + // Navigator.of(context).pushNamed( + // SETTINGS, + // ); + // else + // login(); + // }, //do something, + // ) ], - ); - }, - ), - actions: [ - // IconButton( - // //iconSize: 70, - // icon: Icon( - // projectViewModel.isLogin ? Icons.settings : Icons.login, - // color: Theme.of(context).textTheme.headline1.color, - // ), - // onPressed: () { - // if (projectViewModel.isLogin) - // Navigator.of(context).pushNamed( - // SETTINGS, - // ); - // else - // login(); - // }, //do something, - // ) - ], - centerTitle: true, - ), - ) + centerTitle: true, + ), + ) : null, drawer: SafeArea(child: AppDrawer()), extendBody: false, @@ -552,12 +487,12 @@ class _LandingPageState extends State with WidgetsBindingObserver { floatingActionButtonLocation: FloatingActionButtonLocation.centerDocked, floatingActionButton: (projectViewModel.havePrivilege(34) && currentTab == 0) ? FloatingButton( - elevation: true, - onTap: () { - projectViewModel.analytics.appointment.book_appointment(); - changeCurrentTab(2); - }, - ) + elevation: true, + onTap: () { + projectViewModel.analytics.appointment.book_appointment(); + changeCurrentTab(2); + }, + ) : null); } @@ -568,29 +503,17 @@ class _LandingPageState extends State with WidgetsBindingObserver { getText(currentTab) { switch (currentTab) { case 0: - return TranslationBase - .of(context) - .home; + return TranslationBase.of(context).home; case 1: - return TranslationBase - .of(context) - .medicalProfile; + return TranslationBase.of(context).medicalProfile; case 2: - return TranslationBase - .of(context) - .bookAppo; + return TranslationBase.of(context).bookAppo; case 5: - return TranslationBase - .of(context) - .bookAppo; + return TranslationBase.of(context).bookAppo; case 3: - return TranslationBase - .of(context) - .services; + return TranslationBase.of(context).services; case 4: - return TranslationBase - .of(context) - .bookAppo; + return TranslationBase.of(context).bookAppo; } } @@ -601,22 +524,16 @@ class _LandingPageState extends State with WidgetsBindingObserver { projectViewModel.analytics.setUser(data); if (data != null) { authService.registeredAuthenticatedUser(data, token, 0, 0).then((res) => {}); - authService.getDashboard().then((value) => - { - setState(() { - if (value != null) { - notificationCount = value['List_PatientDashboard'][0]['UnreadPatientNotificationCount'] > 99 ? '99+' : value['List_PatientDashboard'][0]['UnreadPatientNotificationCount'].toString(); - model.setState(model.count, true, notificationCount); - sharedPref.setString(NOTIFICATION_COUNT, notificationCount); - } - }), - }); + authService.getDashboard().then((value) => { + setState(() { + if (value != null) { + notificationCount = value['List_PatientDashboard'][0]['UnreadPatientNotificationCount'] > 99 ? '99+' : value['List_PatientDashboard'][0]['UnreadPatientNotificationCount'].toString(); + model.setState(model.count, true, notificationCount); + sharedPref.setString(NOTIFICATION_COUNT, notificationCount); + } + }), + }); } - sharedPref.getString(IS_COVID_CONSENT_SHOWN).then((value) { - print(value); - if (value == null) - showUserConsent(); - }); } else { projectViewModel.analytics.setUser(null); } @@ -624,23 +541,5 @@ class _LandingPageState extends State with WidgetsBindingObserver { void showUserConsent() { sharedPref.setString(IS_COVID_CONSENT_SHOWN, "true"); - showDialog( - context: context, - builder: (cxt) => - CovidConsentDialog( - okTitle: TranslationBase - .of(context) - .acceptLbl, - title: TranslationBase - .of(context) - .covidConsentHeader, - message: TranslationBase - .of(context) - .covidConsent, - onTap: () async { - // Navigator.push(context, FadePage(page: CovidDrivethruLocation())); - }, - )); } - } diff --git a/lib/pages/landing/widgets/services_view.dart b/lib/pages/landing/widgets/services_view.dart index cba6ba29..da40b985 100644 --- a/lib/pages/landing/widgets/services_view.dart +++ b/lib/pages/landing/widgets/services_view.dart @@ -1,3 +1,5 @@ +import 'dart:io'; + import 'package:auto_size_text/auto_size_text.dart'; import 'package:diplomaticquarterapp/analytics/google-analytics.dart'; import 'package:diplomaticquarterapp/config/size_config.dart'; @@ -278,16 +280,21 @@ class ServicesView extends StatelessWidget { } showCovidDialog(BuildContext context) { - showDialog( - context: context, - builder: (cxt) => CovidConsentDialog( - okTitle: TranslationBase.of(context).acceptLbl, - title: TranslationBase.of(context).covidConsentHeader, - message: TranslationBase.of(context).covidConsent, - onTap: () async { - Navigator.push(context, FadePage(page: CovidDrivethruLocation())); - }, - )); + if (Platform.isAndroid) { + // Utils.showPermissionConsentDialog(context, "", () {}); + showDialog( + context: context, + builder: (cxt) => CovidConsentDialog( + okTitle: TranslationBase.of(context).acceptLbl, + title: TranslationBase.of(context).covidConsentHeader, + message: TranslationBase.of(context).covidConsent, + onTap: () async { + Navigator.push(context, FadePage(page: CovidDrivethruLocation())); + }, + )); + } else { + Navigator.push(context, FadePage(page: CovidDrivethruLocation())); + } } getPharmacyToken(BuildContext context) async { diff --git a/lib/pages/livecare/widgets/clinic_list.dart b/lib/pages/livecare/widgets/clinic_list.dart index 51671dfc..b7978ea2 100644 --- a/lib/pages/livecare/widgets/clinic_list.dart +++ b/lib/pages/livecare/widgets/clinic_list.dart @@ -279,7 +279,7 @@ class _clinic_listState extends State { }); } - Navigator.push(context, FadePage(page: PaymentMethod(onSelectedMethod: (String metohd) { + Navigator.push(context, FadePage(page: PaymentMethod(onSelectedMethod: (String metohd, [String selectedInstallmentPlan]) { setState(() {}); }))).then((value) { print(value); @@ -290,11 +290,11 @@ class _clinic_listState extends State { }); } - openPayment(String paymentMethod, AuthenticatedUser authenticatedUser, double amount, AppoitmentAllHistoryResultList appo) { + openPayment(List paymentMethod, AuthenticatedUser authenticatedUser, double amount, AppoitmentAllHistoryResultList appo) { browser = new MyInAppBrowser(onExitCallback: onBrowserExit, appo: appo, onLoadStartCallback: onBrowserLoadStart, context: context); - browser.openPaymentBrowser(amount, "LiveCare Payment", Utils.getAppointmentTransID(appo.projectID, appo.clinicID, appo.appointmentNo), "12", authenticatedUser.emailAddress, paymentMethod, - authenticatedUser.patientType, authenticatedUser.firstName, authenticatedUser.patientID, authenticatedUser, browser, false, "4", selectedClinicID.toString()); + browser.openPaymentBrowser(amount, "LiveCare Payment", Utils.getAppointmentTransID(appo.projectID, appo.clinicID, appo.appointmentNo), "12", authenticatedUser.emailAddress, paymentMethod[0], + authenticatedUser.patientType, authenticatedUser.firstName, authenticatedUser.patientID, authenticatedUser, browser, false, "4", selectedClinicID.toString(), "", "", "", "", paymentMethod[1]); } onBrowserLoadStart(String url) { diff --git a/lib/pages/medical/ask_doctor/ViewDoctorResponsesPage.dart b/lib/pages/medical/ask_doctor/ViewDoctorResponsesPage.dart index fc47ed3c..978636e0 100644 --- a/lib/pages/medical/ask_doctor/ViewDoctorResponsesPage.dart +++ b/lib/pages/medical/ask_doctor/ViewDoctorResponsesPage.dart @@ -1,15 +1,16 @@ import 'package:diplomaticquarterapp/core/model/ask_doctor/DoctorResponse.dart'; import 'package:diplomaticquarterapp/core/viewModels/medical/ask_doctor_view_model.dart'; import 'package:diplomaticquarterapp/pages/base/base_view.dart'; +import 'package:diplomaticquarterapp/uitl/date_uitl.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; class ViewDoctorResponsesPage extends StatelessWidget { final DoctorResponse doctorResponse; - const ViewDoctorResponsesPage({Key key, this.doctorResponse}) - : super(key: key); + const ViewDoctorResponsesPage({Key key, this.doctorResponse}) : super(key: key); @override Widget build(BuildContext context) { @@ -17,17 +18,87 @@ class ViewDoctorResponsesPage extends StatelessWidget { onModelReady: (model) => model.updateReadStatus(transactionNo: doctorResponse.transactionNo), builder: (_, model, w) => AppScaffold( isShowAppBar: true, + showNewAppBar: true, + showNewAppBarTitle: true, + backgroundColor: Color(0xffF8F8F8), + isShowDecPage: false, appBarTitle: TranslationBase.of(context).viewDoctorResponses, baseViewModel: model, body: SingleChildScrollView( child: Container( child: Column( crossAxisAlignment: CrossAxisAlignment.start, - children: [], + children: [getResponsesList()], ), ), ), ), ); } + + Widget getResponsesList() { + return ListView.separated( + shrinkWrap: true, + physics: NeverScrollableScrollPhysics(), + padding: EdgeInsets.only(bottom: 14, top: 14, left: 21, right: 21), + itemBuilder: (context, _index) { + return Container( + padding: const EdgeInsets.only(left: 20, right: 12, top: 12, bottom: 12), + height: 110, + decoration: BoxDecoration( + borderRadius: BorderRadius.all( + Radius.circular(10.0), + ), + border: Border.all(width: 1, color: Color(0xffEFEFEF)), + boxShadow: [ + BoxShadow( + color: Color(0xff000000).withOpacity(.05), + //spreadRadius: 5, + blurRadius: 27, + offset: Offset(0, -3), + ), + ], + color: Colors.white), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + child: Text( + (doctorResponse.doctorName ?? ""), + style: TextStyle( + fontSize: 16, + fontWeight: FontWeight.w600, + color: Color(0xff2E303A), + letterSpacing: -0.64, + ), + ), + ), + Container( + child: Text( + (DateUtil.getDayMonthYearDateFormatted(DateUtil.convertStringToDate(doctorResponse.createdOn)) ?? ""), + style: TextStyle( + fontSize: 14, + color: Color(0xff2E303A), + letterSpacing: -0.64, + ), + ), + ), + Container( + margin: EdgeInsets.only(top: 10.0), + child: Text( + doctorResponse.transactions[_index]['DoctorResponse'], + style: TextStyle( + fontSize: 16, + color: Color(0xff2E303A), + letterSpacing: -0.64, + ), + ), + ), + ], + ), + ); + }, + separatorBuilder: (context, index) => SizedBox(height: 14), + itemCount: doctorResponse.transactions.length); + } } diff --git a/lib/pages/medical/ask_doctor/doctor_response.dart b/lib/pages/medical/ask_doctor/doctor_response.dart index decca583..b827529b 100644 --- a/lib/pages/medical/ask_doctor/doctor_response.dart +++ b/lib/pages/medical/ask_doctor/doctor_response.dart @@ -71,7 +71,7 @@ class DoctorResponse extends StatelessWidget { ); }, child: Container( - height: 70, + height: 75, margin: EdgeInsets.only(top: 8, bottom: 8), decoration: BoxDecoration( borderRadius: BorderRadius.circular(8), @@ -98,9 +98,12 @@ class DoctorResponse extends StatelessWidget { ), ), ), - Icon(projectViewModel.isArabic - ? Icons.arrow_forward - : Icons.arrow_back_ios) + Padding( + padding: const EdgeInsets.fromLTRB(10.0, 0.0, 10.0, 0.0), + child: Icon(projectViewModel.isArabic + ? Icons.arrow_back_ios + : Icons.arrow_forward_ios), + ) ], ), ), diff --git a/lib/pages/medical/balance/advance_payment_page.dart b/lib/pages/medical/balance/advance_payment_page.dart index 8a7eacd5..520dfcef 100644 --- a/lib/pages/medical/balance/advance_payment_page.dart +++ b/lib/pages/medical/balance/advance_payment_page.dart @@ -325,23 +325,24 @@ class _AdvancePaymentPageState extends State { context, FadePage( page: PaymentMethod( - onSelectedMethod: (String metohd) { + onSelectedMethod: (String metohd, [String selectedInstallmentPlan]) { setState(() {}); }, isShowInstallments: num.tryParse(amount) >= 1000 ? true : false), ), ).then( (value) { - projectViewModel.analytics.advancePayments.payment_method(method: value.toString().toLowerCase(), type: 'wallet'); + projectViewModel.analytics.advancePayments.payment_method(method: value[0].toString().toLowerCase(), type: 'wallet'); Navigator.push( context, FadePage( page: ConfirmPaymentPage( advanceModel: advanceModel, - selectedPaymentMethod: value, + selectedPaymentMethod: value[0], patientInfoAndMobileNumber: model.patientInfoAndMobileNumber, authenticatedUser: authUser, + installmentPlan: value[1], ), ), ); diff --git a/lib/pages/medical/balance/confirm_payment_page.dart b/lib/pages/medical/balance/confirm_payment_page.dart index e7115837..3a7ef839 100644 --- a/lib/pages/medical/balance/confirm_payment_page.dart +++ b/lib/pages/medical/balance/confirm_payment_page.dart @@ -24,9 +24,9 @@ import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; import 'package:diplomaticquarterapp/widgets/otp/sms-popup.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_svg/flutter_svg.dart'; import 'package:pay/pay.dart'; import 'package:provider/provider.dart'; + import 'new_text_Field.dart'; class ConfirmPaymentPage extends StatefulWidget { @@ -34,8 +34,9 @@ class ConfirmPaymentPage extends StatefulWidget { final PatientInfoAndMobileNumber patientInfoAndMobileNumber; final String selectedPaymentMethod; AuthenticatedUser authenticatedUser; + String installmentPlan; - ConfirmPaymentPage({this.advanceModel, this.patientInfoAndMobileNumber, this.selectedPaymentMethod, this.authenticatedUser}); + ConfirmPaymentPage({this.advanceModel, this.patientInfoAndMobileNumber, this.selectedPaymentMethod, this.authenticatedUser, this.installmentPlan}); @override _ConfirmPaymentPageState createState() => _ConfirmPaymentPageState(); @@ -49,9 +50,15 @@ class _ConfirmPaymentPageState extends State { String transID = ""; - Pay _payClient = Pay.withAssets([ - 'applepay.json', - ]); + Pay _payClient; + + @override + void initState() { + _payClient = Pay.withAssets([ + 'applepay.json', + ]); + super.initState(); + } void submit(MyBalanceViewModel model, code) { final activationCode = code; @@ -65,7 +72,7 @@ class _ConfirmPaymentPageState extends State { // startApplePay(); // } else { projectViewModel.analytics.advancePayments.payment_otp_confirmation(method: widget.selectedPaymentMethod.toLowerCase(), type: 'wallet'); - openPayment(widget.selectedPaymentMethod, widget.authenticatedUser, double.parse(widget.advanceModel.amount), null); + openPayment(widget.selectedPaymentMethod, widget.authenticatedUser, double.parse(widget.advanceModel.amount), null); // } }); } @@ -211,11 +218,11 @@ class _ConfirmPaymentPageState extends State { }); // startApplePay(); // if() - GifLoaderDialogUtils.showMyDialog(context); - model.sendActivationCodeForAdvancePayment(patientID: int.parse(widget.advanceModel.fileNumber), projectID: widget.advanceModel.hospitalsModel.iD).then((value) { - GifLoaderDialogUtils.hideDialog(context); - if (model.state != ViewState.ErrorLocal && model.state != ViewState.Error) showSMSDialog(model); - }); + // GifLoaderDialogUtils.showMyDialog(context); + // model.sendActivationCodeForAdvancePayment(patientID: int.parse(widget.advanceModel.fileNumber), projectID: widget.advanceModel.hospitalsModel.iD).then((value) { + // GifLoaderDialogUtils.hideDialog(context); + // if (model.state != ViewState.ErrorLocal && model.state != ViewState.Error) showSMSDialog(model); + // }); }, ), ), @@ -225,7 +232,7 @@ class _ConfirmPaymentPageState extends State { } startApplePay() { - GifLoaderDialogUtils.showMyDialog(context); + // GifLoaderDialogUtils.showMyDialog(context); ApplePayResponse applePayResponse; var _paymentItems = [ PaymentItem( @@ -244,6 +251,8 @@ class _ConfirmPaymentPageState extends State { print(result); applePayResponse = ApplePayResponse.fromJson(result); callPayfortApplePayAPI(applePayResponse); + }).catchError((err) { + print(err); }); } @@ -325,6 +334,9 @@ class _ConfirmPaymentPageState extends State { case "ApplePay": return 'assets/images/new/payment/Apple_Pay.png'; break; + case "TAMARA": + return 'assets/images/new/payment/tamara.png'; + break; } return 'assets/images/new-design/mada.png'; @@ -336,7 +348,7 @@ class _ConfirmPaymentPageState extends State { transID = Utils.getAdvancePaymentTransID(widget.advanceModel.hospitalsModel.iD, int.parse(widget.advanceModel.fileNumber)); browser.openPaymentBrowser(amount, "Advance Payment", transID, widget.advanceModel.hospitalsModel.iD.toString(), widget.advanceModel.email, paymentMethod, - widget.patientInfoAndMobileNumber.patientType, widget.advanceModel.patientName, widget.advanceModel.fileNumber, authenticatedUser, browser, false, "3", ""); + widget.patientInfoAndMobileNumber.patientType, widget.advanceModel.patientName, widget.advanceModel.fileNumber, authenticatedUser, browser, false, "3", "", "", "", "", "", widget.installmentPlan); } onBrowserLoadStart(String url) { diff --git a/lib/pages/medical/prescriptions/PrescriptionIDeliveryAddressPage.dart b/lib/pages/medical/prescriptions/PrescriptionIDeliveryAddressPage.dart index ba094229..603a871a 100644 --- a/lib/pages/medical/prescriptions/PrescriptionIDeliveryAddressPage.dart +++ b/lib/pages/medical/prescriptions/PrescriptionIDeliveryAddressPage.dart @@ -1,5 +1,7 @@ import 'dart:async'; +import 'dart:io'; +import 'package:diplomaticquarterapp/config/config.dart'; import 'package:diplomaticquarterapp/core/model/prescriptions/Prescriptions.dart'; import 'package:diplomaticquarterapp/core/model/prescriptions/prescription_report.dart'; import 'package:diplomaticquarterapp/core/model/prescriptions/prescription_report_enh.dart'; @@ -10,8 +12,10 @@ import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; import 'package:diplomaticquarterapp/pages/AlHabibMedicalService/HomeHealthCare/NewHomeHealthCare/location_page.dart'; import 'package:diplomaticquarterapp/pages/AlHabibMedicalService/h2o/h20_setting.dart'; import 'package:diplomaticquarterapp/pages/base/base_view.dart'; +import 'package:diplomaticquarterapp/services/permission/permission_service.dart'; import 'package:diplomaticquarterapp/theme/colors.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; +import 'package:diplomaticquarterapp/uitl/utils.dart'; import 'package:diplomaticquarterapp/uitl/utils_new.dart'; import 'package:diplomaticquarterapp/widgets/buttons/defaultButton.dart'; import 'package:diplomaticquarterapp/widgets/dialogs/radio_selection_dialog.dart'; @@ -57,17 +61,47 @@ class _PrescriptionDeliveryAddressPageState extends State { + // ((!projectViewModel.havePrivilege(62)) || projectViewModel.user.outSA == 1 || model.isMedDeliveryAllowed == false) + // ? null + // : + () => { Navigator.push( context, FadePage( diff --git a/lib/pages/medical/smart_watch_health_data/syncHealthData.dart b/lib/pages/medical/smart_watch_health_data/syncHealthData.dart index cf172286..156fb55a 100644 --- a/lib/pages/medical/smart_watch_health_data/syncHealthData.dart +++ b/lib/pages/medical/smart_watch_health_data/syncHealthData.dart @@ -2,11 +2,13 @@ import 'dart:io'; import 'package:collection/collection.dart'; import 'package:diplomaticquarterapp/models/SmartWatch/HealthData.dart'; +import 'package:diplomaticquarterapp/services/permission/permission_service.dart'; import 'package:diplomaticquarterapp/services/smartwatch_integration/SmartWatchIntegrationService.dart'; import 'package:diplomaticquarterapp/uitl/app_toast.dart'; import 'package:diplomaticquarterapp/uitl/date_uitl.dart'; import 'package:diplomaticquarterapp/uitl/gif_loader_dialog_utils.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; +import 'package:diplomaticquarterapp/uitl/utils.dart'; import 'package:diplomaticquarterapp/widgets/buttons/defaultButton.dart'; import 'package:flutter/material.dart'; import 'package:health/health.dart'; @@ -32,6 +34,9 @@ class _syncHealthDataButtonState extends State { int MedCategoryID = 0; + HealthFactory health = HealthFactory(); + List types = [HealthDataType.STEPS, HealthDataType.HEART_RATE, Platform.isAndroid ? HealthDataType.DISTANCE_DELTA : HealthDataType.DISTANCE_WALKING_RUNNING]; + @override void initState() { super.initState(); @@ -39,7 +44,33 @@ class _syncHealthDataButtonState extends State { @override Widget build(BuildContext context) { - return DefaultButton(TranslationBase.of(context).syncHealthData, () => readAll()).insideContainer; + return DefaultButton(TranslationBase.of(context).syncHealthData, () => checkPermissions()).insideContainer; + } + + checkPermissions() async { + if (Platform.isAndroid) { + if (await PermissionService.isHealthDataPermissionEnabled()) { + await health.requestAuthorization(types).then((value) { + if(value) { + readAll(); + } + }); + } else { + Utils.showPermissionConsentDialog(context, TranslationBase.of(context).physicalActivityPermission, () async { + await health.requestAuthorization(types).then((value) { + if(value) { + readAll(); + } + }); + }); + } + } else { + await health.requestAuthorization(types).then((value) { + if(value) { + readAll(); + } + }); + } } void readAll() async { @@ -51,10 +82,7 @@ class _syncHealthDataButtonState extends State { Med_InsertTransactionsInputsList.clear(); DateTime startDate = DateTime.now().subtract(new Duration(days: 30)); - HealthFactory health = HealthFactory(); - List types = [HealthDataType.STEPS, HealthDataType.HEART_RATE, Platform.isAndroid ? HealthDataType.DISTANCE_DELTA : HealthDataType.DISTANCE_WALKING_RUNNING]; - - await health.requestAuthorization(types); + await checkPermissions(); try { List healthData = await health.getHealthDataFromTypes(startDate, DateTime.now(), types); diff --git a/lib/pages/settings/general_setting.dart b/lib/pages/settings/general_setting.dart index e69acb07..ebfd4ba2 100644 --- a/lib/pages/settings/general_setting.dart +++ b/lib/pages/settings/general_setting.dart @@ -329,8 +329,8 @@ class _GeneralSettings extends State with TickerProviderStateMi // accsibility = mediaQueryData.accessibleNavigation; //setTheme(blindValue); } - var camera = await this.permission.isCameraEnabled(); - var location = await this.permission.isLocationEnabled(); + var camera = await PermissionService.isCameraEnabled(); + var location = await PermissionService.isLocationEnabled(); setState(() { this.camera = camera; this.location = location; diff --git a/lib/services/appointment_services/GetDoctorsList.dart b/lib/services/appointment_services/GetDoctorsList.dart index 383af15b..63483490 100644 --- a/lib/services/appointment_services/GetDoctorsList.dart +++ b/lib/services/appointment_services/GetDoctorsList.dart @@ -1409,6 +1409,16 @@ class DoctorsListService extends BaseService { return Future.value(localRes); } + Future getTamaraPaymentDetails(BuildContext context) async { + dynamic localRes; + await baseAppClient.get(GET_TAMARA_PLAN, isExternal: true, onSuccess: (response, statusCode) async { + localRes = response[0]; + }, onFailure: (String error, int statusCode) { + throw error; + }); + return localRes; + } + Future callPayfortApplePayAPI(ApplePayRequest applePayRequest, BuildContext context) async { Map request; diff --git a/lib/services/permission/permission_service.dart b/lib/services/permission/permission_service.dart index d88ec599..4ce28251 100644 --- a/lib/services/permission/permission_service.dart +++ b/lib/services/permission/permission_service.dart @@ -1,17 +1,10 @@ import 'package:diplomaticquarterapp/config/config.dart'; -import 'package:diplomaticquarterapp/config/shared_pref_kay.dart'; import 'package:diplomaticquarterapp/core/service/base_service.dart'; -import 'package:diplomaticquarterapp/models/Authentication/authenticated_user.dart'; -import 'package:diplomaticquarterapp/models/Request.dart'; -import 'package:diplomaticquarterapp/services/authentication/auth_provider.dart'; -import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart'; import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; import 'package:localstorage/localstorage.dart'; import 'package:permission_handler/permission_handler.dart'; import 'package:vibration/vibration.dart'; import 'package:geolocator/geolocator.dart' as geo; -// import 'package:open_settings/open_settings.dart'; class PermissionService extends BaseService { final LocalStorage storage = new LocalStorage("permission"); @@ -55,16 +48,32 @@ class PermissionService extends BaseService { ].request(); } - isCameraEnabled() async { + static isCameraEnabled() async { return await Permission.camera.isGranted; } + static isExternalStorageEnabled() async { + return await Permission.storage.isGranted; + } + + static isHealthDataPermissionEnabled() async { + return await Permission.sensors.isGranted; + } + + static isMicrophonePermissionEnabled() async { + return await Permission.microphone.isGranted; + } + + static isCalendarPermissionEnabled() async { + return await Permission.calendar.isGranted; + } + setCameraLocationPermission(context) async { Navigator.pop(context); openAppSettings(); } - isLocationEnabled() async { + static isLocationEnabled() async { var permission = await geo.Geolocator.checkPermission(); if (permission == geo.LocationPermission.denied) { return false; diff --git a/lib/uitl/HMGNetworkConnectivity.dart b/lib/uitl/HMGNetworkConnectivity.dart index 2334f89e..274f12d1 100644 --- a/lib/uitl/HMGNetworkConnectivity.dart +++ b/lib/uitl/HMGNetworkConnectivity.dart @@ -2,17 +2,17 @@ import 'dart:developer'; import 'dart:io'; import 'package:diplomaticquarterapp/config/config.dart'; +import 'package:diplomaticquarterapp/config/shared_pref_kay.dart'; import 'package:diplomaticquarterapp/core/service/client/base_app_client.dart'; -import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; import 'package:diplomaticquarterapp/locator.dart'; +import 'package:diplomaticquarterapp/models/Authentication/authenticated_user.dart'; import 'package:diplomaticquarterapp/uitl/PlatformBridge.dart'; +import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; -import 'package:diplomaticquarterapp/uitl/utils.dart'; import 'package:diplomaticquarterapp/widgets/dialogs/alert_dialog.dart'; import 'package:diplomaticquarterapp/widgets/dialogs/confirm_dialog.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:provider/provider.dart'; import 'package:wifi/wifi.dart'; import 'gif_loader_dialog_utils.dart'; @@ -27,8 +27,13 @@ class HMGNetworkConnectivity { HMGNetworkConnectivity(this.context); - start(){ - checkAndConnectIfNoInternet(); + AuthenticatedUser userData; + + start() { + getUserData().then((value) { + userData = value; + checkAndConnectIfNoInternet(); + }); } void checkAndConnectIfNoInternet() async { @@ -95,17 +100,22 @@ class HMGNetworkConnectivity { }).showAlertDialog(context); } + Future getUserData() async { + var userData = AuthenticatedUser.fromJson(await AppSharedPreferences().getObject(MAIN_USER)); + return userData; + } - connectForLocalAccess(){ + connectForLocalAccess() { + String patientID = userData.patientID.toString(); GifLoaderDialogUtils.showMyDialog(context); - _platformBridge.connectHMGGuestWifi(GUEST_SSID).then((value) async{ - if(value == 0){ + _platformBridge.connectHMGGuestWifi(GUEST_SSID).then((value) async { + if (value == 0) { GifLoaderDialogUtils.hideDialog(context); - }else{ - getPatientWifiCredentials((username, password) async{ + } else { + getPatientWifiCredentials(patientID, (username, password) async { final result = await _platformBridge.connectHMGInternetWifi(PATIENT_SSID, username, password).catchError((err) => print(err.toString())); GifLoaderDialogUtils.hideDialog(context); - if(result == 1){ + if (result == 1) { // Success } }); @@ -113,65 +123,65 @@ class HMGNetworkConnectivity { }); } - getPatientWifiCredentials(Function(String username, String password) successCallback){ - final body = {"PatientID" : "1231755"}; - locator().post(WIFI_CREDENTIALS, body:body, onSuccess: (dynamic response, int statusCode){ + getPatientWifiCredentials(String patientID, Function(String username, String password) successCallback) { + final body = {"PatientID": patientID}; + locator().post(WIFI_CREDENTIALS, body: body, onSuccess: (dynamic response, int statusCode) { print(response); var data = response["Hmg_SMS_Get_By_ProjectID_And_PatientIDList"]; - if(data is List && data.first != null){ + if (data is List && data.first != null) { final username = data.first['UserName']; final password = data.first['Password']; - if(username != null && password != null && username.isNotEmpty && password.isNotEmpty){ + if (username != null && password != null && username.isNotEmpty && password.isNotEmpty) { successCallback(username, password); } } - }, onFailure: (String error, int statusCode){ + }, onFailure: (String error, int statusCode) { print(error); }, bypassConnectionCheck: true); } - // void next() { - // if (Platform.isIOS) { - // confirmFromUser_iOS(); - // } else if (Platform.isAndroid) { - // confirmFromUser(); - // } - // } - - // void confirmFromUser_iOS() { - // String message = "You don't have internet access, Do you want to connect with HMG Network to use App.\n\nMake sure you are in HMG Network range"; - // ConfirmDialog( - // context: context, - // confirmMessage: message, - // okText: "Yes", - // okFunction: () { - // ConfirmDialog.closeAlertDialog(context); - // callBack(); - // }, - // cancelText: "No", - // cancelFunction: () { - // ConfirmDialog.closeAlertDialog(context); - // }).showAlertDialog(context); - // } - - // void connect_Android() { - // // enable the Wifi if its off - // PlatformBridge() - // .enableWifiIfNot() - // .then((value) => { - // if (value == true) - // { - // callBack() - // // Wifi.list(SSID) - // // .then((value1) => { - // // if (value1.length > 0) {callBack()} else {log("No HMG network in range")} - // // }) - // // .catchError((e) { - // // log(e); - // // }) - // } - // }) - // .catchError((error) { - // showFailDailog(error); - // }); - // } +// void next() { +// if (Platform.isIOS) { +// confirmFromUser_iOS(); +// } else if (Platform.isAndroid) { +// confirmFromUser(); +// } +// } + +// void confirmFromUser_iOS() { +// String message = "You don't have internet access, Do you want to connect with HMG Network to use App.\n\nMake sure you are in HMG Network range"; +// ConfirmDialog( +// context: context, +// confirmMessage: message, +// okText: "Yes", +// okFunction: () { +// ConfirmDialog.closeAlertDialog(context); +// callBack(); +// }, +// cancelText: "No", +// cancelFunction: () { +// ConfirmDialog.closeAlertDialog(context); +// }).showAlertDialog(context); +// } + +// void connect_Android() { +// // enable the Wifi if its off +// PlatformBridge() +// .enableWifiIfNot() +// .then((value) => { +// if (value == true) +// { +// callBack() +// // Wifi.list(SSID) +// // .then((value1) => { +// // if (value1.length > 0) {callBack()} else {log("No HMG network in range")} +// // }) +// // .catchError((e) { +// // log(e); +// // }) +// } +// }) +// .catchError((error) { +// showFailDailog(error); +// }); +// } } diff --git a/lib/uitl/location_util.dart b/lib/uitl/location_util.dart index 43b5df01..4c744f52 100644 --- a/lib/uitl/location_util.dart +++ b/lib/uitl/location_util.dart @@ -3,6 +3,7 @@ import 'dart:io'; import 'package:diplomaticquarterapp/config/shared_pref_kay.dart'; import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; +import 'package:diplomaticquarterapp/uitl/utils.dart'; import 'package:diplomaticquarterapp/widgets/dialogs/confirm_dialog.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter_hms_gms_availability/flutter_hms_gms_availability.dart'; @@ -34,19 +35,32 @@ class LocationUtils { if (permission == LocationPermission.always || permission == LocationPermission.whileInUse) { Geolocator.getCurrentPosition(desiredAccuracy: LocationAccuracy.medium, timeLimit: Duration(seconds: 10)).then((value) { setLocation(value); - print(value.latitude); - print(value.longitude); if (callBack != null) callBack(LatLng(value.latitude, value.longitude)); }); } if (permission == LocationPermission.denied || permission == LocationPermission.deniedForever) { - if(await Permission.location.request().isGranted) { - getCurrentLocation(); - } else { - setZeroLocation(); - if (isShowConfirmDialog) showErrorLocationDialog(false); + if (Platform.isAndroid) { + Utils.showPermissionConsentDialog(context, TranslationBase.of(context).locationPermissionDialog, () { + Geolocator.getCurrentPosition(desiredAccuracy: LocationAccuracy.medium, timeLimit: Duration(seconds: 10)).then((value) { + setLocation(value); + if (callBack != null) callBack(LatLng(value.latitude, value.longitude)); + }); + }); + } else { + if (await Permission.location.request().isGranted) { + getCurrentLocation(); + } else { + setZeroLocation(); + if (isShowConfirmDialog) showErrorLocationDialog(false); + } } + // if(await Permission.location.request().isGranted) { + // getCurrentLocation(); + // } else { + // setZeroLocation(); + // if (isShowConfirmDialog) showErrorLocationDialog(false); + // } } }).catchError((err) { print(err); diff --git a/lib/uitl/translations_delegate_base.dart b/lib/uitl/translations_delegate_base.dart index 4b511b4e..a2d4fcca 100644 --- a/lib/uitl/translations_delegate_base.dart +++ b/lib/uitl/translations_delegate_base.dart @@ -2835,6 +2835,16 @@ class TranslationBase { String get covidConsent => localizedValues["covidConsent"][locale.languageCode]; String get covidConsentHeader => localizedValues["covidConsentHeader"][locale.languageCode]; String get drawOverAppsPermission => localizedValues["drawOverAppsPermission"][locale.languageCode]; + String get selectTamaraPlan => localizedValues["selectTamaraPlan"][locale.languageCode]; + String get installments => localizedValues["installments"][locale.languageCode]; + String get cameraPermissionDialog => localizedValues["cameraPermissionDialog"][locale.languageCode]; + String get galleryPermission => localizedValues["galleryPermission"][locale.languageCode]; + String get locationPermissionDialog => localizedValues["locationPermissionDialog"][locale.languageCode]; + String get calendarPermission => localizedValues["calendarPermission"][locale.languageCode]; + String get recordAudioPermission => localizedValues["recordAudioPermission"][locale.languageCode]; + String get wifiPermission => localizedValues["wifiPermission"][locale.languageCode]; + String get physicalActivityPermission => localizedValues["physicalActivityPermission"][locale.languageCode]; + String get bluetoothPermission => localizedValues["bluetoothPermission"][locale.languageCode]; } class TranslationBaseDelegate extends LocalizationsDelegate { diff --git a/lib/uitl/utils.dart b/lib/uitl/utils.dart index 9a2d13f7..a416da03 100644 --- a/lib/uitl/utils.dart +++ b/lib/uitl/utils.dart @@ -7,8 +7,10 @@ import 'package:auto_size_text/auto_size_text.dart'; import 'package:badges/badges.dart'; import 'package:cached_network_image/cached_network_image.dart'; import 'package:connectivity/connectivity.dart'; +import 'package:crypto/crypto.dart' as crypto; import 'package:diplomaticquarterapp/config/config.dart'; import 'package:diplomaticquarterapp/config/shared_pref_kay.dart'; +import 'package:diplomaticquarterapp/core/service/client/base_app_client.dart'; import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; import 'package:diplomaticquarterapp/extensions/string_extensions.dart'; import 'package:diplomaticquarterapp/models/Authentication/authenticated_user.dart'; @@ -38,6 +40,7 @@ import 'package:diplomaticquarterapp/pages/vaccine/my_vaccines_screen.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:diplomaticquarterapp/widgets/data_display/medical/medical_profile_item.dart'; import 'package:diplomaticquarterapp/widgets/dialogs/alert_dialog.dart'; +import 'package:diplomaticquarterapp/widgets/dialogs/covid_consent_dialog.dart'; import 'package:diplomaticquarterapp/widgets/transitions/fade_page.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; @@ -51,10 +54,6 @@ import 'app_shared_preferences.dart'; import 'app_toast.dart'; import 'gif_loader_dialog_utils.dart'; import 'navigation_service.dart'; -import 'package:crypto/crypto.dart' as crypto; -import 'dart:convert'; -import 'package:convert/convert.dart'; - AppSharedPreferences sharedPref = new AppSharedPreferences(); @@ -73,8 +72,7 @@ class Utils { /// Check The Internet Connection static Future checkConnection({bool bypassConnectionCheck = false}) async { - if(bypassConnectionCheck) - return true; + if (bypassConnectionCheck) return true; ConnectivityResult connectivityResult = await (Connectivity().checkConnectivity()); if ((connectivityResult == ConnectivityResult.mobile) || (connectivityResult == ConnectivityResult.wifi)) { @@ -98,6 +96,17 @@ class Utils { FocusScope.of(context).unfocus(); } + static showPermissionConsentDialog(BuildContext context, String message, Function onTap) { + showDialog( + context: context, + builder: (cxt) => CovidConsentDialog( + okTitle: TranslationBase.of(context).acceptLbl, + title: TranslationBase.of(context).covidConsentHeader, + message: message, + onTap: onTap, + )); + } + bool isSAUDIIDValid(String id, type) { if (type == 1) { if (id == null) { @@ -501,23 +510,13 @@ class Utils { if (projectViewModel.havePrivilege(32) || true) { medical.add(InkWell( onTap: () { - userData().then((userData_) { - if (projectViewModel.isLogin && userData_ != null || true) { - String patientID = userData_.patientID.toString(); - GifLoaderDialogUtils.showMyDialog(context); - // projectViewModel.platformBridge().connectHMGInternetWifi(patientID).then((value) => {GifLoaderDialogUtils.hideDialog(context)}).catchError((err) { - // print(err.toString()); - // }); - } else { - AlertDialogBox( - context: context, - confirmMessage: "Please login with your account first to use this feature", - okText: "OK", - okFunction: () { - AlertDialogBox.closeAlertDialog(context); - }).showAlertDialog(context); - } - }); + if (Platform.isAndroid) { + showPermissionConsentDialog(context, TranslationBase.of(context).wifiPermission, () { + connectWifi(projectViewModel, context); + }); + } else { + connectWifi(projectViewModel, context); + } }, child: MedicalProfileItem( title: TranslationBase.of(context).internet, @@ -540,6 +539,60 @@ class Utils { return medical; } + static getPatientWifiCredentials(String patientID, Function(String username, String password) successCallback) { + final body = {"PatientID": patientID}; + locator().post(WIFI_CREDENTIALS, body: body, onSuccess: (dynamic response, int statusCode) { + print(response); + var data = response["Hmg_SMS_Get_By_ProjectID_And_PatientIDList"]; + if (data is List && data.first != null) { + final username = data.first['UserName']; + final password = data.first['Password']; + if (username != null && password != null && username.isNotEmpty && password.isNotEmpty) { + successCallback(username, password); + } + } + }, onFailure: (String error, int statusCode) { + print(error); + }, bypassConnectionCheck: true); + } + + static connectWifi(ProjectViewModel projectViewModel, BuildContext context) { + final String GUEST_SSID = "HMG-MobileApp"; + final String PATIENT_SSID = "GUEST-POC"; + userData().then((userData_) { + if (projectViewModel.isLogin && userData_ != null || true) { + String patientID = userData_.patientID.toString(); + GifLoaderDialogUtils.showMyDialog(context); + // projectViewModel.platformBridge().connectHMGInternetWifi(patientID).then((value) => {GifLoaderDialogUtils.hideDialog(context)}).catchError((err) { + // print(err.toString()); + // }); + projectViewModel.platformBridge().connectHMGGuestWifi(GUEST_SSID).then((value) async { + if (value == 0) { + GifLoaderDialogUtils.hideDialog(context); + } else { + getPatientWifiCredentials(patientID, (username, password) async { + final result = await projectViewModel.platformBridge().connectHMGInternetWifi(PATIENT_SSID, username, password).catchError((err) => print(err.toString())); + GifLoaderDialogUtils.hideDialog(context); + if (result == 1) { + // Success + } + }); + } + }).catchError((e) { + GifLoaderDialogUtils.hideDialog(context); + }); + } else { + AlertDialogBox( + context: context, + confirmMessage: "Please login with your account first to use this feature", + okText: "OK", + okFunction: () { + AlertDialogBox.closeAlertDialog(context); + }).showAlertDialog(context); + } + }); + } + static List myMedicalListHomePage({ProjectViewModel projectViewModel, BuildContext context, bool isLogin, count}) { List medical = List(); diff --git a/lib/widgets/bottom_options/BottomSheet.dart b/lib/widgets/bottom_options/BottomSheet.dart index 0fc26907..5399a4c3 100644 --- a/lib/widgets/bottom_options/BottomSheet.dart +++ b/lib/widgets/bottom_options/BottomSheet.dart @@ -1,14 +1,21 @@ import 'dart:convert'; import 'dart:io'; +import 'package:diplomaticquarterapp/config/config.dart'; +import 'package:diplomaticquarterapp/services/permission/permission_service.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; +import 'package:diplomaticquarterapp/uitl/utils.dart'; import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; + // import 'package:feather_icons_flutter/feather_icons_flutter.dart'; import 'package:flutter/material.dart'; import 'package:image_picker/image_picker.dart'; class ImageOptions { - static showImageOptions(BuildContext context, Function(String,File) image,) { + static showImageOptions( + BuildContext context, + Function(String, File) image, + ) { showModalBottomSheet( backgroundColor: Colors.transparent, context: context, @@ -22,13 +29,16 @@ class ImageOptions { title: TranslationBase.of(context).gallery, icon: Icons.image, onTap: () async { - File _image = - File((await ImagePicker.platform.pickImage(source: ImageSource.gallery, imageQuality: 20)).path); - String fileName = _image.path; - final bytes = File(fileName).readAsBytesSync(); - String base64Encode = base64.encode(bytes); - if (base64Encode != null) { - image(base64Encode,_image); + if (Platform.isAndroid) { + galleryImageAndroid(image); + } else { + File _image = File((await ImagePicker.platform.pickImage(source: ImageSource.gallery, imageQuality: 20)).path); + String fileName = _image.path; + final bytes = File(fileName).readAsBytesSync(); + String base64Encode = base64.encode(bytes); + if (base64Encode != null) { + image(base64Encode, _image); + } } }, ), @@ -36,21 +46,22 @@ class ImageOptions { title: TranslationBase.of(context).camera, icon: Icons.camera_alt, onTap: () async { - File _image = - File((await ImagePicker.platform.pickImage(source: ImageSource.camera, imageQuality: 20)).path); - String fileName = _image.path; - final bytes = File(fileName).readAsBytesSync(); - String base64Encode = base64.encode(bytes); - if (base64Encode != null) { - image(base64Encode,_image); + if (Platform.isAndroid) { + cameraImageAndroid(image); + } else { + File _image = File((await ImagePicker.platform.pickImage(source: ImageSource.camera, imageQuality: 20)).path); + String fileName = _image.path; + final bytes = File(fileName).readAsBytesSync(); + String base64Encode = base64.encode(bytes); + if (base64Encode != null) { + image(base64Encode, _image); + } } }, ), _BottomSheetItem( title: TranslationBase.of(context).cancel, - onTap: (){ - - }, + onTap: () {}, ) ], ); @@ -58,6 +69,50 @@ class ImageOptions { } } +galleryImageAndroid(Function(String, File) image) async { + if(await PermissionService.isExternalStorageEnabled()) { + File _image = File((await ImagePicker.platform.pickImage(source: ImageSource.gallery, imageQuality: 20)).path); + String fileName = _image.path; + final bytes = File(fileName).readAsBytesSync(); + String base64Encode = base64.encode(bytes); + if (base64Encode != null) { + image(base64Encode, _image); + } + } else { + Utils.showPermissionConsentDialog(AppGlobal.context, TranslationBase.of(AppGlobal.context).galleryPermission, () async { + File _image = File((await ImagePicker.platform.pickImage(source: ImageSource.gallery, imageQuality: 20)).path); + String fileName = _image.path; + final bytes = File(fileName).readAsBytesSync(); + String base64Encode = base64.encode(bytes); + if (base64Encode != null) { + image(base64Encode, _image); + } + }); + } +} + +cameraImageAndroid(Function(String, File) image) async { + if (await PermissionService.isCameraEnabled()) { + File _image = File((await ImagePicker.platform.pickImage(source: ImageSource.camera, imageQuality: 20)).path); + String fileName = _image.path; + final bytes = File(fileName).readAsBytesSync(); + String base64Encode = base64.encode(bytes); + if (base64Encode != null) { + image(base64Encode, _image); + } + } else { + Utils.showPermissionConsentDialog(AppGlobal.context, TranslationBase.of(AppGlobal.context).cameraPermissionDialog, () async { + File _image = File((await ImagePicker.platform.pickImage(source: ImageSource.camera, imageQuality: 20)).path); + String fileName = _image.path; + final bytes = File(fileName).readAsBytesSync(); + String base64Encode = base64.encode(bytes); + if (base64Encode != null) { + image(base64Encode, _image); + } + }); + } +} + class _BottomSheet extends StatelessWidget { final List children; @@ -67,19 +122,14 @@ class _BottomSheet extends StatelessWidget { Widget build(BuildContext context) { return Container( padding: EdgeInsets.symmetric(vertical: 12.0), - decoration: BoxDecoration( - color: Theme.of(context).backgroundColor, - borderRadius: BorderRadius.only( - topLeft: Radius.circular(16.0), topRight: Radius.circular(16.0))), + decoration: BoxDecoration(color: Theme.of(context).backgroundColor, borderRadius: BorderRadius.only(topLeft: Radius.circular(16.0), topRight: Radius.circular(16.0))), child: SafeArea( top: false, child: Column( mainAxisSize: MainAxisSize.min, children: [ Container( - decoration: BoxDecoration( - color: Theme.of(context).dividerColor, - borderRadius: BorderRadius.circular(3.0)), + decoration: BoxDecoration(color: Theme.of(context).dividerColor, borderRadius: BorderRadius.circular(3.0)), width: 40.0, height: 6.0, ), @@ -97,13 +147,7 @@ class _BottomSheetItem extends StatelessWidget { final String title; final ITEM_COLOR color; - _BottomSheetItem( - {Key key, - this.onTap, - @required this.title, - this.icon, - this.color = ITEM_COLOR.primary}) - : super(key: key); + _BottomSheetItem({Key key, this.onTap, @required this.title, this.icon, this.color = ITEM_COLOR.primary}) : super(key: key); @override Widget build(BuildContext context) { @@ -121,18 +165,14 @@ class _BottomSheetItem extends StatelessWidget { if (icon != null) Icon( icon, - color: color == ITEM_COLOR.error - ? Theme.of(context).errorColor - : Theme.of(context).primaryColor, + color: color == ITEM_COLOR.error ? Theme.of(context).errorColor : Theme.of(context).primaryColor, size: 18.0, ), if (icon != null) SizedBox(width: 24.0), Texts( title ?? "", style: "bodyText2", - color: color == ITEM_COLOR.error - ? Theme.of(context).errorColor - : null, + color: color == ITEM_COLOR.error ? Theme.of(context).errorColor : null, ), ], ), diff --git a/lib/widgets/in_app_browser/InAppBrowser.dart b/lib/widgets/in_app_browser/InAppBrowser.dart index 66b9a342..5562469b 100644 --- a/lib/widgets/in_app_browser/InAppBrowser.dart +++ b/lib/widgets/in_app_browser/InAppBrowser.dart @@ -10,6 +10,7 @@ import 'package:diplomaticquarterapp/services/authentication/auth_provider.dart' import 'package:diplomaticquarterapp/services/livecare_services/livecare_provider.dart'; import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart'; import 'package:diplomaticquarterapp/uitl/app_toast.dart'; +import 'package:diplomaticquarterapp/uitl/date_uitl.dart'; import 'package:diplomaticquarterapp/uitl/gif_loader_dialog_utils.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; @@ -28,8 +29,8 @@ var _InAppBrowserOptions = InAppBrowserClassOptions( class MyInAppBrowser extends InAppBrowser { _PAYMENT_TYPE paymentType; - // static String APPLE_PAY_PAYFORT_URL = 'https://hmgwebservices.com/PayFortWebLive/PayFortApi/MakeApplePayRequest'; // Payfort Payment Gateway URL LIVE - static String APPLE_PAY_PAYFORT_URL = 'https://hmgwebservices.com/PayFortWeb/PayFortApi/MakeApplePayRequest'; // Payfort Payment Gateway URL UAT + static String APPLE_PAY_PAYFORT_URL = 'https://hmgwebservices.com/PayFortWebLive/PayFortApi/MakeApplePayRequest'; // Payfort Payment Gateway URL LIVE + // static String APPLE_PAY_PAYFORT_URL = 'https://hmgwebservices.com/PayFortWeb/PayFortApi/MakeApplePayRequest'; // Payfort Payment Gateway URL UAT // static String SERVICE_URL = 'https://hmgwebservices.com/PayFortWeb/pages/SendPayFortRequest.aspx'; // Payfort Payment Gateway URL UAT @@ -114,7 +115,6 @@ class MyInAppBrowser extends InAppBrowser { return Future.value(NavigationActionPolicy.ALLOW); } - getLanguageID() async { return await sharedPref.getStringWithDefaultValue(APP_LANGUAGE, 'ar'); } @@ -143,7 +143,7 @@ class MyInAppBrowser extends InAppBrowser { openPaymentBrowser(double amount, String orderDesc, String transactionID, String projId, String emailId, String paymentMethod, dynamic patientType, String patientName, dynamic patientID, AuthenticatedUser authenticatedUser, InAppBrowser browser, bool isLiveCareAppo, var servID, var LiveServID, - [var appoDate, var appoNo, var clinicID, var doctorID]) async { + [var appoDate, var appoNo, var clinicID, var doctorID, var installments]) async { this.browser = browser; await getPatientData(); if (paymentMethod == "ApplePay") { @@ -192,6 +192,13 @@ class MyInAppBrowser extends InAppBrowser { if (context != null) GifLoaderDialogUtils.hideDialog(context); AppToast.showErrorToast(message: err); }); + } else if (paymentMethod == "TAMARA") { + generateTamaraURL(amount, orderDesc, transactionID, projId, emailId, paymentMethod, patientType, patientName, patientID, authenticatedUser, isLiveCareAppo, servID, LiveServID, appoDate, appoNo, + clinicID, doctorID, "", installments) + .then((value) { + paymentType = _PAYMENT_TYPE.PATIENT; + this.browser.openUrlRequest(urlRequest: URLRequest(url: Uri.parse(value)), options: _InAppBrowserOptions); + }); } else { generateURL(amount, orderDesc, transactionID, projId, emailId, paymentMethod, patientType, patientName, patientID, authenticatedUser, isLiveCareAppo, servID, LiveServID, appoDate, appoNo, clinicID, doctorID) @@ -273,6 +280,40 @@ class MyInAppBrowser extends InAppBrowser { return 'data:text/html;base64,' + base64Str; } + Future generateTamaraURL(double amount, String orderDesc, String transactionID, String projId, String emailId, String paymentMethod, dynamic patientType, String patientName, + dynamic patientID, AuthenticatedUser authUser, bool isLiveCareAppo, var servID, var LiveServID, + [var appoDate, var appoNo, var clinicID, var doctorID, var patientData, var installments]) async { + getDeviceToken(); + String currentLanguageID = await getLanguageID() == 'ar' ? 'AR' : 'EN'; + String form = getTamaraForm(); + + form = form.replaceFirst("EMAIL_VALUE", emailId); + + form = form.replaceFirst('AMOUNT_VALUE', amount.toString()); + form = form.replaceFirst('ORDER_DESCRIPTION_VALUE', orderDesc); + form = form.replaceFirst('ORDER_ID_VALUE', transactionID); + form = form.replaceFirst('REQUEST_ID_VALUE', transactionID); + form = form.replaceFirst('PROJECT_ID_VALUE', projId); + form = form.replaceFirst('PAYMENT_OPTION_VALUE', paymentMethod); + form = form.replaceFirst('LANG_VALUE', currentLanguageID); + form = form.replaceFirst('SERVICE_URL_VALUE', "https://mdlaboratories.com/tamara/Home/Checkout"); + + form = form.replaceFirst('INSTALLMENTS_VALUE', installments); + form = form.replaceFirst('CUSTNATIONALID_VALUE', authUser.patientIdentificationNo); + form = form.replaceFirst('CUSTMOBILE_VALUE', authUser.mobileNumber); + form = form.replaceFirst('CUSTDOB_VALUE', DateUtil.getDayMonthYearDateFormatted(authUser.dateofBirthDataTime)); + + form = form.replaceFirst('CURRENCY_VALUE', authUser.outSA == 0 ? "SAR" : "AED"); + form = form.replaceFirst('COUNTRY_CODE_VALUE', authUser.outSA == 0 ? "966" : "971"); + form = form.replaceFirst('CUSTNAME_VALUE', patientName); + form = form.replaceFirst('CUSTLASTNAME_VALUE', patientName); + form = form.replaceFirst('CUSTID_VALUE', patientID.toString()); + + var bytes = utf8.encode(form); + var base64Str = base64.encode(bytes); + return 'data:text/html;base64,' + base64Str; + } + Future generatePharmacyURL( OrderDetailModel order, double amount, String orderDesc, String transactionID, String emailId, String paymentMethod, String patientName, dynamic patientID, AuthenticatedUser authUser) async { String pharmacyURL = PRESCRIPTION_PAYMENT_WITH_ORDERID + order.orderGuid + '&&CustomerId=' + "${order.customerId}"; @@ -288,7 +329,6 @@ class MyInAppBrowser extends InAppBrowser { '' + '' + '' + - // '' + '' + '' + '' + @@ -311,6 +351,43 @@ class MyInAppBrowser extends InAppBrowser { ''; } + String getTamaraForm() { + return ' ' + + '' + + '' + + '

' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + '
' + + '' + + '' + + ''; + } + String getLiveCareForm() { return ' ' + '' + @@ -370,8 +447,6 @@ class MyChromeSafariBrowser extends ChromeSafariBrowser { onLoadStartCallback("ApplePay"); } - - @override void onClosed() { print("ChromeSafari browser closed"); diff --git a/lib/widgets/others/floating_button_search.dart b/lib/widgets/others/floating_button_search.dart index b26f4f79..c0609420 100644 --- a/lib/widgets/others/floating_button_search.dart +++ b/lib/widgets/others/floating_button_search.dart @@ -48,12 +48,14 @@ import 'package:diplomaticquarterapp/pages/pharmacies/screens/pharmacy_module_pa import 'package:diplomaticquarterapp/pages/vaccine/my_vaccines_screen.dart'; import 'package:diplomaticquarterapp/routes.dart'; import 'package:diplomaticquarterapp/services/appointment_services/GetDoctorsList.dart'; +import 'package:diplomaticquarterapp/services/permission/permission_service.dart'; import 'package:diplomaticquarterapp/services/robo_search/event_provider.dart'; import 'package:diplomaticquarterapp/services/robo_search/search_provider.dart'; import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart'; import 'package:diplomaticquarterapp/uitl/app_toast.dart'; import 'package:diplomaticquarterapp/uitl/gif_loader_dialog_utils.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; +import 'package:diplomaticquarterapp/uitl/utils.dart'; import 'package:diplomaticquarterapp/widgets/buttons/defaultButton.dart'; import 'package:diplomaticquarterapp/widgets/text/app_texts_widget.dart'; import 'package:diplomaticquarterapp/widgets/transitions/fade_page.dart'; @@ -188,9 +190,21 @@ class _FloatingSearchButton extends State with TickerProvi ) : Image.asset('assets/images/gif/robot-idle.gif'), ), - onTap: () { - new RoboSearch(context: context).showAlertDialog(context); - initSpeechState().then((value) => {startVoiceSearch()}); + onTap: () async { + if (Platform.isAndroid) { + if (await PermissionService.isMicrophonePermissionEnabled()) { + new RoboSearch(context: context).showAlertDialog(context); + initSpeechState().then((value) => {startVoiceSearch()}); + } else { + Utils.showPermissionConsentDialog(context, TranslationBase.of(context).recordAudioPermission, () { + new RoboSearch(context: context).showAlertDialog(context); + initSpeechState().then((value) => {startVoiceSearch()}); + }); + } + } else { + new RoboSearch(context: context).showAlertDialog(context); + initSpeechState().then((value) => {startVoiceSearch()}); + } }, ), Positioned( diff --git a/pubspec.yaml b/pubspec.yaml index a488a015..a86ba1a4 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -45,7 +45,7 @@ dependencies: flutter_html: ^2.2.1 #Apple Pay - pay: ^1.0.7 + pay: ^1.0.8 # Pagnation pull_to_refresh: ^2.0.0