property_bloc.dart 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  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<GridFieldContext>)? _onFieldsFn;
  11. GridPropertyBloc(
  12. {required String gridId, required GridFieldController fieldController})
  13. : _fieldController = fieldController,
  14. super(
  15. GridPropertyState.initial(gridId, fieldController.fieldContexts)) {
  16. on<GridPropertyEvent>(
  17. (event, emit) async {
  18. await event.map(
  19. initial: (_Initial value) {
  20. _startListening();
  21. },
  22. setFieldVisibility: (_SetFieldVisibility value) async {
  23. final fieldService =
  24. FieldService(gridId: gridId, fieldId: value.fieldId);
  25. final result =
  26. await fieldService.updateField(visibility: value.visibility);
  27. result.fold(
  28. (l) => null,
  29. (err) => Log.error(err),
  30. );
  31. },
  32. didReceiveFieldUpdate: (_DidReceiveFieldUpdate value) {
  33. emit(state.copyWith(fieldContexts: value.fields));
  34. },
  35. moveField: (_MoveField value) {
  36. //
  37. },
  38. );
  39. },
  40. );
  41. }
  42. @override
  43. Future<void> close() async {
  44. if (_onFieldsFn != null) {
  45. _fieldController.removeListener(onFieldsListener: _onFieldsFn!);
  46. _onFieldsFn = null;
  47. }
  48. return super.close();
  49. }
  50. void _startListening() {
  51. _onFieldsFn =
  52. (fields) => add(GridPropertyEvent.didReceiveFieldUpdate(fields));
  53. _fieldController.addListener(
  54. onFields: _onFieldsFn,
  55. listenWhen: () => !isClosed,
  56. );
  57. }
  58. }
  59. @freezed
  60. class GridPropertyEvent with _$GridPropertyEvent {
  61. const factory GridPropertyEvent.initial() = _Initial;
  62. const factory GridPropertyEvent.setFieldVisibility(
  63. String fieldId, bool visibility) = _SetFieldVisibility;
  64. const factory GridPropertyEvent.didReceiveFieldUpdate(
  65. List<GridFieldContext> fields) = _DidReceiveFieldUpdate;
  66. const factory GridPropertyEvent.moveField(int fromIndex, int toIndex) =
  67. _MoveField;
  68. }
  69. @freezed
  70. class GridPropertyState with _$GridPropertyState {
  71. const factory GridPropertyState({
  72. required String gridId,
  73. required List<GridFieldContext> fieldContexts,
  74. }) = _GridPropertyState;
  75. factory GridPropertyState.initial(
  76. String gridId,
  77. List<GridFieldContext> fieldContexts,
  78. ) =>
  79. GridPropertyState(
  80. gridId: gridId,
  81. fieldContexts: fieldContexts,
  82. );
  83. }