diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/FeedViewModel.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/FeedViewModel.kt index d547c0b5cb..2fffa3cd4b 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/FeedViewModel.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/FeedViewModel.kt @@ -14,6 +14,7 @@ import com.vitorpamplona.amethyst.service.NostrGlobalDataSource import com.vitorpamplona.amethyst.service.NostrHomeDataSource import com.vitorpamplona.amethyst.service.NostrThreadDataSource import com.vitorpamplona.amethyst.service.NostrUserProfileDataSource +import com.vitorpamplona.amethyst.service.model.RepostEvent import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Job @@ -24,10 +25,10 @@ import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch import kotlinx.coroutines.withContext +import nostr.postr.events.TextNoteEvent class NostrChannelFeedViewModel: FeedViewModel(NostrChannelDataSource) class NostrChatRoomFeedViewModel: FeedViewModel(NostrChatRoomDataSource) -class NostrHomeFeedViewModel: FeedViewModel(NostrHomeDataSource) class NostrGlobalFeedViewModel: FeedViewModel(NostrGlobalDataSource) class NostrThreadFeedViewModel: FeedViewModel(NostrThreadDataSource) class NostrUserProfileFeedViewModel: FeedViewModel(NostrUserProfileDataSource) @@ -51,6 +52,18 @@ class NostrChatroomListNewFeedViewModel: FeedViewModel(NostrChatroomListDataSour } } +class NostrHomeFeedViewModel: FeedViewModel(NostrHomeDataSource) { + override fun newListFromDataSource(): List { + // Filter: no replies + return dataSource.feed().filter { + it.replyTo == null || it.replyTo?.size == 0 + }.take(100) + } +} + +class NostrHomeRepliesFeedViewModel: FeedViewModel(NostrHomeDataSource) {} + + abstract class FeedViewModel(val dataSource: NostrDataSource): ViewModel() { private val _feedContent = MutableStateFlow(FeedState.Loading) val feedContent = _feedContent.asStateFlow() diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/HomeScreen.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/HomeScreen.kt index a3bd9246fc..632a3fcb25 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/HomeScreen.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/HomeScreen.kt @@ -3,26 +3,42 @@ package com.vitorpamplona.amethyst.ui.screen import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxHeight import androidx.compose.foundation.layout.padding +import androidx.compose.material.MaterialTheme +import androidx.compose.material.Tab +import androidx.compose.material.TabRow +import androidx.compose.material.TabRowDefaults +import androidx.compose.material.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.DisposableEffect import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue import androidx.compose.runtime.livedata.observeAsState import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp import androidx.lifecycle.viewmodel.compose.viewModel import androidx.navigation.NavController +import com.google.accompanist.pager.ExperimentalPagerApi +import com.google.accompanist.pager.HorizontalPager +import com.google.accompanist.pager.pagerTabIndicatorOffset +import com.google.accompanist.pager.rememberPagerState import com.vitorpamplona.amethyst.service.NostrHomeDataSource import com.vitorpamplona.amethyst.service.NostrUserProfileDataSource import com.vitorpamplona.amethyst.service.NostrUserProfileFollowersDataSource import com.vitorpamplona.amethyst.service.NostrUserProfileFollowsDataSource import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel import java.lang.System.currentTimeMillis +import kotlinx.coroutines.launch +@OptIn(ExperimentalPagerApi::class) @Composable fun HomeScreen(accountViewModel: AccountViewModel, navController: NavController) { val feedViewModel: NostrHomeFeedViewModel = viewModel() + val feedViewModelReplies: NostrHomeRepliesFeedViewModel = viewModel() + + val pagerState = rememberPagerState() + val coroutineScope = rememberCoroutineScope() LaunchedEffect(Unit) { feedViewModel.refresh() @@ -32,7 +48,39 @@ fun HomeScreen(accountViewModel: AccountViewModel, navController: NavController) Column( modifier = Modifier.padding(vertical = 0.dp) ) { - FeedView(feedViewModel, accountViewModel, navController) + TabRow( + selectedTabIndex = pagerState.currentPage, + indicator = { tabPositions -> + TabRowDefaults.Indicator( + Modifier.pagerTabIndicatorOffset(pagerState, tabPositions), + color = MaterialTheme.colors.primary + ) + }, + ) { + Tab( + selected = pagerState.currentPage == 0, + onClick = { coroutineScope.launch { pagerState.animateScrollToPage(0) } }, + text = { + Text(text = "Follows") + } + ) + + Tab( + selected = pagerState.currentPage == 1, + onClick = { coroutineScope.launch { pagerState.animateScrollToPage(1) } }, + text = { + Text(text = "Follows + Replies") + } + ) + } + HorizontalPager(count = 2, state = pagerState) { + when (pagerState.currentPage) { + 0 -> FeedView(feedViewModel, accountViewModel, navController) + 1 -> FeedView(feedViewModelReplies, accountViewModel, navController) + } + } + + } } } \ No newline at end of file