grid_header_bloc.dart 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. import 'package:app_flowy/plugins/grid/application/field/field_service.dart';
  2. import 'package:flowy_sdk/log.dart';
  3. import 'package:flowy_sdk/protobuf/flowy-grid/field_entities.pb.dart';
  4. import 'package:flutter_bloc/flutter_bloc.dart';
  5. import 'package:freezed_annotation/freezed_annotation.dart';
  6. import 'dart:async';
  7. import 'field/field_controller.dart';
  8. part 'grid_header_bloc.freezed.dart';
  9. class GridHeaderBloc extends Bloc<GridHeaderEvent, GridHeaderState> {
  10. final GridFieldController fieldController;
  11. final String gridId;
  12. GridHeaderBloc({
  13. required this.gridId,
  14. required this.fieldController,
  15. }) : super(GridHeaderState.initial(fieldController.fieldContexts)) {
  16. on<GridHeaderEvent>(
  17. (event, emit) async {
  18. await event.map(
  19. initial: (_InitialHeader value) async {
  20. _startListening();
  21. },
  22. didReceiveFieldUpdate: (_DidReceiveFieldUpdate value) {
  23. emit(state.copyWith(fields: value.fields));
  24. },
  25. moveField: (_MoveField value) async {
  26. await _moveField(value, emit);
  27. },
  28. );
  29. },
  30. );
  31. }
  32. Future<void> _moveField(
  33. _MoveField value, Emitter<GridHeaderState> emit) async {
  34. final fields = List<GridFieldContext>.from(state.fields);
  35. fields.insert(value.toIndex, fields.removeAt(value.fromIndex));
  36. emit(state.copyWith(fields: fields));
  37. final fieldService = FieldService(gridId: gridId, fieldId: value.field.id);
  38. final result = await fieldService.moveField(
  39. value.fromIndex,
  40. value.toIndex,
  41. );
  42. result.fold((l) {}, (err) => Log.error(err));
  43. }
  44. Future<void> _startListening() async {
  45. fieldController.addListener(
  46. onFields: (fields) => add(GridHeaderEvent.didReceiveFieldUpdate(fields)),
  47. listenWhen: () => !isClosed,
  48. );
  49. }
  50. @override
  51. Future<void> close() async {
  52. return super.close();
  53. }
  54. }
  55. @freezed
  56. class GridHeaderEvent with _$GridHeaderEvent {
  57. const factory GridHeaderEvent.initial() = _InitialHeader;
  58. const factory GridHeaderEvent.didReceiveFieldUpdate(
  59. List<GridFieldContext> fields) = _DidReceiveFieldUpdate;
  60. const factory GridHeaderEvent.moveField(
  61. FieldPB field, int fromIndex, int toIndex) = _MoveField;
  62. }
  63. @freezed
  64. class GridHeaderState with _$GridHeaderState {
  65. const factory GridHeaderState({required List<GridFieldContext> fields}) =
  66. _GridHeaderState;
  67. factory GridHeaderState.initial(List<GridFieldContext> fields) {
  68. // final List<FieldPB> newFields = List.from(fields);
  69. // newFields.retainWhere((field) => field.visibility);
  70. return GridHeaderState(fields: fields);
  71. }
  72. }