diff --git a/Applications/AdminUi/apps/admin_ui/lib/main.dart b/Applications/AdminUi/apps/admin_ui/lib/main.dart index 8038b9287e..a54722982c 100644 --- a/Applications/AdminUi/apps/admin_ui/lib/main.dart +++ b/Applications/AdminUi/apps/admin_ui/lib/main.dart @@ -1,3 +1,4 @@ +import 'package:admin_api_sdk/admin_api_sdk.dart'; import 'package:data_table_2/data_table_2.dart'; import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; @@ -35,16 +36,17 @@ final _router = GoRouter( GoRoute( parentNavigatorKey: _rootNavigatorKey, path: '/splash', - builder: (context, state) => const SplashScreen(), + builder: (context, state) => SplashScreen(redirect: state.uri.queryParameters['redirect']), ), GoRoute( parentNavigatorKey: _rootNavigatorKey, path: '/login', - builder: (context, state) => const LoginScreen(), + builder: (context, state) => LoginScreen(redirect: state.uri.queryParameters['redirect']), ), ShellRoute( navigatorKey: _shellNavigatorKey, parentNavigatorKey: _rootNavigatorKey, + redirect: (context, state) => GetIt.I.isRegistered() ? null : '/splash?redirect=${Uri.encodeComponent(state.matchedLocation)}', routes: [ GoRoute( parentNavigatorKey: _shellNavigatorKey, @@ -102,10 +104,7 @@ final _router = GoRouter( ], ), ], - builder: (context, state, child) => HomeScreen( - location: state.fullPath!, - child: child, - ), + builder: (context, state, child) => HomeScreen(location: state.fullPath!, child: child), ), ], ); diff --git a/Applications/AdminUi/apps/admin_ui/lib/screens/login_screen.dart b/Applications/AdminUi/apps/admin_ui/lib/screens/login_screen.dart index 356461d66f..181400e98a 100644 --- a/Applications/AdminUi/apps/admin_ui/lib/screens/login_screen.dart +++ b/Applications/AdminUi/apps/admin_ui/lib/screens/login_screen.dart @@ -7,7 +7,9 @@ import 'package:shared_preferences/shared_preferences.dart'; import '/core/core.dart'; class LoginScreen extends StatefulWidget { - const LoginScreen({super.key}); + final String? redirect; + + const LoginScreen({required this.redirect, super.key}); @override State createState() => _LoginScreenState(); @@ -106,6 +108,6 @@ class _LoginScreenState extends State { await GetIt.I.unregisterIfRegistered(); GetIt.I.registerSingleton(await AdminApiClient.create(baseUrl: baseUrl, apiKey: apiKey)); - if (mounted) context.go('/identities'); + if (mounted) context.go(widget.redirect != null ? Uri.decodeComponent(widget.redirect!) : '/identities'); } } diff --git a/Applications/AdminUi/apps/admin_ui/lib/screens/splash_screen.dart b/Applications/AdminUi/apps/admin_ui/lib/screens/splash_screen.dart index 90566fdb08..0f7a70c5a7 100644 --- a/Applications/AdminUi/apps/admin_ui/lib/screens/splash_screen.dart +++ b/Applications/AdminUi/apps/admin_ui/lib/screens/splash_screen.dart @@ -9,7 +9,9 @@ import 'package:shared_preferences/shared_preferences.dart'; import '/core/core.dart'; class SplashScreen extends StatefulWidget { - const SplashScreen({super.key}); + final String? redirect; + + const SplashScreen({required this.redirect, super.key}); @override State createState() => _SplashScreenState(); @@ -20,7 +22,7 @@ class _SplashScreenState extends State { void initState() { super.initState(); - route(); + _route(); } @override @@ -39,28 +41,27 @@ class _SplashScreenState extends State { ); } - Future route() async { + Future _route() async { await GetIt.I.allReady(); final sp = await SharedPreferences.getInstance(); - if (!sp.containsKey('api_key')) { - if (mounted) context.go('/login'); - - return; - } + if (!sp.containsKey('api_key')) return _navigate('/login'); final apiKey = sp.getString('api_key')!; const baseUrl = kIsWeb ? '' : String.fromEnvironment('base_url'); final isValid = await AdminApiClient.validateApiKey(baseUrl: baseUrl, apiKey: apiKey); - if (!isValid) { - await sp.remove('api_key'); - if (mounted) context.go('/login'); - - return; - } + if (!isValid) return _navigate('/login'); GetIt.I.registerSingleton(await AdminApiClient.create(baseUrl: baseUrl, apiKey: apiKey)); - if (mounted) context.go('/identities'); + return _navigate('/identities'); + } + + void _navigate(String defaultRoute) { + if (!mounted) return; + + if (widget.redirect != null) return context.go(Uri.decodeComponent(widget.redirect!)); + + context.go(defaultRoute); } } diff --git a/Applications/AdminUi/apps/admin_ui/macos/Runner/AppDelegate.swift b/Applications/AdminUi/apps/admin_ui/macos/Runner/AppDelegate.swift index d53ef64377..8e02df2888 100644 --- a/Applications/AdminUi/apps/admin_ui/macos/Runner/AppDelegate.swift +++ b/Applications/AdminUi/apps/admin_ui/macos/Runner/AppDelegate.swift @@ -1,7 +1,7 @@ import Cocoa import FlutterMacOS -@NSApplicationMain +@main class AppDelegate: FlutterAppDelegate { override func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool { return true diff --git a/Applications/AdminUi/apps/admin_ui/pubspec.lock b/Applications/AdminUi/apps/admin_ui/pubspec.lock index c61047b077..20e9a2f7fd 100644 --- a/Applications/AdminUi/apps/admin_ui/pubspec.lock +++ b/Applications/AdminUi/apps/admin_ui/pubspec.lock @@ -540,10 +540,10 @@ packages: dependency: transitive description: name: vm_service - sha256: f652077d0bdf60abe4c1f6377448e8655008eef28f128bc023f7b5e8dfeb48fc + sha256: "5c5f338a667b4c644744b661f309fb8080bb94b18a7e91ef1dbd343bed00ed6d" url: "https://pub.dev" source: hosted - version: "14.2.4" + version: "14.2.5" watch_it: dependency: "direct main" description: