| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283 | import 'package:app_flowy/plugins/grid/application/field/field_service.dart';import 'package:flowy_sdk/log.dart';import 'package:flowy_sdk/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_cache.dart';part 'grid_header_bloc.freezed.dart';class GridHeaderBloc extends Bloc<GridHeaderEvent, GridHeaderState> {  final GridFieldCache fieldCache;  final String gridId;  GridHeaderBloc({    required this.gridId,    required this.fieldCache,  }) : super(GridHeaderState.initial(fieldCache.fields)) {    on<GridHeaderEvent>(      (event, emit) async {        await event.map(          initial: (_InitialHeader value) async {            _startListening();          },          didReceiveFieldUpdate: (_DidReceiveFieldUpdate value) {            emit(state.copyWith(fields: value.fields));          },          moveField: (_MoveField value) async {            await _moveField(value, emit);          },        );      },    );  }  Future<void> _moveField(      _MoveField value, Emitter<GridHeaderState> emit) async {    final fields = List<FieldPB>.from(state.fields);    fields.insert(value.toIndex, fields.removeAt(value.fromIndex));    emit(state.copyWith(fields: fields));    final fieldService = FieldService(gridId: gridId, fieldId: value.field.id);    final result = await fieldService.moveField(      value.fromIndex,      value.toIndex,    );    result.fold((l) {}, (err) => Log.error(err));  }  Future<void> _startListening() async {    fieldCache.addListener(      onFields: (fields) => add(GridHeaderEvent.didReceiveFieldUpdate(fields)),      listenWhen: () => !isClosed,    );  }  @override  Future<void> close() async {    return super.close();  }}@freezedclass GridHeaderEvent with _$GridHeaderEvent {  const factory GridHeaderEvent.initial() = _InitialHeader;  const factory GridHeaderEvent.didReceiveFieldUpdate(List<FieldPB> fields) =      _DidReceiveFieldUpdate;  const factory GridHeaderEvent.moveField(      FieldPB field, int fromIndex, int toIndex) = _MoveField;}@freezedclass GridHeaderState with _$GridHeaderState {  const factory GridHeaderState({required List<FieldPB> fields}) =      _GridHeaderState;  factory GridHeaderState.initial(List<FieldPB> fields) {    // final List<FieldPB> newFields = List.from(fields);    // newFields.retainWhere((field) => field.visibility);    return GridHeaderState(fields: fields);  }}
 |