From d1978ec7d15d49eae320b4d22f89c44c93f7f356 Mon Sep 17 00:00:00 2001 From: haroon amjad Date: Wed, 27 Aug 2025 12:04:02 +0300 Subject: [PATCH] Location update fixes --- android/app/src/main/AndroidManifest.xml | 2 +- .../components/search_by_hospital_name.dart | 16 +- lib/uitl/location_util.dart | 33 +- lib/uitl/utils.dart | 380 ++++-------------- lib/widgets/dialogs/covid_consent_dialog.dart | 11 +- 5 files changed, 118 insertions(+), 324 deletions(-) diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index bd41df03..41bb8227 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -42,7 +42,7 @@ - + diff --git a/lib/pages/BookAppointment/components/search_by_hospital_name.dart b/lib/pages/BookAppointment/components/search_by_hospital_name.dart index 6d97c060..28ca67e3 100644 --- a/lib/pages/BookAppointment/components/search_by_hospital_name.dart +++ b/lib/pages/BookAppointment/components/search_by_hospital_name.dart @@ -51,9 +51,13 @@ class _SearchByHospitalState extends State { @override void initState() { WidgetsBinding.instance.addPostFrameCallback((_) { - locationUtils = new LocationUtils(isShowConfirmDialog: true, context: context); - locationUtils.getCurrentLocation(); - getProjectsList(); + locationUtils = new LocationUtils(isShowConfirmDialog: false, context: context); + locationUtils.getCurrentLocation(callBack: (_) { + getProjectsList(); + }, onConsentDeclined: () { + getProjectsList(); + }); + // getProjectsList(); }); } @@ -303,13 +307,13 @@ class _SearchByHospitalState extends State { GifLoaderDialogUtils.hideDialog(context); } else {} GifLoaderDialogUtils.hideDialog(context); - locationUtils.getCurrentLocation(); + // locationUtils.getCurrentLocation(); }).catchError((err) { GifLoaderDialogUtils.hideDialog(context); - locationUtils.getCurrentLocation(); + // locationUtils.getCurrentLocation(); }).catchError((err) { GifLoaderDialogUtils.hideDialog(context); - locationUtils.getCurrentLocation(); + // locationUtils.getCurrentLocation(); print(err); }); } diff --git a/lib/uitl/location_util.dart b/lib/uitl/location_util.dart index 13749be1..f211836b 100644 --- a/lib/uitl/location_util.dart +++ b/lib/uitl/location_util.dart @@ -24,7 +24,7 @@ class LocationUtils { LocationUtils({required this.isShowConfirmDialog, required this.context, this.isHuawei = false, this.isShowLocationTimeoutDialog = true}); - void getCurrentLocation({Function(LatLng)? callBack}) async { + void getCurrentLocation({Function(LatLng)? callBack, VoidCallback? onConsentDeclined}) async { if (Platform.isAndroid && isHuawei) { _getHMSCurrentLocation(callBack!); } else { @@ -32,15 +32,18 @@ class LocationUtils { if (value) { await Geolocator.checkPermission().then((permission) async { if (permission == LocationPermission.always || permission == LocationPermission.whileInUse) { - Geolocator.getCurrentPosition(desiredAccuracy: LocationAccuracy.medium, timeLimit: Duration(seconds: 5)).then((value) { + // Geolocator.getCurrentPosition(locationSettings: LocationSettings(accuracy: LocationAccuracy.medium, timeLimit: Duration(seconds: 5))).then((value) { + Geolocator.getLastKnownPosition().then((value) { setLocation(value); - if (callBack != null) callBack(LatLng(value.latitude, value.longitude)); + if (callBack != null) callBack(LatLng(value?.latitude ?? 0.0, value?.longitude ?? 0.0)); }).catchError((err) { print(err); if (isShowConfirmDialog && isShowLocationTimeoutDialog) { showLocationTimeOutDialog(failureCallBack: () { Geolocator.openAppSettings(); }); + } else { + onConsentDeclined?.call(); } }); } @@ -50,13 +53,16 @@ class LocationUtils { Utils.showPermissionConsentDialog(context, TranslationBase.of(context).locationPermissionDialog, () async { final hasPermission = await _handlePermission(); if (hasPermission) { - Geolocator.getCurrentPosition(desiredAccuracy: LocationAccuracy.medium, timeLimit: Duration(seconds: 10)).then((value) { + // Geolocator.getCurrentPosition(locationSettings: LocationSettings(accuracy: LocationAccuracy.medium, timeLimit: Duration(seconds: 5))).then((value) { + Geolocator.getLastKnownPosition().then((value) { setLocation(value); - if (callBack != null) callBack(LatLng(value.latitude, value.longitude)); + if (callBack != null) callBack(LatLng(value?.latitude ?? 0.0, value?.longitude ?? 0.0)); }); } else { if (isShowConfirmDialog) showErrorLocationDialog(false, failureCallBack: () {}); } + }, onConsentDeclined: () { + onConsentDeclined?.call(); }); } else { if (await Permission.location.request().isGranted) { @@ -81,20 +87,14 @@ class LocationUtils { Future checkIfGPSIsEnabled() async { if (Platform.isAndroid && isHuawei) { - FusedLocationProviderClient locationService = - FusedLocationProviderClient(); + FusedLocationProviderClient locationService = FusedLocationProviderClient(); LocationRequest locationRequest = LocationRequest(); locationRequest.priority = LocationRequest.PRIORITY_HIGH_ACCURACY; locationRequest.interval = 1000; - List locationRequestList = [ - locationRequest - ]; - LocationSettingsRequest locationSettingsRequest = - LocationSettingsRequest(requests: locationRequestList); + List locationRequestList = [locationRequest]; + LocationSettingsRequest locationSettingsRequest = LocationSettingsRequest(requests: locationRequestList); bool success = false; - locationService - .checkLocationSettings(locationSettingsRequest) - .then((settings) { + locationService.checkLocationSettings(locationSettingsRequest).then((settings) { success = true; }); return success; @@ -238,8 +238,7 @@ class LocationUtils { this.sharedPref.setDouble(USER_LAT, position?.latitude ?? 0.0); this.sharedPref.setDouble(USER_LONG, position?.longitude ?? 0.0); ProjectViewModel projectViewModel = Provider.of(context, listen: false); - projectViewModel.setLatitudeLongitude( - position?.latitude ?? 0.0, position?.longitude ?? 0.0); + projectViewModel.setLatitudeLongitude(position?.latitude ?? 0.0, position?.longitude ?? 0.0); } void setZeroLocation() { diff --git a/lib/uitl/utils.dart b/lib/uitl/utils.dart index d4a1bc01..9d985f09 100644 --- a/lib/uitl/utils.dart +++ b/lib/uitl/utils.dart @@ -81,8 +81,7 @@ enum GenderType { male, female } enum MaritalStatusType { single, married, divorced, widowed } class Utils { - static int? onOtpBtnPressed( - OTPType type, String? phoneNumber, BuildContext context) { + static int? onOtpBtnPressed(OTPType type, String? phoneNumber, BuildContext context) { if (phoneNumber == null || phoneNumber.isEmpty) { context.showBottomSheet( child: ExceptionBottomSheet( @@ -142,14 +141,10 @@ class Utils { sharedPref.remove(CLINICS_LIST); if (context.read().isArabic) { context.read().changeLanguage('en'); - locator() - .hamburgerMenu - .logMenuItemClick('change language to english'); + locator().hamburgerMenu.logMenuItemClick('change language to english'); } else { context.read().changeLanguage('ar'); - locator() - .hamburgerMenu - .logMenuItemClick('change language to arabic'); + locator().hamburgerMenu.logMenuItemClick('change language to arabic'); } } @@ -160,20 +155,7 @@ class Utils { final year = dateTime.year.toString(); // Map month number to short month name - const monthNames = [ - 'Jan', - 'Feb', - 'Mar', - 'Apr', - 'May', - 'Jun', - 'Jul', - 'Aug', - 'Sep', - 'Oct', - 'Nov', - 'Dec' - ]; + const monthNames = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']; final month = monthNames[dateTime.month - 1]; return '$day $month, $year'; @@ -195,20 +177,7 @@ class Utils { final year = parts[0]; // Map month number to short month name (Hijri months) - const hijriMonthNames = [ - 'Muharram', - 'Safar', - 'Rabi I', - 'Rabi II', - 'Jumada I', - 'Jumada II', - 'Rajab', - 'Sha\'ban', - 'Ramadan', - 'Shawwal', - 'Dhu al-Qi\'dah', - 'Dhu al-Hijjah' - ]; + const hijriMonthNames = ['Muharram', 'Safar', 'Rabi I', 'Rabi II', 'Jumada I', 'Jumada II', 'Rajab', 'Sha\'ban', 'Ramadan', 'Shawwal', 'Dhu al-Qi\'dah', 'Dhu al-Hijjah']; final monthIndex = int.tryParse(parts[1]) ?? 1; final month = hijriMonthNames[monthIndex - 1]; @@ -300,13 +269,10 @@ class Utils { // } // } - static Future checkConnection( - {bool bypassConnectionCheck = false}) async { + static Future checkConnection({bool bypassConnectionCheck = false}) async { if (bypassConnectionCheck) return true; - List connectivityResult = - await (Connectivity().checkConnectivity()); - if (connectivityResult.contains(ConnectivityResult.mobile) || - connectivityResult.contains(ConnectivityResult.wifi)) { + List connectivityResult = await (Connectivity().checkConnectivity()); + if (connectivityResult.contains(ConnectivityResult.mobile) || connectivityResult.contains(ConnectivityResult.wifi)) { return true; } else { return false; @@ -327,8 +293,7 @@ class Utils { FocusScope.of(context).unfocus(); } - static showPermissionConsentDialog( - BuildContext context, String message, VoidCallback? onTap) { + static showPermissionConsentDialog(BuildContext context, String message, VoidCallback? onTap, {VoidCallback? onConsentDeclined}) { showDialog( context: context, builder: (cxt) => CovidConsentDialog( @@ -336,6 +301,7 @@ class Utils { title: TranslationBase.of(context).covidConsentHeader, message: message, onTap: onTap!, + onConsentDeclined: onConsentDeclined!, )); } @@ -381,27 +347,13 @@ class Utils { } } - static String getAppointmentTransID(int projectID, int clinicID, int appoNo, - {bool isAddMilliseconds = true}) { + static String getAppointmentTransID(int projectID, int clinicID, int appoNo, {bool isAddMilliseconds = true}) { String currentMillis = DateTime.now().millisecondsSinceEpoch.toString(); - return projectID.toString() + - '-' + - clinicID.toString() + - '-' + - appoNo.toString() + - (isAddMilliseconds - ? '-' + - currentMillis.substring( - currentMillis.length - 5, currentMillis.length) - : ""); + return projectID.toString() + '-' + clinicID.toString() + '-' + appoNo.toString() + (isAddMilliseconds ? '-' + currentMillis.substring(currentMillis.length - 5, currentMillis.length) : ""); } static String getAdvancePaymentTransID(int projectID, int fileNumber) { - return projectID.toString() + - '-' + - fileNumber.toString() + - '-' + - DateTime.now().millisecondsSinceEpoch.toString(); + return projectID.toString() + '-' + fileNumber.toString() + '-' + DateTime.now().millisecondsSinceEpoch.toString(); } bool validateIDBox(String value, int type) { @@ -460,23 +412,14 @@ class Utils { } static validEmail(email) { - return RegExp( - r"^[a-zA-Z0-9.a-zA-Z0-9.!#$%&'*+-/=?^_`{|}~]+@[a-zA-Z0-9]+\.[a-zA-Z]+") - .hasMatch(email); + return RegExp(r"^[a-zA-Z0-9.a-zA-Z0-9.!#$%&'*+-/=?^_`{|}~]+@[a-zA-Z0-9]+\.[a-zA-Z]+").hasMatch(email); } - static List myMedicalList( - {ProjectViewModel? projectViewModel, - BuildContext? context, - bool? isLogin, - count, - Function? onWeCareClick}) { + static List myMedicalList({ProjectViewModel? projectViewModel, BuildContext? context, bool? isLogin, count, Function? onWeCareClick}) { List medical = []; medical.add(InkWell( - onTap: () => projectViewModel.havePrivilege(5) - ? Navigator.push(context, FadePage(page: MyAppointments())) - : null, + onTap: () => projectViewModel.havePrivilege(5) ? Navigator.push(context, FadePage(page: MyAppointments())) : null, child: isLogin! ? Stack(children: [ Container( @@ -495,8 +438,7 @@ class Utils { left: 8, top: 4, child: badge_import.Badge( - badgeAnimation: badge_import.BadgeAnimation.fade( - toAnimate: false), + badgeAnimation: badge_import.BadgeAnimation.fade(toAnimate: false), badgeStyle: badge_import.BadgeStyle( elevation: 0, shape: badge_import.BadgeShape.circle, @@ -506,11 +448,7 @@ class Utils { position: badge_import.BadgePosition.topEnd(), badgeContent: Container( padding: EdgeInsets.all(2.0), - child: Text(count.toString(), - style: TextStyle( - color: Colors.white, - fontWeight: FontWeight.bold, - fontSize: 12.0)), + child: Text(count.toString(), style: TextStyle(color: Colors.white, fontWeight: FontWeight.bold, fontSize: 12.0)), ), ), ) @@ -521,8 +459,7 @@ class Utils { top: 4, child: badge_import.Badge( position: badge_import.BadgePosition.topEnd(), - badgeAnimation: badge_import.BadgeAnimation.fade( - toAnimate: false), + badgeAnimation: badge_import.BadgeAnimation.fade(toAnimate: false), badgeStyle: badge_import.BadgeStyle( elevation: 0, shape: badge_import.BadgeShape.circle, @@ -531,11 +468,7 @@ class Utils { ), badgeContent: Container( padding: EdgeInsets.all(2.0), - child: Text(count.toString(), - style: TextStyle( - color: Colors.white, - fontWeight: FontWeight.bold, - fontSize: 12.0)), + child: Text(count.toString(), style: TextStyle(color: Colors.white, fontWeight: FontWeight.bold, fontSize: 12.0)), ), ), ) @@ -562,9 +495,7 @@ class Utils { } medical.add(InkWell( - onTap: () => projectViewModel.havePrivilege(7) - ? Navigator.push(context, FadePage(page: RadiologyHomePage())) - : null, + onTap: () => projectViewModel.havePrivilege(7) ? Navigator.push(context, FadePage(page: RadiologyHomePage())) : null, child: MedicalProfileItem( title: TranslationBase.of(context).radiology, imagePath: 'radiology.svg', @@ -574,9 +505,7 @@ class Utils { )); medical.add(InkWell( - onTap: () => projectViewModel.havePrivilege(12) - ? Navigator.push(context, FadePage(page: HomePrescriptionsPage())) - : null, + onTap: () => projectViewModel.havePrivilege(12) ? Navigator.push(context, FadePage(page: HomePrescriptionsPage())) : null, child: MedicalProfileItem( title: TranslationBase.of(context).medicines, imagePath: 'medicine_prescription.svg', @@ -602,8 +531,7 @@ class Utils { medical.add(InkWell( onTap: () { - if (projectViewModel.havePrivilege(48)) - Navigator.push(context, FadePage(page: ActiveMedicationsPage())); + if (projectViewModel.havePrivilege(48)) Navigator.push(context, FadePage(page: ActiveMedicationsPage())); }, child: MedicalProfileItem( title: TranslationBase.of(context).myMedical, @@ -622,17 +550,12 @@ class Utils { ), ) : null, - child: MedicalProfileItem( - title: TranslationBase.of(context).myDoctor, - imagePath: 'my_doc.svg', - subTitle: TranslationBase.of(context).myDoctorSubtitle, - isEnable: projectViewModel.havePrivilege(6)), + child: + MedicalProfileItem(title: TranslationBase.of(context).myDoctor, imagePath: 'my_doc.svg', subTitle: TranslationBase.of(context).myDoctorSubtitle, isEnable: projectViewModel.havePrivilege(6)), )); medical.add(InkWell( - onTap: () => projectViewModel.havePrivilege(14) - ? Navigator.push(context, FadePage(page: MyInvoices())) - : null, + onTap: () => projectViewModel.havePrivilege(14) ? Navigator.push(context, FadePage(page: MyInvoices())) : null, child: MedicalProfileItem( title: TranslationBase.of(context).invoicesList, imagePath: 'invoice_list.svg', @@ -642,9 +565,7 @@ class Utils { )); medical.add(InkWell( - onTap: () => projectViewModel.havePrivilege(85) - ? Navigator.push(context, FadePage(page: AnicllaryOrders())) - : null, + onTap: () => projectViewModel.havePrivilege(85) ? Navigator.push(context, FadePage(page: AnicllaryOrders())) : null, // onTap: () => Navigator.push(context, FadePage(page: AnicllaryOrders())), child: MedicalProfileItem( title: TranslationBase.of(context).anicllaryOrders, @@ -680,9 +601,7 @@ class Utils { )); medical.add(InkWell( - onTap: () => projectViewModel.havePrivilege(14) - ? Navigator.push(context, FadePage(page: EyeMeasurementsPage())) - : null, + onTap: () => projectViewModel.havePrivilege(14) ? Navigator.push(context, FadePage(page: EyeMeasurementsPage())) : null, child: MedicalProfileItem( title: TranslationBase.of(context).eye, imagePath: 'eye_measurement.svg', @@ -737,9 +656,7 @@ class Utils { )); medical.add(InkWell( - onTap: () => projectViewModel.havePrivilege(23) - ? Navigator.push(context, FadePage(page: AllergiesPage())) - : null, + onTap: () => projectViewModel.havePrivilege(23) ? Navigator.push(context, FadePage(page: AllergiesPage())) : null, child: MedicalProfileItem( title: TranslationBase.of(context).allergies, imagePath: 'allergies_diagnosed.svg', @@ -749,9 +666,7 @@ class Utils { )); medical.add(InkWell( - onTap: () => projectViewModel.havePrivilege(26) - ? Navigator.push(context, FadePage(page: MyVaccines())) - : null, + onTap: () => projectViewModel.havePrivilege(26) ? Navigator.push(context, FadePage(page: MyVaccines())) : null, child: MedicalProfileItem( title: TranslationBase.of(context).myVaccines, imagePath: 'vaccine_list.svg', @@ -761,9 +676,7 @@ class Utils { )); medical.add(InkWell( - onTap: () => projectViewModel.havePrivilege(20) - ? Navigator.push(context, FadePage(page: HomeReportPage())) - : null, + onTap: () => projectViewModel.havePrivilege(20) ? Navigator.push(context, FadePage(page: HomeReportPage())) : null, child: MedicalProfileItem( title: TranslationBase.of(context).medical, imagePath: 'medical_report.svg', @@ -773,9 +686,7 @@ class Utils { )); medical.add(InkWell( - onTap: () => projectViewModel.havePrivilege(19) - ? Navigator.push(context, FadePage(page: MonthlyReportsPage())) - : null, + onTap: () => projectViewModel.havePrivilege(19) ? Navigator.push(context, FadePage(page: MonthlyReportsPage())) : null, child: MedicalProfileItem( title: TranslationBase.of(context).monthly, imagePath: 'monthly_report.svg', @@ -785,9 +696,7 @@ class Utils { )); medical.add(InkWell( - onTap: () => projectViewModel.havePrivilege(16) - ? Navigator.push(context, FadePage(page: PatientSickLeavePage())) - : null, + onTap: () => projectViewModel.havePrivilege(16) ? Navigator.push(context, FadePage(page: PatientSickLeavePage())) : null, child: MedicalProfileItem( title: TranslationBase.of(context).sick, imagePath: 'sick_leave.svg', @@ -797,9 +706,7 @@ class Utils { )); medical.add(InkWell( - onTap: () => projectViewModel.havePrivilege(47) - ? Navigator.push(context, FadePage(page: MyBalancePage())) - : null, + onTap: () => projectViewModel.havePrivilege(47) ? Navigator.push(context, FadePage(page: MyBalancePage())) : null, child: MedicalProfileItem( title: TranslationBase.of(context).myBalance, imagePath: 'balance_credit.svg', @@ -816,9 +723,7 @@ class Utils { // )); medical.add(InkWell( - onTap: () => projectViewModel.havePrivilege(24) - ? Navigator.push(context, FadePage(page: MyTrackers())) - : null, + onTap: () => projectViewModel.havePrivilege(24) ? Navigator.push(context, FadePage(page: MyTrackers())) : null, child: MedicalProfileItem( title: TranslationBase.of(context).myTrackers, imagePath: 'tracker.svg', @@ -828,9 +733,7 @@ class Utils { )); medical.add(InkWell( - onTap: () => projectViewModel.havePrivilege(30) - ? Navigator.push(context, FadePage(page: SmartWatchInstructions())) - : null, + onTap: () => projectViewModel.havePrivilege(30) ? Navigator.push(context, FadePage(page: SmartWatchInstructions())) : null, child: MedicalProfileItem( title: TranslationBase.of(context).smartWatchesSubtitle, imagePath: 'smart_watch.svg', @@ -840,22 +743,16 @@ class Utils { )); medical.add(InkWell( - onTap: () => projectViewModel.havePrivilege(28) - ? Navigator.push(context, FadePage(page: AskDoctorHomPage())) - : null, + onTap: () => projectViewModel.havePrivilege(28) ? Navigator.push(context, FadePage(page: AskDoctorHomPage())) : null, child: MedicalProfileItem( - title: TranslationBase.of(context).askYourSubtitle, - imagePath: 'ask_doctor.svg', - subTitle: TranslationBase.of(context).askYour, - isEnable: projectViewModel.havePrivilege(28)), + title: TranslationBase.of(context).askYourSubtitle, imagePath: 'ask_doctor.svg', subTitle: TranslationBase.of(context).askYour, isEnable: projectViewModel.havePrivilege(28)), )); if (projectViewModel.havePrivilege(32) || true) { medical.add(InkWell( onTap: () { if (Platform.isAndroid) { - showPermissionConsentDialog( - context, TranslationBase.of(context).wifiPermission, () { + showPermissionConsentDialog(context, TranslationBase.of(context).wifiPermission, () { connectWifi(projectViewModel, context); }); } else { @@ -871,9 +768,7 @@ class Utils { } medical.add(InkWell( - onTap: () => projectViewModel.havePrivilege(40) - ? launch('whatsapp://send?phone=18885521858&text=') - : null, + onTap: () => projectViewModel.havePrivilege(40) ? launch('whatsapp://send?phone=18885521858&text=') : null, child: MedicalProfileItem( title: TranslationBase.of(context).chatbot, imagePath: 'chatbot.svg', @@ -885,20 +780,15 @@ class Utils { return medical; } - static getPatientWifiCredentials(String patientID, - Function(String username, String password) successCallback) { + 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) { + 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) { + if (username != null && password != null && username.isNotEmpty && password.isNotEmpty) { successCallback(username, password); } } @@ -917,18 +807,12 @@ class Utils { // projectViewModel.platformBridge().connectHMGInternetWifi(patientID).then((value) => {GifLoaderDialogUtils.hideDialog(context)}).catchError((err) { // print(err.toString()); // }); - projectViewModel - .platformBridge() - .connectHMGGuestWifi(GUEST_SSID) - .then((value) async { + 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())); + final result = await projectViewModel.platformBridge().connectHMGInternetWifi(PATIENT_SSID, username, password).catchError((err) => print(err.toString())); GifLoaderDialogUtils.hideDialog(context); if (result == 1) { // Success @@ -941,8 +825,7 @@ class Utils { } else { AlertDialogBox( context: context, - confirmMessage: - "Please login with your account first to use this feature", + confirmMessage: "Please login with your account first to use this feature", okText: "OK", okFunction: () { AlertDialogBox.closeAlertDialog(context); @@ -951,17 +834,11 @@ class Utils { }); } - static List myMedicalListHomePage( - {ProjectViewModel? projectViewModel, - BuildContext? context, - bool? isLogin, - count}) { + static List myMedicalListHomePage({ProjectViewModel? projectViewModel, BuildContext? context, bool? isLogin, count}) { List medical = []; medical.add(InkWell( - onTap: () => projectViewModel.havePrivilege(5) - ? Navigator.push(context!, FadePage(page: MyAppointments())) - : null, + onTap: () => projectViewModel.havePrivilege(5) ? Navigator.push(context!, FadePage(page: MyAppointments())) : null, child: isLogin! ? Stack(children: [ MedicalProfileItem( @@ -977,8 +854,7 @@ class Utils { top: 4, child: badge_import.Badge( position: badge_import.BadgePosition.topEnd(), - badgeAnimation: badge_import.BadgeAnimation.fade( - toAnimate: false), + badgeAnimation: badge_import.BadgeAnimation.fade(toAnimate: false), badgeStyle: badge_import.BadgeStyle( elevation: 0, shape: badge_import.BadgeShape.circle, @@ -987,11 +863,7 @@ class Utils { ), badgeContent: Container( padding: EdgeInsets.all(2.0), - child: Text(count.toString(), - style: TextStyle( - color: Colors.white, - fontWeight: FontWeight.bold, - fontSize: 12.0)), + child: Text(count.toString(), style: TextStyle(color: Colors.white, fontWeight: FontWeight.bold, fontSize: 12.0)), ), ), ) @@ -1001,8 +873,7 @@ class Utils { right: 8, top: 4, child: badge_import.Badge( - badgeAnimation: badge_import.BadgeAnimation.fade( - toAnimate: false), + badgeAnimation: badge_import.BadgeAnimation.fade(toAnimate: false), badgeStyle: badge_import.BadgeStyle( elevation: 0, shape: badge_import.BadgeShape.circle, @@ -1012,11 +883,7 @@ class Utils { position: badge_import.BadgePosition.topEnd(), badgeContent: Container( padding: EdgeInsets.all(2.0), - child: Text(count.toString(), - style: TextStyle( - color: Colors.white, - fontWeight: FontWeight.bold, - fontSize: 12.0)), + child: Text(count.toString(), style: TextStyle(color: Colors.white, fontWeight: FontWeight.bold, fontSize: 12.0)), ), ), ) @@ -1032,9 +899,7 @@ class Utils { )); medical.add(InkWell( - onTap: () => projectViewModel.havePrivilege(10) - ? Navigator.push(context, FadePage(page: LabsHomePage())) - : null, + onTap: () => projectViewModel.havePrivilege(10) ? Navigator.push(context, FadePage(page: LabsHomePage())) : null, child: MedicalProfileItem( title: TranslationBase.of(context).lab, imagePath: 'lab_result.svg', @@ -1044,9 +909,7 @@ class Utils { )); medical.add(InkWell( - onTap: () => projectViewModel.havePrivilege(7) - ? Navigator.push(context, FadePage(page: RadiologyHomePage())) - : null, + onTap: () => projectViewModel.havePrivilege(7) ? Navigator.push(context, FadePage(page: RadiologyHomePage())) : null, child: MedicalProfileItem( title: TranslationBase.of(context).radiology, imagePath: 'radiology.svg', @@ -1056,9 +919,7 @@ class Utils { )); medical.add(InkWell( - onTap: () => projectViewModel.havePrivilege(12) - ? Navigator.push(context, FadePage(page: HomePrescriptionsPage())) - : null, + onTap: () => projectViewModel.havePrivilege(12) ? Navigator.push(context, FadePage(page: HomePrescriptionsPage())) : null, child: MedicalProfileItem( title: TranslationBase.of(context).medicines, imagePath: 'medicine_prescription.svg', @@ -1076,24 +937,19 @@ class Utils { ), ) : null, - child: MedicalProfileItem( - title: TranslationBase.of(context).myDoctor, - imagePath: 'my_doc.svg', - subTitle: TranslationBase.of(context).myDoctorSubtitle, - isEnable: projectViewModel.havePrivilege(6)), + child: + MedicalProfileItem(title: TranslationBase.of(context).myDoctor, imagePath: 'my_doc.svg', subTitle: TranslationBase.of(context).myDoctorSubtitle, isEnable: projectViewModel.havePrivilege(6)), )); return medical; } - static Widget loadNetworkImage( - {required String url, BoxFit fitting = BoxFit.cover}) { + static Widget loadNetworkImage({required String url, BoxFit fitting = BoxFit.cover}) { return CachedNetworkImage( placeholderFadeInDuration: Duration(milliseconds: 250), fit: fitting, imageUrl: url, - placeholder: (context, url) => - Container(child: Center(child: CircularProgressIndicator())), + placeholder: (context, url) => Container(child: Center(child: CircularProgressIndicator())), errorWidget: (context, url, error) { return Icon( Icons.error, @@ -1111,11 +967,7 @@ class Utils { } static navigateToCartPage() { - Navigator.pushAndRemoveUntil( - locator()!.navigatorKey!.currentContext!, - MaterialPageRoute( - builder: (context) => LandingPagePharmacy(currentTab: 3)), - (Route r) => false); + Navigator.pushAndRemoveUntil(locator()!.navigatorKey!.currentContext!, MaterialPageRoute(builder: (context) => LandingPagePharmacy(currentTab: 3)), (Route r) => false); } static Widget tableColumnTitle(String text, {bool showDivider = true}) { @@ -1127,12 +979,7 @@ class Utils { Text( text, maxLines: 1, - style: TextStyle( - fontSize: 12, - fontWeight: FontWeight.w600, - color: Color(0xff2E303A), - letterSpacing: -0.48, - height: 18 / 12), + style: TextStyle(fontSize: 12, fontWeight: FontWeight.w600, color: Color(0xff2E303A), letterSpacing: -0.48, height: 18 / 12), ), SizedBox(height: 5), if (showDivider) @@ -1145,14 +992,8 @@ class Utils { ); } - static Widget tableColumnValue(String text, - {bool isLast = false, - bool isCapitable = true, - bool isHighLow = false, - bool isCurrency = false, - required ProjectViewModel mProjectViewModel}) { - ProjectViewModel projectViewModel = - mProjectViewModel ?? Provider.of(AppGlobal.context); + static Widget tableColumnValue(String text, {bool isLast = false, bool isCapitable = true, bool isHighLow = false, bool isCurrency = false, required ProjectViewModel mProjectViewModel}) { + ProjectViewModel projectViewModel = mProjectViewModel ?? Provider.of(AppGlobal.context); return Column( crossAxisAlignment: CrossAxisAlignment.start, mainAxisSize: MainAxisSize.min, @@ -1162,19 +1003,10 @@ class Utils { children: [ Expanded( child: Text( - isCapitable && !projectViewModel.isArabic - ? text.toLowerCase().capitalizeFirstofEach - : text, + isCapitable && !projectViewModel.isArabic ? text.toLowerCase().capitalizeFirstofEach : text, maxLines: 2, overflow: TextOverflow.ellipsis, - style: TextStyle( - fontSize: 12, - fontWeight: FontWeight.w600, - color: isHighLow - ? CustomColors.accentColor - : Color(0xff575757), - letterSpacing: -0.4, - height: 16 / 10), + style: TextStyle(fontSize: 12, fontWeight: FontWeight.w600, color: isHighLow ? CustomColors.accentColor : Color(0xff575757), letterSpacing: -0.4, height: 16 / 10), ), ), isCurrency ? getSaudiRiyalSymbol() : Container(), @@ -1191,10 +1023,7 @@ class Utils { ); } - static Widget tableColumnValueWithFlowChart(String text, String flowChartText, - {bool isLast = false, - bool isCapitable = true, - ProjectViewModel? mProjectViewModel}) { + static Widget tableColumnValueWithFlowChart(String text, String flowChartText, {bool isLast = false, bool isCapitable = true, ProjectViewModel? mProjectViewModel}) { return Column( crossAxisAlignment: CrossAxisAlignment.start, mainAxisSize: MainAxisSize.min, @@ -1204,25 +1033,14 @@ class Utils { text, maxLines: 2, overflow: TextOverflow.ellipsis, - style: TextStyle( - fontSize: 12, - fontWeight: FontWeight.w600, - color: Color(0xff575757), - letterSpacing: -0.4, - height: 16 / 10), + style: TextStyle(fontSize: 12, fontWeight: FontWeight.w600, color: Color(0xff575757), letterSpacing: -0.4, height: 16 / 10), ), SizedBox(height: 8), AutoSizeText( flowChartText, maxLines: 1, minFontSize: 6, - style: TextStyle( - decoration: TextDecoration.underline, - fontSize: 12, - fontWeight: FontWeight.w600, - color: Color(0xffD02127), - letterSpacing: -0.48, - height: 18 / 12), + style: TextStyle(decoration: TextDecoration.underline, fontSize: 12, fontWeight: FontWeight.w600, color: Color(0xffD02127), letterSpacing: -0.48, height: 18 / 12), ), SizedBox(height: 12), if (!isLast) @@ -1236,9 +1054,7 @@ class Utils { } static Future isGoogleServicesAvailable() async { - GooglePlayServicesAvailability availability = await GoogleApiAvailability - .instance - .checkGooglePlayServicesAvailability(); + GooglePlayServicesAvailability availability = await GoogleApiAvailability.instance.checkGooglePlayServicesAvailability(); String status = availability.toString().split('.').last; if (status == "success") { return true; @@ -1254,8 +1070,7 @@ class Utils { final lat1Radians = _toRadians(lat1); final lat2Radians = _toRadians(lat2); - final a = - _haversin(dLat) + cos(lat1Radians) * cos(lat2Radians) * _haversin(dLon); + final a = _haversin(dLat) + cos(lat1Radians) * cos(lat2Radians) * _haversin(dLon); final c = 2 * asin(sqrt(a)); return r * c; @@ -1265,8 +1080,7 @@ class Utils { static num _haversin(double radians) => pow(sin(radians / 2), 2); - static Widget tableColumnValueWithUnderLine(String text, - {bool isLast = false, bool isCapitable = true}) { + static Widget tableColumnValueWithUnderLine(String text, {bool isLast = false, bool isCapitable = true}) { return Column( crossAxisAlignment: CrossAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.center, @@ -1277,13 +1091,7 @@ class Utils { isCapitable ? text.toLowerCase().capitalizeFirstofEach : text, maxLines: 1, minFontSize: 6, - style: TextStyle( - decoration: TextDecoration.underline, - fontSize: 12, - fontWeight: FontWeight.w600, - color: Color(0xffD02127), - letterSpacing: -0.48, - height: 18 / 12), + style: TextStyle(decoration: TextDecoration.underline, fontSize: 12, fontWeight: FontWeight.w600, color: Color(0xffD02127), letterSpacing: -0.48, height: 18 / 12), ), SizedBox(height: 10), if (!isLast) @@ -1300,8 +1108,7 @@ class Utils { return crypto.md5.convert(utf8.encode(input)).toString(); } - static bool isVidaPlusProject( - ProjectViewModel projectViewModel, int projectID) { + static bool isVidaPlusProject(ProjectViewModel projectViewModel, int projectID) { bool isVidaPlus = false; projectViewModel.vidaPlusProjectList.forEach((element) { if (element.projectID == projectID) { @@ -1321,8 +1128,7 @@ class Utils { return isHMCProject; } - static ProjectDetailListModel getProjectDetailObj( - ProjectViewModel projectViewModel, int projectID) { + static ProjectDetailListModel getProjectDetailObj(ProjectViewModel projectViewModel, int projectID) { ProjectDetailListModel projectDetailListModel = ProjectDetailListModel(); projectViewModel.projectDetailListModel.forEach((element) { if (element.projectID == projectID) { @@ -1333,20 +1139,13 @@ class Utils { } static Widget getSaudiRiyalSymbol({double fontSize = 16}) { - return Text(" SAR ", - style: TextStyle(fontFamily: "SaudiRiyal", fontSize: fontSize)); + return Text(" SAR ", style: TextStyle(fontFamily: "SaudiRiyal", fontSize: fontSize)); } //static String generateSignature() {} } -Widget applyShadow( - {Color color = Colors.grey, - double shadowOpacity = 0.5, - double spreadRadius = 2, - double blurRadius = 7, - Offset offset = const Offset(2, 2), - required Widget child}) { +Widget applyShadow({Color color = Colors.grey, double shadowOpacity = 0.5, double spreadRadius = 2, double blurRadius = 7, Offset offset = const Offset(2, 2), required Widget child}) { return Container( decoration: BoxDecoration( boxShadow: [ @@ -1363,8 +1162,7 @@ Widget applyShadow( } Future userData() async { - var userData = AuthenticatedUser.fromJson( - await AppSharedPreferences().getObject(MAIN_USER)); + var userData = AuthenticatedUser.fromJson(await AppSharedPreferences().getObject(MAIN_USER)); return userData; } @@ -1376,13 +1174,9 @@ extension IndexedIterable on Iterable { } } -openAppStore( - {String? androidPackageName, - String? iOSAppID, - bool isHuawei = false}) async { +openAppStore({String? androidPackageName, String? iOSAppID, bool isHuawei = false}) async { if (Platform.isAndroid) { - assert(!(androidPackageName == null), - "Should have valid value in androidPackageName parameter"); + assert(!(androidPackageName == null), "Should have valid value in androidPackageName parameter"); if (isHuawei) { launchUrl(Uri.parse("appmarket://details?id=com.ejada.hmg")); } else { @@ -1390,8 +1184,7 @@ openAppStore( } } else if (Platform.isIOS) { assert((iOSAppID == null), "Should have valid value in iOSAppID parameter"); - launchUrl( - Uri.parse("https://itunes.apple.com/kr/app/apple-store/$iOSAppID)")); + launchUrl(Uri.parse("https://itunes.apple.com/kr/app/apple-store/$iOSAppID)")); } } @@ -1414,11 +1207,7 @@ String labelFrom({required String className}) { extension StringExtension on String { String capitalize() { - return this.splitMapJoin(RegExp(r'\w+'), - onMatch: (m) => - '${m.group(0)}'.substring(0, 1).toUpperCase() + - '${m.group(0)}'.substring(1).toLowerCase(), - onNonMatch: (n) => ' '); + return this.splitMapJoin(RegExp(r'\w+'), onMatch: (m) => '${m.group(0)}'.substring(0, 1).toUpperCase() + '${m.group(0)}'.substring(1).toLowerCase(), onNonMatch: (n) => ' '); } } @@ -1522,12 +1311,9 @@ extension SelectedLanguageExtension on BuildContext { return language; } - double getLottieScaledWidth(double value) => - MediaQuery.of(this).size.width * (value / MediaQuery.of(this).size.width); + double getLottieScaledWidth(double value) => MediaQuery.of(this).size.width * (value / MediaQuery.of(this).size.width); - double getLottieScaledHeight(double value) => - MediaQuery.of(this).size.height * - (value / MediaQuery.of(this).size.height); + double getLottieScaledHeight(double value) => MediaQuery.of(this).size.height * (value / MediaQuery.of(this).size.height); } extension GenderTypeExtension on GenderType { diff --git a/lib/widgets/dialogs/covid_consent_dialog.dart b/lib/widgets/dialogs/covid_consent_dialog.dart index bf052769..c2267d40 100644 --- a/lib/widgets/dialogs/covid_consent_dialog.dart +++ b/lib/widgets/dialogs/covid_consent_dialog.dart @@ -8,8 +8,9 @@ class CovidConsentDialog extends StatelessWidget { final String? message; final String? okTitle; final VoidCallback? onTap; + final VoidCallback? onConsentDeclined; - const CovidConsentDialog({Key? key, this.title, @required this.message, this.okTitle, this.onTap}) : super(key: key); + const CovidConsentDialog({Key? key, this.title, @required this.message, this.okTitle, this.onTap, this.onConsentDeclined}) : super(key: key); @override Widget build(BuildContext context) { @@ -42,6 +43,7 @@ class CovidConsentDialog extends StatelessWidget { constraints: BoxConstraints(), onPressed: () { Navigator.pop(context); + onConsentDeclined?.call(); }, ) ], @@ -57,7 +59,10 @@ class CovidConsentDialog extends StatelessWidget { Expanded( child: DefaultButton( TranslationBase.of(context).declineLbl, - () => Navigator.pop(context), + () { + Navigator.pop(context); + onConsentDeclined?.call(); + }, textColor: Colors.white, color: CustomColors.accentColor, ), @@ -66,7 +71,7 @@ class CovidConsentDialog extends StatelessWidget { Expanded( child: DefaultButton( okTitle ?? TranslationBase.of(context).ok, - () { + () { Navigator.pop(context); onTap!(); },