diff --git a/b0esche_cloud/lib/main.dart b/b0esche_cloud/lib/main.dart index 54e821c..3b9ad72 100644 --- a/b0esche_cloud/lib/main.dart +++ b/b0esche_cloud/lib/main.dart @@ -12,6 +12,8 @@ import 'pages/file_explorer.dart'; import 'pages/document_viewer.dart'; import 'pages/editor_page.dart'; import 'pages/join_page.dart'; +import 'pages/login_page.dart'; +import 'blocs/session/session_state.dart'; import 'pages/public_file_viewer.dart'; import 'theme/app_theme.dart'; import 'injection.dart'; @@ -22,6 +24,7 @@ final GoRouter _router = GoRouter( initialLocation: kIsWeb ? Uri.base.path : '/', routes: [ GoRoute(path: '/', builder: (context, state) => const HomePage()), + GoRoute(path: '/login', builder: (context, state) => const LoginPage()), GoRoute( path: '/viewer/:orgId/:fileId', builder: (context, state) => DocumentViewer( @@ -122,6 +125,19 @@ class _MainAppState extends State { return MaterialApp.router( routerConfig: _router, theme: AppTheme.darkTheme, + builder: (context, child) { + return BlocListener( + listener: (context, state) { + if (state is SessionExpiredState) { + final currentLocation = GoRouterState.of( + context, + ).uri.toString(); + context.go('/login?redirect=$currentLocation'); + } + }, + child: child!, + ); + }, ); }, ), diff --git a/b0esche_cloud/lib/pages/login_form.dart b/b0esche_cloud/lib/pages/login_form.dart index fce6d93..d0a0bbe 100644 --- a/b0esche_cloud/lib/pages/login_form.dart +++ b/b0esche_cloud/lib/pages/login_form.dart @@ -133,7 +133,10 @@ class _LoginFormState extends State { _handleRegistration(context, state); } else if (state is AuthAuthenticated) { context.read().add(SessionStarted(state.token)); - context.go('/'); + final redirect = GoRouterState.of( + context, + ).uri.queryParameters['redirect']; + context.go(redirect ?? '/'); } }, child: Center( diff --git a/b0esche_cloud/lib/pages/login_page.dart b/b0esche_cloud/lib/pages/login_page.dart new file mode 100644 index 0000000..b80fe6f --- /dev/null +++ b/b0esche_cloud/lib/pages/login_page.dart @@ -0,0 +1,27 @@ +import 'package:flutter/material.dart'; +import './login_form.dart'; + +class LoginPage extends StatelessWidget { + const LoginPage({super.key}); + + @override + Widget build(BuildContext context) { + return Scaffold( + body: Container( + decoration: const BoxDecoration( + gradient: LinearGradient( + begin: Alignment.topLeft, + end: Alignment.bottomRight, + colors: [Color(0xFF1a1a2e), Color(0xFF16213e), Color(0xFF0f3460)], + ), + ), + child: const Center( + child: SingleChildScrollView( + padding: EdgeInsets.all(16), + child: LoginForm(), + ), + ), + ), + ); + } +}