import 'dart:async'; import 'package:bloc/bloc.dart'; import 'package:equatable/equatable.dart'; import 'package:flutter/foundation.dart'; import 'package:paperless_api/paperless_api.dart'; import 'package:paperless_mobile/core/repository/label_repository.dart'; import 'package:paperless_mobile/core/repository/state/impl/correspondent_repository_state.dart'; import 'package:paperless_mobile/core/repository/state/impl/document_type_repository_state.dart'; import 'package:paperless_mobile/core/repository/state/impl/tag_repository_state.dart'; import 'package:paperless_mobile/core/store/local_vault.dart'; part 'document_upload_state.dart'; class DocumentUploadCubit extends Cubit { final PaperlessDocumentsApi _documentApi; final LabelRepository _tagRepository; final LabelRepository _correspondentRepository; final LabelRepository _documentTypeRepository; final List _subs = []; DocumentUploadCubit({ required LocalVault localVault, required PaperlessDocumentsApi documentApi, required LabelRepository tagRepository, required LabelRepository correspondentRepository, required LabelRepository documentTypeRepository, }) : _documentApi = documentApi, _tagRepository = tagRepository, _correspondentRepository = correspondentRepository, _documentTypeRepository = documentTypeRepository, super( const DocumentUploadState( tags: {}, correspondents: {}, documentTypes: {}, ), ) { _subs.add(_tagRepository.values.listen( (tags) => emit(state.copyWith(tags: tags?.values)), )); _subs.add(_correspondentRepository.values.listen( (correspondents) => emit(state.copyWith(correspondents: correspondents?.values)), )); _subs.add(_documentTypeRepository.values.listen( (documentTypes) => emit(state.copyWith(documentTypes: documentTypes?.values)), )); } Future upload( Uint8List bytes, { required String filename, required String title, int? documentType, int? correspondent, Iterable tags = const [], DateTime? createdAt, }) async { return await _documentApi.create( bytes, filename: filename, title: title, correspondent: correspondent, documentType: documentType, tags: tags, createdAt: createdAt, ); } @override Future close() async { for (final sub in _subs) { await sub.cancel(); } return super.close(); } }