prescription reminder bottom sheet added.

pull/19/head
Sikander Saleem 2 months ago
parent 43fa08b8b6
commit cb4601050c

@ -0,0 +1,4 @@
<svg width="25" height="24" viewBox="0 0 25 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M12.5 1.25C8.04419 1.25 4.42789 4.84151 4.42786 9.27697C4.42776 10.3087 4.35838 11.0873 3.88271 11.7872C3.81656 11.8831 3.72879 12.0032 3.63289 12.1345C3.46634 12.3625 3.27527 12.624 3.13033 12.8505C2.87452 13.2503 2.62459 13.7324 2.53868 14.2942C2.25836 16.127 3.55056 17.3136 4.83746 17.8454C9.37016 19.7182 15.6298 19.7182 20.1625 17.8454C21.4494 17.3136 22.7416 16.127 22.4613 14.2942C22.3754 13.7324 22.1255 13.2503 21.8697 12.8505C21.7247 12.624 21.5337 12.3625 21.3671 12.1345C21.2712 12.0033 21.1835 11.8832 21.1173 11.7873C20.6416 11.0874 20.5722 10.3088 20.5721 9.27703C20.5721 4.84155 16.9558 1.25 12.5 1.25Z" fill="white"/>
<path d="M12.4985 22.7477C13.5187 22.7477 14.4742 22.4563 15.2776 21.9511C15.9906 21.5027 16.3472 21.2785 16.2224 20.9057C16.0976 20.533 15.6057 20.5747 14.6217 20.6582C13.2146 20.7776 11.7824 20.7776 10.3752 20.6582C9.39126 20.5747 8.8993 20.533 8.77454 20.9057C8.64977 21.2784 9.0063 21.5027 9.71934 21.9511C10.5227 22.4563 11.4782 22.7477 12.4985 22.7477Z" fill="white"/>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

