group_controller.dart 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  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. void addNewRow(GroupPB group, RowPB row);
  11. }
  12. class GroupController {
  13. final GroupPB group;
  14. final GroupListener _listener;
  15. final GroupControllerDelegate delegate;
  16. GroupController({
  17. required String gridId,
  18. required this.group,
  19. required this.delegate,
  20. }) : _listener = GroupListener(group);
  21. RowPB? rowAtIndex(int index) {
  22. if (index < group.rows.length) {
  23. return group.rows[index];
  24. } else {
  25. return null;
  26. }
  27. }
  28. void startListening() {
  29. _listener.start(onGroupChanged: (result) {
  30. result.fold(
  31. (GroupChangesetPB changeset) {
  32. for (final deletedRow in changeset.deletedRows) {
  33. group.rows.removeWhere((rowPB) => rowPB.id == deletedRow);
  34. delegate.removeRow(group, deletedRow);
  35. }
  36. for (final insertedRow in changeset.insertedRows) {
  37. final index = insertedRow.hasIndex() ? insertedRow.index : null;
  38. if (insertedRow.hasIndex() &&
  39. group.rows.length > insertedRow.index) {
  40. group.rows.insert(insertedRow.index, insertedRow.row);
  41. } else {
  42. group.rows.add(insertedRow.row);
  43. }
  44. if (insertedRow.isNew) {
  45. delegate.addNewRow(group, insertedRow.row);
  46. } else {
  47. delegate.insertRow(group, insertedRow.row, index);
  48. }
  49. }
  50. for (final updatedRow in changeset.updatedRows) {
  51. final index = group.rows.indexWhere(
  52. (rowPB) => rowPB.id == updatedRow.id,
  53. );
  54. if (index != -1) {
  55. group.rows[index] = updatedRow;
  56. }
  57. delegate.updateRow(group, updatedRow);
  58. }
  59. },
  60. (err) => Log.error(err),
  61. );
  62. });
  63. }
  64. // GroupChangesetPB _transformChangeset(GroupChangesetPB changeset) {
  65. // final insertedRows = changeset.insertedRows
  66. // .where(
  67. // (delete) => !changeset.deletedRows.contains(delete.row.id),
  68. // )
  69. // .toList();
  70. // final deletedRows = changeset.deletedRows
  71. // .where((deletedRowId) =>
  72. // changeset.insertedRows
  73. // .indexWhere((insert) => insert.row.id == deletedRowId) ==
  74. // -1)
  75. // .toList();
  76. // return changeset.rebuild((rebuildChangeset) {
  77. // rebuildChangeset.insertedRows.clear();
  78. // rebuildChangeset.insertedRows.addAll(insertedRows);
  79. // rebuildChangeset.deletedRows.clear();
  80. // rebuildChangeset.deletedRows.addAll(deletedRows);
  81. // });
  82. // }
  83. Future<void> dispose() async {
  84. _listener.stop();
  85. }
  86. }