trash_bloc.dart 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. import 'package:dartz/dartz.dart';
  2. import 'package:flowy_sdk/log.dart';
  3. import 'package:flowy_sdk/protobuf/flowy-folder/trash.pb.dart';
  4. import 'package:flowy_sdk/protobuf/flowy-error/errors.pb.dart';
  5. import 'package:flutter_bloc/flutter_bloc.dart';
  6. import 'package:freezed_annotation/freezed_annotation.dart';
  7. import 'package:app_flowy/plugins/trash/application/trash_service.dart';
  8. import 'package:app_flowy/plugins/trash/application/trash_listener.dart';
  9. part 'trash_bloc.freezed.dart';
  10. class TrashBloc extends Bloc<TrashEvent, TrashState> {
  11. final TrashService service;
  12. final TrashListener listener;
  13. TrashBloc({required this.service, required this.listener})
  14. : super(TrashState.init()) {
  15. on<TrashEvent>((event, emit) async {
  16. await event.map(initial: (e) async {
  17. listener.start(trashUpdated: _listenTrashUpdated);
  18. final result = await service.readTrash();
  19. emit(result.fold(
  20. (object) => state.copyWith(
  21. objects: object.items, successOrFailure: left(unit)),
  22. (error) => state.copyWith(successOrFailure: right(error)),
  23. ));
  24. }, didReceiveTrash: (e) async {
  25. emit(state.copyWith(objects: e.trash));
  26. }, putback: (e) async {
  27. final result = await service.putback(e.trashId);
  28. await _handleResult(result, emit);
  29. }, delete: (e) async {
  30. final result =
  31. await service.deleteViews([Tuple2(e.trash.id, e.trash.ty)]);
  32. await _handleResult(result, emit);
  33. }, deleteAll: (e) async {
  34. final result = await service.deleteAll();
  35. await _handleResult(result, emit);
  36. }, restoreAll: (e) async {
  37. final result = await service.restoreAll();
  38. await _handleResult(result, emit);
  39. });
  40. });
  41. }
  42. Future<void> _handleResult(
  43. Either<dynamic, FlowyError> result, Emitter<TrashState> emit) async {
  44. emit(result.fold(
  45. (l) => state.copyWith(successOrFailure: left(unit)),
  46. (error) => state.copyWith(successOrFailure: right(error)),
  47. ));
  48. }
  49. void _listenTrashUpdated(Either<List<TrashPB>, FlowyError> trashOrFailed) {
  50. trashOrFailed.fold(
  51. (trash) {
  52. add(TrashEvent.didReceiveTrash(trash));
  53. },
  54. (error) {
  55. Log.error(error);
  56. },
  57. );
  58. }
  59. @override
  60. Future<void> close() async {
  61. await listener.close();
  62. return super.close();
  63. }
  64. }
  65. @freezed
  66. class TrashEvent with _$TrashEvent {
  67. const factory TrashEvent.initial() = Initial;
  68. const factory TrashEvent.didReceiveTrash(List<TrashPB> trash) = ReceiveTrash;
  69. const factory TrashEvent.putback(String trashId) = Putback;
  70. const factory TrashEvent.delete(TrashPB trash) = Delete;
  71. const factory TrashEvent.restoreAll() = RestoreAll;
  72. const factory TrashEvent.deleteAll() = DeleteAll;
  73. }
  74. @freezed
  75. class TrashState with _$TrashState {
  76. const factory TrashState({
  77. required List<TrashPB> objects,
  78. required Either<Unit, FlowyError> successOrFailure,
  79. }) = _TrashState;
  80. factory TrashState.init() => TrashState(
  81. objects: [],
  82. successOrFailure: left(unit),
  83. );
  84. }