import 'dart:async'; import 'package:bloc/bloc.dart'; import 'package:collection/collection.dart'; import 'package:equatable/equatable.dart'; import 'package:paperless_api/paperless_api.dart'; import 'package:paperless_mobile/core/notifier/document_changed_notifier.dart'; import 'package:paperless_mobile/core/repository/label_repository.dart'; part 'document_edit_state.dart'; class DocumentEditCubit extends Cubit { final DocumentModel _initialDocument; final PaperlessDocumentsApi _docsApi; final DocumentChangedNotifier _notifier; final LabelRepository _correspondentRepository; final LabelRepository _documentTypeRepository; final LabelRepository _storagePathRepository; final LabelRepository _tagRepository; final List _subscriptions = []; DocumentEditCubit( DocumentModel document, { required PaperlessDocumentsApi documentsApi, required LabelRepository correspondentRepository, required LabelRepository documentTypeRepository, required LabelRepository storagePathRepository, required LabelRepository tagRepository, required DocumentChangedNotifier notifier, }) : _initialDocument = document, _docsApi = documentsApi, _correspondentRepository = correspondentRepository, _documentTypeRepository = documentTypeRepository, _storagePathRepository = storagePathRepository, _tagRepository = tagRepository, _notifier = notifier, super( DocumentEditState( document: document, correspondents: correspondentRepository.current?.values ?? {}, documentTypes: documentTypeRepository.current?.values ?? {}, storagePaths: storagePathRepository.current?.values ?? {}, tags: tagRepository.current?.values ?? {}, ), ) { _notifier.subscribe(this, onUpdated: replace); _subscriptions.add( _correspondentRepository.values .listen((v) => emit(state.copyWith(correspondents: v?.values))), ); _subscriptions.add( _documentTypeRepository.values .listen((v) => emit(state.copyWith(documentTypes: v?.values))), ); _subscriptions.add( _storagePathRepository.values .listen((v) => emit(state.copyWith(storagePaths: v?.values))), ); _subscriptions.add( _tagRepository.values.listen( (v) => emit(state.copyWith(tags: v?.values)), ), ); } Future updateDocument(DocumentModel document) async { final updated = await _docsApi.update(document); _notifier.notifyUpdated(updated); // Reload changed labels (documentCount property changes with removal/add) if (document.documentType != _initialDocument.documentType) { _documentTypeRepository .find((document.documentType ?? _initialDocument.documentType)!); } if (document.correspondent != _initialDocument.correspondent) { _correspondentRepository .find((document.correspondent ?? _initialDocument.correspondent)!); } if (document.storagePath != _initialDocument.storagePath) { _storagePathRepository .find((document.storagePath ?? _initialDocument.storagePath)!); } if (!const DeepCollectionEquality.unordered() .equals(document.tags, _initialDocument.tags)) { _tagRepository.findAll(document.tags); } } void replace(DocumentModel document) { emit(state.copyWith(document: document)); } @override Future close() { for (final sub in _subscriptions) { sub.cancel(); } _notifier.unsubscribe(this); return super.close(); } }