diff --git a/lib/core/widgets/app_shell.dart b/lib/core/widgets/app_shell.dart index c5845ef..edf42e7 100644 --- a/lib/core/widgets/app_shell.dart +++ b/lib/core/widgets/app_shell.dart @@ -21,14 +21,57 @@ class _AppShellState extends State { super.initState(); // Wire push notification taps to GoRouter navigation PushNotificationService().onNotificationTap = (actionUrl) { - if (mounted && actionUrl != null && actionUrl.isNotEmpty) { - context.go(actionUrl); - } else if (mounted) { + if (!mounted) return; + if (actionUrl == null || actionUrl.isEmpty) { context.go('/notifications'); + return; } + // Translate web routes to mobile routes + final mobileRoute = _translateRoute(actionUrl); + context.go(mobileRoute); }; } + /// Translate web-style actionUrl to mobile route. + String _translateRoute(String url) { + final uri = Uri.parse(url); + final path = uri.path; + + // Message notification: /user/message?conversationId=xxx or /agent/message?conversationId=xxx + if (path.contains('/message')) { + final convId = uri.queryParameters['conversationId']; + if (convId != null && convId.isNotEmpty) { + return '/messages/chat/$convId'; + } + return '/messages'; + } + + // Connection request/network + if (path.contains('/network')) { + // Agent sees network, user sees agent search + if (path.startsWith('/agent')) { + return '/agent/network'; + } + return '/agents/search'; + } + + // Profile routes + if (path.contains('/profiles') || path.contains('/profile')) { + return '/home'; + } + + // If it's already a valid mobile route, use as-is + if (path.startsWith('/messages') || + path.startsWith('/home') || + path.startsWith('/notifications') || + path.startsWith('/agents')) { + return path; + } + + // Fallback + return '/notifications'; + } + @override Widget build(BuildContext context) { return Scaffold( diff --git a/lib/features/agents/presentation/screens/agent_network_screen.dart b/lib/features/agents/presentation/screens/agent_network_screen.dart index 38253c6..b130262 100644 --- a/lib/features/agents/presentation/screens/agent_network_screen.dart +++ b/lib/features/agents/presentation/screens/agent_network_screen.dart @@ -151,14 +151,27 @@ class AgentNetworkScreen extends ConsumerWidget { width: 0.5), borderRadius: BorderRadius.circular(7), ), - child: const Text( - 'Manage My Network', - style: TextStyle( - fontFamily: 'Fractul', - fontSize: 14, - fontWeight: FontWeight.w600, - color: AppColors.primaryDark, - ), + child: Row( + children: [ + GestureDetector( + onTap: () => context.go('/home'), + child: const Icon( + Icons.arrow_back_ios_new_rounded, + size: 18, + color: AppColors.primaryDark, + ), + ), + const SizedBox(width: 12), + const Text( + 'Manage My Network', + style: TextStyle( + fontFamily: 'Fractul', + fontSize: 14, + fontWeight: FontWeight.w600, + color: AppColors.primaryDark, + ), + ), + ], ), ); } diff --git a/lib/routing/app_router.dart b/lib/routing/app_router.dart index 9971988..b8e33c8 100644 --- a/lib/routing/app_router.dart +++ b/lib/routing/app_router.dart @@ -276,8 +276,14 @@ Widget _fadeTransition( Widget child, ) { return FadeTransition( - opacity: CurveTween(curve: Curves.easeInOut).animate(animation), - child: child, + opacity: CurveTween(curve: Curves.easeOut).animate(animation), + child: SlideTransition( + position: Tween( + begin: const Offset(0.02, 0), + end: Offset.zero, + ).animate(CurvedAnimation(parent: animation, curve: Curves.easeOut)), + child: child, + ), ); }