| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687 | import 'package:appflowy_backend/log.dart';import 'package:appflowy_backend/protobuf/flowy-grid/field_entities.pb.dart';import 'package:flutter_bloc/flutter_bloc.dart';import 'package:freezed_annotation/freezed_annotation.dart';import 'dart:async';import '../field/field_controller.dart';import 'setting_service.dart';part 'group_bloc.freezed.dart';class GridGroupBloc extends Bloc<GridGroupEvent, GridGroupState> {  final GridFieldController _fieldController;  final SettingFFIService _settingFFIService;  Function(List<FieldInfo>)? _onFieldsFn;  GridGroupBloc({    required String viewId,    required GridFieldController fieldController,  })  : _fieldController = fieldController,        _settingFFIService = SettingFFIService(viewId: viewId),        super(GridGroupState.initial(viewId, fieldController.fieldInfos)) {    on<GridGroupEvent>(      (event, emit) async {        event.when(          initial: () {            _startListening();          },          didReceiveFieldUpdate: (fieldContexts) {            emit(state.copyWith(fieldContexts: fieldContexts));          },          setGroupByField: (String fieldId, FieldType fieldType) async {            final result = await _settingFFIService.groupByField(              fieldId: fieldId,              fieldType: fieldType,            );            result.fold((l) => null, (err) => Log.error(err));          },        );      },    );  }  @override  Future<void> close() async {    if (_onFieldsFn != null) {      _fieldController.removeListener(onFieldsListener: _onFieldsFn!);      _onFieldsFn = null;    }    return super.close();  }  void _startListening() {    _onFieldsFn = (fieldContexts) =>        add(GridGroupEvent.didReceiveFieldUpdate(fieldContexts));    _fieldController.addListener(      onFields: _onFieldsFn,      listenWhen: () => !isClosed,    );  }}@freezedclass GridGroupEvent with _$GridGroupEvent {  const factory GridGroupEvent.initial() = _Initial;  const factory GridGroupEvent.setGroupByField(    String fieldId,    FieldType fieldType,  ) = _GroupByField;  const factory GridGroupEvent.didReceiveFieldUpdate(List<FieldInfo> fields) =      _DidReceiveFieldUpdate;}@freezedclass GridGroupState with _$GridGroupState {  const factory GridGroupState({    required String gridId,    required List<FieldInfo> fieldContexts,  }) = _GridGroupState;  factory GridGroupState.initial(          String gridId, List<FieldInfo> fieldContexts) =>      GridGroupState(        gridId: gridId,        fieldContexts: fieldContexts,      );}
 |