Refreshing home when follows change, including Live activities.
This commit is contained in:
@@ -13,7 +13,10 @@ import java.util.Date
|
|||||||
|
|
||||||
class HomeLiveActivitiesFeedFilter(val account: Account) : AdditiveFeedFilter<Note>() {
|
class HomeLiveActivitiesFeedFilter(val account: Account) : AdditiveFeedFilter<Note>() {
|
||||||
override fun feedKey(): String {
|
override fun feedKey(): String {
|
||||||
return account.userProfile().pubkeyHex + "-" + account.defaultHomeFollowList
|
val followingKeySet = account.selectedUsersFollowList(account.defaultHomeFollowList)?.size ?: 0
|
||||||
|
val followingTagSet = account.selectedTagsFollowList(account.defaultHomeFollowList)?.size ?: 0
|
||||||
|
|
||||||
|
return account.userProfile().pubkeyHex + "-" + account.defaultHomeFollowList + "-" + followingKeySet + "-" + followingTagSet
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun feed(): List<Note> {
|
override fun feed(): List<Note> {
|
||||||
|
|||||||
@@ -34,7 +34,10 @@ import androidx.compose.ui.unit.dp
|
|||||||
import androidx.lifecycle.Lifecycle
|
import androidx.lifecycle.Lifecycle
|
||||||
import androidx.lifecycle.LifecycleEventObserver
|
import androidx.lifecycle.LifecycleEventObserver
|
||||||
import com.vitorpamplona.amethyst.R
|
import com.vitorpamplona.amethyst.R
|
||||||
|
import com.vitorpamplona.amethyst.model.Note
|
||||||
import com.vitorpamplona.amethyst.service.NostrHomeDataSource
|
import com.vitorpamplona.amethyst.service.NostrHomeDataSource
|
||||||
|
import com.vitorpamplona.amethyst.service.model.LiveActivitiesEvent
|
||||||
|
import com.vitorpamplona.amethyst.ui.dal.checkIfOnline
|
||||||
import com.vitorpamplona.amethyst.ui.navigation.Route
|
import com.vitorpamplona.amethyst.ui.navigation.Route
|
||||||
import com.vitorpamplona.amethyst.ui.note.UpdateZapAmountDialog
|
import com.vitorpamplona.amethyst.ui.note.UpdateZapAmountDialog
|
||||||
import com.vitorpamplona.amethyst.ui.screen.FeedState
|
import com.vitorpamplona.amethyst.ui.screen.FeedState
|
||||||
@@ -65,7 +68,7 @@ fun HomeScreen(
|
|||||||
|
|
||||||
val pagerState = rememberForeverPagerState(key = PagerStateKeys.HOME_SCREEN)
|
val pagerState = rememberForeverPagerState(key = PagerStateKeys.HOME_SCREEN)
|
||||||
|
|
||||||
WatchAccountForHomeScreen(homeFeedViewModel, repliesFeedViewModel, accountViewModel)
|
WatchAccountForHomeScreen(homeFeedViewModel, repliesFeedViewModel, liveActivitiesViewModel, accountViewModel)
|
||||||
|
|
||||||
if (wantsToAddNip47 != null) {
|
if (wantsToAddNip47 != null) {
|
||||||
UpdateZapAmountDialog({ wantsToAddNip47 = null }, wantsToAddNip47, accountViewModel)
|
UpdateZapAmountDialog({ wantsToAddNip47 = null }, wantsToAddNip47, accountViewModel)
|
||||||
@@ -190,38 +193,52 @@ private fun FeedLoaded(
|
|||||||
state = listState
|
state = listState
|
||||||
) {
|
) {
|
||||||
itemsIndexed(state.feed.value, key = { _, item -> item.idHex }) { _, item ->
|
itemsIndexed(state.feed.value, key = { _, item -> item.idHex }) { _, item ->
|
||||||
ChannelHeader(
|
CheckIfOnline(item) {
|
||||||
channelHex = item.idHex,
|
ChannelHeader(
|
||||||
showVideo = false,
|
channelHex = item.idHex,
|
||||||
showBottomDiviser = true,
|
showVideo = false,
|
||||||
modifier = Modifier.padding(start = 10.dp, end = 10.dp, bottom = 10.dp),
|
showBottomDiviser = true,
|
||||||
accountViewModel = accountViewModel,
|
modifier = Modifier.padding(start = 10.dp, end = 10.dp, bottom = 10.dp),
|
||||||
nav = nav
|
accountViewModel = accountViewModel,
|
||||||
)
|
nav = nav
|
||||||
|
)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Composable
|
||||||
|
fun CheckIfOnline(note: Note, whenOnline: @Composable () -> Unit) {
|
||||||
|
val noteState by note.live().metadata.observeAsState()
|
||||||
|
var online by remember { mutableStateOf(false) }
|
||||||
|
|
||||||
|
LaunchedEffect(key1 = noteState) {
|
||||||
|
launch(Dispatchers.IO) {
|
||||||
|
online = checkIfOnline((note.event as? LiveActivitiesEvent)?.streaming())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (online) {
|
||||||
|
whenOnline()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
fun WatchAccountForHomeScreen(
|
fun WatchAccountForHomeScreen(
|
||||||
homeFeedViewModel: NostrHomeFeedViewModel,
|
homeFeedViewModel: NostrHomeFeedViewModel,
|
||||||
repliesFeedViewModel: NostrHomeRepliesFeedViewModel,
|
repliesFeedViewModel: NostrHomeRepliesFeedViewModel,
|
||||||
|
liveActivitiesViewModel: NostrHomeFeedLiveActivitiesViewModel,
|
||||||
accountViewModel: AccountViewModel
|
accountViewModel: AccountViewModel
|
||||||
) {
|
) {
|
||||||
val accountState by accountViewModel.accountLiveData.observeAsState()
|
val accountState by accountViewModel.accountLiveData.observeAsState()
|
||||||
val followState by accountViewModel.account.userProfile().live().follows.observeAsState()
|
val followState by accountViewModel.account.userProfile().live().follows.observeAsState()
|
||||||
|
|
||||||
LaunchedEffect(accountViewModel, accountState?.account?.defaultHomeFollowList) {
|
LaunchedEffect(accountViewModel, accountState?.account?.defaultHomeFollowList, followState) {
|
||||||
launch(Dispatchers.IO) {
|
launch(Dispatchers.IO) {
|
||||||
NostrHomeDataSource.invalidateFilters()
|
NostrHomeDataSource.invalidateFilters()
|
||||||
homeFeedViewModel.checkKeysInvalidateDataAndSendToTop()
|
homeFeedViewModel.checkKeysInvalidateDataAndSendToTop()
|
||||||
repliesFeedViewModel.checkKeysInvalidateDataAndSendToTop()
|
repliesFeedViewModel.checkKeysInvalidateDataAndSendToTop()
|
||||||
}
|
liveActivitiesViewModel.checkKeysInvalidateDataAndSendToTop()
|
||||||
}
|
|
||||||
|
|
||||||
LaunchedEffect(followState) {
|
|
||||||
launch(Dispatchers.IO) {
|
|
||||||
NostrHomeDataSource.invalidateFilters()
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user