You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			271 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			Dart
		
	
			
		
		
	
	
			271 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			Dart
		
	
| import 'package:easy_localization/easy_localization.dart';
 | |
| import 'package:flutter/material.dart';
 | |
| import 'package:hmg_patient_app_new/core/app_assets.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/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/extensions/widget_extensions.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/features/my_appointments/utils/appointment_type.dart';
 | |
| import 'package:hmg_patient_app_new/generated/locale_keys.g.dart';
 | |
| import 'package:hmg_patient_app_new/presentation/appointments/appointment_details_page.dart';
 | |
| import 'package:hmg_patient_app_new/theme/colors.dart';
 | |
| import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart';
 | |
| import 'package:hmg_patient_app_new/widgets/chip/app_custom_chip_widget.dart';
 | |
| import 'package:hmg_patient_app_new/widgets/transitions/fade_page.dart';
 | |
| import 'package:smooth_corner/smooth_corner.dart';
 | |
| 
 | |
| class AppointmentCard extends StatefulWidget {
 | |
|   AppointmentCard({super.key, required this.patientAppointmentHistoryResponseModel, required this.myAppointmentsViewModel, this.isLoading = false});
 | |
| 
 | |
|   PatientAppointmentHistoryResponseModel patientAppointmentHistoryResponseModel;
 | |
|   MyAppointmentsViewModel myAppointmentsViewModel;
 | |
|   bool isLoading;
 | |
| 
 | |
|   @override
 | |
|   State<AppointmentCard> createState() => _AppointmentCardState();
 | |
| }
 | |
| 
 | |
