board_data_controller.dart 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. import 'dart:collection';
  2. import 'package:app_flowy/plugins/grid/application/block/block_cache.dart';
  3. import 'package:app_flowy/plugins/grid/application/field/field_cache.dart';
  4. import 'package:app_flowy/plugins/grid/application/grid_service.dart';
  5. import 'package:flowy_sdk/protobuf/flowy-error/errors.pb.dart';
  6. import 'package:flowy_sdk/protobuf/flowy-folder/view.pb.dart';
  7. import 'dart:async';
  8. import 'package:dartz/dartz.dart';
  9. import 'package:flowy_sdk/protobuf/flowy-grid/protobuf.dart';
  10. typedef OnFieldsChanged = void Function(UnmodifiableListView<FieldPB>);
  11. typedef OnGridChanged = void Function(GridPB);
  12. typedef OnGroupChanged = void Function(List<GroupPB>);
  13. typedef OnError = void Function(FlowyError);
  14. class BoardDataController {
  15. final String gridId;
  16. final GridService _gridFFIService;
  17. final GridFieldCache fieldCache;
  18. // key: the block id
  19. final LinkedHashMap<String, GridBlockCache> _blocks;
  20. UnmodifiableMapView<String, GridBlockCache> get blocks =>
  21. UnmodifiableMapView(_blocks);
  22. OnFieldsChanged? _onFieldsChanged;
  23. OnGridChanged? _onGridChanged;
  24. OnGroupChanged? _onGroupChanged;
  25. OnError? _onError;
  26. BoardDataController({required ViewPB view})
  27. : gridId = view.id,
  28. _blocks = LinkedHashMap.identity(),
  29. _gridFFIService = GridService(gridId: view.id),
  30. fieldCache = GridFieldCache(gridId: view.id);
  31. void addListener({
  32. OnGridChanged? onGridChanged,
  33. OnFieldsChanged? onFieldsChanged,
  34. OnGroupChanged? onGroupChanged,
  35. OnError? onError,
  36. }) {
  37. _onGridChanged = onGridChanged;
  38. _onFieldsChanged = onFieldsChanged;
  39. _onGroupChanged = onGroupChanged;
  40. _onError = onError;
  41. fieldCache.addListener(onFields: (fields) {
  42. _onFieldsChanged?.call(UnmodifiableListView(fields));
  43. });
  44. }
  45. Future<Either<Unit, FlowyError>> loadData() async {
  46. final result = await _gridFFIService.loadGrid();
  47. return Future(
  48. () => result.fold(
  49. (grid) async {
  50. _onGridChanged?.call(grid);
  51. return await _loadFields(grid).then((result) {
  52. return result.fold(
  53. (l) {
  54. _loadGroups();
  55. return left(l);
  56. },
  57. (err) => right(err),
  58. );
  59. });
  60. },
  61. (err) => right(err),
  62. ),
  63. );
  64. }
  65. void createRow() {
  66. _gridFFIService.createRow();
  67. }
  68. Future<void> dispose() async {
  69. await _gridFFIService.closeGrid();
  70. await fieldCache.dispose();
  71. for (final blockCache in _blocks.values) {
  72. blockCache.dispose();
  73. }
  74. }
  75. Future<Either<Unit, FlowyError>> _loadFields(GridPB grid) async {
  76. final result = await _gridFFIService.getFields(fieldIds: grid.fields);
  77. return Future(
  78. () => result.fold(
  79. (fields) {
  80. fieldCache.fields = fields.items;
  81. _onFieldsChanged?.call(UnmodifiableListView(fieldCache.fields));
  82. return left(unit);
  83. },
  84. (err) => right(err),
  85. ),
  86. );
  87. }
  88. Future<void> _loadGroups() async {
  89. final result = await _gridFFIService.loadGroups();
  90. return Future(
  91. () => result.fold(
  92. (groups) {
  93. _onGroupChanged?.call(groups.items);
  94. },
  95. (err) => _onError?.call(err),
  96. ),
  97. );
  98. }
  99. }