@ -13,6 +13,7 @@ class AppAssets {
static const String email = '$svgBasePath/email.svg';
static const String globe = '$svgBasePath/globe.svg';
static const String cancel = '$svgBasePath/cancel.svg';
static const String bell = '$svgBasePath/bell.svg';
static const String login1 = '$svgBasePath/login1.svg';
static const String tamara = '$svgBasePath/tamara.svg';
static const String confirm = '$svgBasePath/confirm.svg';

@ -7,6 +7,7 @@ import 'package:device_calendar/device_calendar.dart';
import 'package:flutter/widgets.dart';
import 'package:hmg_patient_app_new/extensions/string_extensions.dart';
import 'package:hmg_patient_app_new/services/permission_service.dart';
import 'package:hmg_patient_app_new/widgets/common_bottom_sheet.dart';
import 'package:jiffy/jiffy.dart';
import 'package:manage_calendar_events/manage_calendar_events.dart' as ios;
import 'package:permission_handler/permission_handler.dart';
@ -54,88 +55,100 @@ class CalendarUtils {
return permissionResults;
}
// showReminderDialog(BuildContext context, DateTime dateTime, String doctorName, String eventId, String appoDateFormatted, String appoTimeFormatted,
// {required Function() onSuccess, String? title, String? description, Function(int)? onMultiDateSuccess, bool isMultiAllowed = false}) async {
// if (Platform.isAndroid) {
// if (await PermissionService.isCalendarPermissionEnabled()) {
// _showReminderDialog(context, dateTime, doctorName, eventId, appoDateFormatted, appoTimeFormatted,
// onSuccess: onSuccess, title: title, description: description, onMultiDateSuccess: onMultiDateSuccess, isMultiAllowed: isMultiAllowed);
// } else {
// // Utils.showPermissionConsentDialog(context, TranslationBase.of(context).calendarPermission, () async {
// // if (await Permission.calendarFullAccess.request().isGranted) {
// // _showReminderDialog(context, dateTime, doctorName, eventId, appoDateFormatted, appoTimeFormatted,
// // onSuccess: onSuccess, title: title, description: description, onMultiDateSuccess: onMultiDateSuccess, isMultiAllowed: isMultiAllowed);
// // }
// // });
// }
// } else {
// if (await Permission.calendarWriteOnly.request().isGranted) {
// if (await Permission.calendarFullAccess.request().isGranted) {
// _showReminderDialog(context, dateTime, doctorName, eventId, appoDateFormatted, appoTimeFormatted,
// onSuccess: onSuccess, title: title, description: description, onMultiDateSuccess: onMultiDateSuccess, isMultiAllowed: isMultiAllowed);
// }
// }
// }
// }
showReminderDialog(BuildContext context, DateTime dateTime, String doctorName, String eventId, String appoDateFormatted, String appoTimeFormatted,
{required Function() onSuccess, String? title, String? description, Function(int)? onMultiDateSuccess, bool isMultiAllowed = false}) async {
if (Platform.isAndroid) {
if (await PermissionService.isCalendarPermissionEnabled()) {
_showReminderBottomSheet(context, dateTime, doctorName, eventId, appoDateFormatted, appoTimeFormatted,
onSuccess: onSuccess, title: title, description: description, onMultiDateSuccess: onMultiDateSuccess, isMultiAllowed: isMultiAllowed);
} else {
// Utils.showPermissionConsentDialog(context, TranslationBase.of(context).calendarPermission, () async {
// if (await Permission.calendarFullAccess.request().isGranted) {
// _showReminderDialog(context, dateTime, doctorName, eventId, appoDateFormatted, appoTimeFormatted,
// onSuccess: onSuccess, title: title, description: description, onMultiDateSuccess: onMultiDateSuccess, isMultiAllowed: isMultiAllowed);
// }
// });
}
} else {
if (await Permission.calendarWriteOnly.request().isGranted) {
if (await Permission.calendarFullAccess.request().isGranted) {
_showReminderBottomSheet(context, dateTime, doctorName, eventId, appoDateFormatted, appoTimeFormatted,
onSuccess: onSuccess, title: title, description: description, onMultiDateSuccess: onMultiDateSuccess, isMultiAllowed: isMultiAllowed);
}
}
}
}
// Future<void> _showReminderDialog(BuildContext providedContext, DateTime dateTime, String doctorName, String eventId, String appoDateFormatted, String appoTimeFormatted,
// {required Function onSuccess, String? title, String? description, Function(int)? onMultiDateSuccess, bool? isMultiAllowed}) async {
// return showDialog<void>(
// context: providedContext,
// barrierDismissible: true, // user must tap button!
// builder: (BuildContext context) {
// return Dialog(
// shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(0.0)),
// insetPadding: EdgeInsets.all(21),
// child: ReminderDialog(
// onClick: (int i) async {
// String text = "";
// if (i == 0) {
// // Before 30 mints
// dateTime = Jiffy.parseFromDateTime(dateTime).subtract(minutes: 30).dateTime;
// text = "30 minutes";
// // dateTime.add(new Duration(minutes: -30));
// } else if (i == 1) {
// // Before 1 hour
// // dateTime.add(new Duration(minutes: -60));
// dateTime = Jiffy.parseFromDateTime(dateTime).subtract(hours: 1).dateTime;
// text = "1 hours";
// } else if (i == 2) {
// // Before 1 hour and 30 mints
// // dateTime.add(new Duration(minutes: -90));
// dateTime = Jiffy.parseFromDateTime(dateTime).subtract(hours: 1, minutes: 30).dateTime;
// text = "1 hours 30 minutes";
// } else if (i == 3) {
// // Before 2 hours
// // dateTime.add(new Duration(minutes: -120));
// dateTime = Jiffy.parseFromDateTime(dateTime).subtract(hours: 2).dateTime;
// text = "2 hours";
// }
// if (!isMultiAllowed!) {
// if (onMultiDateSuccess == null) {
// CalendarUtils calendarUtils = await CalendarUtils.getInstance();
// await calendarUtils.createOrUpdateEvent(
// title: title ?? "TranslationBase.of(providedContext).reminderTitle".needTranslation + " " + doctorName,
// description: description ?? "At " + appoDateFormatted + " " + appoTimeFormatted,
// scheduleDateTime: dateTime,
// eventId: eventId, location: '');
// onSuccess();
// }
// } else {
// onMultiDateSuccess!(i);
// }
// // await _analytics.logEvent(
// // name: name.trim().toLowerCase(),
// // parameters: safeParameters,
// // );
// // todo @sikander discuss analytics for reminder
// // locator<GAnalytics>().appointment.appointment_reminder_time(reminde_before: text);
// },
// ),
// );
// },
// );
// }
Future<void> _showReminderBottomSheet(BuildContext providedContext, DateTime dateTime, String doctorName, String eventId, String appoDateFormatted, String appoTimeFormatted,
{required Function onSuccess, String? title, String? description, Function(int)? onMultiDateSuccess, bool? isMultiAllowed}) async {
showCommonBottomSheet(
providedContext,
child: Column(children: [
],),
callBackFunc: () {},
title: "",
isCloseButtonVisible: false,
isFullScreen: false, height: null,
);
// return showDialog<void>(
// context: providedContext,
// barrierDismissible: true, // user must tap button!
// builder: (BuildContext context) {
// return Dialog(
// shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(0.0)),
// insetPadding: EdgeInsets.all(21),
// child: ReminderDialog(
// onClick: (int i) async {
// String text = "";
// if (i == 0) {
// // Before 30 mints
// dateTime = Jiffy.parseFromDateTime(dateTime).subtract(minutes: 30).dateTime;
// text = "30 minutes";
// // dateTime.add(new Duration(minutes: -30));
// } else if (i == 1) {
// // Before 1 hour
// // dateTime.add(new Duration(minutes: -60));
// dateTime = Jiffy.parseFromDateTime(dateTime).subtract(hours: 1).dateTime;
// text = "1 hours";
// } else if (i == 2) {
// // Before 1 hour and 30 mints
// // dateTime.add(new Duration(minutes: -90));
// dateTime = Jiffy.parseFromDateTime(dateTime).subtract(hours: 1, minutes: 30).dateTime;
// text = "1 hours 30 minutes";
// } else if (i == 3) {
// // Before 2 hours
// // dateTime.add(new Duration(minutes: -120));
// dateTime = Jiffy.parseFromDateTime(dateTime).subtract(hours: 2).dateTime;
// text = "2 hours";
// }
// if (!isMultiAllowed!) {
// if (onMultiDateSuccess == null) {
// CalendarUtils calendarUtils = await CalendarUtils.getInstance();
// await calendarUtils.createOrUpdateEvent(
// title: title ?? "TranslationBase.of(providedContext).reminderTitle".needTranslation + " " + doctorName,
// description: description ?? "At " + appoDateFormatted + " " + appoTimeFormatted,
// scheduleDateTime: dateTime,
// eventId: eventId,
// location: '');
// onSuccess();
// }
// } else {
// onMultiDateSuccess!(i);
// }
// // await _analytics.logEvent(
// // name: name.trim().toLowerCase(),
// // parameters: safeParameters,
// // );
// // todo @sikander discuss analytics for reminder
// // locator<GAnalytics>().appointment.appointment_reminder_time(reminde_before: text);
// },
// ),
// );
// },
// );
}
static Future<CalendarUtils> getInstance() async {
tzl.initializeTimeZones();

@ -203,9 +203,9 @@ extension EmailValidator on String {
style: TextStyle(fontSize: 19.fSize, fontWeight: isBold ? FontWeight.bold : FontWeight.normal, color: color ?? AppColors.blackColor, letterSpacing: -0.4),
);
Widget toText20({Color? color, bool isBold = false}) => Text(
Widget toText20({Color? color,FontWeight? weight, bool isBold = false}) => Text(
this,
style: TextStyle(fontSize: 20.fSize, fontWeight: isBold ? FontWeight.bold : FontWeight.normal, color: color ?? AppColors.blackColor, letterSpacing: -0.4),
style: TextStyle(fontSize: 20.fSize, fontWeight: weight ?? (isBold ? FontWeight.bold : FontWeight.normal), color: color ?? AppColors.blackColor, letterSpacing: -0.4),
);
Widget toText21({Color? color, bool isBold = false, FontWeight? weight, int? maxlines}) => Text(

@ -12,8 +12,10 @@ import 'package:hmg_patient_app_new/extensions/widget_extensions.dart';
import 'package:hmg_patient_app_new/features/prescriptions/models/resp_models/patient_prescriptions_response_model.dart';
import 'package:hmg_patient_app_new/features/prescriptions/prescriptions_view_model.dart';
import 'package:hmg_patient_app_new/generated/locale_keys.g.dart';
import 'package:hmg_patient_app_new/presentation/prescriptions/prescription_reminder_view.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/common_bottom_sheet.dart';
import 'package:hmg_patient_app_new/widgets/shimmer/movies_shimmer_widget.dart';
import 'package:provider/provider.dart';
@ -309,8 +311,7 @@ class _PrescriptionDetailPageState extends State<PrescriptionDetailPage> {
LocaleKeys.setReminder.tr(context: context).toText13(isBold: true),
"Notify me before the consumption time".toText10(color: AppColors.textColorLight),
],
),
SizedBox(width: 12.h),
).expanded,
Switch(
activeColor: AppColors.successColor,
activeTrackColor: AppColors.successColor.withValues(alpha: .15),
@ -319,6 +320,12 @@ class _PrescriptionDetailPageState extends State<PrescriptionDetailPage> {
setState(() {
prescriptionVM.setPrescriptionItemReminder(newValue, prescriptionVM.prescriptionDetailsList[index]);
});
showCommonBottomSheetWithoutHeight(context, title: "Set the timer of reminder".needTranslation, child: PrescriptionReminderView(
setReminder: (int value) {
DateTime startDate = DateTime.now();
DateTime endDate = DateTime(startDate.year, startDate.month, startDate.day + prescriptionVM.prescriptionDetailsList[index].days!.toInt());
},
), callBackFunc: () {}, isFullScreen: false);
},
),
],

@ -0,0 +1,116 @@
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_export.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/generated/locale_keys.g.dart';
import 'package:hmg_patient_app_new/theme/colors.dart';
import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart';
class PrescriptionReminderView extends StatefulWidget {
Function(int) setReminder;
PrescriptionReminderView({Key? key, required this.setReminder}) : super(key: key);
@override
_PrescriptionReminderViewState createState() {
return _PrescriptionReminderViewState();
}
}
class _PrescriptionReminderViewState extends State<PrescriptionReminderView> {
final List<int> _options = [15, 30, 60, 90];
int _selectedOption = 0; // Nullable to represent no selection initially
@override
void initState() {
super.initState();
}
@override
void dispose() {
super.dispose();
}
@override
Widget build(BuildContext context) {
return Column(
mainAxisSize: MainAxisSize.min,
spacing: 16.h,
children: [
Container(
width: double.infinity,
decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 24),
child: ListView.builder(
itemCount: _options.length,
physics: NeverScrollableScrollPhysics(),
padding: EdgeInsets.only(top: 8, bottom: 8),
shrinkWrap: true,
itemBuilder: (context, index) {
return Theme(
data: Theme.of(context).copyWith(
listTileTheme: ListTileThemeData(horizontalTitleGap: 4),
),
child: RadioListTile<int>(
title: Text(
"${_options[index]} minutes before".needTranslation,
style: TextStyle(
fontSize: 16.h,
fontWeight: FontWeight.w500,
),
),
value: index,
fillColor: WidgetStateProperty.resolveWith((states) {
if (states.contains(WidgetState.selected)) {
return AppColors.primaryRedColor;
}
return Color(0xffEEEEEE);
}),
contentPadding: EdgeInsets.only(left: 12.h, right: 12.h),
groupValue: _selectedOption,
onChanged: (int? newValue) {
setState(() {
_selectedOption = newValue!;
});
},
),
);
},
),
),
Row(
spacing: 16.h,
children: [
Expanded(
child: CustomButton(
text: LocaleKeys.cancel.tr(),
onPressed: () {
Navigator.of(context).pop();
},
backgroundColor: AppColors.secondaryLightRedColor,
borderColor: AppColors.secondaryLightRedColor,
textColor: AppColors.primaryRedColor,
icon: AppAssets.cancel,
iconColor: AppColors.primaryRedColor,
),
),
Expanded(
child: CustomButton(
text: LocaleKeys.setReminder.tr(),
onPressed: () {
Navigator.of(context).pop();
widget.setReminder(_selectedOption);
},
backgroundColor: AppColors.bgGreenColor,
borderColor: AppColors.bgGreenColor,
textColor: Colors.white,
icon: AppAssets.bell,
),
),
],
),
],
);
}
}