| class _AppointmentCardState extends State<AppointmentCard> {
 | |
|   @override
 | |
|   Widget build(BuildContext context) {
 | |
|     AppState appState = getIt.get<AppState>();
 | |
|     return InkWell(
 | |
|       onTap: () {
 | |
|         Navigator.of(context)
 | |
|             .push(
 | |
|           FadePage(
 | |
|             page: AppointmentDetailsPage(patientAppointmentHistoryResponseModel: widget.patientAppointmentHistoryResponseModel),
 | |
|           ),
 | |
|         )
 | |
|             .then((val) {
 | |
|           widget.myAppointmentsViewModel.initAppointmentsViewModel();
 | |
|           widget.myAppointmentsViewModel.getPatientAppointments(true, false);
 | |
|         });
 | |
|       },
 | |
|       child: Padding(
 | |
|         padding: EdgeInsets.all(14.h),
 | |
|         child: Column(
 | |
|           crossAxisAlignment: CrossAxisAlignment.start,
 | |
|           children: [
 | |
|             Row(
 | |
|               mainAxisAlignment: MainAxisAlignment.spaceBetween,
 | |
|               children: [
 | |
|                 Expanded(
 | |
|                   child: Wrap(
 | |
|                     alignment: WrapAlignment.start,
 | |
|                     direction: Axis.horizontal,
 | |
|                     spacing: 6.h,
 | |
|                     runSpacing: 6.h,
 | |
|                     children: [
 | |
|                       Row(
 | |
|                         mainAxisSize: MainAxisSize.min,
 | |
|                         children: [
 | |
|                           CustomButton(
 | |
|                             text: appState.isArabic()
 | |
|                                 ? widget.patientAppointmentHistoryResponseModel.isInOutPatientDescriptionN!
 | |
|                                 : widget.patientAppointmentHistoryResponseModel.isInOutPatientDescription!,
 | |
|                             onPressed: () {},
 | |
|                             backgroundColor: AppColors.primaryRedColor.withOpacity(0.1),
 | |
|                             borderColor: AppColors.primaryRedColor.withOpacity(0.0),
 | |
|                             textColor: AppColors.primaryRedColor,
 | |
|                             fontSize: 10,
 | |
|                             fontWeight: FontWeight.w500,
 | |
|                             borderRadius: 8,
 | |
|                             padding: EdgeInsets.fromLTRB(10, 0, 10, 0),
 | |
|                             height: 30.h,
 | |
|                           ),
 | |
|                         ],
 | |
|                       ),
 | |
|                       Row(
 | |
|                         mainAxisSize: MainAxisSize.min,
 | |
|                         children: [
 | |
|                           CustomButton(
 | |
|                             text: AppointmentType.getAppointmentStatusType(widget.patientAppointmentHistoryResponseModel.patientStatusType!),
 | |
|                             onPressed: () {},
 | |
|                             backgroundColor: AppColors.successColor.withOpacity(0.1),
 | |
|                             borderColor: AppColors.successColor.withOpacity(0.0),
 | |
|                             textColor: AppColors.successColor,
 | |
|                             fontSize: 10,
 | |
|                             fontWeight: FontWeight.w500,
 | |
|                             borderRadius: 8,
 | |
|                             padding: EdgeInsets.fromLTRB(10, 0, 10, 0),
 | |
|                             height: 30.h,
 | |
|                           ),
 | |
|                         ],
 | |
|                       ),
 | |
|                     ],
 | |
|                   ),
 | |
|                 ),
 | |
|                 // TODO: Implement the logic to enable/disable the switch based on reminder status
 | |
|                 AppointmentType.isArrived(widget.patientAppointmentHistoryResponseModel)
 | |
|                     ? SizedBox()
 | |
|                     : Switch(
 | |
|                         activeColor: AppColors.successColor,
 | |
|                         activeTrackColor: AppColors.successColor.withValues(alpha: .15),
 | |
|                         thumbIcon: WidgetStateProperty.resolveWith<Icon?>(
 | |
|                           (Set<WidgetState> states) {
 | |
|                             if (states.contains(WidgetState.selected)) {
 | |
|                               return const Icon(Icons.check); // Icon when switch is ON
 | |
|                             }
 | |
|                             return const Icon(Icons.close); // Icon when switch is OFF
 | |
|                           },
 | |
|                         ),
 | |
|                         value: widget.patientAppointmentHistoryResponseModel.hasReminder!,
 | |
|                         onChanged: (newValue) {
 | |
|                           setState(() {
 | |
|                             widget.myAppointmentsViewModel.setAppointmentReminder(newValue, widget.patientAppointmentHistoryResponseModel);
 | |
|                           });
 | |
|                         },
 | |
|                       ),
 | |
|               ],
 | |
|             ),
 | |
|             SizedBox(height: 16.h),
 | |
|             Row(
 | |
|               crossAxisAlignment: CrossAxisAlignment.start,
 | |
|               children: [
 | |
|                 Image.network(
 | |
|                   widget.patientAppointmentHistoryResponseModel.doctorImageURL!,
 | |
|                   width: 63.h,
 | |
|                   height: 63.h,
 | |
|                   fit: BoxFit.fill,
 | |
|                 ).circle(100),
 | |
|                 SizedBox(width: 16.h),
 | |
|                 Expanded(
 | |
|                   child: Column(
 | |
|                     crossAxisAlignment: CrossAxisAlignment.start,
 | |
|                     children: [
 | |
|                       widget.patientAppointmentHistoryResponseModel.doctorNameObj!.toText16(isBold: true),
 | |
|                       Wrap(
 | |
|                         direction: Axis.horizontal,
 | |
|                         spacing: 3.h,
 | |
|                         runSpacing: 4.h,
 | |
|                         children: [
 | |
|                           AppCustomChipWidget(labelText: widget.patientAppointmentHistoryResponseModel.clinicName!),
 | |
|                           AppCustomChipWidget(labelText: widget.patientAppointmentHistoryResponseModel.projectName!),
 | |
|                           AppCustomChipWidget(
 | |
|                               icon: AppAssets.appointment_calendar_icon,
 | |
|                               labelText: DateUtil.formatDateToDate(DateUtil.convertStringToDate(widget.patientAppointmentHistoryResponseModel.appointmentDate), false)),
 | |
|                           AppCustomChipWidget(
 | |
|                               icon: AppAssets.appointment_time_icon,
 | |
|                               labelText: DateUtil.formatDateToTimeLang(DateUtil.convertStringToDate(widget.patientAppointmentHistoryResponseModel.appointmentDate), false)),
 | |
|                         ],
 | |
|                       ),
 | |
|                     ],
 | |
|                   ),
 | |
|                 ),
 | |
|               ],
 | |
|             ),
 | |
|             SizedBox(height: 16.h),
 | |
|             Row(
 | |
|               children: [
 | |
|                 Expanded(
 | |
|                   flex: 6,
 | |
|                   child: AppointmentType.isArrived(widget.patientAppointmentHistoryResponseModel)
 | |
|                       ? getArrivedAppointmentButton()
 | |
|                       : CustomButton(
 | |
|                           text: AppointmentType.getNextActionText(widget.patientAppointmentHistoryResponseModel.nextAction),
 | |
|                           onPressed: () {
 | |
|                             Navigator.of(context)
 | |
|                                 .push(FadePage(
 | |
|                               page: AppointmentDetailsPage(patientAppointmentHistoryResponseModel: widget.patientAppointmentHistoryResponseModel),
 | |
|                             ))
 | |
|                                 .then((val) {
 | |
|                               widget.myAppointmentsViewModel.initAppointmentsViewModel();
 | |
|                               widget.myAppointmentsViewModel.getPatientAppointments(true, false);
 | |
|                             });
 | |
|                           },
 | |
|                           backgroundColor: AppointmentType.getNextActionButtonColor(widget.patientAppointmentHistoryResponseModel.nextAction).withOpacity(0.15),
 | |
|                           borderColor: AppointmentType.getNextActionButtonColor(widget.patientAppointmentHistoryResponseModel.nextAction).withOpacity(0.01),
 | |
|                           textColor: AppointmentType.getNextActionTextColor(widget.patientAppointmentHistoryResponseModel.nextAction),
 | |
|                           fontSize: 14,
 | |
|                           fontWeight: FontWeight.w500,
 | |
|                           borderRadius: 12,
 | |
|                           padding: EdgeInsets.fromLTRB(10, 0, 10, 0),
 | |
|                           height: 40.h,
 | |
|                           icon: AppointmentType.getNextActionIcon(widget.patientAppointmentHistoryResponseModel.nextAction),
 | |
|                           iconColor: AppointmentType.getNextActionTextColor(widget.patientAppointmentHistoryResponseModel.nextAction),
 | |
|                           iconSize: 14.h,
 | |
|                         ),
 | |
|                 ),
 | |
|                 SizedBox(width: 8.h),
 | |
|                 Expanded(
 | |
|                   flex: 1,
 | |
|                   child: Container(
 | |
|                     height: 40.h,
 | |
|                     width: 40.h,
 | |
|                     decoration: RoundedRectangleBorder().toSmoothCornerDecoration(
 | |
|                       color: AppColors.textColor,
 | |
|                       borderRadius: 10.h,
 | |
|                     ),
 | |
|                     child: Padding(
 | |
|                       padding: EdgeInsets.all(10.h),
 | |
|                       child: Utils.buildSvgWithAssets(
 | |
|                         icon: AppAssets.forward_arrow_icon,
 | |
|                         width: 10.h,
 | |
|                         height: 10.h,
 | |
|                         fit: BoxFit.contain,
 | |
|                       ),
 | |
|                     ),
 | |
|                   ).onPress(() {
 | |
|                     Navigator.of(context)
 | |
|                         .push(
 | |
|                       FadePage(
 | |
|                         page: AppointmentDetailsPage(patientAppointmentHistoryResponseModel: widget.patientAppointmentHistoryResponseModel),
 | |
|                       ),
 | |
|                     )
 | |
|                         .then((val) {
 | |
|                       widget.myAppointmentsViewModel.initAppointmentsViewModel();
 | |
|                       widget.myAppointmentsViewModel.getPatientAppointments(true, false);
 | |
|                     });
 | |
|                   }),
 | |
|                 ),
 | |
|               ],
 | |
|             ),
 | |
|           ],
 | |
|         ),
 | |
|       ),
 | |
|     );
 | |
|   }
 | |
| 
 | |
|   Widget getArrivedAppointmentButton() {
 | |
|     return DateTime.now().difference(DateUtil.convertStringToDate(widget.patientAppointmentHistoryResponseModel.appointmentDate)).inDays <= 15
 | |
|         ? CustomButton(
 | |
|             text: LocaleKeys.askDoctor.tr(context: context),
 | |
|             onPressed: () {},
 | |
|             backgroundColor: AppColors.secondaryLightRedColor,
 | |
|             borderColor: AppColors.secondaryLightRedColor,
 | |
|             textColor: AppColors.primaryRedColor,
 | |
|             fontSize: 14,
 | |
|             fontWeight: FontWeight.w500,
 | |
|             borderRadius: 12,
 | |
|             padding: EdgeInsets.fromLTRB(10, 0, 10, 0),
 | |
|             height: 40.h,
 | |
|             icon: AppAssets.ask_doctor_icon,
 | |
|             iconColor: AppColors.primaryRedColor,
 | |
|             iconSize: 16.h,
 | |
|           )
 | |
|         : CustomButton(
 | |
|             text: "Rebook with same doctor".needTranslation,
 | |
|             onPressed: () {},
 | |
|             backgroundColor: AppColors.greyColor,
 | |
|             borderColor: AppColors.greyColor,
 | |
|             textColor: AppColors.blackColor,
 | |
|             fontSize: 14,
 | |
|             fontWeight: FontWeight.w500,
 | |
|             borderRadius: 12,
 | |
|             padding: EdgeInsets.fromLTRB(10, 0, 10, 0),
 | |
|             height: 40.h,
 | |
|             icon: AppAssets.rebook_appointment_icon,
 | |
|             iconColor: AppColors.blackColor,
 | |
|             iconSize: 16.h,
 | |
|           );
 | |
|   }
 | |
| 
 | |
|   void performAppointmentNextAction(nextAction) {}
 | |
| }
 |