Skip to content

Commit f3b87d4

Browse files
committed
chore: optimaze create option progress
1 parent 1267c75 commit f3b87d4

File tree

12 files changed

+227
-314
lines changed

12 files changed

+227
-314
lines changed

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

Lines changed: 0 additions & 101 deletions
This file was deleted.
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
import 'package:app_flowy/workspace/application/grid/field/field_service.dart';
2+
import 'package:flowy_sdk/log.dart';
3+
import 'package:flowy_sdk/protobuf/flowy-grid/selection_type_option.pb.dart';
4+
import 'dart:async';
5+
import 'package:protobuf/protobuf.dart';
6+
import 'select_option_type_option_bloc.dart';
7+
import 'type_option_service.dart';
8+
9+
class MultiSelectTypeOptionContext extends TypeOptionContext<MultiSelectTypeOption> with SelectOptionTypeOptionAction {
10+
final TypeOptionService service;
11+
12+
MultiSelectTypeOptionContext({
13+
required MultiSelectTypeOptionDataBuilder dataBuilder,
14+
required GridFieldContext fieldContext,
15+
}) : service = TypeOptionService(
16+
gridId: fieldContext.gridId,
17+
fieldId: fieldContext.field.id,
18+
),
19+
super(dataBuilder: dataBuilder, fieldContext: fieldContext);
20+
21+
@override
22+
List<SelectOption> Function(SelectOption) get deleteOption {
23+
return (SelectOption option) {
24+
typeOption.freeze();
25+
typeOption = typeOption.rebuild((typeOption) {
26+
final index = typeOption.options.indexWhere((element) => element.id == option.id);
27+
if (index != -1) {
28+
typeOption.options.removeAt(index);
29+
}
30+
});
31+
return typeOption.options;
32+
};
33+
}
34+
35+
@override
36+
Future<List<SelectOption>> Function(String) get insertOption {
37+
return (String optionName) {
38+
return service.newOption(name: optionName).then((result) {
39+
return result.fold(
40+
(option) {
41+
typeOption.freeze();
42+
typeOption = typeOption.rebuild((typeOption) {
43+
typeOption.options.insert(0, option);
44+
});
45+
46+
return typeOption.options;
47+
},
48+
(err) {
49+
Log.error(err);
50+
return typeOption.options;
51+
},
52+
);
53+
});
54+
};
55+
}
56+
57+
@override
58+
List<SelectOption> Function(SelectOption) get udpateOption {
59+
return (SelectOption option) {
60+
typeOption.freeze();
61+
typeOption = typeOption.rebuild((typeOption) {
62+
final index = typeOption.options.indexWhere((element) => element.id == option.id);
63+
if (index != -1) {
64+
typeOption.options[index] = option;
65+
}
66+
});
67+
return typeOption.options;
68+
};
69+
}
70+
}
71+
72+
class MultiSelectTypeOptionDataBuilder extends TypeOptionDataBuilder<MultiSelectTypeOption> {
73+
@override
74+
MultiSelectTypeOption fromBuffer(List<int> buffer) {
75+
return MultiSelectTypeOption.fromBuffer(buffer);
76+
}
77+
}

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

Lines changed: 30 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -5,26 +5,41 @@ import 'dart:async';
55
import 'package:dartz/dartz.dart';
66
part 'select_option_type_option_bloc.freezed.dart';
77

8-
class SelectOptionTypeOptionBloc extends Bloc<SelectOptionTypeOptionEvent, SelectOptionTyepOptionState> {
9-
SelectOptionTypeOptionBloc({required List<SelectOption> options})
10-
: super(SelectOptionTyepOptionState.initial(options)) {
8+
abstract class SelectOptionTypeOptionAction {
9+
Future<List<SelectOption>> Function(String) get insertOption;
10+
11+
List<SelectOption> Function(SelectOption) get deleteOption;
12+
13+
List<SelectOption> Function(SelectOption) get udpateOption;
14+
}
15+
16+
class SelectOptionTypeOptionBloc extends Bloc<SelectOptionTypeOptionEvent, SelectOptionTypeOptionState> {
17+
final SelectOptionTypeOptionAction typeOptionAction;
18+
19+
SelectOptionTypeOptionBloc({
20+
required List<SelectOption> options,
21+
required this.typeOptionAction,
22+
}) : super(SelectOptionTypeOptionState.initial(options)) {
1123
on<SelectOptionTypeOptionEvent>(
1224
(event, emit) async {
13-
await event.map(
14-
createOption: (_CreateOption value) async {
15-
emit(state.copyWith(isEditingOption: true, newOptionName: Some(value.optionName)));
25+
await event.when(
26+
createOption: (optionName) async {
27+
final List<SelectOption> options = await typeOptionAction.insertOption(optionName);
28+
emit(state.copyWith(options: options));
1629
},
17-
addingOption: (_AddingOption value) {
30+
addingOption: () {
1831
emit(state.copyWith(isEditingOption: true, newOptionName: none()));
1932
},
20-
endAddingOption: (_EndAddingOption value) {
33+
endAddingOption: () {
2134
emit(state.copyWith(isEditingOption: false, newOptionName: none()));
2235
},
23-
updateOption: (_UpdateOption value) {
24-
emit(state.copyWith(updateOption: Some(value.option)));
36+
updateOption: (option) {
37+
final List<SelectOption> options = typeOptionAction.udpateOption(option);
38+
emit(state.copyWith(options: options));
2539
},
26-
deleteOption: (_DeleteOption value) {
27-
emit(state.copyWith(deleteOption: Some(value.option)));
40+
deleteOption: (option) {
41+
final List<SelectOption> options = typeOptionAction.deleteOption(option);
42+
emit(state.copyWith(options: options));
2843
},
2944
);
3045
},
@@ -47,20 +62,16 @@ class SelectOptionTypeOptionEvent with _$SelectOptionTypeOptionEvent {
4762
}
4863

4964
@freezed
50-
class SelectOptionTyepOptionState with _$SelectOptionTyepOptionState {
51-
const factory SelectOptionTyepOptionState({
65+
class SelectOptionTypeOptionState with _$SelectOptionTypeOptionState {
66+
const factory SelectOptionTypeOptionState({
5267
required List<SelectOption> options,
5368
required bool isEditingOption,
5469
required Option<String> newOptionName,
55-
required Option<SelectOption> updateOption,
56-
required Option<SelectOption> deleteOption,
5770
}) = _SelectOptionTyepOptionState;
5871

59-
factory SelectOptionTyepOptionState.initial(List<SelectOption> options) => SelectOptionTyepOptionState(
72+
factory SelectOptionTypeOptionState.initial(List<SelectOption> options) => SelectOptionTypeOptionState(
6073
options: options,
6174
isEditingOption: false,
6275
newOptionName: none(),
63-
updateOption: none(),
64-
deleteOption: none(),
6576
);
6677
}

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

Lines changed: 0 additions & 99 deletions
This file was deleted.

0 commit comments

Comments
 (0)