i_user_impl.dart 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. import 'dart:typed_data';
  2. import 'package:app_flowy/workspace/infrastructure/repos/helper.dart';
  3. import 'package:dartz/dartz.dart';
  4. import 'package:app_flowy/workspace/domain/i_user.dart';
  5. import 'package:app_flowy/workspace/infrastructure/repos/user_repo.dart';
  6. import 'package:flowy_infra/notifier.dart';
  7. import 'package:flowy_sdk/protobuf/dart-notify/protobuf.dart';
  8. import 'package:flowy_sdk/protobuf/flowy-user-infra/errors.pb.dart';
  9. // import 'package:flowy_sdk/protobuf/flowy-user/errors.pb.dart' as user_error;
  10. import 'package:flowy_sdk/protobuf/flowy-user/observable.pb.dart' as user;
  11. import 'package:flowy_sdk/protobuf/flowy-core-infra/workspace_create.pb.dart';
  12. import 'package:flowy_sdk/protobuf/flowy-core/errors.pb.dart';
  13. import 'package:flowy_sdk/protobuf/flowy-core/observable.pb.dart';
  14. export 'package:app_flowy/workspace/domain/i_user.dart';
  15. export 'package:app_flowy/workspace/infrastructure/repos/user_repo.dart';
  16. import 'package:flowy_sdk/rust_stream.dart';
  17. import 'dart:async';
  18. class IUserImpl extends IUser {
  19. UserRepo repo;
  20. IUserImpl({
  21. required this.repo,
  22. });
  23. @override
  24. Future<Either<Unit, WorkspaceError>> deleteWorkspace(String workspaceId) {
  25. return repo.deleteWorkspace(workspaceId: workspaceId);
  26. }
  27. @override
  28. Future<Either<UserProfile, UserError>> fetchUserProfile(String userId) {
  29. return repo.fetchUserProfile(userId: userId);
  30. }
  31. @override
  32. Future<Either<Unit, UserError>> signOut() {
  33. return repo.signOut();
  34. }
  35. @override
  36. UserProfile get user => repo.user;
  37. @override
  38. Future<Either<List<Workspace>, WorkspaceError>> fetchWorkspaces() {
  39. return repo.getWorkspaces();
  40. }
  41. @override
  42. Future<Either<Unit, UserError>> initUser() {
  43. return repo.initUser();
  44. }
  45. }
  46. class IUserListenerImpl extends IUserListener {
  47. StreamSubscription<SubscribeObject>? _subscription;
  48. @override
  49. final profileUpdatedNotifier = PublishNotifier<UserProfileUpdatedNotifierValue>();
  50. @override
  51. final authDidChangedNotifier = PublishNotifier<AuthNotifierValue>();
  52. @override
  53. final workspaceUpdatedNotifier = PublishNotifier<WorkspaceUpdatedNotifierValue>();
  54. late WorkspaceNotificationParser _workspaceParser;
  55. late UserNotificationParser _userParser;
  56. late UserProfile _user;
  57. IUserListenerImpl({
  58. required UserProfile user,
  59. }) {
  60. _user = user;
  61. }
  62. @override
  63. void start() {
  64. _workspaceParser = WorkspaceNotificationParser(id: _user.token, callback: _notificationCallback);
  65. _userParser = UserNotificationParser(id: _user.token, callback: _userNotificationCallback);
  66. _subscription = RustStreamReceiver.listen((observable) {
  67. _workspaceParser.parse(observable);
  68. _userParser.parse(observable);
  69. });
  70. }
  71. @override
  72. Future<void> stop() async {
  73. await _subscription?.cancel();
  74. }
  75. void _notificationCallback(WorkspaceNotification ty, Either<Uint8List, WorkspaceError> result) {
  76. switch (ty) {
  77. case WorkspaceNotification.UserCreateWorkspace:
  78. case WorkspaceNotification.UserDeleteWorkspace:
  79. case WorkspaceNotification.WorkspaceListUpdated:
  80. result.fold(
  81. (payload) => workspaceUpdatedNotifier.value = left(RepeatedWorkspace.fromBuffer(payload).items),
  82. (error) => workspaceUpdatedNotifier.value = right(error),
  83. );
  84. break;
  85. case WorkspaceNotification.UserUnauthorized:
  86. result.fold(
  87. (_) {},
  88. (error) => authDidChangedNotifier.value = right(UserError.create()..code = ErrorCode.UserUnauthorized.value),
  89. );
  90. break;
  91. default:
  92. break;
  93. }
  94. }
  95. void _userNotificationCallback(user.UserNotification ty, Either<Uint8List, UserError> result) {
  96. switch (ty) {
  97. case user.UserNotification.UserUnauthorized:
  98. result.fold(
  99. (payload) => profileUpdatedNotifier.value = left(UserProfile.fromBuffer(payload)),
  100. (error) => profileUpdatedNotifier.value = right(error),
  101. );
  102. break;
  103. default:
  104. break;
  105. }
  106. }
  107. }