group_bloc.dart 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. import 'package:app_flowy/plugins/grid/application/field/field_service.dart';
  2. import 'package:flowy_sdk/log.dart';
  3. import 'package:flowy_sdk/protobuf/flowy-grid/field_entities.pb.dart';
  4. import 'package:flutter_bloc/flutter_bloc.dart';
  5. import 'package:freezed_annotation/freezed_annotation.dart';
  6. import 'dart:async';
  7. import '../field/field_cache.dart';
  8. import 'setting_controller.dart';
  9. part 'group_bloc.freezed.dart';
  10. class GridGroupBloc extends Bloc<GridGroupEvent, GridGroupState> {
  11. final GridFieldCache _fieldCache;
  12. final SettingController _settingController;
  13. Function(List<FieldPB>)? _onFieldsFn;
  14. GridGroupBloc({required String viewId, required GridFieldCache fieldCache})
  15. : _fieldCache = fieldCache,
  16. _settingController = SettingController(viewId: viewId),
  17. super(GridGroupState.initial(viewId, fieldCache.fields)) {
  18. on<GridGroupEvent>(
  19. (event, emit) async {
  20. await event.map(
  21. initial: (_Initial value) {
  22. _startListening();
  23. },
  24. setFieldVisibility: (_SetFieldVisibility value) async {
  25. final fieldService =
  26. FieldService(gridId: viewId, fieldId: value.fieldId);
  27. final result =
  28. await fieldService.updateField(visibility: value.visibility);
  29. result.fold(
  30. (l) => null,
  31. (err) => Log.error(err),
  32. );
  33. },
  34. didReceiveFieldUpdate: (_DidReceiveFieldUpdate value) {
  35. emit(state.copyWith(fields: value.fields));
  36. },
  37. moveField: (_MoveField value) {
  38. //
  39. },
  40. );
  41. },
  42. );
  43. }
  44. @override
  45. Future<void> close() async {
  46. if (_onFieldsFn != null) {
  47. _fieldCache.removeListener(onFieldsListener: _onFieldsFn!);
  48. _onFieldsFn = null;
  49. }
  50. return super.close();
  51. }
  52. void _startListening() {
  53. _onFieldsFn = (fields) => add(GridGroupEvent.didReceiveFieldUpdate(fields));
  54. _fieldCache.addListener(
  55. onFields: _onFieldsFn,
  56. listenWhen: () => !isClosed,
  57. );
  58. _settingController.startListeing(
  59. onSettingUpdated: (setting) {},
  60. onError: (err) {},
  61. );
  62. }
  63. }
  64. @freezed
  65. class GridGroupEvent with _$GridGroupEvent {
  66. const factory GridGroupEvent.initial() = _Initial;
  67. const factory GridGroupEvent.setFieldVisibility(
  68. String fieldId, bool visibility) = _SetFieldVisibility;
  69. const factory GridGroupEvent.didReceiveFieldUpdate(List<FieldPB> fields) =
  70. _DidReceiveFieldUpdate;
  71. const factory GridGroupEvent.moveField(int fromIndex, int toIndex) =
  72. _MoveField;
  73. }
  74. @freezed
  75. class GridGroupState with _$GridGroupState {
  76. const factory GridGroupState({
  77. required String gridId,
  78. required List<FieldPB> fields,
  79. }) = _GridGroupState;
  80. factory GridGroupState.initial(String gridId, List<FieldPB> fields) =>
  81. GridGroupState(
  82. gridId: gridId,
  83. fields: fields,
  84. );
  85. }