diff --git a/frontend/lib/features/admin/presentation/create_user_screen.dart b/frontend/lib/features/admin/presentation/create_user_screen.dart index 35891870..da5337ea 100644 --- a/frontend/lib/features/admin/presentation/create_user_screen.dart +++ b/frontend/lib/features/admin/presentation/create_user_screen.dart @@ -67,7 +67,7 @@ class _CreateUserScreenState extends State { // If cancelled or empty if (inputPassword == null || inputPassword.isEmpty) { - if (mounted) context.go('/dashboard'); // Kick out + if (mounted) context.go('/'); // Kick out return; } @@ -88,7 +88,7 @@ class _CreateUserScreenState extends State { ScaffoldMessenger.of(context).showSnackBar( const SnackBar(content: Text('Invalid Password. Access Denied.'), backgroundColor: Colors.red), ); - context.go('/dashboard'); // Kick out + context.go('/'); // Kick out } } } @@ -152,7 +152,7 @@ class _CreateUserScreenState extends State { title: const Text('Create User'), leading: IconButton( icon: const Icon(Icons.arrow_back), - onPressed: () => context.go('/dashboard'), + onPressed: () => context.go('/'), ), ), body: Center( diff --git a/frontend/lib/features/admin/presentation/user_management_screen.dart b/frontend/lib/features/admin/presentation/user_management_screen.dart index 07e8ed4b..f779e779 100644 --- a/frontend/lib/features/admin/presentation/user_management_screen.dart +++ b/frontend/lib/features/admin/presentation/user_management_screen.dart @@ -78,7 +78,7 @@ class _UserManagementScreenState extends State with Single ); if (inputPassword == null || inputPassword.isEmpty) { - if (mounted) context.go('/dashboard'); + if (mounted) context.go('/'); return; } @@ -97,7 +97,7 @@ class _UserManagementScreenState extends State with Single } else { if (mounted) { ScaffoldMessenger.of(context).showSnackBar(const SnackBar(content: Text('Invalid Password'), backgroundColor: Colors.red)); - context.go('/dashboard'); + context.go('/'); } } } @@ -277,7 +277,7 @@ class _UserManagementScreenState extends State with Single title: const Text('User Management'), leading: IconButton( icon: const Icon(Icons.arrow_back), - onPressed: () => context.go('/dashboard'), + onPressed: () => context.go('/'), ), bottom: TabBar( controller: _tabController, diff --git a/frontend/lib/features/auth/presentation/approve_qr_screen.dart b/frontend/lib/features/auth/presentation/approve_qr_screen.dart index c60a31be..2b4d2d5a 100644 --- a/frontend/lib/features/auth/presentation/approve_qr_screen.dart +++ b/frontend/lib/features/auth/presentation/approve_qr_screen.dart @@ -22,7 +22,7 @@ class _ApproveQrScreenState extends State { final session = Descope.sessionManager.session; if (session == null || session.refreshToken.isExpired) { setState(() => _message = "Please log in on your phone first."); - context.go('/'); // Redirect to login + context.go('/login'); // Redirect to login return; } @@ -43,7 +43,7 @@ class _ApproveQrScreenState extends State { // Automatically go to dashboard after a short delay Future.delayed(const Duration(seconds: 1), () { - if (mounted) context.go('/dashboard'); + if (mounted) context.go('/'); }); } catch (e) { setState(() => _message = "Error: $e"); @@ -103,14 +103,14 @@ class _ApproveQrScreenState extends State { Padding( padding: const EdgeInsets.only(top: 16), child: TextButton( - onPressed: () => context.go('/'), + onPressed: () => context.go('/login'), child: const Text("Login on this device first"), ), ), if (_success) FilledButton( - onPressed: () => context.go('/dashboard'), + onPressed: () => context.go('/'), child: const Text("Go to My Dashboard"), ), ], diff --git a/frontend/lib/features/auth/presentation/login_screen.dart b/frontend/lib/features/auth/presentation/login_screen.dart index bd805a65..8914dc6e 100644 --- a/frontend/lib/features/auth/presentation/login_screen.dart +++ b/frontend/lib/features/auth/presentation/login_screen.dart @@ -409,7 +409,7 @@ class _LoginScreenState extends ConsumerState // We call notify() to update the router's state, and go() to ensure navigation. AuthNotifier.instance.notify(); if (mounted) { - context.go('/dashboard'); + context.go('/'); } } diff --git a/frontend/lib/features/auth/presentation/login_success_screen.dart b/frontend/lib/features/auth/presentation/login_success_screen.dart index 7ca7293a..a3b97896 100644 --- a/frontend/lib/features/auth/presentation/login_success_screen.dart +++ b/frontend/lib/features/auth/presentation/login_success_screen.dart @@ -34,7 +34,7 @@ class LoginSuccessScreen extends StatelessWidget { // 이 버튼이 QR 카메라를 켜는 버튼입니다. FilledButton.icon( onPressed: () { - context.push('/qr-scan'); + context.push('/scan'); }, icon: const Icon(Icons.camera_alt, size: 28), label: const Text("QR 인증 (카메라 켜기)"), @@ -50,7 +50,7 @@ class LoginSuccessScreen extends StatelessWidget { const SizedBox(height: 24), TextButton( onPressed: () { - context.go('/dashboard'); + context.go('/'); }, child: const Text("나중에 하기 (대시보드로 이동)", style: TextStyle(color: Colors.grey)), ), diff --git a/frontend/lib/features/dashboard/presentation/dashboard_screen.dart b/frontend/lib/features/dashboard/presentation/dashboard_screen.dart index 12de5b48..fe6c56ff 100644 --- a/frontend/lib/features/dashboard/presentation/dashboard_screen.dart +++ b/frontend/lib/features/dashboard/presentation/dashboard_screen.dart @@ -25,7 +25,7 @@ class DashboardScreen extends StatelessWidget { return Scaffold( backgroundColor: Colors.grey[50], appBar: AppBar( - title: Text('Baron Launcher', style: GoogleFonts.outfit(fontWeight: FontWeight.bold)), + title: Text('Baron SSO', style: GoogleFonts.outfit(fontWeight: FontWeight.bold)), elevation: 0, backgroundColor: Colors.white, foregroundColor: Colors.black, diff --git a/frontend/lib/main.dart b/frontend/lib/main.dart index f235ba21..735acff6 100644 --- a/frontend/lib/main.dart +++ b/frontend/lib/main.dart @@ -69,9 +69,16 @@ final _router = GoRouter( refreshListenable: AuthNotifier.instance, routes: [ GoRoute( - path: '/', + path: '/', builder: (context, state) { - _routerLogger.info("Navigating to root (LoginScreen)"); + _routerLogger.info("Navigating to root (DashboardScreen)"); + return const DashboardScreen(); + }, + ), + GoRoute( + path: '/login', + builder: (context, state) { + _routerLogger.info("Navigating to /login"); return const LoginScreen(); } ), @@ -91,13 +98,6 @@ final _router = GoRouter( return ApproveQrScreen(pendingRef: ref); }, ), - GoRoute( - path: '/dashboard', - builder: (context, state) { - _routerLogger.info("Navigating to /dashboard"); - return const DashboardScreen(); - }, - ), GoRoute( path: '/scan', builder: (context, state) { @@ -117,17 +117,24 @@ final _router = GoRouter( final isLoggedIn = Descope.sessionManager.session?.refreshToken.isExpired == false; final path = state.uri.path; - final isLoggingIn = path == '/' || path.startsWith('/verify/') || path.startsWith('/admin/') || path == '/approve'; + + // Public paths that don't require login + final isPublicPath = path == '/login' || + path.startsWith('/verify/') || + path == '/approve'; _routerLogger.fine("Redirect check - Path: $path, IsLoggedIn: $isLoggedIn"); - if (!isLoggedIn && !isLoggingIn) { - _routerLogger.info("Not logged in, redirecting to /"); - return '/'; + // If not logged in and trying to access a protected page, redirect to /login + if (!isLoggedIn && !isPublicPath) { + _routerLogger.info("Not logged in, redirecting to /login"); + return '/login'; } - if (isLoggedIn && path == '/') { - _routerLogger.info("Logged in, redirecting to /dashboard"); - return '/dashboard'; + + // If logged in and trying to access login page, redirect to root (dashboard) + if (isLoggedIn && (path == '/login' || path.startsWith('/verify/'))) { + _routerLogger.info("Logged in, redirecting to /"); + return '/'; } return null;