group_bloc.dart 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  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. part 'group_bloc.freezed.dart';
  9. class GridGroupBloc extends Bloc<GridGroupEvent, GridGroupState> {
  10. final GridFieldCache _fieldCache;
  11. Function(List<FieldPB>)? _onFieldsFn;
  12. GridGroupBloc({required String gridId, required GridFieldCache fieldCache})
  13. : _fieldCache = fieldCache,
  14. super(GridGroupState.initial(gridId, fieldCache.fields)) {
  15. on<GridGroupEvent>(
  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(fields: 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. _fieldCache.removeListener(onFieldsListener: _onFieldsFn!);
  45. _onFieldsFn = null;
  46. }
  47. return super.close();
  48. }
  49. void _startListening() {
  50. _onFieldsFn = (fields) => add(GridGroupEvent.didReceiveFieldUpdate(fields));
  51. _fieldCache.addListener(
  52. onFields: _onFieldsFn,
  53. listenWhen: () => !isClosed,
  54. );
  55. }
  56. }
  57. @freezed
  58. class GridGroupEvent with _$GridGroupEvent {
  59. const factory GridGroupEvent.initial() = _Initial;
  60. const factory GridGroupEvent.setFieldVisibility(
  61. String fieldId, bool visibility) = _SetFieldVisibility;
  62. const factory GridGroupEvent.didReceiveFieldUpdate(List<FieldPB> fields) =
  63. _DidReceiveFieldUpdate;
  64. const factory GridGroupEvent.moveField(int fromIndex, int toIndex) =
  65. _MoveField;
  66. }
  67. @freezed
  68. class GridGroupState with _$GridGroupState {
  69. const factory GridGroupState({
  70. required String gridId,
  71. required List<FieldPB> fields,
  72. }) = _GridGroupState;
  73. factory GridGroupState.initial(String gridId, List<FieldPB> fields) =>
  74. GridGroupState(
  75. gridId: gridId,
  76. fields: fields,
  77. );
  78. }