| 
									
										
										
										
											2021-10-12 22:31:38 +08:00
										 |  |  | import 'package:dartz/dartz.dart'; | 
					
						
							| 
									
										
										
										
											2022-02-19 13:52:52 +08:00
										 |  |  | import 'package:flowy_sdk/log.dart'; | 
					
						
							| 
									
										
										
										
											2022-07-04 15:00:54 +08:00
										 |  |  | import 'package:flowy_sdk/protobuf/flowy-folder/trash.pb.dart'; | 
					
						
							| 
									
										
										
										
											2021-12-14 18:04:51 +08:00
										 |  |  | import 'package:flowy_sdk/protobuf/flowy-error/errors.pb.dart'; | 
					
						
							| 
									
										
										
										
											2021-10-12 22:31:38 +08:00
										 |  |  | import 'package:flutter_bloc/flutter_bloc.dart'; | 
					
						
							|  |  |  | import 'package:freezed_annotation/freezed_annotation.dart'; | 
					
						
							| 
									
										
										
										
											2022-08-09 10:35:27 +08:00
										 |  |  | import 'package:app_flowy/plugins/trash/application/trash_service.dart'; | 
					
						
							|  |  |  | import 'package:app_flowy/plugins/trash/application/trash_listener.dart'; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-12 22:31:38 +08:00
										 |  |  | part 'trash_bloc.freezed.dart'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class TrashBloc extends Bloc<TrashEvent, TrashState> { | 
					
						
							| 
									
										
										
										
											2022-02-28 21:17:08 -05:00
										 |  |  |   final TrashService service; | 
					
						
							| 
									
										
										
										
											2022-01-31 09:49:05 +08:00
										 |  |  |   final TrashListener listener; | 
					
						
							| 
									
										
										
										
											2022-08-09 10:35:27 +08:00
										 |  |  |   TrashBloc({required this.service, required this.listener}) | 
					
						
							|  |  |  |       : super(TrashState.init()) { | 
					
						
							| 
									
										
										
										
											2022-01-04 22:44:03 +08:00
										 |  |  |     on<TrashEvent>((event, emit) async { | 
					
						
							|  |  |  |       await event.map(initial: (e) async { | 
					
						
							| 
									
										
										
										
											2022-03-23 22:10:31 +08:00
										 |  |  |         listener.start(trashUpdated: _listenTrashUpdated); | 
					
						
							| 
									
										
										
										
											2022-02-28 21:17:08 -05:00
										 |  |  |         final result = await service.readTrash(); | 
					
						
							| 
									
										
										
										
											2022-01-04 22:44:03 +08:00
										 |  |  |         emit(result.fold( | 
					
						
							| 
									
										
										
										
											2022-08-09 10:35:27 +08:00
										 |  |  |           (object) => state.copyWith( | 
					
						
							|  |  |  |               objects: object.items, successOrFailure: left(unit)), | 
					
						
							| 
									
										
										
										
											2021-10-14 14:34:22 +08:00
										 |  |  |           (error) => state.copyWith(successOrFailure: right(error)), | 
					
						
							| 
									
										
										
										
											2022-01-04 22:44:03 +08:00
										 |  |  |         )); | 
					
						
							|  |  |  |       }, didReceiveTrash: (e) async { | 
					
						
							|  |  |  |         emit(state.copyWith(objects: e.trash)); | 
					
						
							|  |  |  |       }, putback: (e) async { | 
					
						
							| 
									
										
										
										
											2022-02-28 21:17:08 -05:00
										 |  |  |         final result = await service.putback(e.trashId); | 
					
						
							| 
									
										
										
										
											2022-01-04 22:44:03 +08:00
										 |  |  |         await _handleResult(result, emit); | 
					
						
							|  |  |  |       }, delete: (e) async { | 
					
						
							| 
									
										
										
										
											2022-08-09 10:35:27 +08:00
										 |  |  |         final result = | 
					
						
							|  |  |  |             await service.deleteViews([Tuple2(e.trash.id, e.trash.ty)]); | 
					
						
							| 
									
										
										
										
											2022-01-04 22:44:03 +08:00
										 |  |  |         await _handleResult(result, emit); | 
					
						
							|  |  |  |       }, deleteAll: (e) async { | 
					
						
							| 
									
										
										
										
											2022-02-28 21:17:08 -05:00
										 |  |  |         final result = await service.deleteAll(); | 
					
						
							| 
									
										
										
										
											2022-01-04 22:44:03 +08:00
										 |  |  |         await _handleResult(result, emit); | 
					
						
							|  |  |  |       }, restoreAll: (e) async { | 
					
						
							| 
									
										
										
										
											2022-02-28 21:17:08 -05:00
										 |  |  |         final result = await service.restoreAll(); | 
					
						
							| 
									
										
										
										
											2022-01-04 22:44:03 +08:00
										 |  |  |         await _handleResult(result, emit); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  |     }); | 
					
						
							| 
									
										
										
										
											2021-10-12 22:31:38 +08:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2021-10-14 14:34:22 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-09 10:35:27 +08:00
										 |  |  |   Future<void> _handleResult( | 
					
						
							|  |  |  |       Either<dynamic, FlowyError> result, Emitter<TrashState> emit) async { | 
					
						
							| 
									
										
										
										
											2022-01-04 22:44:03 +08:00
										 |  |  |     emit(result.fold( | 
					
						
							| 
									
										
										
										
											2021-10-18 16:30:20 +08:00
										 |  |  |       (l) => state.copyWith(successOrFailure: left(unit)), | 
					
						
							|  |  |  |       (error) => state.copyWith(successOrFailure: right(error)), | 
					
						
							| 
									
										
										
										
											2022-01-04 22:44:03 +08:00
										 |  |  |     )); | 
					
						
							| 
									
										
										
										
											2021-10-18 16:30:20 +08:00
										 |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-07-19 14:11:29 +08:00
										 |  |  |   void _listenTrashUpdated(Either<List<TrashPB>, FlowyError> trashOrFailed) { | 
					
						
							| 
									
										
										
										
											2021-10-14 14:34:22 +08:00
										 |  |  |     trashOrFailed.fold( | 
					
						
							|  |  |  |       (trash) { | 
					
						
							|  |  |  |         add(TrashEvent.didReceiveTrash(trash)); | 
					
						
							|  |  |  |       }, | 
					
						
							|  |  |  |       (error) { | 
					
						
							|  |  |  |         Log.error(error); | 
					
						
							|  |  |  |       }, | 
					
						
							|  |  |  |     ); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   @override | 
					
						
							|  |  |  |   Future<void> close() async { | 
					
						
							| 
									
										
										
										
											2022-01-31 09:49:05 +08:00
										 |  |  |     await listener.close(); | 
					
						
							| 
									
										
										
										
											2021-10-14 14:34:22 +08:00
										 |  |  |     return super.close(); | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2021-10-12 22:31:38 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @freezed | 
					
						
							|  |  |  | class TrashEvent with _$TrashEvent { | 
					
						
							|  |  |  |   const factory TrashEvent.initial() = Initial; | 
					
						
							| 
									
										
										
										
											2022-07-19 14:11:29 +08:00
										 |  |  |   const factory TrashEvent.didReceiveTrash(List<TrashPB> trash) = ReceiveTrash; | 
					
						
							| 
									
										
										
										
											2021-10-14 22:58:20 +08:00
										 |  |  |   const factory TrashEvent.putback(String trashId) = Putback; | 
					
						
							| 
									
										
										
										
											2022-07-19 14:11:29 +08:00
										 |  |  |   const factory TrashEvent.delete(TrashPB trash) = Delete; | 
					
						
							| 
									
										
										
										
											2021-10-14 22:58:20 +08:00
										 |  |  |   const factory TrashEvent.restoreAll() = RestoreAll; | 
					
						
							|  |  |  |   const factory TrashEvent.deleteAll() = DeleteAll; | 
					
						
							| 
									
										
										
										
											2021-10-12 22:31:38 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @freezed | 
					
						
							|  |  |  | class TrashState with _$TrashState { | 
					
						
							|  |  |  |   const factory TrashState({ | 
					
						
							| 
									
										
										
										
											2022-07-19 14:11:29 +08:00
										 |  |  |     required List<TrashPB> objects, | 
					
						
							| 
									
										
										
										
											2021-12-14 18:04:51 +08:00
										 |  |  |     required Either<Unit, FlowyError> successOrFailure, | 
					
						
							| 
									
										
										
										
											2021-10-12 22:31:38 +08:00
										 |  |  |   }) = _TrashState; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   factory TrashState.init() => TrashState( | 
					
						
							|  |  |  |         objects: [], | 
					
						
							|  |  |  |         successOrFailure: left(unit), | 
					
						
							|  |  |  |       ); | 
					
						
							|  |  |  | } |