From aa22ad1e0788b5293c6d7eaf15a8b284009cf98b Mon Sep 17 00:00:00 2001 From: tahaalam Date: Tue, 14 Apr 2026 13:54:01 +0300 Subject: [PATCH] calender request changes --- lib/core/utils/calender_utils_new.dart | 87 ++++++++++++------- .../appointment_details_page.dart | 6 +- 2 files changed, 61 insertions(+), 32 deletions(-) diff --git a/lib/core/utils/calender_utils_new.dart b/lib/core/utils/calender_utils_new.dart index 347c2ebc..a30de823 100644 --- a/lib/core/utils/calender_utils_new.dart +++ b/lib/core/utils/calender_utils_new.dart @@ -16,33 +16,64 @@ class CalenderUtilsNew { final DeviceCalendar calender = DeviceCalendar.instance; List writableCalender = []; - CalenderUtilsNew._instance() { - getCalenders(); - } + /// Completer to ensure getCalenders() only runs once at a time + Completer? _calendarInitCompleter; + + CalenderUtilsNew._instance(); static final CalenderUtilsNew instance = CalenderUtilsNew._instance(); - Future getCalenders() async { + /// Ensures calendars are loaded exactly once. Safe to call multiple times — + /// subsequent calls await the same future. + Future ensureCalendarsLoaded() async { + if (writableCalender.isNotEmpty) return; + if (_calendarInitCompleter != null) { + // Already in progress — just wait for it + return _calendarInitCompleter!.future; + } + _calendarInitCompleter = Completer(); + try { + await _loadCalendars(); + _calendarInitCompleter!.complete(); + } catch (e) { + _calendarInitCompleter!.completeError(e); + _calendarInitCompleter = null; // Allow retry on failure + rethrow; + } + } + + Future _loadCalendars() async { + print("the get calenders is called"); CalendarPermissionStatus result = await DeviceCalendar.instance.hasPermissions(); if (result != CalendarPermissionStatus.granted) { await DeviceCalendar.instance.requestPermissions(); - showCommonBottomSheetWithoutHeight( - title: LocaleKeys.notice.tr(context: GetIt.instance().navigatorKey.currentContext!), - GetIt.instance().navigatorKey.currentContext!, - child: Utils.getWarningWidget( - loadingText: LocaleKeys.calendarPermissionAlert.tr(), - isShowActionButtons: true, - onCancelTap: () { - GetIt.instance().pop(); - }, - onConfirmTap: () async { - GetIt.instance().pop(); - openAppSettings(); - }), - callBackFunc: () {}, - isFullScreen: false, - isCloseButtonVisible: true, - ); + result = await DeviceCalendar.instance.hasPermissions(); + // if (result != CalendarPermissionStatus.granted) { + // print("the permission is not granted"); + // showCommonBottomSheetWithoutHeight( + // title: LocaleKeys.notice.tr(context: GetIt + // .instance() + // .navigatorKey + // .currentContext!), + // GetIt + // .instance() + // .navigatorKey + // .currentContext!, + // child: Utils.getWarningWidget( + // loadingText: LocaleKeys.calendarPermissionAlert.tr(), + // isShowActionButtons: true, + // onCancelTap: () { + // GetIt.instance().pop(); + // }, + // onConfirmTap: () async { + // GetIt.instance().pop(); + // openAppSettings(); + // }), + // callBackFunc: () {}, + // isFullScreen: false, + // isCloseButtonVisible: true, + // ); + // } } var calenders = await calender.listCalendars(); calenders.forEach((calender) { @@ -53,9 +84,7 @@ class CalenderUtilsNew { } FutureOr createOrUpdateEvent({required String title, required String description, required String location, DateTime? scheduleDateTime, String? eventId, int? reminderMinutes}) async { - if (writableCalender.isEmpty) { - await getCalenders(); - } + await ensureCalendarsLoaded(); var writableCalendars = writableCalender.first; String eventResult = ""; CalendarPermissionStatus result = await DeviceCalendar.instance.hasPermissions(); @@ -146,9 +175,7 @@ class CalenderUtilsNew { } FutureOr checkIfEventExist(String admissionId) async { - if (writableCalender.isEmpty) { - await getCalenders(); - } + await ensureCalendarsLoaded(); List events = await getEvents(); if (events.isEmpty) return false; for (var event in events) { @@ -161,7 +188,7 @@ class CalenderUtilsNew { FutureOr getEventIdIfEventExist(String admissionId) async { if (writableCalender.isEmpty) { - await getCalenders(); + await ensureCalendarsLoaded(); } List events = await getEvents(); if (events.isEmpty) return ""; @@ -174,7 +201,7 @@ class CalenderUtilsNew { FutureOr checkAndRemove({required String id}) async { if (writableCalender.isEmpty) { - await getCalenders(); + await ensureCalendarsLoaded(); } List events = await getEvents(); if (events.isEmpty) return false; @@ -191,7 +218,7 @@ class CalenderUtilsNew { FutureOr checkAndRemoveMultipleItems({required String id}) async { if (writableCalender.isEmpty) { - await getCalenders(); + await ensureCalendarsLoaded(); } List events = await getEvents(); if (events.isEmpty) return false; diff --git a/lib/presentation/appointments/appointment_details_page.dart b/lib/presentation/appointments/appointment_details_page.dart index 40ef4644..545fdb18 100644 --- a/lib/presentation/appointments/appointment_details_page.dart +++ b/lib/presentation/appointments/appointment_details_page.dart @@ -103,14 +103,15 @@ class _AppointmentDetailsPageState extends State { } // // 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 - WidgetsBinding.instance.addPostFrameCallback((_) { + WidgetsBinding.instance.addPostFrameCallback((_) async { if (mounted) { _startCountdownTimer(); + await _checkAndUpdateReminderStatus(); + } }); } @@ -373,6 +374,7 @@ class _AppointmentDetailsPageState extends State { ? null : Column( children: [ + SizedBox(height: 16.w), Divider(height: 1, color: AppColors.dividerColor), SizedBox(height: 16.w),