import 'dart:async'; import 'package:flutter/foundation.dart'; import 'package:hydrated_bloc/hydrated_bloc.dart'; import 'package:json_annotation/json_annotation.dart'; import 'package:paperless_api/paperless_api.dart'; import 'package:paperless_mobile/core/database/tables/local_user_app_state.dart'; import 'package:paperless_mobile/core/notifier/document_changed_notifier.dart'; import 'package:paperless_mobile/core/repository/label_repository.dart'; import 'package:paperless_mobile/core/service/connectivity_status_service.dart'; import 'package:paperless_mobile/features/paged_document_view/cubit/document_paging_bloc_mixin.dart'; import 'package:paperless_mobile/features/paged_document_view/cubit/paged_documents_state.dart'; import 'package:paperless_mobile/features/settings/model/view_type.dart'; part 'documents_state.dart'; class DocumentsCubit extends Cubit with DocumentPagingBlocMixin { @override final PaperlessDocumentsApi api; final LabelRepository _labelRepository; @override final ConnectivityStatusService connectivityStatusService; @override final DocumentChangedNotifier notifier; final LocalUserAppState _userState; DocumentsCubit( this.api, this.notifier, this._labelRepository, this._userState, this.connectivityStatusService, ) : super(DocumentsState( filter: _userState.currentDocumentFilter, viewType: _userState.documentsPageViewType, )) { notifier.addListener( this, onUpdated: (document) { replace(document); emit( state.copyWith( selection: state.selection .map((e) => e.id == document.id ? document : e) .toList(), ), ); }, onDeleted: (document) { remove(document); emit( state.copyWith( selection: state.selection.where((e) => e.id != document.id).toList(), ), ); }, ); _labelRepository.addListener( this, onChanged: (labels) => emit( state.copyWith( correspondents: labels.correspondents, documentTypes: labels.documentTypes, storagePaths: labels.storagePaths, tags: labels.tags, ), ), ); } Future bulkDelete(List documents) async { await api.bulkAction( BulkDeleteAction(documents.map((doc) => doc.id)), ); for (final deletedDoc in documents) { notifier.notifyDeleted(deletedDoc); } await reload(); } void toggleDocumentSelection(DocumentModel model) { if (state.selectedIds.contains(model.id)) { emit( state.copyWith( selection: state.selection .where((element) => element.id != model.id) .toList(), ), ); } else { emit(state.copyWith(selection: [...state.selection, model])); } } void resetSelection() { emit(state.copyWith(selection: [])); } void reset() { emit(const DocumentsState()); } Future> autocomplete(String query) async { final res = await api.autocomplete(query); return res; } @override Future close() { notifier.removeListener(this); _labelRepository.removeListener(this); return super.close(); } void setViewType(ViewType viewType) { emit(state.copyWith(viewType: viewType)); _userState ..documentsPageViewType = viewType ..save(); } @override Future onFilterUpdated(DocumentFilter filter) async { _userState.currentDocumentFilter = filter; await _userState.save(); } // @override // DocumentsState? fromJson(Map json) { // return DocumentsState.fromJson(json); // } // @override // Map? toJson(DocumentsState state) { // return state.toJson(); // } }