mirror of
				https://github.com/immich-app/immich.git
				synced 2025-11-02 18:47:07 -05:00 
			
		
		
		
	* Fixed issue with app logging off after closing * Change version to reflect minor change
This commit is contained in:
		
							parent
							
								
									73024edba9
								
							
						
					
					
						commit
						18c22d2a6c
					
				@ -19,7 +19,7 @@ platform :ios do
 | 
				
			|||||||
  desc "iOS Beta"
 | 
					  desc "iOS Beta"
 | 
				
			||||||
  lane :beta do
 | 
					  lane :beta do
 | 
				
			||||||
    increment_version_number(
 | 
					    increment_version_number(
 | 
				
			||||||
      version_number: "1.13.0"
 | 
					      version_number: "1.12.1"
 | 
				
			||||||
    )
 | 
					    )
 | 
				
			||||||
    increment_build_number(
 | 
					    increment_build_number(
 | 
				
			||||||
      build_number: latest_testflight_build_number + 1,
 | 
					      build_number: latest_testflight_build_number + 1,
 | 
				
			||||||
 | 
				
			|||||||
@ -2,18 +2,17 @@
 | 
				
			|||||||
const String userInfoBox = "immichBoxUserInfo"; // Box
 | 
					const String userInfoBox = "immichBoxUserInfo"; // Box
 | 
				
			||||||
const String accessTokenKey = "immichBoxAccessTokenKey"; // Key 1
 | 
					const String accessTokenKey = "immichBoxAccessTokenKey"; // Key 1
 | 
				
			||||||
const String deviceIdKey = 'immichBoxDeviceIdKey'; // Key 2
 | 
					const String deviceIdKey = 'immichBoxDeviceIdKey'; // Key 2
 | 
				
			||||||
 | 
					const String isLoggedInKey = 'immichIsLoggedInKey'; // Key 3
 | 
				
			||||||
// Server endpoint
 | 
					const String serverEndpointKey = 'immichBoxServerEndpoint'; // Key 4
 | 
				
			||||||
const String serverEndpointKey = 'immichBoxServerEndpoint';
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Login Info
 | 
					// Login Info
 | 
				
			||||||
const String hiveLoginInfoBox = "immichLoginInfoBox";
 | 
					const String hiveLoginInfoBox = "immichLoginInfoBox"; // Box
 | 
				
			||||||
const String savedLoginInfoKey = "immichSavedLoginInfoKey";
 | 
					const String savedLoginInfoKey = "immichSavedLoginInfoKey"; // Key 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Backup Info
 | 
					// Backup Info
 | 
				
			||||||
const String hiveBackupInfoBox = "immichBackupAlbumInfoBox";
 | 
					const String hiveBackupInfoBox = "immichBackupAlbumInfoBox"; // Box
 | 
				
			||||||
const String backupInfoKey = "immichBackupAlbumInfoKey";
 | 
					const String backupInfoKey = "immichBackupAlbumInfoKey"; // Key 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Github Release Info
 | 
					// Github Release Info
 | 
				
			||||||
const String hiveGithubReleaseInfoBox = "immichGithubReleaseInfoBox";
 | 
					const String hiveGithubReleaseInfoBox = "immichGithubReleaseInfoBox"; // Box
 | 
				
			||||||
const String githubReleaseInfoKey = "immichGithubReleaseInfoKey";
 | 
					const String githubReleaseInfoKey = "immichGithubReleaseInfoKey"; // Key 1
 | 
				
			||||||
 | 
				
			|||||||
@ -6,6 +6,7 @@ import 'package:hooks_riverpod/hooks_riverpod.dart';
 | 
				
			|||||||
import 'package:image_picker/image_picker.dart';
 | 
					import 'package:image_picker/image_picker.dart';
 | 
				
			||||||
import 'package:immich_mobile/constants/hive_box.dart';
 | 
					import 'package:immich_mobile/constants/hive_box.dart';
 | 
				
			||||||
import 'package:immich_mobile/modules/home/providers/upload_profile_image.provider.dart';
 | 
					import 'package:immich_mobile/modules/home/providers/upload_profile_image.provider.dart';
 | 
				
			||||||
 | 
					import 'package:immich_mobile/routing/router.dart';
 | 
				
			||||||
import 'package:immich_mobile/shared/providers/asset.provider.dart';
 | 
					import 'package:immich_mobile/shared/providers/asset.provider.dart';
 | 
				
			||||||
import 'package:immich_mobile/modules/login/models/authentication_state.model.dart';
 | 
					import 'package:immich_mobile/modules/login/models/authentication_state.model.dart';
 | 
				
			||||||
import 'package:immich_mobile/modules/login/providers/authentication.provider.dart';
 | 
					import 'package:immich_mobile/modules/login/providers/authentication.provider.dart';
 | 
				
			||||||
@ -185,7 +186,8 @@ class ProfileDrawer extends HookConsumerWidget {
 | 
				
			|||||||
                    ref.watch(backupProvider.notifier).cancelBackup();
 | 
					                    ref.watch(backupProvider.notifier).cancelBackup();
 | 
				
			||||||
                    ref.watch(assetProvider.notifier).clearAllAsset();
 | 
					                    ref.watch(assetProvider.notifier).clearAllAsset();
 | 
				
			||||||
                    ref.watch(websocketProvider.notifier).disconnect();
 | 
					                    ref.watch(websocketProvider.notifier).disconnect();
 | 
				
			||||||
                    AutoRouter.of(context).popUntilRoot();
 | 
					                    // AutoRouter.of(context).popUntilRoot();
 | 
				
			||||||
 | 
					                    AutoRouter.of(context).replace(const LoginRoute());
 | 
				
			||||||
                  }
 | 
					                  }
 | 
				
			||||||
                },
 | 
					                },
 | 
				
			||||||
              )
 | 
					              )
 | 
				
			||||||
 | 
				
			|||||||
