mirror of
https://github.com/Xevion/paperless-mobile.git
synced 2025-12-10 06:07:57 -06:00
Changed saved views handling, changed repository structure with automatic persistence.
This commit is contained in:
@@ -1,18 +1,34 @@
|
||||
import 'package:hydrated_bloc/hydrated_bloc.dart';
|
||||
import 'package:paperless_mobile/core/repository/state/repository_state.dart';
|
||||
import 'package:rxdart/subjects.dart';
|
||||
|
||||
///
|
||||
/// Base repository class which all repositories should implement
|
||||
///
|
||||
abstract class BaseRepository<State, Object> {
|
||||
Stream<State?> get values;
|
||||
abstract class BaseRepository<State extends RepositoryState, Type>
|
||||
extends Cubit<State> with HydratedMixin {
|
||||
final State _initialState;
|
||||
|
||||
State? get current;
|
||||
BaseRepository(this._initialState) : super(_initialState) {
|
||||
hydrate();
|
||||
}
|
||||
|
||||
bool get isInitialized;
|
||||
Stream<State?> get values =>
|
||||
BehaviorSubject.seeded(state)..addStream(super.stream);
|
||||
|
||||
Future<Object> create(Object object);
|
||||
Future<Object?> find(int id);
|
||||
Future<Iterable<Object>> findAll([Iterable<int>? ids]);
|
||||
Future<Object> update(Object object);
|
||||
Future<int> delete(Object object);
|
||||
State? get current => state;
|
||||
|
||||
void clear();
|
||||
bool get isInitialized => state.hasLoaded;
|
||||
|
||||
Future<Type> create(Type object);
|
||||
Future<Type?> find(int id);
|
||||
Future<Iterable<Type>> findAll([Iterable<int>? ids]);
|
||||
Future<Type> update(Type object);
|
||||
Future<int> delete(Type object);
|
||||
|
||||
@override
|
||||
Future<void> clear() async {
|
||||
await super.clear();
|
||||
emit(_initialState);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,40 +2,31 @@ import 'dart:async';
|
||||
|
||||
import 'package:paperless_api/paperless_api.dart';
|
||||
import 'package:paperless_mobile/core/repository/label_repository.dart';
|
||||
import 'package:rxdart/rxdart.dart' show BehaviorSubject;
|
||||
import 'package:paperless_mobile/core/repository/state/impl/correspondent_repository_state.dart';
|
||||
import 'package:paperless_mobile/core/repository/state/repository_state.dart';
|
||||
|
||||
class CorrespondentRepositoryImpl implements LabelRepository<Correspondent> {
|
||||
class CorrespondentRepositoryImpl
|
||||
extends LabelRepository<Correspondent, CorrespondentRepositoryState> {
|
||||
final PaperlessLabelsApi _api;
|
||||
|
||||
final _subject = BehaviorSubject<Map<int, Correspondent>?>();
|
||||
|
||||
CorrespondentRepositoryImpl(this._api);
|
||||
|
||||
@override
|
||||
bool get isInitialized => _subject.valueOrNull != null;
|
||||
|
||||
@override
|
||||
Stream<Map<int, Correspondent>?> get values =>
|
||||
_subject.stream.asBroadcastStream();
|
||||
|
||||
Map<int, Correspondent> get _currentValueOrEmpty =>
|
||||
_subject.valueOrNull ?? {};
|
||||
CorrespondentRepositoryImpl(this._api)
|
||||
: super(const CorrespondentRepositoryState());
|
||||
|
||||
@override
|
||||
Future<Correspondent> create(Correspondent correspondent) async {
|
||||
final created = await _api.saveCorrespondent(correspondent);
|
||||
final updatedState = {..._currentValueOrEmpty}
|
||||
final updatedState = {...state.values}
|
||||
..putIfAbsent(created.id!, () => created);
|
||||
_subject.add(updatedState);
|
||||
emit(CorrespondentRepositoryState(values: updatedState, hasLoaded: true));
|
||||
return created;
|
||||
}
|
||||
|
||||
@override
|
||||
Future<int> delete(Correspondent correspondent) async {
|
||||
await _api.deleteCorrespondent(correspondent);
|
||||
final updatedState = {..._currentValueOrEmpty}
|
||||
final updatedState = {...state.values}
|
||||
..removeWhere((k, v) => k == correspondent.id);
|
||||
_subject.add(updatedState);
|
||||
emit(CorrespondentRepositoryState(values: updatedState, hasLoaded: true));
|
||||
return correspondent.id!;
|
||||
}
|
||||
|
||||
@@ -43,8 +34,8 @@ class CorrespondentRepositoryImpl implements LabelRepository<Correspondent> {
|
||||
Future<Correspondent?> find(int id) async {
|
||||
final correspondent = await _api.getCorrespondent(id);
|
||||
if (correspondent != null) {
|
||||
final updatedState = {..._currentValueOrEmpty}..[id] = correspondent;
|
||||
_subject.add(updatedState);
|
||||
final updatedState = {...state.values}..[id] = correspondent;
|
||||
emit(CorrespondentRepositoryState(values: updatedState, hasLoaded: true));
|
||||
return correspondent;
|
||||
}
|
||||
return null;
|
||||
@@ -53,26 +44,27 @@ class CorrespondentRepositoryImpl implements LabelRepository<Correspondent> {
|
||||
@override
|
||||
Future<Iterable<Correspondent>> findAll([Iterable<int>? ids]) async {
|
||||
final correspondents = await _api.getCorrespondents(ids);
|
||||
final updatedState = {..._currentValueOrEmpty}
|
||||
final updatedState = {...state.values}
|
||||
..addEntries(correspondents.map((e) => MapEntry(e.id!, e)));
|
||||
_subject.add(updatedState);
|
||||
emit(CorrespondentRepositoryState(values: updatedState, hasLoaded: true));
|
||||
return correspondents;
|
||||
}
|
||||
|
||||
@override
|
||||
Future<Correspondent> update(Correspondent correspondent) async {
|
||||
final updated = await _api.updateCorrespondent(correspondent);
|
||||
final updatedState = {..._currentValueOrEmpty}
|
||||
..update(updated.id!, (_) => updated);
|
||||
_subject.add(updatedState);
|
||||
final updatedState = {...state.values}..update(updated.id!, (_) => updated);
|
||||
emit(CorrespondentRepositoryState(values: updatedState, hasLoaded: true));
|
||||
return updated;
|
||||
}
|
||||
|
||||
@override
|
||||
void clear() {
|
||||
_subject.add(null);
|
||||
CorrespondentRepositoryState fromJson(Map<String, dynamic> json) {
|
||||
return CorrespondentRepositoryState.fromJson(json);
|
||||
}
|
||||
|
||||
@override
|
||||
Map<int, Correspondent>? get current => _subject.valueOrNull;
|
||||
Map<String, dynamic> toJson(CorrespondentRepositoryState state) {
|
||||
return state.toJson();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,38 +1,30 @@
|
||||
import 'package:paperless_api/paperless_api.dart';
|
||||
import 'package:paperless_mobile/core/repository/label_repository.dart';
|
||||
import 'package:paperless_mobile/core/repository/state/impl/document_type_repository_state.dart';
|
||||
import 'package:rxdart/rxdart.dart' show BehaviorSubject;
|
||||
|
||||
class DocumentTypeRepositoryImpl implements LabelRepository<DocumentType> {
|
||||
class DocumentTypeRepositoryImpl
|
||||
extends LabelRepository<DocumentType, DocumentTypeRepositoryState> {
|
||||
final PaperlessLabelsApi _api;
|
||||
|
||||
final _subject = BehaviorSubject<Map<int, DocumentType>?>();
|
||||
|
||||
DocumentTypeRepositoryImpl(this._api);
|
||||
|
||||
@override
|
||||
Stream<Map<int, DocumentType>?> get values =>
|
||||
_subject.stream.asBroadcastStream();
|
||||
|
||||
@override
|
||||
bool get isInitialized => _subject.valueOrNull != null;
|
||||
|
||||
Map<int, DocumentType> get _currentValueOrEmpty => _subject.valueOrNull ?? {};
|
||||
DocumentTypeRepositoryImpl(this._api)
|
||||
: super(const DocumentTypeRepositoryState());
|
||||
|
||||
@override
|
||||
Future<DocumentType> create(DocumentType documentType) async {
|
||||
final created = await _api.saveDocumentType(documentType);
|
||||
final updatedState = {..._currentValueOrEmpty}
|
||||
final updatedState = {...state.values}
|
||||
..putIfAbsent(created.id!, () => created);
|
||||
_subject.add(updatedState);
|
||||
emit(DocumentTypeRepositoryState(values: updatedState, hasLoaded: true));
|
||||
return created;
|
||||
}
|
||||
|
||||
@override
|
||||
Future<int> delete(DocumentType documentType) async {
|
||||
await _api.deleteDocumentType(documentType);
|
||||
final updatedState = {..._currentValueOrEmpty}
|
||||
final updatedState = {...state.values}
|
||||
..removeWhere((k, v) => k == documentType.id);
|
||||
_subject.add(updatedState);
|
||||
emit(DocumentTypeRepositoryState(values: updatedState, hasLoaded: true));
|
||||
return documentType.id!;
|
||||
}
|
||||
|
||||
@@ -40,8 +32,8 @@ class DocumentTypeRepositoryImpl implements LabelRepository<DocumentType> {
|
||||
Future<DocumentType?> find(int id) async {
|
||||
final documentType = await _api.getDocumentType(id);
|
||||
if (documentType != null) {
|
||||
final updatedState = {..._currentValueOrEmpty}..[id] = documentType;
|
||||
_subject.add(updatedState);
|
||||
final updatedState = {...state.values}..[id] = documentType;
|
||||
emit(DocumentTypeRepositoryState(values: updatedState, hasLoaded: true));
|
||||
return documentType;
|
||||
}
|
||||
return null;
|
||||
@@ -50,26 +42,27 @@ class DocumentTypeRepositoryImpl implements LabelRepository<DocumentType> {
|
||||
@override
|
||||
Future<Iterable<DocumentType>> findAll([Iterable<int>? ids]) async {
|
||||
final documentTypes = await _api.getDocumentTypes(ids);
|
||||
final updatedState = {..._currentValueOrEmpty}
|
||||
final updatedState = {...state.values}
|
||||
..addEntries(documentTypes.map((e) => MapEntry(e.id!, e)));
|
||||
_subject.add(updatedState);
|
||||
emit(DocumentTypeRepositoryState(values: updatedState, hasLoaded: true));
|
||||
return documentTypes;
|
||||
}
|
||||
|
||||
@override
|
||||
Future<DocumentType> update(DocumentType documentType) async {
|
||||
final updated = await _api.updateDocumentType(documentType);
|
||||
final updatedState = {..._currentValueOrEmpty}
|
||||
..update(updated.id!, (_) => updated);
|
||||
_subject.add(updatedState);
|
||||
final updatedState = {...state.values}..update(updated.id!, (_) => updated);
|
||||
emit(DocumentTypeRepositoryState(values: updatedState, hasLoaded: true));
|
||||
return updated;
|
||||
}
|
||||
|
||||
@override
|
||||
void clear() {
|
||||
_subject.add(const {});
|
||||
DocumentTypeRepositoryState fromJson(Map<String, dynamic> json) {
|
||||
return DocumentTypeRepositoryState.fromJson(json);
|
||||
}
|
||||
|
||||
@override
|
||||
Map<int, DocumentType>? get current => _subject.valueOrNull;
|
||||
Map<String, dynamic> toJson(DocumentTypeRepositoryState state) {
|
||||
return state.toJson();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,46 +1,35 @@
|
||||
import 'package:paperless_api/paperless_api.dart';
|
||||
import 'package:paperless_mobile/core/repository/saved_view_repository.dart';
|
||||
import 'package:rxdart/rxdart.dart';
|
||||
import 'package:paperless_mobile/core/repository/state/impl/saved_view_repository_state.dart';
|
||||
|
||||
class SavedViewRepositoryImpl implements SavedViewRepository {
|
||||
class SavedViewRepositoryImpl extends SavedViewRepository {
|
||||
final PaperlessSavedViewsApi _api;
|
||||
|
||||
SavedViewRepositoryImpl(this._api);
|
||||
|
||||
final _subject = BehaviorSubject<Map<int, SavedView>?>();
|
||||
|
||||
@override
|
||||
Stream<Map<int, SavedView>?> get values =>
|
||||
_subject.stream.asBroadcastStream();
|
||||
|
||||
@override
|
||||
void clear() {
|
||||
_subject.add(const {});
|
||||
}
|
||||
SavedViewRepositoryImpl(this._api) : super(const SavedViewRepositoryState());
|
||||
|
||||
@override
|
||||
Future<SavedView> create(SavedView view) async {
|
||||
final created = await _api.save(view);
|
||||
final updatedState = {..._subject.valueOrNull ?? {}}
|
||||
final updatedState = {...state.values}
|
||||
..putIfAbsent(created.id!, () => created);
|
||||
_subject.add(updatedState);
|
||||
emit(SavedViewRepositoryState(values: updatedState, hasLoaded: true));
|
||||
return created;
|
||||
}
|
||||
|
||||
@override
|
||||
Future<int> delete(SavedView view) async {
|
||||
await _api.delete(view);
|
||||
final updatedState = {..._subject.valueOrNull ?? {}}..remove(view.id);
|
||||
_subject.add(updatedState);
|
||||
final updatedState = {...state.values}..remove(view.id);
|
||||
emit(SavedViewRepositoryState(values: updatedState, hasLoaded: true));
|
||||
return view.id!;
|
||||
}
|
||||
|
||||
@override
|
||||
Future<SavedView?> find(int id) async {
|
||||
final found = await _api.find(id);
|
||||
final updatedState = {..._subject.valueOrNull ?? {}}
|
||||
final updatedState = {...state.values}
|
||||
..update(id, (_) => found, ifAbsent: () => found);
|
||||
_subject.add(updatedState);
|
||||
emit(SavedViewRepositoryState(values: updatedState, hasLoaded: true));
|
||||
return found;
|
||||
}
|
||||
|
||||
@@ -48,21 +37,26 @@ class SavedViewRepositoryImpl implements SavedViewRepository {
|
||||
Future<Iterable<SavedView>> findAll([Iterable<int>? ids]) async {
|
||||
final found = await _api.findAll(ids);
|
||||
final updatedState = {
|
||||
..._subject.valueOrNull ?? {},
|
||||
...state.values,
|
||||
...{for (final view in found) view.id!: view},
|
||||
};
|
||||
_subject.add(updatedState);
|
||||
emit(SavedViewRepositoryState(values: updatedState, hasLoaded: true));
|
||||
return found;
|
||||
}
|
||||
|
||||
@override
|
||||
Map<int, SavedView>? get current => _subject.valueOrNull;
|
||||
|
||||
@override
|
||||
bool get isInitialized => _subject.hasValue;
|
||||
|
||||
@override
|
||||
Future<SavedView> update(SavedView object) {
|
||||
throw UnimplementedError("Saved view update is not yet implemented");
|
||||
throw UnimplementedError(
|
||||
"Saved view update is not yet implemented as it is not supported by the API.");
|
||||
}
|
||||
|
||||
@override
|
||||
SavedViewRepositoryState fromJson(Map<String, dynamic> json) {
|
||||
return SavedViewRepositoryState.fromJson(json);
|
||||
}
|
||||
|
||||
@override
|
||||
Map<String, dynamic> toJson(SavedViewRepositoryState state) {
|
||||
return state.toJson();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,35 +1,30 @@
|
||||
import 'package:paperless_api/paperless_api.dart';
|
||||
import 'package:paperless_mobile/core/repository/label_repository.dart';
|
||||
import 'package:paperless_mobile/core/repository/state/impl/storage_path_repository_state.dart';
|
||||
import 'package:rxdart/rxdart.dart' show BehaviorSubject;
|
||||
|
||||
class StoragePathRepositoryImpl implements LabelRepository<StoragePath> {
|
||||
class StoragePathRepositoryImpl
|
||||
extends LabelRepository<StoragePath, StoragePathRepositoryState> {
|
||||
final PaperlessLabelsApi _api;
|
||||
|
||||
final _subject = BehaviorSubject<Map<int, StoragePath>?>();
|
||||
|
||||
StoragePathRepositoryImpl(this._api);
|
||||
|
||||
@override
|
||||
Stream<Map<int, StoragePath>?> get values =>
|
||||
_subject.stream.asBroadcastStream();
|
||||
|
||||
Map<int, StoragePath> get _currentValueOrEmpty => _subject.valueOrNull ?? {};
|
||||
StoragePathRepositoryImpl(this._api)
|
||||
: super(const StoragePathRepositoryState());
|
||||
|
||||
@override
|
||||
Future<StoragePath> create(StoragePath storagePath) async {
|
||||
final created = await _api.saveStoragePath(storagePath);
|
||||
final updatedState = {..._currentValueOrEmpty}
|
||||
final updatedState = {...state.values}
|
||||
..putIfAbsent(created.id!, () => created);
|
||||
_subject.add(updatedState);
|
||||
emit(StoragePathRepositoryState(values: updatedState, hasLoaded: true));
|
||||
return created;
|
||||
}
|
||||
|
||||
@override
|
||||
Future<int> delete(StoragePath storagePath) async {
|
||||
await _api.deleteStoragePath(storagePath);
|
||||
final updatedState = {..._currentValueOrEmpty}
|
||||
final updatedState = {...state.values}
|
||||
..removeWhere((k, v) => k == storagePath.id);
|
||||
_subject.add(updatedState);
|
||||
emit(StoragePathRepositoryState(values: updatedState, hasLoaded: true));
|
||||
return storagePath.id!;
|
||||
}
|
||||
|
||||
@@ -37,8 +32,8 @@ class StoragePathRepositoryImpl implements LabelRepository<StoragePath> {
|
||||
Future<StoragePath?> find(int id) async {
|
||||
final storagePath = await _api.getStoragePath(id);
|
||||
if (storagePath != null) {
|
||||
final updatedState = {..._currentValueOrEmpty}..[id] = storagePath;
|
||||
_subject.add(updatedState);
|
||||
final updatedState = {...state.values}..[id] = storagePath;
|
||||
emit(StoragePathRepositoryState(values: updatedState, hasLoaded: true));
|
||||
return storagePath;
|
||||
}
|
||||
return null;
|
||||
@@ -47,29 +42,27 @@ class StoragePathRepositoryImpl implements LabelRepository<StoragePath> {
|
||||
@override
|
||||
Future<Iterable<StoragePath>> findAll([Iterable<int>? ids]) async {
|
||||
final storagePaths = await _api.getStoragePaths(ids);
|
||||
final updatedState = {..._currentValueOrEmpty}
|
||||
final updatedState = {...state.values}
|
||||
..addEntries(storagePaths.map((e) => MapEntry(e.id!, e)));
|
||||
_subject.add(updatedState);
|
||||
emit(StoragePathRepositoryState(values: updatedState, hasLoaded: true));
|
||||
return storagePaths;
|
||||
}
|
||||
|
||||
@override
|
||||
Future<StoragePath> update(StoragePath storagePath) async {
|
||||
final updated = await _api.updateStoragePath(storagePath);
|
||||
final updatedState = {..._currentValueOrEmpty}
|
||||
..update(updated.id!, (_) => updated);
|
||||
_subject.add(updatedState);
|
||||
final updatedState = {...state.values}..update(updated.id!, (_) => updated);
|
||||
emit(StoragePathRepositoryState(values: updatedState, hasLoaded: true));
|
||||
return updated;
|
||||
}
|
||||
|
||||
@override
|
||||
void clear() {
|
||||
_subject.add(const {});
|
||||
StoragePathRepositoryState fromJson(Map<String, dynamic> json) {
|
||||
return StoragePathRepositoryState.fromJson(json);
|
||||
}
|
||||
|
||||
@override
|
||||
Map<int, StoragePath>? get current => _subject.valueOrNull;
|
||||
|
||||
@override
|
||||
bool get isInitialized => _subject.valueOrNull != null;
|
||||
Map<String, dynamic> toJson(StoragePathRepositoryState state) {
|
||||
return state.toJson();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,34 +1,28 @@
|
||||
import 'package:paperless_api/paperless_api.dart';
|
||||
import 'package:paperless_mobile/core/repository/label_repository.dart';
|
||||
import 'package:rxdart/rxdart.dart' show BehaviorSubject;
|
||||
import 'package:paperless_mobile/core/repository/state/impl/correspondent_repository_state.dart';
|
||||
import 'package:paperless_mobile/core/repository/state/impl/tag_repository_state.dart';
|
||||
import 'package:paperless_mobile/core/repository/state/repository_state.dart';
|
||||
|
||||
class TagRepositoryImpl implements LabelRepository<Tag> {
|
||||
class TagRepositoryImpl extends LabelRepository<Tag, TagRepositoryState> {
|
||||
final PaperlessLabelsApi _api;
|
||||
|
||||
final _subject = BehaviorSubject<Map<int, Tag>?>();
|
||||
|
||||
TagRepositoryImpl(this._api);
|
||||
TagRepositoryImpl(this._api) : super(const TagRepositoryState());
|
||||
|
||||
@override
|
||||
Stream<Map<int, Tag>?> get values => _subject.stream.asBroadcastStream();
|
||||
|
||||
Map<int, Tag> get _currentValueOrEmpty => _subject.valueOrNull ?? {};
|
||||
|
||||
@override
|
||||
Future<Tag> create(Tag tag) async {
|
||||
final created = await _api.saveTag(tag);
|
||||
final updatedState = {..._currentValueOrEmpty}
|
||||
Future<Tag> create(Tag object) async {
|
||||
final created = await _api.saveTag(object);
|
||||
final updatedState = {...state.values}
|
||||
..putIfAbsent(created.id!, () => created);
|
||||
_subject.add(updatedState);
|
||||
emit(TagRepositoryState(values: updatedState, hasLoaded: true));
|
||||
return created;
|
||||
}
|
||||
|
||||
@override
|
||||
Future<int> delete(Tag tag) async {
|
||||
await _api.deleteTag(tag);
|
||||
final updatedState = {..._currentValueOrEmpty}
|
||||
..removeWhere((k, v) => k == tag.id);
|
||||
_subject.add(updatedState);
|
||||
final updatedState = {...state.values}..removeWhere((k, v) => k == tag.id);
|
||||
emit(TagRepositoryState(values: updatedState, hasLoaded: true));
|
||||
return tag.id!;
|
||||
}
|
||||
|
||||
@@ -36,8 +30,8 @@ class TagRepositoryImpl implements LabelRepository<Tag> {
|
||||
Future<Tag?> find(int id) async {
|
||||
final tag = await _api.getTag(id);
|
||||
if (tag != null) {
|
||||
final updatedState = {..._currentValueOrEmpty}..[id] = tag;
|
||||
_subject.add(updatedState);
|
||||
final updatedState = {...state.values}..[id] = tag;
|
||||
emit(TagRepositoryState(values: updatedState, hasLoaded: true));
|
||||
return tag;
|
||||
}
|
||||
return null;
|
||||
@@ -46,29 +40,27 @@ class TagRepositoryImpl implements LabelRepository<Tag> {
|
||||
@override
|
||||
Future<Iterable<Tag>> findAll([Iterable<int>? ids]) async {
|
||||
final tags = await _api.getTags(ids);
|
||||
final updatedState = {..._currentValueOrEmpty}
|
||||
final updatedState = {...state.values}
|
||||
..addEntries(tags.map((e) => MapEntry(e.id!, e)));
|
||||
_subject.add(updatedState);
|
||||
emit(TagRepositoryState(values: updatedState, hasLoaded: true));
|
||||
return tags;
|
||||
}
|
||||
|
||||
@override
|
||||
Future<Tag> update(Tag tag) async {
|
||||
final updated = await _api.updateTag(tag);
|
||||
final updatedState = {..._currentValueOrEmpty}
|
||||
..update(updated.id!, (_) => updated);
|
||||
_subject.add(updatedState);
|
||||
final updatedState = {...state.values}..update(updated.id!, (_) => updated);
|
||||
emit(TagRepositoryState(values: updatedState, hasLoaded: true));
|
||||
return updated;
|
||||
}
|
||||
|
||||
@override
|
||||
void clear() {
|
||||
_subject.add(null);
|
||||
TagRepositoryState? fromJson(Map<String, dynamic> json) {
|
||||
return TagRepositoryState.fromJson(json);
|
||||
}
|
||||
|
||||
@override
|
||||
Map<int, Tag>? get current => _subject.valueOrNull;
|
||||
|
||||
@override
|
||||
bool get isInitialized => _subject.valueOrNull != null;
|
||||
Map<String, dynamic>? toJson(TagRepositoryState state) {
|
||||
return state.toJson();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,8 @@
|
||||
import 'package:paperless_api/paperless_api.dart';
|
||||
import 'package:paperless_mobile/core/repository/base_repository.dart';
|
||||
import 'package:paperless_mobile/core/repository/state/repository_state.dart';
|
||||
|
||||
abstract class LabelRepository<T extends Label>
|
||||
implements BaseRepository<Map<int, T>, T> {}
|
||||
abstract class LabelRepository<T extends Label, State extends RepositoryState>
|
||||
extends BaseRepository<State, T> {
|
||||
LabelRepository(State initial) : super(initial);
|
||||
}
|
||||
|
||||
@@ -1,7 +1,12 @@
|
||||
import 'package:flutter/widgets.dart';
|
||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
import 'package:paperless_api/paperless_api.dart';
|
||||
import 'package:paperless_mobile/core/repository/impl/document_type_repository_impl.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/storage_path_repository_state.dart';
|
||||
import 'package:paperless_mobile/core/repository/state/impl/tag_repository_state.dart';
|
||||
|
||||
class LabelRepositoriesProvider extends StatelessWidget {
|
||||
final Widget child;
|
||||
@@ -12,16 +17,20 @@ class LabelRepositoriesProvider extends StatelessWidget {
|
||||
return MultiRepositoryProvider(
|
||||
providers: [
|
||||
RepositoryProvider(
|
||||
create: (context) => context.read<LabelRepository<Correspondent>>(),
|
||||
create: (context) => context.read<
|
||||
LabelRepository<Correspondent, CorrespondentRepositoryState>>(),
|
||||
),
|
||||
RepositoryProvider(
|
||||
create: (context) => context.read<LabelRepository<DocumentType>>(),
|
||||
create: (context) => context.read<
|
||||
LabelRepository<DocumentType, DocumentTypeRepositoryState>>(),
|
||||
),
|
||||
RepositoryProvider(
|
||||
create: (context) => context.read<LabelRepository<StoragePath>>(),
|
||||
create: (context) => context
|
||||
.read<LabelRepository<StoragePath, StoragePathRepositoryState>>(),
|
||||
),
|
||||
RepositoryProvider(
|
||||
create: (context) => context.read<LabelRepository<Tag>>(),
|
||||
create: (context) =>
|
||||
context.read<LabelRepository<Tag, TagRepositoryState>>(),
|
||||
),
|
||||
],
|
||||
child: child,
|
||||
|
||||
@@ -1,5 +1,8 @@
|
||||
import 'package:paperless_api/paperless_api.dart';
|
||||
import 'package:paperless_mobile/core/repository/base_repository.dart';
|
||||
import 'package:paperless_mobile/core/repository/state/impl/saved_view_repository_state.dart';
|
||||
|
||||
abstract class SavedViewRepository
|
||||
implements BaseRepository<Map<int, SavedView>, SavedView> {}
|
||||
extends BaseRepository<SavedViewRepositoryState, SavedView> {
|
||||
SavedViewRepository(super.initialState);
|
||||
}
|
||||
|
||||
@@ -0,0 +1,31 @@
|
||||
import 'package:flutter/foundation.dart';
|
||||
import 'package:json_annotation/json_annotation.dart';
|
||||
import 'package:paperless_api/paperless_api.dart';
|
||||
import 'package:paperless_mobile/core/repository/state/repository_state.dart';
|
||||
|
||||
part 'correspondent_repository_state.g.dart';
|
||||
|
||||
@JsonSerializable()
|
||||
class CorrespondentRepositoryState
|
||||
extends RepositoryState<Map<int, Correspondent>> {
|
||||
const CorrespondentRepositoryState({
|
||||
super.values = const {},
|
||||
super.hasLoaded,
|
||||
});
|
||||
|
||||
@override
|
||||
CorrespondentRepositoryState copyWith({
|
||||
Map<int, Correspondent>? values,
|
||||
bool? hasLoaded,
|
||||
}) {
|
||||
return CorrespondentRepositoryState(
|
||||
values: values ?? this.values,
|
||||
hasLoaded: hasLoaded ?? this.hasLoaded,
|
||||
);
|
||||
}
|
||||
|
||||
factory CorrespondentRepositoryState.fromJson(Map<String, dynamic> json) =>
|
||||
_$CorrespondentRepositoryStateFromJson(json);
|
||||
|
||||
Map<String, dynamic> toJson() => _$CorrespondentRepositoryStateToJson(this);
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
// GENERATED CODE - DO NOT MODIFY BY HAND
|
||||
|
||||
part of 'correspondent_repository_state.dart';
|
||||
|
||||
// **************************************************************************
|
||||
// JsonSerializableGenerator
|
||||
// **************************************************************************
|
||||
|
||||
CorrespondentRepositoryState _$CorrespondentRepositoryStateFromJson(
|
||||
Map<String, dynamic> json) =>
|
||||
CorrespondentRepositoryState(
|
||||
values: (json['values'] as Map<String, dynamic>?)?.map(
|
||||
(k, e) => MapEntry(int.parse(k),
|
||||
Correspondent.fromJson(e as Map<String, dynamic>)),
|
||||
) ??
|
||||
const {},
|
||||
hasLoaded: json['hasLoaded'] as bool? ?? false,
|
||||
);
|
||||
|
||||
Map<String, dynamic> _$CorrespondentRepositoryStateToJson(
|
||||
CorrespondentRepositoryState instance) =>
|
||||
<String, dynamic>{
|
||||
'values': instance.values.map((k, e) => MapEntry(k.toString(), e)),
|
||||
'hasLoaded': instance.hasLoaded,
|
||||
};
|
||||
@@ -0,0 +1,28 @@
|
||||
import 'package:paperless_api/paperless_api.dart';
|
||||
import 'package:paperless_mobile/core/repository/state/repository_state.dart';
|
||||
import 'package:json_annotation/json_annotation.dart';
|
||||
|
||||
part 'document_type_repository_state.g.dart';
|
||||
|
||||
@JsonSerializable()
|
||||
class DocumentTypeRepositoryState
|
||||
extends RepositoryState<Map<int, DocumentType>> {
|
||||
const DocumentTypeRepositoryState({
|
||||
super.values = const {},
|
||||
super.hasLoaded,
|
||||
});
|
||||
|
||||
@override
|
||||
DocumentTypeRepositoryState copyWith(
|
||||
{Map<int, DocumentType>? values, bool? hasLoaded}) {
|
||||
return DocumentTypeRepositoryState(
|
||||
values: values ?? this.values,
|
||||
hasLoaded: hasLoaded ?? this.hasLoaded,
|
||||
);
|
||||
}
|
||||
|
||||
factory DocumentTypeRepositoryState.fromJson(Map<String, dynamic> json) =>
|
||||
_$DocumentTypeRepositoryStateFromJson(json);
|
||||
|
||||
Map<String, dynamic> toJson() => _$DocumentTypeRepositoryStateToJson(this);
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
// GENERATED CODE - DO NOT MODIFY BY HAND
|
||||
|
||||
part of 'document_type_repository_state.dart';
|
||||
|
||||
// **************************************************************************
|
||||
// JsonSerializableGenerator
|
||||
// **************************************************************************
|
||||
|
||||
DocumentTypeRepositoryState _$DocumentTypeRepositoryStateFromJson(
|
||||
Map<String, dynamic> json) =>
|
||||
DocumentTypeRepositoryState(
|
||||
values: (json['values'] as Map<String, dynamic>?)?.map(
|
||||
(k, e) => MapEntry(
|
||||
int.parse(k), DocumentType.fromJson(e as Map<String, dynamic>)),
|
||||
) ??
|
||||
const {},
|
||||
hasLoaded: json['hasLoaded'] as bool? ?? false,
|
||||
);
|
||||
|
||||
Map<String, dynamic> _$DocumentTypeRepositoryStateToJson(
|
||||
DocumentTypeRepositoryState instance) =>
|
||||
<String, dynamic>{
|
||||
'values': instance.values.map((k, e) => MapEntry(k.toString(), e)),
|
||||
'hasLoaded': instance.hasLoaded,
|
||||
};
|
||||
@@ -0,0 +1,29 @@
|
||||
import 'package:paperless_api/paperless_api.dart';
|
||||
import 'package:paperless_mobile/core/repository/state/repository_state.dart';
|
||||
import 'package:json_annotation/json_annotation.dart';
|
||||
|
||||
part 'saved_view_repository_state.g.dart';
|
||||
|
||||
@JsonSerializable()
|
||||
class SavedViewRepositoryState extends RepositoryState<Map<int, SavedView>> {
|
||||
const SavedViewRepositoryState({
|
||||
super.values = const {},
|
||||
super.hasLoaded = false,
|
||||
});
|
||||
|
||||
@override
|
||||
SavedViewRepositoryState copyWith({
|
||||
Map<int, SavedView>? values,
|
||||
bool? hasLoaded,
|
||||
}) {
|
||||
return SavedViewRepositoryState(
|
||||
values: values ?? this.values,
|
||||
hasLoaded: hasLoaded ?? this.hasLoaded,
|
||||
);
|
||||
}
|
||||
|
||||
factory SavedViewRepositoryState.fromJson(Map<String, dynamic> json) =>
|
||||
_$SavedViewRepositoryStateFromJson(json);
|
||||
|
||||
Map<String, dynamic> toJson() => _$SavedViewRepositoryStateToJson(this);
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
// GENERATED CODE - DO NOT MODIFY BY HAND
|
||||
|
||||
part of 'saved_view_repository_state.dart';
|
||||
|
||||
// **************************************************************************
|
||||
// JsonSerializableGenerator
|
||||
// **************************************************************************
|
||||
|
||||
SavedViewRepositoryState _$SavedViewRepositoryStateFromJson(
|
||||
Map<String, dynamic> json) =>
|
||||
SavedViewRepositoryState(
|
||||
values: (json['values'] as Map<String, dynamic>?)?.map(
|
||||
(k, e) => MapEntry(
|
||||
int.parse(k), SavedView.fromJson(e as Map<String, dynamic>)),
|
||||
) ??
|
||||
const {},
|
||||
hasLoaded: json['hasLoaded'] as bool? ?? false,
|
||||
);
|
||||
|
||||
Map<String, dynamic> _$SavedViewRepositoryStateToJson(
|
||||
SavedViewRepositoryState instance) =>
|
||||
<String, dynamic>{
|
||||
'values': instance.values.map((k, e) => MapEntry(k.toString(), e)),
|
||||
'hasLoaded': instance.hasLoaded,
|
||||
};
|
||||
@@ -0,0 +1,28 @@
|
||||
import 'package:paperless_api/paperless_api.dart';
|
||||
import 'package:paperless_mobile/core/repository/state/repository_state.dart';
|
||||
import 'package:json_annotation/json_annotation.dart';
|
||||
|
||||
part 'storage_path_repository_state.g.dart';
|
||||
|
||||
@JsonSerializable()
|
||||
class StoragePathRepositoryState
|
||||
extends RepositoryState<Map<int, StoragePath>> {
|
||||
const StoragePathRepositoryState({
|
||||
super.values = const {},
|
||||
super.hasLoaded = false,
|
||||
});
|
||||
|
||||
@override
|
||||
StoragePathRepositoryState copyWith(
|
||||
{Map<int, StoragePath>? values, bool? hasLoaded}) {
|
||||
return StoragePathRepositoryState(
|
||||
values: values ?? this.values,
|
||||
hasLoaded: hasLoaded ?? this.hasLoaded,
|
||||
);
|
||||
}
|
||||
|
||||
factory StoragePathRepositoryState.fromJson(Map<String, dynamic> json) =>
|
||||
_$StoragePathRepositoryStateFromJson(json);
|
||||
|
||||
Map<String, dynamic> toJson() => _$StoragePathRepositoryStateToJson(this);
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
// GENERATED CODE - DO NOT MODIFY BY HAND
|
||||
|
||||
part of 'storage_path_repository_state.dart';
|
||||
|
||||
// **************************************************************************
|
||||
// JsonSerializableGenerator
|
||||
// **************************************************************************
|
||||
|
||||
StoragePathRepositoryState _$StoragePathRepositoryStateFromJson(
|
||||
Map<String, dynamic> json) =>
|
||||
StoragePathRepositoryState(
|
||||
values: (json['values'] as Map<String, dynamic>?)?.map(
|
||||
(k, e) => MapEntry(
|
||||
int.parse(k), StoragePath.fromJson(e as Map<String, dynamic>)),
|
||||
) ??
|
||||
const {},
|
||||
hasLoaded: json['hasLoaded'] as bool? ?? false,
|
||||
);
|
||||
|
||||
Map<String, dynamic> _$StoragePathRepositoryStateToJson(
|
||||
StoragePathRepositoryState instance) =>
|
||||
<String, dynamic>{
|
||||
'values': instance.values.map((k, e) => MapEntry(k.toString(), e)),
|
||||
'hasLoaded': instance.hasLoaded,
|
||||
};
|
||||
26
lib/core/repository/state/impl/tag_repository_state.dart
Normal file
26
lib/core/repository/state/impl/tag_repository_state.dart
Normal file
@@ -0,0 +1,26 @@
|
||||
import 'package:json_annotation/json_annotation.dart';
|
||||
import 'package:paperless_api/paperless_api.dart';
|
||||
import 'package:paperless_mobile/core/repository/state/repository_state.dart';
|
||||
|
||||
part 'tag_repository_state.g.dart';
|
||||
|
||||
@JsonSerializable()
|
||||
class TagRepositoryState extends RepositoryState<Map<int, Tag>> {
|
||||
const TagRepositoryState({
|
||||
super.values = const {},
|
||||
super.hasLoaded = false,
|
||||
});
|
||||
|
||||
@override
|
||||
TagRepositoryState copyWith({Map<int, Tag>? values, bool? hasLoaded}) {
|
||||
return TagRepositoryState(
|
||||
values: values ?? this.values,
|
||||
hasLoaded: hasLoaded ?? this.hasLoaded,
|
||||
);
|
||||
}
|
||||
|
||||
factory TagRepositoryState.fromJson(Map<String, dynamic> json) =>
|
||||
_$TagRepositoryStateFromJson(json);
|
||||
|
||||
Map<String, dynamic> toJson() => _$TagRepositoryStateToJson(this);
|
||||
}
|
||||
23
lib/core/repository/state/impl/tag_repository_state.g.dart
Normal file
23
lib/core/repository/state/impl/tag_repository_state.g.dart
Normal file
@@ -0,0 +1,23 @@
|
||||
// GENERATED CODE - DO NOT MODIFY BY HAND
|
||||
|
||||
part of 'tag_repository_state.dart';
|
||||
|
||||
// **************************************************************************
|
||||
// JsonSerializableGenerator
|
||||
// **************************************************************************
|
||||
|
||||
TagRepositoryState _$TagRepositoryStateFromJson(Map<String, dynamic> json) =>
|
||||
TagRepositoryState(
|
||||
values: (json['values'] as Map<String, dynamic>?)?.map(
|
||||
(k, e) =>
|
||||
MapEntry(int.parse(k), Tag.fromJson(e as Map<String, dynamic>)),
|
||||
) ??
|
||||
const {},
|
||||
hasLoaded: json['hasLoaded'] as bool? ?? false,
|
||||
);
|
||||
|
||||
Map<String, dynamic> _$TagRepositoryStateToJson(TagRepositoryState instance) =>
|
||||
<String, dynamic>{
|
||||
'values': instance.values.map((k, e) => MapEntry(k.toString(), e)),
|
||||
'hasLoaded': instance.hasLoaded,
|
||||
};
|
||||
16
lib/core/repository/state/repository_state.dart
Normal file
16
lib/core/repository/state/repository_state.dart
Normal file
@@ -0,0 +1,16 @@
|
||||
abstract class RepositoryState<T> {
|
||||
final T values;
|
||||
final bool hasLoaded;
|
||||
|
||||
const RepositoryState({
|
||||
required this.values,
|
||||
this.hasLoaded = false,
|
||||
});
|
||||
|
||||
RepositoryState.loaded(this.values) : hasLoaded = true;
|
||||
|
||||
RepositoryState<T> copyWith({
|
||||
T? values,
|
||||
bool? hasLoaded,
|
||||
});
|
||||
}
|
||||
Reference in New Issue
Block a user