calendar_data_controller.dart 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. import 'dart:async';
  2. import 'dart:collection';
  3. import 'package:app_flowy/plugins/grid/application/view/grid_view_cache.dart';
  4. import 'package:app_flowy/plugins/grid/application/field/field_controller.dart';
  5. import 'package:app_flowy/plugins/grid/application/grid_service.dart';
  6. import 'package:app_flowy/plugins/grid/application/row/row_cache.dart';
  7. import 'package:appflowy_backend/protobuf/flowy-error/errors.pb.dart';
  8. import 'package:appflowy_backend/protobuf/flowy-folder/protobuf.dart';
  9. import 'package:appflowy_backend/protobuf/flowy-database/protobuf.dart';
  10. import 'package:dartz/dartz.dart';
  11. import 'calendar_listener.dart';
  12. typedef OnFieldsChanged = void Function(UnmodifiableListView<FieldInfo>);
  13. typedef OnDatabaseChanged = void Function(DatabasePB);
  14. typedef OnSettingsChanged = void Function(CalendarSettingsPB);
  15. typedef OnArrangeWithNewField = void Function(FieldPB);
  16. typedef OnRowsChanged = void Function(List<RowInfo>, RowsChangedReason);
  17. typedef OnError = void Function(FlowyError);
  18. class CalendarDataController {
  19. final String databaseId;
  20. final DatabaseFFIService _databaseFFIService;
  21. final GridFieldController fieldController;
  22. final CalendarListener _listener;
  23. late DatabaseViewCache _viewCache;
  24. OnFieldsChanged? _onFieldsChanged;
  25. OnDatabaseChanged? _onDatabaseChanged;
  26. OnRowsChanged? _onRowsChanged;
  27. OnSettingsChanged? _onSettingsChanged;
  28. OnArrangeWithNewField? _onArrangeWithNewField;
  29. OnError? _onError;
  30. List<RowInfo> get rowInfos => _viewCache.rowInfos;
  31. GridRowCache get rowCache => _viewCache.rowCache;
  32. CalendarDataController({required ViewPB view})
  33. : databaseId = view.id,
  34. _listener = CalendarListener(view.id),
  35. _databaseFFIService = DatabaseFFIService(viewId: view.id),
  36. fieldController = GridFieldController(databaseId: view.id) {
  37. _viewCache = DatabaseViewCache(
  38. databaseId: view.id,
  39. fieldController: fieldController,
  40. );
  41. _viewCache.addListener(onRowsChanged: (reason) {
  42. _onRowsChanged?.call(rowInfos, reason);
  43. });
  44. }
  45. void addListener({
  46. required OnDatabaseChanged onDatabaseChanged,
  47. OnFieldsChanged? onFieldsChanged,
  48. OnRowsChanged? onRowsChanged,
  49. required OnSettingsChanged? onSettingsChanged,
  50. required OnArrangeWithNewField? onArrangeWithNewField,
  51. required OnError? onError,
  52. }) {
  53. _onDatabaseChanged = onDatabaseChanged;
  54. _onFieldsChanged = onFieldsChanged;
  55. _onRowsChanged = onRowsChanged;
  56. _onSettingsChanged = onSettingsChanged;
  57. _onArrangeWithNewField = onArrangeWithNewField;
  58. _onError = onError;
  59. fieldController.addListener(onFields: (fields) {
  60. _onFieldsChanged?.call(UnmodifiableListView(fields));
  61. });
  62. _listener.start(
  63. onCalendarSettingsChanged: (result) {
  64. result.fold(
  65. (settings) => _onSettingsChanged?.call(settings),
  66. (e) => _onError?.call(e),
  67. );
  68. },
  69. onArrangeWithNewField: (result) {
  70. result.fold(
  71. (settings) => _onArrangeWithNewField?.call(settings),
  72. (e) => _onError?.call(e),
  73. );
  74. },
  75. );
  76. }
  77. Future<Either<Unit, FlowyError>> openDatabase() async {
  78. final result = await _databaseFFIService.openGrid();
  79. return result.fold(
  80. (database) async {
  81. _onDatabaseChanged?.call(database);
  82. return fieldController
  83. .loadFields(fieldIds: database.fields)
  84. .then((result) {
  85. return result.fold(
  86. (l) => Future(() async {
  87. _viewCache.rowCache.initializeRows(database.rows);
  88. return left(l);
  89. }),
  90. (err) => right(err),
  91. );
  92. });
  93. },
  94. (err) => right(err),
  95. );
  96. }
  97. Future<void> dispose() async {
  98. await _viewCache.dispose();
  99. await _databaseFFIService.closeGrid();
  100. await fieldController.dispose();
  101. }
  102. }