kopia lustrzana https://github.com/vitorpamplona/amethyst
109 wiersze
4.2 KiB
Kotlin
109 wiersze
4.2 KiB
Kotlin
package com.vitorpamplona.amethyst.ui.screen.loggedIn
|
|
|
|
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.rememberCoroutineScope
|
|
import androidx.compose.ui.Modifier
|
|
import androidx.compose.ui.platform.LocalLifecycleOwner
|
|
import androidx.compose.ui.res.stringResource
|
|
import androidx.compose.ui.unit.dp
|
|
import androidx.lifecycle.Lifecycle
|
|
import androidx.lifecycle.LifecycleEventObserver
|
|
import androidx.navigation.NavController
|
|
import com.google.accompanist.pager.ExperimentalPagerApi
|
|
import com.google.accompanist.pager.HorizontalPager
|
|
import com.google.accompanist.pager.PagerState
|
|
import com.google.accompanist.pager.pagerTabIndicatorOffset
|
|
import com.vitorpamplona.amethyst.R
|
|
import com.vitorpamplona.amethyst.service.NostrHomeDataSource
|
|
import com.vitorpamplona.amethyst.ui.navigation.Route
|
|
import com.vitorpamplona.amethyst.ui.screen.FeedView
|
|
import com.vitorpamplona.amethyst.ui.screen.NostrHomeFeedViewModel
|
|
import com.vitorpamplona.amethyst.ui.screen.NostrHomeRepliesFeedViewModel
|
|
import com.vitorpamplona.amethyst.ui.screen.ScrollStateKeys
|
|
import kotlinx.coroutines.launch
|
|
|
|
@OptIn(ExperimentalPagerApi::class)
|
|
@Composable
|
|
fun HomeScreen(
|
|
accountViewModel: AccountViewModel,
|
|
navController: NavController,
|
|
homeFeedViewModel: NostrHomeFeedViewModel,
|
|
repliesFeedViewModel: NostrHomeRepliesFeedViewModel,
|
|
pagerState: PagerState,
|
|
scrollToTop: Boolean = false
|
|
) {
|
|
val coroutineScope = rememberCoroutineScope()
|
|
|
|
LaunchedEffect(accountViewModel) {
|
|
NostrHomeDataSource.resetFilters()
|
|
|
|
homeFeedViewModel.refresh()
|
|
repliesFeedViewModel.refresh()
|
|
}
|
|
|
|
val lifeCycleOwner = LocalLifecycleOwner.current
|
|
DisposableEffect(accountViewModel) {
|
|
val observer = LifecycleEventObserver { _, event ->
|
|
if (event == Lifecycle.Event.ON_RESUME) {
|
|
NostrHomeDataSource.resetFilters()
|
|
homeFeedViewModel.refresh()
|
|
repliesFeedViewModel.refresh()
|
|
}
|
|
}
|
|
|
|
lifeCycleOwner.lifecycle.addObserver(observer)
|
|
onDispose {
|
|
lifeCycleOwner.lifecycle.removeObserver(observer)
|
|
}
|
|
}
|
|
|
|
Column(Modifier.fillMaxHeight()) {
|
|
Column(
|
|
modifier = Modifier.padding(vertical = 0.dp)
|
|
) {
|
|
TabRow(
|
|
backgroundColor = MaterialTheme.colors.background,
|
|
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 = stringResource(R.string.new_threads))
|
|
}
|
|
)
|
|
|
|
Tab(
|
|
selected = pagerState.currentPage == 1,
|
|
onClick = { coroutineScope.launch { pagerState.animateScrollToPage(1) } },
|
|
text = {
|
|
Text(text = stringResource(R.string.conversations))
|
|
}
|
|
)
|
|
}
|
|
HorizontalPager(count = 2, state = pagerState) {
|
|
when (pagerState.currentPage) {
|
|
0 -> FeedView(homeFeedViewModel, accountViewModel, navController, Route.Home.base + "Follows", ScrollStateKeys.HOME_FOLLOWS, scrollToTop)
|
|
1 -> FeedView(repliesFeedViewModel, accountViewModel, navController, Route.Home.base + "FollowsReplies", ScrollStateKeys.HOME_REPLIES, scrollToTop)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|