feat(notifications): added push notifications navigation handling and fixed ws notification parsing

This commit is contained in:
misha
2026-03-04 09:05:00 +03:00
parent 58d99424a0
commit 08eeea6ba4
18 changed files with 424 additions and 239 deletions

View File

@@ -21,12 +21,7 @@ class ContentRoutes {
final commentId = int.tryParse(commentIdStr ?? '');
if (slug != null) {
return AboutPlanScreen(
slug: slug,
navigateToComments: commentId != null,
index: null,
highlightedCommentId: commentId,
);
return AboutPlanScreen(slug: slug, navigateToComments: commentId != null, index: null, highlightedCommentId: commentId);
}
final data = state.extra as Map<String, dynamic>;
@@ -47,12 +42,7 @@ class ContentRoutes {
final commentId = int.tryParse(commentIdStr ?? '');
if (slug != null) {
return AboutRecipeScreen(
recipeSlug: slug,
navigateToComments: commentId != null,
index: null,
highlightedCommentId: commentId,
);
return AboutRecipeScreen(recipeSlug: slug, navigateToComments: commentId != null, index: null, highlightedCommentId: commentId);
}
final data = state.extra as Map<String, dynamic>;
@@ -69,26 +59,28 @@ class ContentRoutes {
name: 'aboutDietScreen',
builder: (context, state) {
final slug = state.uri.queryParameters['slug'];
final idStr = state.uri.queryParameters['id'];
final id = int.tryParse(idStr ?? '');
final commentIdStr = state.uri.queryParameters['commentId'];
final commentId = int.tryParse(commentIdStr ?? '');
if (slug != null) {
return AboutDietScreen(id: null, slug: slug, index: null, navigateToComments: commentId != null, highlightedCommentId: commentId);
}
if (id != null && id > 0) {
return AboutDietScreen(id: id, slug: null, index: null, navigateToComments: commentId != null, highlightedCommentId: commentId);
}
final data = state.extra as Map<String, dynamic>?;
if (data != null) {
return AboutDietScreen(
id: null,
slug: slug,
index: null,
navigateToComments: commentId != null,
highlightedCommentId: commentId,
id: data['id'] as int?,
slug: data['slug'] as String?,
index: data['index'] as int?,
navigateToComments: data['navigateToComments'] as bool? ?? (data['commentId'] != null),
highlightedCommentId: data['commentId'] as int?,
);
}
final data = state.extra as Map<String, dynamic>;
return AboutDietScreen(
id: data['id'] as int?,
slug: data['slug'] as String?,
index: data['index'] as int?,
navigateToComments: data['navigateToComments'] as bool? ?? (data['commentId'] != null),
highlightedCommentId: data['commentId'] as int?,
);
return const AboutDietScreen(id: null, slug: null, index: null, navigateToComments: false, highlightedCommentId: null);
},
),
GoRoute(
@@ -106,10 +98,7 @@ class ContentRoutes {
final parsedId = int.tryParse(id ?? '');
if (parsedId != null) {
return BlogPostScreen(
id: parsedId,
highlightedCommentId: commentId,
);
return BlogPostScreen(id: parsedId, highlightedCommentId: commentId);
}
if (state.extra is int) {
@@ -117,10 +106,7 @@ class ContentRoutes {
}
final data = state.extra as Map<String, dynamic>;
return BlogPostScreen(
id: data['id'] as int,
highlightedCommentId: data['commentId'] as int?,
);
return BlogPostScreen(id: data['id'] as int, highlightedCommentId: data['commentId'] as int?);
},
),
];

View File

@@ -33,7 +33,10 @@ class MainNavigationRoutes {
});
}
return _MainShellWithNavScope(child: child);
return _MainShellWithNavScope(
child: child,
currentLocation: state.matchedLocation,
);
},
routes: [
GoRoute(
@@ -102,9 +105,13 @@ class MainNavigationRoutes {
/// Wraps the shell with [BottomNavScope] so descendants (e.g. notifications)
/// can switch tabs via [BottomNavController.switchToRoute] instead of pushing.
class _MainShellWithNavScope extends StatefulWidget {
const _MainShellWithNavScope({required this.child});
const _MainShellWithNavScope({
required this.child,
required this.currentLocation,
});
final Widget child;
final String currentLocation;
@override
State<_MainShellWithNavScope> createState() => _MainShellWithNavScopeState();
@@ -117,7 +124,10 @@ class _MainShellWithNavScopeState extends State<_MainShellWithNavScope> {
Widget build(BuildContext context) {
return BottomNavScope(
controller: _navController,
child: BottomNavigationBarWidget(child: widget.child),
child: BottomNavigationBarWidget(
child: widget.child,
currentLocation: widget.currentLocation,
),
);
}
}