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_controller.dart'; part 'grid_header_bloc.freezed.dart'; class GridHeaderBloc extends Bloc { final GridFieldController fieldController; final String gridId; GridHeaderBloc({ required this.gridId, required this.fieldController, }) : super(GridHeaderState.initial(fieldController.fieldContexts)) { on( (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 _moveField( _MoveField value, Emitter emit) async { final fields = List.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 _startListening() async { fieldController.addListener( onFields: (fields) => add(GridHeaderEvent.didReceiveFieldUpdate(fields)), listenWhen: () => !isClosed, ); } @override Future close() async { return super.close(); } } @freezed class GridHeaderEvent with _$GridHeaderEvent { const factory GridHeaderEvent.initial() = _InitialHeader; const factory GridHeaderEvent.didReceiveFieldUpdate( List fields) = _DidReceiveFieldUpdate; const factory GridHeaderEvent.moveField( FieldPB field, int fromIndex, int toIndex) = _MoveField; } @freezed class GridHeaderState with _$GridHeaderState { const factory GridHeaderState({required List fields}) = _GridHeaderState; factory GridHeaderState.initial(List fields) { // final List newFields = List.from(fields); // newFields.retainWhere((field) => field.visibility); return GridHeaderState(fields: fields); } }