trash_bloc.dart 2.9 KB

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