Merge branch 'master' into haroon_dev
# Conflicts: # lib/features/prescriptions/prescriptions_view_model.dart # lib/presentation/appointments/appointment_details_page.dartpull/107/head
@ -1,122 +1,128 @@
|
|||||||
{
|
{
|
||||||
"images" : [
|
"images" : [
|
||||||
{
|
{
|
||||||
"size" : "20x20",
|
|
||||||
"idiom" : "iphone",
|
|
||||||
"filename" : "Icon-App-20x20@2x.png",
|
"filename" : "Icon-App-20x20@2x.png",
|
||||||
"scale" : "2x"
|
"idiom" : "iphone",
|
||||||
|
"scale" : "2x",
|
||||||
|
"size" : "20x20"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"size" : "20x20",
|
|
||||||
"idiom" : "iphone",
|
|
||||||
"filename" : "Icon-App-20x20@3x.png",
|
"filename" : "Icon-App-20x20@3x.png",
|
||||||
"scale" : "3x"
|
"idiom" : "iphone",
|
||||||
|
"scale" : "3x",
|
||||||
|
"size" : "20x20"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"size" : "29x29",
|
|
||||||
"idiom" : "iphone",
|
|
||||||
"filename" : "Icon-App-29x29@1x.png",
|
"filename" : "Icon-App-29x29@1x.png",
|
||||||
"scale" : "1x"
|
"idiom" : "iphone",
|
||||||
|
"scale" : "1x",
|
||||||
|
"size" : "29x29"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"size" : "29x29",
|
|
||||||
"idiom" : "iphone",
|
|
||||||
"filename" : "Icon-App-29x29@2x.png",
|
"filename" : "Icon-App-29x29@2x.png",
|
||||||
"scale" : "2x"
|
"idiom" : "iphone",
|
||||||
|
"scale" : "2x",
|
||||||
|
"size" : "29x29"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"size" : "29x29",
|
|
||||||
"idiom" : "iphone",
|
|
||||||
"filename" : "Icon-App-29x29@3x.png",
|
"filename" : "Icon-App-29x29@3x.png",
|
||||||
"scale" : "3x"
|
"idiom" : "iphone",
|
||||||
|
"scale" : "3x",
|
||||||
|
"size" : "29x29"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"size" : "40x40",
|
|
||||||
"idiom" : "iphone",
|
|
||||||
"filename" : "Icon-App-40x40@2x.png",
|
"filename" : "Icon-App-40x40@2x.png",
|
||||||
"scale" : "2x"
|
"idiom" : "iphone",
|
||||||
|
"scale" : "2x",
|
||||||
|
"size" : "40x40"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"size" : "40x40",
|
|
||||||
"idiom" : "iphone",
|
|
||||||
"filename" : "Icon-App-40x40@3x.png",
|
"filename" : "Icon-App-40x40@3x.png",
|
||||||
"scale" : "3x"
|
"idiom" : "iphone",
|
||||||
|
"scale" : "3x",
|
||||||
|
"size" : "40x40"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"size" : "60x60",
|
|
||||||
"idiom" : "iphone",
|
|
||||||
"filename" : "Icon-App-60x60@2x.png",
|
"filename" : "Icon-App-60x60@2x.png",
|
||||||
"scale" : "2x"
|
"idiom" : "iphone",
|
||||||
|
"scale" : "2x",
|
||||||
|
"size" : "60x60"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"size" : "60x60",
|
|
||||||
"idiom" : "iphone",
|
|
||||||
"filename" : "Icon-App-60x60@3x.png",
|
"filename" : "Icon-App-60x60@3x.png",
|
||||||
"scale" : "3x"
|
"idiom" : "iphone",
|
||||||
|
"scale" : "3x",
|
||||||
|
"size" : "60x60"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"size" : "20x20",
|
|
||||||
"idiom" : "ipad",
|
|
||||||
"filename" : "Icon-App-20x20@1x.png",
|
"filename" : "Icon-App-20x20@1x.png",
|
||||||
"scale" : "1x"
|
"idiom" : "ipad",
|
||||||
|
"scale" : "1x",
|
||||||
|
"size" : "20x20"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"size" : "20x20",
|
|
||||||
"idiom" : "ipad",
|
|
||||||
"filename" : "Icon-App-20x20@2x.png",
|
"filename" : "Icon-App-20x20@2x.png",
|
||||||
"scale" : "2x"
|
"idiom" : "ipad",
|
||||||
|
"scale" : "2x",
|
||||||
|
"size" : "20x20"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"size" : "29x29",
|
|
||||||
"idiom" : "ipad",
|
|
||||||
"filename" : "Icon-App-29x29@1x.png",
|
"filename" : "Icon-App-29x29@1x.png",
|
||||||
"scale" : "1x"
|
"idiom" : "ipad",
|
||||||
|
"scale" : "1x",
|
||||||
|
"size" : "29x29"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"size" : "29x29",
|
|
||||||
"idiom" : "ipad",
|
|
||||||
"filename" : "Icon-App-29x29@2x.png",
|
"filename" : "Icon-App-29x29@2x.png",
|
||||||
"scale" : "2x"
|
"idiom" : "ipad",
|
||||||
|
"scale" : "2x",
|
||||||
|
"size" : "29x29"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"size" : "40x40",
|
|
||||||
"idiom" : "ipad",
|
|
||||||
"filename" : "Icon-App-40x40@1x.png",
|
"filename" : "Icon-App-40x40@1x.png",
|
||||||
"scale" : "1x"
|
"idiom" : "ipad",
|
||||||
|
"scale" : "1x",
|
||||||
|
"size" : "40x40"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"size" : "40x40",
|
|
||||||
"idiom" : "ipad",
|
|
||||||
"filename" : "Icon-App-40x40@2x.png",
|
"filename" : "Icon-App-40x40@2x.png",
|
||||||
"scale" : "2x"
|
"idiom" : "ipad",
|
||||||
|
"scale" : "2x",
|
||||||
|
"size" : "40x40"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"size" : "76x76",
|
|
||||||
"idiom" : "ipad",
|
|
||||||
"filename" : "Icon-App-76x76@1x.png",
|
"filename" : "Icon-App-76x76@1x.png",
|
||||||
"scale" : "1x"
|
"idiom" : "ipad",
|
||||||
|
"scale" : "1x",
|
||||||
|
"size" : "76x76"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"size" : "76x76",
|
|
||||||
"idiom" : "ipad",
|
|
||||||
"filename" : "Icon-App-76x76@2x.png",
|
"filename" : "Icon-App-76x76@2x.png",
|
||||||
"scale" : "2x"
|
"idiom" : "ipad",
|
||||||
|
"scale" : "2x",
|
||||||
|
"size" : "76x76"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"size" : "83.5x83.5",
|
|
||||||
"idiom" : "ipad",
|
|
||||||
"filename" : "Icon-App-83.5x83.5@2x.png",
|
"filename" : "Icon-App-83.5x83.5@2x.png",
|
||||||
"scale" : "2x"
|
"idiom" : "ipad",
|
||||||
|
"scale" : "2x",
|
||||||
|
"size" : "83.5x83.5"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"size" : "1024x1024",
|
"filename" : "icon 1.jpg",
|
||||||
"idiom" : "ios-marketing",
|
"idiom" : "ios-marketing",
|
||||||
"filename" : "Icon-App-1024x1024@1x.png",
|
"scale" : "1x",
|
||||||
"scale" : "1x"
|
"size" : "1024x1024"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename" : "Icon-App-76x76@2x.png",
|
||||||
|
"idiom" : "iphone",
|
||||||
|
"scale" : "2x",
|
||||||
|
"size" : "76x76"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"info" : {
|
"info" : {
|
||||||
"version" : 1,
|
"author" : "xcode",
|
||||||
"author" : "xcode"
|
"version" : 1
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 295 B After Width: | Height: | Size: 815 B |
|
Before Width: | Height: | Size: 406 B After Width: | Height: | Size: 1.9 KiB |
|
Before Width: | Height: | Size: 450 B After Width: | Height: | Size: 3.6 KiB |
|
Before Width: | Height: | Size: 282 B After Width: | Height: | Size: 1.3 KiB |
|
Before Width: | Height: | Size: 462 B After Width: | Height: | Size: 3.4 KiB |
|
Before Width: | Height: | Size: 704 B After Width: | Height: | Size: 5.4 KiB |
|
Before Width: | Height: | Size: 406 B After Width: | Height: | Size: 1.9 KiB |
|
Before Width: | Height: | Size: 586 B After Width: | Height: | Size: 5.7 KiB |
|
Before Width: | Height: | Size: 862 B After Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 862 B After Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 1.6 KiB After Width: | Height: | Size: 20 KiB |
|
Before Width: | Height: | Size: 762 B After Width: | Height: | Size: 5.0 KiB |
|
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 16 KiB |
|
Before Width: | Height: | Size: 1.4 KiB After Width: | Height: | Size: 16 KiB |
@ -1,316 +0,0 @@
|
|||||||
import 'dart:async';
|
|
||||||
import 'dart:collection';
|
|
||||||
import 'dart:convert';
|
|
||||||
import 'dart:io';
|
|
||||||
import 'dart:ui';
|
|
||||||
|
|
||||||
import 'package:device_calendar/device_calendar.dart';
|
|
||||||
import 'package:flutter/widgets.dart';
|
|
||||||
import 'package:hmg_patient_app_new/core/dependencies.dart';
|
|
||||||
import 'package:hmg_patient_app_new/core/utils/date_util.dart';
|
|
||||||
import 'package:hmg_patient_app_new/extensions/string_extensions.dart';
|
|
||||||
import 'package:hmg_patient_app_new/presentation/prescriptions/prescription_reminder_view.dart';
|
|
||||||
import 'package:hmg_patient_app_new/services/dialog_service.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';
|
|
||||||
import 'package:timezone/data/latest.dart' as tzl;
|
|
||||||
|
|
||||||
final DeviceCalendarPlugin deviceCalendarPlugin = DeviceCalendarPlugin();
|
|
||||||
final ios.CalendarPlugin _myPlugin = ios.CalendarPlugin();
|
|
||||||
|
|
||||||
class CalendarUtils {
|
|
||||||
static Completer<CalendarUtils>? _completer;
|
|
||||||
|
|
||||||
dynamic get writableCalendars => calendars.firstWhere((c) => !c.isReadOnly!);
|
|
||||||
dynamic calendars;
|
|
||||||
|
|
||||||
CalendarUtils._(this.calendars);
|
|
||||||
|
|
||||||
// static Future<CalendarUtils> getInstance() async {
|
|
||||||
// if (_completer == null) {
|
|
||||||
// _completer = Completer<CalendarUtils>();
|
|
||||||
// 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<CalendarUtils> getInstance() async {
|
|
||||||
tzl.initializeTimeZones();
|
|
||||||
if (_completer != null) {
|
|
||||||
return _completer!.future;
|
|
||||||
}
|
|
||||||
_completer = Completer<CalendarUtils>();
|
|
||||||
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<DateTime>? scheduleList, String? title, String? description, List<DateTime>? scheduleDateTime, List<DayOfWeek>? daysOfWeek}) async {
|
|
||||||
tzl.initializeTimeZones();
|
|
||||||
List<Event> 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,
|
|
||||||
until: element, frequency: Frequency.daily,
|
|
||||||
);
|
|
||||||
//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, required String location, DateTime? scheduleDateTime, String? eventId}) async {
|
|
||||||
RecurrenceRule recurrenceRule = RecurrenceRule(
|
|
||||||
// RecurrenceFrequency.Daily,
|
|
||||||
// daysOfWeek: daysOfWeek,
|
|
||||||
// endDate: scheduleDateTime,
|
|
||||||
until: scheduleDateTime, frequency: Frequency.daily,
|
|
||||||
);
|
|
||||||
|
|
||||||
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,
|
|
||||||
);
|
|
||||||
|
|
||||||
ios.CalendarEvent iosCalEvent =
|
|
||||||
ios.CalendarEvent(location: location, startDate: scheduleDateTimeUTZ, endDate: scheduleDateTimeUTZ.add(Duration(minutes: 30)), title: title, description: description, isAllDay: false);
|
|
||||||
|
|
||||||
if (Platform.isAndroid) {
|
|
||||||
Result<bool> result = await deviceCalendarPlugin.hasPermissions();
|
|
||||||
print(result);
|
|
||||||
await deviceCalendarPlugin.createOrUpdateEvent(event).catchError((e) {
|
|
||||||
print("catchError " + e.toString());
|
|
||||||
}).whenComplete(() {
|
|
||||||
print("whenComplete Calender ID " + eventId!);
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
await _myPlugin.createEvent(calendarId: writableCalendars.id!, event: iosCalEvent).catchError((e) {
|
|
||||||
print("catchError " + e.toString());
|
|
||||||
}).whenComplete(() {
|
|
||||||
print("whenComplete Calender ID iOS " + eventId!);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
deleteEvent(String _calendarId, String _eventId) async {
|
|
||||||
if (Platform.isIOS) {
|
|
||||||
await _myPlugin.deleteEvent(calendarId: _calendarId, eventId: _eventId);
|
|
||||||
} else {
|
|
||||||
await deviceCalendarPlugin.deleteEvent(_calendarId, _eventId);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Future retrieveEvents(
|
|
||||||
String calendarId,
|
|
||||||
RetrieveEventsParams retrieveEventsParams,
|
|
||||||
) async {
|
|
||||||
if (Platform.isIOS) {
|
|
||||||
return await _myPlugin.getEvents(calendarId: calendarId);
|
|
||||||
} else {
|
|
||||||
return await deviceCalendarPlugin.retrieveEvents(calendarId, retrieveEventsParams);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Future createCalendar(
|
|
||||||
String calendarName, {
|
|
||||||
Color? calendarColor,
|
|
||||||
String? localAccountName,
|
|
||||||
}) async {
|
|
||||||
return await deviceCalendarPlugin.createCalendar(calendarName, calendarColor: calendarColor, localAccountName: localAccountName);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Future<Map<Permission, PermissionStatus>> requestPermissions() async {
|
|
||||||
var permissionResults = [Permission.calendarFullAccess].request();
|
|
||||||
return permissionResults;
|
|
||||||
}
|
|
||||||
|
|
||||||
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 {
|
|
||||||
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> _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: "Set the timer of reminder".needTranslation, child: PrescriptionReminderView(
|
|
||||||
setReminder: (int value) async {
|
|
||||||
if (!isMultiAllowed!) {
|
|
||||||
if (onMultiDateSuccess == null) {
|
|
||||||
CalendarUtils calendarUtils = await CalendarUtils.getInstance();
|
|
||||||
await calendarUtils.createOrUpdateEvent(
|
|
||||||
title: title ?? "You have appointment with Dr. ".needTranslation + doctorName,
|
|
||||||
description: description ?? "At " + appoDateFormatted + " " + appoTimeFormatted,
|
|
||||||
scheduleDateTime: dateTime,
|
|
||||||
eventId: eventId,
|
|
||||||
location: '');
|
|
||||||
onSuccess();
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
onMultiDateSuccess!(value);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
), callBackFunc: () {}, isFullScreen: false);
|
|
||||||
}
|
|
||||||
|
|
||||||
setCalender(BuildContext context,
|
|
||||||
{required String eventId, required int selectedMinutes, int? frequencyNumber, required int days, required String orderDate, required String itemDescriptionN, required String route}) async {
|
|
||||||
DateTime actualDate = DateTime(DateTime.now().year, DateTime.now().month, DateTime.now().day, 8, 0);
|
|
||||||
frequencyNumber ??= 2; //Some time frequency number is null so by default will be 2
|
|
||||||
|
|
||||||
int remainingDays = days - (Jiffy.parseFromDateTime(DateTime.now()).diff(Jiffy.parseFromDateTime(DateUtil.convertStringToDate(orderDate)), unit: Unit.day) as int);
|
|
||||||
if (remainingDays.isNegative) {
|
|
||||||
getIt.get<DialogService>().showErrorBottomSheet(message: "Prescription date has been already passed you can not add a reminder for this prescription.");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
CalendarUtils calendarUtils = await CalendarUtils.getInstance();
|
|
||||||
|
|
||||||
try {
|
|
||||||
for (int i = 0; i < remainingDays; i++) {
|
|
||||||
//event for number of days.
|
|
||||||
for (int j = 0; j < frequencyNumber; j++) {
|
|
||||||
// event for number of times per day.
|
|
||||||
if (j != 0) {
|
|
||||||
actualDate.add(new Duration(hours: 8)); // 8 hours addition for daily dose.
|
|
||||||
}
|
|
||||||
//Time subtraction from actual reminder time. like before 30, or 1 hour.
|
|
||||||
|
|
||||||
actualDate = Jiffy.parseFromDateTime(actualDate).subtract(minutes: selectedMinutes).dateTime;
|
|
||||||
|
|
||||||
calendarUtils.createOrUpdateEvent(
|
|
||||||
title: "$itemDescriptionN} Prescription Reminder",
|
|
||||||
description: "$itemDescriptionN $frequencyNumber $route ",
|
|
||||||
scheduleDateTime: actualDate,
|
|
||||||
eventId: eventId + (i.toString() + j.toString()),
|
|
||||||
location: '', //event id with varitions
|
|
||||||
);
|
|
||||||
|
|
||||||
actualDate = DateTime(actualDate.year, actualDate.month, actualDate.day, 8, 0);
|
|
||||||
}
|
|
||||||
actualDate = Jiffy.parseFromDateTime(actualDate).add(days: 1).dateTime;
|
|
||||||
}
|
|
||||||
} catch (ex) {
|
|
||||||
getIt.get<DialogService>().showErrorBottomSheet(message: "catch:$ex");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Future<void> checkAndRemove(hasReminder, {bool delete = false, String itemDescriptionN = ""}) async {
|
|
||||||
final ios.CalendarPlugin _myPlugin = ios.CalendarPlugin();
|
|
||||||
CalendarUtils calendarUtils = await CalendarUtils.getInstance();
|
|
||||||
DateTime startEventsDate = Jiffy.parseFromDateTime(DateTime.now()).subtract(days: 30).dateTime;
|
|
||||||
DateTime endEventsDate = Jiffy.parseFromDateTime(DateTime.now()).add(days: 120).dateTime;
|
|
||||||
RetrieveEventsParams params = RetrieveEventsParams(startDate: startEventsDate, endDate: endEventsDate);
|
|
||||||
|
|
||||||
if (calendarUtils.calendars != null) {
|
|
||||||
if (Platform.isAndroid) {
|
|
||||||
await processEvents(calendarUtils.calendars, calendarUtils, params, delete, itemDescriptionN, hasReminder);
|
|
||||||
} else {
|
|
||||||
List<ios.Calendar>? iosCalendars = await _myPlugin.getCalendars();
|
|
||||||
if (iosCalendars != null) {
|
|
||||||
await processEvents(iosCalendars.map((cal) => Calendar(id: cal.id, name: cal.name, accountName: cal.accountName)).toList(), calendarUtils, params, delete, itemDescriptionN, hasReminder);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Future<void> processEvents(List<Calendar> calendars, calendarUtils, params, delete, String itemDescriptionN, hasReminder) async {
|
|
||||||
for (var calendar in calendars) {
|
|
||||||
Result<UnmodifiableListView<Event>> events = await calendarUtils.retrieveEvents(calendar.id!, params);
|
|
||||||
for (var event in events.data!) {
|
|
||||||
if (event.title!.contains(itemDescriptionN)) {
|
|
||||||
if (delete) {
|
|
||||||
await calendarUtils.deleteEvent(calendar, event);
|
|
||||||
// AppToast.showSuccessToast(message: TranslationBase.of(context).reminderCancelSuccess);
|
|
||||||
hasReminder = false;
|
|
||||||
} else {
|
|
||||||
hasReminder = false;
|
|
||||||
// setState(() {
|
|
||||||
// hasReminder = true;
|
|
||||||
// });
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -0,0 +1,178 @@
|
|||||||
|
import 'dart:async';
|
||||||
|
|
||||||
|
import 'package:device_calendar_plus/device_calendar_plus.dart';
|
||||||
|
import 'package:hmg_patient_app_new/core/utils/date_util.dart';
|
||||||
|
import 'package:jiffy/jiffy.dart' show Jiffy;
|
||||||
|
|
||||||
|
class CalenderUtilsNew {
|
||||||
|
final DeviceCalendar calender = DeviceCalendar.instance;
|
||||||
|
List<Calendar> writableCalender = [];
|
||||||
|
|
||||||
|
CalenderUtilsNew._instance() {
|
||||||
|
getCalenders();
|
||||||
|
}
|
||||||
|
|
||||||
|
static final CalenderUtilsNew instance = CalenderUtilsNew._instance();
|
||||||
|
|
||||||
|
Future<void> getCalenders() async {
|
||||||
|
CalendarPermissionStatus result = await DeviceCalendar.instance.hasPermissions();
|
||||||
|
if (result != CalendarPermissionStatus.granted) await DeviceCalendar.instance.requestPermissions();
|
||||||
|
var calenders = await calender.listCalendars();
|
||||||
|
calenders.forEach((calender) {
|
||||||
|
if (!calender.readOnly) {
|
||||||
|
writableCalender.add(calender);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
FutureOr<bool> createOrUpdateEvent({required String title, required String description, required String location, DateTime? scheduleDateTime, String? eventId, int? reminderMinutes}) async {
|
||||||
|
if (writableCalender.isEmpty) {
|
||||||
|
await getCalenders();
|
||||||
|
}
|
||||||
|
var writableCalendars = writableCalender.first;
|
||||||
|
String eventResult = "";
|
||||||
|
CalendarPermissionStatus result = await DeviceCalendar.instance.hasPermissions();
|
||||||
|
if (result != CalendarPermissionStatus.granted) await DeviceCalendar.instance.requestPermissions();
|
||||||
|
print(result);
|
||||||
|
|
||||||
|
// String eventId = await getEventIdIfEventExist(title!.split("#").last);
|
||||||
|
// if (eventId.isEmpty) {
|
||||||
|
eventResult = await DeviceCalendar.instance.createEvent(
|
||||||
|
calendarId: writableCalendars!.id,
|
||||||
|
title: title,
|
||||||
|
description: description,
|
||||||
|
startDate: scheduleDateTime!,
|
||||||
|
endDate: scheduleDateTime!.add(Duration(minutes: 30)),
|
||||||
|
reminderMinutes: reminderMinutes);
|
||||||
|
return eventResult.isNotEmpty;
|
||||||
|
// }
|
||||||
|
|
||||||
|
// await DeviceCalendar.instance.updateEvent(
|
||||||
|
// eventId: eventId,
|
||||||
|
// title: title,
|
||||||
|
// description: description,
|
||||||
|
// startDate: scheduleDateTime!,
|
||||||
|
// endDate: scheduleDateTime!.add(Duration(minutes: 30)),
|
||||||
|
// );
|
||||||
|
|
||||||
|
// return eventId.isNotEmpty;
|
||||||
|
}
|
||||||
|
|
||||||
|
FutureOr<bool> createMultipleEvents(
|
||||||
|
{required int reminderMinutes,
|
||||||
|
int? frequencyNumber,
|
||||||
|
required int days,
|
||||||
|
required String orderDate,
|
||||||
|
required String itemDescriptionN,
|
||||||
|
required String route,
|
||||||
|
Function(String)? onFailure,
|
||||||
|
String? prescriptionNumber}) async {
|
||||||
|
DateTime currentDay = DateTime.now();
|
||||||
|
DateTime actualDate = DateTime(DateTime.now().year, DateTime.now().month, DateTime.now().day, 8, 0);
|
||||||
|
print("the frequency is $frequencyNumber");
|
||||||
|
frequencyNumber ??= 2; //Some time frequency number is null so by default will be 2
|
||||||
|
int interval = calculateIntervalAsPerFrequency(frequencyNumber);
|
||||||
|
// int remainingDays = days - (Jiffy.parseFromDateTime(DateTime.now()).diff(Jiffy.parseFromDateTime(DateUtil.convertStringToDate(orderDate)), unit: Unit.day) as int);
|
||||||
|
Duration difference = (actualDate.difference(DateUtil.convertStringToDate(orderDate)));
|
||||||
|
int remainingDays = 5;
|
||||||
|
// if (remainingDays.isNegative) {
|
||||||
|
// onFailure?.call("Prescription date has been already passed you can not add a reminder for this prescription.");
|
||||||
|
// return false;
|
||||||
|
// }
|
||||||
|
|
||||||
|
bool statusOfOperation = false;
|
||||||
|
|
||||||
|
for (int i = 0; i < remainingDays; i++) {
|
||||||
|
//event for number of days.
|
||||||
|
for (int j = 0; j < frequencyNumber; j++) {
|
||||||
|
statusOfOperation = await createOrUpdateEvent(
|
||||||
|
title: "$itemDescriptionN} Medication about to due for prescription , #$prescriptionNumber",
|
||||||
|
description: "$itemDescriptionN $frequencyNumber $route ",
|
||||||
|
scheduleDateTime: actualDate,
|
||||||
|
location: '',
|
||||||
|
//event id with varitions
|
||||||
|
reminderMinutes: reminderMinutes);
|
||||||
|
if (!statusOfOperation) return false;
|
||||||
|
|
||||||
|
actualDate = actualDate.add(Duration(hours: interval));
|
||||||
|
// if (actualDate.difference(currentDay).inDays == 1) break;
|
||||||
|
}
|
||||||
|
// actualDate = actualDate.add(Duration(days: 1));
|
||||||
|
}
|
||||||
|
|
||||||
|
return statusOfOperation;
|
||||||
|
}
|
||||||
|
|
||||||
|
int calculateIntervalAsPerFrequency(int frequencyNumber) {
|
||||||
|
return 24 ~/ frequencyNumber;
|
||||||
|
}
|
||||||
|
|
||||||
|
FutureOr<List<Event>> getEvents() async {
|
||||||
|
var availableCalender = writableCalender.first;
|
||||||
|
DateTime startEventsDate = Jiffy.parseFromDateTime(DateTime.now()).subtract(days: 30).dateTime;
|
||||||
|
DateTime endEventsDate = Jiffy.parseFromDateTime(DateTime.now()).add(days: 120).dateTime;
|
||||||
|
return await calender.listEvents(startEventsDate, endEventsDate, calendarIds: [availableCalender.id]);
|
||||||
|
}
|
||||||
|
|
||||||
|
FutureOr<bool> checkIfEventExist(String admissionId) async {
|
||||||
|
if (writableCalender.isEmpty) {
|
||||||
|
await getCalenders();
|
||||||
|
}
|
||||||
|
List<Event> events = await getEvents();
|
||||||
|
if (events.isEmpty) return false;
|
||||||
|
for (var event in events) {
|
||||||
|
List<String> title = event.title!.split("#");
|
||||||
|
|
||||||
|
if (title.contains(admissionId)) return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
FutureOr<String> getEventIdIfEventExist(String admissionId) async {
|
||||||
|
if (writableCalender.isEmpty) {
|
||||||
|
await getCalenders();
|
||||||
|
}
|
||||||
|
List<Event> events = await getEvents();
|
||||||
|
if (events.isEmpty) return "";
|
||||||
|
for (var event in events) {
|
||||||
|
List<String> title = event.title!.split("#");
|
||||||
|
if (title.contains(admissionId)) return event.eventId;
|
||||||
|
}
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
FutureOr<bool> checkAndRemove({required String id}) async {
|
||||||
|
if (writableCalender.isEmpty) {
|
||||||
|
await getCalenders();
|
||||||
|
}
|
||||||
|
List<Event> events = await getEvents();
|
||||||
|
if (events.isEmpty) return false;
|
||||||
|
for (var event in events) {
|
||||||
|
List<String> title = event.title!.split("#");
|
||||||
|
|
||||||
|
if (title.contains(id)) {
|
||||||
|
calender.deleteEvent(eventId: event.eventId);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
FutureOr<bool> checkAndRemoveMultipleItems({required String id}) async {
|
||||||
|
if (writableCalender.isEmpty) {
|
||||||
|
await getCalenders();
|
||||||
|
}
|
||||||
|
List<Event> events = await getEvents();
|
||||||
|
if (events.isEmpty) return false;
|
||||||
|
bool statusOfOperation = false;
|
||||||
|
for (var event in events) {
|
||||||
|
List<String> title = event.title.split("#");
|
||||||
|
|
||||||
|
if (title.contains(id)) {
|
||||||
|
calender.deleteEvent(eventId: event.eventId);
|
||||||
|
statusOfOperation = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return statusOfOperation;
|
||||||
|
}
|
||||||
|
}
|
||||||