Merge branch 'SearchMedicineAndReturnMedicineList' into 'master'

Design and return Pharmacy List

See merge request Cloud_Solution/diplomatic-quarter!8
merge-requests/13/merge
Mohammad Aljammal 4 years ago
commit 392a5a57ed

@ -4,22 +4,21 @@ import 'dart:io';
const MAX_SMALL_SCREEN = 660; const MAX_SMALL_SCREEN = 660;
const BASE_URL = 'https://hmgwebservices.com/Services'; const BASE_URL = 'https://hmgwebservices.com/Services';
const GET_PROJECT = '/Lists.svc/REST/GetProject'; const GET_PROJECT = '/Lists.svc/REST/GetProject';
//const BASE_URL = 'https://hmgwebservices.com/'; // Production Environment //const BASE_URL = 'https://hmgwebservices.com/'; // Production Environment
//const BASE_URL = 'https://uat.hmgwebservices.com/'; // UAT Environment //const BASE_URL = 'https://uat.hmgwebservices.com/'; // UAT Environment
//URL to get clinic list //URL to get clinic list
const GET_CLINICS_LIST_URL = "Services/lists.svc/REST/GetClinicCentralized"; const GET_CLINICS_LIST_URL = "Services/lists.svc/REST/GetClinicCentralized";
//URL to get doctors list //URL to get doctors list
const GET_DOCTORS_LIST_URL = "Services/Doctors.svc/REST/SearchDoctorsByTime"; 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_PHARMCY_ITEMS = "/Lists.svc/REST/GetPharmcyItems_Region";
const GET_PHARMACY_LIST = "/Patients.svc/REST/GetPharmcyList"; const GET_PHARMACY_LIST = "/Patients.svc/REST/GetPharmcyList";
class AppGlobal { class AppGlobal {
static var context; static var context;
AppSharedPreferences sharedPref = AppSharedPreferences(); AppSharedPreferences sharedPref = AppSharedPreferences();
@ -38,10 +37,9 @@ class AppGlobal {
return request; return request;
} }
} }
const CHANNEL = 3; const CHANNEL = 3;
const GENERAL_ID = 'Cs2020@2016\$2958'; const GENERAL_ID = 'Cs2020@2016\$2958';
const IP_ADDRESS = '10.20.10.20'; const IP_ADDRESS = '10.20.10.20';
const VERSION_ID = 5.5; const VERSION_ID = 8.5;

