Selaa lähdekoodia

Implemented auto backup (#11)

Alex 3 vuotta sitten
vanhempi
commit
919928ab70

+ 3 - 1
mobile/lib/main.dart

@@ -4,6 +4,7 @@ import 'package:hive_flutter/hive_flutter.dart';
 import 'package:hooks_riverpod/hooks_riverpod.dart';
 import 'package:immich_mobile/routing/router.dart';
 import 'package:immich_mobile/shared/providers/app_state.provider.dart';
+import 'package:immich_mobile/shared/providers/backup.provider.dart';
 import 'constants/hive_box.dart';
 import 'package:google_fonts/google_fonts.dart';
 
@@ -36,6 +37,7 @@ class _ImmichAppState extends ConsumerState<ImmichApp> with WidgetsBindingObserv
       case AppLifecycleState.resumed:
         debugPrint("[APP STATE] resumed");
         ref.read(appStateProvider.notifier).state = AppStateEnum.resumed;
+        ref.read(backupProvider.notifier).resumeBackup();
         break;
       case AppLifecycleState.inactive:
         debugPrint("[APP STATE] inactive");
@@ -53,7 +55,7 @@ class _ImmichAppState extends ConsumerState<ImmichApp> with WidgetsBindingObserv
   }
 
   Future<void> initApp() async {
-    // WidgetsBinding.instance?.addObserver(this);
+    WidgetsBinding.instance?.addObserver(this);
   }
 
   @override

+ 1 - 2
mobile/lib/modules/home/ui/profile_drawer.dart

@@ -56,10 +56,9 @@ class ProfileDrawer extends ConsumerWidget {
             onTap: () async {
               bool res = await ref.read(authenticationProvider.notifier).logout();
 
-              ref.read(assetProvider.notifier).clearAllAsset();
-
               if (res) {
                 AutoRouter.of(context).popUntilRoot();
+                ref.read(assetProvider.notifier).clearAllAsset();
               }
             },
           )

+ 3 - 2
mobile/lib/modules/login/providers/authentication.provider.dart

