import 'dart:async'; import 'dart:convert'; import 'dart:io'; import 'dart:ui'; import 'package:device_calendar/device_calendar.dart'; import 'package:manage_calendar_events/manage_calendar_events.dart' as ios; final DeviceCalendarPlugin deviceCalendarPlugin = DeviceCalendarPlugin(); final ios.CalendarPlugin _myPlugin = ios.CalendarPlugin(); class CalendarUtils { static Completer? _completer; dynamic get writableCalendars => calendars.firstWhere((c) => !c.isReadOnly!); dynamic calendars; CalendarUtils._(this.calendars); // static Future getInstance() async { // if (_completer == null) { // _completer = Completer(); // print(_completer!.isCompleted); // try { // final dynamic calendarsResult; // if (Platform.isIOS) { // calendarsResult = await _myPlugin.getCalendars(); // if (!_completer!.isCompleted) { // _completer?.complete(CalendarUtils._(await calendarsResult!)); // } // } else { // calendarsResult = await deviceCalendarPlugin.retrieveCalendars(); // if (!_completer!.isCompleted) { // _completer?.complete(CalendarUtils._(await calendarsResult.data!)); // } // } // } on Exception catch (e) { // if (!_completer!.isCompleted) { // _completer!.completeError(e); // } // } // } // return _completer!.future; // } static Future getInstance() async { if (_completer != null) { return _completer!.future; } _completer = Completer(); try { final dynamic calendarsResult; if (Platform.isIOS) { calendarsResult = await _myPlugin.getCalendars(); _completer!.complete(CalendarUtils._(calendarsResult)); } else { calendarsResult = await deviceCalendarPlugin.retrieveCalendars(); _completer!.complete(CalendarUtils._(calendarsResult.data)); } } catch (e) { _completer!.completeError(e); } return _completer!.future; } Future createOrUpdateEvents({List? scheduleList, String? title, String? description, List? scheduleDateTime, List? daysOfWeek}) async { List events = []; Location _currentLocation; if (DateTime.now().timeZoneName == "+04") _currentLocation = getLocation('Asia/Dubai'); else _currentLocation = getLocation('Asia/Riyadh'); scheduleDateTime!.forEach((element) { RecurrenceRule recurrenceRule = RecurrenceRule( RecurrenceFrequency.Daily, daysOfWeek: daysOfWeek, endDate: element, ); //added byAamir Tz Time Event event = Event(writableCalendars!.id, recurrenceRule: recurrenceRule, start: TZDateTime.from(element, _currentLocation), end: TZDateTime.from(element.add(Duration(minutes: 30)), _currentLocation), title: title, description: description); events.add(event); }); events.forEach((element) { deviceCalendarPlugin.createOrUpdateEvent(element); }); } Future createOrUpdateEvent({required String title, required String description, DateTime? scheduleDateTime, String? eventId}) async { RecurrenceRule recurrenceRule = RecurrenceRule( RecurrenceFrequency.Daily, // daysOfWeek: daysOfWeek, endDate: scheduleDateTime, ); Location _currentLocation; if (DateTime.now().timeZoneName == "+04") _currentLocation = getLocation('Asia/Dubai'); else _currentLocation = getLocation('Asia/Riyadh'); TZDateTime scheduleDateTimeUTZ = TZDateTime.from(scheduleDateTime!, _currentLocation); // print("writableCalendars-name: " + writableCalendars.name); // print("writableCalendars-Id: " + writableCalendars.id); // print("writableCalendarsToString: " + writableCalendars.toString()); // print("writableCalendarsToString: " + writableCalendars!.id!); Event event = Event( writableCalendars!.id, start: scheduleDateTimeUTZ, end: scheduleDateTimeUTZ.add(Duration(minutes: 30)), title: title, description: description, ); await deviceCalendarPlugin.createOrUpdateEvent(event).catchError((e) { print("catchError " + e.toString()); }).whenComplete(() { print("whenComplete " + eventId!); }); } deleteEvent(Calendar _calendar, Event _event) async { if (Platform.isIOS) { await _myPlugin.deleteEvent(calendarId: _calendar.id!, eventId: _event.eventId!); } else { await deviceCalendarPlugin.deleteEvent(_calendar.id, _event.eventId); } } Future retrieveEvents( String calendarId, RetrieveEventsParams retrieveEventsParams, ) async { return await deviceCalendarPlugin.retrieveEvents(calendarId, retrieveEventsParams); } Future createCalendar( String calendarName, { Color? calendarColor, String? localAccountName, }) async { return await deviceCalendarPlugin.createCalendar(calendarName, calendarColor: calendarColor, localAccountName: localAccountName); } }