group_bloc.dart 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. import 'package:flowy_sdk/log.dart';
  2. import 'package:flowy_sdk/protobuf/flowy-grid/field_entities.pb.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. import 'setting_service.dart';
  8. part 'group_bloc.freezed.dart';
  9. class GridGroupBloc extends Bloc<GridGroupEvent, GridGroupState> {
  10. final GridFieldController _fieldController;
  11. final SettingFFIService _settingFFIService;
  12. Function(List<GridFieldContext>)? _onFieldsFn;
  13. GridGroupBloc({
  14. required String viewId,
  15. required GridFieldController fieldController,
  16. }) : _fieldController = fieldController,
  17. _settingFFIService = SettingFFIService(viewId: viewId),
  18. super(GridGroupState.initial(viewId, fieldController.fieldContexts)) {
  19. on<GridGroupEvent>(
  20. (event, emit) async {
  21. event.when(
  22. initial: () {
  23. _startListening();
  24. },
  25. didReceiveFieldUpdate: (fieldContexts) {
  26. emit(state.copyWith(fieldContexts: fieldContexts));
  27. },
  28. setGroupByField: (String fieldId, FieldType fieldType) async {
  29. final result = await _settingFFIService.groupByField(
  30. fieldId: fieldId,
  31. fieldType: fieldType,
  32. );
  33. result.fold((l) => null, (err) => Log.error(err));
  34. },
  35. );
  36. },
  37. );
  38. }
  39. @override
  40. Future<void> close() async {
  41. if (_onFieldsFn != null) {
  42. _fieldController.removeListener(onFieldsListener: _onFieldsFn!);
  43. _onFieldsFn = null;
  44. }
  45. return super.close();
  46. }
  47. void _startListening() {
  48. _onFieldsFn = (fieldContexts) =>
  49. add(GridGroupEvent.didReceiveFieldUpdate(fieldContexts));
  50. _fieldController.addListener(
  51. onFields: _onFieldsFn,
  52. listenWhen: () => !isClosed,
  53. );
  54. }
  55. }
  56. @freezed
  57. class GridGroupEvent with _$GridGroupEvent {
  58. const factory GridGroupEvent.initial() = _Initial;
  59. const factory GridGroupEvent.setGroupByField(
  60. String fieldId,
  61. FieldType fieldType,
  62. ) = _GroupByField;
  63. const factory GridGroupEvent.didReceiveFieldUpdate(
  64. List<GridFieldContext> fields) = _DidReceiveFieldUpdate;
  65. }
  66. @freezed
  67. class GridGroupState with _$GridGroupState {
  68. const factory GridGroupState({
  69. required String gridId,
  70. required List<GridFieldContext> fieldContexts,
  71. }) = _GridGroupState;
  72. factory GridGroupState.initial(
  73. String gridId, List<GridFieldContext> fieldContexts) =>
  74. GridGroupState(
  75. gridId: gridId,
  76. fieldContexts: fieldContexts,
  77. );
  78. }