···263263 generatorViews.addAll(chunkViews);
264264 continue;
265265 } catch (_) {
266266- // Fall back to per-feed hydration for this chunk so one bad URI (or
267267- // oversized/invalid batch response) does not suppress all remaining
268268- // metadata.
266266+ log.d(
267267+ 'FeedPreferencesCubit: Batch hydration failed for ${chunk.length} generators, falling back to individual fetches for $_accountDid',
268268+ );
269269 }
270270271271 for (final feedUri in chunk) {
+3-2
lib/features/feed/cubit/post_action_cubit.dart
···1919 this.isDeleted = false,
2020 this.error,
2121 });
2222- // Sentinel used by copyWith to distinguish "keep existing value"
2323- // from an explicit null assignment for nullable fields.
2222+2323+ /// Sentinel used by copyWith to distinguish "keep existing value" from
2424+ /// an explicit null assignment for nullable fields.
2425 static const Object _unset = Object();
25262627 final String postUri;
···11import 'dart:async';
22import 'dart:convert';
33-import 'package:lazurite/core/theme/theme_extensions.dart';
4354import 'package:bluesky/app_bsky_feed_defs.dart';
65import 'package:bluesky/app_bsky_feed_post.dart';
···1211import 'package:intl/intl.dart';
1312import 'package:lazurite/core/network/app_view_provider.dart';
1413import 'package:lazurite/core/network/app_view_web_links.dart';
1414+import 'package:lazurite/core/theme/theme_extensions.dart';
1515import 'package:lazurite/features/compose/presentation/compose_route_args.dart';
1616import 'package:lazurite/features/connectivity/cubit/connectivity_cubit.dart';
1717import 'package:lazurite/features/feed/cubit/post_action_cache.dart';
···960960 );
961961 }
962962963963+ /// Editing is currently exposed through the thread-screen overflow menu for owner posts.
963964 Future<void> _onEdit(BuildContext context) async {
964965 final post = thread.post;
965966 final record = Map<String, dynamic>.from(post.record);
966967967967- // Editing is currently exposed through the thread-screen overflow menu for owner posts.
968968 final result = await context.push(
969969 '/compose',
970970 extra: ComposeRouteArgs(
···11import 'package:flutter/widgets.dart';
22import 'package:go_router/go_router.dart';
3344+/// Profile navigation helper
55+///
66+/// This avoids pushing a second shell stack from top-level routes like `/post`,
77+/// that can duplicate navigator keys and trip a framework assertion.
48Future<T?>? navigateToProfile<T>(BuildContext context, String actorDid) {
59 final router = GoRouter.maybeOf(context);
610 if (router == null) {
···1014 final location = '/profile/view?actor=${Uri.encodeQueryComponent(actorDid)}';
1115 final currentPath = _currentPath(context);
12161313- // Avoid pushing a second shell stack from top-level routes like `/post`.
1414- // That can duplicate navigator keys and trip a framework assertion.
1517 if (!_isStatefulShellPath(currentPath)) {
1618 router.go(location);
1719 return null;