@ -19,7 +19,10 @@ const Map<String, Map<String, String>> localizedValues = {
'clinicName': {'en': 'Clinic Name', 'ar': 'اسم العيادة'}, 'clinicName': {'en': 'Clinic Name', 'ar': 'اسم العيادة'},
'doctorName': {'en': 'Doctor Name', 'ar': 'إسم الطبيب'}, 'doctorName': {'en': 'Doctor Name', 'ar': 'إسم الطبيب'},
'nearestAppo': {'en': 'Nearest appointment', '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': 'أدخل إسم الطبيب'}, 'enterDocName': {'en': 'Enter Doctor name', 'ar': 'أدخل إسم الطبيب'},
'search': {'en': 'Search', 'ar': 'بحث'}, 'search': {'en': 'Search', 'ar': 'بحث'},
'bookNow': {'en': 'BOOK NOW', 'ar': 'احجز الآن'}, 'bookNow': {'en': 'BOOK NOW', 'ar': 'احجز الآن'},
@ -29,19 +32,23 @@ const Map<String, Map<String, String>> localizedValues = {
'gender': {'en': 'Gender', 'ar': 'الجنس'}, 'gender': {'en': 'Gender', 'ar': 'الجنس'},
'nationality': {'en': 'nationality', 'ar': 'الجنسية'}, 'nationality': {'en': 'nationality', 'ar': 'الجنسية'},
'docQualifications': {'en': 'Doctor Qualifications', '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': 'معلومات المريض'}, 'patientInfo': {'en': 'Patient Information', 'ar': 'معلومات المريض'},
'bookSuccess': {'en': 'Book Success', 'ar': 'تم حجز الموعد بنجاح'}, 'bookSuccess': {'en': 'Book Success', 'ar': 'تم حجز الموعد بنجاح'},
'patientShare': {'en': 'Patient Share', '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': 'تأكيد الموعد'}, 'confirmAppo': {'en': 'Confirm Appointment', 'ar': 'تأكيد الموعد'},
'confirm': {'en': 'Confirm', 'ar': 'تأكيد'}, 'confirm': {'en': 'Confirm', 'ar': 'تأكيد'},
'appointment': {'en': 'Appointment', 'ar': 'الموعد'}, 'appointment': {'en': 'Appointment', 'ar': 'الموعد'},
'confirmLater': {'en': 'Confirm Later', 'ar': 'تأكيد لاحقا'}, 'confirmLater': {'en': 'Confirm Later', 'ar': 'تأكيد لاحقا'},
'todoList': {'en': 'Todo List', 'ar': 'مهامي'}, 'todoList': {'en': 'Todo List', 'ar': 'مهامي'},
'appoActions': {'en': 'Appointment Actions', 'ar': 'إجراءات الموعد'}, 'appoActions': {'en': 'Appointment Actions', 'ar': 'إجراءات الموعد'},
'login': {'en': 'Login', 'ar': 'تسجيل الدخول'}, 'login': {'en': 'Login', 'ar': 'تسجيل الدخول'},
'loginregister': {'en': 'Login / Register', 'ar': 'دخولتسجيل'}, 'loginregister': {'en': 'Login / Register', 'ar': 'دخولتسجيل'},
'welcome': {'en': 'Welcome', 'ar': 'أهلا بك'}, 'welcome': {'en': 'Welcome', 'ar': 'أهلا بك'},
@ -85,4 +92,11 @@ const Map<String, Map<String, String>> localizedValues = {
'en': 'Search Medicine Here', 'en': 'Search Medicine Here',
'ar': 'ابحث عن الدواء هنا' 'ar': 'ابحث عن الدواء هنا'
}, },
'description': {'en': 'Description', 'ar': 'الوصف'},
'price': {'en': 'Price', 'ar': 'السعر'},
'youCanFindItIn': {'en': 'You can find it in', 'ar': 'يمكنكة ان تجده في'},
'pleaseEnterMedicineName': {
'en': 'Please Enter Medicine Name',
'ar': 'الرجائ ادخال اسم الدواء'
},
}; };

