group_controller.dart 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. import 'package:app_flowy/plugins/grid/application/row/row_service.dart';
  2. import 'package:flowy_sdk/log.dart';
  3. import 'package:flowy_sdk/protobuf/flowy-error/errors.pb.dart';
  4. import 'package:flowy_sdk/protobuf/flowy-grid/protobuf.dart';
  5. import 'group_listener.dart';
  6. typedef OnGroupError = void Function(FlowyError);
  7. abstract class GroupControllerDelegate {
  8. void removeRow(String groupId, String rowId);
  9. void insertRow(String groupId, RowPB row, int? index);
  10. void updateRow(String groupId, RowPB row);
  11. }
  12. class GroupController {
  13. final GroupPB group;
  14. final GroupListener _listener;
  15. final MoveRowFFIService _rowService;
  16. final GroupControllerDelegate delegate;
  17. OnGroupError? _onError;
  18. GroupController({
  19. required String gridId,
  20. required this.group,
  21. required this.delegate,
  22. }) : _rowService = MoveRowFFIService(gridId: gridId),
  23. _listener = GroupListener(group);
  24. Future<void> moveRow(int fromIndex, int toIndex) async {
  25. if (fromIndex < group.rows.length && toIndex < group.rows.length) {
  26. final fromRow = group.rows[fromIndex];
  27. final toRow = group.rows[toIndex];
  28. final result = await _rowService.moveRow(
  29. rowId: fromRow.id,
  30. fromIndex: fromIndex,
  31. toIndex: toIndex,
  32. upperRowId: toRow.id,
  33. layout: GridLayout.Board,
  34. );
  35. result.fold((l) => null, (r) => _onError?.call(r));
  36. }
  37. }
  38. void startListening({OnGroupError? onError}) {
  39. _onError = onError;
  40. _listener.start(onGroupChanged: (result) {
  41. result.fold(
  42. (GroupRowsChangesetPB changeset) {
  43. for (final insertedRow in changeset.insertedRows) {
  44. final index = insertedRow.hasIndex() ? insertedRow.index : null;
  45. delegate.insertRow(
  46. group.groupId,
  47. insertedRow.row,
  48. index,
  49. );
  50. }
  51. for (final deletedRow in changeset.deletedRows) {
  52. delegate.removeRow(group.groupId, deletedRow);
  53. }
  54. for (final updatedRow in changeset.updatedRows) {
  55. delegate.updateRow(group.groupId, updatedRow);
  56. }
  57. },
  58. (err) => Log.error(err),
  59. );
  60. });
  61. }
  62. Future<void> dispose() async {
  63. _listener.stop();
  64. }
  65. }