group_controller.dart 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  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(String groupId, String rowId);
  8. void insertRow(String groupId, RowPB row, int? index);
  9. void updateRow(String groupId, 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. (GroupRowsChangesetPB changeset) {
  31. for (final insertedRow in changeset.insertedRows) {
  32. final index = insertedRow.hasIndex() ? insertedRow.index : null;
  33. delegate.insertRow(
  34. group.groupId,
  35. insertedRow.row,
  36. index,
  37. );
  38. }
  39. for (final deletedRow in changeset.deletedRows) {
  40. delegate.removeRow(group.groupId, deletedRow);
  41. }
  42. for (final updatedRow in changeset.updatedRows) {
  43. delegate.updateRow(group.groupId, updatedRow);
  44. }
  45. },
  46. (err) => Log.error(err),
  47. );
  48. });
  49. }
  50. Future<void> dispose() async {
  51. _listener.stop();
  52. }
  53. }