chore: add more logs in reminder bloc

This commit is contained in:
Lucas.Xu 2024-08-02 10:13:20 +08:00
parent c2e8a12427
commit 9d0bb8fb29

View File

@ -43,33 +43,43 @@ class ReminderBloc extends Bloc<ReminderEvent, ReminderState> {
final remindersOrFailure = await _reminderService.fetchReminders(); final remindersOrFailure = await _reminderService.fetchReminders();
remindersOrFailure.fold( remindersOrFailure.fold(
(reminders) => emit(state.copyWith(reminders: reminders)), (reminders) {
(error) => Log.error(error), Log.info('Fetched reminders on startup (${reminders.length})');
emit(state.copyWith(reminders: reminders));
},
(error) {
Log.error('Failed to fetch reminders: $error');
},
); );
}, },
remove: (reminderId) async { remove: (reminderId) async {
final unitOrFailure = final unitOrFailure = await _reminderService.removeReminder(
await _reminderService.removeReminder(reminderId: reminderId); reminderId: reminderId,
);
unitOrFailure.fold( unitOrFailure.fold(
(_) { (_) {
Log.info('Reminder removed: $reminderId');
final reminders = [...state.reminders]; final reminders = [...state.reminders];
reminders.removeWhere((e) => e.id == reminderId); reminders.removeWhere((e) => e.id == reminderId);
emit(state.copyWith(reminders: reminders)); emit(state.copyWith(reminders: reminders));
}, },
(error) => Log.error(error), (error) =>
Log.error('Failed to remove reminder($reminderId): $error'),
); );
}, },
add: (reminder) async { add: (reminder) async {
final unitOrFailure = final unitOrFailure = await _reminderService.addReminder(
await _reminderService.addReminder(reminder: reminder); reminder: reminder,
);
return unitOrFailure.fold( return unitOrFailure.fold(
(_) { (_) {
Log.info('Reminder added: ${reminder.id}');
final reminders = [...state.reminders, reminder]; final reminders = [...state.reminders, reminder];
emit(state.copyWith(reminders: reminders)); emit(state.copyWith(reminders: reminders));
}, },
(error) => Log.error(error), (error) => Log.error('Failed to add reminder: $error'),
); );
}, },
addById: (reminderId, objectId, scheduledAt, meta) async => add( addById: (reminderId, objectId, scheduledAt, meta) async => add(
@ -86,8 +96,9 @@ class ReminderBloc extends Bloc<ReminderEvent, ReminderState> {
), ),
), ),
update: (updateObject) async { update: (updateObject) async {
final reminder = state.reminders final reminder = state.reminders.firstWhereOrNull(
.firstWhereOrNull((r) => r.id == updateObject.id); (r) => r.id == updateObject.id,
);
if (reminder == null) { if (reminder == null) {
return; return;
@ -95,18 +106,20 @@ class ReminderBloc extends Bloc<ReminderEvent, ReminderState> {
final newReminder = updateObject.merge(a: reminder); final newReminder = updateObject.merge(a: reminder);
final failureOrUnit = await _reminderService.updateReminder( final failureOrUnit = await _reminderService.updateReminder(
reminder: newReminder, reminder: updateObject.merge(a: reminder),
); );
failureOrUnit.fold( failureOrUnit.fold(
(_) { (_) {
final index = Log.info('Reminder updated: ${updateObject.id} $updateObject');
state.reminders.indexWhere((r) => r.id == reminder.id); final index = state.reminders.indexWhere(
(r) => r.id == reminder.id,
);
final reminders = [...state.reminders]; final reminders = [...state.reminders];
reminders.replaceRange(index, index + 1, [newReminder]); reminders.replaceRange(index, index + 1, [newReminder]);
emit(state.copyWith(reminders: reminders)); emit(state.copyWith(reminders: reminders));
}, },
(error) => Log.error(error), (error) => Log.error('Failed to update reminder: $error'),
); );
}, },
pressReminder: (reminderId, path, view) { pressReminder: (reminderId, path, view) {
@ -155,46 +168,61 @@ class ReminderBloc extends Bloc<ReminderEvent, ReminderState> {
); );
} }
}, },
markAsRead: (reminderIds) async {
final reminders = await _onMarkAsRead(reminderIds: reminderIds);
emit(
state.copyWith(
reminders: reminders,
),
);
},
archive: (reminderIds) async {
final reminders = await _onArchived(
isArchived: true,
reminderIds: reminderIds,
);
emit(
state.copyWith(
reminders: reminders,
),
);
},
markAllRead: () async { markAllRead: () async {
final reminders = await _onMarkAsRead(); final unreadReminders = state.reminders.where(
(reminder) => !reminder.isRead,
);
for (final reminder in unreadReminders) {
reminder.isRead = true;
await _reminderService.updateReminder(reminder: reminder);
}
final reminder = [...state.reminders].map((e) {
if (e.isRead) {
return e;
}
e.freeze();
return e.rebuild((update) {
update.isRead = true;
});
}).toList();
Log.info('Marked all reminders as read');
emit( emit(
state.copyWith( state.copyWith(
reminders: reminders, reminders: reminder,
), ),
); );
}, },
archiveAll: () async { archiveAll: () async {
final reminders = await _onArchived(isArchived: true); final unArchivedReminders = state.reminders.where(
emit( (reminder) => !reminder.isArchived,
state.copyWith(
reminders: reminders,
),
); );
},
unarchiveAll: () async { for (final reminder in unArchivedReminders) {
final reminders = await _onArchived(isArchived: false); reminder.isRead = true;
reminder.meta[ReminderMetaKeys.isArchived] = true.toString();
await _reminderService.updateReminder(reminder: reminder);
}
final reminder = [...state.reminders].map((e) {
if (e.isRead && e.isArchived) {
return e;
}
e.freeze();
return e.rebuild((update) {
update.isRead = true;
update.meta[ReminderMetaKeys.isArchived] = true.toString();
});
}).toList();
Log.info('Archived all reminders');
emit( emit(
state.copyWith( state.copyWith(
reminders: reminders, reminders: reminder,
), ),
); );
}, },
@ -202,8 +230,13 @@ class ReminderBloc extends Bloc<ReminderEvent, ReminderState> {
final remindersOrFailure = await _reminderService.fetchReminders(); final remindersOrFailure = await _reminderService.fetchReminders();
remindersOrFailure.fold( remindersOrFailure.fold(
(reminders) => emit(state.copyWith(reminders: reminders)), (reminders) {
(error) => emit(state), Log.info('Refreshed reminders');
emit(state.copyWith(reminders: reminders));
},
(error) {
Log.error('Failed to refresh reminders: $error');
},
); );
}, },
); );
@ -211,96 +244,6 @@ class ReminderBloc extends Bloc<ReminderEvent, ReminderState> {
); );
} }
/// Mark the reminder as read
///
/// If the [reminderIds] is null, all unread reminders will be marked as read
/// Otherwise, only the reminders with the given IDs will be marked as read
Future<List<ReminderPB>> _onMarkAsRead({
List<String>? reminderIds,
}) async {
final Iterable<ReminderPB> remindersToUpdate;
if (reminderIds != null) {
remindersToUpdate = state.reminders.where(
(reminder) => reminderIds.contains(reminder.id) && !reminder.isRead,
);
} else {
// Get all reminders that are not matching the isArchived flag
remindersToUpdate = state.reminders.where(
(reminder) => !reminder.isRead,
);
}
for (final reminder in remindersToUpdate) {
reminder.isRead = true;
await _reminderService.updateReminder(reminder: reminder);
Log.info('Mark reminder ${reminder.id} as read');
}
return state.reminders.map((e) {
if (reminderIds != null && !reminderIds.contains(e.id)) {
return e;
}
if (e.isRead) {
return e;
}
e.freeze();
return e.rebuild((update) {
update.isRead = true;
});
}).toList();
}
/// Archive or unarchive reminders
///
/// If the [reminderIds] is null, all reminders will be archived
/// Otherwise, only the reminders with the given IDs will be archived or unarchived
Future<List<ReminderPB>> _onArchived({
required bool isArchived,
List<String>? reminderIds,
}) async {
final Iterable<ReminderPB> remindersToUpdate;
if (reminderIds != null) {
remindersToUpdate = state.reminders.where(
(reminder) =>
reminderIds.contains(reminder.id) &&
reminder.isArchived != isArchived,
);
} else {
// Get all reminders that are not matching the isArchived flag
remindersToUpdate = state.reminders.where(
(reminder) => reminder.isArchived != isArchived,
);
}
for (final reminder in remindersToUpdate) {
reminder.isRead = isArchived;
reminder.meta[ReminderMetaKeys.isArchived] = isArchived.toString();
await _reminderService.updateReminder(reminder: reminder);
Log.info('Reminder ${reminder.id} is archived: $isArchived');
}
return state.reminders.map((e) {
if (reminderIds != null && !reminderIds.contains(e.id)) {
return e;
}
if (e.isArchived == isArchived) {
return e;
}
e.freeze();
return e.rebuild((update) {
update.isRead = isArchived;
update.meta[ReminderMetaKeys.isArchived] = isArchived.toString();
});
}).toList();
}
Timer _periodicCheck() { Timer _periodicCheck() {
return Timer.periodic( return Timer.periodic(
const Duration(minutes: 1), const Duration(minutes: 1),
@ -364,30 +307,17 @@ class ReminderEvent with _$ReminderEvent {
// Update a reminder (eg. isAck, isRead, etc.) // Update a reminder (eg. isAck, isRead, etc.)
const factory ReminderEvent.update(ReminderUpdate update) = _Update; const factory ReminderEvent.update(ReminderUpdate update) = _Update;
// Event to mark specific reminders as read, takes a list of reminder IDs // Mark all unread reminders as read
const factory ReminderEvent.markAsRead(List<String> reminderIds) =
_MarkAsRead;
// Event to mark all unread reminders as read
const factory ReminderEvent.markAllRead() = _MarkAllRead; const factory ReminderEvent.markAllRead() = _MarkAllRead;
// Event to archive specific reminders, takes a list of reminder IDs
const factory ReminderEvent.archive(List<String> reminderIds) = _Archive;
// Event to archive all reminders
const factory ReminderEvent.archiveAll() = _ArchiveAll; const factory ReminderEvent.archiveAll() = _ArchiveAll;
// Event to unarchive all reminders
const factory ReminderEvent.unarchiveAll() = _UnarchiveAll;
// Event to handle reminder press action
const factory ReminderEvent.pressReminder({ const factory ReminderEvent.pressReminder({
required String reminderId, required String reminderId,
@Default(null) int? path, @Default(null) int? path,
@Default(null) ViewPB? view, @Default(null) ViewPB? view,
}) = _PressReminder; }) = _PressReminder;
// Event to refresh reminders
const factory ReminderEvent.refresh() = _Refresh; const factory ReminderEvent.refresh() = _Refresh;
} }
@ -402,7 +332,6 @@ class ReminderUpdate {
this.scheduledAt, this.scheduledAt,
this.includeTime, this.includeTime,
this.isArchived, this.isArchived,
this.date,
}); });
final String id; final String id;
@ -411,7 +340,6 @@ class ReminderUpdate {
final DateTime? scheduledAt; final DateTime? scheduledAt;
final bool? includeTime; final bool? includeTime;
final bool? isArchived; final bool? isArchived;
final DateTime? date;
ReminderPB merge({required ReminderPB a}) { ReminderPB merge({required ReminderPB a}) {
final isAcknowledged = isAck == null && scheduledAt != null final isAcknowledged = isAck == null && scheduledAt != null
@ -427,10 +355,6 @@ class ReminderUpdate {
meta[ReminderMetaKeys.isArchived] = isArchived.toString(); meta[ReminderMetaKeys.isArchived] = isArchived.toString();
} }
if (date != a.date && date != null) {
meta[ReminderMetaKeys.date] = date!.millisecondsSinceEpoch.toString();
}
return ReminderPB( return ReminderPB(
id: a.id, id: a.id,
objectId: a.objectId, objectId: a.objectId,