property_bloc.dart 2.7 KB

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