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