Merge pull request #2867 from greenart7c3/claude/fix-home-tab-dot-oi1g0

Refactor homeHasNewItems to respect tab visibility settings
This commit is contained in:
Vitor Pamplona
2026-05-13 08:12:40 -04:00
committed by GitHub
@@ -161,6 +161,7 @@ import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.SupervisorJob import kotlinx.coroutines.SupervisorJob
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.SharingStarted
import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.StateFlow
@@ -409,10 +410,13 @@ class AccountViewModel(
.stateIn(viewModelScope, SharingStarted.WhileSubscribed(30000), false) .stateIn(viewModelScope, SharingStarted.WhileSubscribed(30000), false)
@OptIn(ExperimentalCoroutinesApi::class) @OptIn(ExperimentalCoroutinesApi::class)
val homeHasNewItems = private fun tabHasNewItems(
route: String,
feedContent: StateFlow<FeedState>,
): Flow<Boolean> =
combineTransform( combineTransform(
account.loadLastReadFlow("HomeFollows"), account.loadLastReadFlow(route),
feedStates.homeNewThreads.feedContent feedContent
.flatMapLatest { .flatMapLatest {
if (it is FeedState.Loaded) { if (it is FeedState.Loaded) {
it.feed it.feed
@@ -424,15 +428,33 @@ class AccountViewModel(
}, },
) { lastRead, newestItemCreatedAt -> ) { lastRead, newestItemCreatedAt ->
emit(newestItemCreatedAt != null && newestItemCreatedAt > lastRead) emit(newestItemCreatedAt != null && newestItemCreatedAt > lastRead)
}.onStart { }
val lastRead = account.loadLastReadFlow("HomeFollows").value
val feed = feedStates.homeNewThreads.feedContent.value val homeHasNewItems: Flow<Boolean> =
if (feed is FeedState.Loaded) { combine(
val newestItemCreatedAt = settings.uiSettingsFlow.showHomeNewThreadsTab,
feed.feed.value.list settings.uiSettingsFlow.showHomeConversationsTab,
.firstOrNull { it.event != null && it.event !is GenericRepostEvent && it.event !is RepostEvent } settings.uiSettingsFlow.showHomeEverythingTab,
?.createdAt() tabHasNewItems("HomeFollows", feedStates.homeNewThreads.feedContent),
emit(newestItemCreatedAt != null && newestItemCreatedAt > lastRead) tabHasNewItems("HomeFollowsReplies", feedStates.homeReplies.feedContent),
tabHasNewItems("HomeFollowsEverything", feedStates.homeEverything.feedContent),
) { values ->
val showThreads = values[0]
val showReplies = values[1]
val showEverything = values[2]
val threadsHas = values[3]
val repliesHas = values[4]
val everythingHas = values[5]
val anyEnabled = showThreads || showReplies || showEverything
if (!anyEnabled) {
// HomeScreen falls back to the New Threads tab when the user disables every tab.
threadsHas
} else {
// Dot stays lit only when every enabled tab still has unread items.
// Reaching the top of any single tab marks its newest item read and clears the dot.
(!showThreads || threadsHas) &&
(!showReplies || repliesHas) &&
(!showEverything || everythingHas)
} }
} }