Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

working on convert dates #12

Merged
merged 1 commit into from
Aug 3, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions devtools_options.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
description: This file stores settings for Dart & Flutter DevTools.
documentation: https://docs.flutter.dev/tools/devtools/extensions#configure-extension-enablement-states
extensions:
163 changes: 94 additions & 69 deletions lib/services/yahrtzeits_manager.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,9 @@ import 'package:flutter/services.dart';
import 'package:timezone/timezone.dart' as tz;
import '../models/yahrtzeit.dart';
import '../models/yahrtzeit_date.dart';
import 'package:kosher_dart/kosher_dart.dart' as kj;
import 'package:device_calendar/device_calendar.dart' as dc;


class YahrtzeitsManager {
static final YahrtzeitsManager _instance = YahrtzeitsManager._internal();
Expand All @@ -24,40 +27,36 @@ class YahrtzeitsManager {

YahrtzeitsManager._internal();

DeviceCalendarPlugin get deviceCalendarPlugin => _deviceCalendarPlugin;
dc. DeviceCalendarPlugin get deviceCalendarPlugin => _deviceCalendarPlugin;

Future<void> syncWithCalendar() async {
try {
var permissionsGranted = await _deviceCalendarPlugin.hasPermissions();
print('Permissions Granted: $permissionsGranted');
if (permissionsGranted?.isSuccess == true &&
permissionsGranted?.data == false) {
if (permissionsGranted?.isSuccess == true && permissionsGranted?.data == false) {
permissionsGranted = await _deviceCalendarPlugin.requestPermissions();
print('Requested Permissions: $permissionsGranted');
if (permissionsGranted?.isSuccess == false ||
permissionsGranted?.data == false) {
if (permissionsGranted?.isSuccess == false || permissionsGranted?.data == false) {
print('Calendar permissions not granted');
return;
}
}

final calendarsResult = await _deviceCalendarPlugin.retrieveCalendars();
print('Calendars Result: $calendarsResult');
if (calendarsResult?.isSuccess == true &&
calendarsResult?.data!.isNotEmpty == true) {
if (calendarsResult?.isSuccess == true && calendarsResult?.data!.isNotEmpty == true) {
_yahrtzeits.clear();
for (var calendar in calendarsResult!.data!) {
print('Retrieving events from calendar: ${calendar.name}');
final eventsResult = await _deviceCalendarPlugin.retrieveEvents(
calendar.id!,
RetrieveEventsParams(
dc.RetrieveEventsParams(
startDate:
tz.TZDateTime.now(tz.local).subtract(Duration(days: 365)),
endDate: tz.TZDateTime.now(tz.local).add(Duration(days: 365)),
),
);
if (eventsResult?.isSuccess == true &&
eventsResult?.data!.isNotEmpty == true) {
if (eventsResult?.isSuccess == true && eventsResult?.data!.isNotEmpty == true) {
for (var event in eventsResult!.data!) {
if (event.description?.startsWith('Yahrtzeit for') == true) {
final hebrewName = _extractHebrewName(event.description!);
Expand Down Expand Up @@ -87,118 +86,129 @@ class YahrtzeitsManager {
}
}


Future<void> addYahrtzeit(Yahrtzeit yahrtzeit) async {
final nextYearGregorianDate = _getNextGregorianDate(yahrtzeit.day, yahrtzeit.month);
if (!_yahrtzeits.any((y) =>
y.englishName == yahrtzeit.englishName &&
y.hebrewName == yahrtzeit.hebrewName &&
y.gregorianDate == yahrtzeit.gregorianDate)) {
_yahrtzeits.add(yahrtzeit);
await _addToCalendar(yahrtzeit);
y.hebrewName == y.hebrewName &&
y.day == yahrtzeit.day &&
y.month == yahrtzeit.month &&
y.gregorianDate == nextYearGregorianDate)) {
final newYahrtzeit = Yahrtzeit(
englishName: yahrtzeit.englishName,
hebrewName: yahrtzeit.hebrewName,
day: yahrtzeit.day,
month: yahrtzeit.month,
year: yahrtzeit.year,
gregorianDate: nextYearGregorianDate,
);
_yahrtzeits.add(newYahrtzeit);
await _addToCalendar(newYahrtzeit);
print('Yahrtzeit added: ${newYahrtzeit.englishName}');
}
}

Future<void> updateYahrtzeit(
Yahrtzeit oldYahrtzeit, Yahrtzeit newYahrtzeit) async {
await deleteYahrtzeit(oldYahrtzeit);
await addYahrtzeit(newYahrtzeit);
}
Future<void> updateYahrtzeit(Yahrtzeit oldYahrtzeit, Yahrtzeit newYahrtzeit) async {
await deleteYahrtzeit(oldYahrtzeit); // מחיקת היארצייט הישן
await addYahrtzeit(newYahrtzeit); // הוספת היארצייט החדש
print('Yahrtzeit updated: ${newYahrtzeit.englishName}');
}

Future<void> deleteYahrtzeit(Yahrtzeit yahrtzeit) async {
_yahrtzeits.removeWhere((y) =>
y.englishName == yahrtzeit.englishName &&
y.hebrewName == yahrtzeit.hebrewName &&
y.gregorianDate == yahrtzeit.gregorianDate);
await _deleteFromCalendar(yahrtzeit);
try {
final nextYearGregorianDate = _getNextGregorianDate(yahrtzeit.day, yahrtzeit.month);
_yahrtzeits.removeWhere((y) =>
y.englishName == yahrtzeit.englishName &&
y.hebrewName == y.hebrewName &&
y.day == yahrtzeit.day &&
y.month == y.month &&
y.gregorianDate == nextYearGregorianDate);
await _deleteFromCalendar(yahrtzeit);
print('Yahrtzeit deleted: ${yahrtzeit.englishName}');
} catch (e) {
print('Error deleting yahrtzeit: $e');
}
}

Future<List<Yahrtzeit>> getAllYahrtzeits() async {
await syncWithCalendar();
print('All yahrtzeits fetched: ${_yahrtzeits.length}');
return _yahrtzeits;
}

Future<List<Yahrtzeit>> getUpcomingYahrtzeits({int days = 10}) async {
Future<List<Yahrtzeit>> getUpcomingYahrtzeits({int days = 1000}) async {
final allYahrtzeits = await getAllYahrtzeits();
final now = tz.TZDateTime.now(tz.local);
final upcomingYahrtzeits = allYahrtzeits.where((yahrtzeit) {
final yahrtzeitDate =
tz.TZDateTime.from(yahrtzeit.getGregorianDate(), tz.local);
return yahrtzeitDate.isAfter(now) &&
yahrtzeitDate.isBefore(now.add(Duration(days: days)));
final yahrtzeitDate = tz.TZDateTime.from(yahrtzeit.getGregorianDate(), tz.local);
return yahrtzeitDate.isAfter(now) && yahrtzeitDate.isBefore(now.add(Duration(days: days)));
}).toList();
print('Upcoming yahrtzeits fetched: ${upcomingYahrtzeits.length}');
return upcomingYahrtzeits;
}

Future<void> _addToCalendar(Yahrtzeit yahrtzeit) async {
try {
var permissionsGranted = await _deviceCalendarPlugin.hasPermissions();
print('Permissions Granted: $permissionsGranted');
if (permissionsGranted?.isSuccess == true &&
permissionsGranted?.data == false) {
if (permissionsGranted?.isSuccess == true && permissionsGranted?.data == false) {
permissionsGranted = await _deviceCalendarPlugin.requestPermissions();
print('Requested Permissions: $permissionsGranted');
if (permissionsGranted?.isSuccess == false ||
permissionsGranted?.data == false) {
print('Calendar permissions not granted');
if (permissionsGranted?.isSuccess == false || permissionsGranted?.data == false) {
return;
}
}

final calendarsResult = await _deviceCalendarPlugin.retrieveCalendars();
print('Calendars Result: $calendarsResult');
if (calendarsResult?.isSuccess == true &&
calendarsResult?.data!.isNotEmpty == true) {
if (calendarsResult?.isSuccess == true && calendarsResult?.data!.isNotEmpty == true) {
for (var calendar in calendarsResult!.data!) {
print('Adding event to calendar: ${calendar.name}');
final event = Event(
final gregorianDate = DateTime(
yahrtzeit.gregorianDate.year,
yahrtzeit.gregorianDate.month,
yahrtzeit.gregorianDate.day,
);
final event = dc.Event(
calendar.id!,
title: yahrtzeit.englishName,
description:
'Yahrtzeit for ${yahrtzeit.englishName} (${yahrtzeit.hebrewName})',
start: tz.TZDateTime.from(yahrtzeit.getGregorianDate(), tz.local),
end: tz.TZDateTime.from(yahrtzeit.getGregorianDate(), tz.local)
.add(Duration(hours: 1)),
description: 'Yahrtzeit for ${yahrtzeit.englishName} (${yahrtzeit.hebrewName})',
start: tz.TZDateTime.from(gregorianDate, tz.local),
end: tz.TZDateTime.from(gregorianDate, tz.local).add(Duration(hours: 1)),
);
print(
'Event Details: ${event.title}, ${event.description}, ${event.start}, ${event.end}');
final result = await _deviceCalendarPlugin.createOrUpdateEvent(event);
print(
'Create or Update Event Result for ${calendar.name}: ${result?.data}');
if (result?.isSuccess == false) {
print(
'Error creating or updating event for ${calendar.name}: ${result?.data}');
print('Error creating or updating event for ${calendar.name}: ${result?.data}');
}
}
} else {
print('No calendars available or failed to retrieve calendars');
}
} on PlatformException catch (e) {
print('Error adding event to calendar: $e');
}
}

Future<void> _deleteFromCalendar(Yahrtzeit yahrtzeit) async {
Future<void> _deleteFromCalendar(Yahrtzeit yahrtzeit) async {
try {
var permissionsGranted = await _deviceCalendarPlugin.hasPermissions();
if (permissionsGranted?.isSuccess == true && permissionsGranted?.data == false) {
permissionsGranted = await _deviceCalendarPlugin.requestPermissions();
if (permissionsGranted?.isSuccess == false || permissionsGranted?.data == false) {
return;
}
}

final calendarsResult = await _deviceCalendarPlugin.retrieveCalendars();
if (calendarsResult?.isSuccess == true &&
calendarsResult?.data!.isNotEmpty == true) {
if (calendarsResult?.isSuccess == true && calendarsResult?.data!.isNotEmpty == true) {
for (var calendar in calendarsResult!.data!) {
final eventsResult = await _deviceCalendarPlugin.retrieveEvents(
calendar.id!,
RetrieveEventsParams(
startDate:
tz.TZDateTime.now(tz.local).subtract(Duration(days: 365)),
dc.RetrieveEventsParams(
startDate: tz.TZDateTime.now(tz.local).subtract(Duration(days: 365)),
endDate: tz.TZDateTime.now(tz.local).add(Duration(days: 365)),
),
);
if (eventsResult?.isSuccess == true &&
eventsResult?.data!.isNotEmpty == true) {
if (eventsResult?.isSuccess == true && eventsResult?.data!.isNotEmpty == true) {
for (var event in eventsResult!.data!) {
if (event.description?.startsWith(
'Yahrtzeit for ${yahrtzeit.englishName} (${yahrtzeit.hebrewName})') ==
true) {
await _deviceCalendarPlugin.deleteEvent(
calendar.id!, event.eventId!);
if (event.title == yahrtzeit.englishName) {
final result = await _deviceCalendarPlugin.deleteEvent(calendar.id!, event.eventId!);
if (result?.isSuccess == false) {
print('Error deleting event for ${calendar.name}: ${result?.data}');
}
}
}
}
Expand Down Expand Up @@ -244,4 +254,19 @@ class YahrtzeitsManager {
return true;
}

DateTime _getNextGregorianDate(int day, int month) {
try {
final now = DateTime.now();
final jewishDate = kj.JewishDate();
final hebrewYear = kj.JewishDate.fromDateTime(now).getJewishYear() + 1; // Always use next Hebrew year
jewishDate.setJewishDate(hebrewYear, month, day);
final gregorianDate = jewishDate.getGregorianCalendar();

print('Next Year Gregorian Date: $gregorianDate');
return gregorianDate;
} catch (e) {
print('Error converting date: $e');
throw ArgumentError('Invalid Hebrew date provided.');
}
}
}
Loading