@ -12,6 +12,7 @@ class AppColors {
static const lightGray = Color(0xFFF4F5F7);
static const lightPurple = Color(0xFFB7A3E6);
static const scaffoldBgColor = Color(0xFFF8F8F8);
static const bottomSheetBgColor = Color(0xFFF8F8FA);
static const lightGreyEFColor = Color(0xffeaeaff);
static const greyF7Color = Color(0xffF7F7F7);
static const lightGrayColor = Color(0xff808080);

@ -7,7 +7,7 @@ import 'package:hmg_patient_app_new/extensions/widget_extensions.dart';
import 'package:hmg_patient_app_new/theme/colors.dart';
void showCommonBottomSheet(BuildContext context,
{required Widget child, required VoidCallback callBackFunc, String? title, required double height, bool isCloseButtonVisible = true, bool isFullScreen = true}) {
{required Widget child, required VoidCallback callBackFunc, String? title, required double? height, bool isCloseButtonVisible = true, bool isFullScreen = true}) {
showModalBottomSheet<String>(
sheetAnimationStyle: AnimationStyle(
duration: Duration(milliseconds: 500), // Custom animation duration
@ -86,3 +86,50 @@ class ButtonSheetContent extends StatelessWidget {
);
}
}
void showCommonBottomSheetWithoutHeight(
BuildContext context, {
required Widget child,
required VoidCallback callBackFunc,
String title = "",
bool isCloseButtonVisible = true,
bool isFullScreen = true,
}) {
showModalBottomSheet<String>(
sheetAnimationStyle: AnimationStyle(
duration: Duration(milliseconds: 500), // Custom animation duration
reverseDuration: Duration(milliseconds: 300), // Custom reverse animation duration
),
context: context,
isScrollControlled: true,
showDragHandle: false,
backgroundColor: AppColors.bottomSheetBgColor,
builder: (BuildContext context) {
return SafeArea(
top: false,
left: false,
right: false,
child: Container(
padding: EdgeInsets.only(left: 24, top: 24, right: 24, bottom: 12),
decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.bottomSheetBgColor, borderRadius: 24.h),
child: Column(
mainAxisSize: MainAxisSize.min,
spacing: 16.h,
children: [
Row(
crossAxisAlignment: CrossAxisAlignment.center,
children: [
if (title.isNotEmpty) title.toText20(weight: FontWeight.w600).expanded,
Utils.buildSvgWithAssets(icon: AppAssets.close_bottom_sheet_icon, iconColor: Color(0xff2B353E)).onPress(() {
Navigator.of(context).pop();
}),
],
),
child,
],
)),
);
}).then((value) {
callBackFunc();
});
}

Loading…
Cancel
Save