app_repo.dart 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  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. StreamSubscription<ObservableSubject>? _subscription;
  16. AppAddViewCallback? _addViewCallback;
  17. AppUpdatedCallback? _updatedCallback;
  18. String appId;
  19. AppRepository({
  20. required this.appId,
  21. });
  22. Future<Either<App, WorkspaceError>> getAppDesc() {
  23. final request = QueryAppRequest.create()
  24. ..appId = appId
  25. ..readViews = false;
  26. return WorkspaceEventGetApp(request).send();
  27. }
  28. Future<Either<View, WorkspaceError>> createView(
  29. String appId, String name, String desc, ViewType viewType) {
  30. final request = CreateViewRequest.create()
  31. ..appId = appId
  32. ..name = name
  33. ..desc = desc
  34. ..viewType = viewType;
  35. return WorkspaceEventCreateView(request).send();
  36. }
  37. Future<Either<List<View>, WorkspaceError>> getViews({required String appId}) {
  38. final request = QueryAppRequest.create()
  39. ..appId = appId
  40. ..readViews = true;
  41. return WorkspaceEventGetApp(request).send().then((result) {
  42. return result.fold(
  43. (app) => left(app.views.items),
  44. (error) => right(error),
  45. );
  46. });
  47. }
  48. void startWatching(
  49. {AppAddViewCallback? addViewCallback,
  50. AppUpdatedCallback? updatedCallback}) {
  51. _addViewCallback = addViewCallback;
  52. _updatedCallback = updatedCallback;
  53. _subscription = RustStreamReceiver.listen((observable) {
  54. if (observable.subjectId != appId) {
  55. return;
  56. }
  57. final ty = WorkspaceObservable.valueOf(observable.ty);
  58. if (ty != null) {
  59. _handleObservableType(ty);
  60. }
  61. });
  62. }
  63. void _handleObservableType(WorkspaceObservable ty) {
  64. switch (ty) {
  65. case WorkspaceObservable.AppAddView:
  66. if (_addViewCallback == null) {
  67. return;
  68. }
  69. getViews(appId: appId).then((result) {
  70. result.fold(
  71. (views) => _addViewCallback!(left(views)),
  72. (error) => _addViewCallback!(right(error)),
  73. );
  74. });
  75. break;
  76. case WorkspaceObservable.AppUpdateDesc:
  77. if (_updatedCallback == null) {
  78. return;
  79. }
  80. getAppDesc().then((result) {
  81. result.fold(
  82. (app) => _updatedCallback!(app.name, app.desc),
  83. (error) => Log.error(error),
  84. );
  85. });
  86. break;
  87. default:
  88. break;
  89. }
  90. }
  91. Future<void> close() async {
  92. await _subscription?.cancel();
  93. }
  94. }