Skip to content

Commit 1267c75

Browse files
committed
refactor: TypeOptionContext
1 parent 5f51773 commit 1267c75

File tree

16 files changed

+211
-114
lines changed

16 files changed

+211
-114
lines changed

frontend/app_flowy/lib/startup/deps_resolver.dart

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,6 @@ import 'package:app_flowy/workspace/presentation/home/home_stack.dart';
1515
import 'package:app_flowy/workspace/presentation/home/menu/menu.dart';
1616
import 'package:flowy_sdk/protobuf/flowy-folder-data-model/app.pb.dart';
1717
import 'package:flowy_sdk/protobuf/flowy-folder-data-model/view.pb.dart';
18-
import 'package:flowy_sdk/protobuf/flowy-grid/date_type_option.pb.dart';
19-
import 'package:flowy_sdk/protobuf/flowy-grid/number_type_option.pb.dart';
2018
import 'package:flowy_sdk/protobuf/flowy-user-data-model/user_profile.pb.dart';
2119
import 'package:get_it/get_it.dart';
2220

@@ -187,14 +185,6 @@ void _resolveGridDeps(GetIt getIt) {
187185
),
188186
);
189187

190-
getIt.registerFactoryParam<DateTypeOptionBloc, DateTypeOption, void>(
191-
(typeOption, _) => DateTypeOptionBloc(typeOption: typeOption),
192-
);
193-
194-
getIt.registerFactoryParam<NumberTypeOptionBloc, NumberTypeOption, void>(
195-
(typeOption, _) => NumberTypeOptionBloc(typeOption: typeOption),
196-
);
197-
198188
getIt.registerFactoryParam<GridPropertyBloc, String, GridFieldCache>(
199189
(gridId, cache) => GridPropertyBloc(gridId: gridId, fieldCache: cache),
200190
);

frontend/app_flowy/lib/workspace/application/grid/field/type_option/date_bloc.dart

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,23 @@
1+
import 'package:app_flowy/workspace/application/grid/field/type_option/type_option_service.dart';
12
import 'package:flowy_sdk/protobuf/flowy-grid/date_type_option.pb.dart';
23
import 'package:flutter_bloc/flutter_bloc.dart';
34
import 'package:freezed_annotation/freezed_annotation.dart';
45
import 'dart:async';
56
import 'package:protobuf/protobuf.dart';
67
part 'date_bloc.freezed.dart';
78

