import 'dart:async'; import 'dart:io'; 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 'package:rxdart/rxdart.dart'; import '../../../../model/delivery.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? _combinedSubscription; NoteBloc({ required this.repository, required this.opBloc, required this.deliveryId, }) : super(NoteInitial()) { _combinedSubscription = CombineLatestStream.combine3( repository.notes, repository.images, repository.templates, (note, image, templates) => {"note": note, "image": image, "templates": templates}, ).listen( (data) => add( DataUpdated( images: data["image"] as List, notes: data["note"] as List, templates: data["templates"] as List ), ), ); on(_load); on(_add); on(_edit); on(_remove); on(_upload); on(_removeImage); on(_reset); on(_dataUpdated); } @override Future close() { _combinedSubscription?.cancel(); return super.close(); } Future _dataUpdated(DataUpdated event, Emitter emit) async { emit(NoteLoaded(notes: event.notes, images: event.images, templates: event.templates)); } 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."), ); } } }