view_repo.dart 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. import 'dart:async';
  2. import 'dart:typed_data';
  3. import 'package:dartz/dartz.dart';
  4. import 'package:flowy_sdk/dispatch/dispatch.dart';
  5. import 'package:flowy_sdk/protobuf/flowy-observable/subject.pb.dart';
  6. import 'package:flowy_sdk/protobuf/flowy-workspace/errors.pb.dart';
  7. import 'package:flowy_sdk/protobuf/flowy-workspace/observable.pb.dart';
  8. import 'package:flowy_sdk/protobuf/flowy-workspace/view_create.pb.dart';
  9. import 'package:flowy_sdk/protobuf/flowy-workspace/view_query.pb.dart';
  10. import 'package:flowy_sdk/rust_stream.dart';
  11. import 'package:app_flowy/workspace/domain/i_view.dart';
  12. import 'helper.dart';
  13. class ViewRepository {
  14. View view;
  15. ViewRepository({
  16. required this.view,
  17. });
  18. Future<Either<View, WorkspaceError>> readView() {
  19. final request = QueryViewRequest.create()..viewId = view.id;
  20. return WorkspaceEventReadView(request).send();
  21. }
  22. }
  23. class ViewWatchRepository {
  24. StreamSubscription<ObservableSubject>? _subscription;
  25. ViewUpdatedCallback? _update;
  26. late WorkspaceObservableParser _extractor;
  27. View view;
  28. ViewWatchRepository({
  29. required this.view,
  30. });
  31. void startWatching({
  32. ViewUpdatedCallback? update,
  33. }) {
  34. _update = update;
  35. _extractor = WorkspaceObservableParser(
  36. id: view.id,
  37. callback: (ty, result) {
  38. _handleObservableType(ty, result);
  39. },
  40. );
  41. _subscription =
  42. RustStreamReceiver.listen((observable) => _extractor.parse(observable));
  43. }
  44. void _handleObservableType(
  45. WorkspaceObservable ty, Either<Uint8List, WorkspaceError> result) {
  46. switch (ty) {
  47. case WorkspaceObservable.ViewUpdated:
  48. if (_update != null) {
  49. result.fold(
  50. (payload) {
  51. final view = View.fromBuffer(payload);
  52. _update!(left(view));
  53. },
  54. (error) => _update!(right(error)),
  55. );
  56. }
  57. break;
  58. default:
  59. break;
  60. }
  61. }
  62. Future<void> close() async {
  63. await _subscription?.cancel();
  64. }
  65. }