Skip to content

Commit 76da449

Browse files
committed
chore: reset content when number is not valid
1 parent 8445446 commit 76da449

File tree

3 files changed

+56
-39
lines changed

3 files changed

+56
-39
lines changed

frontend/app_flowy/lib/workspace/application/grid/cell/cell_service/data_loader.dart

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -58,11 +58,7 @@ class GridCellDataLoader<T> extends IGridCellDataLoader<T> {
5858
return fut.then(
5959
(result) => result.fold((Cell cell) {
6060
try {
61-
if (cell.data.isEmpty) {
62-
return null;
63-
} else {
64-
return parser.parserData(cell.data);
65-
}
61+
return parser.parserData(cell.data);
6662
} catch (e, s) {
6763
Log.error('$parser parser cellData failed, $e');
6864
Log.error('Stack trace \n $s');
@@ -102,27 +98,37 @@ class SelectOptionCellDataLoader extends IGridCellDataLoader<SelectOptionCellDat
10298
class StringCellDataParser implements ICellDataParser<String> {
10399
@override
104100
String? parserData(List<int> data) {
105-
return utf8.decode(data);
101+
final s = utf8.decode(data);
102+
return s;
106103
}
107104
}
108105

109106
class DateCellDataParser implements ICellDataParser<DateCellData> {
110107
@override
111108
DateCellData? parserData(List<int> data) {
109+
if (data.isEmpty) {
110+
return null;
111+
}
112112
return DateCellData.fromBuffer(data);
113113
}
114114
}
115115

116116
class SelectOptionCellDataParser implements ICellDataParser<SelectOptionCellData> {
117117
@override
118118
SelectOptionCellData? parserData(List<int> data) {
119+
if (data.isEmpty) {
120+
return null;
121+
}
119122
return SelectOptionCellData.fromBuffer(data);
120123
}
121124
}
122125

123126
class URLCellDataParser implements ICellDataParser<URLCellData> {
124127
@override
125128
URLCellData? parserData(List<int> data) {
129+
if (data.isEmpty) {
130+
return null;
131+
}
126132
return URLCellData.fromBuffer(data);
127133
}
128134
}

frontend/app_flowy/lib/workspace/application/grid/cell/number_cell_bloc.dart

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
1-
import 'package:flowy_sdk/log.dart';
1+
import 'package:flowy_sdk/protobuf/flowy-error/errors.pb.dart';
22
import 'package:flutter_bloc/flutter_bloc.dart';
33
import 'package:freezed_annotation/freezed_annotation.dart';
44
import 'dart:async';
5+
import 'package:dartz/dartz.dart';
56
import 'cell_service/cell_service.dart';
67

78
part 'number_cell_bloc.freezed.dart';
@@ -15,16 +16,21 @@ class NumberCellBloc extends Bloc<NumberCellEvent, NumberCellState> {
1516
}) : super(NumberCellState.initial(cellContext)) {
1617
on<NumberCellEvent>(
1718
(event, emit) async {
18-
await event.when(
19-
initial: () async {
19+
event.when(
20+
initial: () {
2021
_startListening();
2122
},
22-
didReceiveCellUpdate: (cellContent) {
23-
emit(state.copyWith(content: cellContent ?? ""));
23+
didReceiveCellUpdate: (content) {
24+
emit(state.copyWith(content: content));
2425
},
25-
updateCell: (text) async {
26+
updateCell: (text) {
2627
cellContext.saveCellData(text, resultCallback: (result) {
27-
result.fold(() => null, (err) => Log.error(err));
28+
result.fold(
29+
() => null,
30+
(err) {
31+
if (!isClosed) add(NumberCellEvent.didReceiveCellUpdate(right(err)));
32+
},
33+
);
2834
});
2935
},
3036
);
@@ -46,7 +52,7 @@ class NumberCellBloc extends Bloc<NumberCellEvent, NumberCellState> {
4652
_onCellChangedFn = cellContext.startListening(
4753
onCellChanged: ((cellContent) {
4854
if (!isClosed) {
49-
add(NumberCellEvent.didReceiveCellUpdate(cellContent));
55+
add(NumberCellEvent.didReceiveCellUpdate(left(cellContent ?? "")));
5056
}
5157
}),
5258
);
@@ -57,17 +63,19 @@ class NumberCellBloc extends Bloc<NumberCellEvent, NumberCellState> {
5763
class NumberCellEvent with _$NumberCellEvent {
5864
const factory NumberCellEvent.initial() = _Initial;
5965
const factory NumberCellEvent.updateCell(String text) = _UpdateCell;
60-
const factory NumberCellEvent.didReceiveCellUpdate(String? cellContent) = _DidReceiveCellUpdate;
66+
const factory NumberCellEvent.didReceiveCellUpdate(Either<String, FlowyError> cellContent) = _DidReceiveCellUpdate;
6167
}
6268

6369
@freezed
6470
class NumberCellState with _$NumberCellState {
6571
const factory NumberCellState({
66-
required String content,
72+
required Either<String, FlowyError> content,
6773
}) = _NumberCellState;
6874

6975
factory NumberCellState.initial(GridCellContext context) {
7076
final cellContent = context.getCellData() ?? "";
71-
return NumberCellState(content: cellContent);
77+
return NumberCellState(
78+
content: left(cellContent),
79+
);
7280
}
7381
}

frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/cell/number_cell.dart

Lines changed: 25 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ class _NumberCellState extends State<NumberCell> {
2929
void initState() {
3030
final cellContext = widget.cellContextBuilder.build();
3131
_cellBloc = getIt<NumberCellBloc>(param1: cellContext)..add(const NumberCellEvent.initial());
32-
_controller = TextEditingController(text: _cellBloc.state.content);
32+
_controller = TextEditingController(text: contentFromState(_cellBloc.state));
3333
_focusNode = CellSingleFocusNode();
3434
_listenFocusNode();
3535
super.initState();
@@ -40,26 +40,25 @@ class _NumberCellState extends State<NumberCell> {
4040
_listenCellRequestFocus(context);
4141
return BlocProvider.value(
4242
value: _cellBloc,
43-
child: BlocConsumer<NumberCellBloc, NumberCellState>(
44-
listener: (context, state) {
45-
if (_controller.text != state.content) {
46-
_controller.text = state.content;
47-
}
48-
},
49-
builder: (context, state) {
50-
return TextField(
51-
controller: _controller,
52-
focusNode: _focusNode,
53-
onEditingComplete: () => _focusNode.unfocus(),
54-
maxLines: null,
55-
style: const TextStyle(fontSize: 14, fontWeight: FontWeight.w500),
56-
decoration: const InputDecoration(
57-
contentPadding: EdgeInsets.zero,
58-
border: InputBorder.none,
59-
isDense: true,
60-
),
61-
);
62-
},
43+
child: MultiBlocListener(
44+
listeners: [
45+
BlocListener<NumberCellBloc, NumberCellState>(
46+
listenWhen: (p, c) => p.content != c.content,
47+
listener: (context, state) => _controller.text = contentFromState(state),
48+
),
49+
],
50+
child: TextField(
51+
controller: _controller,
52+
focusNode: _focusNode,
53+
onEditingComplete: () => _focusNode.unfocus(),
54+
maxLines: null,
55+
style: const TextStyle(fontSize: 14, fontWeight: FontWeight.w500),
56+
decoration: const InputDecoration(
57+
contentPadding: EdgeInsets.zero,
58+
border: InputBorder.none,
59+
isDense: true,
60+
),
61+
),
6362
),
6463
);
6564
}
@@ -86,7 +85,7 @@ class _NumberCellState extends State<NumberCell> {
8685
if (mounted) {
8786
_delayOperation?.cancel();
8887
_delayOperation = Timer(const Duration(milliseconds: 300), () {
89-
if (_cellBloc.isClosed == false && _controller.text != _cellBloc.state.content) {
88+
if (_cellBloc.isClosed == false && _controller.text != contentFromState(_cellBloc.state)) {
9089
_cellBloc.add(NumberCellEvent.updateCell(_controller.text));
9190
}
9291
});
@@ -108,4 +107,8 @@ class _NumberCellState extends State<NumberCell> {
108107
}
109108
});
110109
}
110+
111+
String contentFromState(NumberCellState state) {
112+
return state.content.fold((l) => l, (r) => "");
113+
}
111114
}

0 commit comments

Comments
 (0)