| 
									
										
										
										
											2021-10-12 22:31:38 +08:00
										 |  |  | import 'package:dartz/dartz.dart'; | 
					
						
							| 
									
										
										
										
											2023-01-08 12:10:53 +08:00
										 |  |  | import 'package:appflowy_backend/log.dart'; | 
					
						
							| 
									
										
										
										
											2023-04-04 08:41:16 +08:00
										 |  |  | import 'package:appflowy_backend/protobuf/flowy-folder2/trash.pb.dart'; | 
					
						
							| 
									
										
										
										
											2023-01-08 12:10:53 +08:00
										 |  |  | import 'package:appflowy_backend/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'; | 
					
						
							| 
									
										
										
										
											2023-02-26 16:27:17 +08:00
										 |  |  | import 'package:appflowy/plugins/trash/application/trash_service.dart'; | 
					
						
							|  |  |  | import 'package:appflowy/plugins/trash/application/trash_listener.dart'; | 
					
						
							| 
									
										
										
										
											2022-08-09 10:35:27 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-12 22:31:38 +08:00
										 |  |  | part 'trash_bloc.freezed.dart'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class TrashBloc extends Bloc<TrashEvent, TrashState> { | 
					
						
							| 
									
										
										
										
											2022-10-25 16:51:51 +08:00
										 |  |  |   final TrashService _service; | 
					
						
							|  |  |  |   final TrashListener _listener; | 
					
						
							|  |  |  |   TrashBloc() | 
					
						
							|  |  |  |       : _service = TrashService(), | 
					
						
							|  |  |  |         _listener = TrashListener(), | 
					
						
							|  |  |  |         super(TrashState.init()) { | 
					
						
							| 
									
										
										
										
											2022-01-04 22:44:03 +08:00
										 |  |  |     on<TrashEvent>((event, emit) async { | 
					
						
							| 
									
										
										
										
											2023-04-10 15:10:42 +08:00
										 |  |  |       await event.map( | 
					
						
							|  |  |  |         initial: (e) async { | 
					
						
							|  |  |  |           _listener.start(trashUpdated: _listenTrashUpdated); | 
					
						
							|  |  |  |           final result = await _service.readTrash(); | 
					
						
							|  |  |  |           emit( | 
					
						
							|  |  |  |             result.fold( | 
					
						
							|  |  |  |               (object) => state.copyWith( | 
					
						
							|  |  |  |                 objects: object.items, | 
					
						
							|  |  |  |                 successOrFailure: left(unit), | 
					
						
							|  |  |  |               ), | 
					
						
							|  |  |  |               (error) => state.copyWith(successOrFailure: right(error)), | 
					
						
							|  |  |  |             ), | 
					
						
							|  |  |  |           ); | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |         didReceiveTrash: (e) async { | 
					
						
							|  |  |  |           emit(state.copyWith(objects: e.trash)); | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |         putback: (e) async { | 
					
						
							|  |  |  |           final result = await _service.putback(e.trashId); | 
					
						
							|  |  |  |           await _handleResult(result, emit); | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |         delete: (e) async { | 
					
						
							| 
									
										
										
										
											2023-04-18 19:06:21 +08:00
										 |  |  |           final result = await _service.deleteViews([e.trash.id]); | 
					
						
							| 
									
										
										
										
											2023-04-10 15:10:42 +08:00
										 |  |  |           await _handleResult(result, emit); | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |         deleteAll: (e) async { | 
					
						
							|  |  |  |           final result = await _service.deleteAll(); | 
					
						
							|  |  |  |           await _handleResult(result, emit); | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |         restoreAll: (e) async { | 
					
						
							|  |  |  |           final result = await _service.restoreAll(); | 
					
						
							|  |  |  |           await _handleResult(result, emit); | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |       ); | 
					
						
							| 
									
										
										
										
											2022-01-04 22:44:03 +08:00
										 |  |  |     }); | 
					
						
							| 
									
										
										
										
											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( | 
					
						
							| 
									
										
										
										
											2023-04-10 15:10:42 +08:00
										 |  |  |     Either<dynamic, FlowyError> result, | 
					
						
							|  |  |  |     Emitter<TrashState> emit, | 
					
						
							|  |  |  |   ) async { | 
					
						
							|  |  |  |     emit( | 
					
						
							|  |  |  |       result.fold( | 
					
						
							|  |  |  |         (l) => state.copyWith(successOrFailure: left(unit)), | 
					
						
							|  |  |  |         (error) => state.copyWith(successOrFailure: right(error)), | 
					
						
							|  |  |  |       ), | 
					
						
							|  |  |  |     ); | 
					
						
							| 
									
										
										
										
											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-10-25 16:51:51 +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), | 
					
						
							|  |  |  |       ); | 
					
						
							|  |  |  | } |