property_bloc.dart 2.8 KB

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