From e45c2c565269efea525aa65d74fc48cb6228e05c Mon Sep 17 00:00:00 2001 From: haroon amjad Date: Wed, 5 Jan 2022 15:32:44 +0300 Subject: [PATCH 1/7] covid & pharmacy updates --- lib/config/localized_values.dart | 4 +- .../DriveThroughTestingCenterModel.dart | 34 ++++--- .../Covid-DriveThru/Covid-TimeSlots.dart | 53 ++++++++--- .../covid-dirvethru-questions.dart | 7 +- .../covid-drivethru-location.dart | 31 +++++- .../covid-payment-details.dart | 20 +--- .../fragments/home_page_fragment2.dart | 2 +- lib/pages/pharmacies/my_reviews.dart | 80 +++++++--------- .../screens/cart-page/cart-order-page.dart | 1 + .../pharmacyAddresses/PharmacyAddresses.dart | 94 +++++++++---------- lib/pages/pharmacy/profile/profile.dart | 2 +- .../appointment_services/GetDoctorsList.dart | 4 +- .../covid-drivethru/covid-drivethru.dart | 18 +++- 13 files changed, 198 insertions(+), 152 deletions(-) diff --git a/lib/config/localized_values.dart b/lib/config/localized_values.dart index 06c4f4f6..7fed99a8 100644 --- a/lib/config/localized_values.dart +++ b/lib/config/localized_values.dart @@ -1140,8 +1140,8 @@ const Map localizedValues = { }, "updated-email": {"en": "Updated email successfully", "ar": "تم تحديث البريد الالكتروني"}, "view-list-children": {"en": "View List of Children", "ar": "عرض قائمة الأطفال"}, - "covidTest": {"en": "COVID-19 TEST", "ar": "فحص كورونا"}, - "driveThru": {"en": "Drive-Thru", "ar": "من داخل السيارة"}, + "covidTest": {"en": "COVID-19", "ar": "فحص"}, + "driveThru": {"en": "Test", "ar": "كورونا"}, "trackDeliveryDriver": {"en": "Track Delivery Driver", "ar": "تتبع السائق"}, "NearestErDesc": { "en": "This service Displays nearest branch among all the branches of All Habib medical Group based on your current Location", diff --git a/lib/models/CovidDriveThru/DriveThroughTestingCenterModel.dart b/lib/models/CovidDriveThru/DriveThroughTestingCenterModel.dart index c85a06b3..8e10af17 100644 --- a/lib/models/CovidDriveThru/DriveThroughTestingCenterModel.dart +++ b/lib/models/CovidDriveThru/DriveThroughTestingCenterModel.dart @@ -9,6 +9,8 @@ class DriveThroughTestingCenterModel { bool isActive; int createdBy; String createdOn; + num testTypeEnum; + num testProcedureEnum; dynamic editedBy; dynamic editedON; dynamic projectName; @@ -16,19 +18,21 @@ class DriveThroughTestingCenterModel { DriveThroughTestingCenterModel( {this.rowID, - this.iD, - this.projectID, - this.setupID, - this.longitude, - this.latitude, - this.numberOfTracks, - this.isActive, - this.createdBy, - this.createdOn, - this.editedBy, - this.editedON, - this.projectName, - this.projectNameN}); + this.iD, + this.projectID, + this.setupID, + this.longitude, + this.latitude, + this.numberOfTracks, + this.isActive, + this.createdBy, + this.createdOn, + this.testTypeEnum, + this.testProcedureEnum, + this.editedBy, + this.editedON, + this.projectName, + this.projectNameN}); DriveThroughTestingCenterModel.fromJson(Map json) { rowID = json['RowID']; @@ -41,6 +45,8 @@ class DriveThroughTestingCenterModel { isActive = json['IsActive']; createdBy = json['CreatedBy']; createdOn = json['CreatedOn']; + testTypeEnum = json['TestTypeEnum']; + testProcedureEnum = json['TestprocedureEnum']; editedBy = json['EditedBy']; editedON = json['EditedON']; projectName = json['ProjectName']; @@ -59,6 +65,8 @@ class DriveThroughTestingCenterModel { data['IsActive'] = this.isActive; data['CreatedBy'] = this.createdBy; data['CreatedOn'] = this.createdOn; + data['TestTypeEnum'] = this.testTypeEnum; + data['TestprocedureEnum'] = this.testProcedureEnum; data['EditedBy'] = this.editedBy; data['EditedON'] = this.editedON; data['ProjectName'] = this.projectName; diff --git a/lib/pages/Covid-DriveThru/Covid-TimeSlots.dart b/lib/pages/Covid-DriveThru/Covid-TimeSlots.dart index 672dae53..0115083f 100644 --- a/lib/pages/Covid-DriveThru/Covid-TimeSlots.dart +++ b/lib/pages/Covid-DriveThru/Covid-TimeSlots.dart @@ -6,6 +6,7 @@ import 'package:diplomaticquarterapp/models/Appointments/PatientShareResposne.da import 'package:diplomaticquarterapp/models/Appointments/timeSlot.dart'; import 'package:diplomaticquarterapp/models/Appointments/toDoCountProviderModel.dart'; import 'package:diplomaticquarterapp/models/CovidDriveThru/CovidTestProceduresResponse.dart'; +import 'package:diplomaticquarterapp/models/CovidDriveThru/DriveThroughTestingCenterModel.dart'; import 'package:diplomaticquarterapp/pages/Covid-DriveThru/covid-payment-alert.dart'; import 'package:diplomaticquarterapp/services/appointment_services/GetDoctorsList.dart'; import 'package:diplomaticquarterapp/services/clinic_services/get_clinic_service.dart'; @@ -23,7 +24,6 @@ import 'package:diplomaticquarterapp/widgets/transitions/fade_page.dart'; import 'package:flutter/material.dart'; import 'package:intl/intl.dart'; import 'package:provider/provider.dart'; - import 'package:syncfusion_flutter_calendar/calendar.dart'; class CovidTimeSlots extends StatefulWidget { @@ -33,6 +33,7 @@ class CovidTimeSlots extends StatefulWidget { static String selectedDate; static String selectedTime; CovidTestProceduresResponse selectedProcedure; + DriveThroughTestingCenterModel selectedProject; int selectedClinicID; int selectedDoctorID; @@ -41,7 +42,7 @@ class CovidTimeSlots extends StatefulWidget { PatientShareResponse patientShareResponse; - CovidTimeSlots({@required this.projectID, @required this.selectedProcedure}); + CovidTimeSlots({@required this.projectID, @required this.selectedProcedure, @required this.selectedProject}); @override _CovidTimeSlotsState createState() => _CovidTimeSlotsState(); @@ -68,6 +69,7 @@ class _CovidTimeSlotsState extends State with TickerProviderStat ScrollController _scrollController; ToDoCountProviderModel toDoProvider; + ProjectViewModel projectViewModel; @override void initState() { @@ -113,7 +115,7 @@ class _CovidTimeSlotsState extends State with TickerProviderStat @override Widget build(BuildContext context) { - ProjectViewModel projectViewModel = Provider.of(context); + projectViewModel = Provider.of(context); toDoProvider = Provider.of(context); return AppScaffold( appBarTitle: TranslationBase.of(context).covidTest, @@ -359,7 +361,8 @@ class _CovidTimeSlotsState extends State with TickerProviderStat Widget getSelectedButton(int index) { return RaisedButton( - color: CustomColors.green, //Color of the border + color: CustomColors.green, + //Color of the border elevation: 0, textColor: Colors.white, onPressed: () { @@ -374,13 +377,36 @@ class _CovidTimeSlotsState extends State with TickerProviderStat } bookCovidTestAppointment() { - if(CovidTimeSlots.areSlotsAvailable) { - GifLoaderDialogUtils.showMyDialog(context); - DoctorList docObject = new DoctorList(); - docObject.doctorID = widget.selectedDoctorID; - docObject.clinicID = widget.selectedClinicID; - docObject.projectID = widget.projectID; - insertAppointmentCovidTest(context, docObject); + if (CovidTimeSlots.areSlotsAvailable) { + var messageEn = "This Appointment is being booked for patient " + + projectViewModel.authenticatedUserObject.user.firstName + + " " + + projectViewModel.authenticatedUserObject.user.lastName + + ", Having file number " + + projectViewModel.authenticatedUserObject.user.patientID.toString() + + ". Please confirm!"; + var messageAr = "يتم حجز هذا الموعد المراجع " + + projectViewModel.authenticatedUserObject.user.firstName + + " " + + projectViewModel.authenticatedUserObject.user.lastName + + ", وجود رقم الملف " + + projectViewModel.authenticatedUserObject.user.patientID.toString() + + ". يرجى تأكيد!"; + ConfirmDialog dialog = new ConfirmDialog( + context: context, + confirmMessage: projectViewModel.isArabic ? messageAr : messageEn, + okText: TranslationBase.of(context).confirm, + cancelText: TranslationBase.of(context).cancel_nocaps, + okFunction: () { + GifLoaderDialogUtils.showMyDialog(context); + DoctorList docObject = new DoctorList(); + docObject.doctorID = widget.selectedDoctorID; + docObject.clinicID = widget.selectedClinicID; + docObject.projectID = widget.projectID; + insertAppointmentCovidTest(context, docObject); + }, + cancelFunction: () => {}); + dialog.showAlertDialog(context); } else { AppToast.showErrorToast(message: TranslationBase.of(context).selectSlot); } @@ -390,7 +416,8 @@ class _CovidTimeSlotsState extends State with TickerProviderStat DoctorsListService service = new DoctorsListService(); AppoitmentAllHistoryResultList appo; service - .insertAppointment(docObject.doctorID, docObject.clinicID, docObject.projectID, CovidTimeSlots.selectedTime, CovidTimeSlots.selectedDate, context, widget.selectedProcedure.procedureID) + .insertAppointment(docObject.doctorID, docObject.clinicID, docObject.projectID, CovidTimeSlots.selectedTime, CovidTimeSlots.selectedDate, context, widget.selectedProcedure.procedureID, + widget.selectedProject.testTypeEnum, widget.selectedProject.testProcedureEnum) .then((res) { if (res['MessageStatus'] == 1) { AppToast.showSuccessToast(message: TranslationBase.of(context).bookedSuccess); @@ -482,7 +509,7 @@ class _CovidTimeSlotsState extends State with TickerProviderStat getCovidFreeSlots(BuildContext context, int projectID) { CovidDriveThruService service = new CovidDriveThruService(); GifLoaderDialogUtils.showMyDialog(context); - service.getCovidFreeSlots(context, projectID).then((res) { + service.getCovidFreeSlots(context, projectID, widget.selectedProject.testTypeEnum, widget.selectedProject.testProcedureEnum).then((res) { GifLoaderDialogUtils.hideDialog(context); if (res['MessageStatus'] == 1) { if (res['COVID19_FreeTimeSlots'].length != 0) { diff --git a/lib/pages/Covid-DriveThru/covid-dirvethru-questions.dart b/lib/pages/Covid-DriveThru/covid-dirvethru-questions.dart index 78ee36f0..ee6725e9 100644 --- a/lib/pages/Covid-DriveThru/covid-dirvethru-questions.dart +++ b/lib/pages/Covid-DriveThru/covid-dirvethru-questions.dart @@ -3,6 +3,7 @@ import 'dart:convert'; import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; import 'package:diplomaticquarterapp/models/CovidDriveThru/CovidPaymentInfoResponse.dart'; import 'package:diplomaticquarterapp/models/CovidDriveThru/CovidTestProceduresResponse.dart'; +import 'package:diplomaticquarterapp/models/CovidDriveThru/DriveThroughTestingCenterModel.dart'; import 'package:diplomaticquarterapp/pages/medical/labs/passport_update_page.dart'; import 'package:diplomaticquarterapp/services/covid-drivethru/covid-drivethru.dart'; import 'package:diplomaticquarterapp/theme/colors.dart'; @@ -21,8 +22,9 @@ import 'covid-payment-details.dart'; class CovidDirveThruQuestions extends StatefulWidget { final String projectId; final List proceduresList; + DriveThroughTestingCenterModel selectedProject; - CovidDirveThruQuestions({@required this.projectId, @required this.proceduresList}); + CovidDirveThruQuestions({@required this.projectId, @required this.proceduresList, @required this.selectedProject}); @override CovidDirveThruQuestionsState createState() => CovidDirveThruQuestionsState(); @@ -296,7 +298,7 @@ class CovidDirveThruQuestionsState extends State { CovidDriveThruService service = new CovidDriveThruService(); CovidPaymentInfoResponse covidPaymentInfoResponse = new CovidPaymentInfoResponse(); GifLoaderDialogUtils.showMyDialog(context); - service.getCovidPaymentInformation(context, int.parse(projectID), widget.proceduresList[0].procedureID).then((res) { + service.getCovidPaymentInformation(context, int.parse(projectID), widget.proceduresList[0].procedureID, widget.selectedProject.testTypeEnum, widget.selectedProject.testProcedureEnum).then((res) { GifLoaderDialogUtils.hideDialog(context); if (res['MessageStatus'] == 1) { covidPaymentInfoResponse = CovidPaymentInfoResponse.fromJson(res['COVID19_PatientShare']); @@ -307,6 +309,7 @@ class CovidDirveThruQuestionsState extends State { covidPaymentInfoResponse: covidPaymentInfoResponse, projectID: int.parse(projectID), proceduresList: widget.proceduresList, + selectedProject: widget.selectedProject, ))); } else {} }).catchError((err) { diff --git a/lib/pages/Covid-DriveThru/covid-drivethru-location.dart b/lib/pages/Covid-DriveThru/covid-drivethru-location.dart index a0842a73..e1ddad8e 100644 --- a/lib/pages/Covid-DriveThru/covid-drivethru-location.dart +++ b/lib/pages/Covid-DriveThru/covid-drivethru-location.dart @@ -49,7 +49,6 @@ class _CovidDrivethruLocationState extends State { WidgetsBinding.instance.addPostFrameCallback((_) { if (projectViewModel.isLogin) { getProjectsList(context); - getTestProcedures(context); } }); super.initState(); @@ -129,7 +128,10 @@ class _CovidDrivethruLocationState extends State { items: projectsList.map((DriveThroughTestingCenterModel item) { return new DropdownMenuItem( value: item, - child: new Text(item.projectName), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [Text(item.projectName), getCovidTestTypeImage(item)], + ), ); }).toList(), onChanged: (newValue) { @@ -256,6 +258,23 @@ class _CovidDrivethruLocationState extends State { ); } + Widget getCovidTestTypeImage(DriveThroughTestingCenterModel item) { + if (item.testTypeEnum == 1) { + return Container(child: SvgPicture.asset("assets/images/new/DriveThru.svg", width: 20.0)); + } + if (item.testTypeEnum == 2) { + return Container(child: SvgPicture.asset("assets/images/new/WalkIn.svg", width: 10.0)); + } + if (item.testTypeEnum == 3) { + return Row( + children: [ + Container(child: SvgPicture.asset("assets/images/new/WalkIn.svg", width: 10.0)), + Container(padding: EdgeInsets.only(left: 5.0, right: 5.0), child: SvgPicture.asset("assets/images/new/DriveThru.svg", width: 20.0)), + ], + ); + } + } + getDirections() { if (isLocationSelected) { MapsLauncher.launchCoordinates(double.parse(projectLat), double.parse(projectLong), this.projectName); @@ -266,7 +285,7 @@ class _CovidDrivethruLocationState extends State { next() { if (isLocationSelected) { - Navigator.push(context, FadePage(page: CovidDirveThruQuestions(projectId: projectID, proceduresList: proceduresList))); + Navigator.push(context, FadePage(page: CovidDirveThruQuestions(projectId: projectID, proceduresList: proceduresList, selectedProject: selectedProject))); } else { Utils.showErrorToast("Please select address from the dropdown menu to continue"); } @@ -284,13 +303,14 @@ class _CovidDrivethruLocationState extends State { this.projectID = newValue.projectID.toString(); isLocationSelected = true; }); + getTestProcedures(context); } getPaymentInfo(BuildContext context, String projectID) { CovidDriveThruService service = new CovidDriveThruService(); CovidPaymentInfoResponse covidPaymentInfoResponse = new CovidPaymentInfoResponse(); GifLoaderDialogUtils.showMyDialog(context); - service.getCovidPaymentInformation(context, int.parse(projectID), proceduresList[0].procedureID).then((res) { + service.getCovidPaymentInformation(context, int.parse(projectID), proceduresList[0].procedureID, selectedProject.testTypeEnum, selectedProject.testProcedureEnum).then((res) { GifLoaderDialogUtils.hideDialog(context); if (res['MessageStatus'] == 1) { setState(() { @@ -303,6 +323,7 @@ class _CovidDrivethruLocationState extends State { covidPaymentInfoResponse: covidPaymentInfoResponse, projectID: int.parse(projectID), proceduresList: proceduresList, + selectedProject: selectedProject, ))); } else {} }).catchError((err) { @@ -314,7 +335,7 @@ class _CovidDrivethruLocationState extends State { CovidDriveThruService service = new CovidDriveThruService(); GifLoaderDialogUtils.showMyDialog(context); - service.getCovidTestProceduresList(context).then((res) { + service.getCovidTestProceduresList(context, selectedProject.testTypeEnum, selectedProject.testProcedureEnum, selectedProject.projectID).then((res) { if (res['MessageStatus'] == 1) { setState(() { res['COVID19_TestProceduresList'].forEach((v) { diff --git a/lib/pages/Covid-DriveThru/covid-payment-details.dart b/lib/pages/Covid-DriveThru/covid-payment-details.dart index 2301de51..7f2ba582 100644 --- a/lib/pages/Covid-DriveThru/covid-payment-details.dart +++ b/lib/pages/Covid-DriveThru/covid-payment-details.dart @@ -1,17 +1,16 @@ import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; import 'package:diplomaticquarterapp/models/CovidDriveThru/CovidPaymentInfoResponse.dart'; import 'package:diplomaticquarterapp/models/CovidDriveThru/CovidTestProceduresResponse.dart'; +import 'package:diplomaticquarterapp/models/CovidDriveThru/DriveThroughTestingCenterModel.dart'; import 'package:diplomaticquarterapp/pages/Covid-DriveThru/Covid-TimeSlots.dart'; import 'package:diplomaticquarterapp/services/covid-drivethru/covid-drivethru.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/data_display/text.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; import 'package:diplomaticquarterapp/widgets/transitions/fade_page.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_svg/flutter_svg.dart'; import 'package:provider/provider.dart'; class CovidPaymentDetails extends StatefulWidget { @@ -19,8 +18,9 @@ class CovidPaymentDetails extends StatefulWidget { int projectID; List proceduresList; CovidTestProceduresResponse selectedProcedure; + DriveThroughTestingCenterModel selectedProject; - CovidPaymentDetails({@required this.covidPaymentInfoResponse, @required this.projectID, @required this.proceduresList}); + CovidPaymentDetails({@required this.covidPaymentInfoResponse, @required this.projectID, @required this.proceduresList, @required this.selectedProject}); @override _CovidPaymentDetailsState createState() => _CovidPaymentDetailsState(); @@ -89,7 +89,6 @@ class _CovidPaymentDetailsState extends State { getPaymentInfo(context, widget.projectID.toString(), widget.selectedProcedure.procedureID); }); }, - ), Text( projectViewModel.isArabic ? widget.proceduresList[index].procedureNameN : widget.proceduresList[index].procedureName, @@ -108,7 +107,6 @@ class _CovidPaymentDetailsState extends State { ], ), ), - Container( decoration: cardRadius(12), child: Padding( @@ -171,7 +169,6 @@ class _CovidPaymentDetailsState extends State { ), ), ), - Container( margin: EdgeInsets.fromLTRB(0.0, 0.0, 0.0, 0.0), child: Row( @@ -210,7 +207,6 @@ class _CovidPaymentDetailsState extends State { ), ), mFlex(1), - Text( TranslationBase.of(context).payOptions, textAlign: TextAlign.center, @@ -306,13 +302,7 @@ class _CovidPaymentDetailsState extends State { } void next() { - Navigator.push( - context, - FadePage( - page: CovidTimeSlots( - projectID: widget.projectID, - selectedProcedure: widget.selectedProcedure, - ))); + Navigator.push(context, FadePage(page: CovidTimeSlots(projectID: widget.projectID, selectedProcedure: widget.selectedProcedure, selectedProject: widget.selectedProject))); } cancel() { @@ -322,7 +312,7 @@ class _CovidPaymentDetailsState extends State { getPaymentInfo(BuildContext context, String projectID, String selectedProcedureID) { CovidDriveThruService service = new CovidDriveThruService(); GifLoaderDialogUtils.showMyDialog(context); - service.getCovidPaymentInformation(context, int.parse(projectID), selectedProcedureID).then((res) { + service.getCovidPaymentInformation(context, int.parse(projectID), selectedProcedureID, widget.selectedProject.testTypeEnum, widget.selectedProject.testProcedureEnum).then((res) { GifLoaderDialogUtils.hideDialog(context); if (res['MessageStatus'] == 1) { setState(() { diff --git a/lib/pages/landing/fragments/home_page_fragment2.dart b/lib/pages/landing/fragments/home_page_fragment2.dart index bbbf90fc..03d16427 100644 --- a/lib/pages/landing/fragments/home_page_fragment2.dart +++ b/lib/pages/landing/fragments/home_page_fragment2.dart @@ -51,7 +51,7 @@ class _HomePageFragment2State extends State { initialiseHmgServices(bool isLogin) { hmgServices.clear(); hmgServices.add(new HmgServices(0, TranslationBase.of(context).liveCare, TranslationBase.of(context).onlineConsulting, "assets/images/new/Live_Care.svg", isLogin)); - hmgServices.add(new HmgServices(1, TranslationBase.of(context).covidTest, TranslationBase.of(context).driveThru, "assets/images/new/covid_test_drive_thru.svg", isLogin)); + hmgServices.add(new HmgServices(1, TranslationBase.of(context).covidTest, TranslationBase.of(context).driveThru, "assets/images/new/CoronaIcon.svg", isLogin)); hmgServices.add(new HmgServices(2, TranslationBase.of(context).online, TranslationBase.of(context).payment, "assets/images/new/paymentMethods.png", isLogin)); hmgServices.add(new HmgServices(3, TranslationBase.of(context).hhcHome, TranslationBase.of(context).healthCare, "assets/images/new/HHC.svg", isLogin)); hmgServices.add(new HmgServices(4, TranslationBase.of(context).checkup, TranslationBase.of(context).comprehensive, "assets/images/new/comprehensive_checkup.svg", isLogin)); diff --git a/lib/pages/pharmacies/my_reviews.dart b/lib/pages/pharmacies/my_reviews.dart index 39304cac..82e1de8b 100644 --- a/lib/pages/pharmacies/my_reviews.dart +++ b/lib/pages/pharmacies/my_reviews.dart @@ -1,10 +1,10 @@ +import 'package:diplomaticquarterapp/config/shared_pref_kay.dart'; import 'package:diplomaticquarterapp/core/viewModels/pharmacyModule/review_view_model.dart'; +import 'package:diplomaticquarterapp/pages/base/base_view.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; -import 'package:flutter/material.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; +import 'package:flutter/material.dart'; import 'package:rating_bar/rating_bar.dart'; -import 'package:diplomaticquarterapp/pages/base/base_view.dart'; -import 'package:diplomaticquarterapp/config/shared_pref_kay.dart'; class MyReviewsPage extends StatefulWidget { @override @@ -47,7 +47,8 @@ class _MyReviewsPageState extends State { ), Padding( padding: const EdgeInsets.all(8.0), - child: Text(TranslationBase.of(context).noData, + child: Text( + TranslationBase.of(context).noData, // 'There is no data', style: TextStyle(fontSize: 30), ), @@ -65,11 +66,8 @@ class _MyReviewsPageState extends State { Container( child: reviewDetails( model.reviewListList[index], - double.parse(model.reviewListList[index].product - .approvedTotalReviews - .toString()), - double.parse(model.reviewListList[index].rating - .toString()), + double.parse(model.reviewListList[index].product.approvedTotalReviews.toString()), + double.parse(model.reviewListList[index].rating.toString()), ), ), Divider(height: 1, color: Colors.grey) @@ -97,9 +95,7 @@ reviewDetails(data, rate, myRate) { Row( children: [ Container( - margin: languageID == 'ar' - ? EdgeInsets.only(top: 10, right: 10) - : EdgeInsets.only(top: 10, left: 10), + margin: languageID == 'ar' ? EdgeInsets.only(top: 10, right: 10) : EdgeInsets.only(top: 10, left: 10), child: Image.network( data.product.images[0].src.trim(), fit: BoxFit.cover, @@ -114,18 +110,11 @@ reviewDetails(data, rate, myRate) { Container( margin: EdgeInsets.all(5), child: Align( - alignment: languageID == 'ar' - ? Alignment.topRight - : Alignment.topLeft, + alignment: languageID == 'ar' ? Alignment.topRight : Alignment.topLeft, child: RichText( text: TextSpan( - text: languageID == 'ar' - ? data.product.namen - : data.product.name, - style: TextStyle( - color: Colors.black54, - fontSize: languageID == 'ar' ? 12 : 13, - fontWeight: FontWeight.bold), + text: languageID == 'ar' ? data.product.namen : data.product.name, + style: TextStyle(color: Colors.black54, fontSize: languageID == 'ar' ? 12 : 13, fontWeight: FontWeight.bold), ), ), ), @@ -135,18 +124,11 @@ reviewDetails(data, rate, myRate) { Container( margin: EdgeInsets.all(5), child: Align( - alignment: languageID == 'ar' - ? Alignment.topRight - : Alignment.topLeft, + alignment: languageID == 'ar' ? Alignment.topRight : Alignment.topLeft, child: RichText( text: TextSpan( - text: data.product.quantity.toString() + - " " + - data.product.currency, - style: TextStyle( - fontWeight: FontWeight.bold, - color: Colors.black, - fontSize: 13), + text: data.product.price.toString() + " " + data.product.currency, + style: TextStyle(fontWeight: FontWeight.bold, color: Colors.black, fontSize: 13), ), ), ), @@ -156,9 +138,7 @@ reviewDetails(data, rate, myRate) { Container( margin: EdgeInsets.all(5), child: Align( - alignment: languageID == 'ar' - ? Alignment.topRight - : Alignment.topLeft, + alignment: languageID == 'ar' ? Alignment.topRight : Alignment.topLeft, child: RatingBar.readOnly( initialRating: rate, size: 15.0, @@ -186,11 +166,7 @@ reviewDetails(data, rate, myRate) { crossAxisAlignment: CrossAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.start, children: [ - Container( - padding: languageID == 'ar' - ? EdgeInsets.only(right: 10) - : EdgeInsets.only(left: 10), - child: Text(data.createdOnUtc.toString().substring(0 , 11))), + Container(padding: languageID == 'ar' ? EdgeInsets.only(right: 10) : EdgeInsets.only(left: 10), child: Text(data.createdOnUtc.toString().substring(0, 11))), ], ), ), @@ -200,9 +176,7 @@ reviewDetails(data, rate, myRate) { mainAxisAlignment: MainAxisAlignment.end, children: [ Container( - padding: languageID == 'ar' - ? EdgeInsets.only(right: 60) - : EdgeInsets.only(left: 60), + padding: languageID == 'ar' ? EdgeInsets.only(right: 60) : EdgeInsets.only(left: 60), child: RatingBar.readOnly( initialRating: myRate, size: 15.0, @@ -225,10 +199,8 @@ reviewDetails(data, rate, myRate) { ), Expanded( child: Container( - padding: languageID == 'ar' - ? EdgeInsets.only(right: 10) - : EdgeInsets.only(left: 10), - child: Text(fixingString(data.reviewText.toString())), + padding: languageID == 'ar' ? EdgeInsets.only(right: 10) : EdgeInsets.only(left: 10), + child: Text(getReview(data) ?? ""), ), ), ], @@ -238,6 +210,20 @@ reviewDetails(data, rate, myRate) { ); } +String getReview(data) { + String reviewTxt = ""; + + if (data.reviewText == null && data.replyText == null) { + reviewTxt = ""; + } + if (data.reviewText == null) + reviewTxt = data.replyText; + else + reviewTxt = data.reviewText; + + return reviewTxt; +} + fixingString(txt) { String stringTxt; String newTxt; diff --git a/lib/pages/pharmacies/screens/cart-page/cart-order-page.dart b/lib/pages/pharmacies/screens/cart-page/cart-order-page.dart index 7a252bd6..654db47d 100644 --- a/lib/pages/pharmacies/screens/cart-page/cart-order-page.dart +++ b/lib/pages/pharmacies/screens/cart-page/cart-order-page.dart @@ -437,6 +437,7 @@ class _OrderBottomWidgetState extends State { FadePage( page: PharmacyAddressesPage( orderPreviewViewModel: widget.model, + isShippingAddress: true, ))).then((result) async { if (result != null) { GifLoaderDialogUtils.showMyDialog(context); diff --git a/lib/pages/pharmacy/pharmacyAddresses/PharmacyAddresses.dart b/lib/pages/pharmacy/pharmacyAddresses/PharmacyAddresses.dart index 609606ec..933824db 100644 --- a/lib/pages/pharmacy/pharmacyAddresses/PharmacyAddresses.dart +++ b/lib/pages/pharmacy/pharmacyAddresses/PharmacyAddresses.dart @@ -24,8 +24,9 @@ class PharmacyAddressesPage extends StatefulWidget { final Function changeMainState; final bool isUpdate; + final bool isShippingAddress; - const PharmacyAddressesPage({Key key, this.orderPreviewViewModel, this.isUpdate = false, this.changeMainState}) : super(key: key); + const PharmacyAddressesPage({Key key, this.orderPreviewViewModel, this.isUpdate = false, this.isShippingAddress = false, this.changeMainState}) : super(key: key); @override _PharmacyAddressesState createState() => _PharmacyAddressesState(); @@ -62,7 +63,7 @@ class _PharmacyAddressesState extends State { baseViewModel: model, backgroundColor: Colors.white, body: Container( - height: height * 0.90, + height: widget.isShippingAddress ? height * 0.90 : height * 0.99, child: SingleChildScrollView( child: Column( children: [ @@ -106,52 +107,51 @@ class _PharmacyAddressesState extends State { ), ), ), - bottomSheet: Container( - height: height * 0.10, - color: Colors.white, - child: Column( - children: [ - Divider( - color: Colors.grey.shade300, - height: 1, - thickness: 1, - indent: 0, - endIndent: 0, - ), - Container( - padding: EdgeInsets.symmetric(horizontal: 12, vertical: 8), - child: BorderedButton( - TranslationBase.of(context).confirmAddress, - hasBorder: true, - borderColor: Color(0xFF5AB145), - textColor: Colors.white, - fontWeight: FontWeight.bold, - backgroundColor: Color(0xFF5AB145), - fontSize: 14, - vPadding: 8, - handler: () async { - //TODO Elham* - widget.orderPreviewViewModel.paymentCheckoutData.address = Addresses.fromJson(model.addresses[model.selectedAddressIndex].toJson()); - - GifLoaderDialogUtils.showMyDialog(context); - - await widget.orderPreviewViewModel.getInformationsByAddress(projectProvider.user.patientIdentificationNo); - if (widget.orderPreviewViewModel.error == "") { - await widget.orderPreviewViewModel.getShoppingCart(); - GifLoaderDialogUtils.hideDialog(context); - model.saveSelectedAddressLocally(model.addresses[model.selectedAddressIndex]); - _navigateToPaymentOption(model); - } else { - GifLoaderDialogUtils.hideDialog(context); - AppToast.showErrorToast(message: widget.orderPreviewViewModel.error); - return; - } - }, + bottomSheet: widget.isShippingAddress + ? Container( + height: height * 0.10, + color: Colors.white, + child: Column( + children: [ + Divider( + color: Colors.grey.shade300, + height: 1, + thickness: 1, + indent: 0, + endIndent: 0, + ), + Container( + padding: EdgeInsets.symmetric(horizontal: 12, vertical: 8), + child: BorderedButton( + TranslationBase.of(context).confirmAddress, + hasBorder: true, + borderColor: Color(0xFF5AB145), + textColor: Colors.white, + fontWeight: FontWeight.bold, + backgroundColor: Color(0xFF5AB145), + fontSize: 14, + vPadding: 8, + handler: () async { + widget.orderPreviewViewModel.paymentCheckoutData.address = Addresses.fromJson(model.addresses[model.selectedAddressIndex].toJson()); + GifLoaderDialogUtils.showMyDialog(context); + await widget.orderPreviewViewModel.getInformationsByAddress(projectProvider.user.patientIdentificationNo); + if (widget.orderPreviewViewModel.error == "") { + await widget.orderPreviewViewModel.getShoppingCart(); + GifLoaderDialogUtils.hideDialog(context); + model.saveSelectedAddressLocally(model.addresses[model.selectedAddressIndex]); + _navigateToPaymentOption(model); + } else { + GifLoaderDialogUtils.hideDialog(context); + AppToast.showErrorToast(message: widget.orderPreviewViewModel.error); + return; + } + }, + ), + ), + ], ), - ), - ], - ), - ), + ) + : SizedBox(), ), ); } diff --git a/lib/pages/pharmacy/profile/profile.dart b/lib/pages/pharmacy/profile/profile.dart index 184cdccc..64fae48d 100644 --- a/lib/pages/pharmacy/profile/profile.dart +++ b/lib/pages/pharmacy/profile/profile.dart @@ -432,7 +432,7 @@ class _ProfilePageState extends State { ), InkWell( onTap: () { - Navigator.push(context, FadePage(page: PharmacyAddressesPage())); + Navigator.push(context, FadePage(page: PharmacyAddressesPage(isShippingAddress: false))); }, child: Row( children: [ diff --git a/lib/services/appointment_services/GetDoctorsList.dart b/lib/services/appointment_services/GetDoctorsList.dart index b317e106..83252c75 100644 --- a/lib/services/appointment_services/GetDoctorsList.dart +++ b/lib/services/appointment_services/GetDoctorsList.dart @@ -315,7 +315,7 @@ class DoctorsListService extends BaseService { return Future.value(localRes); } - Future insertAppointment(int docID, int clinicID, int projectID, String selectedTime, String selectedDate, BuildContext context, [String procedureID]) async { + Future insertAppointment(int docID, int clinicID, int projectID, String selectedTime, String selectedDate, BuildContext context, [String procedureID, num testTypeEnum, num testProcedureEnum]) async { Map request; if (await this.sharedPref.getObject(USER_PROFILE) != null) { @@ -334,6 +334,8 @@ class DoctorsListService extends BaseService { "SelectedTime": selectedTime, "EndTime": selectedTime, "ProcedureID": procedureID, + "TestTypeEnum": testTypeEnum, + "TestProcedureEnum": testProcedureEnum, "InitialSlotDuration": 0, "StrAppointmentDate": selectedDate, "IsVirtual": false, diff --git a/lib/services/covid-drivethru/covid-drivethru.dart b/lib/services/covid-drivethru/covid-drivethru.dart index 38c6b33a..b4241bcc 100644 --- a/lib/services/covid-drivethru/covid-drivethru.dart +++ b/lib/services/covid-drivethru/covid-drivethru.dart @@ -34,14 +34,18 @@ class CovidDriveThruService extends BaseService { return Future.value(localRes); } - Future getCovidTestProceduresList(BuildContext context) async { + Future getCovidTestProceduresList(BuildContext context, num testTypeEnum, num testProcedureEnum, int projectID) async { Map request; if (await this.sharedPref.getObject(USER_PROFILE) != null) { var data = AuthenticatedUser.fromJson(await this.sharedPref.getObject(USER_PROFILE)); authUser = data; } - request = {}; + request = { + "ProjectID": projectID, + "TestTypeEnum": testTypeEnum, + "TestProcedureEnum": testProcedureEnum + }; dynamic localRes; @@ -53,7 +57,7 @@ class CovidDriveThruService extends BaseService { return Future.value(localRes); } - Future getCovidPaymentInformation(BuildContext context, int projectID, String procedureID) async { + Future getCovidPaymentInformation(BuildContext context, int projectID, String procedureID, num testTypeEnum, num testProcedureEnum) async { Map request; if (await this.sharedPref.getObject(USER_PROFILE) != null) { @@ -63,7 +67,9 @@ class CovidDriveThruService extends BaseService { request = { "ProjectID": projectID, - "ProcedureId": procedureID + "ProcedureId": procedureID, + "TestTypeEnum": testTypeEnum, + "TestProcedureEnum": testProcedureEnum }; dynamic localRes; @@ -76,7 +82,7 @@ class CovidDriveThruService extends BaseService { return Future.value(localRes); } - Future getCovidFreeSlots(BuildContext context, int projectID) async { + Future getCovidFreeSlots(BuildContext context, int projectID, num testTypeEnum, num testProcedureEnum) async { Map request; if (await this.sharedPref.getObject(USER_PROFILE) != null) { @@ -86,6 +92,8 @@ class CovidDriveThruService extends BaseService { request = { "ProjectID": projectID, + "TestTypeEnum": testTypeEnum, + "TestProcedureEnum": testProcedureEnum }; dynamic localRes; From 0acc134e6e3c48138152d095daf87bc5f652a881 Mon Sep 17 00:00:00 2001 From: haroon amjad Date: Sun, 9 Jan 2022 17:43:37 +0300 Subject: [PATCH 2/7] Updates & fixes --- lib/config/config.dart | 10 +++- lib/config/localized_values.dart | 1 + lib/config/shared_pref_kay.dart | 1 + lib/core/service/client/base_app_client.dart | 2 +- lib/core/service/medical/labs_service.dart | 3 +- .../viewModels/medical/labs_view_model.dart | 4 +- .../ancillaryOrdersDetails.dart | 12 ++-- lib/pages/BookAppointment/QRCode.dart | 59 +++++++++---------- .../Covid-DriveThru/Covid-TimeSlots.dart | 22 ++++++- .../covid-dirvethru-questions.dart | 4 ++ lib/pages/ToDoList/ToDo.dart | 4 +- .../medical/labs/laboratory_result_page.dart | 10 ++-- .../screens/lakum-points-month-page.dart | 1 - .../appointment_services/GetDoctorsList.dart | 54 ++++++++++++++++- lib/uitl/translations_delegate_base.dart | 1 + 15 files changed, 134 insertions(+), 54 deletions(-) diff --git a/lib/config/config.dart b/lib/config/config.dart index f3038cf7..de20e677 100644 --- a/lib/config/config.dart +++ b/lib/config/config.dart @@ -15,8 +15,9 @@ const PACKAGES_CUSTOMER = '/api/customers'; const PACKAGES_SHOPPING_CART = '/api/shopping_cart_items'; const PACKAGES_ORDERS = '/api/orders'; const PACKAGES_TAMARA_OPT = '/api/orders/paymentoptions/tamara'; - // const BASE_URL = 'https://uat.hmgwebservices.com/'; -const BASE_URL = 'https://hmgwebservices.com/'; +// const BASE_URL = 'http://10.50.100.198:3334/'; + const BASE_URL = 'https://uat.hmgwebservices.com/'; +// const BASE_URL = 'https://hmgwebservices.com/'; // Pharmacy UAT URLs // const BASE_PHARMACY_URL = 'https://uat.hmgwebservices.com/epharmacy/api/'; @@ -369,11 +370,14 @@ const HAS_DENTAL_PLAN = const LASER_BODY_PARTS = 'Services/Patients.svc/REST/Laser_GetBodyPartsByCategory'; +const INSERT_COVID_QUESTIONNAIRE = 'Services/Doctors.svc/REST/COVID19_Questionnarie_Insert'; +const UPDATE_COVID_QUESTIONNAIRE = 'Services/Doctors.svc/REST/COVID19_Questionnarie_Update'; + //URL to get medicine and pharmacies list const CHANNEL = 3; const GENERAL_ID = 'Cs2020@2016\$2958'; const IP_ADDRESS = '10.20.10.20'; -const VERSION_ID = 8.8; +const VERSION_ID = 7.2; const SETUP_ID = '91877'; const LANGUAGE = 2; const PATIENT_OUT_SA = 0; diff --git a/lib/config/localized_values.dart b/lib/config/localized_values.dart index 7fed99a8..312c2fc8 100644 --- a/lib/config/localized_values.dart +++ b/lib/config/localized_values.dart @@ -1748,5 +1748,6 @@ const Map localizedValues = { "yourTurn": {"en": "your turn is after", "ar": "دورك بعد"}, "patients": {"en": "patients", "ar": "مرضي"}, "group": {"en": "Group", "ar": "مجموعة"}, + "covidTestTodo": {"en": "Covid-19 Test", "ar": "فحص كورونا"}, "ancillaryOrdersPaymentConfirm": {"en": "Are you sure you want to make payment for selected orders?", "ar": "هل أنت متأكد أنك تريد سداد قيمة الطلبات المختارة؟"}, }; diff --git a/lib/config/shared_pref_kay.dart b/lib/config/shared_pref_kay.dart index 723e17a0..18b7261a 100644 --- a/lib/config/shared_pref_kay.dart +++ b/lib/config/shared_pref_kay.dart @@ -37,3 +37,4 @@ const LIVECARE_CLINIC_DATA = 'LIVECARE_CLINIC_DATA'; const DOCTOR_SCHEDULE_DATE_SEL = 'DOCTOR_SCHEDULE_DATE_SEL'; const APPOINTMENT_HISTORY_MEDICAL = 'APPOINTMENT_HISTORY_MEDICAL'; const CLINICS_LIST = 'CLINICS_LIST'; +const COVID_QA_LIST = 'COVID_QA_LIST'; diff --git a/lib/core/service/client/base_app_client.dart b/lib/core/service/client/base_app_client.dart index 8d722568..663603f4 100644 --- a/lib/core/service/client/base_app_client.dart +++ b/lib/core/service/client/base_app_client.dart @@ -124,7 +124,7 @@ class BaseAppClient { // body['IdentificationNo'] = 2076117163; // body['MobileNo'] = "966503109207"; - // body['PatientID'] = 2478442; //3844083 + // body['PatientID'] = 3648586; //3844083 // body['TokenID'] = "@dm!n"; // Patient ID: 2478442 diff --git a/lib/core/service/medical/labs_service.dart b/lib/core/service/medical/labs_service.dart index 6571c76f..1ea29264 100644 --- a/lib/core/service/medical/labs_service.dart +++ b/lib/core/service/medical/labs_service.dart @@ -31,12 +31,13 @@ class LabsService extends BaseService { List labResultList = List(); List labOrdersResultsList = List(); - Future getLaboratoryResult({String projectID, int clinicID, String invoiceNo, String orderNo}) async { + Future getLaboratoryResult({String projectID, int clinicID, String invoiceNo, String orderNo, String setupID}) async { hasError = false; _requestPatientLabSpecialResult.projectID = projectID; _requestPatientLabSpecialResult.clinicID = clinicID; _requestPatientLabSpecialResult.invoiceNo = invoiceNo; _requestPatientLabSpecialResult.orderNo = orderNo; + _requestPatientLabSpecialResult.setupID = setupID; await baseAppClient.post(GET_Patient_LAB_SPECIAL_RESULT, onSuccess: (dynamic response, int statusCode) { patientLabSpecialResult.clear(); diff --git a/lib/core/viewModels/medical/labs_view_model.dart b/lib/core/viewModels/medical/labs_view_model.dart index 8e61e3f3..92f79436 100644 --- a/lib/core/viewModels/medical/labs_view_model.dart +++ b/lib/core/viewModels/medical/labs_view_model.dart @@ -71,9 +71,9 @@ class LabsViewModel extends BaseViewModel { List labResultLists = List(); - getLaboratoryResult({String projectID, int clinicID, String invoiceNo, String orderNo}) async { + getLaboratoryResult({String projectID, int clinicID, String invoiceNo, String orderNo, String setupID}) async { setState(ViewState.Busy); - await _labsService.getLaboratoryResult(invoiceNo: invoiceNo, orderNo: orderNo, projectID: projectID, clinicID: clinicID); + await _labsService.getLaboratoryResult(invoiceNo: invoiceNo, orderNo: orderNo, projectID: projectID, clinicID: clinicID, setupID: setupID); if (_labsService.hasError) { error = _labsService.error; setState(ViewState.Error); diff --git a/lib/pages/AlHabibMedicalService/ancillary-orders/ancillaryOrdersDetails.dart b/lib/pages/AlHabibMedicalService/ancillary-orders/ancillaryOrdersDetails.dart index 8d0ebabd..17ac18da 100644 --- a/lib/pages/AlHabibMedicalService/ancillary-orders/ancillaryOrdersDetails.dart +++ b/lib/pages/AlHabibMedicalService/ancillary-orders/ancillaryOrdersDetails.dart @@ -367,10 +367,10 @@ class _AnicllaryOrdersState extends State with SingleTic addSelectedProcedure(value[i]); }); }), - Utils.tableColumnValue('${value[i].procedureName.toString()}', isLast: true), - Utils.tableColumnValue('${value[i].patientShare.toString() + " " + TranslationBase.of(context).sar.toUpperCase()}', isLast: true), - Utils.tableColumnValue('${value[i].patientTaxAmount.toString() + " " + TranslationBase.of(context).sar.toUpperCase()}', isLast: true), - Utils.tableColumnValue('${value[i].patientShareWithTax.toString() + " " + TranslationBase.of(context).sar.toUpperCase()}', isLast: true), + Utils.tableColumnValue('${value[i].procedureName}', isLast: true, isCapitable: false), + Utils.tableColumnValue('${value[i].patientShare.toString() + " " + TranslationBase.of(context).sar.toUpperCase()}', isLast: true, isCapitable: false), + Utils.tableColumnValue('${value[i].patientTaxAmount.toString() + " " + TranslationBase.of(context).sar.toUpperCase()}', isLast: true, isCapitable: false), + Utils.tableColumnValue('${value[i].patientShareWithTax.toString() + " " + TranslationBase.of(context).sar.toUpperCase()}', isLast: true, isCapitable: false), ]), ); } @@ -478,17 +478,17 @@ class _AnicllaryOrdersState extends State with SingleTic addAdvancedNumberRequest(String advanceNumber, String paymentReference, dynamic appointmentID, AppoitmentAllHistoryResultList appo) { DoctorsListService service = new DoctorsListService(); service.addAdvancedNumberRequest(advanceNumber, paymentReference, appointmentID, AppGlobal.context).then((res) { - print(res); autoGenerateInvoice(); }).catchError((err) { GifLoaderDialogUtils.hideDialog(AppGlobal.context); - AppToast.showErrorToast(message: err); + AppToast.showErrorToast(message: err.toString()); print(err); }); } autoGenerateInvoice() { List selectedProcListAPI = []; + Map selectedProcListAPIMap; selectedProcList.forEach((element) { selectedProcListAPI.add({ diff --git a/lib/pages/BookAppointment/QRCode.dart b/lib/pages/BookAppointment/QRCode.dart index 6fe2be98..4c89cf81 100644 --- a/lib/pages/BookAppointment/QRCode.dart +++ b/lib/pages/BookAppointment/QRCode.dart @@ -73,37 +73,36 @@ class _QRCodeState extends State { height: MediaQuery.of(context).size.width / 3, child: Row( children: [ - // _supportsNFC - // ? - Expanded( - flex: 1, - child: Row( - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.center, - children: [ - InkWell( - child: Container( - margin: EdgeInsets.only(top: 30.0), - alignment: Alignment.center, - padding: EdgeInsets.all(8), - decoration: BoxDecoration( - border: Border.all(color: Colors.black), - borderRadius: BorderRadius.circular(10), - ), - child: Image.asset("assets/images/nfc/ic_nfc.png"), + widget.patientShareResponse.clinicID != 265 + ? Expanded( + flex: 1, + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + InkWell( + child: Container( + margin: EdgeInsets.only(top: 30.0), + alignment: Alignment.center, + padding: EdgeInsets.all(8), + decoration: BoxDecoration( + border: Border.all(color: Colors.black), + borderRadius: BorderRadius.circular(10), + ), + child: Image.asset("assets/images/nfc/ic_nfc.png"), + ), + onTap: () { + showNfcReader(context, onNcfScan: (String nfcId) { + Future.delayed(const Duration(milliseconds: 100), () { + sendNfcCheckInRequest(nfcId); + }); + }); + }, + ), + ], ), - onTap: () { - showNfcReader(context, onNcfScan: (String nfcId) { - Future.delayed(const Duration(milliseconds: 100), () { - sendNfcCheckInRequest(nfcId); - }); - }); - }, - ), - ], - ), - ), - // : Container(), + ) + : Container(), Expanded( flex: 1, child: Container( diff --git a/lib/pages/Covid-DriveThru/Covid-TimeSlots.dart b/lib/pages/Covid-DriveThru/Covid-TimeSlots.dart index 0115083f..b4db054d 100644 --- a/lib/pages/Covid-DriveThru/Covid-TimeSlots.dart +++ b/lib/pages/Covid-DriveThru/Covid-TimeSlots.dart @@ -1,3 +1,4 @@ +import 'package:diplomaticquarterapp/config/shared_pref_kay.dart'; import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; import 'package:diplomaticquarterapp/models/Appointments/AppoimentAllHistoryResultList.dart'; import 'package:diplomaticquarterapp/models/Appointments/DoctorListResponse.dart'; @@ -403,7 +404,7 @@ class _CovidTimeSlotsState extends State with TickerProviderStat docObject.doctorID = widget.selectedDoctorID; docObject.clinicID = widget.selectedClinicID; docObject.projectID = widget.projectID; - insertAppointmentCovidTest(context, docObject); + insertCovidQuestionnaire(context, docObject); }, cancelFunction: () => {}); dialog.showAlertDialog(context); @@ -412,6 +413,24 @@ class _CovidTimeSlotsState extends State with TickerProviderStat } } + insertCovidQuestionnaire(context, DoctorList docObject) async { + DoctorsListService service = new DoctorsListService(); + List qa = await sharedPref.getObject(COVID_QA_LIST); + service.insertCovidQuestionnaire(qa, widget.projectID, widget.selectedProject.testTypeEnum, widget.selectedProject.testProcedureEnum).then((res) { + insertAppointmentCovidTest(context, docObject); + }).catchError((err) { + print(err); + }); + } + + updateCovidQuestionnaire(context, String appoNo) async { + DoctorsListService service = new DoctorsListService(); + service.updateCovidQuestionnaire(appoNo, widget.projectID, widget.selectedProject.testTypeEnum, widget.selectedProject.testProcedureEnum).then((res) { + }).catchError((err) { + print(err); + }); + } + insertAppointmentCovidTest(context, DoctorList docObject) { DoctorsListService service = new DoctorsListService(); AppoitmentAllHistoryResultList appo; @@ -490,6 +509,7 @@ class _CovidTimeSlotsState extends State with TickerProviderStat GifLoaderDialogUtils.hideDialog(context); print(res); widget.patientShareResponse = new PatientShareResponse.fromJson(res); + updateCovidQuestionnaire(context, appointmentNo); navigateToPaymentAlert(); }).catchError((err) { GifLoaderDialogUtils.hideDialog(context); diff --git a/lib/pages/Covid-DriveThru/covid-dirvethru-questions.dart b/lib/pages/Covid-DriveThru/covid-dirvethru-questions.dart index ee6725e9..cbf3bf21 100644 --- a/lib/pages/Covid-DriveThru/covid-dirvethru-questions.dart +++ b/lib/pages/Covid-DriveThru/covid-dirvethru-questions.dart @@ -1,5 +1,6 @@ import 'dart:convert'; +import 'package:diplomaticquarterapp/config/shared_pref_kay.dart'; import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; import 'package:diplomaticquarterapp/models/CovidDriveThru/CovidPaymentInfoResponse.dart'; import 'package:diplomaticquarterapp/models/CovidDriveThru/CovidTestProceduresResponse.dart'; @@ -7,6 +8,7 @@ import 'package:diplomaticquarterapp/models/CovidDriveThru/DriveThroughTestingCe import 'package:diplomaticquarterapp/pages/medical/labs/passport_update_page.dart'; import 'package:diplomaticquarterapp/services/covid-drivethru/covid-drivethru.dart'; import 'package:diplomaticquarterapp/theme/colors.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'; @@ -265,6 +267,7 @@ class CovidDirveThruQuestionsState extends State { } next() async { + var sharedPref = new AppSharedPreferences(); bool all = true; qa.forEach((element) { all = all && (element["ans"] == 1 || element["ans"] == 0); @@ -272,6 +275,7 @@ class CovidDirveThruQuestionsState extends State { if (all) if (qa[0]["ans"] == 1) { openPassportUpdatePage(); } else { + sharedPref.setObject(COVID_QA_LIST, qa); getPaymentInfo(context, widget.projectId); } else diff --git a/lib/pages/ToDoList/ToDo.dart b/lib/pages/ToDoList/ToDo.dart index 4db905fc..b2635dc4 100644 --- a/lib/pages/ToDoList/ToDo.dart +++ b/lib/pages/ToDoList/ToDo.dart @@ -114,7 +114,7 @@ class _ToDoState extends State { child: widget.appoList[index].clinicID == 265 ? Container( margin: EdgeInsets.only(left: 5.0, right: 5.0), - child: SvgPicture.asset("assets/images/new/drive-thru.svg"), + 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") @@ -129,7 +129,7 @@ class _ToDoState extends State { padding: const EdgeInsets.only(left: 8.0, right: 8.0), child: Text( widget.appoList[index].clinicID == 265 - ? TranslationBase.of(context).drivethruAppo + ? TranslationBase.of(context).covidTestTodo : widget.appoList[index].isLiveCareAppointment ? TranslationBase.of(context).liveCareAppo : TranslationBase.of(context).walkinAppo, diff --git a/lib/pages/medical/labs/laboratory_result_page.dart b/lib/pages/medical/labs/laboratory_result_page.dart index cf0ec4e2..20d09668 100644 --- a/lib/pages/medical/labs/laboratory_result_page.dart +++ b/lib/pages/medical/labs/laboratory_result_page.dart @@ -18,16 +18,18 @@ class LaboratoryResultPage extends StatefulWidget { } class _LaboratoryResultPageState extends State { - @override Widget build(BuildContext context) { - return BaseView( onModelReady: (model) => model.getLaboratoryResult( - invoiceNo: widget.patientLabOrders.invoiceNo, clinicID: widget.patientLabOrders.clinicID, projectID: widget.patientLabOrders.projectID, orderNo: widget.patientLabOrders.orderNo), + invoiceNo: widget.patientLabOrders.invoiceNo, + clinicID: widget.patientLabOrders.clinicID, + projectID: widget.patientLabOrders.projectID, + orderNo: widget.patientLabOrders.orderNo, + setupID: widget.patientLabOrders.setupID), builder: (_, model, w) => AppScaffold( isShowAppBar: true, - appBarTitle: widget.patientLabOrders.doctorName, + appBarTitle: widget.patientLabOrders.doctorName, baseViewModel: model, showNewAppBar: true, showNewAppBarTitle: true, diff --git a/lib/pages/pharmacies/screens/lakum-points-month-page.dart b/lib/pages/pharmacies/screens/lakum-points-month-page.dart index 7f821f55..514804cc 100644 --- a/lib/pages/pharmacies/screens/lakum-points-month-page.dart +++ b/lib/pages/pharmacies/screens/lakum-points-month-page.dart @@ -6,7 +6,6 @@ import 'package:diplomaticquarterapp/uitl/date_uitl.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; -import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; class LakumPointMonthPage extends StatefulWidget { diff --git a/lib/services/appointment_services/GetDoctorsList.dart b/lib/services/appointment_services/GetDoctorsList.dart index 83252c75..6e819f60 100644 --- a/lib/services/appointment_services/GetDoctorsList.dart +++ b/lib/services/appointment_services/GetDoctorsList.dart @@ -315,7 +315,8 @@ class DoctorsListService extends BaseService { return Future.value(localRes); } - Future insertAppointment(int docID, int clinicID, int projectID, String selectedTime, String selectedDate, BuildContext context, [String procedureID, num testTypeEnum, num testProcedureEnum]) async { + Future insertAppointment(int docID, int clinicID, int projectID, String selectedTime, String selectedDate, BuildContext context, + [String procedureID, num testTypeEnum, num testProcedureEnum]) async { Map request; if (await this.sharedPref.getObject(USER_PROFILE) != null) { @@ -850,7 +851,7 @@ class DoctorsListService extends BaseService { localRes = response; }, onFailure: (String error, int statusCode) { throw error; - }, body: request); + }, body: request, isAllowAny: true); return Future.value(localRes); } @@ -906,7 +907,7 @@ class DoctorsListService extends BaseService { return Future.value(localRes); } - Future autoGenerateAncillaryOrdersInvoice(String orderNo, int projectID, dynamic appointmentID, List selectedProcListAPI, BuildContext context) async { + Future autoGenerateAncillaryOrdersInvoice(dynamic orderNo, int projectID, dynamic appointmentID, List selectedProcListAPI, BuildContext context) async { Map request; if (await this.sharedPref.getObject(USER_PROFILE) != null) { var data = AuthenticatedUser.fromJson(await this.sharedPref.getObject(USER_PROFILE)); @@ -1356,4 +1357,51 @@ class DoctorsListService extends BaseService { }, body: request); return Future.value(localRes); } + + Future insertCovidQuestionnaire(List qa, int projectID, int testTypeEnum, int testProcedureEnum) async { + Map request; + + request = { + "ProjectID": projectID, + "IsForTravel": qa[0]['ans'].toString(), + "IsComingOutSA": qa[1]['ans'].toString(), + "IsFeverCurrently": qa[2]['ans'].toString(), + "IsFeverLast2Week": qa[3]['ans'].toString(), + "IsSorethroat": qa[4]['ans'].toString(), + "IsRunnyNose": qa[5]['ans'].toString(), + "IsCough": qa[6]['ans'].toString(), + "IsShortnessBreath": qa[7]['ans'].toString(), + "IsNausea": qa[8]['ans'].toString(), + "IsVomiting": qa[9]['ans'].toString(), + "IsHeadache": qa[10]['ans'].toString(), + "IsMusclePain": qa[11]['ans'].toString(), + "IsJoinPain": qa[12]['ans'].toString(), + "IsDiarrhea": qa[13]['ans'].toString(), + "TestTypeEnum": testTypeEnum, + "TestProcedureEnum": testProcedureEnum + }; + + dynamic localRes; + await baseAppClient.post(INSERT_COVID_QUESTIONNAIRE, onSuccess: (response, statusCode) async { + localRes = response; + }, onFailure: (String error, int statusCode) { + throw error; + }, body: request); + return Future.value(localRes); + } + + Future updateCovidQuestionnaire(String appoNo, int projectID, int testTypeEnum, int testProcedureEnum) async { + Map request; + + request = {"AppointmentNo": appoNo, "ProjectID": projectID, "TestTypeEnum": testTypeEnum, "TestProcedureEnum": testProcedureEnum}; + + dynamic localRes; + await baseAppClient.post(UPDATE_COVID_QUESTIONNAIRE, onSuccess: (response, statusCode) async { + localRes = response; + }, onFailure: (String error, int statusCode) { + throw error; + }, body: request); + + return Future.value(localRes); + } } diff --git a/lib/uitl/translations_delegate_base.dart b/lib/uitl/translations_delegate_base.dart index 49d62d79..723cfa2f 100644 --- a/lib/uitl/translations_delegate_base.dart +++ b/lib/uitl/translations_delegate_base.dart @@ -2824,6 +2824,7 @@ class TranslationBase { String get patients => localizedValues["patients"][locale.languageCode]; String get group => localizedValues["group"][locale.languageCode]; String get ancillaryOrdersPaymentConfirm => localizedValues["ancillaryOrdersPaymentConfirm"][locale.languageCode]; + String get covidTestTodo => localizedValues["covidTestTodo"][locale.languageCode]; } From 7f5f3ababe32e98375caa93ade22451b5af42465 Mon Sep 17 00:00:00 2001 From: haroon amjad Date: Mon, 10 Jan 2022 18:57:42 +0300 Subject: [PATCH 3/7] Registration fix --- lib/config/localized_values.dart | 1 + lib/pages/login/register-info.dart | 81 +++++++++++++----------- lib/uitl/translations_delegate_base.dart | 3 +- 3 files changed, 45 insertions(+), 40 deletions(-) diff --git a/lib/config/localized_values.dart b/lib/config/localized_values.dart index 312c2fc8..706bec87 100644 --- a/lib/config/localized_values.dart +++ b/lib/config/localized_values.dart @@ -1750,4 +1750,5 @@ const Map localizedValues = { "group": {"en": "Group", "ar": "مجموعة"}, "covidTestTodo": {"en": "Covid-19 Test", "ar": "فحص كورونا"}, "ancillaryOrdersPaymentConfirm": {"en": "Are you sure you want to make payment for selected orders?", "ar": "هل أنت متأكد أنك تريد سداد قيمة الطلبات المختارة؟"}, + "successRegister": {"en": "Your account has been created.", "ar": "لقد تم إنشاء حسابك."}, }; diff --git a/lib/pages/login/register-info.dart b/lib/pages/login/register-info.dart index 341f6098..ffba8c3f 100644 --- a/lib/pages/login/register-info.dart +++ b/lib/pages/login/register-info.dart @@ -1,39 +1,42 @@ -import 'package:diplomaticquarterapp/config/shared_pref_kay.dart'; -import 'package:diplomaticquarterapp/locator.dart'; -import 'package:diplomaticquarterapp/models/Appointments/toDoCountProviderModel.dart'; import 'package:diplomaticquarterapp/config/config.dart'; -import 'package:diplomaticquarterapp/widgets/transitions/fade_page.dart'; -import 'package:diplomaticquarterapp/pages/landing/landing_page.dart'; -import 'package:diplomaticquarterapp/pages/rateAppointment/rate_appointment_doctor.dart'; -import 'package:diplomaticquarterapp/routes.dart'; +import 'package:diplomaticquarterapp/config/shared_pref_kay.dart'; import 'package:diplomaticquarterapp/core/service/AuthenticatedUserObject.dart'; import 'package:diplomaticquarterapp/core/viewModels/appointment_rate_view_model.dart'; import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; +import 'package:diplomaticquarterapp/locator.dart'; +import 'package:diplomaticquarterapp/models/Appointments/toDoCountProviderModel.dart'; import 'package:diplomaticquarterapp/models/Authentication/check_activation_code_response.dart' as checkActivation; import 'package:diplomaticquarterapp/models/Authentication/check_paitent_authentication_req.dart'; import 'package:diplomaticquarterapp/models/Authentication/register_info_response.dart'; -import 'package:diplomaticquarterapp/services/clinic_services/get_clinic_service.dart'; +import 'package:diplomaticquarterapp/pages/landing/landing_page.dart'; +import 'package:diplomaticquarterapp/pages/rateAppointment/rate_appointment_doctor.dart'; +import 'package:diplomaticquarterapp/routes.dart'; import 'package:diplomaticquarterapp/services/authentication/auth_provider.dart'; +import 'package:diplomaticquarterapp/services/clinic_services/get_clinic_service.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: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/confirm_dialog.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; import 'package:diplomaticquarterapp/widgets/text/app_texts_widget.dart'; +import 'package:diplomaticquarterapp/widgets/transitions/fade_page.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:hijri/hijri_calendar.dart'; import 'package:intl/intl.dart'; import 'package:provider/provider.dart'; -import 'package:diplomaticquarterapp/uitl/utils_new.dart'; class RegisterInfo extends StatefulWidget { final Function changePageViewIndex; final int page; + const RegisterInfo({Key key, this.changePageViewIndex, this.page = 1}) : super(key: key); + @override _RegisterInfo createState() => _RegisterInfo(); } @@ -348,22 +351,6 @@ class _RegisterInfo extends State { ], ) : SizedBox(), - // Column( - // mainAxisAlignment: MainAxisAlignment.end, - // children: [ - // Row( - // children: [ - // Expanded( - // child: DefaultButton( - // page == 1 ? TranslationBase.of(context).next : TranslationBase.of(context).register, - // () => {nextPage()}, - // textColor: Colors.white, - // color: this.isValid() == false && page == 2 ? Colors.grey : Colors.black, - // )) - // ], - // ), - // ], - // ) ]), ), bottomSheet: Container( @@ -404,8 +391,6 @@ class _RegisterInfo extends State { .registerUser(request) .then((result) => { GifLoaderDialogUtils.hideDialog(context), - // userData = result.list; - //AuthenticatedUser.fromJson(result['List'][0]), if (result is String) { new ConfirmDialog( @@ -437,6 +422,7 @@ class _RegisterInfo extends State { sharedPref.setObject(LOGIN_TOKEN_ID, result.logInTokenID), sharedPref.setString(TOKEN, result.authenticationTokenID), + AppToast.showSuccessToast(message: TranslationBase.of(context).successRegister), checkIfUserAgreedBefore(result), } }) @@ -483,7 +469,7 @@ class _RegisterInfo extends State { return { "Patientobject": { "TempValue": true, - "PatientIdentificationType": 1, + "PatientIdentificationType": registerInfo.idNumber.substring(0, 1) == "1" ? 1 : 2, "PatientIdentificationNo": registerInfo.idNumber, "MobileNumber": registerd_data.patientMobileNumber, "PatientOutSA": registerd_data.zipCode == '966' ? 0 : 1, @@ -528,13 +514,21 @@ class _RegisterInfo extends State { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - AppText( + Text( name1, - fontSize: 12, - fontWeight: FontWeight.bold, + style: TextStyle( + fontSize: 14, + fontWeight: FontWeight.bold, + letterSpacing: -0.44, + ), ), - AppText( + Text( value1, + style: TextStyle( + fontSize: 12, + fontWeight: FontWeight.w600, + letterSpacing: -0.44, + ), ), ], )), @@ -542,12 +536,22 @@ class _RegisterInfo extends State { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - AppText( + Text( name2, - fontSize: 12, - fontWeight: FontWeight.bold, + style: TextStyle( + fontSize: 14, + fontWeight: FontWeight.bold, + letterSpacing: -0.44, + ), + ), + Text( + value2, + style: TextStyle( + fontSize: 12, + fontWeight: FontWeight.w600, + letterSpacing: -0.44, + ), ), - AppText(value2), ], )) ], @@ -556,7 +560,7 @@ class _RegisterInfo extends State { checkIfUserAgreedBefore(checkActivation.CheckActivationCode result) { if (result.isNeedUserAgreement == true) { - //need to implement agreement page here + //TODO need to implement agreement page here insertIMEI(); } else { insertIMEI(); @@ -568,7 +572,6 @@ class _RegisterInfo extends State { authService.insertDeviceImei(selectedOption).then((value) => {goToHome()}).catchError((err) { print(err); }); - // authService.registeredAuthenticatedUser(data, token, 0, 0).then((res) => {}); } goToHome() async { @@ -624,11 +627,13 @@ class _RegisterInfo extends State { class Language { final String name; final String value; + Language({this.name, this.value}); } class Location { final String name; final String value; + Location({this.name, this.value}); } diff --git a/lib/uitl/translations_delegate_base.dart b/lib/uitl/translations_delegate_base.dart index 723cfa2f..44ba5454 100644 --- a/lib/uitl/translations_delegate_base.dart +++ b/lib/uitl/translations_delegate_base.dart @@ -2825,8 +2825,7 @@ class TranslationBase { String get group => localizedValues["group"][locale.languageCode]; String get ancillaryOrdersPaymentConfirm => localizedValues["ancillaryOrdersPaymentConfirm"][locale.languageCode]; String get covidTestTodo => localizedValues["covidTestTodo"][locale.languageCode]; - - + String get successRegister => localizedValues["successRegister"][locale.languageCode]; } class TranslationBaseDelegate extends LocalizationsDelegate { From a6c665136310963a20930112aaff45e0ff0bf23f Mon Sep 17 00:00:00 2001 From: haroon amjad Date: Sun, 16 Jan 2022 11:51:29 +0300 Subject: [PATCH 4/7] Updates & fixes --- lib/config/config.dart | 2 +- .../customer_addresses_service.dart | 12 +- .../add_new_address_Request_Model.dart | 6 +- .../home_health_care_view_model.dart | 1 + .../PharmacyAddressesViewModel.dart | 48 +++--- .../NewCMC/cmc_location_page.dart | 2 +- .../NewHomeHealthCare/location_page.dart | 126 ++++++++++++++- .../new_Home_health_care_step_tow_page.dart | 31 ++-- lib/pages/login/register-info.dart | 84 ---------- .../pharmacyAddresses/AddAddress.dart | 151 +++++++++++++++--- .../pharmacyAddresses/PharmacyAddresses.dart | 4 +- lib/widgets/app_map/google_huawei_map.dart | 5 +- 12 files changed, 309 insertions(+), 163 deletions(-) diff --git a/lib/config/config.dart b/lib/config/config.dart index de20e677..811e95fc 100644 --- a/lib/config/config.dart +++ b/lib/config/config.dart @@ -377,7 +377,7 @@ const UPDATE_COVID_QUESTIONNAIRE = 'Services/Doctors.svc/REST/COVID19_Questionna const CHANNEL = 3; const GENERAL_ID = 'Cs2020@2016\$2958'; const IP_ADDRESS = '10.20.10.20'; -const VERSION_ID = 7.2; +const VERSION_ID = 7.3; const SETUP_ID = '91877'; const LANGUAGE = 2; const PATIENT_OUT_SA = 0; diff --git a/lib/core/service/AlHabibMedicalService/customer_addresses_service.dart b/lib/core/service/AlHabibMedicalService/customer_addresses_service.dart index 2f92fe5e..f3cc5dd7 100644 --- a/lib/core/service/AlHabibMedicalService/customer_addresses_service.dart +++ b/lib/core/service/AlHabibMedicalService/customer_addresses_service.dart @@ -11,11 +11,11 @@ class CustomerAddressesService extends BaseService { CustomerInfo customerInfo = new CustomerInfo(); Future addAddressInfo({AddNewAddressRequestModel addNewAddressRequestModel}) async { - addNewAddressRequestModel.customer.email = customerInfo.email; - addNewAddressRequestModel.customer.id = customerInfo.customerId; + var customerId = await sharedPref.getString(PHARMACY_CUSTOMER_ID); + addNewAddressRequestModel.customer.email = addNewAddressRequestModel.customer.addresses[0].email; + addNewAddressRequestModel.customer.id = customerId; addNewAddressRequestModel.customer.roleIds = [3]; - addNewAddressRequestModel.customer.addresses[0].email = customerInfo.email; - addNewAddressRequestModel.customer.addresses[0].phoneNumber = customerInfo.mobileNumber; + addNewAddressRequestModel.customer.addresses[0].phoneNumber = addNewAddressRequestModel.customer.addresses[0].phoneNumber; addNewAddressRequestModel.customer.addresses[0].firstName = authenticatedUserObject.user.firstName; addNewAddressRequestModel.customer.addresses[0].lastName = authenticatedUserObject.user.lastName; addNewAddressRequestModel.customer.addresses[0].countryId = 69; @@ -30,8 +30,8 @@ class CustomerAddressesService extends BaseService { addressesList.add(AddressInfo.fromJson(data)); }); }, onFailure: (String error, int statusCode) { - hasError = true; - super.error = error; + hasError = false; + // super.error = error; }, body: addNewAddressRequestModel.toJson(), isAllowAny: true); } diff --git a/lib/core/viewModels/AlHabibMedicalService/add_new_address_Request_Model.dart b/lib/core/viewModels/AlHabibMedicalService/add_new_address_Request_Model.dart index 23329a89..0aeb9f60 100644 --- a/lib/core/viewModels/AlHabibMedicalService/add_new_address_Request_Model.dart +++ b/lib/core/viewModels/AlHabibMedicalService/add_new_address_Request_Model.dart @@ -20,7 +20,7 @@ class AddNewAddressRequestModel { class Customer { List addresses; - int id; + String id; String email; List roleIds; @@ -51,7 +51,7 @@ class Customer { } class Addresses { - int id; + String id; String firstName; String lastName; String email; @@ -67,7 +67,7 @@ class Addresses { dynamic faxNumber; String customerAttributes; String createdOnUtc; - Null province; + dynamic province; String latLong; Addresses( diff --git a/lib/core/viewModels/AlHabibMedicalService/home_health_care_view_model.dart b/lib/core/viewModels/AlHabibMedicalService/home_health_care_view_model.dart index 09b2a73d..41683165 100644 --- a/lib/core/viewModels/AlHabibMedicalService/home_health_care_view_model.dart +++ b/lib/core/viewModels/AlHabibMedicalService/home_health_care_view_model.dart @@ -1,3 +1,4 @@ +import 'package:diplomaticquarterapp/config/shared_pref_kay.dart'; import 'package:diplomaticquarterapp/core/enum/OrderService.dart'; import 'package:diplomaticquarterapp/core/enum/viewstate.dart'; import 'package:diplomaticquarterapp/core/model/AlHabibMedicalService/ComprehensiveMedicalCheckup/GetCMCAllOrdersResponseModel.dart'; diff --git a/lib/core/viewModels/pharmacyModule/PharmacyAddressesViewModel.dart b/lib/core/viewModels/pharmacyModule/PharmacyAddressesViewModel.dart index 02783f9f..5a098b6f 100644 --- a/lib/core/viewModels/pharmacyModule/PharmacyAddressesViewModel.dart +++ b/lib/core/viewModels/pharmacyModule/PharmacyAddressesViewModel.dart @@ -4,6 +4,7 @@ import 'package:diplomaticquarterapp/core/model/pharmacies/Country.dart'; import 'package:diplomaticquarterapp/core/service/AlHabibMedicalService/customer_addresses_service.dart'; import 'package:diplomaticquarterapp/services/pharmacy_services/pharmacyAddress_service.dart'; import 'package:diplomaticquarterapp/uitl/utils.dart'; +import 'package:geocoding/geocoding.dart'; import 'package:google_maps_place_picker/google_maps_place_picker.dart'; import '../../../locator.dart'; @@ -33,7 +34,8 @@ class PharmacyAddressesViewModel extends BaseViewModel { } } - Future addEditAddress(PickResult value, AddressInfo editedAddress) async { + // Future addEditAddress(PickResult value, AddressInfo editedAddress) async { + Future addEditAddress(Placemark selectedPlace, AddressInfo editedAddress, {String latLong}) async { setState(ViewState.Busy); AddressInfo sendingAddress; @@ -48,27 +50,34 @@ class PharmacyAddressesViewModel extends BaseViewModel { } else { sendingAddress = editedAddress; } - value.addressComponents.forEach((element) { - if (element.types.contains("country")) { - sendingAddress.country = element.longName; - } - if (element.types.contains("administrative_area_level_1")) { - sendingAddress.city = element.longName; - } - if (element.types.contains("postal_code")) { - sendingAddress.zipPostalCode = element.longName; - } - if (element.types.contains("administrative_area_level_2")) { - sendingAddress.province = element.longName; - } - }); - sendingAddress.latLong = value.geometry.location.toString(); + + sendingAddress.country = selectedPlace.country; + sendingAddress.city = selectedPlace.locality; + sendingAddress.zipPostalCode = selectedPlace.postalCode; + sendingAddress.province = selectedPlace.locality; + sendingAddress.latLong = latLong; + + // value.addressComponents.forEach((element) { + // if (element.types.contains("country")) { + // sendingAddress.country = element.longName; + // } + // if (element.types.contains("administrative_area_level_1")) { + // sendingAddress.city = element.longName; + // } + // if (element.types.contains("postal_code")) { + // sendingAddress.zipPostalCode = element.longName; + // } + // if (element.types.contains("administrative_area_level_2")) { + // sendingAddress.province = element.longName; + // } + // }); + // sendingAddress.latLong = value.geometry.location.toString(); await _pharmacyAddressService.getCountries(sendingAddress.country); sendingAddress.countryId = country.id; sendingAddress.stateProvinceId = null; - sendingAddress.address1 = value.formattedAddress; - sendingAddress.address2 = ""; + sendingAddress.address1 = selectedPlace.name; + sendingAddress.address2 = selectedPlace.street; sendingAddress.phoneNumber = user.mobileNumber; sendingAddress.faxNumber = user.faxNumber; sendingAddress.customerAttributes = ""; @@ -76,8 +85,7 @@ class PharmacyAddressesViewModel extends BaseViewModel { if (editedAddress == null) { await _pharmacyAddressService.addCustomerAddress(sendingAddress); } else { - await _pharmacyAddressService.editCustomerAddress(sendingAddress).then((value) async { - }); + await _pharmacyAddressService.editCustomerAddress(sendingAddress).then((value) async {}); } if (_pharmacyAddressService.hasError) { diff --git a/lib/pages/AlHabibMedicalService/ComprehensiveMedicalCheckup/NewCMC/cmc_location_page.dart b/lib/pages/AlHabibMedicalService/ComprehensiveMedicalCheckup/NewCMC/cmc_location_page.dart index 41fe54b9..a7478371 100644 --- a/lib/pages/AlHabibMedicalService/ComprehensiveMedicalCheckup/NewCMC/cmc_location_page.dart +++ b/lib/pages/AlHabibMedicalService/ComprehensiveMedicalCheckup/NewCMC/cmc_location_page.dart @@ -108,7 +108,7 @@ class _CMCLocationPageState extends State { customerAttributes: "", city: "", createdOnUtc: "", - id: 0, + id: "0", latLong: selectedPlace.geometry.location.lat.toString() + "," + selectedPlace.geometry.location.lng.toString(), email: "", ) diff --git a/lib/pages/AlHabibMedicalService/HomeHealthCare/NewHomeHealthCare/location_page.dart b/lib/pages/AlHabibMedicalService/HomeHealthCare/NewHomeHealthCare/location_page.dart index ffbf5b18..a3fce7b4 100644 --- a/lib/pages/AlHabibMedicalService/HomeHealthCare/NewHomeHealthCare/location_page.dart +++ b/lib/pages/AlHabibMedicalService/HomeHealthCare/NewHomeHealthCare/location_page.dart @@ -1,16 +1,21 @@ +import 'dart:async'; + import 'package:diplomaticquarterapp/config/config.dart'; import 'package:diplomaticquarterapp/core/enum/viewstate.dart'; import 'package:diplomaticquarterapp/core/viewModels/AlHabibMedicalService/add_new_address_Request_Model.dart'; import 'package:diplomaticquarterapp/core/viewModels/AlHabibMedicalService/home_health_care_view_model.dart'; import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; import 'package:diplomaticquarterapp/pages/base/base_view.dart'; +import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart'; import 'package:diplomaticquarterapp/uitl/app_toast.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:diplomaticquarterapp/uitl/utils.dart'; +import 'package:diplomaticquarterapp/widgets/app_map/google_huawei_map.dart'; import 'package:diplomaticquarterapp/widgets/buttons/defaultButton.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; +import 'package:geocoding/geocoding.dart'; import 'package:google_maps_flutter/google_maps_flutter.dart'; import 'package:google_maps_place_picker/google_maps_place_picker.dart'; import 'package:provider/provider.dart'; @@ -32,6 +37,16 @@ class _LocationPageState extends State { double longitude = 0; bool showCurrentLocation = false; + AppMap appMap; + AppSharedPreferences sharedPref = AppSharedPreferences(); + static CameraPosition _kGooglePlex = CameraPosition( + target: LatLng(37.42796133580664, -122.085749655962), + zoom: 14.4746, + ); + LatLng currentPostion; + Completer mapController = Completer(); + Placemark selectedPlace; + @override void initState() { latitude = widget.latitude; @@ -39,6 +54,23 @@ class _LocationPageState extends State { if (latitude == 0.0 && longitude == 0.0) { showCurrentLocation = true; } + appMap = AppMap( + _kGooglePlex.toMap(), + onCameraMove: (camera) { + _updatePosition(camera); + }, + onMapCreated: () { + currentPostion = LatLng(widget.latitude, widget.longitude); + latitude = widget.latitude; + longitude = widget.longitude; + setMap(); + setState(() {}); + }, + onCameraIdle: () async { + List placemarks = await placemarkFromCoordinates(latitude, longitude); + selectedPlace = placemarks[0]; + }, + ); super.initState(); } @@ -54,7 +86,60 @@ class _LocationPageState extends State { baseViewModel: model, showNewAppBarTitle: true, showNewAppBar: true, - body: PlacePicker( + body: + // Column( + // children: [ + // Expanded( + // child: Stack( + // alignment: Alignment.center, + // children: [ + // if (appMap != null) appMap, + // Container( + // margin: EdgeInsets.only(bottom: 50.0), + // child: Icon( + // Icons.place, + // color: CustomColors.accentColor, + // size: 50, + // ), + // ), + // ], + // ), + // ), + // Container( + // padding: const EdgeInsets.only(left: 20, right: 20, top: 14, bottom: 14), + // child: DefaultButton(TranslationBase.of(context).addNewAddress, () async { + // AddNewAddressRequestModel addNewAddressRequestModel = new AddNewAddressRequestModel( + // customer: Customer(addresses: [ + // Addresses( + // address1: selectedPlace.name, + // address2: selectedPlace.street, + // customerAttributes: "", + // city: selectedPlace.locality, + // createdOnUtc: "", + // id: "0", + // faxNumber: "", + // phoneNumber: projectViewModel.user.mobileNumber, + // province: selectedPlace.locality, + // countryId: 69, + // latLong: "$latitude,$longitude", + // country: selectedPlace.country, + // zipPostalCode: selectedPlace.postalCode, + // email: projectViewModel.user.emailAddress) + // ]), + // ); + // await model.addAddressInfo(addNewAddressRequestModel: addNewAddressRequestModel); + // if (model.state == ViewState.ErrorLocal) { + // Utils.showErrorToast(model.error); + // } else { + // AppToast.showSuccessToast(message: "Address Added Successfully"); + // } + // Navigator.of(context).pop(addNewAddressRequestModel); + // }), + // ), + // ], + // ), + + PlacePicker( apiKey: GOOGLE_API_KEY, enableMyLocationButton: true, automaticallyImplyAppBarLeading: false, @@ -76,7 +161,7 @@ class _LocationPageState extends State { width: 500, borderRadius: BorderRadius.circular(0.0), child: state == SearchingState.Searching - ? SizedBox(height: 43,child: Center(child: CircularProgressIndicator())).insideContainer + ? SizedBox(height: 43, child: Center(child: CircularProgressIndicator())).insideContainer : DefaultButton(TranslationBase.of(context).addNewAddress, () async { AddNewAddressRequestModel addNewAddressRequestModel = new AddNewAddressRequestModel( customer: Customer(addresses: [ @@ -84,11 +169,22 @@ class _LocationPageState extends State { address1: selectedPlace.formattedAddress, address2: selectedPlace.formattedAddress, customerAttributes: "", - city: "", createdOnUtc: "", - id: 0, - latLong: "${selectedPlace.geometry.location}", - email: "") + id: "0", + faxNumber: "", + phoneNumber: projectViewModel.user.mobileNumber, + countryId: 69, + latLong: "$latitude,$longitude", + email: projectViewModel.user.emailAddress) + // Addresses( + // address1: selectedPlace.formattedAddress, + // address2: selectedPlace.formattedAddress, + // customerAttributes: "", + // city: "", + // createdOnUtc: "", + // id: "0", + // latLong: "${selectedPlace.geometry.location}", + // email: "") ]), ); @@ -111,8 +207,7 @@ class _LocationPageState extends State { AppToast.showSuccessToast(message: "Address Added Successfully"); } Navigator.of(context).pop(addNewAddressRequestModel); - }).insideContainer - ); + }).insideContainer); }, initialPosition: LatLng(latitude, longitude), useCurrentLocation: showCurrentLocation, @@ -120,4 +215,19 @@ class _LocationPageState extends State { ), ); } + + setMap() { + setState(() { + _kGooglePlex = CameraPosition( + target: currentPostion, + zoom: 14.4746, + ); + appMap.moveTo(cameraPostion: _kGooglePlex); + }); + } + + void _updatePosition(CameraPosition _position) { + latitude = _position.target.latitude; + longitude = _position.target.longitude; + } } 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 10418bc2..a872acee 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 @@ -4,26 +4,25 @@ 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/core/viewModels/project_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/theme/colors.dart'; import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:diplomaticquarterapp/uitl/utils_new.dart'; -import 'package:diplomaticquarterapp/widgets/buttons/secondary_button.dart'; +import 'package:diplomaticquarterapp/widgets/app_map/google_huawei_map.dart'; +import 'package:diplomaticquarterapp/widgets/buttons/defaultButton.dart'; import 'package:diplomaticquarterapp/widgets/dialogs/select_location_dialog.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; import 'package:diplomaticquarterapp/widgets/transitions/fade_page.dart'; import 'package:flutter/cupertino.dart'; 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 'package:provider/provider.dart'; -import 'package:diplomaticquarterapp/widgets/app_map/google_huawei_map.dart'; + import 'location_page.dart'; -import 'package:geolocator/geolocator.dart'; class NewHomeHealthCareStepTowPage extends StatefulWidget { final Function(PickResult) onPick; @@ -53,6 +52,7 @@ class _NewHomeHealthCareStepTowPageState extends State mapController = Completer(); + @override void initState() { appMap = AppMap( @@ -86,7 +86,7 @@ class _NewHomeHealthCareStepTowPageState extends State { SizedBox(height: 20), ], ) - // Column( - // crossAxisAlignment: CrossAxisAlignment.start, - // mainAxisAlignment: MainAxisAlignment.spaceEvenly, - // children: [ - // AppText(TranslationBase.of(context).nationalID), - // Container( - // margin: EdgeInsets.only(bottom: 10), - // child: TextFields( - // hintText: registerInfo.idNumber, - // prefixIcon: Icon(Icons.chrome_reader_mode, color: Colors.red), - // padding: EdgeInsets.only(top: 20, bottom: 20, left: 10, right: 10), - // readOnly: true, - // )), - // AppText(TranslationBase.of(context).firstName), - // Container( - // margin: EdgeInsets.only(bottom: 10), - // child: TextFields( - // hintText: registerInfo.firstNameEn == '-' ? registerInfo.firstNameAr : registerInfo.firstNameEn, - // padding: EdgeInsets.only(top: 20, bottom: 20, left: 10, right: 10), - // readOnly: true, - // )), - // AppText(TranslationBase.of(context).middleName), - // Container( - // margin: EdgeInsets.only(bottom: 10), - // child: TextFields( - // hintText: registerInfo.secondNameEn == '-' ? registerInfo.secondNameAr : registerInfo.secondNameEn, - // padding: EdgeInsets.only(top: 20, bottom: 20, left: 10, right: 10), - // readOnly: true, - // )), - // AppText(TranslationBase.of(context).lastName), - // Container( - // margin: EdgeInsets.only(bottom: 10), - // child: TextFields( - // hintText: registerInfo.lastNameEn == '-' ? registerInfo.lastNameAr : registerInfo.lastNameEn, - // padding: EdgeInsets.only(top: 20, bottom: 20, left: 10, right: 10), - // readOnly: true, - // )), - // AppText(TranslationBase.of(context).gender), - // Container( - // margin: EdgeInsets.only(bottom: 10), - // child: TextFields( - // hintText: registerInfo.maritalStatusCode == 'U' - // ? 'Unknown' - // : registerInfo.maritalStatusCode == 'M' - // ? 'Male' - // : 'Female', - // padding: EdgeInsets.only(top: 20, bottom: 20, left: 10, right: 10), - // readOnly: true, - // )), - // AppText(TranslationBase.of(context).maritalStatus), - // Container( - // margin: EdgeInsets.only(bottom: 10), - // child: TextFields( - // hintText: registerInfo.maritalStatus, - // padding: EdgeInsets.only(top: 20, bottom: 20, left: 10, right: 10), - // readOnly: true, - // )), - // AppText(TranslationBase.of(context).nationality), - // Container( - // margin: EdgeInsets.only(bottom: 10), - // child: TextFields( - // hintText: registerInfo.nationalityCode, - // padding: EdgeInsets.only(top: 20, bottom: 20, left: 10, right: 10), - // readOnly: true, - // )), - // AppText(TranslationBase.of(context).mobileNumber), - // Container( - // margin: EdgeInsets.only(bottom: 10), - // child: TextFields( - // hintText: registerd_data.patientMobileNumber.toString(), - // padding: EdgeInsets.only(top: 20, bottom: 20, left: 10, right: 10), - // readOnly: true, - // )), - // AppText(TranslationBase.of(context).dob), - // Container( - // margin: EdgeInsets.only(bottom: 10), - // child: TextFields( - // hintText: registerInfo.dateOfBirth, - // padding: EdgeInsets.only(top: 20, bottom: 20, left: 10, right: 10), - // readOnly: true, - // )), - // ], - // ) - : registerInfo != null && widget.page == 2 ? Column( crossAxisAlignment: CrossAxisAlignment.start, diff --git a/lib/pages/pharmacy/pharmacyAddresses/AddAddress.dart b/lib/pages/pharmacy/pharmacyAddresses/AddAddress.dart index 5e55d537..dcc4b299 100644 --- a/lib/pages/pharmacy/pharmacyAddresses/AddAddress.dart +++ b/lib/pages/pharmacy/pharmacyAddresses/AddAddress.dart @@ -1,17 +1,27 @@ -import 'package:diplomaticquarterapp/core/model/pharmacies/Addresses.dart'; +import 'dart:async'; + import 'package:diplomaticquarterapp/core/service/AlHabibMedicalService/customer_addresses_service.dart'; +import 'package:diplomaticquarterapp/core/viewModels/AlHabibMedicalService/add_new_address_Request_Model.dart'; import 'package:diplomaticquarterapp/core/viewModels/pharmacyModule/PharmacyAddressesViewModel.dart'; +import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; import 'package:diplomaticquarterapp/pages/base/base_view.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/widgets/app_map/google_huawei_map.dart'; +import 'package:diplomaticquarterapp/widgets/buttons/defaultButton.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; import 'package:diplomaticquarterapp/widgets/pickupLocation/PickupLocationFromMap.dart'; import 'package:flutter/material.dart'; +import 'package:geocoding/geocoding.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:provider/provider.dart'; class AddAddressPage extends StatefulWidget { final AddressInfo editedAddress; - final Function(PickResult) onPick; + final Function(Placemark, String) onPick; AddAddressPage(this.editedAddress, this.onPick); @@ -22,10 +32,21 @@ class AddAddressPage extends StatefulWidget { class _AddAddressPageState extends State { double _latitude; double _longitude; + AppMap appMap; + AppSharedPreferences sharedPref = AppSharedPreferences(); + LatLng currentPostion; + Completer mapController = Completer(); + Placemark selectedPlace; + + static CameraPosition _kGooglePlex = CameraPosition( + target: LatLng(37.42796133580664, -122.085749655962), + zoom: 14.4746, + ); @override void initState() { super.initState(); + if (widget.editedAddress != null && widget.editedAddress.latLong != null && widget.editedAddress.latLong != "") { List latLng = widget.editedAddress.latLong.split(","); _latitude = double.parse(latLng[0]); @@ -33,13 +54,43 @@ class _AddAddressPageState extends State { } else { _getCurrentLocation(); } + // setState(() {}); + appMap = AppMap( + _kGooglePlex.toMap(), + onCameraMove: (camera) { + _updatePosition(camera); + }, + onMapCreated: () { + currentPostion = LatLng(_latitude, _longitude); + // latitude = widget.latitude; + // longitude = widget.longitude; + setMap(); + setState(() {}); + }, + onCameraIdle: () async { + List placemarks = await placemarkFromCoordinates(_latitude, _longitude); + selectedPlace = placemarks[0]; + print(selectedPlace); + }, + ); + } + + setMap() { setState(() { + _kGooglePlex = CameraPosition( + target: currentPostion, + zoom: 14.4746, + ); + appMap.moveTo(cameraPostion: _kGooglePlex); }); } - - + void _updatePosition(CameraPosition _position) { + _latitude = _position.target.latitude; + _longitude = _position.target.longitude; + print(_position); + } _getCurrentLocation() async { await Geolocator.getLastKnownPosition().then((value) { @@ -48,37 +99,93 @@ class _AddAddressPageState extends State { }).catchError((e) { _longitude = 0; _latitude = 0; - - }); } - @override Widget build(BuildContext context) { final mediaQuery = MediaQuery.of(context); final height = mediaQuery.size.height - 60 - mediaQuery.padding.top; + ProjectViewModel projectViewModel = Provider.of(context); return BaseView( builder: (_, model, wi) => AppScaffold( appBarTitle: TranslationBase.of(context).changeAddress, - isShowAppBar: false, + isShowAppBar: true, isPharmacy: true, backgroundColor: Colors.white, - body: Container( - height: height * 1, - child: PickupLocationFromMap( - latitude: _latitude??0, - longitude: _longitude??0, - isWithAppBar: false, - buttonColor: Color(0xFF5AB145), - buttonLabel: TranslationBase.of(context).save, - onPick: (value) { - widget.onPick(value); - }, - ), + showNewAppBarTitle: true, + showNewAppBar: true, + body: Column( + children: [ + Expanded( + child: Stack( + alignment: Alignment.center, + children: [ + if (appMap != null) appMap, + Container( + margin: EdgeInsets.only(bottom: 50.0), + child: Icon( + Icons.place, + color: CustomColors.accentColor, + size: 50, + ), + ), + ], + ), + ), + Container( + padding: const EdgeInsets.only(left: 20, right: 20, top: 14, bottom: 14), + child: DefaultButton(TranslationBase.of(context).addNewAddress, () async { + // AddNewAddressRequestModel addNewAddressRequestModel = new AddNewAddressRequestModel( + // customer: Customer(addresses: [ + // Addresses( + // address1: selectedPlace.name, + // address2: selectedPlace.street, + // customerAttributes: "", + // city: selectedPlace.locality, + // createdOnUtc: "", + // id: "0", + // faxNumber: "", + // phoneNumber: projectViewModel.user.mobileNumber, + // province: selectedPlace.locality, + // countryId: 69, + // latLong: "$_latitude,$_longitude", + // country: selectedPlace.country, + // zipPostalCode: selectedPlace.postalCode, + // email: projectViewModel.user.emailAddress) + // ]), + // ); + + widget.onPick(selectedPlace, "$_latitude,$_longitude"); + Navigator.of(context).pop(); + + // await model.addAddressInfo(addNewAddressRequestModel: addNewAddressRequestModel); + // if (model.state == ViewState.ErrorLocal) { + // Utils.showErrorToast(model.error); + // } else { + // AppToast.showSuccessToast(message: "Address Added Successfully"); + // } + // Navigator.of(context).pop(addNewAddressRequestModel); + }), + ), + ], ), - ), - ); + + // Container( + // height: height * 1, + // child: PickupLocationFromMap( + // latitude: _latitude ?? 0, + // longitude: _longitude ?? 0, + // isWithAppBar: false, + // buttonColor: Color(0xFF5AB145), + // buttonLabel: TranslationBase.of(context).save, + // onPick: (value) { + // widget.onPick(value); + // }, + // ), + ), + ); + // ); } } diff --git a/lib/pages/pharmacy/pharmacyAddresses/PharmacyAddresses.dart b/lib/pages/pharmacy/pharmacyAddresses/PharmacyAddresses.dart index 933824db..3d811514 100644 --- a/lib/pages/pharmacy/pharmacyAddresses/PharmacyAddresses.dart +++ b/lib/pages/pharmacy/pharmacyAddresses/PharmacyAddresses.dart @@ -39,8 +39,8 @@ class _PharmacyAddressesState extends State { FadePage( page: AddAddressPage( address, - (pickResult) async { - await model.addEditAddress(pickResult, address); + (pickResult, latLong) async { + await model.addEditAddress(pickResult, address, latLong: latLong); }, ), ), diff --git a/lib/widgets/app_map/google_huawei_map.dart b/lib/widgets/app_map/google_huawei_map.dart index ff9efeff..0e9b4936 100644 --- a/lib/widgets/app_map/google_huawei_map.dart +++ b/lib/widgets/app_map/google_huawei_map.dart @@ -1,5 +1,6 @@ import 'dart:async'; +import 'package:diplomaticquarterapp/services/pharmacy_services/writeReview_service.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_hms_gms_availability/flutter_hms_gms_availability.dart'; @@ -12,8 +13,9 @@ class AppMap extends StatefulWidget { AppMapState _state; Function onMapCreated; + Function onCameraIdle; - AppMap(this.initialCamera, {this.onCameraMove, this.onMapCreated}); + AppMap(this.initialCamera, {this.onCameraMove, this.onMapCreated, this.onCameraIdle}); @override State createState() => _state = AppMapState(); @@ -69,6 +71,7 @@ class AppMapState extends State { _googleMapControllerComp.complete(controller); widget.onMapCreated(); }, + onCameraIdle: widget.onCameraIdle, ); } From 2a22edfdd04d08fec7a256ba71e23164316dd028 Mon Sep 17 00:00:00 2001 From: haroon amjad Date: Sun, 16 Jan 2022 11:57:48 +0300 Subject: [PATCH 5/7] no message --- android/app/build.gradle | 2 + ios/Flutter/.last_build_id | 2 +- ios/Podfile.lock | 100 ++++++++++++++++--------- ios/Runner.xcodeproj/project.pbxproj | 106 +++++++++++++++------------ ios/Runner/Info.plist | 23 ++++++ pubspec.yaml | 3 + 6 files changed, 154 insertions(+), 82 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index dc377f5c..89407e6f 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -67,6 +67,8 @@ android { } release { signingConfig signingConfigs.config + minifyEnabled true + shrinkResources true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } staging { diff --git a/ios/Flutter/.last_build_id b/ios/Flutter/.last_build_id index b3315e38..b95e82c3 100644 --- a/ios/Flutter/.last_build_id +++ b/ios/Flutter/.last_build_id @@ -1 +1 @@ -8d8845c5c035b7f87f2849054cdedb69 \ No newline at end of file +84018bae6147d7170a2e3bd8d9e051aa \ No newline at end of file diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 169a7b58..49f5e49b 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -1,9 +1,10 @@ PODS: - audio_session (0.0.1): - Flutter - - barcode_scan_fix (0.0.1): + - barcode_scan2 (0.0.1): - Flutter - MTBBarcodeScanner + - SwiftProtobuf - camera (0.0.1): - Flutter - connectivity (0.0.1): @@ -11,6 +12,8 @@ PODS: - Reachability - device_calendar (0.0.1): - Flutter + - device_info_plus (0.0.1): + - Flutter - DKImagePickerController/Core (4.3.2): - DKImagePickerController/ImageDataManager - DKImagePickerController/Resource @@ -59,10 +62,10 @@ PODS: - Firebase/Analytics (= 8.9.0) - firebase_core - Flutter - - firebase_core (1.10.0): + - firebase_core (1.10.5): - Firebase/CoreOnly (= 8.9.0) - Flutter - - firebase_messaging (11.1.0): + - firebase_messaging (11.2.3): - Firebase/Messaging (= 8.9.0) - firebase_core - Flutter @@ -107,11 +110,7 @@ PODS: - GoogleUtilities/Reachability (~> 7.6) - GoogleUtilities/UserDefaults (~> 7.6) - nanopb (~> 2.30908.0) - - fit_kit (0.0.1): - - Flutter - Flutter (1.0.0) - - flutter_flexible_toast (0.0.1): - - Flutter - flutter_hms_gms_availability (0.0.1): - Flutter - flutter_inappwebview (0.0.1): @@ -123,15 +122,24 @@ PODS: - OrderedSet (~> 5.0) - flutter_local_notifications (0.0.1): - Flutter + - flutter_native_timezone (0.0.1): + - Flutter + - flutter_nfc_kit (2.0.0): + - Flutter - flutter_tts (0.0.1): - Flutter - flutter_webrtc (0.7.1): - Flutter - Libyuv (= 1703) - WebRTC-SDK (= 92.4515.11) + - fluttertoast (0.0.2): + - Flutter + - Toast - FMDB (2.7.5): - FMDB/standard (= 2.7.5) - FMDB/standard (2.7.5) + - geocoding (1.0.5): + - Flutter - geolocator_apple (1.2.0): - Flutter - google_maps_flutter (0.0.1): @@ -185,6 +193,8 @@ PODS: - GoogleUtilities/Logger - GoogleUtilities/UserDefaults (7.6.0): - GoogleUtilities/Logger + - health (1.0.4): + - Flutter - image_picker (0.0.1): - Flutter - in_app_review (0.2.0): @@ -198,6 +208,8 @@ PODS: - Flutter - manage_calendar_events (0.0.1): - Flutter + - map_launcher (0.0.1): + - Flutter - maps_launcher (0.0.1): - Flutter - MTBBarcodeScanner (5.0.11) @@ -208,8 +220,6 @@ PODS: - nanopb/encode (2.30908.0) - native_device_orientation (0.0.1): - Flutter - - nfc_in_flutter (1.0.0): - - Flutter - OrderedSet (5.0.0) - package_info_plus (0.4.5): - Flutter @@ -219,7 +229,7 @@ PODS: - Flutter - PromisesObjC (2.0.0) - Reachability (3.2) - - screen (0.0.1): + - screen_brightness_ios (0.0.1): - Flutter - SDWebImage (5.12.1): - SDWebImage/Core (= 5.12.1) @@ -234,7 +244,9 @@ PODS: - sqflite (0.0.2): - Flutter - FMDB (>= 2.7.5) + - SwiftProtobuf (1.18.0) - SwiftyGif (5.4.1) + - Toast (4.0.0) - Try (2.1.1) - url_launcher_ios (0.0.1): - Flutter @@ -252,37 +264,41 @@ PODS: DEPENDENCIES: - audio_session (from `.symlinks/plugins/audio_session/ios`) - - barcode_scan_fix (from `.symlinks/plugins/barcode_scan_fix/ios`) + - barcode_scan2 (from `.symlinks/plugins/barcode_scan2/ios`) - camera (from `.symlinks/plugins/camera/ios`) - connectivity (from `.symlinks/plugins/connectivity/ios`) - device_calendar (from `.symlinks/plugins/device_calendar/ios`) + - device_info_plus (from `.symlinks/plugins/device_info_plus/ios`) - file_picker (from `.symlinks/plugins/file_picker/ios`) - firebase_analytics (from `.symlinks/plugins/firebase_analytics/ios`) - firebase_core (from `.symlinks/plugins/firebase_core/ios`) - firebase_messaging (from `.symlinks/plugins/firebase_messaging/ios`) - - fit_kit (from `.symlinks/plugins/fit_kit/ios`) - Flutter (from `Flutter`) - - flutter_flexible_toast (from `.symlinks/plugins/flutter_flexible_toast/ios`) - flutter_hms_gms_availability (from `.symlinks/plugins/flutter_hms_gms_availability/ios`) - flutter_inappwebview (from `.symlinks/plugins/flutter_inappwebview/ios`) - flutter_local_notifications (from `.symlinks/plugins/flutter_local_notifications/ios`) + - flutter_native_timezone (from `.symlinks/plugins/flutter_native_timezone/ios`) + - flutter_nfc_kit (from `.symlinks/plugins/flutter_nfc_kit/ios`) - flutter_tts (from `.symlinks/plugins/flutter_tts/ios`) - flutter_webrtc (from `.symlinks/plugins/flutter_webrtc/ios`) + - fluttertoast (from `.symlinks/plugins/fluttertoast/ios`) + - geocoding (from `.symlinks/plugins/geocoding/ios`) - geolocator_apple (from `.symlinks/plugins/geolocator_apple/ios`) - google_maps_flutter (from `.symlinks/plugins/google_maps_flutter/ios`) + - health (from `.symlinks/plugins/health/ios`) - image_picker (from `.symlinks/plugins/image_picker/ios`) - in_app_review (from `.symlinks/plugins/in_app_review/ios`) - just_audio (from `.symlinks/plugins/just_audio/ios`) - local_auth (from `.symlinks/plugins/local_auth/ios`) - location (from `.symlinks/plugins/location/ios`) - manage_calendar_events (from `.symlinks/plugins/manage_calendar_events/ios`) + - map_launcher (from `.symlinks/plugins/map_launcher/ios`) - maps_launcher (from `.symlinks/plugins/maps_launcher/ios`) - native_device_orientation (from `.symlinks/plugins/native_device_orientation/ios`) - - nfc_in_flutter (from `.symlinks/plugins/nfc_in_flutter/ios`) - package_info_plus (from `.symlinks/plugins/package_info_plus/ios`) - path_provider_ios (from `.symlinks/plugins/path_provider_ios/ios`) - permission_handler (from `.symlinks/plugins/permission_handler/ios`) - - screen (from `.symlinks/plugins/screen/ios`) + - screen_brightness_ios (from `.symlinks/plugins/screen_brightness_ios/ios`) - searchable_dropdown (from `.symlinks/plugins/searchable_dropdown/ios`) - shared_preferences_ios (from `.symlinks/plugins/shared_preferences_ios/ios`) - speech_to_text (from `.symlinks/plugins/speech_to_text/ios`) @@ -316,21 +332,25 @@ SPEC REPOS: - PromisesObjC - Reachability - SDWebImage + - SwiftProtobuf - SwiftyGif + - Toast - Try - WebRTC-SDK EXTERNAL SOURCES: audio_session: :path: ".symlinks/plugins/audio_session/ios" - barcode_scan_fix: - :path: ".symlinks/plugins/barcode_scan_fix/ios" + barcode_scan2: + :path: ".symlinks/plugins/barcode_scan2/ios" camera: :path: ".symlinks/plugins/camera/ios" connectivity: :path: ".symlinks/plugins/connectivity/ios" device_calendar: :path: ".symlinks/plugins/device_calendar/ios" + device_info_plus: + :path: ".symlinks/plugins/device_info_plus/ios" file_picker: :path: ".symlinks/plugins/file_picker/ios" firebase_analytics: @@ -339,26 +359,32 @@ EXTERNAL SOURCES: :path: ".symlinks/plugins/firebase_core/ios" firebase_messaging: :path: ".symlinks/plugins/firebase_messaging/ios" - fit_kit: - :path: ".symlinks/plugins/fit_kit/ios" Flutter: :path: Flutter - flutter_flexible_toast: - :path: ".symlinks/plugins/flutter_flexible_toast/ios" flutter_hms_gms_availability: :path: ".symlinks/plugins/flutter_hms_gms_availability/ios" flutter_inappwebview: :path: ".symlinks/plugins/flutter_inappwebview/ios" flutter_local_notifications: :path: ".symlinks/plugins/flutter_local_notifications/ios" + flutter_native_timezone: + :path: ".symlinks/plugins/flutter_native_timezone/ios" + flutter_nfc_kit: + :path: ".symlinks/plugins/flutter_nfc_kit/ios" flutter_tts: :path: ".symlinks/plugins/flutter_tts/ios" flutter_webrtc: :path: ".symlinks/plugins/flutter_webrtc/ios" + fluttertoast: + :path: ".symlinks/plugins/fluttertoast/ios" + geocoding: + :path: ".symlinks/plugins/geocoding/ios" geolocator_apple: :path: ".symlinks/plugins/geolocator_apple/ios" google_maps_flutter: :path: ".symlinks/plugins/google_maps_flutter/ios" + health: + :path: ".symlinks/plugins/health/ios" image_picker: :path: ".symlinks/plugins/image_picker/ios" in_app_review: @@ -371,20 +397,20 @@ EXTERNAL SOURCES: :path: ".symlinks/plugins/location/ios" manage_calendar_events: :path: ".symlinks/plugins/manage_calendar_events/ios" + map_launcher: + :path: ".symlinks/plugins/map_launcher/ios" maps_launcher: :path: ".symlinks/plugins/maps_launcher/ios" native_device_orientation: :path: ".symlinks/plugins/native_device_orientation/ios" - nfc_in_flutter: - :path: ".symlinks/plugins/nfc_in_flutter/ios" package_info_plus: :path: ".symlinks/plugins/package_info_plus/ios" path_provider_ios: :path: ".symlinks/plugins/path_provider_ios/ios" permission_handler: :path: ".symlinks/plugins/permission_handler/ios" - screen: - :path: ".symlinks/plugins/screen/ios" + screen_brightness_ios: + :path: ".symlinks/plugins/screen_brightness_ios/ios" searchable_dropdown: :path: ".symlinks/plugins/searchable_dropdown/ios" shared_preferences_ios: @@ -408,37 +434,41 @@ EXTERNAL SOURCES: SPEC CHECKSUMS: audio_session: 4f3e461722055d21515cf3261b64c973c062f345 - barcode_scan_fix: 80dd65de55f27eec6591dd077c8b85f2b79e31f1 + barcode_scan2: 0af2bb63c81b4565aab6cd78278e4c0fa136dbb0 camera: fe33292aff715a981eb34d7ce7b35b54337ff34c connectivity: c4130b2985d4ef6fd26f9702e886bd5260681467 - device_calendar: 23b28a5f1ab3bf77e34542fb1167e1b8b29a98f5 + device_calendar: 9cb33f88a02e19652ec7b8b122ca778f751b1f7b + device_info_plus: e5c5da33f982a436e103237c0c85f9031142abed DKImagePickerController: b5eb7f7a388e4643264105d648d01f727110fc3d DKPhotoGallery: fdfad5125a9fdda9cc57df834d49df790dbb4179 file_picker: 3e6c3790de664ccf9b882732d9db5eaf6b8d4eb1 Firebase: 13d8d96499e2635428d5bf0ec675df21f95d9a95 firebase_analytics: 7a7528bb2abf4ca22cff7a57bbf909dcab73e13d - firebase_core: f770e033e790657b3505f04be4cb24c482912f11 - firebase_messaging: 0c8d1a1732487db7f332fb65232053e93201e2fb + firebase_core: dfcae4c150a5e24436a0b7677c470478a234d5bf + firebase_messaging: c4696ded2f44fb5c2bf6e94f9a575105793e58fa FirebaseAnalytics: 4ab446ce08a3fe52e8a4303dd997cf26276bf968 FirebaseCore: 599ee609343eaf4941bd188f85e3aa077ffe325b FirebaseCoreDiagnostics: 56fb7216d87e0e6ec2feddefa9d8a392fe8b2c18 FirebaseInstallations: 830327b45345ffc859eaa9c17bcd5ae893fd5425 FirebaseMessaging: 82c4a48638f53f7b184f3cc9f6cd2cbe533ab316 - fit_kit: 7643191161673bcd32863ae3f10baed6ce55c7c0 Flutter: 50d75fe2f02b26cc09d224853bb45737f8b3214a - flutter_flexible_toast: 0547e740cae0c33bb7c51bcd931233f4584e1143 flutter_hms_gms_availability: babc50b18670e99780270bc18d9b17d0a07cd77e flutter_inappwebview: bfd58618f49dc62f2676de690fc6dcda1d6c3721 flutter_local_notifications: 0c0b1ae97e741e1521e4c1629a459d04b9aec743 + flutter_native_timezone: 5f05b2de06c9776b4cc70e1839f03de178394d22 + flutter_nfc_kit: 965c98c3fa68f5609f1cc89abb968fe1b8ffdbaa flutter_tts: 0f492aab6accf87059b72354fcb4ba934304771d flutter_webrtc: a5a79904f0bca0ea23aff49c51ca765f70a0f703 + fluttertoast: 6122fa75143e992b1d3470f61000f591a798cc58 FMDB: 2ce00b547f966261cd18927a3ddb07cb6f3db82a + geocoding: 32cfcdb16d38d907caaba65e2e42ad10d38bee58 geolocator_apple: b741765c55dc21950e3e106e8b3584e55cf81ce5 google_maps_flutter: abdb8dee6c52d4be36ad131ee6ebfacd14417c5a GoogleAppMeasurement: 837649ad3987936c232f6717c5680216f6243d24 GoogleDataTransport: 629c20a4d363167143f30ea78320d5a7eb8bd940 GoogleMaps: 025272d5876d3b32604e5c080dc25eaf68764693 GoogleUtilities: 684ee790a24f73ebb2d1d966e9711c203f2a4237 + health: e7a5807e45ec58fe6b89a730c97abc6caafe94a0 image_picker: 9aa50e1d8cdacdbed739e925b7eea16d014367e6 in_app_review: 4a97249f7a2f539a0f294c2d9196b7fe35e49541 just_audio: baa7252489dbcf47a4c7cc9ca663e9661c99aafa @@ -446,24 +476,26 @@ SPEC CHECKSUMS: local_auth: ef62030a2731330b95df7ef1331bd15f6a64b8a6 location: 3a2eed4dd2fab25e7b7baf2a9efefe82b512d740 manage_calendar_events: 0338d505ea26cdfd20cd883279bc28afa11eca34 + map_launcher: e325db1261d029ff33e08e03baccffe09593ffea maps_launcher: 2e5b6a2d664ec6c27f82ffa81b74228d770ab203 MTBBarcodeScanner: f453b33c4b7dfe545d8c6484ed744d55671788cb nanopb: a0ba3315591a9ae0a16a309ee504766e90db0c96 native_device_orientation: 3b4cfc9565a7b879cc4fde282b3e27745e852d0d - nfc_in_flutter: c656fbfb1ec5b9d021da87b0c87629d62fd5264d OrderedSet: aaeb196f7fef5a9edf55d89760da9176ad40b93c package_info_plus: 6c92f08e1f853dc01228d6f553146438dafcd14e path_provider_ios: 7d7ce634493af4477d156294792024ec3485acd5 permission_handler: ccb20a9fad0ee9b1314a52b70b76b473c5f8dab0 PromisesObjC: 68159ce6952d93e17b2dfe273b8c40907db5ba58 Reachability: 33e18b67625424e47b6cde6d202dce689ad7af96 - screen: abd91ca7bf3426e1cc3646d27e9b2358d6bf07b0 + screen_brightness_ios: e2f4c3492ec238bb8ea1f5558f67ea22557cf997 SDWebImage: 4dc3e42d9ec0c1028b960a33ac6b637bb432207b searchable_dropdown: 5058be32fdc5e0481d300ff2087129072e71bd62 shared_preferences_ios: aef470a42dc4675a1cdd50e3158b42e3d1232b32 speech_to_text: b43a7d99aef037bd758ed8e45d79bbac035d2dfe sqflite: 6d358c025f5b867b29ed92fc697fd34924e11904 + SwiftProtobuf: c3c12645230d9b09c72267e0de89468c5543bd86 SwiftyGif: 6895c887f5551618a3c5dd3ecb512419105bacca + Toast: 91b396c56ee72a5790816f40d3a94dd357abc196 Try: 5ef669ae832617b3cee58cb2c6f99fb767a4ff96 url_launcher_ios: 02f1989d4e14e998335b02b67a7590fa34f971af vibration: b5a33e764c3f609a975b9dca73dce20fdde627dc @@ -473,6 +505,6 @@ SPEC CHECKSUMS: webview_flutter_wkwebview: 005fbd90c888a42c5690919a1527ecc6649e1162 wifi: d7d77c94109e36c4175d845f0a5964eadba71060 -PODFILE CHECKSUM: aafe91acc616949ddb318b77800a7f51bffa2a4c +PODFILE CHECKSUM: cc1f88378b4bfcf93a6ce00d2c587857c6008d3b COCOAPODS: 1.11.2 diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index 14e77cd0..3e52d097 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -13,7 +13,11 @@ 306FE6C8271D790C002D6EFC /* OpenTokPlatformBridge.swift in Sources */ = {isa = PBXBuildFile; fileRef = 306FE6C7271D790C002D6EFC /* OpenTokPlatformBridge.swift */; }; 306FE6CB271D8B73002D6EFC /* OpenTok.swift in Sources */ = {isa = PBXBuildFile; fileRef = 306FE6CA271D8B73002D6EFC /* OpenTok.swift */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; + 475592F05034141EC172233D /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 784F1093F853B573C176EC8E /* Pods_Runner.framework */; }; 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; + 762D738E274E42650063CE73 /* ring_30Sec.caf in Resources */ = {isa = PBXBuildFile; fileRef = 762D738C274E42650063CE73 /* ring_30Sec.caf */; }; + 762D738F274E42650063CE73 /* ring_30Sec.mp3 in Resources */ = {isa = PBXBuildFile; fileRef = 762D738D274E42650063CE73 /* ring_30Sec.mp3 */; }; + 76815B27275F381C00E66E94 /* HealthKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 76815B26275F381C00E66E94 /* HealthKit.framework */; }; 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; @@ -35,7 +39,6 @@ E9C8C136256BACDA00EFFB62 /* HMG_Guest.swift in Sources */ = {isa = PBXBuildFile; fileRef = E9C8C135256BACDA00EFFB62 /* HMG_Guest.swift */; }; E9E27168256E3A4000F49B69 /* LocalizedFromFlutter.swift in Sources */ = {isa = PBXBuildFile; fileRef = E9E27167256E3A4000F49B69 /* LocalizedFromFlutter.swift */; }; E9F7623B25922BCE00FB5CCF /* FlutterConstants.swift in Sources */ = {isa = PBXBuildFile; fileRef = E9F7623A25922BCE00FB5CCF /* FlutterConstants.swift */; }; - FA0839686861F9C0546E6F45 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C703B0BB1CDBBCA30693DBD3 /* Pods_Runner.framework */; }; /* End PBXBuildFile section */ /* Begin PBXCopyFilesBuildPhase section */ @@ -52,6 +55,7 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ + 0E1B56877369D77C273A75CC /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; 301C79AD27200D9F0016307B /* OpenTokRemoteVideoFactory.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OpenTokRemoteVideoFactory.swift; sourceTree = ""; }; @@ -59,11 +63,14 @@ 306FE6C7271D790C002D6EFC /* OpenTokPlatformBridge.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OpenTokPlatformBridge.swift; sourceTree = ""; }; 306FE6CA271D8B73002D6EFC /* OpenTok.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OpenTok.swift; sourceTree = ""; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; - 44DB2098C8C4B08C2F3B1329 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + 578C284DFF3E98A58F201401 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 762D738C274E42650063CE73 /* ring_30Sec.caf */ = {isa = PBXFileReference; lastKnownFileType = file; name = ring_30Sec.caf; path = ../../assets/sounds/ring_30Sec.caf; sourceTree = ""; }; + 762D738D274E42650063CE73 /* ring_30Sec.mp3 */ = {isa = PBXFileReference; lastKnownFileType = audio.mp3; name = ring_30Sec.mp3; path = ../../assets/sounds/ring_30Sec.mp3; sourceTree = ""; }; + 76815B26275F381C00E66E94 /* HealthKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = HealthKit.framework; path = System/Library/Frameworks/HealthKit.framework; sourceTree = SDKROOT; }; + 784F1093F853B573C176EC8E /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; - 84A70B284E0DDF62ECE83D3B /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -71,8 +78,7 @@ 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 9C2760F1A81999922ACAA9E6 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; - C703B0BB1CDBBCA30693DBD3 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + CA034E94472F7A2E6ADD99A0 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; E91B538D256AAA6500E96549 /* GlobalHelper.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GlobalHelper.swift; sourceTree = ""; }; E91B538E256AAA6500E96549 /* Extensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Extensions.swift; sourceTree = ""; }; E91B538F256AAA6500E96549 /* API.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = API.swift; sourceTree = ""; }; @@ -99,8 +105,9 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 76815B27275F381C00E66E94 /* HealthKit.framework in Frameworks */, E9620805255C2ED100D3A35D /* NetworkExtension.framework in Frameworks */, - FA0839686861F9C0546E6F45 /* Pods_Runner.framework in Frameworks */, + 475592F05034141EC172233D /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -120,8 +127,9 @@ 555EAAA626EFB641859EF0BE /* Frameworks */ = { isa = PBXGroup; children = ( + 76815B26275F381C00E66E94 /* HealthKit.framework */, E9620804255C2ED100D3A35D /* NetworkExtension.framework */, - C703B0BB1CDBBCA30693DBD3 /* Pods_Runner.framework */, + 784F1093F853B573C176EC8E /* Pods_Runner.framework */, ); name = Frameworks; sourceTree = ""; @@ -129,9 +137,9 @@ 605039E5DDF72C245F9765FE /* Pods */ = { isa = PBXGroup; children = ( - 44DB2098C8C4B08C2F3B1329 /* Pods-Runner.debug.xcconfig */, - 9C2760F1A81999922ACAA9E6 /* Pods-Runner.release.xcconfig */, - 84A70B284E0DDF62ECE83D3B /* Pods-Runner.profile.xcconfig */, + 0E1B56877369D77C273A75CC /* Pods-Runner.debug.xcconfig */, + 578C284DFF3E98A58F201401 /* Pods-Runner.release.xcconfig */, + CA034E94472F7A2E6ADD99A0 /* Pods-Runner.profile.xcconfig */, ); path = Pods; sourceTree = ""; @@ -171,6 +179,8 @@ 97C146F01CF9000F007C117D /* Runner */ = { isa = PBXGroup; children = ( + 762D738C274E42650063CE73 /* ring_30Sec.caf */, + 762D738D274E42650063CE73 /* ring_30Sec.mp3 */, 306FE6C9271D8B54002D6EFC /* OpenTok */, E91B539E256AAC1400E96549 /* GuestPOC_Certificate.cer */, E91B539D256AAC1400E96549 /* GuestPOC_Certificate.p12 */, @@ -232,15 +242,15 @@ isa = PBXNativeTarget; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - D74B98D9E413413D50043E1B /* [CP] Check Pods Manifest.lock */, + 90E681C38D6D36A73BF84E03 /* [CP] Check Pods Manifest.lock */, 9740EEB61CF901F6004384FC /* Run Script */, 97C146EA1CF9000F007C117D /* Sources */, 97C146EB1CF9000F007C117D /* Frameworks */, 97C146EC1CF9000F007C117D /* Resources */, 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, - 796644D4DF82E4D5FBECBF3B /* [CP] Embed Pods Frameworks */, - 0EF99525B5E50490BA0DF0A4 /* [CP] Copy Pods Resources */, + F4F7FCCC462E347C2D580F43 /* [CP] Embed Pods Frameworks */, + D767F6DDC3BD13ECA410CBAD /* [CP] Copy Pods Resources */, ); buildRules = ( ); @@ -298,29 +308,14 @@ 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, E91B53A3256AAD8200E96549 /* Main_Custom.storyboard in Resources */, 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, + 762D738E274E42650063CE73 /* ring_30Sec.caf in Resources */, + 762D738F274E42650063CE73 /* ring_30Sec.mp3 in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 0EF99525B5E50490BA0DF0A4 /* [CP] Copy Pods Resources */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-input-files.xcfilelist", - ); - name = "[CP] Copy Pods Resources"; - outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-output-files.xcfilelist", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n"; - showEnvVarsInLog = 0; - }; 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; @@ -335,21 +330,26 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; }; - 796644D4DF82E4D5FBECBF3B /* [CP] Embed Pods Frameworks */ = { + 90E681C38D6D36A73BF84E03 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", ); - name = "[CP] Embed Pods Frameworks"; + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; 9740EEB61CF901F6004384FC /* Run Script */ = { @@ -366,26 +366,38 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; }; - D74B98D9E413413D50043E1B /* [CP] Check Pods Manifest.lock */ = { + D767F6DDC3BD13ECA410CBAD /* [CP] Copy Pods Resources */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-input-files.xcfilelist", ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; + name = "[CP] Copy Pods Resources"; outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-output-files.xcfilelist", ); - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n"; + showEnvVarsInLog = 0; + }; + F4F7FCCC462E347C2D580F43 /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; /* End PBXShellScriptBuildPhase section */ @@ -520,7 +532,7 @@ "$(inherited)", "$(PROJECT_DIR)/Flutter", ); - MARKETING_VERSION = 1; + MARKETING_VERSION = 4.5.17; PRODUCT_BUNDLE_IDENTIFIER = "com.HMG.HMG-Smartphone"; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; @@ -660,7 +672,7 @@ "$(inherited)", "$(PROJECT_DIR)/Flutter", ); - MARKETING_VERSION = 1; + MARKETING_VERSION = 4.5.17; PRODUCT_BUNDLE_IDENTIFIER = "com.HMG.HMG-Smartphone"; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; @@ -694,7 +706,7 @@ "$(inherited)", "$(PROJECT_DIR)/Flutter", ); - MARKETING_VERSION = 1; + MARKETING_VERSION = 4.5.17; PRODUCT_BUNDLE_IDENTIFIER = "com.HMG.HMG-Smartphone"; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist index 3cf45d83..77d0dc81 100644 --- a/ios/Runner/Info.plist +++ b/ios/Runner/Info.plist @@ -22,14 +22,29 @@ $(FLUTTER_BUILD_NUMBER) LSApplicationQueriesSchemes + googlechromes comgooglemaps + iosamap + http + https baidumap iosamap + waze + yandexmaps + yandexnavi + citymapper + mapswithme + osmandmaps + dgis + qqmap + here-location LSRequiresIPhoneOS MinimumOSVersion 11.0 + NFCReaderUsageDescription + This app requires NFC Usage access to allow for Online CheckIn for appointments. NSAppTransportSecurity NSAllowsArbitraryLoads @@ -100,5 +115,13 @@ io.flutter.embedded_views_preview + LSApplicationQueriesSchemes + + comgooglemaps + baidumap + iosamap + + + diff --git a/pubspec.yaml b/pubspec.yaml index 2a581ac5..7205970d 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -138,6 +138,9 @@ dependencies: #Handle Geolocation geolocator: ^7.7.1 + #Handle lat long to address + geocoding: ^2.0.1 + jiffy: ^4.1.0 #Flutter WebRTC From efced34ffa002d398eae4c08185eb2bc6e829e44 Mon Sep 17 00:00:00 2001 From: haroon amjad Date: Wed, 19 Jan 2022 14:20:40 +0300 Subject: [PATCH 6/7] Updates --- applepay.json | 22 +++ assets/applepay.json | 22 +++ lib/models/apple_pay_request.dart | 135 ++++++++++++++++ lib/models/apple_pay_response.dart | 112 ++++++++++++++ .../all_habib_medical_service_page2.dart | 2 +- .../ancillaryOrdersDetails.dart | 8 +- lib/pages/BookAppointment/BookConfirm.dart | 3 +- lib/pages/BookAppointment/DoctorProfile.dart | 5 +- lib/pages/ToDoList/payment_method_select.dart | 82 ++++++---- .../fragments/home_page_fragment2.dart | 9 ++ .../medical/balance/confirm_payment_page.dart | 145 ++++++++---------- lib/pages/webRTC/signaling.dart | 74 ++++----- .../appointment_services/GetDoctorsList.dart | 44 ++++++ .../livecare_services/livecare_provider.dart | 5 +- lib/uitl/app_shared_preferences.dart | 4 +- lib/widgets/in_app_browser/InAppBrowser.dart | 11 +- pubspec.yaml | 9 +- 17 files changed, 526 insertions(+), 166 deletions(-) create mode 100644 applepay.json create mode 100644 assets/applepay.json create mode 100644 lib/models/apple_pay_request.dart create mode 100644 lib/models/apple_pay_response.dart diff --git a/applepay.json b/applepay.json new file mode 100644 index 00000000..5b00d6d5 --- /dev/null +++ b/applepay.json @@ -0,0 +1,22 @@ +{ + "provider": "apple_pay", + "data": { + "merchantIdentifier": "merchant.com.hmgwebservices", + "displayName": "Sulaiman Al Habib", + "merchantCapabilities": [ + "3DS", + "debit", + "credit" + ], + "supportedNetworks": [ + "amex", + "visa", + "discover", + "masterCard" + ], + "countryCode": "SA", + "currencyCode": "SAR", + "requiredBillingContactFields": null, + "requiredShippingContactFields": null + } +} \ No newline at end of file diff --git a/assets/applepay.json b/assets/applepay.json new file mode 100644 index 00000000..5b00d6d5 --- /dev/null +++ b/assets/applepay.json @@ -0,0 +1,22 @@ +{ + "provider": "apple_pay", + "data": { + "merchantIdentifier": "merchant.com.hmgwebservices", + "displayName": "Sulaiman Al Habib", + "merchantCapabilities": [ + "3DS", + "debit", + "credit" + ], + "supportedNetworks": [ + "amex", + "visa", + "discover", + "masterCard" + ], + "countryCode": "SA", + "currencyCode": "SAR", + "requiredBillingContactFields": null, + "requiredShippingContactFields": null + } +} \ No newline at end of file diff --git a/lib/models/apple_pay_request.dart b/lib/models/apple_pay_request.dart new file mode 100644 index 00000000..88e16316 --- /dev/null +++ b/lib/models/apple_pay_request.dart @@ -0,0 +1,135 @@ +class ApplePayRequest { + String currency; + String language; + String customername; + dynamic customerEmail; + String orderdescription; + String liveServiceid; + String longitude; + String latitude; + String devicetoken; + String clientrequestid; + String projectid; + String serviceid; + String patientid; + String amount; + String appleData; + String appleSignature; + AppleHeader appleHeader; + ApplePaymentMethod applePaymentMethod; + + ApplePayRequest( + {this.currency, + this.language, + this.customername, + this.customerEmail, + this.orderdescription, + this.liveServiceid, + this.longitude, + this.latitude, + this.devicetoken, + this.clientrequestid, + this.projectid, + this.serviceid, + this.patientid, + this.amount, + this.appleData, + this.appleSignature, + this.appleHeader, + this.applePaymentMethod}); + + ApplePayRequest.fromJson(Map json) { + currency = json['currency']; + language = json['language']; + customername = json['customername']; + customerEmail = json['customer_email']; + orderdescription = json['orderdescription']; + liveServiceid = json['live_serviceid']; + longitude = json['longitude']; + latitude = json['latitude']; + devicetoken = json['devicetoken']; + clientrequestid = json['clientrequestid']; + projectid = json['projectid']; + serviceid = json['serviceid']; + patientid = json['patientid']; + amount = json['Amount']; + appleData = json['apple_data']; + appleSignature = json['apple_signature']; + appleHeader = json['apple_header'] != null ? new AppleHeader.fromJson(json['apple_header']) : null; + applePaymentMethod = json['apple_paymentMethod'] != null ? new ApplePaymentMethod.fromJson(json['apple_paymentMethod']) : null; + } + + Map toJson() { + final Map data = new Map(); + data['currency'] = this.currency; + data['language'] = this.language; + data['customername'] = this.customername; + data['customer_email'] = this.customerEmail; + data['orderdescription'] = this.orderdescription; + data['live_serviceid'] = this.liveServiceid; + data['longitude'] = this.longitude; + data['latitude'] = this.latitude; + data['devicetoken'] = this.devicetoken; + data['clientrequestid'] = this.clientrequestid; + data['projectid'] = this.projectid; + data['serviceid'] = this.serviceid; + data['patientid'] = this.patientid; + data['Amount'] = this.amount; + data['apple_data'] = this.appleData; + data['apple_signature'] = this.appleSignature; + if (this.appleHeader != null) { + data['apple_header'] = this.appleHeader.toJson(); + } + if (this.applePaymentMethod != null) { + data['apple_paymentMethod'] = this.applePaymentMethod.toJson(); + } + return data; + } +} + +class AppleHeader { + String appleApplicationData; + String appleEphemeralPublicKey; + String applePublicKeyHash; + String appleTransactionId; + + AppleHeader({this.appleApplicationData, this.appleEphemeralPublicKey, this.applePublicKeyHash, this.appleTransactionId}); + + AppleHeader.fromJson(Map json) { + appleApplicationData = json['apple_applicationData']; + appleEphemeralPublicKey = json['apple_ephemeralPublicKey']; + applePublicKeyHash = json['apple_publicKeyHash']; + appleTransactionId = json['apple_transactionId']; + } + + Map toJson() { + final Map data = new Map(); + data['apple_applicationData'] = this.appleApplicationData; + data['apple_ephemeralPublicKey'] = this.appleEphemeralPublicKey; + data['apple_publicKeyHash'] = this.applePublicKeyHash; + data['apple_transactionId'] = this.appleTransactionId; + return data; + } +} + +class ApplePaymentMethod { + String appleDisplayName; + String appleNetwork; + String appleType; + + ApplePaymentMethod({this.appleDisplayName, this.appleNetwork, this.appleType}); + + ApplePaymentMethod.fromJson(Map json) { + appleDisplayName = json['apple_displayName']; + appleNetwork = json['apple_network']; + appleType = json['apple_type']; + } + + Map toJson() { + final Map data = new Map(); + data['apple_displayName'] = this.appleDisplayName; + data['apple_network'] = this.appleNetwork; + data['apple_type'] = this.appleType; + return data; + } +} diff --git a/lib/models/apple_pay_response.dart b/lib/models/apple_pay_response.dart new file mode 100644 index 00000000..f53b3d50 --- /dev/null +++ b/lib/models/apple_pay_response.dart @@ -0,0 +1,112 @@ +import 'dart:convert'; + +class ApplePayResponse { + PaymentMethod paymentMethod; + dynamic billingContact; + dynamic shippingMethod; + dynamic shippingContact; + Token token; + + ApplePayResponse( + {this.paymentMethod, + this.billingContact, + this.shippingMethod, + this.shippingContact, + this.token}); + + ApplePayResponse.fromJson(Map jsonValue) { + paymentMethod = jsonValue['paymentMethod'] != null + ? new PaymentMethod.fromJson(jsonValue['paymentMethod']) + : null; + // billingContact = json['billingContact'] != null ? json['billingContact'] : ""; + // shippingMethod = json['shippingMethod'] != null ? json['shippingMethod'] : ""; + // shippingContact = json['shippingContact'] != null ? json['shippingContact'] : ""; + token = jsonValue['token'] != null ? new Token.fromJson(json.decode(jsonValue['token'])) : null; + } + + Map toJson() { + final Map data = new Map(); + if (this.paymentMethod != null) { + data['paymentMethod'] = this.paymentMethod.toJson(); + } + data['billingContact'] = this.billingContact; + data['shippingMethod'] = this.shippingMethod; + data['shippingContact'] = this.shippingContact; + if (this.token != null) { + data['token'] = this.token.toJson(); + } + return data; + } +} + +class PaymentMethod { + dynamic network; + dynamic displayName; + dynamic type; + + PaymentMethod({this.network, this.displayName, this.type}); + + PaymentMethod.fromJson(Map json) { + network = json['network']; + displayName = json['displayName']; + type = json['type']; + } + + Map toJson() { + final Map data = new Map(); + data['network'] = this.network; + data['displayName'] = this.displayName; + data['type'] = this.type; + return data; + } +} + +class Token { + String version; + String data; + String signature; + Header header; + + Token({this.version, this.data, this.signature, this.header}); + + Token.fromJson(Map json) { + version = json['version']; + data = json['data']; + signature = json['signature']; + header = + json['header'] != null ? new Header.fromJson(json['header']) : null; + } + + Map toJson() { + final Map data = new Map(); + data['version'] = this.version; + data['data'] = this.data; + data['signature'] = this.signature; + if (this.header != null) { + data['header'] = this.header.toJson(); + } + return data; + } +} + +class Header { + String ephemeralPublicKey; + String publicKeyHash; + String transactionId; + + Header({this.ephemeralPublicKey, this.publicKeyHash, this.transactionId}); + + Header.fromJson(Map json) { + ephemeralPublicKey = json['ephemeralPublicKey']; + publicKeyHash = json['publicKeyHash']; + transactionId = json['transactionId']; + } + + Map toJson() { + final Map data = new Map(); + data['ephemeralPublicKey'] = this.ephemeralPublicKey; + data['publicKeyHash'] = this.publicKeyHash; + data['transactionId'] = this.transactionId; + return data; + } +} diff --git a/lib/pages/AlHabibMedicalService/all_habib_medical_service_page2.dart b/lib/pages/AlHabibMedicalService/all_habib_medical_service_page2.dart index 37bc5fe6..b6608d1c 100644 --- a/lib/pages/AlHabibMedicalService/all_habib_medical_service_page2.dart +++ b/lib/pages/AlHabibMedicalService/all_habib_medical_service_page2.dart @@ -50,7 +50,7 @@ class _AllHabibMedicalSevicePage2State extends State hmgServices.clear(); hmgServices.add(new HmgServices(0, TranslationBase.of(context).liveCareTitle, TranslationBase.of(context).liveCareSubtitle, "assets/images/new/Live_Care.svg", isLogin)); - hmgServices.add(new HmgServices(1, TranslationBase.of(context).covidTest, TranslationBase.of(context).driveThru, "assets/images/new/covid_test_drive_thru.svg", isLogin)); + hmgServices.add(new HmgServices(1, TranslationBase.of(context).covidTest, TranslationBase.of(context).driveThru, "assets/images/new/CoronaIcon.svg", isLogin)); hmgServices.add(new HmgServices(2, TranslationBase.of(context).onlinePayment, TranslationBase.of(context).onlinePaymentSubtitle, "assets/images/new/paymentMethods.png", isLogin)); hmgServices.add(new HmgServices(3, TranslationBase.of(context).hhcHome, TranslationBase.of(context).healthCare, "assets/images/new/HHC.svg", isLogin)); hmgServices.add(new HmgServices(4, TranslationBase.of(context).cmcTitle, TranslationBase.of(context).cmcSubtitle, "assets/images/new/comprehensive_checkup.svg", isLogin)); diff --git a/lib/pages/AlHabibMedicalService/ancillary-orders/ancillaryOrdersDetails.dart b/lib/pages/AlHabibMedicalService/ancillary-orders/ancillaryOrdersDetails.dart index 17ac18da..f2bc4091 100644 --- a/lib/pages/AlHabibMedicalService/ancillary-orders/ancillaryOrdersDetails.dart +++ b/lib/pages/AlHabibMedicalService/ancillary-orders/ancillaryOrdersDetails.dart @@ -367,10 +367,10 @@ class _AnicllaryOrdersState extends State with SingleTic addSelectedProcedure(value[i]); }); }), - Utils.tableColumnValue('${value[i].procedureName}', isLast: true, isCapitable: false), - Utils.tableColumnValue('${value[i].patientShare.toString() + " " + TranslationBase.of(context).sar.toUpperCase()}', isLast: true, isCapitable: false), - Utils.tableColumnValue('${value[i].patientTaxAmount.toString() + " " + TranslationBase.of(context).sar.toUpperCase()}', isLast: true, isCapitable: false), - Utils.tableColumnValue('${value[i].patientShareWithTax.toString() + " " + TranslationBase.of(context).sar.toUpperCase()}', isLast: true, isCapitable: false), + Utils.tableColumnValue('${value[i].procedureName}', isLast: true, isCapitable: false, mProjectViewModel: projectViewModel), + Utils.tableColumnValue('${value[i].patientShare.toString() + " " + TranslationBase.of(context).sar.toUpperCase()}', isLast: true, isCapitable: false, mProjectViewModel: projectViewModel), + Utils.tableColumnValue('${value[i].patientTaxAmount.toString() + " " + TranslationBase.of(context).sar.toUpperCase()}', isLast: true, isCapitable: false, mProjectViewModel: projectViewModel), + Utils.tableColumnValue('${value[i].patientShareWithTax.toString() + " " + TranslationBase.of(context).sar.toUpperCase()}', isLast: true, isCapitable: false, mProjectViewModel: projectViewModel), ]), ); } diff --git a/lib/pages/BookAppointment/BookConfirm.dart b/lib/pages/BookAppointment/BookConfirm.dart index 59b8eeda..105bb4db 100644 --- a/lib/pages/BookAppointment/BookConfirm.dart +++ b/lib/pages/BookAppointment/BookConfirm.dart @@ -200,7 +200,8 @@ class _BookConfirmState extends State { disabledTextColor: Colors.white, disabledColor: new Color(0xFFbcc2c4), onPressed: () async { - if (await this.sharedPref.getBool(IS_LIVECARE_APPOINTMENT) != null && !await this.sharedPref.getBool(IS_LIVECARE_APPOINTMENT)) { + bool isLiveCareSchedule = await this.sharedPref.getBool(IS_LIVECARE_APPOINTMENT); + if (isLiveCareSchedule != null && isLiveCareSchedule) { insertLiveCareScheduledAppointment(context, widget.doctor); } else { insertAppointment(context, widget.doctor); diff --git a/lib/pages/BookAppointment/DoctorProfile.dart b/lib/pages/BookAppointment/DoctorProfile.dart index 0357acb6..87941ed5 100644 --- a/lib/pages/BookAppointment/DoctorProfile.dart +++ b/lib/pages/BookAppointment/DoctorProfile.dart @@ -148,12 +148,13 @@ class _DoctorProfileState extends State with TickerProviderStateM onTap: (index) { setState(() { if (index == 1) { - // if (widget.doctor.clinicID == 17 || widget.doctor.clinicID == 23 || widget.doctor.clinicID == 47 || widget.isLiveCareAppointment) { - // _tabController.index = _tabController.previousIndex; + if (widget.doctor.clinicID == 17 || widget.doctor.clinicID == 23 || widget.doctor.clinicID == 47 || widget.isLiveCareAppointment) { + _tabController.index = _tabController.previousIndex; showFooterButton = false; } else { showFooterButton = true; } + } print(showFooterButton); }); }, diff --git a/lib/pages/ToDoList/payment_method_select.dart b/lib/pages/ToDoList/payment_method_select.dart index ea583477..b0f65e13 100644 --- a/lib/pages/ToDoList/payment_method_select.dart +++ b/lib/pages/ToDoList/payment_method_select.dart @@ -6,6 +6,7 @@ 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; @@ -300,35 +301,58 @@ class _PaymentMethodState extends State { bottomSheet: Container( padding: EdgeInsets.all(16), color: Colors.white, - child: 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), - ), - 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); - Navigator.pop(context, selectedPaymentMethod); - }, - child: Text(TranslationBase.of(context).confirm.toUpperCase(), - style: TextStyle( - fontSize: 14.0, - fontWeight: FontWeight.w600, - )), - ), - ), - ), + child: + // selectedPaymentMethod == "ApplePay" + // ? ApplePayButton( + // paymentConfigurationAsset: 'applepay.json', + // paymentItems: _paymentItems, + // style: ApplePayButtonStyle.black, + // type: ApplePayButtonType.inStore, + // width: MediaQuery.of(context).size.width, + // height: 50, + // margin: const EdgeInsets.only(top: 15.0), + // onPaymentResult: (value) { + // print(value); + // // applePayResponse = ApplePayResponse.fromJson(value); + // // print(applePayResponse.token.data); + // }, + // onError: (error) { + // print(error); + // }, + // loadingIndicator: const Center( + // child: CircularProgressIndicator(), + // ), + // ) + // : + 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), + ), + 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); + Navigator.pop(context, selectedPaymentMethod); + }, + child: Text(TranslationBase.of(context).confirm.toUpperCase(), + style: TextStyle( + fontSize: 14.0, + fontWeight: FontWeight.w600, + )), + ), + ), + ), ), ); } diff --git a/lib/pages/landing/fragments/home_page_fragment2.dart b/lib/pages/landing/fragments/home_page_fragment2.dart index 07728d91..87722fac 100644 --- a/lib/pages/landing/fragments/home_page_fragment2.dart +++ b/lib/pages/landing/fragments/home_page_fragment2.dart @@ -1,3 +1,4 @@ +import 'dart:convert'; import 'dart:math' as math; import 'package:auto_size_text/auto_size_text.dart'; @@ -7,6 +8,7 @@ import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; import 'package:diplomaticquarterapp/models/Appointments/AppoimentAllHistoryResultList.dart'; import 'package:diplomaticquarterapp/models/Appointments/toDoCountProviderModel.dart'; import 'package:diplomaticquarterapp/models/Authentication/authenticated_user.dart'; +import 'package:diplomaticquarterapp/models/apple_pay_response.dart'; import 'package:diplomaticquarterapp/models/gradient_color.dart'; import 'package:diplomaticquarterapp/models/hmg_services.dart'; import 'package:diplomaticquarterapp/models/slider_data.dart'; @@ -23,7 +25,9 @@ import 'package:diplomaticquarterapp/uitl/utils_new.dart'; import 'package:diplomaticquarterapp/widgets/transitions/fade_page.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; +import 'package:font_awesome_flutter/font_awesome_flutter.dart'; import 'package:provider/provider.dart'; +import 'package:pay/pay.dart'; class HomePageFragment2 extends StatefulWidget { DashboardViewModel model; @@ -39,6 +43,7 @@ class _HomePageFragment2State extends State { ProjectViewModel projectViewModel; List hmgServices = []; List appoList = []; + ApplePayResponse applePayResponse; @override void initState() { @@ -561,6 +566,10 @@ class _HomePageFragment2State extends State { ); } + callPayfortApplePayAPI(ApplePayResponse applePayResponse) { + + } + Widget showFloating(String icon) { return Container( width: MediaQuery.of(context).size.width * 0.06, diff --git a/lib/pages/medical/balance/confirm_payment_page.dart b/lib/pages/medical/balance/confirm_payment_page.dart index d838d6eb..57548633 100644 --- a/lib/pages/medical/balance/confirm_payment_page.dart +++ b/lib/pages/medical/balance/confirm_payment_page.dart @@ -15,13 +15,12 @@ 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/buttons/secondary_button.dart'; import 'package:diplomaticquarterapp/widgets/in_app_browser/InAppBrowser.dart'; 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 'new_text_Field.dart'; @@ -31,11 +30,7 @@ class ConfirmPaymentPage extends StatefulWidget { final String selectedPaymentMethod; AuthenticatedUser authenticatedUser; - ConfirmPaymentPage( - {this.advanceModel, - this.patientInfoAndMobileNumber, - this.selectedPaymentMethod, - this.authenticatedUser}); + ConfirmPaymentPage({this.advanceModel, this.patientInfoAndMobileNumber, this.selectedPaymentMethod, this.authenticatedUser}); @override _ConfirmPaymentPageState createState() => _ConfirmPaymentPageState(); @@ -48,19 +43,50 @@ class _ConfirmPaymentPageState extends State { String transID = ""; + Pay _payClient = Pay.withAssets([ + 'applepay.json', + ]); + + var _paymentItems = [ + PaymentItem( + label: 'Total', + amount: '99.99', + status: PaymentItemStatus.final_price, + ) + ]; + void submit(MyBalanceViewModel model, code) { final activationCode = code; GifLoaderDialogUtils.showMyDialog(AppGlobal.context); - model - .checkActivationCodeForAdvancePayment(activationCode: activationCode) - .then((value) { + model.checkActivationCodeForAdvancePayment(activationCode: activationCode).then((value) { GifLoaderDialogUtils.hideDialog(AppGlobal.context); Navigator.pop(context, true); - AppoitmentAllHistoryResultList appo = - new AppoitmentAllHistoryResultList(); + AppoitmentAllHistoryResultList appo = new AppoitmentAllHistoryResultList(); appo.projectID = widget.patientInfoAndMobileNumber.projectID; - openPayment(widget.selectedPaymentMethod, widget.authenticatedUser, - double.parse(widget.advanceModel.amount), null); + if (widget.selectedPaymentMethod == "ApplePay") { + + // _payClient.userCanPay(PayProvider.apple_pay).then((value) { + // print(value); + // }); + + // return FutureBuilder( + // builder: (context, snapshot) { + // if (snapshot.connectionState == ConnectionState.done) { + // if (snapshot.data == true) { + // return RawGooglePayButton( + // style: GooglePayButtonStyle.black, + // type: GooglePayButtonType.pay, + // onPressed: onGooglePayPressed); + // } else { + // // userCanPay returned false + // // Consider showing an alternative payment method + // } + // } + // }, + // ); + } else { + openPayment(widget.selectedPaymentMethod, widget.authenticatedUser, double.parse(widget.advanceModel.amount), null); + } }); } @@ -113,12 +139,10 @@ class _ConfirmPaymentPageState extends State { height: 100.0, padding: EdgeInsets.all(7.0), width: MediaQuery.of(context).size.width * 0.30, - child: Image.asset( - getImagePath(widget.selectedPaymentMethod)), + child: Image.asset(getImagePath(widget.selectedPaymentMethod)), ), Text( - '${widget.advanceModel.amount} ' + - TranslationBase.of(context).sar, + '${widget.advanceModel.amount} ' + TranslationBase.of(context).sar, style: TextStyle( fontSize: 20, fontWeight: FontWeight.w900, @@ -147,8 +171,7 @@ class _ConfirmPaymentPageState extends State { margin: EdgeInsets.all(3), child: NewTextFields( hintText: TranslationBase.of(context).name, - initialValue: - widget.patientInfoAndMobileNumber.firstName, + initialValue: widget.patientInfoAndMobileNumber.firstName, isEnabled: false, ), ), @@ -168,11 +191,7 @@ class _ConfirmPaymentPageState extends State { ), NewTextFields( hintText: TranslationBase.of(context).depositorName, - initialValue: model.user.firstName + - " " + - model.user.middleName + - " " + - model.user.lastName, + initialValue: model.user.firstName + " " + model.user.middleName + " " + model.user.lastName, isEnabled: false, ), SizedBox( @@ -196,16 +215,19 @@ class _ConfirmPaymentPageState extends State { child: DefaultButton( TranslationBase.of(context).confirm.toUpperCase(), () { - 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); + _payClient.userCanPay(PayProvider.apple_pay).then((value) async { + print(value); + final result = await _payClient.showPaymentSelector( + provider: PayProvider.apple_pay, + paymentItems: _paymentItems, + ); + print(result); }); + // 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); + // }); }, ), ), @@ -239,32 +261,13 @@ class _ConfirmPaymentPageState extends State { return 'assets/images/new-design/mada.png'; } - openPayment(String paymentMethod, AuthenticatedUser authenticatedUser, - double amount, AppoitmentAllHistoryResultList appo) { - browser = new MyInAppBrowser( - onExitCallback: onBrowserExit, - appo: appo, - onLoadStartCallback: onBrowserLoadStart); + openPayment(String paymentMethod, AuthenticatedUser authenticatedUser, double amount, AppoitmentAllHistoryResultList appo) { + browser = new MyInAppBrowser(onExitCallback: onBrowserExit, appo: appo, onLoadStartCallback: onBrowserLoadStart); - transID = Utils.getAdvancePaymentTransID( - widget.advanceModel.hospitalsModel.iD, - int.parse(widget.advanceModel.fileNumber)); + 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", - ""); + 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", ""); } onBrowserLoadStart(String url) { @@ -314,22 +317,10 @@ class _ConfirmPaymentPageState extends State { createAdvancePayment(res, AppoitmentAllHistoryResultList appo) { DoctorsListService service = new DoctorsListService(); String paymentReference = res['Fort_id'].toString(); - service.HIS_createAdvancePayment( - appo, - widget.advanceModel.hospitalsModel.iD.toString(), - res['Amount'], - res['Fort_id'], - res['PaymentMethod'], - widget.patientInfoAndMobileNumber.patientType, - widget.advanceModel.patientName, - widget.advanceModel.fileNumber, - AppGlobal.context) + service.HIS_createAdvancePayment(appo, widget.advanceModel.hospitalsModel.iD.toString(), res['Amount'], res['Fort_id'], res['PaymentMethod'], widget.patientInfoAndMobileNumber.patientType, + widget.advanceModel.patientName, widget.advanceModel.fileNumber, AppGlobal.context) .then((res) { - addAdvancedNumberRequest( - res['OnlineCheckInAppointments'][0]['AdvanceNumber'].toString(), - paymentReference, - 0, - appo); + addAdvancedNumberRequest(res['OnlineCheckInAppointments'][0]['AdvanceNumber'].toString(), paymentReference, 0, appo); }).catchError((err) { GifLoaderDialogUtils.hideDialog(AppGlobal.context); AppToast.showErrorToast(message: err); @@ -337,13 +328,9 @@ class _ConfirmPaymentPageState extends State { }); } - addAdvancedNumberRequest(String advanceNumber, String paymentReference, - dynamic appointmentID, AppoitmentAllHistoryResultList appo) { + addAdvancedNumberRequest(String advanceNumber, String paymentReference, dynamic appointmentID, AppoitmentAllHistoryResultList appo) { DoctorsListService service = new DoctorsListService(); - service - .addAdvancedNumberRequest( - advanceNumber, paymentReference, appointmentID, AppGlobal.context) - .then((res) { + service.addAdvancedNumberRequest(advanceNumber, paymentReference, appointmentID, AppGlobal.context).then((res) { print(res); GifLoaderDialogUtils.hideDialog(AppGlobal.context); navigateToHome(AppGlobal.context); diff --git a/lib/pages/webRTC/signaling.dart b/lib/pages/webRTC/signaling.dart index 1e50c534..44de7488 100644 --- a/lib/pages/webRTC/signaling.dart +++ b/lib/pages/webRTC/signaling.dart @@ -1,50 +1,50 @@ import 'dart:convert'; -// import 'package:cloud_firestore/cloud_firestore.dart'; -import 'package:diplomaticquarterapp/pages/webRTC/fcm/FCMSendNotification.dart'; import 'package:diplomaticquarterapp/uitl/SignalRUtil.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter_webrtc/flutter_webrtc.dart'; -import 'call_page.dart'; - typedef void StreamStateCallback(MediaStream stream); typedef void RTCIceGatheringStateCallback(RTCIceGatheringState state); typedef void RTCPeerConnectionStateCallback(RTCPeerConnectionState state); typedef void RTCSignalingStateCallback(RTCSignalingState state); class Signaling { - - dispose(){ - if(peerConnection != null) - peerConnection.dispose(); + dispose() { + if (peerConnection != null) peerConnection.dispose(); signalR.closeConnection(); } - init(){ + init() { // Create Peer Connection - createPeerConnection(configuration).then((value){ + createPeerConnection(configuration).then((value) { peerConnection = value; registerPeerConnectionListeners(); }); } - - initializeSignalR(String userName) async{ - if(signalR != null) - await signalR.closeConnection(); + initializeSignalR(String userName) async { + if (signalR != null) await signalR.closeConnection(); // https://vcallapi.hmg.com/webRTCHub?source=web&username=zohaib signalR = SignalRUtil(hubName: "https://vcallapi.hmg.com/webRTCHub?source=mobile&username=$userName"); final connected = await signalR.openConnection(); - if(!connected) - throw 'Failed to connect SignalR'; + if (!connected) throw 'Failed to connect SignalR'; } Map configuration = { + // 'iceServers': [ + // { + // 'urls': ['stun:stun1.l.google.com:19302', 'stun:stun2.l.google.com:19302'] + // } + // ] + 'iceServers': [ - { - 'urls': ['stun:stun1.l.google.com:19302', 'stun:stun2.l.google.com:19302'] - } + // { + // 'urls': ['stun:stun1.l.google.com:19302', 'stun:stun2.l.google.com:19302'] + // } + + {'url': "stun:ec2-15-185-116-59.me-south-1.compute.amazonaws.com:3478"}, + {'url': "turn:ec2-15-185-116-59.me-south-1.compute.amazonaws.com:3479", 'credential': "admin", 'username': "admin"} ] }; @@ -65,8 +65,7 @@ class Signaling { // return isCallPlaced; // } - - Future acceptCall(String caller, String receiver, {@required MediaStream localMediaStream, @required Function(MediaStream) onRemoteMediaStream}) async{ + Future acceptCall(String caller, String receiver, {@required MediaStream localMediaStream, @required Function(MediaStream) onRemoteMediaStream}) async { await initializeSignalR(receiver); signalR.setContributors(caller: caller, receiver: receiver); await signalR.acceptCall(receiver, caller).catchError((e) => throw 'Failed to inform signalR that i accepted a call'); @@ -81,35 +80,28 @@ class Signaling { return true; } - Future hangupCall(String caller, String receiver) async{ + Future hangupCall(String caller, String receiver) async { await signalR.hangupCall(caller, receiver); dispose(); } - answerOffer(String sdp) async{ + answerOffer(String sdp) async { final offer = jsonDecode(sdp); final caller = offer['caller']; final receiver = offer['target']; final offerSdp = offer['sdp']; - peerConnection.setRemoteDescription(rtcSessionDescriptionFrom(offerSdp)) - .then((value) { + peerConnection.setRemoteDescription(rtcSessionDescriptionFrom(offerSdp)).then((value) { return peerConnection.createAnswer(); - }) - .then((anwser) { + }).then((anwser) { return peerConnection.setLocalDescription(anwser); - }) - .then((value) { + }).then((value) { return peerConnection.getLocalDescription(); - }) - .then((answer) { + }).then((answer) { return signalR.answerOffer(answer, caller, receiver); }); - } - Future hangUp(RTCVideoRenderer localVideo) async { - - } + Future hangUp(RTCVideoRenderer localVideo) async {} Future createSdpAnswer(String toOfferSdp) async { final offerSdp = rtcSessionDescriptionFrom(jsonDecode(toOfferSdp)); @@ -128,12 +120,12 @@ class Signaling { return offerSdp; } - addCandidate(String candidateJson){ + addCandidate(String candidateJson) { peerConnection.addCandidate(rtcIceCandidateFrom(candidateJson)); } void registerPeerConnectionListeners() { - peerConnection.onIceCandidate = (RTCIceCandidate candidate){ + peerConnection.onIceCandidate = (RTCIceCandidate candidate) { // print(json.encode(candidate.toMap())); signalR.addIceCandidate(json.encode(candidate.toMap())); }; @@ -152,14 +144,14 @@ class Signaling { } } - -rtcSessionDescriptionFrom(Map sdp){ +rtcSessionDescriptionFrom(Map sdp) { return RTCSessionDescription( - sdp['sdp'],sdp['type'], + sdp['sdp'], + sdp['type'], ); } -rtcIceCandidateFrom(String json){ +rtcIceCandidateFrom(String json) { final map = jsonDecode(json)['candidate']; return RTCIceCandidate(map['candidate'], map['sdpMid'], map['sdpMLineIndex']); } diff --git a/lib/services/appointment_services/GetDoctorsList.dart b/lib/services/appointment_services/GetDoctorsList.dart index 6e819f60..139d847c 100644 --- a/lib/services/appointment_services/GetDoctorsList.dart +++ b/lib/services/appointment_services/GetDoctorsList.dart @@ -9,10 +9,12 @@ import 'package:diplomaticquarterapp/models/Appointments/PatientShareResposne.da import 'package:diplomaticquarterapp/models/Appointments/doctor_pre_post_image.dart'; import 'package:diplomaticquarterapp/models/Authentication/authenticated_user.dart'; import 'package:diplomaticquarterapp/models/Request.dart'; +import 'package:diplomaticquarterapp/models/apple_pay_request.dart'; import 'package:diplomaticquarterapp/services/authentication/auth_provider.dart'; import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart'; import 'package:diplomaticquarterapp/uitl/date_uitl.dart'; import 'package:diplomaticquarterapp/uitl/utils.dart'; +import 'package:diplomaticquarterapp/widgets/in_app_browser/InAppBrowser.dart'; import 'package:flutter/cupertino.dart'; class DoctorsListService extends BaseService { @@ -391,6 +393,7 @@ class DoctorsListService extends BaseService { "StrAppointmentDate": selectedDate, "IsVirtual": false, "DeviceType": Platform.isIOS ? 'iOS' : 'Android', + "DeviceToken": await sharedPref.getString(PUSH_TOKEN), "BookedBy": 102, "VisitType": 1, "VisitFor": 1, @@ -1343,6 +1346,47 @@ class DoctorsListService extends BaseService { return Future.value(localRes); } + Future callPayfortApplePayAPI(ApplePayRequest applePayRequest, BuildContext context) async { + Map request; + + request = { + "currency": applePayRequest.currency, + "language": applePayRequest.language, + "customername": applePayRequest.customername, + "customer_email": applePayRequest.customerEmail, + "orderdescription": applePayRequest.orderdescription, + "live_serviceid": applePayRequest.liveServiceid, + "longitude": applePayRequest.longitude, + "latitude": applePayRequest.latitude, + "devicetoken": applePayRequest.devicetoken, + "clientrequestid": applePayRequest.clientrequestid, + "projectid": applePayRequest.projectid, + "serviceid": applePayRequest.serviceid, + "patientid": applePayRequest.patientid, + "Amount": applePayRequest.amount, + "apple_data": applePayRequest.appleData, + "apple_signature": applePayRequest.appleSignature, + "apple_header": { + "apple_applicationData": "76a9a9cb2d9811e8de56d8e7713601bfa6acda3d488b1cf03b9b115bc3ff12b4", + "apple_ephemeralPublicKey": applePayRequest.appleHeader.appleEphemeralPublicKey, + "apple_publicKeyHash": applePayRequest.appleHeader.applePublicKeyHash, + "apple_transactionId": applePayRequest.appleHeader.appleTransactionId + }, + "apple_paymentMethod": { + "apple_displayName": applePayRequest.applePaymentMethod.appleDisplayName, + "apple_network": applePayRequest.applePaymentMethod.appleNetwork, + "apple_type": applePayRequest.applePaymentMethod.appleType + } + }; + dynamic localRes; + await baseAppClient.post(MyInAppBrowser.APPLE_PAY_PAYFORT_URL, onSuccess: (response, statusCode) async { + localRes = response; + }, onFailure: (String error, int statusCode) { + throw error; + }, body: request, isExternal: true); + return Future.value(localRes); + } + Future getLaserBodyPartsList(int laserCategoryID) async { Map request; diff --git a/lib/services/livecare_services/livecare_provider.dart b/lib/services/livecare_services/livecare_provider.dart index 6553da40..552b7d16 100644 --- a/lib/services/livecare_services/livecare_provider.dart +++ b/lib/services/livecare_services/livecare_provider.dart @@ -209,8 +209,9 @@ class LiveCareService extends BaseService { "ClientRequestID": clientRequestID, "DeviceToken": deviceToken, "VoipToken": "", - "Latitude": "24.708488", - "Longitude": "46.665925", + "IsFlutter": true, + "Latitude": await this.sharedPref.getDouble(USER_LAT), + "Longitude": await this.sharedPref.getDouble(USER_LONG), "DeviceType": Platform.isIOS ? 'iOS' : 'Android', "Age": authUser.age != null ? authUser.age : 0, "PatientID": authUser.patientID != null ? authUser.patientID : 0, diff --git a/lib/uitl/app_shared_preferences.dart b/lib/uitl/app_shared_preferences.dart index 7142761a..ed8321eb 100644 --- a/lib/uitl/app_shared_preferences.dart +++ b/lib/uitl/app_shared_preferences.dart @@ -121,6 +121,8 @@ class AppSharedPreferences { /// remove value based on [key] the key was saved remove(String key) async { final SharedPreferences prefs = await _prefs; - prefs.remove(key); + prefs.remove(key).then((value) { + print(value); + }); } } diff --git a/lib/widgets/in_app_browser/InAppBrowser.dart b/lib/widgets/in_app_browser/InAppBrowser.dart index d7bc9623..960b6224 100644 --- a/lib/widgets/in_app_browser/InAppBrowser.dart +++ b/lib/widgets/in_app_browser/InAppBrowser.dart @@ -28,13 +28,16 @@ var _InAppBrowserOptions = InAppBrowserClassOptions( class MyInAppBrowser extends InAppBrowser { _PAYMENT_TYPE paymentType; - // static String SERVICE_URL = 'https://hmgwebservices.com/PayFortWeb/pages/SendPayFortRequest.aspx'; // 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/PayFortWebLive/pages/SendPayFortRequest.aspx'; //Payfort Payment Gateway URL LIVE + static String SERVICE_URL = 'https://hmgwebservices.com/PayFortWeb/pages/SendPayFortRequest.aspx'; // Payfort Payment Gateway URL UAT - // static String PREAUTH_SERVICE_URL = 'https://hmgwebservices.com/PayFortWeb/pages/SendPayFortRequest.aspx'; // Payfort PreAuth Payment Gateway URL UAT + // static String SERVICE_URL = 'https://hmgwebservices.com/PayFortWebLive/pages/SendPayFortRequest.aspx'; //Payfort Payment Gateway URL LIVE - static String PREAUTH_SERVICE_URL = 'https://hmgwebservices.com/PayFortWebLive/pages/SendPayFortRequest.aspx'; //Payfort PreAuth Payment Gateway URL Live Store + static String PREAUTH_SERVICE_URL = 'https://hmgwebservices.com/PayFortWeb/pages/SendPayFortRequest.aspx'; // Payfort PreAuth Payment Gateway URL UAT + + // static String PREAUTH_SERVICE_URL = 'https://hmgwebservices.com/PayFortWebLive/pages/SendPayFortRequest.aspx'; //Payfort PreAuth Payment Gateway URL Live Store // static String PRESCRIPTION_PAYMENT_WITH_ORDERID = // 'https://uat.hmgwebservices.com/epharmacy/checkout/OpcCompleteRedirectionPaymentClientbyOrder?orderID='; diff --git a/pubspec.yaml b/pubspec.yaml index 7205970d..ab0a256d 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -42,7 +42,10 @@ dependencies: permission_handler: ^8.3.0 # Flutter Html View - flutter_html: ^2.1.5 + flutter_html: ^2.2.1 + + #Apple Pay + pay: ^1.0.7 # Pagnation pull_to_refresh: ^2.0.0 @@ -107,7 +110,7 @@ dependencies: syncfusion_flutter_calendar: ^19.3.55 # SVG Images - flutter_svg: ^0.23.0+1 +# flutter_svg: ^0.23.0+1 #Calendar Events manage_calendar_events: ^2.0.1 @@ -200,6 +203,7 @@ dependencies: dependency_overrides: provider : ^5.0.0 permission_handler : ^6.0.1+1 + flutter_svg: ^1.0.0 dev_dependencies: @@ -211,6 +215,7 @@ flutter: uses-material-design: true # assets: assets: + - assets/ - assets/images/ - assets/images/map_markers/ - assets/images/pharmacy/ From 1cb7eb2afb56510f159d2022c82fa8df414618bb Mon Sep 17 00:00:00 2001 From: Haroon Amjad Date: Mon, 24 Jan 2022 10:47:56 +0300 Subject: [PATCH 7/7] CS branch changes --- assets/images/new/CS/Family_Files.svg | 3 +++ assets/images/new/CS/Help.svg | 3 +++ assets/images/new/CS/My_File.svg | 7 +++++ assets/images/new/CS/Todo.svg | 3 +++ assets/images/new/CS/emergency_request_CS.svg | 24 ++++++++++++++++++ assets/images/new/CS/home_health_care_CS.svg | 14 ++++++++++ assets/images/new/CS/livecare_CS.svg | 10 ++++++++ assets/images/new/CS/loader.gif | Bin 0 -> 92203 bytes assets/images/new/CS/pharmacy_CS.svg | 16 ++++++++++++ assets/images/new/CoronaIcon.svg | 1 + lib/config/config.dart | 4 +-- 11 files changed, 83 insertions(+), 2 deletions(-) create mode 100644 assets/images/new/CS/Family_Files.svg create mode 100644 assets/images/new/CS/Help.svg create mode 100644 assets/images/new/CS/My_File.svg create mode 100644 assets/images/new/CS/Todo.svg create mode 100644 assets/images/new/CS/emergency_request_CS.svg create mode 100644 assets/images/new/CS/home_health_care_CS.svg create mode 100644 assets/images/new/CS/livecare_CS.svg create mode 100644 assets/images/new/CS/loader.gif create mode 100644 assets/images/new/CS/pharmacy_CS.svg create mode 100644 assets/images/new/CoronaIcon.svg diff --git a/assets/images/new/CS/Family_Files.svg b/assets/images/new/CS/Family_Files.svg new file mode 100644 index 00000000..ce47d959 --- /dev/null +++ b/assets/images/new/CS/Family_Files.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/new/CS/Help.svg b/assets/images/new/CS/Help.svg new file mode 100644 index 00000000..31d49e71 --- /dev/null +++ b/assets/images/new/CS/Help.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/new/CS/My_File.svg b/assets/images/new/CS/My_File.svg new file mode 100644 index 00000000..fc5c0096 --- /dev/null +++ b/assets/images/new/CS/My_File.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/assets/images/new/CS/Todo.svg b/assets/images/new/CS/Todo.svg new file mode 100644 index 00000000..98232af9 --- /dev/null +++ b/assets/images/new/CS/Todo.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/new/CS/emergency_request_CS.svg b/assets/images/new/CS/emergency_request_CS.svg new file mode 100644 index 00000000..1796a80c --- /dev/null +++ b/assets/images/new/CS/emergency_request_CS.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/images/new/CS/home_health_care_CS.svg b/assets/images/new/CS/home_health_care_CS.svg new file mode 100644 index 00000000..8cf044b1 --- /dev/null +++ b/assets/images/new/CS/home_health_care_CS.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/assets/images/new/CS/livecare_CS.svg b/assets/images/new/CS/livecare_CS.svg new file mode 100644 index 00000000..8af91e8a --- /dev/null +++ b/assets/images/new/CS/livecare_CS.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/assets/images/new/CS/loader.gif b/assets/images/new/CS/loader.gif new file mode 100644 index 0000000000000000000000000000000000000000..3e343727313c29eb4279f945da7a0eb3cec10963 GIT binary patch literal 92203 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 Wat>Rt)SwmF8JNAC>kov{8UG7LOmdt6 literal 0 HcmV?d00001 diff --git a/assets/images/new/CS/pharmacy_CS.svg b/assets/images/new/CS/pharmacy_CS.svg new file mode 100644 index 00000000..a3ad2b0c --- /dev/null +++ b/assets/images/new/CS/pharmacy_CS.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/assets/images/new/CoronaIcon.svg b/assets/images/new/CoronaIcon.svg new file mode 100644 index 00000000..c02f907b --- /dev/null +++ b/assets/images/new/CoronaIcon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/config/config.dart b/lib/config/config.dart index d71b0620..bdf1dffb 100644 --- a/lib/config/config.dart +++ b/lib/config/config.dart @@ -17,8 +17,8 @@ const PACKAGES_ORDERS = '/api/orders'; const PACKAGES_ORDER_HISTORY = '/api/orders/items'; const PACKAGES_TAMARA_OPT = '/api/orders/paymentoptions/tamara'; // const BASE_URL = 'http://10.50.100.198:3334/'; - const BASE_URL = 'https://uat.hmgwebservices.com/'; -// const BASE_URL = 'https://hmgwebservices.com/'; +// const BASE_URL = 'https://uat.hmgwebservices.com/'; +const BASE_URL = 'https://hmgwebservices.com/'; // Pharmacy UAT URLs // const BASE_PHARMACY_URL = 'https://uat.hmgwebservices.com/epharmacy/api/';