Skip to content

Commit 966547f

Browse files
authored
fix: reminder launch review (#3716)
1 parent 3647af4 commit 966547f

File tree

29 files changed

+519
-566
lines changed

29 files changed

+519
-566
lines changed

frontend/appflowy_flutter/lib/plugins/database_view/widgets/row/cells/date_cell/date_editor.dart

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -366,6 +366,9 @@ class EndTimeButton extends StatelessWidget {
366366
}
367367
}
368368

369+
const _maxLengthTwelveHour = 8;
370+
const _maxLengthTwentyFourHour = 5;
371+
369372
class _TimeTextField extends StatefulWidget {
370373
final bool isEndTime;
371374
final String? timeStr;
@@ -433,6 +436,11 @@ class _TimeTextFieldState extends State<_TimeTextField> {
433436
errorText: widget.isEndTime
434437
? state.parseEndTimeError
435438
: state.parseTimeError,
439+
maxLength:
440+
state.dateTypeOptionPB.timeFormat == TimeFormatPB.TwelveHour
441+
? _maxLengthTwelveHour
442+
: _maxLengthTwentyFourHour,
443+
showCounter: false,
436444
onSubmitted: (timeStr) {
437445
if (widget.isEndTime) {
438446
context

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

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -82,11 +82,13 @@ class MentionDateBlock extends StatelessWidget {
8282
_updateBlock(parsedDate!.withoutTime, includeTime);
8383

8484
// We can remove time from the date/reminder
85-
// block when toggled off.
86-
if (!includeTime && isReminder) {
85+
// block when toggled off.
86+
if (isReminder) {
8787
_updateScheduledAt(
8888
reminderId: reminderId!,
89-
selectedDay: parsedDate!.withoutTime,
89+
selectedDay:
90+
includeTime ? parsedDate! : parsedDate!.withoutTime,
91+
includeTime: includeTime,
9092
);
9193
}
9294
},
@@ -99,6 +101,7 @@ class MentionDateBlock extends StatelessWidget {
99101
_updateScheduledAt(
100102
reminderId: reminderId!,
101103
selectedDay: selectedDay,
104+
includeTime: includeTime,
102105
);
103106
}
104107
},
@@ -171,10 +174,15 @@ class MentionDateBlock extends StatelessWidget {
171174
void _updateScheduledAt({
172175
required String reminderId,
173176
required DateTime selectedDay,
177+
bool? includeTime,
174178
}) {
175179
editorContext.read<ReminderBloc>().add(
176180
ReminderEvent.update(
177-
ReminderUpdate(id: reminderId, scheduledAt: selectedDay),
181+
ReminderUpdate(
182+
id: reminderId,
183+
scheduledAt: selectedDay,
184+
includeTime: includeTime,
185+
),
178186
),
179187
);
180188
}

frontend/appflowy_flutter/lib/plugins/inline_actions/handlers/reminder_reference.dart

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import 'package:appflowy/plugins/document/application/doc_bloc.dart';
44
import 'package:appflowy/plugins/document/presentation/editor_plugins/base/string_extension.dart';
55
import 'package:appflowy/plugins/document/presentation/editor_plugins/mention/mention_block.dart';
66
import 'package:appflowy/plugins/inline_actions/inline_actions_result.dart';
7+
import 'package:appflowy/user/application/reminder/reminder_extension.dart';
78
import 'package:appflowy/user/application/reminder/reminder_bloc.dart';
89
import 'package:appflowy_backend/protobuf/flowy-user/reminder.pb.dart';
910
import 'package:appflowy_editor/appflowy_editor.dart';
@@ -209,7 +210,9 @@ class ReminderReferenceService {
209210
objectId: viewId,
210211
title: LocaleKeys.reminderNotification_title.tr(),
211212
message: LocaleKeys.reminderNotification_message.tr(),
212-
meta: {"document_id": viewId},
213+
meta: {
214+
ReminderMetaKeys.includeTime.name: false.toString(),
215+
},
213216
scheduledAt: Int64(date.millisecondsSinceEpoch ~/ 1000),
214217
isAck: date.isBefore(DateTime.now()),
215218
);

frontend/appflowy_flutter/lib/startup/deps_resolver.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ import 'package:appflowy/user/application/user_service.dart';
2323
import 'package:appflowy/user/presentation/router.dart';
2424
import 'package:appflowy/workspace/application/edit_panel/edit_panel_bloc.dart';
2525
import 'package:appflowy/workspace/application/favorite/favorite_bloc.dart';
26-
import 'package:appflowy/workspace/application/local_notifications/notification_action_bloc.dart';
26+
import 'package:appflowy/workspace/application/notifications/notification_action_bloc.dart';
2727
import 'package:appflowy/workspace/application/settings/notifications/notification_settings_cubit.dart';
2828
import 'package:appflowy/workspace/application/settings/prelude.dart';
2929
import 'package:appflowy/workspace/application/tabs/tabs_bloc.dart';

frontend/appflowy_flutter/lib/startup/tasks/app_widget.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import 'package:flowy_infra/theme.dart';
1414
import 'package:flowy_infra_ui/flowy_infra_ui.dart';
1515

1616
import 'package:appflowy/plugins/document/presentation/more/cubit/document_appearance_cubit.dart';
17-
import 'package:appflowy/workspace/application/local_notifications/notification_service.dart';
17+
import 'package:appflowy/workspace/application/notifications/notification_service.dart';
1818
import 'package:appflowy/workspace/application/settings/appearance/appearance_cubit.dart';
1919
import 'package:appflowy/user/application/user_settings_service.dart';
2020
import 'package:appflowy/startup/startup.dart';
Lines changed: 2 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import 'package:bloc/bloc.dart';
2-
import 'package:equatable/equatable.dart';
32
import 'package:freezed_annotation/freezed_annotation.dart';
43

54
part 'notification_filter_bloc.freezed.dart';
@@ -10,12 +9,6 @@ class NotificationFilterBloc
109
on<NotificationFilterEvent>((event, emit) async {
1110
event.when(
1211
reset: () => emit(const NotificationFilterState()),
13-
changeSortBy: (NotificationSortOption sortBy) => emit(
14-
state.copyWith(sortBy: sortBy),
15-
),
16-
toggleGroupByDate: () => emit(
17-
state.copyWith(groupByDate: !state.groupByDate),
18-
),
1912
toggleShowUnreadsOnly: () => emit(
2013
state.copyWith(showUnreadsOnly: !state.showUnreadsOnly),
2114
),
@@ -24,42 +17,22 @@ class NotificationFilterBloc
2417
}
2518
}
2619

27-
enum NotificationSortOption {
28-
descending,
29-
ascending,
30-
}
31-
3220
@freezed
3321
class NotificationFilterEvent with _$NotificationFilterEvent {
3422
const factory NotificationFilterEvent.toggleShowUnreadsOnly() =
3523
_ToggleShowUnreadsOnly;
3624

37-
const factory NotificationFilterEvent.toggleGroupByDate() =
38-
_ToggleGroupByDate;
39-
40-
const factory NotificationFilterEvent.changeSortBy(
41-
NotificationSortOption sortBy,
42-
) = _ChangeSortBy;
43-
4425
const factory NotificationFilterEvent.reset() = _Reset;
4526
}
4627

4728
@freezed
48-
class NotificationFilterState extends Equatable with _$NotificationFilterState {
29+
class NotificationFilterState with _$NotificationFilterState {
4930
const NotificationFilterState._();
5031

5132
const factory NotificationFilterState({
5233
@Default(false) bool showUnreadsOnly,
53-
@Default(false) bool groupByDate,
54-
@Default(NotificationSortOption.descending) NotificationSortOption sortBy,
5534
}) = _NotificationFilterState;
5635

5736
// If state is not default values, then there are custom changes
58-
bool get hasFilters =>
59-
showUnreadsOnly != false ||
60-
groupByDate != false ||
61-
sortBy != NotificationSortOption.descending;
62-
63-
@override
64-
List<Object?> get props => [showUnreadsOnly, groupByDate, sortBy];
37+
bool get hasFilters => showUnreadsOnly != false;
6538
}

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

Lines changed: 33 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,11 @@ import 'dart:async';
22

33
import 'package:appflowy/generated/locale_keys.g.dart';
44
import 'package:appflowy/startup/startup.dart';
5+
import 'package:appflowy/user/application/reminder/reminder_extension.dart';
56
import 'package:appflowy/user/application/reminder/reminder_service.dart';
6-
import 'package:appflowy/workspace/application/local_notifications/notification_action.dart';
7-
import 'package:appflowy/workspace/application/local_notifications/notification_action_bloc.dart';
8-
import 'package:appflowy/workspace/application/local_notifications/notification_service.dart';
7+
import 'package:appflowy/workspace/application/notifications/notification_action.dart';
8+
import 'package:appflowy/workspace/application/notifications/notification_action_bloc.dart';
9+
import 'package:appflowy/workspace/application/notifications/notification_service.dart';
910
import 'package:appflowy/workspace/application/settings/notifications/notification_settings_cubit.dart';
1011
import 'package:appflowy_backend/log.dart';
1112
import 'package:appflowy_backend/protobuf/flowy-user/protobuf.dart';
@@ -35,6 +36,24 @@ class ReminderBloc extends Bloc<ReminderEvent, ReminderState> {
3536

3637
on<ReminderEvent>((event, emit) async {
3738
await event.when(
39+
markAllRead: () async {
40+
final unreadReminders =
41+
state.pastReminders.where((reminder) => !reminder.isRead);
42+
43+
final reminders = [...state.reminders];
44+
final updatedReminders = <ReminderPB>[];
45+
for (final reminder in unreadReminders) {
46+
reminders.remove(reminder);
47+
48+
reminder.isRead = true;
49+
await reminderService.updateReminder(reminder: reminder);
50+
51+
updatedReminders.add(reminder);
52+
}
53+
54+
reminders.addAll(updatedReminders);
55+
emit(state.copyWith(reminders: reminders));
56+
},
3857
started: () async {
3958
final remindersOrFailure = await reminderService.fetchReminders();
4059

@@ -169,6 +188,9 @@ class ReminderEvent with _$ReminderEvent {
169188
// Update a reminder (eg. isAck, isRead, etc.)
170189
const factory ReminderEvent.update(ReminderUpdate update) = _Update;
171190

191+
// Mark all unread reminders as read
192+
const factory ReminderEvent.markAllRead() = _MarkAllRead;
193+
172194
const factory ReminderEvent.pressReminder({required String reminderId}) =
173195
_PressReminder;
174196
}
@@ -181,19 +203,26 @@ class ReminderUpdate {
181203
final bool? isAck;
182204
final bool? isRead;
183205
final DateTime? scheduledAt;
206+
final bool? includeTime;
184207

185208
ReminderUpdate({
186209
required this.id,
187210
this.isAck,
188211
this.isRead,
189212
this.scheduledAt,
213+
this.includeTime,
190214
});
191215

192216
ReminderPB merge({required ReminderPB a}) {
193217
final isAcknowledged = isAck == null && scheduledAt != null
194218
? scheduledAt!.isBefore(DateTime.now())
195219
: a.isAck;
196220

221+
final meta = a.meta;
222+
if (includeTime != a.includeTime) {
223+
meta[ReminderMetaKeys.includeTime.name] = includeTime.toString();
224+
}
225+
197226
return ReminderPB(
198227
id: a.id,
199228
objectId: a.objectId,
@@ -204,7 +233,7 @@ class ReminderUpdate {
204233
isRead: isRead ?? a.isRead,
205234
title: a.title,
206235
message: a.message,
207-
meta: a.meta,
236+
meta: meta,
208237
);
209238
}
210239
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import 'package:appflowy_backend/protobuf/flowy-user/protobuf.dart';
2+
3+
enum ReminderMetaKeys {
4+
includeTime("include_time");
5+
6+
const ReminderMetaKeys(this.name);
7+
8+
final String name;
9+
}
10+
11+
extension ReminderExtension on ReminderPB {
12+
bool? get includeTime {
13+
final String? includeTimeStr = meta[ReminderMetaKeys.includeTime.name];
14+
15+
return includeTimeStr != null ? includeTimeStr == true.toString() : null;
16+
}
17+
}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import 'package:appflowy/workspace/application/local_notifications/notification_action.dart';
1+
import 'package:appflowy/workspace/application/notifications/notification_action.dart';
22
import 'package:bloc/bloc.dart';
33
import 'package:freezed_annotation/freezed_annotation.dart';
44

0 commit comments

Comments
 (0)