group_controller.dart 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  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, int? index);
  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. RowPB? lastRow() {
  29. if (group.rows.isEmpty) return null;
  30. return group.rows.last;
  31. }
  32. void startListening() {
  33. _listener.start(onGroupChanged: (result) {
  34. result.fold(
  35. (GroupChangesetPB changeset) {
  36. for (final deletedRow in changeset.deletedRows) {
  37. group.rows.removeWhere((rowPB) => rowPB.id == deletedRow);
  38. delegate.removeRow(group, deletedRow);
  39. }
  40. for (final insertedRow in changeset.insertedRows) {
  41. final index = insertedRow.hasIndex() ? insertedRow.index : null;
  42. if (insertedRow.hasIndex() &&
  43. group.rows.length > insertedRow.index) {
  44. group.rows.insert(insertedRow.index, insertedRow.row);
  45. } else {
  46. group.rows.add(insertedRow.row);
  47. }
  48. if (insertedRow.isNew) {
  49. delegate.addNewRow(group, insertedRow.row, index);
  50. } else {
  51. delegate.insertRow(group, insertedRow.row, index);
  52. }
  53. }
  54. for (final updatedRow in changeset.updatedRows) {
  55. final index = group.rows.indexWhere(
  56. (rowPB) => rowPB.id == updatedRow.id,
  57. );
  58. if (index != -1) {
  59. group.rows[index] = updatedRow;
  60. }
  61. delegate.updateRow(group, updatedRow);
  62. }
  63. },
  64. (err) => Log.error(err),
  65. );
  66. });
  67. }
  68. // GroupChangesetPB _transformChangeset(GroupChangesetPB changeset) {
  69. // final insertedRows = changeset.insertedRows
  70. // .where(
  71. // (delete) => !changeset.deletedRows.contains(delete.row.id),
  72. // )
  73. // .toList();
  74. // final deletedRows = changeset.deletedRows
  75. // .where((deletedRowId) =>
  76. // changeset.insertedRows
  77. // .indexWhere((insert) => insert.row.id == deletedRowId) ==
  78. // -1)
  79. // .toList();
  80. // return changeset.rebuild((rebuildChangeset) {
  81. // rebuildChangeset.insertedRows.clear();
  82. // rebuildChangeset.insertedRows.addAll(insertedRows);
  83. // rebuildChangeset.deletedRows.clear();
  84. // rebuildChangeset.deletedRows.addAll(deletedRows);
  85. // });
  86. // }
  87. Future<void> dispose() async {
  88. _listener.stop();
  89. }
  90. }