@ -1,6 +1,11 @@
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/dependencies.dart ' ;
import ' package:hmg_patient_app_new/core/utils/date_util.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 ' ;
import ' package:hmg_patient_app_new/extensions/string_extensions.dart ' ;
import ' package:hmg_patient_app_new/features/book_appointments/book_appointments_repo.dart ' ;
import ' package:hmg_patient_app_new/features/book_appointments/models/free_slot.dart ' ;
@ -8,7 +13,14 @@ 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/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 ' ;
import ' package:hmg_patient_app_new/presentation/home/navigation_screen.dart ' ;
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 ' ;
class BookAppointmentsViewModel extends ChangeNotifier {
int selectedTabIndex = 0 ;
@ -18,6 +30,8 @@ class BookAppointmentsViewModel extends ChangeNotifier {
bool isDoctorProfileLoading = false ;
bool isDoctorSearchByNameStarted = false ;
int initialSlotDuration = 0 ;
List < GetClinicsListResponseModel > clinicsList = [ ] ;
List < GetClinicsListResponseModel > _filteredClinicsList = [ ] ;
@ -42,8 +56,12 @@ class BookAppointmentsViewModel extends ChangeNotifier {
BookAppointmentsRepo bookAppointmentsRepo ;
ErrorHandlerService errorHandlerService ;
final NavigationService navigationService ;
MyAppointmentsViewModel myAppointmentsViewModel ;
late AppState _appState ;
BookAppointmentsViewModel ( { required this . bookAppointmentsRepo , required this . errorHandlerService } ) ;
BookAppointmentsViewModel ( { required this . bookAppointmentsRepo , required this . errorHandlerService , required this . navigationService , required this . myAppointmentsViewModel }) ;
void initializeFilteredList ( ) {
_filteredClinicsList = List . from ( clinicsList ) ;
@ -60,6 +78,7 @@ class BookAppointmentsViewModel extends ChangeNotifier {
}
initBookAppointmentViewModel ( ) {
_appState = getIt < AppState > ( ) ;
isClinicsListLoading = true ;
isDoctorsListLoading = true ;
isDoctorProfileLoading = true ;
@ -206,12 +225,13 @@ class BookAppointmentsViewModel extends ChangeNotifier {
onError ! ( apiResponse . errorMessage ? ? " Unknown error occurred " ) ;
/ / dialogService . showErrorDialog ( message: apiResponse . errorMessage ! , onOkPressed: ( ) { } ) ;
} else if ( apiResponse . messageStatus = = 1 ) {
if ( apiResponse . data = = null | | apiResponse . data ! . isEmpty ) {
if ( apiResponse . data [ ' FreeTimeSlots ' ] = = null | | apiResponse . data [ ' FreeTimeSlots ' ] . isEmpty ) {
onError ! ( " No free slots available " . tr ( ) ) ;
return ;
}
freeSlotsResponse = apiResponse . data ;
apiResponse . data ! . forEach ( ( element ) {
initialSlotDuration = apiResponse . data [ " InitialSlotDuration " ] ;
freeSlotsResponse = apiResponse . data [ ' FreeTimeSlots ' ] ;
freeSlotsResponse . forEach ( ( element ) {
/ / date = ( isLiveCareSchedule ! = null & & isLiveCareSchedule )
/ / ? DateUtil . convertStringToDate ( element )
/ / :
@ -228,4 +248,136 @@ class BookAppointmentsViewModel extends ChangeNotifier {
} ,
) ;
}
Future < void > cancelAppointment ( { required PatientAppointmentHistoryResponseModel patientAppointmentHistoryResponseModel , Function ( dynamic ) ? onSuccess , Function ( String ) ? onError } ) async {
final result = await bookAppointmentsRepo . cancelAppointment ( patientAppointmentHistoryResponseModel: patientAppointmentHistoryResponseModel ) ;
result . fold (
( failure ) async = > await errorHandlerService . handleError ( failure: failure ) ,
( apiResponse ) {
if ( apiResponse . messageStatus = = 2 ) {
onError ! ( apiResponse . errorMessage ! ) ;
/ / dialogService . showErrorDialog ( message: apiResponse . errorMessage ! , onOkPressed: ( ) { } ) ;
} else if ( apiResponse . messageStatus = = 1 ) {
notifyListeners ( ) ;
if ( onSuccess ! = null ) {
onSuccess ( apiResponse ) ;
}
}
} ,
) ;
}
/ / TODO: Handle the cases for LiveCare Schedule , Dental & Laser Clinics
Future < void > insertSpecificAppointment (
{
/ / required int docID ,
/ / required int clinicID ,
/ / required int projectID ,
/ / required String selectedTime ,
/ / required String selectedDate ,
/ / required int initialSlotDuration ,
/ / required int genderID ,
/ / required int userAge ,
String ? procedureID ,
num ? testTypeEnum ,
num ? testProcedureEnum ,
int ? invoiceNumber ,
int ? lineItemNo ,
String ? invoiceNoVP ,
Function ( dynamic p1 ) ? onSuccess ,
Function ( dynamic p1 ) ? onError } ) async {
_appState = getIt < AppState > ( ) ;
final result = await bookAppointmentsRepo . insertSpecificAppointment (
docID: selectedDoctor . doctorID ! ,
clinicID: selectedDoctor . clinicID ! ,
projectID: selectedDoctor . projectID ! ,
selectedDate: selectedAppointmentDate ,
selectedTime: selectedAppointmentTime ,
initialSlotDuration: initialSlotDuration ,
genderID: _appState . getAuthenticatedUser ( ) ! . gender ! ,
userAge: _appState . getAuthenticatedUser ( ) ! . age ! ,
onError: onError ) ;
result . fold (
( failure ) async {
print ( failure ) ;
} ,
( apiResponse ) {
if ( apiResponse . messageStatus = = 2 ) {
/ / onError ! ( apiResponse ) ;
LoadingUtils . hideFullScreenLoader ( ) ;
showCommonBottomSheetWithoutHeight (
title: LocaleKeys . notice . tr ( context: navigationService . navigatorKey . currentContext ! ) ,
navigationService . navigatorKey . currentContext ! ,
child: Utils . getWarningWidget (
loadingText: apiResponse . data [ " ErrorEndUserMessage " ] ,
isShowActionButtons: true ,
onCancelTap: ( ) {
navigationService . pop ( ) ;
} ,
onConfirmTap: ( ) async {
navigationService . pop ( ) ;
PatientAppointmentHistoryResponseModel patientAppointmentHistoryResponseModel = PatientAppointmentHistoryResponseModel (
appointmentNo: apiResponse . data [ " SameClinicApptList " ] [ 0 ] [ ' AppointmentNo ' ] ,
clinicID: apiResponse . data [ " SameClinicApptList " ] [ 0 ] [ ' ClinicID ' ] ,
projectID: apiResponse . data [ " SameClinicApptList " ] [ 0 ] [ ' ProjectID ' ] ,
endDate: apiResponse . data [ " SameClinicApptList " ] [ 0 ] [ ' EndTime ' ] ,
startTime: apiResponse . data [ " SameClinicApptList " ] [ 0 ] [ ' StartTime ' ] ,
doctorID: apiResponse . data [ " SameClinicApptList " ] [ 0 ] [ ' DoctorID ' ] ,
isLiveCareAppointment: apiResponse . data [ " SameClinicApptList " ] [ 0 ] [ ' IsLiveCareAppointment ' ] ,
originalClinicID: 0 ,
originalProjectID: 0 ,
appointmentDate: apiResponse . data [ " SameClinicApptList " ] [ 0 ] [ ' AppointmentDate ' ] ,
) ;
showCommonBottomSheet ( navigationService . navigatorKey . currentContext ! ,
child: Utils . getLoadingWidget ( loadingText: " Cancelling your previous appointment.... " . needTranslation ) ,
callBackFunc: ( str ) { } ,
title: " " ,
height: ResponsiveExtension . screenHeight * 0.3 ,
isCloseButtonVisible: false ,
isDismissible: false ,
isFullScreen: false ) ;
await cancelAppointment ( patientAppointmentHistoryResponseModel: patientAppointmentHistoryResponseModel ) . then ( ( val ) async {
navigationService . pop ( ) ;
Future . delayed ( Duration ( milliseconds: 50 ) ) . then ( ( value ) async { } ) ;
LoadingUtils . showFullScreenLoader ( barrierDismissible: true , isSuccessDialog: false , loadingText: " Booking your appointment... " . needTranslation ) ;
await insertSpecificAppointment (
onError: ( err ) { } ,
onSuccess: ( apiResp ) async {
LoadingUtils . hideFullScreenLoader ( ) ;
await Future . delayed ( Duration ( milliseconds: 50 ) ) . then ( ( value ) async {
LoadingUtils . showFullScreenLoader ( barrierDismissible: true , isSuccessDialog: true , loadingText: LocaleKeys . appointmentSuccess . tr ( ) ) ;
await Future . delayed ( Duration ( milliseconds: 4000 ) ) . then ( ( value ) {
LoadingUtils . hideFullScreenLoader ( ) ;
Navigator . pushAndRemoveUntil (
navigationService . navigatorKey . currentContext ! ,
FadePage (
page: LandingNavigation ( ) ,
) ,
( r ) = > false ) ;
} ) ;
} ) ;
} ) ;
} ) ;
} ) ,
callBackFunc: ( ) { } ,
isFullScreen: false ,
isCloseButtonVisible: true ,
) ;
} else if ( apiResponse . messageStatus = = 1 ) {
if ( apiResponse . data = = null | | apiResponse . data ! . isEmpty ) {
onError ! ( " No free slots available " . tr ( ) ) ;
return ;
}
notifyListeners ( ) ;
if ( onSuccess ! = null ) {
onSuccess ( apiResponse ) ;
}
}
} ,
) ;
}
}