feat: bugfixes, finished go_router migration, implemented better visibility of states

This commit is contained in:
Anton Stubenbord
2023-10-06 01:17:08 +02:00
parent ad23df4f89
commit a2c5ced3b7
102 changed files with 1512 additions and 3090 deletions

View File

@@ -1,9 +1,8 @@
import 'package:flutter/material.dart';
import 'package:paperless_mobile/core/database/tables/local_user_account.dart';
import 'package:paperless_mobile/extensions/flutter_extensions.dart';
import 'package:paperless_mobile/features/sharing/cubit/receive_share_cubit.dart';
import 'package:paperless_mobile/features/sharing/view/widgets/file_thumbnail.dart';
import 'package:paperless_mobile/features/sharing/view/widgets/upload_queue_shell.dart';
import 'package:paperless_mobile/features/sharing/view/widgets/event_listener_shell.dart';
import 'package:paperless_mobile/generated/l10n/app_localizations.dart';
import 'package:path/path.dart' as p;
import 'package:provider/provider.dart';

View File

@@ -3,19 +3,22 @@ import 'dart:io';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_animate/flutter_animate.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:fluttertoast/fluttertoast.dart';
import 'package:hive/hive.dart';
import 'package:paperless_api/paperless_api.dart';
import 'package:paperless_mobile/core/bloc/connectivity_cubit.dart';
import 'package:paperless_mobile/core/config/hive/hive_config.dart';
import 'package:paperless_mobile/core/config/hive/hive_extensions.dart';
import 'package:paperless_mobile/core/database/tables/local_user_account.dart';
import 'package:paperless_mobile/core/notifier/document_changed_notifier.dart';
import 'package:paperless_mobile/core/service/connectivity_status_service.dart';
import 'package:paperless_mobile/features/document_upload/view/document_upload_preparation_page.dart';
import 'package:paperless_mobile/features/inbox/cubit/inbox_cubit.dart';
import 'package:paperless_mobile/features/notifications/services/local_notification_service.dart';
import 'package:paperless_mobile/features/sharing/cubit/receive_share_cubit.dart';
import 'package:paperless_mobile/features/sharing/view/dialog/discard_shared_file_dialog.dart';
import 'package:paperless_mobile/features/sharing/view/dialog/pending_files_info_dialog.dart';
import 'package:paperless_mobile/features/tasks/model/pending_tasks_notifier.dart';
import 'package:paperless_mobile/generated/l10n/app_localizations.dart';
import 'package:paperless_mobile/helpers/message_helpers.dart';
@@ -23,25 +26,33 @@ import 'package:paperless_mobile/routes/typed/branches/scanner_route.dart';
import 'package:path/path.dart' as p;
import 'package:receive_sharing_intent/receive_sharing_intent.dart';
class UploadQueueShell extends StatefulWidget {
class EventListenerShell extends StatefulWidget {
final Widget child;
const UploadQueueShell({super.key, required this.child});
const EventListenerShell({super.key, required this.child});
@override
State<UploadQueueShell> createState() => _UploadQueueShellState();
State<EventListenerShell> createState() => _EventListenerShellState();
}
class _UploadQueueShellState extends State<UploadQueueShell> {
class _EventListenerShellState extends State<EventListenerShell>
with WidgetsBindingObserver {
StreamSubscription? _subscription;
StreamSubscription? _documentDeletedSubscription;
Timer? _inboxTimer;
@override
void initState() {
super.initState();
WidgetsBinding.instance.addObserver(this);
ReceiveSharingIntent.getInitialMedia().then(_onReceiveSharedFiles);
_subscription =
ReceiveSharingIntent.getMediaStream().listen(_onReceiveSharedFiles);
context.read<PendingTasksNotifier>().addListener(_onTasksChanged);
_documentDeletedSubscription =
context.read<DocumentChangedNotifier>().$deleted.listen((event) {
showSnackBar(context, S.of(context)!.documentSuccessfullyDeleted);
});
_listenToInboxChanges();
// WidgetsBinding.instance.addPostFrameCallback((_) async {
// final notifier = context.read<ConsumptionChangeNotifier>();
// await notifier.isInitialized;
@@ -67,6 +78,52 @@ class _UploadQueueShellState extends State<UploadQueueShell> {
// });
}
void _listenToInboxChanges() {
final cubit = context.read<InboxCubit>();
final currentUser = context.read<LocalUserAccount>();
if (!currentUser.paperlessUser.canViewInbox || _inboxTimer != null) {
return;
}
cubit.refreshItemsInInboxCount(false);
_inboxTimer = Timer.periodic(30.seconds, (_) {
cubit.refreshItemsInInboxCount(false);
});
}
@override
void dispose() {
WidgetsBinding.instance.removeObserver(this);
_subscription?.cancel();
_documentDeletedSubscription?.cancel();
_inboxTimer?.cancel();
super.dispose();
}
@override
void didChangeAppLifecycleState(AppLifecycleState state) {
switch (state) {
case AppLifecycleState.resumed:
debugPrint(
"App resumed, reloading connectivity and "
"restarting periodic query for inbox changes...",
);
context.read<ConnectivityCubit>().reload();
_listenToInboxChanges();
break;
case AppLifecycleState.inactive:
case AppLifecycleState.paused:
case AppLifecycleState.detached:
default:
_inboxTimer?.cancel();
_inboxTimer = null;
debugPrint(
"App either paused or hidden, stopping "
"periodic query for inbox changes.",
);
break;
}
}
void _onTasksChanged() {
final taskNotifier = context.read<PendingTasksNotifier>();
final userId = context.read<LocalUserAccount>().id;
@@ -96,12 +153,6 @@ class _UploadQueueShellState extends State<UploadQueueShell> {
}
}
@override
void dispose() {
_subscription?.cancel();
super.dispose();
}
@override
Widget build(BuildContext context) {
return widget.child;
@@ -167,9 +218,9 @@ Future<void> consumeLocalFile(
);
await consumptionNotifier.discardFile(file, userId: userId);
if (result.taskId != null) {
taskNotifier.listenToTaskChanges(result.taskId!);
}
// if (result.taskId != null) {
// taskNotifier.listenToTaskChanges(result.taskId!);
// }
if (exitAppAfterConsumed) {
SystemNavigator.pop();
}