@ -14,22 +14,46 @@ class PharmaciesListModel {
int editedBy; int editedBy;
int projectID; int projectID;
int clinicID; int clinicID;
double price;
String imageLocation;
String desLocation;
String itemDes;
String phoneNumber;
String longitude;
String latitude;
PharmaciesListModel({ PharmaciesListModel(
this.itemID, {this.itemID,
this.patientTypeID = 1, this.patientTypeID,
this.languageID = 2, this.languageID,
this.stamp = '2020-04-23T21:01:21.492Z', this.stamp,
this.iPAdress = '11.11.11.11', this.iPAdress,
this.versionID = 1.2, this.versionID,
this.tokenID, this.tokenID,
this.sessionID = 'e29zoooEJ4', this.sessionID,
this.isLoginForDoctorApp = true, this.isLoginForDoctorApp,
this.channel = 9, this.channel,
//this.patientOutSA = true, 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<String, dynamic> json) { PharmaciesListModel.fromJson(Map<String, dynamic> 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']; itemID = json['ItemID'];
patientTypeID = json['PatientTypeID']; patientTypeID = json['PatientTypeID'];
languageID = json['LanguageID']; languageID = json['LanguageID'];

@ -20,6 +20,7 @@ class PharmaciesModel {
bool isLoginForDoctorApp; bool isLoginForDoctorApp;
String itemDes; String itemDes;
String productImage; String productImage;
int itemID;
PharmaciesModel( PharmaciesModel(
{this.pHRItemName, {this.pHRItemName,
@ -42,9 +43,12 @@ class PharmaciesModel {
this.stamp, this.stamp,
this.itemDes, this.itemDes,
this.productImage, this.productImage,
this.isLoginForDoctorApp}); this.isLoginForDoctorApp,
this.itemID});
PharmaciesModel.fromJson(Map<String, dynamic> json) { PharmaciesModel.fromJson(Map<String, dynamic> json) {
itemID = json['ItemID'];
productImage = json['ProductImageBase64']; productImage = json['ProductImageBase64'];
itemDes = json['ItemDescription']; itemDes = json['ItemDescription'];
pHRItemName = json['PHR_itemName']; pHRItemName = json['PHR_itemName'];

@ -2,17 +2,23 @@ import 'package:diplomaticquarterapp/config/config.dart';
import 'package:diplomaticquarterapp/core/model/pharmacies/pharmacies_list_model.dart'; import 'package:diplomaticquarterapp/core/model/pharmacies/pharmacies_list_model.dart';
import 'package:diplomaticquarterapp/core/service/base_service.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_model.dart';
import 'package:diplomaticquarterapp/core/model/pharmacies/pharmacies_list_model.dart';
class PharmacyService extends BaseService { class PharmacyService extends BaseService {
List<PharmaciesModel> _pharmaciesList = List(); List<PharmaciesModel> _medicineItem = List();
List<PharmaciesListModel> _pharmaciesList = List();
List<PharmaciesModel> get medicineItem => _medicineItem;
List<PharmaciesListModel> get pharmaciesList => _pharmaciesList;
List<PharmaciesModel> get pharmaciesList => _pharmaciesList;
bool isFinished = true; bool isFinished = true;
bool hasError = false; bool hasError = false;
String errorMsg = ''; String errorMsg = '';
void clearPharmaciesLis() { void clearMedicineList() {
_medicineItem.clear();
}
void clearPharmaciesList() {
_pharmaciesList.clear(); _pharmaciesList.clear();
} }
@ -35,17 +41,33 @@ class PharmacyService extends BaseService {
sessionID: "BlUSkYymTt", sessionID: "BlUSkYymTt",
stamp: "2020-04-27T12:17:17.721Z", stamp: "2020-04-27T12:17:17.721Z",
tokenID: "6EfeKCLRu0GPdFutIt3m7Q==", 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; hasError = false;
_requestGetPharmaciesModel.pHRItemName = drugName ?? 'panadol'; _requestGetPharmaciesModel.pHRItemName = drugName;
try { try {
await baseAppClient.post(GET_PHARMCY_ITEMS, await baseAppClient.post(GET_PHARMCY_ITEMS,
onSuccess: (dynamic response, int statusCode) { onSuccess: (dynamic response, int statusCode) {
_pharmaciesList.clear(); _medicineItem.clear();
response['ListPharmcy_Region'].forEach((item) { response['ListPharmcy_Region'].forEach((item) {
_pharmaciesList.add(PharmaciesModel.fromJson(item)); _medicineItem.add(PharmaciesModel.fromJson(item));
}); });
}, onFailure: (String error, int statusCode) { }, onFailure: (String error, int statusCode) {
hasError = true; hasError = true;
@ -56,17 +78,22 @@ class PharmacyService extends BaseService {
} }
} }
Future getMedicineList({String name}) async { Future getPharmaciesList({int itemID}) async {
_requestGetPharmaciesModel.pHRItemName = name ?? 'panadol'; _pharmaciesListModel.itemID = itemID;
try {
await baseAppClient.post(GET_PHARMACY_LIST, await baseAppClient.post(GET_PHARMACY_LIST,
onSuccess: (dynamic response, int statusCode) { onSuccess: (dynamic response, int statusCode) {
_pharmaciesList.clear(); _pharmaciesList.clear();
response['PharmList'].forEach((item) { response['PharmList'].forEach((item) {
_pharmaciesList.add(PharmaciesModel.fromJson(item)); _pharmaciesList.add(PharmaciesListModel.fromJson(item));
hasError = false;
}); });
}, onFailure: (String error, int statusCode) { }, onFailure: (String error, int statusCode) {
hasError = true; hasError = true;
super.error = error; super.error = error;
}, body: _requestGetPharmaciesModel.toJson()); }, body: _pharmaciesListModel.toJson());
} catch (error) {
throw error;
}
} }
} }

@ -1,3 +1,4 @@
import 'package:diplomaticquarterapp/core/model/pharmacies/pharmacies_list_model.dart';
import '../../locator.dart'; import '../../locator.dart';
import 'base_view_model.dart'; import 'base_view_model.dart';
import 'package:diplomaticquarterapp/core/enum/viewstate.dart'; import 'package:diplomaticquarterapp/core/enum/viewstate.dart';
@ -10,23 +11,26 @@ class PharmacyViewModel extends BaseViewModel {
String errorMsg = ''; String errorMsg = '';
PharmacyService _pharmacyService = locator<PharmacyService>(); PharmacyService _pharmacyService = locator<PharmacyService>();
List<PharmaciesModel> get pharmacy => _pharmacyService.pharmaciesList; List<PharmaciesModel> get pharmacy => _pharmacyService.medicineItem;
List<PharmaciesListModel> get pharmacyList => _pharmacyService.pharmaciesList;
Future getMedicine() async { Future getPharmacies({int id}) async {
setState(ViewState.Busy); setState(ViewState.Busy);
await _pharmacyService.getMedicine();
await _pharmacyService.getPharmaciesList(itemID: id);
if (_pharmacyService.hasError) { if (_pharmacyService.hasError) {
error = _pharmacyService.error; error = _pharmacyService.error;
setState(ViewState.Error); setState(ViewState.Error);
} else } else
setState(ViewState.Idle); setState(ViewState.Idle);
//_pharmacyService.clearPharmaciesList();
} }
Future getMedicine2({String name}) async { Future getMedicine({String name}) async {
hasError = false; hasError = false;
_pharmacyService.clearPharmaciesLis(); _pharmacyService.clearMedicineList();
setState(ViewState.BusyLocal); setState(ViewState.BusyLocal);
await _pharmacyService.getMedicine(drugName: name); await _pharmacyService.getMedicineList(drugName: name);
if (_pharmacyService.hasError) { if (_pharmacyService.hasError) {
error = _pharmacyService.error; error = _pharmacyService.error;
setState(ViewState.ErrorLocal); setState(ViewState.ErrorLocal);

@ -4,14 +4,13 @@ import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart';
import 'package:rating_bar/rating_bar.dart'; import 'package:rating_bar/rating_bar.dart';
import 'Components/AppointmentActions.dart'; import 'Components/AppointmentActions.dart';
class AppointmentDetails extends StatefulWidget { class AppointmentDetails extends StatefulWidget {
@override @override
_AppointmentDetailsState createState() => _AppointmentDetailsState(); _AppointmentDetailsState createState() => _AppointmentDetailsState();
} }
class _AppointmentDetailsState extends State<AppointmentDetails> with SingleTickerProviderStateMixin { class _AppointmentDetailsState extends State<AppointmentDetails>
with SingleTickerProviderStateMixin {
TabController _tabController; TabController _tabController;
bool showFooterButton = false; bool showFooterButton = false;

@ -6,6 +6,7 @@ import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:diplomaticquarterapp/core/model/pharmacies/pharmacies_model.dart'; import 'package:diplomaticquarterapp/core/model/pharmacies/pharmacies_model.dart';
import 'package:diplomaticquarterapp/core/viewModels/pharmacies_view_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'; import '../base/base_view.dart';
@ -18,7 +19,7 @@ class _HomePageState extends State<HomePage> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return BaseView<PharmacyViewModel>( return BaseView<PharmacyViewModel>(
// onModelReady: (model) => model.getMedicine(), onModelReady: (model) => model.getMedicine(),
builder: (BuildContext context, PharmacyViewModel model, Widget child) => builder: (BuildContext context, PharmacyViewModel model, Widget child) =>
AppScaffold( AppScaffold(
baseViewModel: model, baseViewModel: model,

@ -11,18 +11,11 @@ import '../base/base_view.dart';
import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; import 'package:diplomaticquarterapp/widgets/data_display/text.dart';
import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart';
import 'package:diplomaticquarterapp/widgets/input/text_field.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 'package:diplomaticquarterapp/widgets/pharmacy/drug_item.dart';
import '../../locator.dart';
import 'package:diplomaticquarterapp/core/service/pharmacies_service.dart'; import 'package:diplomaticquarterapp/core/service/pharmacies_service.dart';
import 'package:diplomaticquarterapp/pages/pharmacies/pharmacies_list_screen.dart'; import 'package:diplomaticquarterapp/pages/pharmacies/pharmacies_list_screen.dart';
class MedicineSearch extends StatefulWidget { class MedicineSearch extends StatelessWidget {
@override
_MedicineSearchState createState() => _MedicineSearchState();
}
class _MedicineSearchState extends State<MedicineSearch> {
final textController = TextEditingController(); final textController = TextEditingController();
final _formKey = GlobalKey<FormState>(); final _formKey = GlobalKey<FormState>();
@override @override
@ -31,8 +24,10 @@ class _MedicineSearchState extends State<MedicineSearch> {
builder: (BuildContext context, PharmacyViewModel model, Widget child) => builder: (BuildContext context, PharmacyViewModel model, Widget child) =>
AppScaffold( AppScaffold(
baseViewModel: model, baseViewModel: model,
appBarTitle: 'Search Medicine', appBarTitle: TranslationBase.of(context).searchMedicine,
body: Column( body: Container(
height: SizeConfig.screenHeight,
child: Column(
children: <Widget>[ children: <Widget>[
Padding( Padding(
padding: EdgeInsets.only( padding: EdgeInsets.only(
@ -44,16 +39,18 @@ class _MedicineSearchState extends State<MedicineSearch> {
child: Form( child: Form(
key: _formKey, key: _formKey,
child: TextFields( child: TextFields(
hintText: 'Search Medicine here ', hintText:
TranslationBase.of(context).searchMedicineHere,
inputAction: TextInputAction.search, inputAction: TextInputAction.search,
onSaved: (value) {}, onSaved: (value) {},
onSubmit: (value) { onSubmit: (value) {
searchMedicine(model); searchMedicine(model, context);
}, },
controller: textController, controller: textController,
validator: (value) { validator: (value) {
if (value.isEmpty) { if (value.isEmpty) {
return 'please enter medicine name'; return TranslationBase.of(context)
.pleaseEnterMedicineName;
} }
return null; return null;
}, },
@ -72,9 +69,9 @@ class _MedicineSearchState extends State<MedicineSearch> {
Container( Container(
child: Button( child: Button(
loading: model.state == ViewState.BusyLocal, loading: model.state == ViewState.BusyLocal,
label: 'Search', label: TranslationBase.of(context).search,
onTap: () { onTap: () {
searchMedicine(model); searchMedicine(model, context);
}), }),
width: 350.0, width: 350.0,
), ),
@ -82,8 +79,8 @@ class _MedicineSearchState extends State<MedicineSearch> {
), ),
), ),
Container( Container(
margin: margin: EdgeInsets.only(
EdgeInsets.only(left: SizeConfig.heightMultiplier * 2), left: SizeConfig.heightMultiplier * 2),
child: Row( child: Row(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[ children: <Widget>[
@ -104,6 +101,7 @@ class _MedicineSearchState extends State<MedicineSearch> {
width: SizeConfig.screenWidth * 0.85, width: SizeConfig.screenWidth * 0.85,
//child: _getHospitals(model.pharmacy), //child: _getHospitals(model.pharmacy),
child: ListView.builder( child: ListView.builder(
//physics: NeverScrollableScrollPhysics(),
scrollDirection: Axis.vertical, scrollDirection: Axis.vertical,
shrinkWrap: true, shrinkWrap: true,
itemCount: model.pharmacy == null itemCount: model.pharmacy == null
@ -118,28 +116,29 @@ class _MedicineSearchState extends State<MedicineSearch> {
Navigator.push( Navigator.push(
context, context,
MaterialPageRoute( MaterialPageRoute(
builder: (context) => PharmaciesList()), 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); Utils.hideKeyboard(context);
if (_formKey.currentState.validate()) if (_formKey.currentState.validate())
model.getMedicine2(name: textController.text); model.getMedicine(name: textController.text);
} }
Widget _getHospitals(List<PharmaciesModel> hospitals) => ListView.builder(
itemCount: hospitals.length,
itemBuilder: (BuildContext context, int index) => Container(
child: Texts(hospitals[index].itemDes),
),
);
} }

@ -1,46 +1,36 @@
import 'package:diplomaticquarterapp/core/model/pharmacies/pharmacies_model.dart';
import 'package:diplomaticquarterapp/widgets/data_display/text.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:diplomaticquarterapp/config/size_config.dart'; import 'package:diplomaticquarterapp/config/size_config.dart';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:maps_launcher/maps_launcher.dart';
import '../base/base_view.dart'; import '../base/base_view.dart';
import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.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/progress_indicator/app_circular_progress_Indeicator.dart';
import 'package:diplomaticquarterapp/widgets/others/rounded_container.dart'; import 'package:diplomaticquarterapp/widgets/others/rounded_container.dart';
import 'dart:typed_data'; import 'dart:typed_data';
import 'dart:convert'; import 'dart:convert';
import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart';
import 'package:diplomaticquarterapp/core/viewModels/pharmacies_view_model.dart'; import 'package:diplomaticquarterapp/core/viewModels/pharmacies_view_model.dart';
import 'package:map_launcher/map_launcher.dart'; import 'package:map_launcher/map_launcher.dart';
import 'package:url_launcher/url_launcher.dart';
class PharmaciesList extends StatefulWidget { class PharmaciesList extends StatelessWidget {
String medicineID; final int medicineID;
int url; final String imageURL;
final String medicineDescription;
PharmaciesList({this.url, this.medicineID}); PharmaciesList({this.medicineID, this.imageURL, this.medicineDescription});
@override
_PharmaciesListState createState() => _PharmaciesListState();
//
}
class _PharmaciesListState extends State<PharmaciesList> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return BaseView<PharmacyViewModel>( return BaseView<PharmacyViewModel>(
//onModelReady: (model) => model.getMedicine(), onModelReady: (model) => model.getPharmacies(id: medicineID),
builder: (BuildContext context, PharmacyViewModel model, Widget child) => builder: (BuildContext context, PharmacyViewModel model, Widget child) =>
AppScaffold( AppScaffold(
appBarTitle: 'Pharmacies List', appBarTitle: TranslationBase.of(context).pharmaciesList,
body: !model.isFinished baseViewModel: model,
? AppCircularProgressIndicator() body: Container(
: model.hasError
? Center(
child: Text(
model.errorMsg,
style: TextStyle(color: Colors.red),
),
)
: Container(
height: SizeConfig.screenHeight, height: SizeConfig.screenHeight,
child: ListView( child: ListView(
shrinkWrap: true, shrinkWrap: true,
@ -57,43 +47,145 @@ class _PharmaciesListState extends State<PharmaciesList> {
Radius.circular(7), Radius.circular(7),
), ),
child: Image.memory( child: Image.memory(
dataFromBase64String( dataFromBase64String(imageURL),
widget.url.toString()), height: SizeConfig.imageSizeMultiplier * 19,
height: width: SizeConfig.imageSizeMultiplier * 18,
SizeConfig.imageSizeMultiplier * 19,
width:
SizeConfig.imageSizeMultiplier * 18,
fit: BoxFit.cover, fit: BoxFit.cover,
), ),
), ),
), ),
Expanded( Expanded(
flex: 3, flex: 3,
child: Padding(
padding: EdgeInsets.symmetric(
horizontal: 6.8, vertical: 3.5),
child: Column( child: Column(
mainAxisAlignment: mainAxisAlignment: MainAxisAlignment.start,
MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.stretch,
crossAxisAlignment: children: <Widget>[
CrossAxisAlignment.stretch, Texts(
children: <Widget>[], 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: <Widget>[
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,
),
),
),
Expanded(
flex: 2,
child: Wrap(
direction: Axis.horizontal,
alignment: WrapAlignment.end,
crossAxisAlignment: WrapCrossAlignment.end,
children: <Widget>[
Padding(
padding: EdgeInsets.all(6.0),
child: InkWell(
child: Icon(
Icons.phone,
color: Colors.red,
),
onTap: () => launch("tel://" +
model.pharmacyList[index].phoneNumber),
),
),
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) { Uint8List dataFromBase64String(String base64String) {
return base64Decode(base64String); return base64Decode(base64String);
} }
String base64String(Uint8List data) {
return base64Encode(data);
}
} }

@ -54,9 +54,11 @@ class TranslationBase {
String get nearestAppo => localizedValues['nearestAppo'][locale.languageCode]; 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]; String get search => localizedValues['search'][locale.languageCode];
@ -66,29 +68,35 @@ class TranslationBase {
String get appoInfo => localizedValues['appoInfo'][locale.languageCode]; 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 gender => localizedValues['gender'][locale.languageCode];
String get nationality => localizedValues['nationality'][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 patientInfo => localizedValues['patientInfo'][locale.languageCode];
String get bookSuccess => localizedValues['bookSuccess'][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 confirmAppo => localizedValues['confirmAppo'][locale.languageCode];
String get confirm => localizedValues['confirm'][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]; String get todoList => localizedValues['todoList'][locale.languageCode];
@ -126,6 +134,14 @@ class TranslationBase {
localizedValues['searchMedicine'][locale.languageCode]; localizedValues['searchMedicine'][locale.languageCode];
String get searchMedicineHere => String get searchMedicineHere =>
localizedValues['searchMedicineHere'][locale.languageCode]; 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<TranslationBase> { class TranslationBaseDelegate extends LocalizationsDelegate<TranslationBase> {

@ -16,6 +16,11 @@ class Texts extends StatefulWidget {
final bool allowExpand; final bool allowExpand;
final double fontSize; final double fontSize;
final String fontWeight; final String fontWeight;
final double margin;
final double marginTop;
final double marginRight;
final double marginBottom;
final double marginLeft;
Texts(this.text, Texts(this.text,
{Key key, {Key key,
@ -32,7 +37,12 @@ class Texts extends StatefulWidget {
this.readMore = false, this.readMore = false,
this.style, this.style,
this.fontSize, this.fontSize,
this.fontWeight}) this.fontWeight,
this.margin,
this.marginBottom,
this.marginLeft,
this.marginRight,
this.marginTop})
: super(key: key); : super(key: key);
@override @override
@ -228,7 +238,7 @@ class _TextsState extends State<Texts> {
Theme.of(context).backgroundColor.withOpacity(0), Theme.of(context).backgroundColor.withOpacity(0),
], begin: Alignment.bottomCenter, end: Alignment.topCenter), ], begin: Alignment.bottomCenter, end: Alignment.topCenter),
), ),
height: 30, height: 30.0,
), ),
) )
], ],

@ -29,7 +29,7 @@ class _MedicineItemWidgetState extends State<MedicineItemWidget> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return new RoundedContainer( return new RoundedContainer(
height: SizeConfig.heightMultiplier * 10.5, height: SizeConfig.heightMultiplier * 12.9,
child: Padding( child: Padding(
padding: const EdgeInsets.all(2.0), padding: const EdgeInsets.all(2.0),
child: Row( child: Row(
@ -38,8 +38,8 @@ class _MedicineItemWidgetState extends State<MedicineItemWidget> {
children: <Widget>[ children: <Widget>[
if (widget.url != null) if (widget.url != null)
Container( Container(
height: 39, height: 39.0,
width: 39, width: 39.0,
child: ClipRRect( child: ClipRRect(
borderRadius: BorderRadius.all(Radius.circular(7)), borderRadius: BorderRadius.all(Radius.circular(7)),
child: Image.memory( child: Image.memory(
@ -51,11 +51,15 @@ class _MedicineItemWidgetState extends State<MedicineItemWidget> {
), ),
), ),
Expanded( Expanded(
child: Center(
child: Padding( child: Padding(
padding: EdgeInsets.all(3), padding: EdgeInsets.all(2.5),
child: Align( child: Align(
alignment: Alignment.centerLeft, alignment: Alignment.centerLeft,
child: Texts(widget.label), child: Texts(
widget.label,
),
),
), ),
), ),
) )
@ -70,15 +74,7 @@ class _MedicineItemWidgetState extends State<MedicineItemWidget> {
); );
} }
Image imageFromBase64String(String base64String) {
return Image.memory(base64Decode(base64String));
}
Uint8List dataFromBase64String(String base64String) { Uint8List dataFromBase64String(String base64String) {
return base64Decode(base64String); return base64Decode(base64String);
} }
String base64String(Uint8List data) {
return base64Encode(data);
}
} }

@ -86,6 +86,7 @@ dependencies:
dev_dependencies: dev_dependencies:
flutter_test: flutter_test:
sdk: flutter sdk: flutter

Loading…
Cancel
Save