diff --git a/mobile/lib/features/activity/activity_page.dart b/mobile/lib/features/activity/activity_page.dart index 8bd8bcfb2..824230ea1 100644 --- a/mobile/lib/features/activity/activity_page.dart +++ b/mobile/lib/features/activity/activity_page.dart @@ -76,6 +76,7 @@ class ActivityPage extends HookConsumerWidget { // otherwise recomputes its deep link after the read marker changes and // opens the latest event instead of the oldest unread one the user chose. final selectedItemTarget = useState(null); + final selectedItemForDetail = useState(null); final isWideInbox = MediaQuery.sizeOf(context).width >= _wideInboxBreakpoint; final headerTitleStyle = context.textTheme.titleMedium?.copyWith( @@ -119,16 +120,21 @@ class ActivityPage extends HookConsumerWidget { final hasSelectedItem = visibleItems.any( (item) => item.id == selectedItemId.value, ); - if (!hasSelectedItem) { + final retainsSelectedDetail = + selectedItemForDetail.value?.id == selectedItemId.value; + if (!hasSelectedItem && !retainsSelectedDetail) { selectedItemId.value = visibleItems.first.id; selectedItemTarget.value = null; + selectedItemForDetail.value = null; } return null; }, [isWideInbox, visibleItemIdsKey, filter.value, unreadOnly.value]); - final selectedItem = visibleItems.cast().firstWhere( - (item) => item?.id == selectedItemId.value, - orElse: () => null, - ); + final selectedItem = + visibleItems.cast().firstWhere( + (item) => item?.id == selectedItemId.value, + orElse: () => null, + ) ?? + selectedItemForDetail.value; // Preload sender profiles for visible rows. final preloadPubkeys = { @@ -209,6 +215,7 @@ class ActivityPage extends HookConsumerWidget { if (isWideInbox) { selectedItemId.value = item.id; selectedItemTarget.value = target; + selectedItemForDetail.value = item; markItemRead(item); return; } @@ -356,6 +363,7 @@ class ActivityPage extends HookConsumerWidget { onChanged: (nextFilter) { selectedItemId.value = null; selectedItemTarget.value = null; + selectedItemForDetail.value = null; filter.value = nextFilter; }, ), diff --git a/mobile/lib/features/channels/channels_provider.dart b/mobile/lib/features/channels/channels_provider.dart index bc6144fb4..c7418c0cf 100644 --- a/mobile/lib/features/channels/channels_provider.dart +++ b/mobile/lib/features/channels/channels_provider.dart @@ -69,9 +69,7 @@ class ChannelsNotifier extends AsyncNotifier> { sessionState.status != SessionStatus.connected; ref.listen(relaySessionProvider, (previous, next) { if (next.status != SessionStatus.connected) return; - if (waitingForInitialConnection && - !_hasLoaded && - !connected.isCompleted) { + if (waitingForInitialConnection && !connected.isCompleted) { connected.complete(); } else if (previous?.status != SessionStatus.connected) { unawaited(_backstopRefresh());