Skip to content

Commit 8441a8c

Browse files
authored
feat: remove reminder in the same event (#7869)
1 parent 86872c4 commit 8441a8c

File tree

5 files changed

+65
-50
lines changed

5 files changed

+65
-50
lines changed

frontend/appflowy_flutter/lib/plugins/database/application/cell/bloc/date_cell_editor_bloc.dart

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,9 @@ import 'dart:async';
33
import 'package:appflowy/generated/locale_keys.g.dart';
44
import 'package:appflowy/plugins/database/application/cell/cell_controller_builder.dart';
55
import 'package:appflowy/plugins/database/application/field/field_info.dart';
6+
import 'package:appflowy/plugins/database/application/field/type_option/type_option_data_parser.dart';
67
import 'package:appflowy/plugins/database/domain/date_cell_service.dart';
78
import 'package:appflowy/plugins/database/domain/field_service.dart';
8-
import 'package:appflowy/plugins/database/application/field/type_option/type_option_data_parser.dart';
99
import 'package:appflowy/user/application/reminder/reminder_bloc.dart';
1010
import 'package:appflowy/user/application/reminder/reminder_extension.dart';
1111
import 'package:appflowy/util/int64_extension.dart';
@@ -113,8 +113,9 @@ class DateCellEditorBloc
113113
clearDate: () async {
114114
// Remove reminder if neccessary
115115
if (state.reminderId.isNotEmpty) {
116-
_reminderBloc
117-
.add(ReminderEvent.remove(reminderId: state.reminderId));
116+
_reminderBloc.add(
117+
ReminderEvent.removeReminder(reminderId: state.reminderId),
118+
);
118119
}
119120

120121
await _clearDate();
@@ -218,7 +219,7 @@ class DateCellEditorBloc
218219
} else {
219220
if (option == ReminderOption.none) {
220221
// remove reminder from reminder bloc and cell data
221-
_reminderBloc.add(ReminderEvent.remove(reminderId: state.reminderId));
222+
_reminderBloc.add(ReminderEvent.removeReminder(reminderId: state.reminderId));
222223
await _updateCellReminderId("");
223224
} else {
224225
// Update reminder

frontend/appflowy_flutter/lib/plugins/document/presentation/editor_plugins/mention/date_transaction_handler.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ class DateTransactionHandler extends MentionTransactionHandler {
9595
final reminderId = data.$2[MentionBlockKeys.reminderId];
9696

9797
if (reminderId case String _ when reminderId.isNotEmpty) {
98-
getIt<ReminderBloc>().add(ReminderEvent.remove(reminderId: reminderId));
98+
getIt<ReminderBloc>().add(ReminderEvent.removeReminder(reminderId: reminderId));
9999
}
100100
}
101101

frontend/appflowy_flutter/lib/plugins/document/presentation/editor_plugins/mention/mention_date_block.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,7 @@ class _MentionDateBlockState extends State<MentionDateBlock> {
148148
if (rootContext != null && _reminderId != null) {
149149
rootContext
150150
.read<ReminderBloc?>()
151-
?.add(ReminderEvent.remove(reminderId: _reminderId!));
151+
?.add(ReminderEvent.removeReminder(reminderId: _reminderId!));
152152
}
153153
_updateBlock(selectedDay, includeTime: _includeTime);
154154
}
@@ -266,7 +266,7 @@ class _MentionDateBlockState extends State<MentionDateBlock> {
266266
// Delete existing reminder
267267
return rootContext
268268
.read<ReminderBloc>()
269-
.add(ReminderEvent.remove(reminderId: reminder.id));
269+
.add(ReminderEvent.removeReminder(reminderId: reminder.id));
270270
}
271271

272272
// Update existing reminder

frontend/appflowy_flutter/lib/user/application/password/password_http_service.dart

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -204,9 +204,12 @@ class PasswordHttpService {
204204
final errorBody =
205205
response.body.isNotEmpty ? jsonDecode(response.body) : {};
206206

207-
Log.info(
208-
'${endpoint.name} request failed: ${response.statusCode}, $errorBody ',
209-
);
207+
// the checkHasPassword endpoint will return 403, which is not an error
208+
if (endpoint != PasswordEndpoint.checkHasPassword) {
209+
Log.info(
210+
'${endpoint.name} request failed: ${response.statusCode}, $errorBody ',
211+
);
212+
}
210213

211214
ErrorCode errorCode = ErrorCode.Internal;
212215

frontend/appflowy_flutter/lib/user/application/reminder/reminder_bloc.dart

Lines changed: 51 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -54,21 +54,29 @@ class ReminderBloc extends Bloc<ReminderEvent, ReminderState> {
5454
bool hasReminder(String reminderId) =>
5555
state.allReminders.where((e) => e.id == reminderId).firstOrNull != null;
5656

57+
final List<ViewPB> _allViews = [];
58+
5759
void _dispatch() {
5860
on<ReminderEvent>(
5961
(event, emit) async {
6062
await event.when(
6163
started: () async {
62-
Log.info('Start fetching reminders');
64+
add(const ReminderEvent.refresh());
65+
},
66+
refresh: () async {
6367
final result = await _reminderService.fetchReminders();
68+
final views = await ViewBackendService.getAllViews();
69+
views.onSuccess((views) {
70+
_allViews.clear();
71+
_allViews.addAll(views.items);
72+
});
73+
6474
await result.fold(
6575
(reminders) async {
66-
final availableReminders = await filterAvailableReminders(
67-
reminders,
68-
removeUnavailableReminder: true,
69-
);
76+
final availableReminders =
77+
await filterAvailableReminders(reminders);
7078
Log.info(
71-
'Fetched reminders on startup: ${availableReminders.length}',
79+
'Fetched reminders on refresh: ${availableReminders.length}',
7280
);
7381
if (!isClosed && !emit.isDone) {
7482
emit(
@@ -79,12 +87,12 @@ class ReminderBloc extends Bloc<ReminderEvent, ReminderState> {
7987
);
8088
}
8189
},
82-
(error) async {
90+
(error) {
8391
Log.error('Failed to fetch reminders: $error');
8492
},
8593
);
8694
},
87-
remove: (reminderId) async {
95+
removeReminder: (reminderId) async {
8896
final result = await _reminderService.removeReminder(
8997
reminderId: reminderId,
9098
);
@@ -105,6 +113,28 @@ class ReminderBloc extends Bloc<ReminderEvent, ReminderState> {
105113
),
106114
);
107115
},
116+
removeReminders: (reminderIds) async {
117+
Log.info('Remove reminders: $reminderIds');
118+
final removedIds = <String>{};
119+
for (final reminderId in reminderIds) {
120+
final result = await _reminderService.removeReminder(
121+
reminderId: reminderId,
122+
);
123+
if (result.isSuccess) {
124+
Log.info('Removed reminder: $reminderId');
125+
removedIds.add(reminderId);
126+
} else {
127+
Log.error('Failed to remove reminder: $reminderId');
128+
}
129+
}
130+
emit(
131+
state.copyWith(
132+
reminders: state.reminders
133+
.where((reminder) => !removedIds.contains(reminder.id))
134+
.toList(),
135+
),
136+
);
137+
},
108138
add: (reminder) async {
109139
// check the timestamp in the reminder
110140
if (reminder.createdAt == null) {
@@ -305,30 +335,6 @@ class ReminderBloc extends Bloc<ReminderEvent, ReminderState> {
305335
),
306336
);
307337
},
308-
refresh: () async {
309-
final result = await _reminderService.fetchReminders();
310-
311-
await result.fold(
312-
(reminders) async {
313-
final availableReminders =
314-
await filterAvailableReminders(reminders);
315-
Log.info(
316-
'Fetched reminders on refresh: ${availableReminders.length}',
317-
);
318-
if (!isClosed && !emit.isDone) {
319-
emit(
320-
state.copyWith(
321-
reminders: availableReminders,
322-
serverReminders: reminders,
323-
),
324-
);
325-
}
326-
},
327-
(error) {
328-
Log.error('Failed to fetch reminders: $error');
329-
},
330-
);
331-
},
332338
resetTimer: () {
333339
timer?.cancel();
334340
timer = _periodicCheck();
@@ -450,16 +456,15 @@ class ReminderBloc extends Bloc<ReminderEvent, ReminderState> {
450456
Set<String> reminderIds, {
451457
Set<String> removeIds = const {},
452458
}) async {
453-
/// check if schedule time is comming
459+
/// check if schedule time is coming
454460
final scheduledAt = reminder.scheduledAt.toDateTime();
455461
if (!DateTime.now().isAfter(scheduledAt) && !reminder.isRead) {
456462
return false;
457463
}
458464

459465
/// check if view is not null
460466
final viewId = reminder.objectId;
461-
final view =
462-
await ViewBackendService.getView(viewId).fold((s) => s, (_) => null);
467+
final view = _allViews.firstWhereOrNull((e) => e.id == viewId);
463468
if (view == null) {
464469
removeIds.add(reminder.id);
465470
return false;
@@ -527,17 +532,18 @@ class ReminderBloc extends Bloc<ReminderEvent, ReminderState> {
527532
final List<ReminderPB> availableReminders = [];
528533
final reminderIds = reminders.map((e) => e.id).toSet();
529534
final removeIds = <String>{};
535+
530536
for (final r in reminders) {
531537
if (await checkReminderAvailable(r, reminderIds, removeIds: removeIds)) {
532538
availableReminders.add(r);
533539
}
534540
}
541+
535542
if (removeUnavailableReminder) {
536-
for (final id in removeIds) {
537-
Log.warn('Remove unavailable reminder: $id');
538-
if (!isClosed) add(ReminderEvent.remove(reminderId: id));
539-
}
543+
Log.info('Remove unavailable reminder: $removeIds');
544+
add(ReminderEvent.removeReminders(removeIds));
540545
}
546+
541547
return availableReminders;
542548
}
543549
}
@@ -548,7 +554,12 @@ class ReminderEvent with _$ReminderEvent {
548554
const factory ReminderEvent.started() = _Started;
549555

550556
// Remove a reminder
551-
const factory ReminderEvent.remove({required String reminderId}) = _Remove;
557+
const factory ReminderEvent.removeReminder({required String reminderId}) =
558+
_RemoveReminder;
559+
560+
// Remove reminders
561+
const factory ReminderEvent.removeReminders(Set<String> reminderIds) =
562+
_RemoveReminders;
552563

553564
// Add a reminder
554565
const factory ReminderEvent.add({required ReminderPB reminder}) = _Add;

0 commit comments

Comments
 (0)