calender request changes

pull/247/head
tahaalam 2 days ago
parent 2a850c732d
commit aa22ad1e07

@ -16,33 +16,64 @@ class CalenderUtilsNew {
final DeviceCalendar calender = DeviceCalendar.instance; final DeviceCalendar calender = DeviceCalendar.instance;
List<Calendar> writableCalender = []; List<Calendar> writableCalender = [];
CalenderUtilsNew._instance() { /// Completer to ensure getCalenders() only runs once at a time
getCalenders(); Completer<void>? _calendarInitCompleter;
}
CalenderUtilsNew._instance();
static final CalenderUtilsNew instance = CalenderUtilsNew._instance(); static final CalenderUtilsNew instance = CalenderUtilsNew._instance();
Future<void> getCalenders() async { /// Ensures calendars are loaded exactly once. Safe to call multiple times
/// subsequent calls await the same future.
Future<void> ensureCalendarsLoaded() async {
if (writableCalender.isNotEmpty) return;
if (_calendarInitCompleter != null) {
// Already in progress just wait for it
return _calendarInitCompleter!.future;
}
_calendarInitCompleter = Completer<void>();
try {
await _loadCalendars();
_calendarInitCompleter!.complete();
} catch (e) {
_calendarInitCompleter!.completeError(e);
_calendarInitCompleter = null; // Allow retry on failure
rethrow;
}
}
Future<void> _loadCalendars() async {
print("the get calenders is called");
CalendarPermissionStatus result = await DeviceCalendar.instance.hasPermissions(); CalendarPermissionStatus result = await DeviceCalendar.instance.hasPermissions();
if (result != CalendarPermissionStatus.granted) { if (result != CalendarPermissionStatus.granted) {
await DeviceCalendar.instance.requestPermissions(); await DeviceCalendar.instance.requestPermissions();
showCommonBottomSheetWithoutHeight( result = await DeviceCalendar.instance.hasPermissions();
title: LocaleKeys.notice.tr(context: GetIt.instance<NavigationService>().navigatorKey.currentContext!), // if (result != CalendarPermissionStatus.granted) {
GetIt.instance<NavigationService>().navigatorKey.currentContext!, // print("the permission is not granted");
child: Utils.getWarningWidget( // showCommonBottomSheetWithoutHeight(
loadingText: LocaleKeys.calendarPermissionAlert.tr(), // title: LocaleKeys.notice.tr(context: GetIt
isShowActionButtons: true, // .instance<NavigationService>()
onCancelTap: () { // .navigatorKey
GetIt.instance<NavigationService>().pop(); // .currentContext!),
}, // GetIt
onConfirmTap: () async { // .instance<NavigationService>()
GetIt.instance<NavigationService>().pop(); // .navigatorKey
openAppSettings(); // .currentContext!,
}), // child: Utils.getWarningWidget(
callBackFunc: () {}, // loadingText: LocaleKeys.calendarPermissionAlert.tr(),
isFullScreen: false, // isShowActionButtons: true,
isCloseButtonVisible: true, // onCancelTap: () {
); // GetIt.instance<NavigationService>().pop();
// },
// onConfirmTap: () async {
// GetIt.instance<NavigationService>().pop();
// openAppSettings();
// }),
// callBackFunc: () {},
// isFullScreen: false,
// isCloseButtonVisible: true,
// );
// }
} }
var calenders = await calender.listCalendars(); var calenders = await calender.listCalendars();
calenders.forEach((calender) { calenders.forEach((calender) {
@ -53,9 +84,7 @@ class CalenderUtilsNew {
} }
FutureOr<bool> createOrUpdateEvent({required String title, required String description, required String location, DateTime? scheduleDateTime, String? eventId, int? reminderMinutes}) async { FutureOr<bool> createOrUpdateEvent({required String title, required String description, required String location, DateTime? scheduleDateTime, String? eventId, int? reminderMinutes}) async {
if (writableCalender.isEmpty) { await ensureCalendarsLoaded();
await getCalenders();
}
var writableCalendars = writableCalender.first; var writableCalendars = writableCalender.first;
String eventResult = ""; String eventResult = "";
CalendarPermissionStatus result = await DeviceCalendar.instance.hasPermissions(); CalendarPermissionStatus result = await DeviceCalendar.instance.hasPermissions();
@ -146,9 +175,7 @@ class CalenderUtilsNew {
} }
FutureOr<bool> checkIfEventExist(String admissionId) async { FutureOr<bool> checkIfEventExist(String admissionId) async {
if (writableCalender.isEmpty) { await ensureCalendarsLoaded();
await getCalenders();
}
List<Event> events = await getEvents(); List<Event> events = await getEvents();
if (events.isEmpty) return false; if (events.isEmpty) return false;
for (var event in events) { for (var event in events) {
@ -161,7 +188,7 @@ class CalenderUtilsNew {
FutureOr<String> getEventIdIfEventExist(String admissionId) async { FutureOr<String> getEventIdIfEventExist(String admissionId) async {
if (writableCalender.isEmpty) { if (writableCalender.isEmpty) {
await getCalenders(); await ensureCalendarsLoaded();
} }
List<Event> events = await getEvents(); List<Event> events = await getEvents();
if (events.isEmpty) return ""; if (events.isEmpty) return "";
@ -174,7 +201,7 @@ class CalenderUtilsNew {
FutureOr<bool> checkAndRemove({required String id}) async { FutureOr<bool> checkAndRemove({required String id}) async {
if (writableCalender.isEmpty) { if (writableCalender.isEmpty) {
await getCalenders(); await ensureCalendarsLoaded();
} }
List<Event> events = await getEvents(); List<Event> events = await getEvents();
if (events.isEmpty) return false; if (events.isEmpty) return false;
@ -191,7 +218,7 @@ class CalenderUtilsNew {
FutureOr<bool> checkAndRemoveMultipleItems({required String id}) async { FutureOr<bool> checkAndRemoveMultipleItems({required String id}) async {
if (writableCalender.isEmpty) { if (writableCalender.isEmpty) {
await getCalenders(); await ensureCalendarsLoaded();
} }
List<Event> events = await getEvents(); List<Event> events = await getEvents();
if (events.isEmpty) return false; if (events.isEmpty) return false;

@ -103,14 +103,15 @@ class _AppointmentDetailsPageState extends State<AppointmentDetailsPage> {
} }
// // Check if reminder exists in calendar and update the flag // // Check if reminder exists in calendar and update the flag
// await _checkAndUpdateReminderStatus();
} }
}); });
// Initialize countdown timer for payment after first frame to ensure context is available // Initialize countdown timer for payment after first frame to ensure context is available
WidgetsBinding.instance.addPostFrameCallback((_) { WidgetsBinding.instance.addPostFrameCallback((_) async {
if (mounted) { if (mounted) {
_startCountdownTimer(); _startCountdownTimer();
await _checkAndUpdateReminderStatus();
} }
}); });
} }
@ -373,6 +374,7 @@ class _AppointmentDetailsPageState extends State<AppointmentDetailsPage> {
? null ? null
: Column( : Column(
children: [ children: [
SizedBox(height: 16.w), SizedBox(height: 16.w),
Divider(height: 1, color: AppColors.dividerColor), Divider(height: 1, color: AppColors.dividerColor),
SizedBox(height: 16.w), SizedBox(height: 16.w),

Loading…
Cancel
Save