diff --git a/lib/config/config.dart b/lib/config/config.dart index 60e9bbd3..5c63998d 100644 --- a/lib/config/config.dart +++ b/lib/config/config.dart @@ -4,22 +4,21 @@ import 'dart:io'; const MAX_SMALL_SCREEN = 660; - - const BASE_URL = 'https://hmgwebservices.com/Services'; const GET_PROJECT = '/Lists.svc/REST/GetProject'; //const BASE_URL = 'https://hmgwebservices.com/'; // Production Environment //const BASE_URL = 'https://uat.hmgwebservices.com/'; // UAT Environment - //URL to get clinic list const GET_CLINICS_LIST_URL = "Services/lists.svc/REST/GetClinicCentralized"; //URL to get doctors list const GET_DOCTORS_LIST_URL = "Services/Doctors.svc/REST/SearchDoctorsByTime"; +//URL to get medicine and pharmacies list const GET_PHARMCY_ITEMS = "/Lists.svc/REST/GetPharmcyItems_Region"; const GET_PHARMACY_LIST = "/Patients.svc/REST/GetPharmcyList"; + class AppGlobal { static var context; AppSharedPreferences sharedPref = AppSharedPreferences(); @@ -38,10 +37,9 @@ class AppGlobal { return request; } - } const CHANNEL = 3; const GENERAL_ID = 'Cs2020@2016\$2958'; const IP_ADDRESS = '10.20.10.20'; -const VERSION_ID = 5.5; +const VERSION_ID = 8.5; diff --git a/lib/config/localized_values.dart b/lib/config/localized_values.dart index c762812d..e317f309 100644 --- a/lib/config/localized_values.dart +++ b/lib/config/localized_values.dart @@ -19,7 +19,10 @@ const Map> localizedValues = { 'clinicName': {'en': 'Clinic Name', 'ar': 'اسم العيادة'}, 'doctorName': {'en': 'Doctor Name', 'ar': 'إسم الطبيب'}, 'nearestAppo': {'en': 'Nearest appointment', 'ar': 'أقرب موعد'}, - 'searchByDocText': {'en': 'Type the name of the doctor to help you find him', 'ar': 'اكتب اسم الطبيب لمساعدتك في العثور عليه'}, + 'searchByDocText': { + 'en': 'Type the name of the doctor to help you find him', + 'ar': 'اكتب اسم الطبيب لمساعدتك في العثور عليه' + }, 'enterDocName': {'en': 'Enter Doctor name', 'ar': 'أدخل إسم الطبيب'}, 'search': {'en': 'Search', 'ar': 'بحث'}, 'bookNow': {'en': 'BOOK NOW', 'ar': 'احجز الآن'}, @@ -29,19 +32,23 @@ const Map> localizedValues = { 'gender': {'en': 'Gender', 'ar': 'الجنس'}, 'nationality': {'en': 'nationality', 'ar': 'الجنسية'}, 'docQualifications': {'en': 'Doctor Qualifications', 'ar': 'مؤهلات الطبيب'}, - 'confirmAppoHeading': {'en': 'Kindly confirm your Appointment', 'ar': 'يرجى تأكيد موعدك'}, + 'confirmAppoHeading': { + 'en': 'Kindly confirm your Appointment', + 'ar': 'يرجى تأكيد موعدك' + }, 'patientInfo': {'en': 'Patient Information', 'ar': 'معلومات المريض'}, 'bookSuccess': {'en': 'Book Success', 'ar': 'تم حجز الموعد بنجاح'}, 'patientShare': {'en': 'Patient Share', 'ar': 'المبلغ المستحق'}, - 'patientShareWithTax': {'en': 'Patient Share with Tax', 'ar': 'المبلغ الإجمالي المستحق'}, + 'patientShareWithTax': { + 'en': 'Patient Share with Tax', + 'ar': 'المبلغ الإجمالي المستحق' + }, 'confirmAppo': {'en': 'Confirm Appointment', 'ar': 'تأكيد الموعد'}, 'confirm': {'en': 'Confirm', 'ar': 'تأكيد'}, 'appointment': {'en': 'Appointment', 'ar': 'الموعد'}, 'confirmLater': {'en': 'Confirm Later', 'ar': 'تأكيد لاحقا'}, 'todoList': {'en': 'Todo List', 'ar': 'مهامي'}, 'appoActions': {'en': 'Appointment Actions', 'ar': 'إجراءات الموعد'}, - - 'login': {'en': 'Login', 'ar': 'تسجيل الدخول'}, 'loginregister': {'en': 'Login / Register', 'ar': 'دخولتسجيل'}, 'welcome': {'en': 'Welcome', 'ar': 'أهلا بك'}, @@ -85,4 +92,11 @@ const Map> localizedValues = { 'en': 'Search Medicine Here', 'ar': 'ابحث عن الدواء هنا' }, + 'description': {'en': 'Description', 'ar': 'الوصف'}, + 'price': {'en': 'Price', 'ar': 'السعر'}, + 'youCanFindItIn': {'en': 'You can find it in', 'ar': 'يمكنكة ان تجده في'}, + 'pleaseEnterMedicineName': { + 'en': 'Please Enter Medicine Name', + 'ar': 'الرجائ ادخال اسم الدواء' + }, }; diff --git a/lib/core/model/pharmacies/pharmacies_list_model.dart b/lib/core/model/pharmacies/pharmacies_list_model.dart index 34228e11..01a43a0a 100644 --- a/lib/core/model/pharmacies/pharmacies_list_model.dart +++ b/lib/core/model/pharmacies/pharmacies_list_model.dart @@ -14,22 +14,46 @@ class PharmaciesListModel { int editedBy; int projectID; int clinicID; + double price; + String imageLocation; + String desLocation; + String itemDes; + String phoneNumber; + String longitude; + String latitude; - PharmaciesListModel({ - this.itemID, - this.patientTypeID = 1, - this.languageID = 2, - this.stamp = '2020-04-23T21:01:21.492Z', - this.iPAdress = '11.11.11.11', - this.versionID = 1.2, - this.tokenID, - this.sessionID = 'e29zoooEJ4', - this.isLoginForDoctorApp = true, - this.channel = 9, - //this.patientOutSA = true, - }); + PharmaciesListModel( + {this.itemID, + this.patientTypeID, + this.languageID, + this.stamp, + this.iPAdress, + this.versionID, + this.tokenID, + this.sessionID, + this.isLoginForDoctorApp, + this.channel, + this.editedBy, + this.doctorID, + this.patientOutSA, + this.clinicID, + this.projectID, + this.price, + this.imageLocation, + this.desLocation, + this.itemDes, + this.phoneNumber, + this.longitude, + this.latitude}); PharmaciesListModel.fromJson(Map json) { + longitude = json['Longitude']; + latitude = json['Latitude']; + phoneNumber = json['PhoneNumber']; + itemDes = json['ItemDescription']; + desLocation = json['LocationDescription']; + imageLocation = json['ProjectImageURL']; + price = json['SellingPrice']; itemID = json['ItemID']; patientTypeID = json['PatientTypeID']; languageID = json['LanguageID']; diff --git a/lib/core/model/pharmacies/pharmacies_model.dart b/lib/core/model/pharmacies/pharmacies_model.dart index 69576dd2..d1b9b967 100644 --- a/lib/core/model/pharmacies/pharmacies_model.dart +++ b/lib/core/model/pharmacies/pharmacies_model.dart @@ -20,6 +20,7 @@ class PharmaciesModel { bool isLoginForDoctorApp; String itemDes; String productImage; + int itemID; PharmaciesModel( {this.pHRItemName, @@ -42,9 +43,12 @@ class PharmaciesModel { this.stamp, this.itemDes, this.productImage, - this.isLoginForDoctorApp}); + this.isLoginForDoctorApp, + this.itemID}); PharmaciesModel.fromJson(Map json) { + itemID = json['ItemID']; + productImage = json['ProductImageBase64']; itemDes = json['ItemDescription']; pHRItemName = json['PHR_itemName']; diff --git a/lib/core/service/pharmacies_service.dart b/lib/core/service/pharmacies_service.dart index fb59dceb..b155d4d0 100644 --- a/lib/core/service/pharmacies_service.dart +++ b/lib/core/service/pharmacies_service.dart @@ -2,17 +2,23 @@ import 'package:diplomaticquarterapp/config/config.dart'; import 'package:diplomaticquarterapp/core/model/pharmacies/pharmacies_list_model.dart'; import 'package:diplomaticquarterapp/core/service/base_service.dart'; import 'package:diplomaticquarterapp/core/model/pharmacies/pharmacies_model.dart'; -import 'package:diplomaticquarterapp/core/model/pharmacies/pharmacies_list_model.dart'; class PharmacyService extends BaseService { - List _pharmaciesList = List(); + List _medicineItem = List(); + List _pharmaciesList = List(); + + List get medicineItem => _medicineItem; + List get pharmaciesList => _pharmaciesList; - List get pharmaciesList => _pharmaciesList; bool isFinished = true; bool hasError = false; String errorMsg = ''; - void clearPharmaciesLis() { + void clearMedicineList() { + _medicineItem.clear(); + } + + void clearPharmaciesList() { _pharmaciesList.clear(); } @@ -35,17 +41,33 @@ class PharmacyService extends BaseService { sessionID: "BlUSkYymTt", stamp: "2020-04-27T12:17:17.721Z", tokenID: "6EfeKCLRu0GPdFutIt3m7Q==", - versionID: 5.3); + versionID: 8.3); - Future getMedicine({String drugName}) async { + PharmaciesListModel _pharmaciesListModel = PharmaciesListModel( + patientTypeID: 1, + languageID: 2, + stamp: '2020-04-23T21:01:21.492Z', + iPAdress: '11.11.11.11', + versionID: 8.3, + sessionID: 'e29zoooEJ4', + isLoginForDoctorApp: true, + channel: 9, + editedBy: 1485, + doctorID: 1485, + patientOutSA: 0, + clinicID: 1, + projectID: 15, + ); + + Future getMedicineList({String drugName}) async { hasError = false; - _requestGetPharmaciesModel.pHRItemName = drugName ?? 'panadol'; + _requestGetPharmaciesModel.pHRItemName = drugName; try { await baseAppClient.post(GET_PHARMCY_ITEMS, onSuccess: (dynamic response, int statusCode) { - _pharmaciesList.clear(); + _medicineItem.clear(); response['ListPharmcy_Region'].forEach((item) { - _pharmaciesList.add(PharmaciesModel.fromJson(item)); + _medicineItem.add(PharmaciesModel.fromJson(item)); }); }, onFailure: (String error, int statusCode) { hasError = true; @@ -56,17 +78,22 @@ class PharmacyService extends BaseService { } } - Future getMedicineList({String name}) async { - _requestGetPharmaciesModel.pHRItemName = name ?? 'panadol'; - await baseAppClient.post(GET_PHARMACY_LIST, - onSuccess: (dynamic response, int statusCode) { - _pharmaciesList.clear(); - response['PharmList'].forEach((item) { - _pharmaciesList.add(PharmaciesModel.fromJson(item)); - }); - }, onFailure: (String error, int statusCode) { - hasError = true; - super.error = error; - }, body: _requestGetPharmaciesModel.toJson()); + Future getPharmaciesList({int itemID}) async { + _pharmaciesListModel.itemID = itemID; + try { + await baseAppClient.post(GET_PHARMACY_LIST, + onSuccess: (dynamic response, int statusCode) { + _pharmaciesList.clear(); + response['PharmList'].forEach((item) { + _pharmaciesList.add(PharmaciesListModel.fromJson(item)); + hasError = false; + }); + }, onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, body: _pharmaciesListModel.toJson()); + } catch (error) { + throw error; + } } } diff --git a/lib/core/viewModels/pharmacies_view_model.dart b/lib/core/viewModels/pharmacies_view_model.dart index da40fbe3..01ad4e72 100644 --- a/lib/core/viewModels/pharmacies_view_model.dart +++ b/lib/core/viewModels/pharmacies_view_model.dart @@ -1,3 +1,4 @@ +import 'package:diplomaticquarterapp/core/model/pharmacies/pharmacies_list_model.dart'; import '../../locator.dart'; import 'base_view_model.dart'; import 'package:diplomaticquarterapp/core/enum/viewstate.dart'; @@ -10,23 +11,26 @@ class PharmacyViewModel extends BaseViewModel { String errorMsg = ''; PharmacyService _pharmacyService = locator(); - List get pharmacy => _pharmacyService.pharmaciesList; + List get pharmacy => _pharmacyService.medicineItem; + List get pharmacyList => _pharmacyService.pharmaciesList; - Future getMedicine() async { + Future getPharmacies({int id}) async { setState(ViewState.Busy); - await _pharmacyService.getMedicine(); + + await _pharmacyService.getPharmaciesList(itemID: id); if (_pharmacyService.hasError) { error = _pharmacyService.error; setState(ViewState.Error); } else setState(ViewState.Idle); + //_pharmacyService.clearPharmaciesList(); } - Future getMedicine2({String name}) async { + Future getMedicine({String name}) async { hasError = false; - _pharmacyService.clearPharmaciesLis(); + _pharmacyService.clearMedicineList(); setState(ViewState.BusyLocal); - await _pharmacyService.getMedicine(drugName: name); + await _pharmacyService.getMedicineList(drugName: name); if (_pharmacyService.hasError) { error = _pharmacyService.error; setState(ViewState.ErrorLocal); diff --git a/lib/pages/MyAppointments/AppointmentDetails.dart b/lib/pages/MyAppointments/AppointmentDetails.dart index ffb5f6be..0fe7673c 100644 --- a/lib/pages/MyAppointments/AppointmentDetails.dart +++ b/lib/pages/MyAppointments/AppointmentDetails.dart @@ -4,14 +4,13 @@ import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:rating_bar/rating_bar.dart'; import 'Components/AppointmentActions.dart'; - class AppointmentDetails extends StatefulWidget { @override _AppointmentDetailsState createState() => _AppointmentDetailsState(); } -class _AppointmentDetailsState extends State with SingleTickerProviderStateMixin { - +class _AppointmentDetailsState extends State + with SingleTickerProviderStateMixin { TabController _tabController; bool showFooterButton = false; diff --git a/lib/pages/landing/home_page.dart b/lib/pages/landing/home_page.dart index d94251bd..6169fdf4 100644 --- a/lib/pages/landing/home_page.dart +++ b/lib/pages/landing/home_page.dart @@ -6,6 +6,7 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:diplomaticquarterapp/core/model/pharmacies/pharmacies_model.dart'; import 'package:diplomaticquarterapp/core/viewModels/pharmacies_view_model.dart'; +import 'package:diplomaticquarterapp/core/model/pharmacies/pharmacies_list_model.dart'; import '../base/base_view.dart'; @@ -18,7 +19,7 @@ class _HomePageState extends State { @override Widget build(BuildContext context) { return BaseView( - // onModelReady: (model) => model.getMedicine(), + onModelReady: (model) => model.getMedicine(), builder: (BuildContext context, PharmacyViewModel model, Widget child) => AppScaffold( baseViewModel: model, diff --git a/lib/pages/pharmacies/medicine_search_screen.dart b/lib/pages/pharmacies/medicine_search_screen.dart index 200a7838..644134b2 100644 --- a/lib/pages/pharmacies/medicine_search_screen.dart +++ b/lib/pages/pharmacies/medicine_search_screen.dart @@ -11,18 +11,11 @@ import '../base/base_view.dart'; import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; import 'package:diplomaticquarterapp/widgets/input/text_field.dart'; -import 'package:diplomaticquarterapp/widgets/buttons/BottomButton.dart'; import 'package:diplomaticquarterapp/widgets/pharmacy/drug_item.dart'; -import '../../locator.dart'; import 'package:diplomaticquarterapp/core/service/pharmacies_service.dart'; import 'package:diplomaticquarterapp/pages/pharmacies/pharmacies_list_screen.dart'; -class MedicineSearch extends StatefulWidget { - @override - _MedicineSearchState createState() => _MedicineSearchState(); -} - -class _MedicineSearchState extends State { +class MedicineSearch extends StatelessWidget { final textController = TextEditingController(); final _formKey = GlobalKey(); @override @@ -31,115 +24,121 @@ class _MedicineSearchState extends State { builder: (BuildContext context, PharmacyViewModel model, Widget child) => AppScaffold( baseViewModel: model, - appBarTitle: 'Search Medicine', - body: Column( - children: [ - Padding( - padding: EdgeInsets.only( - bottom: SizeConfig.heightMultiplier * 1, - right: SizeConfig.heightMultiplier * 2.5, - top: SizeConfig.heightMultiplier * 4, - left: SizeConfig.heightMultiplier * 2.5, - ), - child: Form( - key: _formKey, - child: TextFields( - hintText: 'Search Medicine here ', - inputAction: TextInputAction.search, - onSaved: (value) {}, - onSubmit: (value) { - searchMedicine(model); - }, - controller: textController, - validator: (value) { - if (value.isEmpty) { - return 'please enter medicine name'; - } - return null; - }, + appBarTitle: TranslationBase.of(context).searchMedicine, + body: Container( + height: SizeConfig.screenHeight, + child: Column( + children: [ + Padding( + padding: EdgeInsets.only( + bottom: SizeConfig.heightMultiplier * 1, + right: SizeConfig.heightMultiplier * 2.5, + top: SizeConfig.heightMultiplier * 4, + left: SizeConfig.heightMultiplier * 2.5, ), - ), - ), - Container( - margin: EdgeInsets.only( - bottom: SizeConfig.heightMultiplier * 0.0, - right: SizeConfig.heightMultiplier * 5, - top: SizeConfig.heightMultiplier * 1, - left: SizeConfig.heightMultiplier * 5, - ), - child: Wrap( - children: [ - Container( - child: Button( - loading: model.state == ViewState.BusyLocal, - label: 'Search', - onTap: () { - searchMedicine(model); - }), - width: 350.0, + child: Form( + key: _formKey, + child: TextFields( + hintText: + TranslationBase.of(context).searchMedicineHere, + inputAction: TextInputAction.search, + onSaved: (value) {}, + onSubmit: (value) { + searchMedicine(model, context); + }, + controller: textController, + validator: (value) { + if (value.isEmpty) { + return TranslationBase.of(context) + .pleaseEnterMedicineName; + } + return null; + }, ), - ], + ), ), - ), - Container( - margin: - EdgeInsets.only(left: SizeConfig.heightMultiplier * 2), - child: Row( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Texts( - 'You Can Find ' + - '${model.pharmacy == null ? '0' : model.pharmacy.length.toString()}' - ' Item In Search ', - ), - ], + Container( + margin: EdgeInsets.only( + bottom: SizeConfig.heightMultiplier * 0.0, + right: SizeConfig.heightMultiplier * 5, + top: SizeConfig.heightMultiplier * 1, + left: SizeConfig.heightMultiplier * 5, + ), + child: Wrap( + children: [ + Container( + child: Button( + loading: model.state == ViewState.BusyLocal, + label: TranslationBase.of(context).search, + onTap: () { + searchMedicine(model, context); + }), + width: 350.0, + ), + ], + ), ), - ), - if (model.state == ViewState.ErrorLocal) Container( - child: Texts(model.error), + margin: EdgeInsets.only( + left: SizeConfig.heightMultiplier * 2), + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Texts( + 'You Can Find ' + + '${model.pharmacy == null ? '0' : model.pharmacy.length.toString()}' + ' Item In Search ', + ), + ], + ), ), - Expanded( - child: Container( - width: SizeConfig.screenWidth * 0.85, - //child: _getHospitals(model.pharmacy), - child: ListView.builder( - scrollDirection: Axis.vertical, - shrinkWrap: true, - itemCount: model.pharmacy == null - ? 0 - : model.pharmacy.length, - itemBuilder: (BuildContext context, int index) { - return InkWell( - child: MedicineItemWidget( - label: model.pharmacy[index].itemDes, - url: model.pharmacy[index].productImage), - onTap: () { - Navigator.push( - context, - MaterialPageRoute( - builder: (context) => PharmaciesList()), - ); - }, - ); - }), + if (model.state == ViewState.ErrorLocal) + Container( + child: Texts(model.error), + ), + Expanded( + child: Container( + width: SizeConfig.screenWidth * 0.85, + //child: _getHospitals(model.pharmacy), + child: ListView.builder( + //physics: NeverScrollableScrollPhysics(), + scrollDirection: Axis.vertical, + shrinkWrap: true, + itemCount: model.pharmacy == null + ? 0 + : model.pharmacy.length, + itemBuilder: (BuildContext context, int index) { + return InkWell( + child: MedicineItemWidget( + label: model.pharmacy[index].itemDes, + url: model.pharmacy[index].productImage), + onTap: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => PharmaciesList( + medicineID: + model.pharmacy[index].itemID, + imageURL: model + .pharmacy[index].productImage, + medicineDescription: + model.pharmacy[index].itemDes), + ), + ); + }, + ); + }), + ), ), - ) - ], + ], + ), )), ); } - searchMedicine(PharmacyViewModel model) { + searchMedicine(PharmacyViewModel model, BuildContext context) { Utils.hideKeyboard(context); if (_formKey.currentState.validate()) - model.getMedicine2(name: textController.text); + model.getMedicine(name: textController.text); } - - Widget _getHospitals(List hospitals) => ListView.builder( - itemCount: hospitals.length, - itemBuilder: (BuildContext context, int index) => Container( - child: Texts(hospitals[index].itemDes), - ), - ); } diff --git a/lib/pages/pharmacies/pharmacies_list_screen.dart b/lib/pages/pharmacies/pharmacies_list_screen.dart index 8a43af56..040e5bee 100644 --- a/lib/pages/pharmacies/pharmacies_list_screen.dart +++ b/lib/pages/pharmacies/pharmacies_list_screen.dart @@ -1,99 +1,191 @@ +import 'package:diplomaticquarterapp/core/model/pharmacies/pharmacies_model.dart'; +import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; import 'package:flutter/material.dart'; import 'package:diplomaticquarterapp/config/size_config.dart'; import 'package:flutter/cupertino.dart'; +import 'package:maps_launcher/maps_launcher.dart'; import '../base/base_view.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; import 'package:diplomaticquarterapp/widgets/progress_indicator/app_circular_progress_Indeicator.dart'; import 'package:diplomaticquarterapp/widgets/others/rounded_container.dart'; import 'dart:typed_data'; import 'dart:convert'; - +import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:diplomaticquarterapp/core/viewModels/pharmacies_view_model.dart'; import 'package:map_launcher/map_launcher.dart'; +import 'package:url_launcher/url_launcher.dart'; -class PharmaciesList extends StatefulWidget { - String medicineID; - int url; - - PharmaciesList({this.url, this.medicineID}); - - @override - _PharmaciesListState createState() => _PharmaciesListState(); +class PharmaciesList extends StatelessWidget { + final int medicineID; + final String imageURL; + final String medicineDescription; -// -} + PharmaciesList({this.medicineID, this.imageURL, this.medicineDescription}); -class _PharmaciesListState extends State { @override Widget build(BuildContext context) { return BaseView( - //onModelReady: (model) => model.getMedicine(), + onModelReady: (model) => model.getPharmacies(id: medicineID), builder: (BuildContext context, PharmacyViewModel model, Widget child) => AppScaffold( - appBarTitle: 'Pharmacies List', - body: !model.isFinished - ? AppCircularProgressIndicator() - : model.hasError - ? Center( - child: Text( - model.errorMsg, - style: TextStyle(color: Colors.red), + appBarTitle: TranslationBase.of(context).pharmaciesList, + baseViewModel: model, + body: Container( + height: SizeConfig.screenHeight, + child: ListView( + shrinkWrap: true, + scrollDirection: Axis.vertical, + physics: AlwaysScrollableScrollPhysics(), + children: [ + RoundedContainer( + child: Row( + children: [ + Expanded( + flex: 1, + child: ClipRRect( + borderRadius: BorderRadius.all( + Radius.circular(7), + ), + child: Image.memory( + dataFromBase64String(imageURL), + height: SizeConfig.imageSizeMultiplier * 19, + width: SizeConfig.imageSizeMultiplier * 18, + fit: BoxFit.cover, + ), + ), + ), + Expanded( + flex: 3, + child: Padding( + padding: EdgeInsets.symmetric( + horizontal: 6.8, vertical: 3.5), + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Texts( + TranslationBase.of(context).description, + ), + Texts( + medicineDescription, + ), + Texts( + TranslationBase.of(context).price, + marginRight: 10, + marginLeft: 10, + marginBottom: 2.0, + ), + if (model.pharmacyList.length > 0) + Texts( + model.pharmacyList[0].price.toString(), + ), + ], + ), + ), + ), + ], + ), + ), + Container( + margin: EdgeInsets.only( + top: SizeConfig.widthMultiplier * 2.0, + bottom: SizeConfig.widthMultiplier * 3.0, + right: SizeConfig.widthMultiplier * 4.0, + left: SizeConfig.widthMultiplier * 2.5, + ), + child: Align( + alignment: Alignment.center, + child: Texts( + TranslationBase.of(context).youCanFindItIn, + ), + ), + alignment: Alignment.topRight, + ), + Container( + width: SizeConfig.screenWidth * 1.0, + child: ListView.builder( + shrinkWrap: true, + physics: NeverScrollableScrollPhysics(), + itemCount: model.pharmacyList == null + ? 0 + : model.pharmacyList.length, + itemBuilder: (BuildContext context, int index) { + return RoundedContainer( + child: Row( + children: [ + Expanded( + child: ClipRRect( + borderRadius: + BorderRadius.all(Radius.circular(7)), + child: Image.network( + model.pharmacyList[index].imageLocation, + height: SizeConfig.imageSizeMultiplier * 13.0, + width: SizeConfig.imageSizeMultiplier * 11.0, + fit: BoxFit.cover, + ), + ), + ), + Expanded( + flex: 4, + child: Padding( + padding: EdgeInsets.all(9.0), + child: Texts( + model.pharmacyList[index].desLocation, + ), + ), ), - ) - : Container( - height: SizeConfig.screenHeight, - child: ListView( - shrinkWrap: true, - scrollDirection: Axis.vertical, - physics: AlwaysScrollableScrollPhysics(), - children: [ - RoundedContainer( - child: Row( - children: [ - Expanded( - flex: 1, - child: ClipRRect( - borderRadius: BorderRadius.all( - Radius.circular(7), - ), - child: Image.memory( - dataFromBase64String( - widget.url.toString()), - height: - SizeConfig.imageSizeMultiplier * 19, - width: - SizeConfig.imageSizeMultiplier * 18, - fit: BoxFit.cover, - ), + Expanded( + flex: 2, + child: Wrap( + direction: Axis.horizontal, + alignment: WrapAlignment.end, + crossAxisAlignment: WrapCrossAlignment.end, + children: [ + Padding( + padding: EdgeInsets.all(6.0), + child: InkWell( + child: Icon( + Icons.phone, + color: Colors.red, ), + onTap: () => launch("tel://" + + model.pharmacyList[index].phoneNumber), ), - Expanded( - flex: 3, - child: Column( - mainAxisAlignment: - MainAxisAlignment.start, - crossAxisAlignment: - CrossAxisAlignment.stretch, - children: [], + ), + Padding( + padding: EdgeInsets.all(6.0), + child: InkWell( + child: Icon( + Icons.local_pharmacy, + color: Colors.red, ), - ) - ], - )) - ], - ), - )), + onTap: () { + MapsLauncher.launchCoordinates( + double.parse( + model.pharmacyList[index].latitude), + double.parse(model + .pharmacyList[index].longitude), + ); + }, + ), + ), + ], + ), + ) + ], + ), + ); + }, + ), + ), + ], + ), + ), + ), ); } - Image imageFromBase64String(String base64String) { - return Image.memory(base64Decode(base64String)); - } - Uint8List dataFromBase64String(String base64String) { return base64Decode(base64String); } - - String base64String(Uint8List data) { - return base64Encode(data); - } } diff --git a/lib/uitl/translations_delegate_base.dart b/lib/uitl/translations_delegate_base.dart index 26d30363..f9118197 100644 --- a/lib/uitl/translations_delegate_base.dart +++ b/lib/uitl/translations_delegate_base.dart @@ -54,9 +54,11 @@ class TranslationBase { String get nearestAppo => localizedValues['nearestAppo'][locale.languageCode]; - String get searchByDocText => localizedValues['searchByDocText'][locale.languageCode]; + String get searchByDocText => + localizedValues['searchByDocText'][locale.languageCode]; - String get enterDocName => localizedValues['enterDocName'][locale.languageCode]; + String get enterDocName => + localizedValues['enterDocName'][locale.languageCode]; String get search => localizedValues['search'][locale.languageCode]; @@ -66,29 +68,35 @@ class TranslationBase { String get appoInfo => localizedValues['appoInfo'][locale.languageCode]; - String get availableAppo => localizedValues['availableAppo'][locale.languageCode]; + String get availableAppo => + localizedValues['availableAppo'][locale.languageCode]; String get gender => localizedValues['gender'][locale.languageCode]; String get nationality => localizedValues['nationality'][locale.languageCode]; - String get docQualifications => localizedValues['docQualifications'][locale.languageCode]; + String get docQualifications => + localizedValues['docQualifications'][locale.languageCode]; - String get confirmAppoHeading => localizedValues['confirmAppoHeading'][locale.languageCode]; + String get confirmAppoHeading => + localizedValues['confirmAppoHeading'][locale.languageCode]; String get patientInfo => localizedValues['patientInfo'][locale.languageCode]; String get bookSuccess => localizedValues['bookSuccess'][locale.languageCode]; - String get patientShare => localizedValues['patientShare'][locale.languageCode]; + String get patientShare => + localizedValues['patientShare'][locale.languageCode]; - String get patientShareWithTax => localizedValues['patientShareWithTax'][locale.languageCode]; + String get patientShareWithTax => + localizedValues['patientShareWithTax'][locale.languageCode]; String get confirmAppo => localizedValues['confirmAppo'][locale.languageCode]; String get confirm => localizedValues['confirm'][locale.languageCode]; - String get confirmLater => localizedValues['confirmLater'][locale.languageCode]; + String get confirmLater => + localizedValues['confirmLater'][locale.languageCode]; String get todoList => localizedValues['todoList'][locale.languageCode]; @@ -126,6 +134,14 @@ class TranslationBase { localizedValues['searchMedicine'][locale.languageCode]; String get searchMedicineHere => localizedValues['searchMedicineHere'][locale.languageCode]; + String get pharmaciesList => + localizedValues['pharmaciesList'][locale.languageCode]; + String get description => localizedValues['description'][locale.languageCode]; + String get price => localizedValues['price'][locale.languageCode]; + String get youCanFindItIn => + localizedValues['youCanFindItIn'][locale.languageCode]; + String get pleaseEnterMedicineName => + localizedValues['pleaseEnterMedicineName'][locale.languageCode]; } class TranslationBaseDelegate extends LocalizationsDelegate { diff --git a/lib/widgets/data_display/text.dart b/lib/widgets/data_display/text.dart index 851c678d..c357b777 100644 --- a/lib/widgets/data_display/text.dart +++ b/lib/widgets/data_display/text.dart @@ -16,6 +16,11 @@ class Texts extends StatefulWidget { final bool allowExpand; final double fontSize; final String fontWeight; + final double margin; + final double marginTop; + final double marginRight; + final double marginBottom; + final double marginLeft; Texts(this.text, {Key key, @@ -32,7 +37,12 @@ class Texts extends StatefulWidget { this.readMore = false, this.style, this.fontSize, - this.fontWeight}) + this.fontWeight, + this.margin, + this.marginBottom, + this.marginLeft, + this.marginRight, + this.marginTop}) : super(key: key); @override @@ -228,7 +238,7 @@ class _TextsState extends State { Theme.of(context).backgroundColor.withOpacity(0), ], begin: Alignment.bottomCenter, end: Alignment.topCenter), ), - height: 30, + height: 30.0, ), ) ], diff --git a/lib/widgets/pharmacy/drug_item.dart b/lib/widgets/pharmacy/drug_item.dart index 608b1b98..b50f825a 100644 --- a/lib/widgets/pharmacy/drug_item.dart +++ b/lib/widgets/pharmacy/drug_item.dart @@ -29,7 +29,7 @@ class _MedicineItemWidgetState extends State { @override Widget build(BuildContext context) { return new RoundedContainer( - height: SizeConfig.heightMultiplier * 10.5, + height: SizeConfig.heightMultiplier * 12.9, child: Padding( padding: const EdgeInsets.all(2.0), child: Row( @@ -38,8 +38,8 @@ class _MedicineItemWidgetState extends State { children: [ if (widget.url != null) Container( - height: 39, - width: 39, + height: 39.0, + width: 39.0, child: ClipRRect( borderRadius: BorderRadius.all(Radius.circular(7)), child: Image.memory( @@ -51,11 +51,15 @@ class _MedicineItemWidgetState extends State { ), ), Expanded( - child: Padding( - padding: EdgeInsets.all(3), - child: Align( - alignment: Alignment.centerLeft, - child: Texts(widget.label), + child: Center( + child: Padding( + padding: EdgeInsets.all(2.5), + child: Align( + alignment: Alignment.centerLeft, + child: Texts( + widget.label, + ), + ), ), ), ) @@ -70,15 +74,7 @@ class _MedicineItemWidgetState extends State { ); } - Image imageFromBase64String(String base64String) { - return Image.memory(base64Decode(base64String)); - } - Uint8List dataFromBase64String(String base64String) { return base64Decode(base64String); } - - String base64String(Uint8List data) { - return base64Encode(data); - } } diff --git a/pubspec.yaml b/pubspec.yaml index 77e6d45b..10a7ecc6 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -86,6 +86,7 @@ dependencies: + dev_dependencies: flutter_test: sdk: flutter