import 'dart:async'; import 'dart:typed_data'; import 'package:flutter/cupertino.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:hl_lieferservice/widget/operations/bloc/operation_bloc.dart'; import 'package:hl_lieferservice/widget/operations/bloc/operation_event.dart'; import 'note_event.dart'; import 'note_state.dart'; import 'package:hl_lieferservice/feature/delivery/detail/repository/note_repository.dart'; class NoteBloc extends Bloc { final NoteRepository repository; final OperationBloc opBloc; final String deliveryId; StreamSubscription? _noteSubscription; StreamSubscription? _imageSubscription; NoteBloc({required this.repository, required this.opBloc, required this.deliveryId}) : super(NoteInitial()) { repository.loadNotes(deliveryId); _noteSubscription = repository.notes.listen((notes) { add(NotesUpdated(notes: notes)); }); _imageSubscription = repository.images.listen((images) { add(ImageUpdated(images: images)); }); on(_load); on(_add); on(_edit); on(_remove); on(_upload); on(_removeImage); on(_reset); on(_noteUpdated); on(_imageUpdated); } @override Future close() { _noteSubscription?.cancel(); _imageSubscription?.cancel(); return super.close(); } Future _imageUpdated(ImageUpdated event, Emitter emit) async { final currentState = state; if (currentState is NoteLoaded) { emit.call(currentState.copyWith(images: event.images)); } } Future _noteUpdated(NotesUpdated event, Emitter emit) async { emit(NoteLoaded(notes: event.notes)); } Future _reset(ResetNotes event, Emitter emit) async { emit.call(NoteInitial()); } Future _removeImage(RemoveImageNote event, Emitter emit,) async { opBloc.add(LoadOperation()); try { await repository.deleteImage(event.deliveryId, event.objectId); opBloc.add(FinishOperation()); } catch (e, st) { debugPrint("Fehler beim Löschen des Bildes: $e"); debugPrint(st.toString()); opBloc.add(FailOperation(message: e.toString())); } } Future _upload(AddImageNote event, Emitter emit) async { opBloc.add(LoadOperation()); try { Uint8List imageBytes = await event.file.readAsBytes(); await repository.addImage(event.deliveryId, imageBytes); opBloc.add(FinishOperation()); } catch (e, st) { debugPrint("Fehler beim Hinzufügen des Bildes: $e"); debugPrint(st.toString()); opBloc.add(FailOperation(message: e.toString())); } } Future _load(LoadNote event, Emitter emit) async { emit.call(NoteLoading()); try { List urls = event.delivery.images.map((image) => image.url).toList(); debugPrint("IMAGE URLS : $urls"); await repository.loadNotes(event.delivery.id); await repository.loadTemplates(); opBloc.add(FinishOperation()); } catch (e, st) { debugPrint("Fehler beim Herunterladen der Notizen: $e"); debugPrint(st.toString()); opBloc.add( FailOperation(message: "Notizen konnten nicht heruntergeladen werden."), ); emit.call(NoteLoadingFailed()); } } Future _add(AddNote event, Emitter emit) async { opBloc.add(LoadOperation()); try { await repository.addNote(event.deliveryId, event.note); opBloc.add(FinishOperation()); } catch (e, st) { debugPrint("Fehler beim Hinzufügen der Notiz: $e"); debugPrint(st.toString()); opBloc.add(FailOperation(message: e.toString())); } } Future _edit(EditNote event, Emitter emit) async { opBloc.add(LoadOperation()); try { await repository.editNote(event.noteId, event.content); opBloc.add(FinishOperation()); } catch (e, st) { debugPrint("Fehler beim Hinzufügen der Notiz: $e"); debugPrint(st.toString()); opBloc.add(FailOperation(message: e.toString())); } } Future _remove(RemoveNote event, Emitter emit) async { opBloc.add(LoadOperation()); try { await repository.deleteNote(event.noteId); opBloc.add(FinishOperation()); } catch (e, st) { debugPrint("Fehler beim Hinzufügen der Notiz: $e"); debugPrint(st.toString()); opBloc.add( FailOperation(message: "Notizen konnte nicht gelöscht werden."), ); } } }