From e6edd5449fb82d8bef9f106c175052e4de10b9ca Mon Sep 17 00:00:00 2001 From: Mohammad Aljammal Date: Sun, 6 Dec 2020 11:47:52 +0200 Subject: [PATCH] Add MVVM --- lib/client/base_app_client.dart | 3 +- lib/core/enum/viewstate.dart | 1 + lib/core/model/hospitals_model.dart | 75 +++++++++++++++++++ lib/core/service/base/base_service.dart | 8 ++ .../service/hospital/hospitals_service.dart | 23 ++++++ lib/core/viewModel/base_view_model.dart | 17 +++++ lib/core/viewModel/hospital_view_model.dart | 23 ++++++ lib/locator.dart | 15 ++++ lib/main.dart | 6 +- lib/providers/auth_provider.dart | 14 ++-- lib/providers/doctor_reply_provider.dart | 4 +- lib/providers/doctors_provider.dart | 4 +- lib/providers/hospital_provider.dart | 4 +- lib/providers/livecare_provider.dart | 11 +-- lib/providers/medicine_provider.dart | 5 +- lib/providers/patients_provider.dart | 29 +++---- lib/providers/project_provider.dart | 3 +- lib/providers/referral_patient_provider.dart | 5 +- lib/providers/referred_patient_provider.dart | 6 +- lib/providers/schedule_provider.dart | 4 +- lib/screens/base/base_view.dart | 50 +++++++++++++ lib/widgets/shared/app_scaffold_widget.dart | 27 ++++--- lib/widgets/shared/network_base_view.dart | 44 +++++++++++ pubspec.lock | 45 ++++++----- pubspec.yaml | 4 + 25 files changed, 360 insertions(+), 70 deletions(-) create mode 100644 lib/core/enum/viewstate.dart create mode 100644 lib/core/model/hospitals_model.dart create mode 100644 lib/core/service/base/base_service.dart create mode 100644 lib/core/service/hospital/hospitals_service.dart create mode 100644 lib/core/viewModel/base_view_model.dart create mode 100644 lib/core/viewModel/hospital_view_model.dart create mode 100644 lib/locator.dart create mode 100644 lib/screens/base/base_view.dart create mode 100644 lib/widgets/shared/network_base_view.dart diff --git a/lib/client/base_app_client.dart b/lib/client/base_app_client.dart index d497d8f7..2521cf07 100644 --- a/lib/client/base_app_client.dart +++ b/lib/client/base_app_client.dart @@ -29,7 +29,8 @@ Helpers helpers = new Helpers(); body: null); * */ class BaseAppClient { - static post( + //TODO change the post fun to nun static when you change all service + post( String endPoint, { Map body, Function(dynamic response, int statusCode) onSuccess, diff --git a/lib/core/enum/viewstate.dart b/lib/core/enum/viewstate.dart new file mode 100644 index 00000000..94d79bec --- /dev/null +++ b/lib/core/enum/viewstate.dart @@ -0,0 +1 @@ +enum ViewState { Idle, Busy, Error, BusyLocal, ErrorLocal } diff --git a/lib/core/model/hospitals_model.dart b/lib/core/model/hospitals_model.dart new file mode 100644 index 00000000..b09807d6 --- /dev/null +++ b/lib/core/model/hospitals_model.dart @@ -0,0 +1,75 @@ +class HospitalsModel { + String desciption; + dynamic desciptionN; + int iD; + String legalName; + String legalNameN; + String name; + dynamic nameN; + String phoneNumber; + String setupID; + int distanceInKilometers; + bool isActive; + String latitude; + String longitude; + int mainProjectID; + dynamic projectOutSA; + bool usingInDoctorApp; + + HospitalsModel({this.desciption, + this.desciptionN, + this.iD, + this.legalName, + this.legalNameN, + this.name, + this.nameN, + this.phoneNumber, + this.setupID, + this.distanceInKilometers, + this.isActive, + this.latitude, + this.longitude, + this.mainProjectID, + this.projectOutSA, + this.usingInDoctorApp}); + + HospitalsModel.fromJson(Map json) { + desciption = json['Desciption']; + desciptionN = json['DesciptionN']; + iD = json['ID']; + legalName = json['LegalName']; + legalNameN = json['LegalNameN']; + name = json['Name']; + nameN = json['NameN']; + phoneNumber = json['PhoneNumber']; + setupID = json['SetupID']; + distanceInKilometers = json['DistanceInKilometers']; + isActive = json['IsActive']; + latitude = json['Latitude']; + longitude = json['Longitude']; + mainProjectID = json['MainProjectID']; + projectOutSA = json['ProjectOutSA']; + usingInDoctorApp = json['UsingInDoctorApp']; + } + + Map toJson() { + final Map data = new Map(); + data['Desciption'] = this.desciption; + data['DesciptionN'] = this.desciptionN; + data['ID'] = this.iD; + data['LegalName'] = this.legalName; + data['LegalNameN'] = this.legalNameN; + data['Name'] = this.name; + data['NameN'] = this.nameN; + data['PhoneNumber'] = this.phoneNumber; + data['SetupID'] = this.setupID; + data['DistanceInKilometers'] = this.distanceInKilometers; + data['IsActive'] = this.isActive; + data['Latitude'] = this.latitude; + data['Longitude'] = this.longitude; + data['MainProjectID'] = this.mainProjectID; + data['ProjectOutSA'] = this.projectOutSA; + data['UsingInDoctorApp'] = this.usingInDoctorApp; + return data; + } +} diff --git a/lib/core/service/base/base_service.dart b/lib/core/service/base/base_service.dart new file mode 100644 index 00000000..c4cb240d --- /dev/null +++ b/lib/core/service/base/base_service.dart @@ -0,0 +1,8 @@ +import 'package:doctor_app_flutter/client/base_app_client.dart'; + +class BaseService { + String error; + bool hasError = false; + BaseAppClient baseAppClient = BaseAppClient(); + //TODO add the user login model when we need it +} diff --git a/lib/core/service/hospital/hospitals_service.dart b/lib/core/service/hospital/hospitals_service.dart new file mode 100644 index 00000000..1fb24c6b --- /dev/null +++ b/lib/core/service/hospital/hospitals_service.dart @@ -0,0 +1,23 @@ +import 'package:doctor_app_flutter/config/config.dart'; +import 'package:doctor_app_flutter/core/model/hospitals_model.dart'; +import 'package:doctor_app_flutter/core/service/base/base_service.dart'; + +///This service just an example +class HospitalService extends BaseService { + List _hospitals = List(); + + List get hospitals => _hospitals; + + Future getHospitals() async { + await baseAppClient.post(GET_PROJECTS, + onSuccess: (dynamic response, int statusCode) { + _hospitals.clear(); + response['ListProject'].forEach((hospital) { + _hospitals.add(HospitalsModel.fromJson(hospital)); + }); + }, onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, body: Map()); + } +} diff --git a/lib/core/viewModel/base_view_model.dart b/lib/core/viewModel/base_view_model.dart new file mode 100644 index 00000000..29acdd42 --- /dev/null +++ b/lib/core/viewModel/base_view_model.dart @@ -0,0 +1,17 @@ +import 'package:doctor_app_flutter/core/enum/viewstate.dart'; +import 'package:flutter/material.dart'; + +class BaseViewModel extends ChangeNotifier { + ViewState _state = ViewState.Idle; + bool isInternetConnection = true; + + ViewState get state => _state; + + String error = ""; + //TODO add the user login model when we need it + + void setState(ViewState viewState) { + _state = viewState; + notifyListeners(); + } +} diff --git a/lib/core/viewModel/hospital_view_model.dart b/lib/core/viewModel/hospital_view_model.dart new file mode 100644 index 00000000..cac49dac --- /dev/null +++ b/lib/core/viewModel/hospital_view_model.dart @@ -0,0 +1,23 @@ +import 'package:doctor_app_flutter/core/enum/viewstate.dart'; +import 'package:doctor_app_flutter/core/model/hospitals_model.dart'; +import 'package:doctor_app_flutter/core/service/hospital/hospitals_service.dart'; + +import '../../locator.dart'; +import 'base_view_model.dart'; + +///This View Model just an example +class HospitalViewModel extends BaseViewModel { + HospitalService _hospitalService = locator(); + + List get hospitals => _hospitalService.hospitals; + + Future getHospitals() async { + setState(ViewState.Busy); + await _hospitalService.getHospitals(); + if (_hospitalService.hasError) { + error = _hospitalService.error; + setState(ViewState.Error); + } else + setState(ViewState.Idle); + } +} diff --git a/lib/locator.dart b/lib/locator.dart new file mode 100644 index 00000000..efc15045 --- /dev/null +++ b/lib/locator.dart @@ -0,0 +1,15 @@ +import 'package:get_it/get_it.dart'; + +import 'core/service/hospital/hospitals_service.dart'; +import 'core/viewModel/hospital_view_model.dart'; + +GetIt locator = GetIt.instance; + +///di +void setupLocator() { + /// Services + locator.registerLazySingleton(() => HospitalService()); + + /// View Model + locator.registerFactory(() => HospitalViewModel()); +} diff --git a/lib/main.dart b/lib/main.dart index 0e51a148..53d0839b 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -14,8 +14,12 @@ import './providers/patients_provider.dart'; import './providers/hospital_provider.dart'; import './routes.dart'; import 'config/config.dart'; +import 'locator.dart'; -void main() => runApp(MyApp()); +void main() { + setupLocator(); + runApp(MyApp()); +} class MyApp extends StatelessWidget { // This widget is the root of your application. diff --git a/lib/providers/auth_provider.dart b/lib/providers/auth_provider.dart index e7ad409c..eaca545d 100644 --- a/lib/providers/auth_provider.dart +++ b/lib/providers/auth_provider.dart @@ -16,7 +16,7 @@ class AuthProvider with ChangeNotifier { bool isLogin = false; bool isLoading = true; DoctorProfileModel doctorProfile; - + BaseAppClient baseAppClient = BaseAppClient(); setDoctorProfile(DoctorProfileModel profileModel){ doctorProfile = profileModel; notifyListeners(); @@ -56,7 +56,7 @@ class AuthProvider with ChangeNotifier { try { dynamic localRes; - await BaseAppClient.post(LOGIN_URL, + await baseAppClient.post(LOGIN_URL, onSuccess: (dynamic response, int statusCode) { localRes = response; }, onFailure: (String error, int statusCode) { @@ -74,7 +74,7 @@ class AuthProvider with ChangeNotifier { try { dynamic localRes; - await BaseAppClient.post(INSERT_DEVICE_IMEI, + await baseAppClient.post(INSERT_DEVICE_IMEI, onSuccess: (dynamic response, int statusCode) { localRes = response; }, onFailure: (String error, int statusCode) { @@ -90,7 +90,7 @@ class AuthProvider with ChangeNotifier { Future selectDeviceImei(imei) async { try { dynamic localRes; - await BaseAppClient.post(SELECT_DEVICE_IMEI, + await baseAppClient.post(SELECT_DEVICE_IMEI, onSuccess: (dynamic response, int statusCode) { localRes = response; }, onFailure: (String error, int statusCode) { @@ -106,7 +106,7 @@ class AuthProvider with ChangeNotifier { Future sendActivationCodeByOtpNotificationType(activationCodeModel) async { try { var localRes; - await BaseAppClient.post(SEND_ACTIVATION_CODE_BY_OTP_NOTIFICATION_TYPE, + await baseAppClient.post(SEND_ACTIVATION_CODE_BY_OTP_NOTIFICATION_TYPE, onSuccess: (dynamic response, int statusCode) { localRes = response; }, onFailure: (String error, int statusCode) { @@ -122,7 +122,7 @@ class AuthProvider with ChangeNotifier { Future memberCheckActivationCodeNew(activationCodeModel) async { try { dynamic localRes; - await BaseAppClient.post(MEMBER_CHECK_ACTIVATION_CODE_NEW, + await baseAppClient.post(MEMBER_CHECK_ACTIVATION_CODE_NEW, onSuccess: (dynamic response, int statusCode) { localRes = response; selectedClinicName = @@ -151,7 +151,7 @@ class AuthProvider with ChangeNotifier { Future getDocProfiles(docInfo) async { try { dynamic localRes; - await BaseAppClient.post(GET_DOC_PROFILES, + await baseAppClient.post(GET_DOC_PROFILES, onSuccess: (dynamic response, int statusCode) { localRes = response; doctorProfile = DoctorProfileModel.fromJson(response['DoctorProfileList'][0]); diff --git a/lib/providers/doctor_reply_provider.dart b/lib/providers/doctor_reply_provider.dart index e254988d..983237a1 100644 --- a/lib/providers/doctor_reply_provider.dart +++ b/lib/providers/doctor_reply_provider.dart @@ -11,14 +11,14 @@ class DoctorReplyProvider with ChangeNotifier { bool isError = false; String error = ''; RequestDoctorReply _requestDoctorReply = RequestDoctorReply(); - + BaseAppClient baseAppClient = BaseAppClient(); DoctorReplyProvider() { getDoctorReply(); } getDoctorReply() async { try { - await BaseAppClient.post(GT_MY_PATIENT_QUESTION, + await baseAppClient.post(GT_MY_PATIENT_QUESTION, body: _requestDoctorReply.toJson(), onSuccess: (dynamic response, int statusCode) { response['List_GtMyPatientsQuestions'].forEach((v) { diff --git a/lib/providers/doctors_provider.dart b/lib/providers/doctors_provider.dart index 6ef4b7db..d27b04da 100644 --- a/lib/providers/doctors_provider.dart +++ b/lib/providers/doctors_provider.dart @@ -23,7 +23,7 @@ class DoctorsProvider with ChangeNotifier { bool isLoading = false; bool isError = false; String error = ''; - + BaseAppClient baseAppClient = BaseAppClient(); resetDefaultValues() { isLoading = true; isError = false; @@ -40,7 +40,7 @@ class DoctorsProvider with ChangeNotifier { resetDefaultValues(); try { _statsticsForCertainDoctorRequest.generalid = generalId; - await BaseAppClient.post(LIVE_CARE_STATISTICS_FOR_CERTAIN_DOCTOR_URL, + await baseAppClient.post(LIVE_CARE_STATISTICS_FOR_CERTAIN_DOCTOR_URL, onSuccess: (dynamic response, int statusCode) { certainDoctorsStasticsList = response['List_LiveCareCertainDoctorsStastics']; isLoading = false; diff --git a/lib/providers/hospital_provider.dart b/lib/providers/hospital_provider.dart index a32e9516..3b1c7d03 100644 --- a/lib/providers/hospital_provider.dart +++ b/lib/providers/hospital_provider.dart @@ -3,6 +3,8 @@ import 'package:doctor_app_flutter/config/config.dart'; import 'package:flutter/cupertino.dart'; class HospitalProvider with ChangeNotifier { + BaseAppClient baseAppClient = BaseAppClient(); + Future getProjectsList() async { const url = GET_PROJECTS; var info = { @@ -17,7 +19,7 @@ class HospitalProvider with ChangeNotifier { }; dynamic localRes; - await BaseAppClient.post(url, onSuccess: (response, statusCode) async { + await baseAppClient.post(url, onSuccess: (response, statusCode) async { localRes = response; }, onFailure: (String error, int statusCode) { throw error; diff --git a/lib/providers/livecare_provider.dart b/lib/providers/livecare_provider.dart index 7afb11af..7af6585f 100644 --- a/lib/providers/livecare_provider.dart +++ b/lib/providers/livecare_provider.dart @@ -23,6 +23,7 @@ class LiveCareProvider with ChangeNotifier { bool isFinished = true; bool hasError = false; String errorMsg = ''; + BaseAppClient baseAppClient = BaseAppClient(); LiveCarePendingListRequest _pendingRequestModel = LiveCarePendingListRequest(); @@ -36,7 +37,7 @@ class LiveCareProvider with ChangeNotifier { _pendingRequestModel.patientData = PatientData(isOutKSA: false); resetDefaultValues(); // dynamic localRes; - await BaseAppClient.post(GET_LIVECARE_PENDINGLIST, + await baseAppClient.post(GET_LIVECARE_PENDINGLIST, onSuccess: (response, statusCode) async { isFinished = true; liveCarePendingList = []; @@ -66,7 +67,7 @@ class LiveCareProvider with ChangeNotifier { newRequest.docSpec = profile["DoctorTitleForProfile"]; newRequest.generalid = 'Cs2020@2016\$2958'; isFinished = false; - await BaseAppClient.post(START_LIVECARE_CALL, + await baseAppClient.post(START_LIVECARE_CALL, onSuccess: (response, statusCode) async { isFinished = true; inCallResponse = StartCallRes.fromJson(response); @@ -84,7 +85,7 @@ class LiveCareProvider with ChangeNotifier { newRequest.isOutKsa = request.isOutKSA; newRequest.generalid = 'Cs2020@2016\$2958'; newRequest.vCID = request.vCID; //["VC_ID"]; - newRequest.notes = await BaseAppClient.post(TRANSFERT_TO_ADMIN, + newRequest.notes = await baseAppClient.post(TRANSFERT_TO_ADMIN, onSuccess: (response, statusCode) async { isFinished = true; transferToAdmin = response; @@ -101,7 +102,7 @@ class LiveCareProvider with ChangeNotifier { newRequest.generalid = 'Cs2020@2016\$2958'; newRequest.vCID = request.vCID; //["VC_ID"]; newRequest.isDestroy = isPaitent; - await BaseAppClient.post(END_CALL, onSuccess: (response, statusCode) async { + await baseAppClient.post(END_CALL, onSuccess: (response, statusCode) async { isFinished = true; endCallResponse = response; }, onFailure: (String error, int statusCode) { @@ -116,7 +117,7 @@ class LiveCareProvider with ChangeNotifier { newRequest.vCID = vcID; newRequest.doctorId = doctorID; newRequest.generalid = 'Cs2020@2016\$2958'; - await BaseAppClient.post(END_CALL_WITH_CHARGE, + await baseAppClient.post(END_CALL_WITH_CHARGE, onSuccess: (response, statusCode) async { isFinished = true; endCallResponse = response; diff --git a/lib/providers/medicine_provider.dart b/lib/providers/medicine_provider.dart index 8a0bef74..af956081 100644 --- a/lib/providers/medicine_provider.dart +++ b/lib/providers/medicine_provider.dart @@ -13,6 +13,7 @@ class MedicineProvider with ChangeNotifier { bool isFinished = true; bool hasError = false; String errorMsg = ''; + BaseAppClient baseAppClient = BaseAppClient(); PharmaciesItemsRequestModel _itemsRequestModel = PharmaciesItemsRequestModel(); @@ -29,7 +30,7 @@ class MedicineProvider with ChangeNotifier { pharmacyItemsList.clear(); notifyListeners(); try { - await BaseAppClient.post(PHARMACY_ITEMS_URL, + await baseAppClient.post(PHARMACY_ITEMS_URL, onSuccess: (dynamic response, int statusCode) { pharmacyItemsList = response['ListPharmcy_Region_enh']; hasError = false; @@ -51,7 +52,7 @@ class MedicineProvider with ChangeNotifier { try { _listRequestModel.itemID = itemId; isFinished = true; - await BaseAppClient.post(PHARMACY_LIST_URL, + await baseAppClient.post(PHARMACY_LIST_URL, onSuccess: (dynamic response, int statusCode) { pharmaciesList = response['PharmList']; hasError = false; diff --git a/lib/providers/patients_provider.dart b/lib/providers/patients_provider.dart index 805b48dd..ace7cd1a 100644 --- a/lib/providers/patients_provider.dart +++ b/lib/providers/patients_provider.dart @@ -41,6 +41,7 @@ class PatientsProvider with ChangeNotifier { List patientRadiologyList = []; List prescriptionReportForInPatientList = []; List prescriptionReport = []; + BaseAppClient baseAppClient = BaseAppClient(); /*@author: ibrahe albitar *@Date:2/6/2020 @@ -71,7 +72,7 @@ class PatientsProvider with ChangeNotifier { try { dynamic localRes; - await BaseAppClient.post(GET_PATIENT + SERVICES_PATIANT[val], + await baseAppClient.post(GET_PATIENT + SERVICES_PATIANT[val], onSuccess: (dynamic response, int statusCode) { localRes = response; }, onFailure: (String error, int statusCode) { @@ -124,7 +125,7 @@ class PatientsProvider with ChangeNotifier { setBasicData(); try { - await BaseAppClient.post(GET_PATIENT_VITAL_SIGN, + await baseAppClient.post(GET_PATIENT_VITAL_SIGN, onSuccess: (dynamic response, int statusCode) { patientVitalSignList = []; response['List_DoctorPatientVitalSign'].forEach((v) { @@ -174,7 +175,7 @@ class PatientsProvider with ChangeNotifier { setBasicData(); try { - await BaseAppClient.post(GET_PATIENT_LAB_OREDERS, + await baseAppClient.post(GET_PATIENT_LAB_OREDERS, onSuccess: (dynamic response, int statusCode) { patientLabResultOrdersList = []; response['List_GetLabOreders'].forEach((v) { @@ -203,7 +204,7 @@ class PatientsProvider with ChangeNotifier { getOutPatientPrescriptions(patient) async { setBasicData(); try { - await BaseAppClient.post(GET_PRESCRIPTION, + await baseAppClient.post(GET_PRESCRIPTION, onSuccess: (dynamic response, int statusCode) { patientPrescriptionsList = []; response['PatientPrescriptionList'].forEach((v) { @@ -234,7 +235,7 @@ class PatientsProvider with ChangeNotifier { try { prescriptionReportForInPatientList = []; notifyListeners(); - await BaseAppClient.post(GET_PRESCRIPTION_REPORT_FOR_IN_PATIENT, + await baseAppClient.post(GET_PRESCRIPTION_REPORT_FOR_IN_PATIENT, onSuccess: (dynamic response, int statusCode) { response['List_PrescriptionReportForInPatient'].forEach((v) { prescriptionReportForInPatientList @@ -259,7 +260,7 @@ class PatientsProvider with ChangeNotifier { isError = false; error = ""; notifyListeners(); - await BaseAppClient.post(GET_PRESCRIPTION_REPORT, + await baseAppClient.post(GET_PRESCRIPTION_REPORT, onSuccess: (dynamic response, int statusCode) { response['ListPRM'].forEach((v) { prescriptionReport.add(PrescriptionReport.fromJson(v)); @@ -299,7 +300,7 @@ class PatientsProvider with ChangeNotifier { // notifyListeners(); setBasicData(); try { - await BaseAppClient.post(GET_RADIOLOGY, + await baseAppClient.post(GET_RADIOLOGY, onSuccess: (dynamic response, int statusCode) { patientRadiologyList = []; response['List_GetRadOreders'].forEach((v) { @@ -328,7 +329,7 @@ class PatientsProvider with ChangeNotifier { requestLabResult.orderNo = labOrdersResModel.orderNo; requestLabResult.invoiceNo = labOrdersResModel.invoiceNo; requestLabResult.patientTypeID = labOrdersResModel.patientType; - await BaseAppClient.post(GET_PATIENT_LAB_RESULTS, + await baseAppClient.post(GET_PATIENT_LAB_RESULTS, onSuccess: (dynamic response, int statusCode) { isError = false; isLoading = false; @@ -346,7 +347,7 @@ class PatientsProvider with ChangeNotifier { getPatientInsuranceApprovals(patient) async { setBasicData(); try { - await BaseAppClient.post(PATIENT_INSURANCE_APPROVALS_URL, + await baseAppClient.post(PATIENT_INSURANCE_APPROVALS_URL, onSuccess: (dynamic response, int statusCode) { insuranceApporvalsList = response['List_ApprovalMain_InPatient']; isLoading = false; @@ -370,7 +371,7 @@ class PatientsProvider with ChangeNotifier { getPatientProgressNote(patient) async { setBasicData(); try { - await BaseAppClient.post(PATIENT_PROGRESS_NOTE_URL, + await baseAppClient.post(PATIENT_PROGRESS_NOTE_URL, onSuccess: (dynamic response, int statusCode) { patientProgressNoteList = response['List_GetPregressNoteForInPatient']; isLoading = false; @@ -395,7 +396,7 @@ class PatientsProvider with ChangeNotifier { setBasicData(); try { _doctorsByClinicIdRequest.clinicID = clinicId; - await BaseAppClient.post(PATIENT_GET_DOCTOR_BY_CLINIC_URL, + await baseAppClient.post(PATIENT_GET_DOCTOR_BY_CLINIC_URL, onSuccess: (dynamic response, int statusCode) { doctorsList = response['List_Doctors_All']; isLoading = false; @@ -425,7 +426,7 @@ class PatientsProvider with ChangeNotifier { getClinicsList() async { setBasicData(); try { - await BaseAppClient.post(PATIENT_GET_CLINIC_BY_PROJECT_URL, + await baseAppClient.post(PATIENT_GET_CLINIC_BY_PROJECT_URL, onSuccess: (dynamic response, int statusCode) { clinicsList = response['List_Clinic_All']; isLoading = false; @@ -456,7 +457,7 @@ class PatientsProvider with ChangeNotifier { getReferralFrequancyList() async { setBasicData(); try { - await BaseAppClient.post(PATIENT_GET_LIST_REFERAL_URL, + await baseAppClient.post(PATIENT_GET_LIST_REFERAL_URL, onSuccess: (dynamic response, int statusCode) { referalFrequancyList = response['list_STPReferralFrequency']; isLoading = false; @@ -521,7 +522,7 @@ class PatientsProvider with ChangeNotifier { frequency: frequency, extension: extension, tokenID: token); - await BaseAppClient.post(PATIENT_REFER_TO_DOCTOR_URL, + await baseAppClient.post(PATIENT_REFER_TO_DOCTOR_URL, onSuccess: (dynamic response, int statusCode) { // print('Done : \n $res'); Navigator.pop(context); diff --git a/lib/providers/project_provider.dart b/lib/providers/project_provider.dart index 7548dc2c..db912c3c 100644 --- a/lib/providers/project_provider.dart +++ b/lib/providers/project_provider.dart @@ -25,6 +25,7 @@ class ProjectProvider with ChangeNotifier { bool isLoading = false; bool isError = false; String error = ''; + BaseAppClient baseAppClient = BaseAppClient(); Locale get appLocal => _appLocale; @@ -91,7 +92,7 @@ class ProjectProvider with ChangeNotifier { try { dynamic localRes; - await BaseAppClient.post(GET_CLINICS_FOR_DOCTOR, + await baseAppClient.post(GET_CLINICS_FOR_DOCTOR, onSuccess: (dynamic response, int statusCode) { doctorClinicsList = []; response['List_DoctorsClinic'].forEach((v) { diff --git a/lib/providers/referral_patient_provider.dart b/lib/providers/referral_patient_provider.dart index d0b36345..afc4d2b7 100644 --- a/lib/providers/referral_patient_provider.dart +++ b/lib/providers/referral_patient_provider.dart @@ -14,6 +14,7 @@ class MyReferralPatientProvider with ChangeNotifier { bool isError = false; String error = ''; Helpers helpers = Helpers(); + BaseAppClient baseAppClient = BaseAppClient(); RequestMyReferralPatientModel _requestMyReferralPatient = RequestMyReferralPatientModel(); @@ -25,7 +26,7 @@ class MyReferralPatientProvider with ChangeNotifier { getMyReferralPatient() async { try { - await BaseAppClient.post(GET_MY_REFERRAL_PATIENT, + await baseAppClient.post(GET_MY_REFERRAL_PATIENT, body: _requestMyReferralPatient.toJson(), onSuccess: (dynamic response, int statusCode) { response['List_MyReferralPatient'].forEach((v) { @@ -57,7 +58,7 @@ class MyReferralPatientProvider with ChangeNotifier { _requestAddReferredDoctorRemarks.referredDoctorRemarks = referredDoctorRemarks; _requestAddReferredDoctorRemarks.lineItemNo = model.lineItemNo; _requestAddReferredDoctorRemarks.referringDoctor = model.referringDoctor; - await BaseAppClient.post(ADD_REFERRED_DOCTOR_REMARKS, + await baseAppClient.post(ADD_REFERRED_DOCTOR_REMARKS, body: _requestAddReferredDoctorRemarks.toJson(), onSuccess: (dynamic body, int statusCode) { model.referredDoctorRemarks = referredDoctorRemarks; diff --git a/lib/providers/referred_patient_provider.dart b/lib/providers/referred_patient_provider.dart index 7cf8b58e..2aba752c 100644 --- a/lib/providers/referred_patient_provider.dart +++ b/lib/providers/referred_patient_provider.dart @@ -20,10 +20,12 @@ class MyReferredPatientProvider with ChangeNotifier { MyReferredPatientProvider() { getMyReferralPatient(); } + BaseAppClient baseAppClient = BaseAppClient(); + getMyReferralPatient() async { try { - await BaseAppClient.post(GET_MY_REFERRED_PATIENT, + await baseAppClient.post(GET_MY_REFERRED_PATIENT, body: _requestMyReferralPatient.toJson(), onSuccess: (dynamic response, int statusCode) { response['List_MyReferredPatient'].forEach((v) { @@ -62,7 +64,7 @@ class MyReferredPatientProvider with ChangeNotifier { _verifyreferraldoctorremarks.patientMobileNumber=model.mobileNumber; _verifyreferraldoctorremarks.patientIdentificationID=model.patientIdentificationNo; - await BaseAppClient.post(GET_MY_REFERRED_PATIENT, + await baseAppClient.post(GET_MY_REFERRED_PATIENT, body: _verifyreferraldoctorremarks.toJson(), onSuccess: (dynamic body, int statusCode) { diff --git a/lib/providers/schedule_provider.dart b/lib/providers/schedule_provider.dart index dedc9c27..79a41d10 100644 --- a/lib/providers/schedule_provider.dart +++ b/lib/providers/schedule_provider.dart @@ -14,10 +14,12 @@ class ScheduleProvider with ChangeNotifier { ScheduleProvider() { getDoctorSchedule(); } + BaseAppClient baseAppClient = BaseAppClient(); + getDoctorSchedule() async { try { - await BaseAppClient.post(GET_DOCTOR_WORKING_HOURS_TABLE, + await baseAppClient.post(GET_DOCTOR_WORKING_HOURS_TABLE, body: requestSchedule.toJson(), onSuccess: (dynamic response, int statusCode) { response['List_DoctorWorkingHoursTable'].forEach((v) { diff --git a/lib/screens/base/base_view.dart b/lib/screens/base/base_view.dart new file mode 100644 index 00000000..cf24b47f --- /dev/null +++ b/lib/screens/base/base_view.dart @@ -0,0 +1,50 @@ +import 'package:doctor_app_flutter/core/viewModel/base_view_model.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +import '../../locator.dart'; + +class BaseView extends StatefulWidget { + final Widget Function(BuildContext context, T model, Widget child) builder; + final Function(T) onModelReady; + + BaseView({ + this.builder, + this.onModelReady, + }); + + @override + _BaseViewState createState() => _BaseViewState(); +} + +class _BaseViewState extends State> { + T model = locator(); + + bool isLogin = false; + + @override + void initState() { + if (widget.onModelReady != null) { + widget.onModelReady(model); + } + + super.initState(); + } + + @override + Widget build(BuildContext context) { + return ChangeNotifierProvider( + create: (BuildContext context) => model, + child: Consumer(builder: widget.builder), + ); + } + + @override + void dispose() { + if (model != null) { + model = null; + } + + super.dispose(); + } +} diff --git a/lib/widgets/shared/app_scaffold_widget.dart b/lib/widgets/shared/app_scaffold_widget.dart index 1dc27114..c97f9d4c 100644 --- a/lib/widgets/shared/app_scaffold_widget.dart +++ b/lib/widgets/shared/app_scaffold_widget.dart @@ -1,4 +1,5 @@ import 'package:doctor_app_flutter/config/config.dart'; +import 'package:doctor_app_flutter/core/viewModel/base_view_model.dart'; import 'package:doctor_app_flutter/providers/project_provider.dart'; import 'package:doctor_app_flutter/routes.dart'; import 'package:flutter/material.dart'; @@ -7,18 +8,21 @@ import 'package:provider/provider.dart'; import 'package:doctor_app_flutter/icons_app/doctor_app_icons.dart'; import '../../widgets/shared/app_loader_widget.dart'; import 'app_texts_widget.dart'; +import 'network_base_view.dart'; class AppScaffold extends StatelessWidget { - String appBarTitle; - Widget body; - bool isLoading; - bool isShowAppBar; + final String appBarTitle; + final Widget body; + final bool isLoading; + final bool isShowAppBar; + final BaseViewModel baseViewModel; AppScaffold( {this.appBarTitle = '', this.body, this.isLoading = false, - this.isShowAppBar = true}); + this.isShowAppBar = true, + this.baseViewModel}); @override Widget build(BuildContext context) { @@ -30,9 +34,7 @@ class AppScaffold extends StatelessWidget { ? AppBar( elevation: 0, backgroundColor: Hexcolor('#515B5D'), - textTheme: TextTheme( - headline6: TextStyle( - color: Colors.white)), + textTheme: TextTheme(headline6: TextStyle(color: Colors.white)), title: Text(appBarTitle.toUpperCase()), leading: Builder(builder: (BuildContext context) { return IconButton( @@ -53,7 +55,13 @@ class AppScaffold extends StatelessWidget { ) : null, body: projectProvider.isInternetConnection - ? Stack(children: [body, buildAppLoaderWidget(isLoading)]) + ? baseViewModel != null + ? NetworkBaseView( + baseViewModel: baseViewModel, + child: body, + ) + : Stack( + children: [body, buildAppLoaderWidget(isLoading)]) : Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, @@ -67,7 +75,6 @@ class AppScaffold extends StatelessWidget { ], ), )); - ; } Widget buildAppLoaderWidget(bool isloading) { diff --git a/lib/widgets/shared/network_base_view.dart b/lib/widgets/shared/network_base_view.dart new file mode 100644 index 00000000..fbd05870 --- /dev/null +++ b/lib/widgets/shared/network_base_view.dart @@ -0,0 +1,44 @@ +import 'package:doctor_app_flutter/core/enum/viewstate.dart'; +import 'package:doctor_app_flutter/core/viewModel/base_view_model.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; + +import 'app_loader_widget.dart'; +import 'errors/dr_app_embedded_error.dart'; + +class NetworkBaseView extends StatelessWidget { + final BaseViewModel baseViewModel; + final Widget child; + + NetworkBaseView({Key key, this.baseViewModel, this.child}); + + @override + Widget build(BuildContext context) { + return Container( + child: buildBaseViewWidget(), + ); + } + + buildBaseViewWidget() { + switch (baseViewModel.state) { + case ViewState.ErrorLocal: + case ViewState.Idle: + case ViewState.BusyLocal: + return child; + break; + case ViewState.Busy: + return Padding( + padding: const EdgeInsets.all(8.0), + child: Center(child: const CircularProgressIndicator()), + ); + break; + case ViewState.Error: + return Center( + child: DrAppEmbeddedError( + error: baseViewModel.error, + ), + ); + break; + } + } +} diff --git a/pubspec.lock b/pubspec.lock index 9f77f0b9..7694efcf 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -35,7 +35,7 @@ packages: name: async url: "https://pub.dartlang.org" source: hosted - version: "2.4.2" + version: "2.5.0-nullsafety.1" barcode_scan: dependency: "direct main" description: @@ -56,7 +56,7 @@ packages: name: boolean_selector url: "https://pub.dartlang.org" source: hosted - version: "2.0.0" + version: "2.1.0-nullsafety.1" build: dependency: transitive description: @@ -133,14 +133,14 @@ packages: name: characters url: "https://pub.dartlang.org" source: hosted - version: "1.0.0" + version: "1.1.0-nullsafety.3" charcode: dependency: transitive description: name: charcode url: "https://pub.dartlang.org" source: hosted - version: "1.1.3" + version: "1.2.0-nullsafety.1" charts_common: dependency: transitive description: @@ -168,7 +168,7 @@ packages: name: clock url: "https://pub.dartlang.org" source: hosted - version: "1.0.1" + version: "1.1.0-nullsafety.1" code_builder: dependency: transitive description: @@ -182,7 +182,7 @@ packages: name: collection url: "https://pub.dartlang.org" source: hosted - version: "1.14.13" + version: "1.15.0-nullsafety.3" connectivity: dependency: "direct main" description: @@ -266,7 +266,7 @@ packages: name: fake_async url: "https://pub.dartlang.org" source: hosted - version: "1.1.0" + version: "1.2.0-nullsafety.1" fixnum: dependency: transitive description: @@ -315,6 +315,13 @@ packages: description: flutter source: sdk version: "0.0.0" + get_it: + dependency: "direct main" + description: + name: get_it + url: "https://pub.dartlang.org" + source: hosted + version: "4.0.4" glob: dependency: transitive description: @@ -433,14 +440,14 @@ packages: name: matcher url: "https://pub.dartlang.org" source: hosted - version: "0.12.8" + version: "0.12.10-nullsafety.1" meta: dependency: transitive description: name: meta url: "https://pub.dartlang.org" source: hosted - version: "1.1.8" + version: "1.3.0-nullsafety.3" mime: dependency: transitive description: @@ -482,7 +489,7 @@ packages: name: path url: "https://pub.dartlang.org" source: hosted - version: "1.7.0" + version: "1.8.0-nullsafety.1" pedantic: dependency: transitive description: @@ -641,7 +648,7 @@ packages: name: source_span url: "https://pub.dartlang.org" source: hosted - version: "1.7.0" + version: "1.8.0-nullsafety.2" speech_to_text: dependency: "direct main" description: @@ -655,14 +662,14 @@ packages: name: stack_trace url: "https://pub.dartlang.org" source: hosted - version: "1.9.5" + version: "1.10.0-nullsafety.1" stream_channel: dependency: transitive description: name: stream_channel url: "https://pub.dartlang.org" source: hosted - version: "2.0.0" + version: "2.1.0-nullsafety.1" stream_transform: dependency: transitive description: @@ -676,21 +683,21 @@ packages: name: string_scanner url: "https://pub.dartlang.org" source: hosted - version: "1.0.5" + version: "1.1.0-nullsafety.1" term_glyph: dependency: transitive description: name: term_glyph url: "https://pub.dartlang.org" source: hosted - version: "1.1.0" + version: "1.2.0-nullsafety.1" test_api: dependency: transitive description: name: test_api url: "https://pub.dartlang.org" source: hosted - version: "0.2.17" + version: "0.2.19-nullsafety.2" timing: dependency: transitive description: @@ -704,7 +711,7 @@ packages: name: typed_data url: "https://pub.dartlang.org" source: hosted - version: "1.2.0" + version: "1.3.0-nullsafety.3" url_launcher: dependency: "direct main" description: @@ -739,7 +746,7 @@ packages: name: vector_math url: "https://pub.dartlang.org" source: hosted - version: "2.0.8" + version: "2.1.0-nullsafety.3" watcher: dependency: transitive description: @@ -762,5 +769,5 @@ packages: source: hosted version: "2.2.1" sdks: - dart: ">=2.9.0-14.0.dev <3.0.0" + dart: ">=2.10.0-110 <2.11.0" flutter: ">=1.12.13+hotfix.5 <2.0.0" diff --git a/pubspec.yaml b/pubspec.yaml index a061ba4a..bdda7810 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -52,6 +52,10 @@ dependencies: #flutter_svg: ^0.17.4 percent_indicator: "^2.1.1" + #Dependency Injection + get_it: ^4.0.2 + + #speech to text speech_to_text: path: speech_to_text