@@ -18,6 +18,8 @@ import '../util/logger.dart';
1818import '../util/partners_servers.dart' ;
1919import '../services/partners_servers_service.dart' ;
2020import '../l10n/app_localizations.dart' ;
21+ import '../services/user_service.dart' ;
22+ import '../models/user_model.dart' ;
2123import 'landing_screen.dart' ;
2224import 'home_screen.dart' ;
2325import 'skins_screen.dart' ;
@@ -26,6 +28,7 @@ import 'partner_servers_screen.dart';
2628import 'player_lookup_screen.dart' ;
2729import 'manage_servers_screen.dart' ;
2830import 'profile_screen.dart' ;
31+ import 'chat_screen.dart' ;
2932
3033enum _ActiveSheet { none, help, howTo, more, info }
3134
@@ -64,6 +67,7 @@ class _AppShellState extends State<AppShell>
6467 final GlobalKey <ManageServersScreenState > _manageServersKey = GlobalKey ();
6568 final GlobalKey <HomeScreenState > _connectorKey = GlobalKey ();
6669 final GlobalKey <SkinsScreenState > _skinsKey = GlobalKey ();
70+ final GlobalKey <ProfileScreenState > _profileKey = GlobalKey ();
6771
6872 late RelayPingResult _selectedRelay;
6973 int _pageIndex = _pageHome;
@@ -153,15 +157,42 @@ class _AppShellState extends State<AppShell>
153157 final type = message.notificationType as String ? ?? 'unknown' ;
154158 switch (type) {
155159 case 'message' :
156- _goTo (_pageProfile);
160+ final username = message.senderUsername as String ? ;
161+ _goToProfileTab (3 );
162+ if (username != null ) unawaited (_openChatFromNotification (username));
163+ case 'friend_request' :
164+ _goToProfileTab (2 );
157165 case 'friend_online' :
158166 case 'friend_session' :
159- _goTo (_pageProfile );
167+ _goToProfileTab ( 1 );
160168 default :
161169 _goTo (_pageHome);
162170 }
163171 }
164172
173+ void _goToProfileTab (int tab) {
174+ _goTo (_pageProfile);
175+ WidgetsBinding .instance.addPostFrameCallback ((_) {
176+ _profileKey.currentState? .switchToTab (tab);
177+ });
178+ }
179+
180+ Future <void > _openChatFromNotification (String username) async {
181+ final user = await UserService .getProfile (username);
182+ if (! mounted || user == null ) return ;
183+ final friend = FriendModel (
184+ firebaseUid: '' ,
185+ username: user.username,
186+ displayName: user.displayName,
187+ avatarUrl: user.avatarUrl,
188+ online: false ,
189+ );
190+ if (! mounted) return ;
191+ Navigator .of (context).push (
192+ MaterialPageRoute (builder: (_) => ChatScreen (friend: friend)),
193+ );
194+ }
195+
165196 void _goTo (int page) {
166197 _closeSheetInstant ();
167198 if (page == _pageConnector) {
@@ -380,6 +411,7 @@ class _AppShellState extends State<AppShell>
380411 SkinsScreen (key: _skinsKey),
381412 const WikiScreen (),
382413 ProfileScreen (
414+ key: _profileKey,
383415 onGoToHome: () => _goTo (_pageHome),
384416 onGoToConnector: () => _goTo (_pageConnector),
385417 onGoToSkins: () => _goTo (_pageSkins),
0 commit comments