fix: date picker code improvements and regressions (#6619)

* chore: improve handling result's error variant

* chore: dont call setState in didUpdateWidget

* fix: don't make assumptions on provided data
This commit is contained in:
Richard Shiue 2024-10-24 15:46:45 +03:00 committed by GitHub
parent c821454df8
commit 128ff594be
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
7 changed files with 79 additions and 44 deletions

View File

@ -206,7 +206,7 @@ class DateCellEditorBloc
endDate: endDate,
reminderId: reminderId,
);
result.fold((_) {}, (err) => Log.error(err));
result.onFailure(Log.error);
}
Future<void> _updateIsRange(bool isRange) async {
@ -218,7 +218,7 @@ class DateCellEditorBloc
endDate: endDateTime,
isRange: isRange,
);
result.fold((_) {}, (err) => Log.error(err));
result.onFailure(Log.error);
}
Future<void> _updateIncludeTime(bool includeTime) async {
@ -229,12 +229,12 @@ class DateCellEditorBloc
endDate: endDateTime,
includeTime: includeTime,
);
result.fold((_) {}, (err) => Log.error(err));
result.onFailure(Log.error);
}
Future<void> _clearDate() async {
final result = await _dateCellBackendService.clear();
result.fold((_) {}, (err) => Log.error(err));
result.onFailure(Log.error);
}
String timeFormatPrompt(FlowyError error) {

View File

@ -146,18 +146,18 @@ class BoardBloc extends Bloc<BoardEvent, BoardState> {
},
createGroup: (name) async {
final result = await groupBackendSvc.createGroup(name: name);
result.fold((_) {}, (err) => Log.error(err));
result.onFailure(Log.error);
},
deleteGroup: (groupId) async {
final result = await groupBackendSvc.deleteGroup(groupId: groupId);
result.fold((_) {}, (err) => Log.error(err));
result.onFailure(Log.error);
},
renameGroup: (groupId, name) async {
final result = await groupBackendSvc.updateGroup(
groupId: groupId,
name: name,
);
result.fold((_) {}, (err) => Log.error(err));
result.onFailure(Log.error);
},
didReceiveError: (error) {
emit(BoardState.error(error: error));

View File

@ -107,20 +107,18 @@ class AppFlowyDatePickerState extends State<AppFlowyDatePicker> {
@override
void didUpdateWidget(covariant oldWidget) {
setState(() {
dateTime = widget.dateTime;
if (widget.isRange) {
startDateTime = widget.dateTime;
endDateTime = widget.endDateTime;
} else {
startDateTime = endDateTime = null;
}
includeTime = widget.includeTime;
isRange = widget.isRange;
if (oldWidget.reminderOption != widget.reminderOption) {
reminderOption = widget.reminderOption;
}
});
dateTime = widget.dateTime;
if (widget.isRange) {
startDateTime = widget.dateTime;
endDateTime = widget.endDateTime;
} else {
startDateTime = endDateTime = null;
}
includeTime = widget.includeTime;
isRange = widget.isRange;
if (oldWidget.reminderOption != widget.reminderOption) {
reminderOption = widget.reminderOption;
}
super.didUpdateWidget(oldWidget);
}

View File

@ -87,20 +87,18 @@ class _MobileAppFlowyDatePickerState extends State<MobileAppFlowyDatePicker> {
@override
void didUpdateWidget(covariant oldWidget) {
setState(() {
dateTime = widget.dateTime;
if (widget.isRange) {
startDateTime = widget.dateTime;
endDateTime = widget.endDateTime;
} else {
startDateTime = endDateTime = null;
}
includeTime = widget.includeTime;
isRange = widget.isRange;
if (oldWidget.reminderOption != widget.reminderOption) {
reminderOption = widget.reminderOption;
}
});
dateTime = widget.dateTime;
if (widget.isRange) {
startDateTime = widget.dateTime;
endDateTime = widget.endDateTime;
} else {
startDateTime = endDateTime = null;
}
includeTime = widget.includeTime;
isRange = widget.isRange;
if (oldWidget.reminderOption != widget.reminderOption) {
reminderOption = widget.reminderOption;
}
super.didUpdateWidget(oldWidget);
}

View File

@ -1543,10 +1543,10 @@ packages:
dependency: transitive
description:
name: platform
sha256: "9b71283fc13df574056616011fb138fd3b793ea47cc509c189a6c3fa5f8a1a65"
sha256: "12220bb4b65720483f8fa9450b4332347737cf8213dd2840d8b2c823e47243ec"
url: "https://pub.dev"
source: hosted
version: "3.1.5"
version: "3.1.4"
plugin_platform_interface:
dependency: "direct dev"
description:
@ -1941,10 +1941,10 @@ packages:
dependency: transitive
description:
name: string_scanner
sha256: "688af5ed3402a4bde5b3a6c15fd768dbf2621a614950b17f04626c431ab3c4c3"
sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde"
url: "https://pub.dev"
source: hosted
version: "1.3.0"
version: "1.2.0"
string_validator:
dependency: "direct main"
description:
@ -2246,10 +2246,10 @@ packages:
dependency: transitive
description:
name: vm_service
sha256: "5c5f338a667b4c644744b661f309fb8080bb94b18a7e91ef1dbd343bed00ed6d"
sha256: "3923c89304b715fb1eb6423f017651664a03bf5f4b29983627c4da791f74a4ec"
url: "https://pub.dev"
source: hosted
version: "14.2.5"
version: "14.2.1"
watcher:
dependency: transitive
description:

View File

@ -77,7 +77,42 @@ void main() {
expect(bloc.state.endDateTime, null);
});
test('end time', () async {
test('end time basic', () async {
final reminderBloc = ReminderBloc();
final bloc = DateCellEditorBloc(
cellController: cellController,
reminderBloc: reminderBloc,
);
await gridResponseFuture();
expect(bloc.state.isRange, false);
expect(bloc.state.dateTime, null);
expect(bloc.state.endDateTime, null);
final now = DateTime.now();
bloc.add(DateCellEditorEvent.updateDateTime(now));
await gridResponseFuture();
expect(bloc.state.isRange, false);
expect(bloc.state.dateTime!.isAtSameMinuteAs(now), true);
expect(bloc.state.endDateTime, null);
bloc.add(const DateCellEditorEvent.setIsRange(true));
await gridResponseFuture();
expect(bloc.state.isRange, true);
expect(bloc.state.dateTime!.isAtSameMinuteAs(now), true);
expect(bloc.state.endDateTime!.isAtSameMinuteAs(now), true);
bloc.add(const DateCellEditorEvent.setIsRange(false));
await gridResponseFuture();
expect(bloc.state.isRange, false);
expect(bloc.state.dateTime!.isAtSameMinuteAs(now), true);
expect(bloc.state.endDateTime, null);
});
test('end time from empty', () async {
final reminderBloc = ReminderBloc();
final bloc = DateCellEditorBloc(
cellController: cellController,

View File

@ -34,7 +34,11 @@ impl TypeOptionCellDataSerde for DateTypeOption {
let is_range = cell_data.is_range;
let timestamp = cell_data.timestamp;
let end_timestamp = cell_data.end_timestamp;
let end_timestamp = if is_range {
cell_data.end_timestamp.or(timestamp)
} else {
None
};
let reminder_id = cell_data.reminder_id;
@ -190,7 +194,7 @@ impl CellDataChangeset for DateTypeOption {
let timestamp = changeset.timestamp.or(timestamp);
let end_timestamp = if is_range && timestamp.is_some() {
changeset.end_timestamp.or(end_timestamp)
changeset.end_timestamp.or(end_timestamp).or(timestamp)
} else {
None
};