From 76da44999c3a8220de05cb2ba64b66ca3dcfbded Mon Sep 17 00:00:00 2001 From: appflowy Date: Mon, 30 May 2022 20:43:38 +0800 Subject: [PATCH] chore: reset content when number is not valid --- .../grid/cell/cell_service/data_loader.dart | 18 ++++--- .../grid/cell/number_cell_bloc.dart | 30 +++++++----- .../grid/src/widgets/cell/number_cell.dart | 47 ++++++++++--------- 3 files changed, 56 insertions(+), 39 deletions(-) diff --git a/frontend/app_flowy/lib/workspace/application/grid/cell/cell_service/data_loader.dart b/frontend/app_flowy/lib/workspace/application/grid/cell/cell_service/data_loader.dart index 92caedc4e9..676e3f66d0 100644 --- a/frontend/app_flowy/lib/workspace/application/grid/cell/cell_service/data_loader.dart +++ b/frontend/app_flowy/lib/workspace/application/grid/cell/cell_service/data_loader.dart @@ -58,11 +58,7 @@ class GridCellDataLoader extends IGridCellDataLoader { return fut.then( (result) => result.fold((Cell cell) { try { - if (cell.data.isEmpty) { - return null; - } else { - return parser.parserData(cell.data); - } + return parser.parserData(cell.data); } catch (e, s) { Log.error('$parser parser cellData failed, $e'); Log.error('Stack trace \n $s'); @@ -102,13 +98,17 @@ class SelectOptionCellDataLoader extends IGridCellDataLoader { @override String? parserData(List data) { - return utf8.decode(data); + final s = utf8.decode(data); + return s; } } class DateCellDataParser implements ICellDataParser { @override DateCellData? parserData(List data) { + if (data.isEmpty) { + return null; + } return DateCellData.fromBuffer(data); } } @@ -116,6 +116,9 @@ class DateCellDataParser implements ICellDataParser { class SelectOptionCellDataParser implements ICellDataParser { @override SelectOptionCellData? parserData(List data) { + if (data.isEmpty) { + return null; + } return SelectOptionCellData.fromBuffer(data); } } @@ -123,6 +126,9 @@ class SelectOptionCellDataParser implements ICellDataParser { @override URLCellData? parserData(List data) { + if (data.isEmpty) { + return null; + } return URLCellData.fromBuffer(data); } } diff --git a/frontend/app_flowy/lib/workspace/application/grid/cell/number_cell_bloc.dart b/frontend/app_flowy/lib/workspace/application/grid/cell/number_cell_bloc.dart index b694ac5059..adcfee71e6 100644 --- a/frontend/app_flowy/lib/workspace/application/grid/cell/number_cell_bloc.dart +++ b/frontend/app_flowy/lib/workspace/application/grid/cell/number_cell_bloc.dart @@ -1,7 +1,8 @@ -import 'package:flowy_sdk/log.dart'; +import 'package:flowy_sdk/protobuf/flowy-error/errors.pb.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:freezed_annotation/freezed_annotation.dart'; import 'dart:async'; +import 'package:dartz/dartz.dart'; import 'cell_service/cell_service.dart'; part 'number_cell_bloc.freezed.dart'; @@ -15,16 +16,21 @@ class NumberCellBloc extends Bloc { }) : super(NumberCellState.initial(cellContext)) { on( (event, emit) async { - await event.when( - initial: () async { + event.when( + initial: () { _startListening(); }, - didReceiveCellUpdate: (cellContent) { - emit(state.copyWith(content: cellContent ?? "")); + didReceiveCellUpdate: (content) { + emit(state.copyWith(content: content)); }, - updateCell: (text) async { + updateCell: (text) { cellContext.saveCellData(text, resultCallback: (result) { - result.fold(() => null, (err) => Log.error(err)); + result.fold( + () => null, + (err) { + if (!isClosed) add(NumberCellEvent.didReceiveCellUpdate(right(err))); + }, + ); }); }, ); @@ -46,7 +52,7 @@ class NumberCellBloc extends Bloc { _onCellChangedFn = cellContext.startListening( onCellChanged: ((cellContent) { if (!isClosed) { - add(NumberCellEvent.didReceiveCellUpdate(cellContent)); + add(NumberCellEvent.didReceiveCellUpdate(left(cellContent ?? ""))); } }), ); @@ -57,17 +63,19 @@ class NumberCellBloc extends Bloc { class NumberCellEvent with _$NumberCellEvent { const factory NumberCellEvent.initial() = _Initial; const factory NumberCellEvent.updateCell(String text) = _UpdateCell; - const factory NumberCellEvent.didReceiveCellUpdate(String? cellContent) = _DidReceiveCellUpdate; + const factory NumberCellEvent.didReceiveCellUpdate(Either cellContent) = _DidReceiveCellUpdate; } @freezed class NumberCellState with _$NumberCellState { const factory NumberCellState({ - required String content, + required Either content, }) = _NumberCellState; factory NumberCellState.initial(GridCellContext context) { final cellContent = context.getCellData() ?? ""; - return NumberCellState(content: cellContent); + return NumberCellState( + content: left(cellContent), + ); } } diff --git a/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/cell/number_cell.dart b/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/cell/number_cell.dart index da0b222d25..d11229c4cb 100644 --- a/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/cell/number_cell.dart +++ b/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/cell/number_cell.dart @@ -29,7 +29,7 @@ class _NumberCellState extends State { void initState() { final cellContext = widget.cellContextBuilder.build(); _cellBloc = getIt(param1: cellContext)..add(const NumberCellEvent.initial()); - _controller = TextEditingController(text: _cellBloc.state.content); + _controller = TextEditingController(text: contentFromState(_cellBloc.state)); _focusNode = CellSingleFocusNode(); _listenFocusNode(); super.initState(); @@ -40,26 +40,25 @@ class _NumberCellState extends State { _listenCellRequestFocus(context); return BlocProvider.value( value: _cellBloc, - child: BlocConsumer( - listener: (context, state) { - if (_controller.text != state.content) { - _controller.text = state.content; - } - }, - builder: (context, state) { - return TextField( - controller: _controller, - focusNode: _focusNode, - onEditingComplete: () => _focusNode.unfocus(), - maxLines: null, - style: const TextStyle(fontSize: 14, fontWeight: FontWeight.w500), - decoration: const InputDecoration( - contentPadding: EdgeInsets.zero, - border: InputBorder.none, - isDense: true, - ), - ); - }, + child: MultiBlocListener( + listeners: [ + BlocListener( + listenWhen: (p, c) => p.content != c.content, + listener: (context, state) => _controller.text = contentFromState(state), + ), + ], + child: TextField( + controller: _controller, + focusNode: _focusNode, + onEditingComplete: () => _focusNode.unfocus(), + maxLines: null, + style: const TextStyle(fontSize: 14, fontWeight: FontWeight.w500), + decoration: const InputDecoration( + contentPadding: EdgeInsets.zero, + border: InputBorder.none, + isDense: true, + ), + ), ), ); } @@ -86,7 +85,7 @@ class _NumberCellState extends State { if (mounted) { _delayOperation?.cancel(); _delayOperation = Timer(const Duration(milliseconds: 300), () { - if (_cellBloc.isClosed == false && _controller.text != _cellBloc.state.content) { + if (_cellBloc.isClosed == false && _controller.text != contentFromState(_cellBloc.state)) { _cellBloc.add(NumberCellEvent.updateCell(_controller.text)); } }); @@ -108,4 +107,8 @@ class _NumberCellState extends State { } }); } + + String contentFromState(NumberCellState state) { + return state.content.fold((l) => l, (r) => ""); + } }