group_controller.dart 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  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(group, insertedRow.row, index);
  44. }
  45. for (final updatedRow in changeset.updatedRows) {
  46. final index = group.rows.indexWhere(
  47. (rowPB) => rowPB.id == updatedRow.id,
  48. );
  49. if (index != -1) {
  50. group.rows[index] = updatedRow;
  51. }
  52. delegate.updateRow(group, updatedRow);
  53. }
  54. },
  55. (err) => Log.error(err),
  56. );
  57. });
  58. }
  59. // GroupChangesetPB _transformChangeset(GroupChangesetPB changeset) {
  60. // final insertedRows = changeset.insertedRows
  61. // .where(
  62. // (delete) => !changeset.deletedRows.contains(delete.row.id),
  63. // )
  64. // .toList();
  65. // final deletedRows = changeset.deletedRows
  66. // .where((deletedRowId) =>
  67. // changeset.insertedRows
  68. // .indexWhere((insert) => insert.row.id == deletedRowId) ==
  69. // -1)
  70. // .toList();
  71. // return changeset.rebuild((rebuildChangeset) {
  72. // rebuildChangeset.insertedRows.clear();
  73. // rebuildChangeset.insertedRows.addAll(insertedRows);
  74. // rebuildChangeset.deletedRows.clear();
  75. // rebuildChangeset.deletedRows.addAll(deletedRows);
  76. // });
  77. // }
  78. Future<void> dispose() async {
  79. _listener.stop();
  80. }
  81. }