grid_data_controller.dart 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. import 'dart:collection';
  2. import 'package:flowy_sdk/log.dart';
  3. import 'package:flowy_sdk/protobuf/flowy-error/errors.pb.dart';
  4. import 'package:flowy_sdk/protobuf/flowy-folder/view.pb.dart';
  5. import 'package:flowy_sdk/protobuf/flowy-grid/block_entities.pb.dart';
  6. import 'package:flowy_sdk/protobuf/flowy-grid/field_entities.pb.dart';
  7. import 'package:flowy_sdk/protobuf/flowy-grid/grid_entities.pb.dart';
  8. import 'dart:async';
  9. import 'package:dartz/dartz.dart';
  10. import 'block/block_cache.dart';
  11. import 'field/field_cache.dart';
  12. import 'prelude.dart';
  13. import 'row/row_cache.dart';
  14. typedef OnFieldsChanged = void Function(UnmodifiableListView<FieldPB>);
  15. typedef OnGridChanged = void Function(GridPB);
  16. typedef OnRowsChanged = void Function(
  17. List<RowInfo> rowInfos,
  18. RowsChangedReason,
  19. );
  20. typedef ListenOnRowChangedCondition = bool Function();
  21. class GridDataController {
  22. final String gridId;
  23. final GridFFIService _gridFFIService;
  24. final GridFieldCache fieldCache;
  25. // key: the block id
  26. final LinkedHashMap<String, GridBlockCache> _blocks;
  27. UnmodifiableMapView<String, GridBlockCache> get blocks =>
  28. UnmodifiableMapView(_blocks);
  29. OnRowsChanged? _onRowChanged;
  30. OnFieldsChanged? _onFieldsChanged;
  31. OnGridChanged? _onGridChanged;
  32. List<RowInfo> get rowInfos {
  33. final List<RowInfo> rows = [];
  34. for (var block in _blocks.values) {
  35. rows.addAll(block.rows);
  36. }
  37. return rows;
  38. }
  39. GridDataController({required ViewPB view})
  40. : gridId = view.id,
  41. // ignore: prefer_collection_literals
  42. _blocks = LinkedHashMap(),
  43. _gridFFIService = GridFFIService(gridId: view.id),
  44. fieldCache = GridFieldCache(gridId: view.id);
  45. void addListener({
  46. required OnGridChanged onGridChanged,
  47. required OnRowsChanged onRowsChanged,
  48. required OnFieldsChanged onFieldsChanged,
  49. }) {
  50. _onGridChanged = onGridChanged;
  51. _onRowChanged = onRowsChanged;
  52. _onFieldsChanged = onFieldsChanged;
  53. fieldCache.addListener(onFields: (fields) {
  54. _onFieldsChanged?.call(UnmodifiableListView(fields));
  55. });
  56. }
  57. Future<Either<Unit, FlowyError>> loadData() async {
  58. final result = await _gridFFIService.loadGrid();
  59. return Future(
  60. () => result.fold(
  61. (grid) async {
  62. _initialBlocks(grid.blocks);
  63. _onGridChanged?.call(grid);
  64. return await _loadFields(grid);
  65. },
  66. (err) => right(err),
  67. ),
  68. );
  69. }
  70. void createRow() {
  71. _gridFFIService.createRow();
  72. }
  73. Future<void> dispose() async {
  74. await _gridFFIService.closeGrid();
  75. await fieldCache.dispose();
  76. for (final blockCache in _blocks.values) {
  77. blockCache.dispose();
  78. }
  79. }
  80. void _initialBlocks(List<BlockPB> blocks) {
  81. for (final block in blocks) {
  82. if (_blocks[block.id] != null) {
  83. Log.warn("Initial duplicate block's cache: ${block.id}");
  84. return;
  85. }
  86. final cache = GridBlockCache(
  87. gridId: gridId,
  88. block: block,
  89. fieldCache: fieldCache,
  90. );
  91. cache.addListener(
  92. onRowsChanged: (reason) {
  93. _onRowChanged?.call(rowInfos, reason);
  94. },
  95. );
  96. _blocks[block.id] = cache;
  97. }
  98. }
  99. Future<Either<Unit, FlowyError>> _loadFields(GridPB grid) async {
  100. final result = await _gridFFIService.getFields(fieldIds: grid.fields);
  101. return Future(
  102. () => result.fold(
  103. (fields) {
  104. fieldCache.fields = fields.items;
  105. _onFieldsChanged?.call(UnmodifiableListView(fieldCache.fields));
  106. return left(unit);
  107. },
  108. (err) => right(err),
  109. ),
  110. );
  111. }
  112. }