9+
typedef DateTypeOptionContext = TypeOptionContext<DateTypeOption>;
10+
11+
class DateTypeOptionDataBuilder extends TypeOptionDataBuilder<DateTypeOption> {
12+
@override
13+
DateTypeOption fromBuffer(List<int> buffer) {
14+
return DateTypeOption.fromBuffer(buffer);
15+
}
16+
}
17+
818
class DateTypeOptionBloc extends Bloc<DateTypeOptionEvent, DateTypeOptionState> {
9-
DateTypeOptionBloc({required DateTypeOption typeOption}) : super(DateTypeOptionState.initial(typeOption)) {
19+
DateTypeOptionBloc({required DateTypeOptionContext typeOptionContext})
20+
: super(DateTypeOptionState.initial(typeOptionContext.typeOption)) {
1021
on<DateTypeOptionEvent>(
1122
(event, emit) async {
1223
event.map(

frontend/app_flowy/lib/workspace/application/grid/field/type_option/multi_select_bloc.dart

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,24 @@ import 'type_option_service.dart';
88

99
part 'multi_select_bloc.freezed.dart';
1010

11+
typedef MultiSelectTypeOptionContext = TypeOptionContext<MultiSelectTypeOption>;
12+
13+
class MultiSelectTypeOptionDataBuilder extends TypeOptionDataBuilder<MultiSelectTypeOption> {
14+
@override
15+
MultiSelectTypeOption fromBuffer(List<int> buffer) {
16+
return MultiSelectTypeOption.fromBuffer(buffer);
17+
}
18+
}
19+
1120
class MultiSelectTypeOptionBloc extends Bloc<MultiSelectTypeOptionEvent, MultiSelectTypeOptionState> {
1221
final TypeOptionService service;
1322

14-
MultiSelectTypeOptionBloc(TypeOptionContext typeOptionContext)
15-
: service = TypeOptionService(gridId: typeOptionContext.gridId, fieldId: typeOptionContext.field.id),
16-
super(MultiSelectTypeOptionState.initial(MultiSelectTypeOption.fromBuffer(typeOptionContext.data))) {
23+
MultiSelectTypeOptionBloc(MultiSelectTypeOptionContext typeOptionContext)
24+
: service = TypeOptionService(
25+
gridId: typeOptionContext.gridId,
26+
fieldId: typeOptionContext.field.id,
27+
),
28+
super(MultiSelectTypeOptionState.initial(typeOptionContext.typeOption)) {
1729
on<MultiSelectTypeOptionEvent>(
1830
(event, emit) async {
1931
await event.map(

frontend/app_flowy/lib/workspace/application/grid/field/type_option/number_bloc.dart

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import 'package:app_flowy/workspace/application/grid/field/type_option/type_option_service.dart';
12
import 'package:flowy_sdk/protobuf/flowy-grid/number_type_option.pb.dart';
23
import 'package:flutter_bloc/flutter_bloc.dart';
34
import 'package:freezed_annotation/freezed_annotation.dart';
@@ -6,8 +7,18 @@ import 'package:protobuf/protobuf.dart';
67

78
part 'number_bloc.freezed.dart';
89

10+
typedef NumberTypeOptionContext = TypeOptionContext<NumberTypeOption>;
11+
12+
class NumberTypeOptionDataBuilder extends TypeOptionDataBuilder<NumberTypeOption> {
13+
@override
14+
NumberTypeOption fromBuffer(List<int> buffer) {
15+
return NumberTypeOption.fromBuffer(buffer);
16+
}
17+
}
18+
919
class NumberTypeOptionBloc extends Bloc<NumberTypeOptionEvent, NumberTypeOptionState> {
10-
NumberTypeOptionBloc({required NumberTypeOption typeOption}) : super(NumberTypeOptionState.initial(typeOption)) {
20+
NumberTypeOptionBloc({required NumberTypeOptionContext typeOptionContext})
21+
: super(NumberTypeOptionState.initial(typeOptionContext.typeOption)) {
1122
on<NumberTypeOptionEvent>(
1223
(event, emit) async {
1324
event.map(

frontend/app_flowy/lib/workspace/application/grid/field/type_option/single_select_bloc.dart

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,22 @@ import 'type_option_service.dart';
88

99
part 'single_select_bloc.freezed.dart';
1010

11+
typedef SingleSelectTypeOptionContext = TypeOptionContext<SingleSelectTypeOption>;
12+
13+
class SingleSelectTypeOptionDataBuilder extends TypeOptionDataBuilder<SingleSelectTypeOption> {
14+
@override
15+
SingleSelectTypeOption fromBuffer(List<int> buffer) {
16+
return SingleSelectTypeOption.fromBuffer(buffer);
17+
}
18+
}
19+
1120
class SingleSelectTypeOptionBloc extends Bloc<SingleSelectTypeOptionEvent, SingleSelectTypeOptionState> {
1221
final TypeOptionService service;
1322

1423
SingleSelectTypeOptionBloc(
15-
TypeOptionContext typeOptionContext,
24+
SingleSelectTypeOptionContext typeOptionContext,
1625
) : service = TypeOptionService(gridId: typeOptionContext.gridId, fieldId: typeOptionContext.field.id),
17-
super(
18-
SingleSelectTypeOptionState.initial(SingleSelectTypeOption.fromBuffer(typeOptionContext.data)),
19-
) {
26+
super(SingleSelectTypeOptionState.initial(typeOptionContext.typeOption)) {
2027
on<SingleSelectTypeOptionEvent>(
2128
(event, emit) async {
2229
await event.map(

frontend/app_flowy/lib/workspace/application/grid/field/type_option/type_option_service.dart

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import 'package:flowy_sdk/protobuf/flowy-grid-data-model/grid.pb.dart';
88
import 'package:flowy_sdk/protobuf/flowy-grid/cell_entities.pb.dart';
99
import 'package:flowy_sdk/protobuf/flowy-grid/field_entities.pb.dart';
1010
import 'package:flowy_sdk/protobuf/flowy-grid/selection_type_option.pb.dart';
11+
import 'package:protobuf/protobuf.dart';
1112

1213
class TypeOptionService {
1314
final String gridId;
@@ -37,18 +38,34 @@ abstract class TypeOptionDataBuilder<T> {
3738
T fromBuffer(List<int> buffer);
3839
}
3940

40-
class TypeOptionContext {
41+
class TypeOptionContext<T extends GeneratedMessage> {
42+
T? _typeOptionObject;
4143
final GridFieldContext _fieldContext;
44+
final TypeOptionDataBuilder<T> dataBuilder;
4245

4346
TypeOptionContext({
47+
required this.dataBuilder,
4448
required GridFieldContext fieldContext,
4549
}) : _fieldContext = fieldContext;
4650

4751
String get gridId => _fieldContext.gridId;
4852

4953
Field get field => _fieldContext.field;
5054

51-
Uint8List get data => Uint8List.fromList(_fieldContext.typeOptionData);
55+
T get typeOption {
56+
if (_typeOptionObject != null) {
57+
return _typeOptionObject!;
58+
}
59+
60+
final T object = dataBuilder.fromBuffer(_fieldContext.typeOptionData);
61+
_typeOptionObject = object;
62+
return object;
63+
}
64+
65+
set typeOption(T typeOption) {
66+
_fieldContext.typeOptionData = typeOption.writeToBuffer();
67+
_typeOptionObject = null;
68+
}
5269
}
5370

5471
abstract class TypeOptionFieldDelegate {

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

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
1-
import 'package:flowy_infra/image.dart';
21
import 'package:flowy_infra/theme.dart';
32
import 'package:flowy_infra_ui/style_widget/hover.dart';
43
import 'package:flowy_infra_ui/style_widget/text.dart';
5-
import 'package:flowy_infra_ui/widget/spacing.dart';
64
import 'package:flowy_sdk/protobuf/flowy-grid/selection_type_option.pb.dart';
75
import 'package:flutter/material.dart';
86
import 'package:easy_localization/easy_localization.dart';

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

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import 'package:app_flowy/workspace/presentation/plugins/grid/src/widgets/common
77
import 'package:flowy_infra/image.dart';
88
import 'package:flowy_infra/theme.dart';
99
import 'package:flowy_infra_ui/flowy_infra_ui.dart';
10-
import 'package:flowy_infra_ui/style_widget/hover.dart';
1110
import 'package:flowy_infra_ui/style_widget/icon_button.dart';
1211
import 'package:flowy_infra_ui/style_widget/scrolling/styled_list.dart';
1312
import 'package:flowy_infra_ui/widget/spacing.dart';

frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/header/field_editor_pannel.dart

Lines changed: 63 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
import 'dart:typed_data';
22

3+
import 'package:app_flowy/workspace/application/grid/field/type_option/multi_select_bloc.dart';
34
import 'package:app_flowy/workspace/application/grid/field/type_option/type_option_service.dart';
5+
import 'package:app_flowy/workspace/presentation/plugins/grid/src/widgets/header/type_option/checkbox.dart';
46
import 'package:dartz/dartz.dart' show Either;
57
import 'package:flowy_infra/image.dart';
68
import 'package:flowy_infra/theme.dart';
@@ -9,8 +11,6 @@ import 'package:flowy_infra_ui/style_widget/button.dart';
911
import 'package:flowy_infra_ui/style_widget/text.dart';
1012
import 'package:flowy_sdk/protobuf/flowy-error/errors.pb.dart';
1113
import 'package:flowy_sdk/protobuf/flowy-grid-data-model/grid.pb.dart';
12-
import 'package:flowy_sdk/protobuf/flowy-grid/checkbox_type_option.pbserver.dart';
13-
import 'package:flowy_sdk/protobuf/flowy-grid/text_type_option.pb.dart';
1414
import 'package:flutter/material.dart';
1515
import 'package:flutter_bloc/flutter_bloc.dart';
1616
import 'package:app_flowy/workspace/application/grid/prelude.dart';
@@ -20,6 +20,7 @@ import 'package:app_flowy/workspace/presentation/plugins/grid/src/widgets/header
2020
import 'field_type_extension.dart';
2121
import 'type_option/multi_select.dart';
2222
import 'type_option/number.dart';
23+
import 'type_option/rich_text.dart';
2324
import 'type_option/single_select.dart';
2425

2526
typedef UpdateFieldCallback = void Function(Field, Uint8List);
@@ -94,14 +95,9 @@ class _FieldEditorPannelState extends State<FieldEditorPannel> {
9495
hideOverlay: _hideOverlay,
9596
);
9697

97-
final dataDelegate = TypeOptionDataDelegate(didUpdateTypeOptionData: (data) {
98-
widget.fieldContext.typeOptionData = data;
99-
});
100-
10198
final builder = _makeTypeOptionBuild(
102-
typeOptionContext: TypeOptionContext(fieldContext: widget.fieldContext),
99+
typeOptionContext: _makeTypeOptionContext(widget.fieldContext),
103100
overlayDelegate: overlayDelegate,
104-
dataDelegate: dataDelegate,
105101
);
106102

107103
return builder.customWidget;
@@ -141,27 +137,79 @@ abstract class TypeOptionBuilder {
141137
TypeOptionBuilder _makeTypeOptionBuild({
142138
required TypeOptionContext typeOptionContext,
143139
required TypeOptionOverlayDelegate overlayDelegate,
144-
required TypeOptionDataDelegate dataDelegate,
145140
}) {
146141
switch (typeOptionContext.field.fieldType) {
147142
case FieldType.Checkbox:
148-
return CheckboxTypeOptionBuilder(typeOptionContext.data);
143+
return CheckboxTypeOptionBuilder(
144+
typeOptionContext as CheckboxTypeOptionContext,
145+
);
149146
case FieldType.DateTime:
150-
return DateTypeOptionBuilder(typeOptionContext.data, overlayDelegate, dataDelegate);
147+
return DateTypeOptionBuilder(
148+
typeOptionContext as DateTypeOptionContext,
149+
overlayDelegate,
150+
);
151151
case FieldType.SingleSelect:
152-
return SingleSelectTypeOptionBuilder(typeOptionContext, overlayDelegate, dataDelegate);
152+
return SingleSelectTypeOptionBuilder(
153+
typeOptionContext as SingleSelectTypeOptionContext,
154+
overlayDelegate,
155+
);
153156
case FieldType.MultiSelect:
154-
return MultiSelectTypeOptionBuilder(typeOptionContext, overlayDelegate, dataDelegate);
157+
return MultiSelectTypeOptionBuilder(
158+
typeOptionContext as MultiSelectTypeOptionContext,
159+
overlayDelegate,
160+
);
155161
case FieldType.Number:
156-
return NumberTypeOptionBuilder(typeOptionContext.data, overlayDelegate, dataDelegate);
162+
return NumberTypeOptionBuilder(
163+
typeOptionContext as NumberTypeOptionContext,
164+
overlayDelegate,
165+
);
157166
case FieldType.RichText:
158-
return RichTextTypeOptionBuilder(typeOptionContext.data);
167+
return RichTextTypeOptionBuilder(
168+
typeOptionContext as RichTextTypeOptionContext,
169+
);
159170

160171
default:
161172
throw UnimplementedError;
162173
}
163174
}
164175

176+
TypeOptionContext _makeTypeOptionContext(GridFieldContext fieldContext) {
177+
switch (fieldContext.field.fieldType) {
178+
case FieldType.Checkbox:
179+
return CheckboxTypeOptionContext(
180+
fieldContext: fieldContext,
181+
dataBuilder: CheckboxTypeOptionDataBuilder(),
182+
);
183+
case FieldType.DateTime:
184+
return DateTypeOptionContext(
185+
fieldContext: fieldContext,
186+
dataBuilder: DateTypeOptionDataBuilder(),
187+
);
188+
case FieldType.MultiSelect:
189+
return MultiSelectTypeOptionContext(
190+
fieldContext: fieldContext,
191+
dataBuilder: MultiSelectTypeOptionDataBuilder(),
192+
);
193+
case FieldType.Number:
194+
return NumberTypeOptionContext(
195+
fieldContext: fieldContext,
196+
dataBuilder: NumberTypeOptionDataBuilder(),
197+
);
198+
case FieldType.RichText:
199+
return RichTextTypeOptionContext(
200+
fieldContext: fieldContext,
201+
dataBuilder: RichTextTypeOptionDataBuilder(),
202+
);
203+
case FieldType.SingleSelect:
204+
return SingleSelectTypeOptionContext(
205+
fieldContext: fieldContext,
206+
dataBuilder: SingleSelectTypeOptionDataBuilder(),
207+
);
208+
default:
209+
throw UnimplementedError();
210+
}
211+
}
212+
165213
abstract class TypeOptionWidget extends StatelessWidget {
166214
const TypeOptionWidget({Key? key}) : super(key: key);
167215
}
@@ -183,29 +231,3 @@ class TypeOptionOverlayDelegate {
183231
required this.hideOverlay,
184232
});
185233
}
186-
187-
class TypeOptionDataDelegate {
188-
TypeOptionDataCallback didUpdateTypeOptionData;
189-
190-
TypeOptionDataDelegate({
191-
required this.didUpdateTypeOptionData,
192-
});
193-
}
194-
195-
class RichTextTypeOptionBuilder extends TypeOptionBuilder {
196-
RichTextTypeOption typeOption;
197-
198-
RichTextTypeOptionBuilder(TypeOptionData typeOptionData) : typeOption = RichTextTypeOption.fromBuffer(typeOptionData);
199-
200-
@override
201-
Widget? get customWidget => null;
202-
}
203-
204-
class CheckboxTypeOptionBuilder extends TypeOptionBuilder {
205-
CheckboxTypeOption typeOption;
206-
207-
CheckboxTypeOptionBuilder(TypeOptionData typeOptionData) : typeOption = CheckboxTypeOption.fromBuffer(typeOptionData);
208-
209-
@override
210-
Widget? get customWidget => null;
211-
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import 'package:app_flowy/workspace/application/grid/field/type_option/type_option_service.dart';
2+
import 'package:app_flowy/workspace/presentation/plugins/grid/src/widgets/header/field_editor_pannel.dart';
3+
import 'package:flowy_sdk/protobuf/flowy-grid/checkbox_type_option.pb.dart';
4+
import 'package:flutter/material.dart';
5+
6+
typedef CheckboxTypeOptionContext = TypeOptionContext<CheckboxTypeOption>;
7+
8+
class CheckboxTypeOptionDataBuilder extends TypeOptionDataBuilder<CheckboxTypeOption> {
9+
@override
10+
CheckboxTypeOption fromBuffer(List<int> buffer) {
11+
return CheckboxTypeOption.fromBuffer(buffer);
12+
}
13+
}
14+
15+
class CheckboxTypeOptionBuilder extends TypeOptionBuilder {
16+
CheckboxTypeOptionBuilder(CheckboxTypeOptionContext typeOptionContext);
17+
18+
@override
19+
Widget? get customWidget => null;
20+
}

0 commit comments

Comments
 (0)