trash_repo.dart 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. import 'dart:async';
  2. import 'dart:typed_data';
  3. import 'package:app_flowy/workspace/domain/i_trash.dart';
  4. import 'package:app_flowy/workspace/infrastructure/repos/helper.dart';
  5. import 'package:dartz/dartz.dart';
  6. import 'package:flowy_sdk/dispatch/dispatch.dart';
  7. import 'package:flowy_sdk/protobuf/dart-notify/subject.pb.dart';
  8. import 'package:flowy_sdk/protobuf/flowy-workspace-infra/trash_create.pb.dart';
  9. import 'package:flowy_sdk/protobuf/flowy-core/errors.pb.dart';
  10. import 'package:flowy_sdk/protobuf/flowy-core/observable.pb.dart';
  11. import 'package:flowy_sdk/rust_stream.dart';
  12. class TrashRepo {
  13. Future<Either<RepeatedTrash, WorkspaceError>> readTrash() {
  14. return WorkspaceEventReadTrash().send();
  15. }
  16. Future<Either<Unit, WorkspaceError>> putback(String trashId) {
  17. final id = TrashIdentifier.create()..id = trashId;
  18. return WorkspaceEventPutbackTrash(id).send();
  19. }
  20. Future<Either<Unit, WorkspaceError>> deleteViews(List<Tuple2<String, TrashType>> trashList) {
  21. final items = trashList.map((trash) {
  22. return TrashIdentifier.create()
  23. ..id = trash.value1
  24. ..ty = trash.value2;
  25. });
  26. final trashIdentifiers = TrashIdentifiers(items: items);
  27. return WorkspaceEventDeleteTrash(trashIdentifiers).send();
  28. }
  29. Future<Either<Unit, WorkspaceError>> restoreAll() {
  30. return WorkspaceEventRestoreAll().send();
  31. }
  32. Future<Either<Unit, WorkspaceError>> deleteAll() {
  33. return WorkspaceEventDeleteAll().send();
  34. }
  35. }
  36. class TrashListenerRepo {
  37. StreamSubscription<SubscribeObject>? _subscription;
  38. TrashUpdatedCallback? _trashUpdated;
  39. late WorkspaceNotificationParser _parser;
  40. void startListening({TrashUpdatedCallback? trashUpdated}) {
  41. _trashUpdated = trashUpdated;
  42. _parser = WorkspaceNotificationParser(callback: _bservableCallback);
  43. _subscription = RustStreamReceiver.listen((observable) => _parser.parse(observable));
  44. }
  45. void _bservableCallback(WorkspaceNotification ty, Either<Uint8List, WorkspaceError> result) {
  46. switch (ty) {
  47. case WorkspaceNotification.TrashUpdated:
  48. if (_trashUpdated != null) {
  49. result.fold(
  50. (payload) {
  51. final repeatedTrash = RepeatedTrash.fromBuffer(payload);
  52. _trashUpdated!(left(repeatedTrash.items));
  53. },
  54. (error) => _trashUpdated!(right(error)),
  55. );
  56. }
  57. break;
  58. default:
  59. break;
  60. }
  61. }
  62. Future<void> close() async {
  63. await _subscription?.cancel();
  64. }
  65. }