app_repo.dart 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. import 'dart:async';
  2. import 'package:app_flowy/home/domain/i_app.dart';
  3. import 'package:dartz/dartz.dart';
  4. import 'package:flowy_infra/flowy_logger.dart';
  5. import 'package:flowy_sdk/dispatch/dispatch.dart';
  6. import 'package:flowy_sdk/protobuf/flowy-observable/subject.pb.dart';
  7. import 'package:flowy_sdk/protobuf/flowy-workspace/app_create.pb.dart';
  8. import 'package:flowy_sdk/protobuf/flowy-workspace/app_query.pb.dart';
  9. import 'package:flowy_sdk/protobuf/flowy-workspace/errors.pb.dart';
  10. import 'package:flowy_sdk/protobuf/flowy-workspace/observable.pb.dart';
  11. import 'package:flowy_sdk/protobuf/flowy-workspace/view_create.pb.dart';
  12. import 'package:flowy_sdk/protobuf/flowy-workspace/view_create.pbenum.dart';
  13. import 'package:flowy_sdk/rust_stream.dart';
  14. class AppRepository {
  15. String appId;
  16. AppRepository({
  17. required this.appId,
  18. });
  19. Future<Either<App, WorkspaceError>> getAppDesc() {
  20. final request = QueryAppRequest.create()
  21. ..appId = appId
  22. ..readViews = false;
  23. return WorkspaceEventGetApp(request).send();
  24. }
  25. Future<Either<View, WorkspaceError>> createView(
  26. String appId, String name, String desc, ViewType viewType) {
  27. final request = CreateViewRequest.create()
  28. ..appId = appId
  29. ..name = name
  30. ..desc = desc
  31. ..viewType = viewType;
  32. return WorkspaceEventCreateView(request).send();
  33. }
  34. Future<Either<List<View>, WorkspaceError>> getViews({required String appId}) {
  35. final request = QueryAppRequest.create()
  36. ..appId = appId
  37. ..readViews = true;
  38. return WorkspaceEventGetApp(request).send().then((result) {
  39. return result.fold(
  40. (app) => left(app.views.items),
  41. (error) => right(error),
  42. );
  43. });
  44. }
  45. }
  46. class AppWatchRepository {
  47. StreamSubscription<ObservableSubject>? _subscription;
  48. AppAddViewCallback? _addViewCallback;
  49. AppUpdatedCallback? _updatedCallback;
  50. String appId;
  51. late AppRepository _repo;
  52. AppWatchRepository({
  53. required this.appId,
  54. }) {
  55. _repo = AppRepository(appId: appId);
  56. }
  57. void startWatching(
  58. {AppAddViewCallback? addViewCallback,
  59. AppUpdatedCallback? updatedCallback}) {
  60. _addViewCallback = addViewCallback;
  61. _updatedCallback = updatedCallback;
  62. _subscription = RustStreamReceiver.listen((observable) {
  63. if (observable.subjectId != appId) {
  64. return;
  65. }
  66. final ty = WorkspaceObservable.valueOf(observable.ty);
  67. if (ty != null) {
  68. _handleObservableType(ty);
  69. }
  70. });
  71. }
  72. void _handleObservableType(WorkspaceObservable ty) {
  73. switch (ty) {
  74. case WorkspaceObservable.AppAddView:
  75. if (_addViewCallback == null) {
  76. return;
  77. }
  78. _repo.getViews(appId: appId).then((result) {
  79. result.fold(
  80. (views) => _addViewCallback!(left(views)),
  81. (error) => _addViewCallback!(right(error)),
  82. );
  83. });
  84. break;
  85. case WorkspaceObservable.AppUpdateDesc:
  86. if (_updatedCallback == null) {
  87. return;
  88. }
  89. _repo.getAppDesc().then((result) {
  90. result.fold(
  91. (app) => _updatedCallback!(app.name, app.desc),
  92. (error) => Log.error(error),
  93. );
  94. });
  95. break;
  96. default:
  97. break;
  98. }
  99. }
  100. Future<void> close() async {
  101. await _subscription?.cancel();
  102. }
  103. }