grid_header_bloc.dart 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. import 'package:app_flowy/plugins/grid/application/field/field_service.dart';
  2. import 'package:appflowy_backend/log.dart';
  3. import 'package:appflowy_backend/protobuf/flowy-database/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 databaseId;
  12. GridHeaderBloc({
  13. required this.databaseId,
  14. required this.fieldController,
  15. }) : super(GridHeaderState.initial(fieldController.fieldInfos)) {
  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(
  24. state.copyWith(
  25. fields: value.fields
  26. .where((element) => element.visibility)
  27. .toList(),
  28. ),
  29. );
  30. },
  31. moveField: (_MoveField value) async {
  32. await _moveField(value, emit);
  33. },
  34. );
  35. },
  36. );
  37. }
  38. Future<void> _moveField(
  39. _MoveField value, Emitter<GridHeaderState> emit) async {
  40. final fields = List<FieldInfo>.from(state.fields);
  41. fields.insert(value.toIndex, fields.removeAt(value.fromIndex));
  42. emit(state.copyWith(fields: fields));
  43. final fieldService =
  44. FieldService(databaseId: databaseId, fieldId: value.field.id);
  45. final result = await fieldService.moveField(
  46. value.fromIndex,
  47. value.toIndex,
  48. );
  49. result.fold((l) {}, (err) => Log.error(err));
  50. }
  51. Future<void> _startListening() async {
  52. fieldController.addListener(
  53. onFields: (fields) => add(GridHeaderEvent.didReceiveFieldUpdate(fields)),
  54. listenWhen: () => !isClosed,
  55. );
  56. }
  57. @override
  58. Future<void> close() async {
  59. return super.close();
  60. }
  61. }
  62. @freezed
  63. class GridHeaderEvent with _$GridHeaderEvent {
  64. const factory GridHeaderEvent.initial() = _InitialHeader;
  65. const factory GridHeaderEvent.didReceiveFieldUpdate(List<FieldInfo> fields) =
  66. _DidReceiveFieldUpdate;
  67. const factory GridHeaderEvent.moveField(
  68. FieldPB field, int fromIndex, int toIndex) = _MoveField;
  69. }
  70. @freezed
  71. class GridHeaderState with _$GridHeaderState {
  72. const factory GridHeaderState({required List<FieldInfo> fields}) =
  73. _GridHeaderState;
  74. factory GridHeaderState.initial(List<FieldInfo> fields) {
  75. // final List<FieldPB> newFields = List.from(fields);
  76. // newFields.retainWhere((field) => field.visibility);
  77. return GridHeaderState(fields: fields);
  78. }
  79. }