Skip to content

Commit

Permalink
create reminder alongside event (#18)
Browse files Browse the repository at this point in the history
* create reminder alongside event

* updated readme quick start
  • Loading branch information
AlexisChoupault committed Mar 3, 2025
1 parent efc854b commit 04b37d9
Show file tree
Hide file tree
Showing 5 changed files with 133 additions and 2 deletions.
6 changes: 5 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -59,9 +59,13 @@ final event = await eventide.createEvent(
title: 'Meeting',
startDate: DateTime.now(),
endDate: DateTime.now().add(Duration(hours: 1)),
reminders: [
const Duration(hours: 1)
const Duration(minutes: 15),
],
);
final updatedEvent = await eventide.addReminder(
final updatedEvent = await eventide.deleteReminder(
durationBeforeEvent: Duration(minutes: 15),
eventId: event.id,
);
Expand Down
13 changes: 12 additions & 1 deletion lib/src/eventide.dart
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,7 @@ class Eventide extends EventidePlatform {
bool isAllDay = false,
String? description,
String? url,
List<Duration>? reminders,
}) async {
try {
final event = await _calendarApi.createEvent(
Expand All @@ -136,7 +137,17 @@ class Eventide extends EventidePlatform {
url: url,
);

return event.toETEvent();
if (reminders != null) {
for (final reminder in reminders) {
await _calendarApi.createReminder(
reminder: reminder.toNativeDuration(),
eventId: event.id,
);
}
}

return event.toETEvent().copyWithReminders(reminders);

} on PlatformException catch (e) {
throw e.toETException();
}
Expand Down
16 changes: 16 additions & 0 deletions lib/src/eventide_extensions.dart
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,22 @@ extension EventToETEvent on Event {
}
}

extension ETEventCopy on ETEvent {
ETEvent copyWithReminders(List<Duration>? reminders) {
return ETEvent(
id: id,
title: title,
isAllDay: isAllDay,
startDate: startDate,
endDate: endDate,
calendarId: calendarId,
description: description,
url: url,
reminders: reminders ?? this.reminders,
);
}
}

extension AccountToETAccount on Account {
ETAccount toETAccount() {
return ETAccount(
Expand Down
1 change: 1 addition & 0 deletions lib/src/eventide_platform_interface.dart
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ abstract class EventidePlatform extends PlatformInterface {
required DateTime endDate,
String? description,
String? url,
List<Duration>? reminders,
});

Future<List<ETEvent>> retrieveEvents({
Expand Down
99 changes: 99 additions & 0 deletions test/eventide_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -250,6 +250,105 @@ void main() {
url: any(named: 'url'),
)).called(1);
});

group('iOS tests', () {
setUpAll(() {
debugDefaultTargetPlatformOverride = TargetPlatform.iOS;
});

tearDownAll(() {
debugDefaultTargetPlatformOverride = null;
});

test('createEvent with reminders returns an ECEvent with reminders', () async {
// Given
const reminders = [Duration(minutes: 10), Duration(minutes: 20)];
when(() => mockCalendarApi.createEvent(
title: any(named: 'title'),
isAllDay: any(named: 'isAllDay'),
startDate: any(named: 'startDate'),
endDate: any(named: 'endDate'),
calendarId: any(named: 'calendarId'),
description: any(named: 'description'),
url: any(named: 'url'),
)).thenAnswer((_) async => event);
when(() => mockCalendarApi.createReminder(reminder: any(named: 'reminder'), eventId: any(named: 'eventId')))
.thenAnswer((_) async => event.copyWithReminders(reminders.toNativeList()));

// When
final result = await eventide.createEvent(
title: 'Test Event',
startDate: startDate,
endDate: endDate,
calendarId: '1',
reminders: reminders,
);

// Then
expect(result.reminders, equals(reminders));
verify(() => mockCalendarApi.createEvent(
title: any(named: 'title'),
isAllDay: any(named: 'isAllDay'),
startDate: any(named: 'startDate'),
endDate: any(named: 'endDate'),
calendarId: any(named: 'calendarId'),
description: any(named: 'description'),
url: any(named: 'url'),
)).called(1);
verify(() => mockCalendarApi.createReminder(reminder: 10*60, eventId: event.id)).called(1);
verify(() => mockCalendarApi.createReminder(reminder: 20*60, eventId: event.id)).called(1);
});
});

group('Android tests', () {
setUpAll(() {
debugDefaultTargetPlatformOverride = TargetPlatform.android;
});

tearDownAll(() {
debugDefaultTargetPlatformOverride = null;
});

test('createEvent with reminders returns an ECEvent with reminders', () async {
// Given
const reminders = [Duration(minutes: 10), Duration(minutes: 20)];
when(() => mockCalendarApi.createEvent(
title: any(named: 'title'),
isAllDay: any(named: 'isAllDay'),
startDate: any(named: 'startDate'),
endDate: any(named: 'endDate'),
calendarId: any(named: 'calendarId'),
description: any(named: 'description'),
url: any(named: 'url'),
)).thenAnswer((_) async => event);
when(() => mockCalendarApi.createReminder(reminder: any(named: 'reminder'), eventId: any(named: 'eventId')))
.thenAnswer((_) async => event.copyWithReminders(reminders.toNativeList()));

// When
final result = await eventide.createEvent(
title: 'Test Event',
startDate: startDate,
endDate: endDate,
calendarId: '1',
reminders: reminders,
);

// Then
expect(result.reminders, equals(reminders));
verify(() => mockCalendarApi.createEvent(
title: any(named: 'title'),
isAllDay: any(named: 'isAllDay'),
startDate: any(named: 'startDate'),
endDate: any(named: 'endDate'),
calendarId: any(named: 'calendarId'),
description: any(named: 'description'),
url: any(named: 'url'),
)).called(1);
verify(() => mockCalendarApi.createReminder(reminder: 10, eventId: event.id)).called(1);
verify(() => mockCalendarApi.createReminder(reminder: 20, eventId: event.id)).called(1);
});
});


test('retrieveEvents returns a list of ETEvents with reminders', () async {
// Given
Expand Down

0 comments on commit 04b37d9

Please sign in to comment.