@ -67,7 +67,7 @@ class LoginForm extends HookConsumerWidget {
 | 
				
			|||||||
                shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(5)),
 | 
					                shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(5)),
 | 
				
			||||||
                enableFeedback: true,
 | 
					                enableFeedback: true,
 | 
				
			||||||
                title: const Text(
 | 
					                title: const Text(
 | 
				
			||||||
                  "Save login",
 | 
					                  "Stay logged in",
 | 
				
			||||||
                  style: TextStyle(fontSize: 16, fontWeight: FontWeight.bold, color: Colors.grey),
 | 
					                  style: TextStyle(fontSize: 16, fontWeight: FontWeight.bold, color: Colors.grey),
 | 
				
			||||||
                ),
 | 
					                ),
 | 
				
			||||||
                value: isSaveLoginInfo.value,
 | 
					                value: isSaveLoginInfo.value,
 | 
				
			||||||
 | 
				
			|||||||
@ -18,6 +18,7 @@ import 'package:immich_mobile/routing/auth_guard.dart';
 | 
				
			|||||||
import 'package:immich_mobile/shared/models/immich_asset.model.dart';
 | 
					import 'package:immich_mobile/shared/models/immich_asset.model.dart';
 | 
				
			||||||
import 'package:immich_mobile/modules/backup/views/backup_controller_page.dart';
 | 
					import 'package:immich_mobile/modules/backup/views/backup_controller_page.dart';
 | 
				
			||||||
import 'package:immich_mobile/modules/asset_viewer/views/image_viewer_page.dart';
 | 
					import 'package:immich_mobile/modules/asset_viewer/views/image_viewer_page.dart';
 | 
				
			||||||
 | 
					import 'package:immich_mobile/shared/views/splash_screen.dart';
 | 
				
			||||||
import 'package:immich_mobile/shared/views/tab_controller_page.dart';
 | 
					import 'package:immich_mobile/shared/views/tab_controller_page.dart';
 | 
				
			||||||
import 'package:immich_mobile/modules/asset_viewer/views/video_viewer_page.dart';
 | 
					import 'package:immich_mobile/modules/asset_viewer/views/video_viewer_page.dart';
 | 
				
			||||||
