group_controller.dart 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  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 'package:protobuf/protobuf.dart';
  5. import 'group_listener.dart';
  6. typedef OnGroupError = void Function(FlowyError);
  7. abstract class GroupControllerDelegate {
  8. void removeRow(GroupPB group, String rowId);
  9. void insertRow(GroupPB group, RowPB row, int? index);
  10. void updateRow(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. delegate.insertRow(group, insertedRow.row, index);
  45. }
  46. for (final updatedRow in changeset.updatedRows) {
  47. final index = group.rows.indexWhere(
  48. (rowPB) => rowPB.id == updatedRow.id,
  49. );
  50. if (index != -1) {
  51. group.rows[index] = updatedRow;
  52. }
  53. delegate.updateRow(group, updatedRow);
  54. }
  55. },
  56. (err) => Log.error(err),
  57. );
  58. });
  59. }
  60. // GroupChangesetPB _transformChangeset(GroupChangesetPB changeset) {
  61. // final insertedRows = changeset.insertedRows
  62. // .where(
  63. // (delete) => !changeset.deletedRows.contains(delete.row.id),
  64. // )
  65. // .toList();
  66. // final deletedRows = changeset.deletedRows
  67. // .where((deletedRowId) =>
  68. // changeset.insertedRows
  69. // .indexWhere((insert) => insert.row.id == deletedRowId) ==
  70. // -1)
  71. // .toList();
  72. // return changeset.rebuild((rebuildChangeset) {
  73. // rebuildChangeset.insertedRows.clear();
  74. // rebuildChangeset.insertedRows.addAll(insertedRows);
  75. // rebuildChangeset.deletedRows.clear();
  76. // rebuildChangeset.deletedRows.addAll(deletedRows);
  77. // });
  78. // }
  79. Future<void> dispose() async {
  80. _listener.stop();
  81. }
  82. }