|
|
|
|
@ -17,82 +17,92 @@ import 'package:hmg_patient_app_new/theme/colors.dart';
|
|
|
|
|
import 'package:permission_handler/permission_handler.dart';
|
|
|
|
|
|
|
|
|
|
class BottomSheetUtils {
|
|
|
|
|
showReminderBottomSheet(BuildContext context, DateTime dateTime, String doctorName, String eventId, String appoDateFormatted, String appoTimeFormatted,
|
|
|
|
|
Future<bool> showReminderBottomSheet(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 {
|
|
|
|
|
// Check and request permissions based on platform
|
|
|
|
|
bool hasPermission = await _checkAndRequestCalendarPermissions();
|
|
|
|
|
|
|
|
|
|
if (hasPermission) {
|
|
|
|
|
// Permission granted, show the reminder selection bottom sheet
|
|
|
|
|
await _showReminderBottomSheet(context, dateTime, doctorName, eventId, appoDateFormatted, appoTimeFormatted,
|
|
|
|
|
onSuccess: onSuccess, title: title, description: description, onMultiDateSuccess: onMultiDateSuccess, isMultiAllowed: isMultiAllowed);
|
|
|
|
|
return true;
|
|
|
|
|
} else {
|
|
|
|
|
await _showPermissionDeniedDialog();
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// Checks and requests calendar permissions for both Android and iOS
|
|
|
|
|
/// Returns true if all required permissions are granted
|
|
|
|
|
Future<bool> _checkAndRequestCalendarPermissions() async {
|
|
|
|
|
if (Platform.isAndroid) {
|
|
|
|
|
// Android: Check existing permission first using PermissionService
|
|
|
|
|
bool hasPermission = await PermissionService.isCalendarPermissionEnabled();
|
|
|
|
|
if (!hasPermission) {
|
|
|
|
|
PermissionStatus status = await Permission.calendarFullAccess.request();
|
|
|
|
|
hasPermission = status.isGranted;
|
|
|
|
|
}
|
|
|
|
|
if (hasPermission) {
|
|
|
|
|
_showReminderBottomSheet(context, dateTime, doctorName, eventId, appoDateFormatted, appoTimeFormatted,
|
|
|
|
|
onSuccess: onSuccess, title: title, description: description, onMultiDateSuccess: onMultiDateSuccess, isMultiAllowed: isMultiAllowed);
|
|
|
|
|
} else {
|
|
|
|
|
showCommonBottomSheetWithoutHeight(
|
|
|
|
|
title: LocaleKeys.notice.tr(context: GetIt.instance<NavigationService>().navigatorKey.currentContext!),
|
|
|
|
|
GetIt.instance<NavigationService>().navigatorKey.currentContext!,
|
|
|
|
|
child: Utils.getWarningWidget(
|
|
|
|
|
loadingText: LocaleKeys.calendarPermissionAlert.tr(),
|
|
|
|
|
isShowActionButtons: true,
|
|
|
|
|
onCancelTap: () {
|
|
|
|
|
GetIt.instance<NavigationService>().pop();
|
|
|
|
|
},
|
|
|
|
|
onConfirmTap: () async {
|
|
|
|
|
GetIt.instance<NavigationService>().pop();
|
|
|
|
|
openAppSettings();
|
|
|
|
|
}),
|
|
|
|
|
callBackFunc: () {},
|
|
|
|
|
isFullScreen: false,
|
|
|
|
|
isCloseButtonVisible: true,
|
|
|
|
|
);
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Request calendarFullAccess permission (Android 14+ requires this)
|
|
|
|
|
// This internally requests both READ_CALENDAR and WRITE_CALENDAR
|
|
|
|
|
PermissionStatus status = await Permission.calendarFullAccess.request();
|
|
|
|
|
|
|
|
|
|
// If calendarFullAccess request didn't show dialog or failed,
|
|
|
|
|
// fallback to requesting individual permissions
|
|
|
|
|
if (!status.isGranted) {
|
|
|
|
|
Map<Permission, PermissionStatus> statuses = await [
|
|
|
|
|
Permission.calendarWriteOnly,
|
|
|
|
|
].request();
|
|
|
|
|
|
|
|
|
|
return statuses[Permission.calendarWriteOnly]?.isGranted ?? false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return status.isGranted;
|
|
|
|
|
} 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);
|
|
|
|
|
} else {
|
|
|
|
|
showCommonBottomSheetWithoutHeight(
|
|
|
|
|
title: LocaleKeys.notice.tr(context: GetIt.instance<NavigationService>().navigatorKey.currentContext!),
|
|
|
|
|
GetIt.instance<NavigationService>().navigatorKey.currentContext!,
|
|
|
|
|
child: Utils.getWarningWidget(
|
|
|
|
|
loadingText: LocaleKeys.calendarPermissionAlert.tr(),
|
|
|
|
|
isShowActionButtons: true,
|
|
|
|
|
onCancelTap: () {
|
|
|
|
|
GetIt.instance<NavigationService>().pop();
|
|
|
|
|
},
|
|
|
|
|
onConfirmTap: () async {
|
|
|
|
|
GetIt.instance<NavigationService>().pop();
|
|
|
|
|
openAppSettings();
|
|
|
|
|
}),
|
|
|
|
|
callBackFunc: () {},
|
|
|
|
|
isFullScreen: false,
|
|
|
|
|
isCloseButtonVisible: true,
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
showCommonBottomSheetWithoutHeight(
|
|
|
|
|
title: LocaleKeys.notice.tr(context: GetIt.instance<NavigationService>().navigatorKey.currentContext!),
|
|
|
|
|
GetIt.instance<NavigationService>().navigatorKey.currentContext!,
|
|
|
|
|
child: Utils.getWarningWidget(
|
|
|
|
|
loadingText: LocaleKeys.calendarPermissionAlert.tr(),
|
|
|
|
|
isShowActionButtons: true,
|
|
|
|
|
onCancelTap: () {
|
|
|
|
|
GetIt.instance<NavigationService>().pop();
|
|
|
|
|
},
|
|
|
|
|
onConfirmTap: () async {
|
|
|
|
|
GetIt.instance<NavigationService>().pop();
|
|
|
|
|
openAppSettings();
|
|
|
|
|
}),
|
|
|
|
|
callBackFunc: () {},
|
|
|
|
|
isFullScreen: false,
|
|
|
|
|
isCloseButtonVisible: true,
|
|
|
|
|
);
|
|
|
|
|
// iOS: Check if we already have full access
|
|
|
|
|
PermissionStatus fullAccessStatus = await Permission.calendarFullAccess.status;
|
|
|
|
|
|
|
|
|
|
if (fullAccessStatus.isGranted) {
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Request write permission first (required before full access on iOS)
|
|
|
|
|
PermissionStatus writeStatus = await Permission.calendarWriteOnly.request();
|
|
|
|
|
if (!writeStatus.isGranted) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Then request full access permission
|
|
|
|
|
PermissionStatus fullStatus = await Permission.calendarFullAccess.request();
|
|
|
|
|
return fullStatus.isGranted;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// Shows permission denied dialog with option to open settings
|
|
|
|
|
Future<void> _showPermissionDeniedDialog() async {
|
|
|
|
|
BuildContext? context = GetIt.instance<NavigationService>().navigatorKey.currentContext;
|
|
|
|
|
if (context == null) return;
|
|
|
|
|
|
|
|
|
|
showCommonBottomSheetWithoutHeight(
|
|
|
|
|
context,
|
|
|
|
|
title: LocaleKeys.notice.tr(context: context),
|
|
|
|
|
child: Utils.getWarningWidget(
|
|
|
|
|
loadingText: LocaleKeys.calendarPermissionAlert.tr(),
|
|
|
|
|
isShowActionButtons: true,
|
|
|
|
|
onCancelTap: () {
|
|
|
|
|
GetIt.instance<NavigationService>().pop();
|
|
|
|
|
},
|
|
|
|
|
onConfirmTap: () async {
|
|
|
|
|
GetIt.instance<NavigationService>().pop();
|
|
|
|
|
await openAppSettings();
|
|
|
|
|
},
|
|
|
|
|
),
|
|
|
|
|
callBackFunc: () {},
|
|
|
|
|
isFullScreen: false,
|
|
|
|
|
isCloseButtonVisible: true,
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
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 {
|
|
|
|
|
showCommonBottomSheetWithoutHeight(providedContext, title: LocaleKeys.setTimerOfReminder.tr(context: providedContext), child: PrescriptionReminderView(
|
|
|
|
|
|