import 'package:photo_manager/photo_manager.dart';
 | 
					import 'package:photo_manager/photo_manager.dart';
 | 
				
			||||||
@ -27,8 +28,9 @@ part 'router.gr.dart';
 | 
				
			|||||||
@MaterialAutoRouter(
 | 
					@MaterialAutoRouter(
 | 
				
			||||||
  replaceInRouteName: 'Page,Route',
 | 
					  replaceInRouteName: 'Page,Route',
 | 
				
			||||||
  routes: <AutoRoute>[
 | 
					  routes: <AutoRoute>[
 | 
				
			||||||
    AutoRoute(page: LoginPage, initial: true),
 | 
					    AutoRoute(page: SplashScreenPage, initial: true),
 | 
				
			||||||
    AutoRoute(
 | 
					    AutoRoute(page: LoginPage),
 | 
				
			||||||
 | 
					    CustomRoute(
 | 
				
			||||||
      page: TabControllerPage,
 | 
					      page: TabControllerPage,
 | 
				
			||||||
      guards: [AuthGuard],
 | 
					      guards: [AuthGuard],
 | 
				
			||||||
      children: [
 | 
					      children: [
 | 
				
			||||||
@ -36,6 +38,7 @@ part 'router.gr.dart';
 | 
				
			|||||||
        AutoRoute(page: SearchPage, guards: [AuthGuard]),
 | 
					        AutoRoute(page: SearchPage, guards: [AuthGuard]),
 | 
				
			||||||
        AutoRoute(page: SharingPage, guards: [AuthGuard])
 | 
					        AutoRoute(page: SharingPage, guards: [AuthGuard])
 | 
				
			||||||
      ],
 | 
					      ],
 | 
				
			||||||
 | 
					      transitionsBuilder: TransitionsBuilders.fadeIn,
 | 
				
			||||||
    ),
 | 
					    ),
 | 
				
			||||||
    AutoRoute(page: ImageViewerPage, guards: [AuthGuard]),
 | 
					    AutoRoute(page: ImageViewerPage, guards: [AuthGuard]),
 | 
				
			||||||
    AutoRoute(page: VideoViewerPage, guards: [AuthGuard]),
 | 
					    AutoRoute(page: VideoViewerPage, guards: [AuthGuard]),
 | 
				
			||||||
 | 
				
			|||||||
@ -21,13 +21,21 @@ class _$AppRouter extends RootStackRouter {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  @override
 | 
					  @override
 | 
				
			||||||
  final Map<String, PageFactory> pagesMap = {
 | 
					  final Map<String, PageFactory> pagesMap = {
 | 
				
			||||||
 | 
					    SplashScreenRoute.name: (routeData) {
 | 
				
			||||||
 | 
					      return MaterialPageX<dynamic>(
 | 
				
			||||||
 | 
					          routeData: routeData, child: const SplashScreenPage());
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    LoginRoute.name: (routeData) {
 | 
					    LoginRoute.name: (routeData) {
 | 
				
			||||||
      return MaterialPageX<dynamic>(
 | 
					      return MaterialPageX<dynamic>(
 | 
				
			||||||
          routeData: routeData, child: const LoginPage());
 | 
					          routeData: routeData, child: const LoginPage());
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    TabControllerRoute.name: (routeData) {
 | 
					    TabControllerRoute.name: (routeData) {
 | 
				
			||||||
      return MaterialPageX<dynamic>(
 | 
					      return CustomPage<dynamic>(
 | 
				
			||||||
          routeData: routeData, child: const TabControllerPage());
 | 
					          routeData: routeData,
 | 
				
			||||||
 | 
					          child: const TabControllerPage(),
 | 
				
			||||||
 | 
					          transitionsBuilder: TransitionsBuilders.fadeIn,
 | 
				
			||||||
 | 
					          opaque: true,
 | 
				
			||||||
 | 
					          barrierDismissible: false);
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    ImageViewerRoute.name: (routeData) {
 | 
					    ImageViewerRoute.name: (routeData) {
 | 
				
			||||||
      final args = routeData.argsAs<ImageViewerRouteArgs>();
 | 
					      final args = routeData.argsAs<ImageViewerRouteArgs>();
 | 
				
			||||||
@ -121,7 +129,8 @@ class _$AppRouter extends RootStackRouter {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  @override
 | 
					  @override
 | 
				
			||||||
  List<RouteConfig> get routes => [
 | 
					  List<RouteConfig> get routes => [
 | 
				
			||||||
        RouteConfig(LoginRoute.name, path: '/'),
 | 
					        RouteConfig(SplashScreenRoute.name, path: '/'),
 | 
				
			||||||
 | 
					        RouteConfig(LoginRoute.name, path: '/login-page'),
 | 
				
			||||||
        RouteConfig(TabControllerRoute.name,
 | 
					        RouteConfig(TabControllerRoute.name,
 | 
				
			||||||
            path: '/tab-controller-page',
 | 
					            path: '/tab-controller-page',
 | 
				
			||||||
            guards: [
 | 
					            guards: [
 | 
				
			||||||
@ -167,10 +176,18 @@ class _$AppRouter extends RootStackRouter {
 | 
				
			|||||||
      ];
 | 
					      ];
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/// generated route for
 | 
				
			||||||
 | 
					/// [SplashScreenPage]
 | 
				
			||||||
 | 
					class SplashScreenRoute extends PageRouteInfo<void> {
 | 
				
			||||||
 | 
					  const SplashScreenRoute() : super(SplashScreenRoute.name, path: '/');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  static const String name = 'SplashScreenRoute';
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/// generated route for
 | 
					/// generated route for
 | 
				
			||||||
/// [LoginPage]
 | 
					/// [LoginPage]
 | 
				
			||||||
class LoginRoute extends PageRouteInfo<void> {
 | 
					class LoginRoute extends PageRouteInfo<void> {
 | 
				
			||||||
  const LoginRoute() : super(LoginRoute.name, path: '/');
 | 
					  const LoginRoute() : super(LoginRoute.name, path: '/login-page');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  static const String name = 'LoginRoute';
 | 
					  static const String name = 'LoginRoute';
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -128,7 +128,7 @@ class NetworkService {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
      String validUrl = Uri.parse('$savedEndpoint/server-info/ping').toString();
 | 
					      String validUrl = Uri.parse('$savedEndpoint/server-info/ping').toString();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      debugPrint("pint server at url $validUrl");
 | 
					      debugPrint("ping server at url $validUrl");
 | 
				
			||||||
      Response res = await dio.get(validUrl);
 | 
					      Response res = await dio.get(validUrl);
 | 
				
			||||||
      var jsonRespsonse = jsonDecode(res.toString());
 | 
					      var jsonRespsonse = jsonDecode(res.toString());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										72
									
								
								mobile/lib/shared/views/splash_screen.dart
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										72
									
								
								mobile/lib/shared/views/splash_screen.dart
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,72 @@
 | 
				
			|||||||
 | 
					import 'package:auto_route/auto_route.dart';
 | 
				
			||||||
 | 
					import 'package:flutter/material.dart';
 | 
				
			||||||
 | 
					import 'package:flutter_hooks/flutter_hooks.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/constants/immich_colors.dart';
 | 
				
			||||||
 | 
					import 'package:immich_mobile/modules/backup/providers/backup.provider.dart';
 | 
				
			||||||
 | 
					import 'package:immich_mobile/modules/login/models/hive_saved_login_info.model.dart';
 | 
				
			||||||
 | 
					import 'package:immich_mobile/modules/login/providers/authentication.provider.dart';
 | 
				
			||||||
 | 
					import 'package:immich_mobile/routing/router.dart';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class SplashScreenPage extends HookConsumerWidget {
 | 
				
			||||||
 | 
					  const SplashScreenPage({Key? key}) : super(key: key);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  @override
 | 
				
			||||||
 | 
					  Widget build(BuildContext context, WidgetRef ref) {
 | 
				
			||||||
 | 
					    HiveSavedLoginInfo? loginInfo = Hive.box<HiveSavedLoginInfo>(hiveLoginInfoBox).get(savedLoginInfoKey);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    void performLoggingIn() async {
 | 
				
			||||||
 | 
					      var isAuthenticated = await ref
 | 
				
			||||||
 | 
					          .read(authenticationProvider.notifier)
 | 
				
			||||||
 | 
					          .login(loginInfo!.email, loginInfo.password, loginInfo.serverUrl, true);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      if (isAuthenticated) {
 | 
				
			||||||
 | 
					        // Resume backup (if enable) then navigate
 | 
				
			||||||
 | 
					        ref.watch(backupProvider.notifier).resumeBackup();
 | 
				
			||||||
 | 
					        AutoRouter.of(context).pushNamed("/tab-controller-page");
 | 
				
			||||||
 | 
					      } else {
 | 
				
			||||||
 | 
					        AutoRouter.of(context).push(const LoginRoute());
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    useEffect(() {
 | 
				
			||||||
 | 
					      if (loginInfo != null && loginInfo.isSaveLogin) {
 | 
				
			||||||
 | 
					        performLoggingIn();
 | 
				
			||||||
 | 
					      } else {
 | 
				
			||||||
 | 
					        AutoRouter.of(context).push(const LoginRoute());
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      return null;
 | 
				
			||||||
 | 
					    }, []);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return Scaffold(
 | 
				
			||||||
 | 
					      backgroundColor: immichBackgroundColor,
 | 
				
			||||||
 | 
					      body: Center(
 | 
				
			||||||
 | 
					        child: Column(
 | 
				
			||||||
 | 
					          mainAxisAlignment: MainAxisAlignment.center,
 | 
				
			||||||
 | 
					          crossAxisAlignment: CrossAxisAlignment.center,
 | 
				
			||||||
 | 
					          children: [
 | 
				
			||||||
 | 
					            const Image(
 | 
				
			||||||
 | 
					              image: AssetImage('assets/immich-logo-no-outline.png'),
 | 
				
			||||||
 | 
					              width: 200,
 | 
				
			||||||
 | 
					              filterQuality: FilterQuality.high,
 | 
				
			||||||
 | 
					            ),
 | 
				
			||||||
 | 
					            Padding(
 | 
				
			||||||
 | 
					              padding: const EdgeInsets.all(16.0),
 | 
				
			||||||
 | 
					              child: Text(
 | 
				
			||||||
 | 
					                'IMMICH',
 | 
				
			||||||
 | 
					                style: TextStyle(
 | 
				
			||||||
 | 
					                  fontFamily: 'SnowburstOne',
 | 
				
			||||||
 | 
					                  fontWeight: FontWeight.bold,
 | 
				
			||||||
 | 
					                  fontSize: 48,
 | 
				
			||||||
 | 
					                  color: Theme.of(context).primaryColor,
 | 
				
			||||||
 | 
					                ),
 | 
				
			||||||
 | 
					              ),
 | 
				
			||||||
 | 
					            ),
 | 
				
			||||||
 | 
					          ],
 | 
				
			||||||
 | 
					        ),
 | 
				
			||||||
 | 
					      ),
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@ -2,7 +2,7 @@ name: immich_mobile
 | 
				
			|||||||
description: Immich - selfhosted backup media file on mobile phone
 | 
					description: Immich - selfhosted backup media file on mobile phone
 | 
				
			||||||
 | 
					
 | 
				
			||||||
publish_to: "none"
 | 
					publish_to: "none"
 | 
				
			||||||
version: 1.13.0+19
 | 
					version: 1.12.1+19
 | 
				
			||||||
 | 
					
 | 
				
			||||||
environment:
 | 
					environment:
 | 
				
			||||||
  sdk: ">=2.15.1 <3.0.0"
 | 
					  sdk: ">=2.15.1 <3.0.0"
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user