diff --git a/lib/features/book_appointments/book_appointments_repo.dart b/lib/features/book_appointments/book_appointments_repo.dart index 5a93879..f41fbc4 100644 --- a/lib/features/book_appointments/book_appointments_repo.dart +++ b/lib/features/book_appointments/book_appointments_repo.dart @@ -7,6 +7,7 @@ import 'package:hmg_patient_app_new/core/utils/date_util.dart'; import 'package:hmg_patient_app_new/features/book_appointments/models/resp_models/doctor_profile_response_model.dart'; import 'package:hmg_patient_app_new/features/book_appointments/models/resp_models/doctors_list_response_model.dart'; import 'package:hmg_patient_app_new/features/book_appointments/models/resp_models/get_clinic_list_response_model.dart'; +import 'package:hmg_patient_app_new/features/my_appointments/models/resp_models/hospital_model.dart'; import 'package:hmg_patient_app_new/features/my_appointments/models/resp_models/patient_appointment_history_response_model.dart'; import 'package:hmg_patient_app_new/services/logger_service.dart'; @@ -40,6 +41,9 @@ abstract class BookAppointmentsRepo { String? invoiceNoVP, Function(dynamic)? onSuccess, Function(String)? onError}); + + Future>>> + getProjectList(); } class BookAppointmentsRepoImp implements BookAppointmentsRepo { @@ -362,4 +366,47 @@ class BookAppointmentsRepoImp implements BookAppointmentsRepo { return Left(UnknownFailure(e.toString())); } } + + @override + Future>>> + getProjectList() async { + Map request = {}; + + try { + GenericApiModel>? apiResponse; + Failure? failure; + await apiClient.post( + GET_PROJECT_LIST, + body: request, + onFailure: (error, statusCode, {messageStatus, failureType}) { + failure = failureType; + }, + onSuccess: (response, statusCode, {messageStatus, errorMessage}) { + try { + final list = response['ListProject']; + + final appointmentsList = list + .map((item) => + HospitalsModel.fromJson(item as Map)) + .toList() + .cast(); + + apiResponse = GenericApiModel>( + messageStatus: messageStatus, + statusCode: statusCode, + errorMessage: null, + data: appointmentsList, + ); + } catch (e) { + failure = DataParsingFailure(e.toString()); + } + }, + ); + if (failure != null) return Left(failure!); + if (apiResponse == null) return Left(ServerFailure("Unknown error")); + return Right(apiResponse!); + } catch (e) { + return Left(UnknownFailure(e.toString())); + } + } } diff --git a/lib/features/book_appointments/book_appointments_view_model.dart b/lib/features/book_appointments/book_appointments_view_model.dart index 854b4fc..271db44 100644 --- a/lib/features/book_appointments/book_appointments_view_model.dart +++ b/lib/features/book_appointments/book_appointments_view_model.dart @@ -1,8 +1,10 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:hmg_patient_app_new/core/app_state.dart'; +import 'package:hmg_patient_app_new/core/cache_consts.dart'; import 'package:hmg_patient_app_new/core/dependencies.dart'; import 'package:hmg_patient_app_new/core/utils/date_util.dart'; +import 'package:hmg_patient_app_new/core/utils/doctor_response_mapper.dart'; import 'package:hmg_patient_app_new/core/utils/loading_utils.dart'; import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; import 'package:hmg_patient_app_new/core/utils/utils.dart'; @@ -13,6 +15,8 @@ import 'package:hmg_patient_app_new/features/book_appointments/models/resp_model import 'package:hmg_patient_app_new/features/book_appointments/models/resp_models/doctors_list_response_model.dart'; import 'package:hmg_patient_app_new/features/book_appointments/models/resp_models/get_clinic_list_response_model.dart'; import 'package:hmg_patient_app_new/features/book_appointments/models/timeslots.dart'; +import 'package:hmg_patient_app_new/features/my_appointments/models/facility_selection.dart'; +import 'package:hmg_patient_app_new/features/my_appointments/models/resp_models/doctor_list_api_response.dart'; import 'package:hmg_patient_app_new/features/my_appointments/models/resp_models/patient_appointment_history_response_model.dart'; import 'package:hmg_patient_app_new/features/my_appointments/my_appointments_view_model.dart'; import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; @@ -21,6 +25,7 @@ import 'package:hmg_patient_app_new/services/error_handler_service.dart'; import 'package:hmg_patient_app_new/services/navigation_service.dart'; import 'package:hmg_patient_app_new/widgets/common_bottom_sheet.dart'; import 'package:hmg_patient_app_new/widgets/transitions/fade_page.dart'; +import 'package:location/location.dart' show Location; class BookAppointmentsViewModel extends ChangeNotifier { int selectedTabIndex = 0; @@ -60,6 +65,10 @@ class BookAppointmentsViewModel extends ChangeNotifier { MyAppointmentsViewModel myAppointmentsViewModel; late AppState _appState; + RegionList? hospitalList; + RegionList? filteredHospitalList; + FacilitySelection currentlySelectedFacility = FacilitySelection.ALL; + bool isRegionListLoading = false; BookAppointmentsViewModel({required this.bookAppointmentsRepo, required this.errorHandlerService, required this.navigationService, required this.myAppointmentsViewModel}); @@ -380,4 +389,84 @@ class BookAppointmentsViewModel extends ChangeNotifier { }, ); } + + Future getRegionMappedProjectList() async { + if(hospitalList != null && hospitalList!.registeredDoctorMap != null && hospitalList!.registeredDoctorMap!.isNotEmpty){ + filteredHospitalList = hospitalList; + return; + } + isRegionListLoading = true; + notifyListeners(); + final result = await bookAppointmentsRepo.getProjectList(); + + result.fold( + (failure) async => + await errorHandlerService.handleError(failure: failure), + (apiResponse) async { + if (apiResponse.messageStatus == 2) { + // dialogService.showErrorDialog(message: apiResponse.errorMessage!, onOkPressed: () {}); + } else if (apiResponse.messageStatus == 1) { + var projectList = apiResponse.data!; + hospitalList = await DoctorMapper.getMappedHospitals(projectList, + isArabic: false); + var lat = await Utils.getNumFromPrefs(CacheConst.userLat); + + var lng = await Utils.getNumFromPrefs(CacheConst.userLong); + var isLocationEnabled = (lat != 0) && (lng != 0); + hospitalList = + await DoctorMapper.sortList(isLocationEnabled, hospitalList!); + + isRegionListLoading = false; + filteredHospitalList = hospitalList; + notifyListeners(); + } + }, + ); + } + + void setSelectedFacility(FacilitySelection selection) { + currentlySelectedFacility = selection; + notifyListeners(); + } + + void filterHospitalListByString(String? value, String? selectedRegionId, bool isHMG) { + if(value ==null || value.isEmpty){ + filteredHospitalList = hospitalList; + } else { + filteredHospitalList = RegionList(); + + var list = isHMG + ? hospitalList?.registeredDoctorMap![selectedRegionId]!.hmgDoctorList + : hospitalList?.registeredDoctorMap![selectedRegionId]!.hmcDoctorList; + + if(list != null && list.isEmpty){ notifyListeners(); return;} + + var filteredList = list!.where((element) => + element.filterName!.toLowerCase().contains(value.toLowerCase()) + ).toList(); + var regionData = PatientDoctorAppointmentListByRegion(); + if(isHMG){ + regionData.hmgDoctorList = filteredList; + regionData.hmgSize = filteredList.length; + } else { + regionData.hmcDoctorList = filteredList; + regionData.hmcSize = filteredList.length; + } + + filteredHospitalList?.registeredDoctorMap = { + selectedRegionId! : regionData + }; + } + notifyListeners(); + } + + Future isLocationEnabled() async{ + return await Location().serviceEnabled(); + } + + bool getLocationStatus() { + bool isLocationAvaiable = false; + isLocationEnabled().then((value) => isLocationAvaiable = value); + return isLocationAvaiable; + } } diff --git a/lib/features/insurance/insurance_repo.dart b/lib/features/insurance/insurance_repo.dart index 874cc28..65f97ae 100644 --- a/lib/features/insurance/insurance_repo.dart +++ b/lib/features/insurance/insurance_repo.dart @@ -9,7 +9,7 @@ import 'package:hmg_patient_app_new/features/insurance/models/resp_models/patien import 'package:hmg_patient_app_new/services/logger_service.dart'; abstract class InsuranceRepo { - Future>>> getPatientInsuranceDetails({required String patientId}); + Future>>> getPatientInsuranceDetails(); Future>>> getPatientInsuranceCardHistory({required String patientId}); @@ -23,7 +23,7 @@ class InsuranceRepoImp implements InsuranceRepo { InsuranceRepoImp({required this.loggerService, required this.apiClient}); @override - Future>>> getPatientInsuranceDetails({required String patientId}) async { + Future>>> getPatientInsuranceDetails() async { Map mapDevice = {}; try { diff --git a/lib/features/insurance/insurance_view_model.dart b/lib/features/insurance/insurance_view_model.dart index 527c180..8319634 100644 --- a/lib/features/insurance/insurance_view_model.dart +++ b/lib/features/insurance/insurance_view_model.dart @@ -49,10 +49,13 @@ class InsuranceViewModel extends ChangeNotifier { } Future getPatientInsuranceDetails({Function(dynamic)? onSuccess, Function(String)? onError}) async { - final result = await insuranceRepo.getPatientInsuranceDetails(patientId: "1231755"); + final result = await insuranceRepo.getPatientInsuranceDetails(); result.fold( - (failure) async => await errorHandlerService.handleError(failure: failure), + // (failure) async => await errorHandlerService.handleError(failure: failure), + (failure) async { + isInsuranceLoading = false; + }, (apiResponse) { if (apiResponse.messageStatus == 2) { // dialogService.showErrorDialog(message: apiResponse.errorMessage!, onOkPressed: () {}); diff --git a/lib/features/medical_file/medical_file_repo.dart b/lib/features/medical_file/medical_file_repo.dart index affe564..bbb4fcd 100644 --- a/lib/features/medical_file/medical_file_repo.dart +++ b/lib/features/medical_file/medical_file_repo.dart @@ -91,13 +91,13 @@ class MedicalFileRepoImp implements MedicalFileRepo { // throw Exception("lab list is empty"); // } - final vaccinesList = list.map((item) => PatientSickLeavesResponseModel.fromJson(item as Map)).toList().cast(); + final sickLeavesList = list.map((item) => PatientSickLeavesResponseModel.fromJson(item as Map)).toList().cast(); apiResponse = GenericApiModel>( messageStatus: messageStatus, statusCode: statusCode, errorMessage: null, - data: vaccinesList, + data: sickLeavesList, ); } catch (e) { failure = DataParsingFailure(e.toString()); diff --git a/lib/features/medical_file/models/patient_sickleave_response_model.dart b/lib/features/medical_file/models/patient_sickleave_response_model.dart index b0381a8..3bf732c 100644 --- a/lib/features/medical_file/models/patient_sickleave_response_model.dart +++ b/lib/features/medical_file/models/patient_sickleave_response_model.dart @@ -14,7 +14,7 @@ class PatientSickLeavesResponseModel { num? actualDoctorRate; String? appointmentDate; String? clinicName; - double? decimalDoctorRate; + num? decimalDoctorRate; String? doctorImageURL; String? doctorName; num? doctorRate; @@ -32,7 +32,7 @@ class PatientSickLeavesResponseModel { String? isInOutPatientDescriptionN; bool? isLiveCareAppointment; dynamic medicalDirectorApprovedStatus; - int? noOfPatientsRate; + num? noOfPatientsRate; dynamic patientName; String? projectName; String? qR; diff --git a/lib/features/my_appointments/my_appointments_repo.dart b/lib/features/my_appointments/my_appointments_repo.dart index 44c3954..e4745cb 100644 --- a/lib/features/my_appointments/my_appointments_repo.dart +++ b/lib/features/my_appointments/my_appointments_repo.dart @@ -39,8 +39,7 @@ abstract class MyAppointmentsRepo { Future>>> getPatientDoctorsList(); - Future>>> - getProjectList(); + } class MyAppointmentsRepoImp implements MyAppointmentsRepo { @@ -496,47 +495,4 @@ class MyAppointmentsRepoImp implements MyAppointmentsRepo { return Left(UnknownFailure(e.toString())); } } - - @override - Future>>> - getProjectList() async { - Map request = {}; - - try { - GenericApiModel>? apiResponse; - Failure? failure; - await apiClient.post( - GET_PROJECT_LIST, - body: request, - onFailure: (error, statusCode, {messageStatus, failureType}) { - failure = failureType; - }, - onSuccess: (response, statusCode, {messageStatus, errorMessage}) { - try { - final list = response['ListProject']; - - final appointmentsList = list - .map((item) => - HospitalsModel.fromJson(item as Map)) - .toList() - .cast(); - - apiResponse = GenericApiModel>( - messageStatus: messageStatus, - statusCode: statusCode, - errorMessage: null, - data: appointmentsList, - ); - } catch (e) { - failure = DataParsingFailure(e.toString()); - } - }, - ); - if (failure != null) return Left(failure!); - if (apiResponse == null) return Left(ServerFailure("Unknown error")); - return Right(apiResponse!); - } catch (e) { - return Left(UnknownFailure(e.toString())); - } - } } diff --git a/lib/features/my_appointments/my_appointments_view_model.dart b/lib/features/my_appointments/my_appointments_view_model.dart index ce303de..779f2b6 100644 --- a/lib/features/my_appointments/my_appointments_view_model.dart +++ b/lib/features/my_appointments/my_appointments_view_model.dart @@ -1,19 +1,12 @@ import 'package:flutter/material.dart'; import 'package:hmg_patient_app_new/core/app_state.dart'; -import 'package:hmg_patient_app_new/core/cache_consts.dart' show CacheConst; -import 'package:hmg_patient_app_new/core/utils/utils.dart' show Utils; -import 'package:hmg_patient_app_new/features/my_appointments/models/facility_selection.dart'; -import 'package:hmg_patient_app_new/features/my_appointments/models/resp_models/doctor_list_api_response.dart' - show RegionList, PatientDoctorAppointmentListByRegion; import 'package:hmg_patient_app_new/features/my_appointments/models/resp_models/patient_appointment_history_response_model.dart'; import 'package:hmg_patient_app_new/features/my_appointments/models/resp_models/patient_appointment_share_response_model.dart'; import 'package:hmg_patient_app_new/features/my_appointments/my_appointments_repo.dart'; import 'package:hmg_patient_app_new/services/error_handler_service.dart'; -import 'package:location/location.dart' show Location; import '../../core/utils/doctor_response_mapper.dart' show DoctorMapper; - class MyAppointmentsViewModel extends ChangeNotifier { int selectedTabIndex = 0; @@ -26,35 +19,24 @@ class MyAppointmentsViewModel extends ChangeNotifier { bool isTimeLineAppointmentsLoading = false; bool isPatientMyDoctorsLoading = false; - List patientAppointmentsHistoryList = - []; + List patientAppointmentsHistoryList = []; - List - patientUpcomingAppointmentsHistoryList = []; - List - patientArrivedAppointmentsHistoryList = []; + List patientUpcomingAppointmentsHistoryList = []; + List patientArrivedAppointmentsHistoryList = []; - List patientTimelineAppointmentsList = - []; + List patientTimelineAppointmentsList = []; List patientMyDoctorsList = []; PatientAppointmentShareResponseModel? patientAppointmentShareResponseModel; - RegionList? hospitalList; - RegionList? filteredHospitalList; - FacilitySelection currentlySelectedFacility = FacilitySelection.ALL; - bool isRegionListLoading = false; - - MyAppointmentsViewModel( - {required this.myAppointmentsRepo, required this.errorHandlerService,required this.appState}); + MyAppointmentsViewModel({required this.myAppointmentsRepo, required this.errorHandlerService, required this.appState}); void onTabChange(int index) { selectedTabIndex = index; notifyListeners(); } - initAppointmentsViewModel() { patientAppointmentsHistoryList.clear(); patientUpcomingAppointmentsHistoryList.clear(); @@ -65,7 +47,6 @@ class MyAppointmentsViewModel extends ChangeNotifier { isAppointmentPatientShareLoading = true; isTimeLineAppointmentsLoading = true; isPatientMyDoctorsLoading = true; - isRegionListLoading = true; notifyListeners(); } @@ -89,8 +70,7 @@ class MyAppointmentsViewModel extends ChangeNotifier { notifyListeners(); } - setAppointmentReminder( - bool value, PatientAppointmentHistoryResponseModel item) { + setAppointmentReminder(bool value, PatientAppointmentHistoryResponseModel item) { int index = patientAppointmentsHistoryList.indexOf(item); if (index != -1) { patientAppointmentsHistoryList[index].hasReminder = value; @@ -98,18 +78,12 @@ class MyAppointmentsViewModel extends ChangeNotifier { } } - Future getPatientAppointments( - bool isActiveAppointment, bool isArrivedAppointments, - {Function(dynamic)? onSuccess, Function(String)? onError}) async { - final result = await myAppointmentsRepo.getPatientAppointments( - isActiveAppointment: isActiveAppointment, - isArrivedAppointments: isArrivedAppointments); - final resultArrived = await myAppointmentsRepo.getPatientAppointments( - isActiveAppointment: false, isArrivedAppointments: true); + Future getPatientAppointments(bool isActiveAppointment, bool isArrivedAppointments, {Function(dynamic)? onSuccess, Function(String)? onError}) async { + final result = await myAppointmentsRepo.getPatientAppointments(isActiveAppointment: isActiveAppointment, isArrivedAppointments: isArrivedAppointments); + final resultArrived = await myAppointmentsRepo.getPatientAppointments(isActiveAppointment: false, isArrivedAppointments: true); result.fold( - (failure) async => - await errorHandlerService.handleError(failure: failure), + (failure) async => await errorHandlerService.handleError(failure: failure), (apiResponse) { if (apiResponse.messageStatus == 2) { // dialogService.showErrorDialog(message: apiResponse.errorMessage!, onOkPressed: () {}); @@ -125,8 +99,7 @@ class MyAppointmentsViewModel extends ChangeNotifier { ); resultArrived.fold( - (failure) async => - await errorHandlerService.handleError(failure: failure), + (failure) async => await errorHandlerService.handleError(failure: failure), (apiResponse) { if (apiResponse.messageStatus == 2) { // dialogService.showErrorDialog(message: apiResponse.errorMessage!, onOkPressed: () {}); @@ -141,27 +114,19 @@ class MyAppointmentsViewModel extends ChangeNotifier { }, ); - patientAppointmentsHistoryList - .addAll(patientUpcomingAppointmentsHistoryList); - patientAppointmentsHistoryList - .addAll(patientArrivedAppointmentsHistoryList); + patientAppointmentsHistoryList.addAll(patientUpcomingAppointmentsHistoryList); + patientAppointmentsHistoryList.addAll(patientArrivedAppointmentsHistoryList); - print( - 'Upcoming Appointments: ${patientUpcomingAppointmentsHistoryList.length}'); - print( - 'Arrived Appointments: ${patientArrivedAppointmentsHistoryList.length}'); + print('Upcoming Appointments: ${patientUpcomingAppointmentsHistoryList.length}'); + print('Arrived Appointments: ${patientArrivedAppointmentsHistoryList.length}'); print('All Appointments: ${patientAppointmentsHistoryList.length}'); } - Future getPatientShareAppointment( - int projectID, int clinicID, String appointmentNo, - {Function(dynamic)? onSuccess, Function(String)? onError}) async { - final result = await myAppointmentsRepo.getPatientShareAppointment( - projectID: projectID, clinicID: clinicID, appointmentNo: appointmentNo); + Future getPatientShareAppointment(int projectID, int clinicID, String appointmentNo, {Function(dynamic)? onSuccess, Function(String)? onError}) async { + final result = await myAppointmentsRepo.getPatientShareAppointment(projectID: projectID, clinicID: clinicID, appointmentNo: appointmentNo); result.fold( - (failure) async => - await errorHandlerService.handleError(failure: failure), + (failure) async => await errorHandlerService.handleError(failure: failure), (apiResponse) { if (apiResponse.messageStatus == 2) { // dialogService.showErrorDialog(message: apiResponse.errorMessage!, onOkPressed: () {}); @@ -178,19 +143,11 @@ class MyAppointmentsViewModel extends ChangeNotifier { } Future addAdvanceNumberRequest( - {required String advanceNumber, - required String paymentReference, - required String appointmentNo, - Function(dynamic)? onSuccess, - Function(String)? onError}) async { - final result = await myAppointmentsRepo.addAdvanceNumberRequest( - advanceNumber: advanceNumber, - paymentReference: paymentReference, - appointmentNo: appointmentNo); + {required String advanceNumber, required String paymentReference, required String appointmentNo, Function(dynamic)? onSuccess, Function(String)? onError}) async { + final result = await myAppointmentsRepo.addAdvanceNumberRequest(advanceNumber: advanceNumber, paymentReference: paymentReference, appointmentNo: appointmentNo); result.fold( - (failure) async => - await errorHandlerService.handleError(failure: failure), + (failure) async => await errorHandlerService.handleError(failure: failure), (apiResponse) { if (apiResponse.messageStatus == 2) { // dialogService.showErrorDialog(message: apiResponse.errorMessage!, onOkPressed: () {}); @@ -205,21 +162,11 @@ class MyAppointmentsViewModel extends ChangeNotifier { } Future generateAppointmentQR( - {required int clinicID, - required int projectID, - required String appointmentNo, - required int isFollowUp, - Function(dynamic)? onSuccess, - Function(String)? onError}) async { - final result = await myAppointmentsRepo.generateAppointmentQR( - clinicID: clinicID, - projectID: projectID, - appointmentNo: appointmentNo, - isFollowUp: isFollowUp); + {required int clinicID, required int projectID, required String appointmentNo, required int isFollowUp, Function(dynamic)? onSuccess, Function(String)? onError}) async { + final result = await myAppointmentsRepo.generateAppointmentQR(clinicID: clinicID, projectID: projectID, appointmentNo: appointmentNo, isFollowUp: isFollowUp); result.fold( - (failure) async => - await errorHandlerService.handleError(failure: failure), + (failure) async => await errorHandlerService.handleError(failure: failure), (apiResponse) { if (apiResponse.messageStatus == 2) { // dialogService.showErrorDialog(message: apiResponse.errorMessage!, onOkPressed: () {}); @@ -233,18 +180,11 @@ class MyAppointmentsViewModel extends ChangeNotifier { ); } - Future cancelAppointment( - {required PatientAppointmentHistoryResponseModel - patientAppointmentHistoryResponseModel, - Function(dynamic)? onSuccess, - Function(String)? onError}) async { - final result = await myAppointmentsRepo.cancelAppointment( - patientAppointmentHistoryResponseModel: - patientAppointmentHistoryResponseModel); + Future cancelAppointment({required PatientAppointmentHistoryResponseModel patientAppointmentHistoryResponseModel, Function(dynamic)? onSuccess, Function(String)? onError}) async { + final result = await myAppointmentsRepo.cancelAppointment(patientAppointmentHistoryResponseModel: patientAppointmentHistoryResponseModel); result.fold( - (failure) async => - await errorHandlerService.handleError(failure: failure), + (failure) async => await errorHandlerService.handleError(failure: failure), (apiResponse) { if (apiResponse.messageStatus == 2) { onError!(apiResponse.errorMessage!); @@ -259,18 +199,11 @@ class MyAppointmentsViewModel extends ChangeNotifier { ); } - Future confirmAppointment( - {required PatientAppointmentHistoryResponseModel - patientAppointmentHistoryResponseModel, - Function(dynamic)? onSuccess, - Function(String)? onError}) async { - final result = await myAppointmentsRepo.confirmAppointment( - patientAppointmentHistoryResponseModel: - patientAppointmentHistoryResponseModel); + Future confirmAppointment({required PatientAppointmentHistoryResponseModel patientAppointmentHistoryResponseModel, Function(dynamic)? onSuccess, Function(String)? onError}) async { + final result = await myAppointmentsRepo.confirmAppointment(patientAppointmentHistoryResponseModel: patientAppointmentHistoryResponseModel); result.fold( - (failure) async => - await errorHandlerService.handleError(failure: failure), + (failure) async => await errorHandlerService.handleError(failure: failure), (apiResponse) { if (apiResponse.messageStatus == 2) { onError!(apiResponse.errorMessage!); @@ -307,8 +240,7 @@ class MyAppointmentsViewModel extends ChangeNotifier { patientType: patientType); result.fold( - (failure) async => - await errorHandlerService.handleError(failure: failure), + (failure) async => await errorHandlerService.handleError(failure: failure), (apiResponse) { if (apiResponse.messageStatus == 2) { // dialogService.showErrorDialog(message: apiResponse.errorMessage!, onOkPressed: () {}); @@ -323,21 +255,15 @@ class MyAppointmentsViewModel extends ChangeNotifier { } Future sendCheckInNfcRequest( - {required PatientAppointmentHistoryResponseModel - patientAppointmentHistoryResponseModel, + {required PatientAppointmentHistoryResponseModel patientAppointmentHistoryResponseModel, required String scannedCode, required int checkInType, Function(dynamic)? onSuccess, Function(String)? onError}) async { - final result = await myAppointmentsRepo.sendCheckInNfcRequest( - patientAppointmentHistoryResponseModel: - patientAppointmentHistoryResponseModel, - scannedCode: scannedCode, - checkInType: checkInType); + final result = await myAppointmentsRepo.sendCheckInNfcRequest(patientAppointmentHistoryResponseModel: patientAppointmentHistoryResponseModel, scannedCode: scannedCode, checkInType: checkInType); result.fold( - (failure) async => - await errorHandlerService.handleError(failure: failure), + (failure) async => await errorHandlerService.handleError(failure: failure), (apiResponse) { if (apiResponse.messageStatus == 2) { onError!(apiResponse.errorMessage!); @@ -352,13 +278,14 @@ class MyAppointmentsViewModel extends ChangeNotifier { ); } - Future getPatientMyDoctors( - {Function(dynamic)? onSuccess, Function(String)? onError}) async { + Future getPatientMyDoctors({Function(dynamic)? onSuccess, Function(String)? onError}) async { final result = await myAppointmentsRepo.getPatientDoctorsList(); result.fold( - (failure) async => - await errorHandlerService.handleError(failure: failure), + // (failure) async => await errorHandlerService.handleError(failure: failure), + (failure) async { + isPatientMyDoctorsLoading = false; + }, (apiResponse) { if (apiResponse.messageStatus == 2) { // dialogService.showErrorDialog(message: apiResponse.errorMessage!, onOkPressed: () {}); @@ -373,84 +300,4 @@ class MyAppointmentsViewModel extends ChangeNotifier { }, ); } - - Future getRegionMappedProjectList() async { - if(hospitalList != null && hospitalList!.registeredDoctorMap != null && hospitalList!.registeredDoctorMap!.isNotEmpty){ - filteredHospitalList = hospitalList; - return; - } - isRegionListLoading = true; - notifyListeners(); - final result = await myAppointmentsRepo.getProjectList(); - - result.fold( - (failure) async => - await errorHandlerService.handleError(failure: failure), - (apiResponse) async { - if (apiResponse.messageStatus == 2) { - // dialogService.showErrorDialog(message: apiResponse.errorMessage!, onOkPressed: () {}); - } else if (apiResponse.messageStatus == 1) { - var projectList = apiResponse.data!; - hospitalList = await DoctorMapper.getMappedHospitals(projectList, - isArabic: false); - var lat = await Utils.getNumFromPrefs(CacheConst.userLat); - - var lng = await Utils.getNumFromPrefs(CacheConst.userLong); - var isLocationEnabled = (lat != 0) && (lng != 0); - hospitalList = - await DoctorMapper.sortList(isLocationEnabled, hospitalList!); - - isRegionListLoading = false; - filteredHospitalList = hospitalList; - notifyListeners(); - } - }, - ); - } - - void setSelectedFacility(FacilitySelection selection) { - currentlySelectedFacility = selection; - notifyListeners(); - } - - void filterHospitalListByString(String? value, String? selectedRegionId, bool isHMG) { - if(value ==null || value.isEmpty){ - filteredHospitalList = hospitalList; - } else { - filteredHospitalList = RegionList(); - - var list = isHMG - ? hospitalList?.registeredDoctorMap![selectedRegionId]!.hmgDoctorList - : hospitalList?.registeredDoctorMap![selectedRegionId]!.hmcDoctorList; - - if(list != null && list.isEmpty){ notifyListeners(); return;} - - var filteredList = list!.where((element) => - element.filterName!.toLowerCase().contains(value.toLowerCase()) - ).toList(); - var regionData = PatientDoctorAppointmentListByRegion(); - if(isHMG){ - regionData.hmgDoctorList = filteredList; - regionData.hmgSize = filteredList.length; - } else { - regionData.hmcDoctorList = filteredList; - regionData.hmcSize = filteredList.length; - } - - filteredHospitalList?.registeredDoctorMap = { - selectedRegionId! : regionData - }; - } - notifyListeners(); - } - - Future isLocationEnabled() async{ - return await Location().serviceEnabled(); - } - - bool getLocationStatus() { - bool isLocationAvaiable = false; - isLocationEnabled().then((value) => isLocationAvaiable = value); - return isLocationAvaiable; - } } diff --git a/lib/features/prescriptions/prescriptions_view_model.dart b/lib/features/prescriptions/prescriptions_view_model.dart index 535d78f..f5f32a7 100644 --- a/lib/features/prescriptions/prescriptions_view_model.dart +++ b/lib/features/prescriptions/prescriptions_view_model.dart @@ -68,7 +68,10 @@ class PrescriptionsViewModel extends ChangeNotifier { final result = await prescriptionsRepo.getPatientPrescriptionOrders(patientId: "1231755"); result.fold( - (failure) async => await errorHandlerService.handleError(failure: failure), + // (failure) async => await errorHandlerService.handleError(failure: failure), + (failure) async { + isPrescriptionsOrdersLoading = false; + }, (apiResponse) { if (apiResponse.messageStatus == 2) { // dialogService.showErrorDialog(message: apiResponse.errorMessage!, onOkPressed: () {}); diff --git a/lib/presentation/appointments/widgets/faculity_selection/facility_type_selection_widget.dart b/lib/presentation/appointments/widgets/faculity_selection/facility_type_selection_widget.dart index 64af81e..e1ff677 100644 --- a/lib/presentation/appointments/widgets/faculity_selection/facility_type_selection_widget.dart +++ b/lib/presentation/appointments/widgets/faculity_selection/facility_type_selection_widget.dart @@ -5,6 +5,7 @@ import 'package:hmg_patient_app_new/core/app_assets.dart'; import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/features/book_appointments/book_appointments_view_model.dart'; import 'package:hmg_patient_app_new/features/my_appointments/appointment_via_region_viewmodel.dart'; import 'package:hmg_patient_app_new/features/my_appointments/models/facility_selection.dart'; import 'package:hmg_patient_app_new/features/my_appointments/my_appointments_view_model.dart' @@ -15,7 +16,7 @@ import 'package:hmg_patient_app_new/theme/colors.dart'; import 'package:provider/provider.dart' show Provider; class FacilityTypeSelectionWidget extends StatelessWidget { - late MyAppointmentsViewModel myAppointmentsViewModel; + late BookAppointmentsViewModel bookAppointmentViewModel; late AppointmentViaRegionViewmodel regionalViewModel; final String selectedRegion; @@ -23,7 +24,7 @@ class FacilityTypeSelectionWidget extends StatelessWidget { @override Widget build(BuildContext context) { - myAppointmentsViewModel = Provider.of(context); + bookAppointmentViewModel = Provider.of(context); regionalViewModel = Provider.of(context); return Column( crossAxisAlignment: CrossAxisAlignment.start, @@ -50,7 +51,7 @@ class FacilityTypeSelectionWidget extends StatelessWidget { title: "HMG".needTranslation, subTitle: LocaleKeys.hospitalsWithCount.tr(namedArgs: { 'count': - "${myAppointmentsViewModel.hospitalList?.registeredDoctorMap?[selectedRegion]?.hmgSize ?? 0}" + "${bookAppointmentViewModel.hospitalList?.registeredDoctorMap?[selectedRegion]?.hmgSize ?? 0}" }), ).onPress( () { @@ -65,7 +66,7 @@ class FacilityTypeSelectionWidget extends StatelessWidget { title: "HMC".needTranslation, subTitle: LocaleKeys.medicalCentersWithCount.tr(namedArgs: { 'count': - "${myAppointmentsViewModel.hospitalList?.registeredDoctorMap?[selectedRegion]?.hmcSize ?? 0}" + "${bookAppointmentViewModel.hospitalList?.registeredDoctorMap?[selectedRegion]?.hmcSize ?? 0}" })).onPress( () { regionalViewModel.setFacility(FacilitySelection.HMC.name); diff --git a/lib/presentation/appointments/widgets/hospital_bottom_sheet/hospital_bottom_sheet_body.dart b/lib/presentation/appointments/widgets/hospital_bottom_sheet/hospital_bottom_sheet_body.dart index 803d75c..242c7ca 100644 --- a/lib/presentation/appointments/widgets/hospital_bottom_sheet/hospital_bottom_sheet_body.dart +++ b/lib/presentation/appointments/widgets/hospital_bottom_sheet/hospital_bottom_sheet_body.dart @@ -4,6 +4,7 @@ import 'package:flutter/material.dart'; import 'package:hmg_patient_app_new/core/enums.dart'; import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/features/book_appointments/book_appointments_view_model.dart'; import 'package:hmg_patient_app_new/features/my_appointments/appointment_via_region_viewmodel.dart'; import 'package:hmg_patient_app_new/features/my_appointments/models/facility_selection.dart'; import 'package:hmg_patient_app_new/features/my_appointments/my_appointments_view_model.dart'; @@ -16,7 +17,7 @@ import 'package:hmg_patient_app_new/widgets/input_widget.dart'; import 'package:provider/provider.dart'; class HospitalBottomSheetBody extends StatelessWidget { - late MyAppointmentsViewModel appointmentsViewModel; + late BookAppointmentsViewModel appointmentsViewModel; late AppointmentViaRegionViewmodel regionalViewModel; final TextEditingController searchText = TextEditingController(); @@ -24,7 +25,7 @@ class HospitalBottomSheetBody extends StatelessWidget { @override Widget build(BuildContext context) { - appointmentsViewModel = Provider.of(context); + appointmentsViewModel = Provider.of(context); regionalViewModel = Provider.of(context); return Column( crossAxisAlignment: CrossAxisAlignment.start, diff --git a/lib/presentation/appointments/widgets/hospital_bottom_sheet/type_selection_widget.dart b/lib/presentation/appointments/widgets/hospital_bottom_sheet/type_selection_widget.dart index 8f09e1a..b023f7a 100644 --- a/lib/presentation/appointments/widgets/hospital_bottom_sheet/type_selection_widget.dart +++ b/lib/presentation/appointments/widgets/hospital_bottom_sheet/type_selection_widget.dart @@ -2,6 +2,7 @@ import 'package:flutter/material.dart'; import 'package:hmg_patient_app_new/core/app_assets.dart'; import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/features/book_appointments/book_appointments_view_model.dart'; import 'package:hmg_patient_app_new/features/my_appointments/models/facility_selection.dart'; import 'package:hmg_patient_app_new/features/my_appointments/my_appointments_view_model.dart'; import 'package:hmg_patient_app_new/theme/colors.dart'; @@ -17,7 +18,7 @@ class TypeSelectionWidget extends StatelessWidget { @override Widget build(BuildContext context) { - return Consumer( + return Consumer( builder: (_, data, __) => Row( spacing: 8, mainAxisSize: MainAxisSize.max, diff --git a/lib/presentation/appointments/widgets/region_bottomsheet/region_list_widget.dart b/lib/presentation/appointments/widgets/region_bottomsheet/region_list_widget.dart index d68637b..180185f 100644 --- a/lib/presentation/appointments/widgets/region_bottomsheet/region_list_widget.dart +++ b/lib/presentation/appointments/widgets/region_bottomsheet/region_list_widget.dart @@ -4,6 +4,7 @@ import 'package:flutter/material.dart'; import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; import 'package:hmg_patient_app_new/core/utils/utils.dart' show Utils; import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/features/book_appointments/book_appointments_view_model.dart'; import 'package:hmg_patient_app_new/features/my_appointments/appointment_via_region_viewmodel.dart'; import 'package:hmg_patient_app_new/features/my_appointments/my_appointments_view_model.dart' show MyAppointmentsViewModel; @@ -20,7 +21,7 @@ class RegionBottomSheetBody extends StatefulWidget { } class _RegionBottomSheetBodyState extends State { - late MyAppointmentsViewModel myAppointmentsViewModel; + late BookAppointmentsViewModel myAppointmentsViewModel; late AppointmentViaRegionViewmodel regionalViewModel; @override @@ -33,9 +34,9 @@ class _RegionBottomSheetBodyState extends State { @override Widget build(BuildContext context) { - myAppointmentsViewModel = Provider.of(context); + myAppointmentsViewModel = Provider.of(context); regionalViewModel = Provider.of(context); - return Consumer( + return Consumer( builder: (context, myAppointmentsVM, child) { if (myAppointmentsVM.isRegionListLoading) { return Container( diff --git a/lib/presentation/medical_file/medical_file_page.dart b/lib/presentation/medical_file/medical_file_page.dart index 871a97c..acaf622 100644 --- a/lib/presentation/medical_file/medical_file_page.dart +++ b/lib/presentation/medical_file/medical_file_page.dart @@ -70,6 +70,7 @@ class _MedicalFilePageState extends State { insuranceViewModel.initInsuranceProvider(); medicalFileViewModel.setIsPatientSickLeaveListLoading(true); medicalFileViewModel.getPatientSickLeaveList(); + medicalFileViewModel.onTabChanged(0); } }); super.initState(); @@ -647,9 +648,14 @@ class _MedicalFilePageState extends State { Consumer(builder: (context, insuranceVM, child) { return insuranceVM.isInsuranceLoading ? const MoviesShimmerWidget().paddingSymmetrical(24.h, 0.0) - : PatientInsuranceCard( - insuranceCardDetailsModel: insuranceVM.patientInsuranceList.first, - isInsuranceExpired: DateTime.now().isAfter(DateUtil.convertStringToDate(insuranceVM.patientInsuranceList.first.cardValidTo))); + : insuranceVM.patientInsuranceList.isNotEmpty + ? PatientInsuranceCard( + insuranceCardDetailsModel: insuranceVM.patientInsuranceList.first, + isInsuranceExpired: DateTime.now().isAfter( + DateUtil.convertStringToDate(insuranceVM.patientInsuranceList.first.cardValidTo), + ), + ) + : SizedBox.shrink(); }), SizedBox(height: 10.h), GridView(