group_controller.dart 2.1 KB

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