diff --git a/lib/core/service/doctor_reply_service.dart b/lib/core/service/doctor_reply_service.dart new file mode 100644 index 00000000..5025037d --- /dev/null +++ b/lib/core/service/doctor_reply_service.dart @@ -0,0 +1,27 @@ +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'; +import 'package:doctor_app_flutter/models/doctor/list_gt_my_patients_question_model.dart'; +import 'package:doctor_app_flutter/models/doctor/request_doctor_reply.dart'; + +class DoctorReplyService extends BaseService { + + List get listDoctorWorkingHoursTable => _listDoctorWorkingHoursTable; + List _listDoctorWorkingHoursTable = []; + + + RequestDoctorReply _requestDoctorReply = RequestDoctorReply(); + Future getDoctorReply() async { + await baseAppClient.post(GT_MY_PATIENT_QUESTION, + onSuccess: (dynamic response, int statusCode) { + _listDoctorWorkingHoursTable.clear(); + response['List_GtMyPatientsQuestions'].forEach((v) { + _listDoctorWorkingHoursTable + .add(ListGtMyPatientsQuestions.fromJson(v)); + }); + }, onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, body: _requestDoctorReply.toJson(),); + } +} diff --git a/lib/core/service/schedule_service.dart b/lib/core/service/schedule_service.dart new file mode 100644 index 00000000..674facda --- /dev/null +++ b/lib/core/service/schedule_service.dart @@ -0,0 +1,26 @@ +import 'package:doctor_app_flutter/config/config.dart'; +import 'package:doctor_app_flutter/core/service/base/base_service.dart'; +import 'package:doctor_app_flutter/models/doctor/list_doctor_working_hours_table_model.dart'; +import 'package:doctor_app_flutter/models/doctor/request_schedule.dart'; + +class ScheduleService extends BaseService { + + List get listDoctorWorkingHoursTable => _listDoctorWorkingHoursTable; + List _listDoctorWorkingHoursTable = []; + + + RequestSchedule _requestSchedule = RequestSchedule(); + Future getDoctorSchedule() async { + await baseAppClient.post(GET_DOCTOR_WORKING_HOURS_TABLE, + onSuccess: (dynamic response, int statusCode) { + _listDoctorWorkingHoursTable.clear(); + response['List_DoctorWorkingHoursTable'].forEach((v) { + _listDoctorWorkingHoursTable + .add(ListDoctorWorkingHoursTable.fromJson(v)); + }); + }, onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, body: _requestSchedule.toJson(),); + } +} diff --git a/lib/core/viewModel/doctor_replay_view_model.dart b/lib/core/viewModel/doctor_replay_view_model.dart new file mode 100644 index 00000000..ac212578 --- /dev/null +++ b/lib/core/viewModel/doctor_replay_view_model.dart @@ -0,0 +1,24 @@ +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/doctor_reply_service.dart'; +import 'package:doctor_app_flutter/core/service/hospital/hospitals_service.dart'; +import 'package:doctor_app_flutter/models/doctor/list_gt_my_patients_question_model.dart'; + +import '../../locator.dart'; +import 'base_view_model.dart'; + +class DoctorReplayViewModel extends BaseViewModel { + DoctorReplyService _doctorReplyService = locator(); + + List get listDoctorWorkingHoursTable => _doctorReplyService.listDoctorWorkingHoursTable; + + Future getDoctorReply() async { + setState(ViewState.Busy); + await _doctorReplyService.getDoctorReply(); + if (_doctorReplyService.hasError) { + error = _doctorReplyService.error; + setState(ViewState.Error); + } else + setState(ViewState.Idle); + } +} diff --git a/lib/core/viewModel/schedule_view_model.dart b/lib/core/viewModel/schedule_view_model.dart new file mode 100644 index 00000000..cfaa1be4 --- /dev/null +++ b/lib/core/viewModel/schedule_view_model.dart @@ -0,0 +1,26 @@ +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/doctor_reply_service.dart'; +import 'package:doctor_app_flutter/core/service/hospital/hospitals_service.dart'; +import 'package:doctor_app_flutter/core/service/schedule_service.dart'; +import 'package:doctor_app_flutter/models/doctor/list_doctor_working_hours_table_model.dart'; +import 'package:doctor_app_flutter/models/doctor/list_gt_my_patients_question_model.dart'; + +import '../../locator.dart'; +import 'base_view_model.dart'; + +class ScheduleViewModel extends BaseViewModel { + ScheduleService _scheduleService = locator(); + + List get listDoctorWorkingHoursTable => _scheduleService.listDoctorWorkingHoursTable; + + Future getDoctorSchedule() async { + setState(ViewState.Busy); + await _scheduleService.getDoctorSchedule(); + if (_scheduleService.hasError) { + error = _scheduleService.error; + setState(ViewState.Error); + } else + setState(ViewState.Idle); + } +} diff --git a/lib/locator.dart b/lib/locator.dart index efc15045..053f7535 100644 --- a/lib/locator.dart +++ b/lib/locator.dart @@ -1,7 +1,11 @@ import 'package:get_it/get_it.dart'; +import 'core/service/doctor_reply_service.dart'; import 'core/service/hospital/hospitals_service.dart'; +import 'core/service/schedule_service.dart'; +import 'core/viewModel/doctor_replay_view_model.dart'; import 'core/viewModel/hospital_view_model.dart'; +import 'core/viewModel/schedule_view_model.dart'; GetIt locator = GetIt.instance; @@ -9,7 +13,11 @@ GetIt locator = GetIt.instance; void setupLocator() { /// Services locator.registerLazySingleton(() => HospitalService()); + locator.registerLazySingleton(() => DoctorReplyService()); + locator.registerLazySingleton(() => ScheduleService()); /// View Model locator.registerFactory(() => HospitalViewModel()); + locator.registerFactory(() => DoctorReplayViewModel()); + locator.registerFactory(() => ScheduleViewModel()); } diff --git a/lib/main.dart b/lib/main.dart index 53d0839b..3b32e732 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,7 +1,6 @@ import 'package:doctor_app_flutter/providers/livecare_provider.dart'; import 'package:doctor_app_flutter/providers/medicine_provider.dart'; import 'package:doctor_app_flutter/providers/project_provider.dart'; -import 'package:doctor_app_flutter/providers/schedule_provider.dart'; import 'package:doctor_app_flutter/util/translations_delegate_base.dart'; import 'package:flutter/material.dart'; import 'package:flutter_localizations/flutter_localizations.dart'; @@ -41,9 +40,6 @@ class MyApp extends StatelessWidget { ChangeNotifierProvider( create: (context) => ProjectProvider(), ), - ChangeNotifierProvider( - create: (context) => ScheduleProvider(), - ), ChangeNotifierProvider( create: (context) => LiveCareProvider(), ), diff --git a/lib/providers/doctor_reply_provider.dart b/lib/providers/doctor_reply_provider.dart deleted file mode 100644 index 983237a1..00000000 --- a/lib/providers/doctor_reply_provider.dart +++ /dev/null @@ -1,41 +0,0 @@ -import 'package:doctor_app_flutter/client/base_app_client.dart'; -import 'package:doctor_app_flutter/config/config.dart'; -import 'package:doctor_app_flutter/models/doctor/request_doctor_reply.dart'; -import 'package:doctor_app_flutter/models/doctor/list_gt_my_patients_question_model.dart'; -import 'package:flutter/cupertino.dart'; - -class DoctorReplyProvider with ChangeNotifier { - List listDoctorWorkingHoursTable = []; - - bool isLoading = true; - bool isError = false; - String error = ''; - RequestDoctorReply _requestDoctorReply = RequestDoctorReply(); - BaseAppClient baseAppClient = BaseAppClient(); - DoctorReplyProvider() { - getDoctorReply(); - } - - getDoctorReply() async { - try { - await baseAppClient.post(GT_MY_PATIENT_QUESTION, - body: _requestDoctorReply.toJson(), - onSuccess: (dynamic response, int statusCode) { - response['List_GtMyPatientsQuestions'].forEach((v) { - listDoctorWorkingHoursTable - .add(ListGtMyPatientsQuestions.fromJson(v)); - isError = false; - isLoading = false; - }); - }, onFailure: (String error, int statusCode) { - isError = true; - isLoading = false; - this.error = error; - }); - - notifyListeners(); - } catch (error) { - throw error; - } - } -} diff --git a/lib/providers/doctors_provider.dart b/lib/providers/doctors_provider.dart deleted file mode 100644 index d27b04da..00000000 --- a/lib/providers/doctors_provider.dart +++ /dev/null @@ -1,68 +0,0 @@ -import 'package:doctor_app_flutter/client/base_app_client.dart'; -import 'package:doctor_app_flutter/config/config.dart'; -import 'package:doctor_app_flutter/models/doctor/statstics_for_certain_doctor_request.dart'; -import 'package:doctor_app_flutter/util/dr_app_shared_pref.dart'; -import 'package:doctor_app_flutter/util/helpers.dart'; -import 'package:flutter/cupertino.dart'; - -Helpers helpers = Helpers(); -DrAppSharedPreferances sharedPref = new DrAppSharedPreferances(); - -StatsticsForCertainDoctorRequest _statsticsForCertainDoctorRequest = StatsticsForCertainDoctorRequest(); - - -var certainDoctorsStasticsList = []; - -/*@author: ibrahem albitar - *@Date:22/6/2020 - *@desc: Doctor Provider - */ - -class DoctorsProvider with ChangeNotifier { - - bool isLoading = false; - bool isError = false; - String error = ''; - BaseAppClient baseAppClient = BaseAppClient(); - resetDefaultValues() { - isLoading = true; - isError = false; - error = ''; - notifyListeners(); - } - - - /*@author: ibrahem albitar - *@Date:22/6/2020 - *@desc: StatsticsForCertainDoctor - */ - getStatsticsForCertainDoctor(String generalId) async { - resetDefaultValues(); - try { - _statsticsForCertainDoctorRequest.generalid = generalId; - await baseAppClient.post(LIVE_CARE_STATISTICS_FOR_CERTAIN_DOCTOR_URL, - onSuccess: (dynamic response, int statusCode) { - certainDoctorsStasticsList = response['List_LiveCareCertainDoctorsStastics']; - isLoading = false; - isError = false; - this.error = ''; - }, onFailure: (String error, int statusCode) { - isLoading = false; - isError = true; - this.error = error; - }, body: _statsticsForCertainDoctorRequest.toJson()); - notifyListeners(); - } catch (err) { - handelCatchErrorCase(err); - } - } - - handelCatchErrorCase(err) { - isLoading = false; - isError = true; - error = helpers.generateContactAdminMsg(err); - notifyListeners(); - throw err; - } - -} \ No newline at end of file diff --git a/lib/providers/pending_patient_provider.dart b/lib/providers/pending_patient_provider.dart deleted file mode 100644 index e69de29b..00000000 diff --git a/lib/providers/schedule_provider.dart b/lib/providers/schedule_provider.dart deleted file mode 100644 index 79a41d10..00000000 --- a/lib/providers/schedule_provider.dart +++ /dev/null @@ -1,43 +0,0 @@ -import 'package:doctor_app_flutter/client/base_app_client.dart'; -import 'package:doctor_app_flutter/config/config.dart'; -import 'package:flutter/cupertino.dart'; -import '../models/doctor/list_doctor_working_hours_table_model.dart'; -import '../models/doctor/request_schedule.dart'; - -class ScheduleProvider with ChangeNotifier { - List listDoctorWorkingHoursTable = []; - bool isLoading = true; - bool isError = false; - String error = ''; - RequestSchedule requestSchedule = RequestSchedule(); - - ScheduleProvider() { - getDoctorSchedule(); - } - BaseAppClient baseAppClient = BaseAppClient(); - - - getDoctorSchedule() async { - try { - await baseAppClient.post(GET_DOCTOR_WORKING_HOURS_TABLE, - body: requestSchedule.toJson(), - onSuccess: (dynamic response, int statusCode) { - response['List_DoctorWorkingHoursTable'].forEach((v) { - listDoctorWorkingHoursTable.add(new ListDoctorWorkingHoursTable.fromJson(v)); - }); - isError = false; - isLoading = false; - }, onFailure: (String error, int statusCode) { - isLoading = false; - isError = true; - this.error = error; - }); - notifyListeners(); - } catch (e) { - isLoading = false; - isError = true; - error = 'Something wrong happened, please contact the admin'; - notifyListeners(); - } - } -} diff --git a/lib/screens/dashboard_screen.dart b/lib/screens/dashboard_screen.dart index 18d70904..0f01dd1e 100644 --- a/lib/screens/dashboard_screen.dart +++ b/lib/screens/dashboard_screen.dart @@ -5,7 +5,6 @@ import 'package:doctor_app_flutter/models/doctor/clinic_model.dart'; import 'package:doctor_app_flutter/models/doctor/doctor_profile_model.dart'; import 'package:doctor_app_flutter/models/doctor/profile_req_Model.dart'; import 'package:doctor_app_flutter/providers/auth_provider.dart'; -import 'package:doctor_app_flutter/providers/doctor_reply_provider.dart'; import 'package:doctor_app_flutter/providers/hospital_provider.dart'; import 'package:doctor_app_flutter/providers/medicine_provider.dart'; import 'package:doctor_app_flutter/providers/project_provider.dart'; @@ -718,10 +717,7 @@ class _DashboardScreenState extends State { context, MaterialPageRoute( builder: (context) => - ChangeNotifierProvider( - create: (_) => DoctorReplyProvider(), - child: DoctorReplyScreen(), - ), + DoctorReplyScreen(), ), ); }, diff --git a/lib/screens/doctor/doctor_reply_screen.dart b/lib/screens/doctor/doctor_reply_screen.dart index 48665a27..4326397f 100644 --- a/lib/screens/doctor/doctor_reply_screen.dart +++ b/lib/screens/doctor/doctor_reply_screen.dart @@ -1,19 +1,10 @@ -import 'package:doctor_app_flutter/config/size_config.dart'; -import 'package:doctor_app_flutter/providers/doctor_reply_provider.dart'; -import 'package:doctor_app_flutter/util/helpers.dart'; +import 'package:doctor_app_flutter/core/viewModel/doctor_replay_view_model.dart'; +import 'package:doctor_app_flutter/screens/base/base_view.dart'; import 'package:doctor_app_flutter/util/translations_delegate_base.dart'; import 'package:doctor_app_flutter/widgets/doctor/doctor_reply_widget.dart'; -import 'package:doctor_app_flutter/widgets/patients/profile/large_avatar.dart'; import 'package:doctor_app_flutter/widgets/shared/app_scaffold_widget.dart'; -import 'package:doctor_app_flutter/widgets/shared/app_texts_widget.dart'; -import 'package:doctor_app_flutter/widgets/shared/card_with_bgNew_widget.dart'; -import 'package:doctor_app_flutter/widgets/shared/card_with_bg_widget.dart'; -import 'package:doctor_app_flutter/widgets/shared/dr_app_circular_progress_Indeicator.dart'; -import 'package:doctor_app_flutter/widgets/shared/rounded_container_widget.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:hexcolor/hexcolor.dart'; -import 'package:provider/provider.dart'; /* *@author: Mohammad Aljammal @@ -23,38 +14,31 @@ import 'package:provider/provider.dart'; *@desc: Doctor Reply Screen display data from GtMyPatientsQuestions service */ class DoctorReplyScreen extends StatelessWidget { - DoctorReplyProvider _doctorReplyProvider; @override Widget build(BuildContext context) { - _doctorReplyProvider = Provider.of(context); - return AppScaffold( - appBarTitle: TranslationBase.of(context).replay2, - body: _doctorReplyProvider.isLoading - ? DrAppCircularProgressIndeicator() - : _doctorReplyProvider.isError - ? Center( - child: Text( - _doctorReplyProvider.error, - style: TextStyle(color: Theme.of(context).errorColor), - ), - ) - : Container( - padding: EdgeInsetsDirectional.fromSTEB(30, 0, 30, 0), - child: ListView( - children: [ - Column( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: _doctorReplyProvider - .listDoctorWorkingHoursTable - .map((reply) { - return DoctorReplyWidget(reply: reply); - }).toList(), - ) - ], - ), - ), - ); + return BaseView( + onModelReady: (model) => model.getDoctorReply(), + builder: (_, model, w) => AppScaffold( + baseViewModel: model, + appBarTitle: TranslationBase.of(context).replay2, + body: Container( + padding: EdgeInsetsDirectional.fromSTEB(30, 0, 30, 0), + child: ListView( + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: + MainAxisAlignment.spaceBetween, + children: model + .listDoctorWorkingHoursTable + .map((reply) { + return DoctorReplyWidget(reply: reply); + }).toList(), + ) + ], + ), + ), + )); } } diff --git a/lib/screens/doctor/my_referral_patient_screen.dart b/lib/screens/doctor/my_referral_patient_screen.dart index 10b73d6b..4df450e7 100644 --- a/lib/screens/doctor/my_referral_patient_screen.dart +++ b/lib/screens/doctor/my_referral_patient_screen.dart @@ -1,8 +1,6 @@ import 'package:doctor_app_flutter/providers/referral_patient_provider.dart'; -import 'package:doctor_app_flutter/providers/schedule_provider.dart'; import 'package:doctor_app_flutter/util/translations_delegate_base.dart'; import 'package:doctor_app_flutter/widgets/doctor/my_referral_patient_widget.dart'; -import 'package:doctor_app_flutter/widgets/doctor/my_schedule_widget.dart'; import 'package:doctor_app_flutter/widgets/shared/app_texts_widget.dart'; import 'package:doctor_app_flutter/widgets/shared/dr_app_circular_progress_Indeicator.dart'; import 'package:flutter/material.dart'; diff --git a/lib/screens/doctor/my_referred_patient_screen.dart b/lib/screens/doctor/my_referred_patient_screen.dart index 48c68c61..ec91b4c3 100644 --- a/lib/screens/doctor/my_referred_patient_screen.dart +++ b/lib/screens/doctor/my_referred_patient_screen.dart @@ -1,15 +1,12 @@ import 'package:doctor_app_flutter/providers/referred_patient_provider.dart'; -import 'package:doctor_app_flutter/providers/schedule_provider.dart'; import 'package:doctor_app_flutter/util/translations_delegate_base.dart'; import 'package:doctor_app_flutter/widgets/doctor/my_referred_patient_widget.dart'; -import 'package:doctor_app_flutter/widgets/doctor/my_schedule_widget.dart'; import 'package:doctor_app_flutter/widgets/shared/app_texts_widget.dart'; import 'package:doctor_app_flutter/widgets/shared/dr_app_circular_progress_Indeicator.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import '../../widgets/shared/app_scaffold_widget.dart'; -import 'package:doctor_app_flutter/util/translations_delegate_base.dart'; class MyReferredPatient extends StatelessWidget { MyReferredPatientProvider referredPatientProvider; diff --git a/lib/screens/doctor/my_schedule_screen.dart b/lib/screens/doctor/my_schedule_screen.dart index 281357ca..b94b3823 100644 --- a/lib/screens/doctor/my_schedule_screen.dart +++ b/lib/screens/doctor/my_schedule_screen.dart @@ -1,31 +1,22 @@ -import 'package:doctor_app_flutter/providers/schedule_provider.dart'; +import 'package:doctor_app_flutter/core/viewModel/schedule_view_model.dart'; +import 'package:doctor_app_flutter/screens/base/base_view.dart'; import 'package:doctor_app_flutter/util/translations_delegate_base.dart'; import 'package:doctor_app_flutter/widgets/doctor/my_schedule_widget.dart'; import 'package:doctor_app_flutter/widgets/shared/app_scaffold_widget.dart'; import 'package:doctor_app_flutter/widgets/shared/app_texts_widget.dart'; -import 'package:doctor_app_flutter/widgets/shared/dr_app_circular_progress_Indeicator.dart'; import 'package:flutter/material.dart'; -import 'package:provider/provider.dart'; class MyScheduleScreen extends StatelessWidget { - ScheduleProvider scheduleProvider; @override Widget build(BuildContext context) { - scheduleProvider = Provider.of(context); - return AppScaffold( - isShowAppBar: false, - body: scheduleProvider.isLoading - ? DrAppCircularProgressIndeicator() - : scheduleProvider.isError - ? Center( - child: AppText( - scheduleProvider.error, - color: Theme.of(context).errorColor, - ), - ) - : scheduleProvider.listDoctorWorkingHoursTable.length == 0 + return BaseView( + onModelReady: (model) => model.getDoctorSchedule(), + builder: (_, model, w) => AppScaffold( + baseViewModel: model, + isShowAppBar: false, + body: model.listDoctorWorkingHoursTable.length == 0 ? Center( child: AppText( TranslationBase.of(context).errorNoSchedule, @@ -37,28 +28,28 @@ class MyScheduleScreen extends StatelessWidget { child: ListView( children: [ Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - SizedBox( - height: 20, - ), + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox( + height: 20, + ), - scheduleListByDate(), - // scheduleListByDate('Wednesday, 8 April '), - ], - ), - ], - ), - ], - ), + scheduleListByDate(model), + // scheduleListByDate('Wednesday, 8 April '), + ], + ), + ], ), - ); + ], + ), + ), + )); } - Column scheduleListByDate() { + Column scheduleListByDate(ScheduleViewModel model ) { return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ @@ -67,7 +58,7 @@ class MyScheduleScreen extends StatelessWidget { ), Container( child: Column( - children: scheduleProvider.listDoctorWorkingHoursTable.map((item) { + children: model.listDoctorWorkingHoursTable.map((item) { return MyScheduleWidget(workingHoursTable: item,); }).toList(), ), diff --git a/lib/widgets/shared/app_drawer_widget.dart b/lib/widgets/shared/app_drawer_widget.dart index d022b352..e899d6e8 100644 --- a/lib/widgets/shared/app_drawer_widget.dart +++ b/lib/widgets/shared/app_drawer_widget.dart @@ -1,20 +1,16 @@ import 'package:doctor_app_flutter/icons_app/doctor_app_icons.dart'; import 'package:doctor_app_flutter/providers/auth_provider.dart'; import 'package:doctor_app_flutter/util/helpers.dart'; +import 'package:doctor_app_flutter/util/translations_delegate_base.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; -import '../../config/shared_pref_kay.dart'; import '../../config/size_config.dart'; -import '../../providers/schedule_provider.dart'; import '../../routes.dart'; -import '../../screens/doctor/my_schedule_screen.dart'; import '../../util/dr_app_shared_pref.dart'; import '../../widgets/shared/drawer_item_widget.dart'; import '../../widgets/shared/rounded_container_widget.dart'; import 'app_texts_widget.dart'; -import 'package:doctor_app_flutter/models/doctor/doctor_profile_model.dart'; -import 'package:doctor_app_flutter/util/translations_delegate_base.dart'; DrAppSharedPreferances sharedPref = new DrAppSharedPreferances();