@@ -11,7 +11,7 @@ import 'package:immich_mobile/shared/services/network.service.dart';
 import 'package:immich_mobile/shared/models/device_info.model.dart';
 
 class AuthenticationNotifier extends StateNotifier<AuthenticationState> {
-  AuthenticationNotifier()
+  AuthenticationNotifier(this.ref)
       : super(
           AuthenticationState(
             deviceId: "",
@@ -31,6 +31,7 @@ class AuthenticationNotifier extends StateNotifier<AuthenticationState> {
           ),
         );
 
+  final Ref ref;
   final DeviceInfoService _deviceInfoService = DeviceInfoService();
   final BackupService _backupService = BackupService();
   final NetworkService _networkService = NetworkService();
@@ -126,5 +127,5 @@ class AuthenticationNotifier extends StateNotifier<AuthenticationState> {
 }
 
 final authenticationProvider = StateNotifierProvider<AuthenticationNotifier, AuthenticationState>((ref) {
-  return AuthenticationNotifier();
+  return AuthenticationNotifier(ref);
 });

+ 7 - 0
mobile/lib/modules/login/ui/login_form.dart

@@ -3,7 +3,9 @@ import 'package:flutter/material.dart';
 import 'package:flutter_hooks/flutter_hooks.dart';
 import 'package:google_fonts/google_fonts.dart';
 import 'package:hooks_riverpod/hooks_riverpod.dart';
+import 'package:immich_mobile/modules/home/providers/asset.provider.dart';
 import 'package:immich_mobile/modules/login/providers/authentication.provider.dart';
+import 'package:immich_mobile/shared/providers/backup.provider.dart';
 import 'package:immich_mobile/shared/ui/immich_toast.dart';
 
 class LoginForm extends HookConsumerWidget {
@@ -110,11 +112,16 @@ class LoginButton extends ConsumerWidget {
   Widget build(BuildContext context, WidgetRef ref) {
     return ElevatedButton(
         onPressed: () async {
+          // This will remove current cache asset state of previous user login.
+          ref.watch(assetProvider.notifier).clearAllAsset();
+
           var isAuthenicated = await ref
               .read(authenticationProvider.notifier)
               .login(emailController.text, passwordController.text, serverEndpointController.text);
 
           if (isAuthenicated) {
+            // Resume backup (if enable) then navigate
+            ref.watch(backupProvider.notifier).resumeBackup();
             AutoRouter.of(context).pushNamed("/home-page");
           } else {
             ImmichToast.show(

+ 37 - 3
mobile/lib/shared/providers/backup.provider.dart

@@ -1,6 +1,9 @@
 import 'package:dio/dio.dart';
 import 'package:flutter/foundation.dart';
+import 'package:hive_flutter/hive_flutter.dart';
 import 'package:hooks_riverpod/hooks_riverpod.dart';
+import 'package:immich_mobile/constants/hive_box.dart';
+import 'package:immich_mobile/modules/login/providers/authentication.provider.dart';
 import 'package:immich_mobile/shared/services/server_info.service.dart';
 import 'package:immich_mobile/shared/models/backup_state.model.dart';
 import 'package:immich_mobile/shared/models/server_info.model.dart';
@@ -8,7 +11,7 @@ import 'package:immich_mobile/shared/services/backup.service.dart';
 import 'package:photo_manager/photo_manager.dart';
 
 class BackupNotifier extends StateNotifier<BackUpState> {
-  BackupNotifier()
+  BackupNotifier(this.ref)
       : super(
           BackUpState(
             backupProgress: BackUpProgressEnum.idle,
@@ -29,6 +32,7 @@ class BackupNotifier extends StateNotifier<BackUpState> {
           ),
         );
 
+  final Ref ref;
   final BackupService _backupService = BackupService();
   final ServerInfoService _serverInfoService = ServerInfoService();
 
@@ -96,7 +100,7 @@ class BackupNotifier extends StateNotifier<BackUpState> {
 
   void cancelBackup() {
     state.cancelToken.cancel('Cancel Backup');
-    state = state.copyWith(backupProgress: BackUpProgressEnum.idle);
+    state = state.copyWith(backupProgress: BackUpProgressEnum.idle, progressInPercentage: 0.0);
   }
 
   void _onAssetUploaded() {
@@ -130,8 +134,38 @@ class BackupNotifier extends StateNotifier<BackUpState> {
       ),
     );
   }
+
+  void resumeBackup() {
+    debugPrint("[resumeBackup]");
+    var authState = ref.read(authenticationProvider);
+
+    // Check if user is login
+    var accessKey = Hive.box(userInfoBox).get(accessTokenKey);
+
+    // User has been logged out return
+    if (accessKey == null || !authState.isAuthenticated) {
+      debugPrint("[resumeBackup] not authenticated - abort");
+      return;
+    }
+
+    // Check if this device is enable backup by the user
+    if ((authState.deviceInfo.deviceId == authState.deviceId) && authState.deviceInfo.isAutoBackup) {
+      // check if backup is alreayd in process - then return
+      if (state.backupProgress == BackUpProgressEnum.inProgress) {
+        debugPrint("[resumeBackup] Backup is already in progress - abort");
+        return;
+      }
+
+      // Run backup
+      debugPrint("[resumeBackup] Start back up");
+      startBackupProcess();
+    }
+
+    debugPrint("[resumeBackup] User disables auto backup");
+    return;
+  }
 }
 
 final backupProvider = StateNotifierProvider<BackupNotifier, BackUpState>((ref) {
-  return BackupNotifier();
+  return BackupNotifier(ref);
 });

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 10629 - 1
server/package-lock.json


+ 1 - 1
server/src/app.module.ts

@@ -44,6 +44,6 @@ import { ServerInfoModule } from './api-v1/server-info/server-info.module';
 })
 export class AppModule implements NestModule {
   configure(consumer: MiddlewareConsumer): void {
-    consumer.apply(AppLoggerMiddleware).forRoutes('*');
+    // consumer.apply(AppLoggerMiddleware).forRoutes('*');
   }
 }

Kaikkia tiedostoja ei voida näyttää, sillä liian monta tiedostoa muuttui tässä diffissä