workspace_repo.dart 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. import 'dart:async';
  2. import 'package:dartz/dartz.dart';
  3. import 'package:flowy_infra/flowy_logger.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/app_create.pb.dart';
  7. import 'package:flowy_sdk/protobuf/flowy-workspace/errors.pb.dart';
  8. import 'package:flowy_sdk/protobuf/flowy-workspace/observable.pb.dart';
  9. import 'package:flowy_sdk/protobuf/flowy-workspace/workspace_query.pb.dart';
  10. import 'package:flowy_sdk/rust_stream.dart';
  11. typedef AppUpdatedCallback = void Function(List<App> apps);
  12. class WorkspaceRepository {
  13. StreamSubscription<ObservableSubject>? _subscription;
  14. AppUpdatedCallback? _appUpdatedCallback;
  15. String workspaceId;
  16. WorkspaceRepository({
  17. required this.workspaceId,
  18. });
  19. Future<Either<App, WorkspaceError>> createApp(String appName, String desc) {
  20. return WorkspaceEventGetCurWorkspace().send().then((result) {
  21. return result.fold(
  22. (workspace) {
  23. final request = CreateAppRequest.create()
  24. ..name = appName
  25. ..workspaceId = workspace.id
  26. ..desc = desc;
  27. return WorkspaceEventCreateApp(request).send();
  28. },
  29. (error) {
  30. return right(error);
  31. },
  32. );
  33. });
  34. }
  35. Future<Either<List<App>, WorkspaceError>> getApps(
  36. {required String workspaceId}) {
  37. final request = QueryWorkspaceRequest.create()
  38. ..workspaceId = workspaceId
  39. ..readApps = true;
  40. return WorkspaceEventGetWorkspace(request).send().then((result) {
  41. return result.fold(
  42. (workspace) => left(workspace.apps.items),
  43. (error) => right(error),
  44. );
  45. });
  46. }
  47. void startWatching({AppUpdatedCallback? appUpdatedCallback}) {
  48. _appUpdatedCallback = appUpdatedCallback;
  49. _subscription = RustStreamReceiver.listen((observable) {
  50. if (observable.subjectId != workspaceId) {
  51. return;
  52. }
  53. final ty = WorkspaceObservableType.valueOf(observable.ty);
  54. if (ty != null) {
  55. _handleObservableType(ty);
  56. }
  57. });
  58. }
  59. void _handleObservableType(WorkspaceObservableType ty) {
  60. switch (ty) {
  61. case WorkspaceObservableType.WorkspaceUpdated:
  62. if (_appUpdatedCallback == null) {
  63. return;
  64. }
  65. getApps(workspaceId: workspaceId).then((result) {
  66. result.fold(
  67. (apps) => _appUpdatedCallback!(apps),
  68. (error) => Log.error(error),
  69. );
  70. });
  71. break;
  72. default:
  73. break;
  74. }
  75. }
  76. Future<void> close() async {
  77. await _subscription?.cancel();
  78. }
  79. }