feat: extract snippets into widgets, code cleanup document details

This commit is contained in:
Anton Stubenbord
2023-02-11 16:37:51 +01:00
parent 45684010d6
commit a10c6efb00
29 changed files with 460 additions and 412 deletions
@@ -1,17 +1,15 @@
import 'dart:developer';
import 'package:collection/collection.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:paperless_api/paperless_api.dart';
import 'package:paperless_mobile/core/notifier/document_changed_notifier.dart';
import 'model/paged_documents_state.dart';
import 'paged_documents_state.dart';
///
/// Mixin which can be used on cubits that handle documents.
/// This implements all paging and filtering logic.
///
mixin PagedDocumentsMixin<State extends PagedDocumentsState>
mixin DocumentPagingBlocMixin<State extends DocumentPagingState>
on BlocBase<State> {
PaperlessDocumentsApi get api;
DocumentChangedNotifier get notifier;
@@ -5,13 +5,13 @@ import 'package:paperless_api/paperless_api.dart';
/// Base state for all blocs/cubits using a paged view of documents.
/// [T] is the return type of the API call.
///
abstract class PagedDocumentsState extends Equatable {
abstract class DocumentPagingState extends Equatable {
final bool hasLoaded;
final bool isLoading;
final List<PagedSearchResult<DocumentModel>> value;
final DocumentFilter filter;
const PagedDocumentsState({
const DocumentPagingState({
this.value = const [],
this.hasLoaded = false,
this.isLoading = false,
@@ -0,0 +1,43 @@
import 'package:flutter/widgets.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:paperless_api/paperless_api.dart';
import 'package:paperless_mobile/features/paged_document_view/cubit/document_paging_bloc_mixin.dart';
import 'package:paperless_mobile/helpers/message_helpers.dart';
import 'package:paperless_mobile/features/inbox/cubit/inbox_cubit.dart';
mixin DocumentPagingViewMixin<T extends StatefulWidget> on State<T> {
ScrollController get pagingScrollController;
@override
void initState() {
super.initState();
pagingScrollController.addListener(shouldLoadMoreDocumentsListener);
}
@override
void dispose() {
pagingScrollController.removeListener(shouldLoadMoreDocumentsListener);
super.dispose();
}
DocumentPagingBlocMixin get _bloc => context.read<DocumentPagingBlocMixin>();
void shouldLoadMoreDocumentsListener() async {
if (shouldLoadMoreDocuments) {
try {
await _bloc.loadMore();
} on PaperlessServerException catch (error, stackTrace) {
showErrorMessage(context, error, stackTrace);
}
}
}
bool get shouldLoadMoreDocuments {
final currState = _bloc.state;
return pagingScrollController.position.maxScrollExtent != 0 &&
!currState.isLoading &&
!currState.isLastPageLoaded &&
pagingScrollController.offset >=
pagingScrollController.position.maxScrollExtent * 0.75;
}
}