board_data_controller.dart 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. import 'dart:collection';
  2. import 'package:app_flowy/plugins/grid/application/view/grid_view_cache.dart';
  3. import 'package:app_flowy/plugins/grid/application/field/field_controller.dart';
  4. import 'package:app_flowy/plugins/grid/application/grid_service.dart';
  5. import 'package:app_flowy/plugins/grid/application/row/row_cache.dart';
  6. import 'package:flowy_sdk/protobuf/flowy-error/errors.pb.dart';
  7. import 'package:flowy_sdk/protobuf/flowy-folder/view.pb.dart';
  8. import 'dart:async';
  9. import 'package:dartz/dartz.dart';
  10. import 'package:flowy_sdk/protobuf/flowy-grid/protobuf.dart';
  11. import 'board_listener.dart';
  12. typedef OnFieldsChanged = void Function(UnmodifiableListView<FieldInfo>);
  13. typedef OnGridChanged = void Function(GridPB);
  14. typedef DidLoadGroups = void Function(List<GroupPB>);
  15. typedef OnUpdatedGroup = void Function(List<GroupPB>);
  16. typedef OnDeletedGroup = void Function(List<String>);
  17. typedef OnInsertedGroup = void Function(List<InsertedGroupPB>);
  18. typedef OnResetGroups = void Function(List<GroupPB>);
  19. typedef OnRowsChanged = void Function(
  20. List<RowInfo>,
  21. RowsChangedReason,
  22. );
  23. typedef OnError = void Function(FlowyError);
  24. class BoardDataController {
  25. final String gridId;
  26. final GridFFIService _gridFFIService;
  27. final GridFieldController fieldController;
  28. final BoardListener _listener;
  29. late GridViewCache _viewCache;
  30. OnFieldsChanged? _onFieldsChanged;
  31. OnGridChanged? _onGridChanged;
  32. DidLoadGroups? _didLoadGroup;
  33. OnRowsChanged? _onRowsChanged;
  34. OnError? _onError;
  35. List<RowInfo> get rowInfos => _viewCache.rowInfos;
  36. GridRowCache get rowCache => _viewCache.rowCache;
  37. BoardDataController({required ViewPB view})
  38. : gridId = view.id,
  39. _listener = BoardListener(view.id),
  40. _gridFFIService = GridFFIService(gridId: view.id),
  41. fieldController = GridFieldController(gridId: view.id) {
  42. //
  43. _viewCache = GridViewCache(
  44. gridId: view.id,
  45. fieldController: fieldController,
  46. );
  47. _viewCache.addListener(onRowsChanged: (reason) {
  48. _onRowsChanged?.call(rowInfos, reason);
  49. });
  50. }
  51. void addListener({
  52. required OnGridChanged onGridChanged,
  53. OnFieldsChanged? onFieldsChanged,
  54. required DidLoadGroups didLoadGroups,
  55. OnRowsChanged? onRowsChanged,
  56. required OnUpdatedGroup onUpdatedGroup,
  57. required OnDeletedGroup onDeletedGroup,
  58. required OnInsertedGroup onInsertedGroup,
  59. required OnResetGroups onResetGroups,
  60. required OnError? onError,
  61. }) {
  62. _onGridChanged = onGridChanged;
  63. _onFieldsChanged = onFieldsChanged;
  64. _didLoadGroup = didLoadGroups;
  65. _onRowsChanged = onRowsChanged;
  66. _onError = onError;
  67. fieldController.addListener(onFields: (fields) {
  68. _onFieldsChanged?.call(UnmodifiableListView(fields));
  69. });
  70. _listener.start(
  71. onBoardChanged: (result) {
  72. result.fold(
  73. (changeset) {
  74. if (changeset.updateGroups.isNotEmpty) {
  75. onUpdatedGroup.call(changeset.updateGroups);
  76. }
  77. if (changeset.deletedGroups.isNotEmpty) {
  78. onDeletedGroup.call(changeset.deletedGroups);
  79. }
  80. if (changeset.insertedGroups.isNotEmpty) {
  81. onInsertedGroup.call(changeset.insertedGroups);
  82. }
  83. },
  84. (e) => _onError?.call(e),
  85. );
  86. },
  87. onGroupByNewField: (result) {
  88. result.fold(
  89. (groups) => onResetGroups(groups),
  90. (e) => _onError?.call(e),
  91. );
  92. },
  93. );
  94. }
  95. Future<Either<Unit, FlowyError>> openGrid() async {
  96. final result = await _gridFFIService.openGrid();
  97. return result.fold(
  98. (grid) async {
  99. _onGridChanged?.call(grid);
  100. final result = await fieldController.loadFields(fieldIds: grid.fields);
  101. return result.fold(
  102. (l) {
  103. _loadGroups();
  104. _viewCache.rowCache.initializeRows(grid.rows);
  105. return left(l);
  106. },
  107. (err) => right(err),
  108. );
  109. },
  110. (err) => right(err),
  111. );
  112. }
  113. Future<Either<RowPB, FlowyError>> createBoardCard(String groupId,
  114. {String? startRowId}) {
  115. return _gridFFIService.createBoardCard(groupId, startRowId);
  116. }
  117. Future<void> dispose() async {
  118. await _gridFFIService.closeGrid();
  119. await fieldController.dispose();
  120. }
  121. Future<void> _loadGroups() async {
  122. final result = await _gridFFIService.loadGroups();
  123. return Future(
  124. () => result.fold(
  125. (groups) {
  126. _didLoadGroup?.call(groups.items);
  127. },
  128. (err) => _onError?.call(err),
  129. ),
  130. );
  131. }
  132. }