user_repo.dart 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. import 'dart:async';
  2. import 'package:dartz/dartz.dart';
  3. import 'package:flowy_sdk/dispatch/dispatch.dart';
  4. import 'package:flowy_sdk/protobuf/flowy-observable/subject.pb.dart';
  5. import 'package:flowy_sdk/protobuf/flowy-user/errors.pb.dart';
  6. import 'package:flowy_sdk/protobuf/flowy-user/user_detail.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_create.pb.dart';
  10. import 'package:flowy_sdk/rust_stream.dart';
  11. import 'package:app_flowy/workspace/domain/i_user.dart';
  12. class UserRepo {
  13. final UserDetail user;
  14. UserRepo({
  15. required this.user,
  16. });
  17. Future<Either<UserDetail, UserError>> fetchUserDetail(
  18. {required String userId}) {
  19. return UserEventGetStatus().send();
  20. }
  21. Future<Either<Unit, WorkspaceError>> deleteWorkspace(
  22. {required String workspaceId}) {
  23. throw UnimplementedError();
  24. }
  25. Future<Either<Unit, UserError>> signOut() {
  26. return UserEventSignOut().send();
  27. }
  28. Future<Either<List<Workspace>, WorkspaceError>> fetchWorkspaces() {
  29. return WorkspaceEventReadAllWorkspace().send().then((result) {
  30. return result.fold(
  31. (workspaces) => left(workspaces.items),
  32. (r) => right(r),
  33. );
  34. });
  35. }
  36. }
  37. class UserWatchRepo {
  38. StreamSubscription<ObservableSubject>? _subscription;
  39. UserCreateWorkspaceCallback? _createWorkspace;
  40. UserDeleteWorkspaceCallback? _deleteWorkspace;
  41. late UserRepo _repo;
  42. UserWatchRepo({
  43. required UserDetail user,
  44. }) {
  45. _repo = UserRepo(user: user);
  46. }
  47. void startWatching(
  48. {UserCreateWorkspaceCallback? createWorkspace,
  49. UserDeleteWorkspaceCallback? deleteWorkspace}) {
  50. _createWorkspace = createWorkspace;
  51. _deleteWorkspace = deleteWorkspace;
  52. _subscription = RustStreamReceiver.listen((observable) {
  53. if (observable.subjectId != _repo.user.id) {
  54. return;
  55. }
  56. final ty = WorkspaceObservable.valueOf(observable.ty);
  57. if (ty != null) {
  58. _handleObservableType(ty);
  59. }
  60. });
  61. }
  62. Future<void> close() async {
  63. await _subscription?.cancel();
  64. }
  65. void _handleObservableType(WorkspaceObservable ty) {
  66. switch (ty) {
  67. case WorkspaceObservable.UserCreateWorkspace:
  68. if (_createWorkspace == null) {
  69. return;
  70. }
  71. _repo.fetchWorkspaces().then((result) {
  72. result.fold(
  73. (workspaces) => _createWorkspace!(left(workspaces)),
  74. (error) => _createWorkspace!(right(error)),
  75. );
  76. });
  77. break;
  78. case WorkspaceObservable.UserDeleteWorkspace:
  79. if (_deleteWorkspace == null) {
  80. return;
  81. }
  82. _repo.fetchWorkspaces().then((result) {
  83. result.fold(
  84. (workspaces) => _deleteWorkspace!(left(workspaces)),
  85. (error) => _deleteWorkspace!(right(error)),
  86. );
  87. });
  88. break;
  89. default:
  90. break;
  91. }
  92. }
  93. }