Migrates to Compose 1.5.0
This commit is contained in:
+1
-1
@@ -88,7 +88,7 @@ android {
|
|||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
implementation project(path: ':quartz')
|
implementation project(path: ':quartz')
|
||||||
implementation 'androidx.core:core-ktx:1.10.1'
|
implementation "androidx.core:core-ktx:$core_ktx_version"
|
||||||
implementation 'androidx.activity:activity-compose:1.7.2'
|
implementation 'androidx.activity:activity-compose:1.7.2'
|
||||||
implementation "androidx.compose.ui:ui:$compose_ui_version"
|
implementation "androidx.compose.ui:ui:$compose_ui_version"
|
||||||
implementation "androidx.compose.ui:ui-tooling-preview:$compose_ui_version"
|
implementation "androidx.compose.ui:ui-tooling-preview:$compose_ui_version"
|
||||||
|
|||||||
@@ -886,7 +886,7 @@ fun DisplayLocationInTitle(geohash: String) {
|
|||||||
fun Notifying(baseMentions: ImmutableList<User>?, onClick: (User) -> Unit) {
|
fun Notifying(baseMentions: ImmutableList<User>?, onClick: (User) -> Unit) {
|
||||||
val mentions = baseMentions?.toSet()
|
val mentions = baseMentions?.toSet()
|
||||||
|
|
||||||
FlowRow(verticalAlignment = Alignment.CenterVertically, modifier = Modifier.padding(horizontal = 10.dp)) {
|
FlowRow(verticalArrangement = Arrangement.Center, modifier = Modifier.padding(horizontal = 10.dp)) {
|
||||||
if (!mentions.isNullOrEmpty()) {
|
if (!mentions.isNullOrEmpty()) {
|
||||||
Text(
|
Text(
|
||||||
stringResource(R.string.reply_notify),
|
stringResource(R.string.reply_notify),
|
||||||
|
|||||||
@@ -18,7 +18,6 @@ import androidx.compose.material.MaterialTheme
|
|||||||
import androidx.compose.material.Surface
|
import androidx.compose.material.Surface
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
import androidx.compose.runtime.getValue
|
import androidx.compose.runtime.getValue
|
||||||
import androidx.compose.runtime.remember
|
|
||||||
import androidx.compose.ui.Alignment
|
import androidx.compose.ui.Alignment
|
||||||
import androidx.compose.ui.Modifier
|
import androidx.compose.ui.Modifier
|
||||||
import androidx.compose.ui.draw.clip
|
import androidx.compose.ui.draw.clip
|
||||||
@@ -30,9 +29,8 @@ import com.vitorpamplona.amethyst.ui.theme.placeholderText
|
|||||||
@OptIn(ExperimentalFoundationApi::class)
|
@OptIn(ExperimentalFoundationApi::class)
|
||||||
@Composable
|
@Composable
|
||||||
fun SlidingCarousel(
|
fun SlidingCarousel(
|
||||||
|
pagerState: PagerState,
|
||||||
modifier: Modifier = Modifier,
|
modifier: Modifier = Modifier,
|
||||||
pagerState: PagerState = remember { PagerState() },
|
|
||||||
itemsCount: Int,
|
|
||||||
itemContent: @Composable (index: Int) -> Unit
|
itemContent: @Composable (index: Int) -> Unit
|
||||||
) {
|
) {
|
||||||
val isDragged by pagerState.interactionSource.collectIsDraggedAsState()
|
val isDragged by pagerState.interactionSource.collectIsDraggedAsState()
|
||||||
@@ -40,7 +38,7 @@ fun SlidingCarousel(
|
|||||||
Box(
|
Box(
|
||||||
modifier = modifier.fillMaxWidth()
|
modifier = modifier.fillMaxWidth()
|
||||||
) {
|
) {
|
||||||
HorizontalPager(pageCount = itemsCount, state = pagerState) { page ->
|
HorizontalPager(state = pagerState) { page ->
|
||||||
itemContent(page)
|
itemContent(page)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -55,7 +53,7 @@ fun SlidingCarousel(
|
|||||||
) {
|
) {
|
||||||
DotsIndicator(
|
DotsIndicator(
|
||||||
modifier = Modifier.padding(horizontal = 8.dp, vertical = 6.dp),
|
modifier = Modifier.padding(horizontal = 8.dp, vertical = 6.dp),
|
||||||
totalDots = itemsCount,
|
totalDots = pagerState.pageCount,
|
||||||
selectedIndex = if (isDragged) pagerState.currentPage else pagerState.targetPage,
|
selectedIndex = if (isDragged) pagerState.currentPage else pagerState.targetPage,
|
||||||
dotSize = 8.dp
|
dotSize = 8.dp
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -637,7 +637,7 @@ fun ZoomableImageDialog(
|
|||||||
) {
|
) {
|
||||||
Surface(modifier = Modifier.fillMaxSize(), color = MaterialTheme.colors.background) {
|
Surface(modifier = Modifier.fillMaxSize(), color = MaterialTheme.colors.background) {
|
||||||
Box(modifier = Modifier.fillMaxSize(), contentAlignment = Alignment.TopCenter) {
|
Box(modifier = Modifier.fillMaxSize(), contentAlignment = Alignment.TopCenter) {
|
||||||
val pagerState: PagerState = rememberPagerState()
|
val pagerState: PagerState = rememberPagerState() { allImages.size }
|
||||||
|
|
||||||
LaunchedEffect(key1 = pagerState, key2 = imageUrl) {
|
LaunchedEffect(key1 = pagerState, key2 = imageUrl) {
|
||||||
val page = allImages.indexOf(imageUrl)
|
val page = allImages.indexOf(imageUrl)
|
||||||
@@ -648,12 +648,10 @@ fun ZoomableImageDialog(
|
|||||||
|
|
||||||
if (allImages.size > 1) {
|
if (allImages.size > 1) {
|
||||||
SlidingCarousel(
|
SlidingCarousel(
|
||||||
pagerState = pagerState,
|
pagerState = pagerState
|
||||||
itemsCount = allImages.size,
|
) { index ->
|
||||||
itemContent = { index ->
|
RenderImageOrVideo(allImages[index], false, accountViewModel)
|
||||||
RenderImageOrVideo(allImages[index], false, accountViewModel)
|
}
|
||||||
}
|
|
||||||
)
|
|
||||||
} else {
|
} else {
|
||||||
RenderImageOrVideo(imageUrl, false, accountViewModel)
|
RenderImageOrVideo(imageUrl, false, accountViewModel)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -770,7 +770,7 @@ fun RenderChannelThumb(baseNote: Note, channel: Channel, accountViewModel: Accou
|
|||||||
@OptIn(ExperimentalLayoutApi::class)
|
@OptIn(ExperimentalLayoutApi::class)
|
||||||
@Composable
|
@Composable
|
||||||
fun Gallery(users: List<User>, accountViewModel: AccountViewModel) {
|
fun Gallery(users: List<User>, accountViewModel: AccountViewModel) {
|
||||||
FlowRow(verticalAlignment = CenterVertically) {
|
FlowRow(verticalArrangement = Arrangement.Center) {
|
||||||
users.take(6).forEach {
|
users.take(6).forEach {
|
||||||
ClickableUserPicture(it, Size35dp, accountViewModel)
|
ClickableUserPicture(it, Size35dp, accountViewModel)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ import android.content.Context
|
|||||||
import android.util.Log
|
import android.util.Log
|
||||||
import android.widget.Toast
|
import android.widget.Toast
|
||||||
import androidx.compose.animation.AnimatedContent
|
import androidx.compose.animation.AnimatedContent
|
||||||
import androidx.compose.animation.AnimatedContentScope
|
import androidx.compose.animation.AnimatedContentTransitionScope
|
||||||
import androidx.compose.animation.ContentTransform
|
import androidx.compose.animation.ContentTransform
|
||||||
import androidx.compose.animation.Crossfade
|
import androidx.compose.animation.Crossfade
|
||||||
import androidx.compose.animation.ExperimentalAnimationApi
|
import androidx.compose.animation.ExperimentalAnimationApi
|
||||||
@@ -610,14 +610,14 @@ private fun SlidingAnimationCount(baseCount: MutableState<Int>, textColor: Color
|
|||||||
private fun SlidingAnimationCount(baseCount: Int, textColor: Color) {
|
private fun SlidingAnimationCount(baseCount: Int, textColor: Color) {
|
||||||
AnimatedContent<Int>(
|
AnimatedContent<Int>(
|
||||||
targetState = baseCount,
|
targetState = baseCount,
|
||||||
transitionSpec = AnimatedContentScope<Int>::transitionSpec
|
transitionSpec = AnimatedContentTransitionScope<Int>::transitionSpec
|
||||||
) { count ->
|
) { count ->
|
||||||
TextCount(count, textColor)
|
TextCount(count, textColor)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@OptIn(ExperimentalAnimationApi::class)
|
@OptIn(ExperimentalAnimationApi::class)
|
||||||
private fun <S> AnimatedContentScope<S>.transitionSpec(): ContentTransform {
|
private fun <S> AnimatedContentTransitionScope<S>.transitionSpec(): ContentTransform {
|
||||||
return slideAnimation
|
return slideAnimation
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -644,7 +644,7 @@ private fun TextCount(count: Int, textColor: Color) {
|
|||||||
private fun SlidingAnimationAmount(amount: MutableState<String>, textColor: Color) {
|
private fun SlidingAnimationAmount(amount: MutableState<String>, textColor: Color) {
|
||||||
AnimatedContent(
|
AnimatedContent(
|
||||||
targetState = amount.value,
|
targetState = amount.value,
|
||||||
transitionSpec = AnimatedContentScope<String>::transitionSpec
|
transitionSpec = AnimatedContentTransitionScope<String>::transitionSpec
|
||||||
) { count ->
|
) { count ->
|
||||||
Text(
|
Text(
|
||||||
text = count,
|
text = count,
|
||||||
|
|||||||
@@ -3,8 +3,10 @@ package com.vitorpamplona.amethyst.ui.screen
|
|||||||
import androidx.compose.foundation.ExperimentalFoundationApi
|
import androidx.compose.foundation.ExperimentalFoundationApi
|
||||||
import androidx.compose.foundation.lazy.LazyListState
|
import androidx.compose.foundation.lazy.LazyListState
|
||||||
import androidx.compose.foundation.pager.PagerState
|
import androidx.compose.foundation.pager.PagerState
|
||||||
|
import androidx.compose.foundation.pager.rememberPagerState
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
import androidx.compose.runtime.DisposableEffect
|
import androidx.compose.runtime.DisposableEffect
|
||||||
|
import androidx.compose.runtime.saveable.Saver
|
||||||
import androidx.compose.runtime.saveable.rememberSaveable
|
import androidx.compose.runtime.saveable.rememberSaveable
|
||||||
import com.vitorpamplona.amethyst.ui.navigation.Route
|
import com.vitorpamplona.amethyst.ui.navigation.Route
|
||||||
import kotlin.math.roundToInt
|
import kotlin.math.roundToInt
|
||||||
@@ -61,17 +63,19 @@ fun rememberForeverLazyListState(
|
|||||||
fun rememberForeverPagerState(
|
fun rememberForeverPagerState(
|
||||||
key: String,
|
key: String,
|
||||||
initialFirstVisibleItemIndex: Int = 0,
|
initialFirstVisibleItemIndex: Int = 0,
|
||||||
initialFirstVisibleItemScrollOffset: Float = 0.0f
|
initialFirstVisibleItemScrollOffset: Float = 0.0f,
|
||||||
|
pageCount: () -> Int
|
||||||
): PagerState {
|
): PagerState {
|
||||||
val scrollState = rememberSaveable(saver = PagerState.Saver) {
|
val savedValue = savedScrollStates[key]
|
||||||
val savedValue = savedScrollStates[key]
|
val savedIndex = savedValue?.index ?: initialFirstVisibleItemIndex
|
||||||
val savedIndex = savedValue?.index ?: initialFirstVisibleItemIndex
|
val savedOffset = savedValue?.scrollOffsetFraction ?: initialFirstVisibleItemScrollOffset
|
||||||
val savedOffset = savedValue?.scrollOffsetFraction ?: initialFirstVisibleItemScrollOffset
|
|
||||||
PagerState(
|
val scrollState = rememberPagerState(
|
||||||
savedIndex,
|
savedIndex,
|
||||||
savedOffset
|
savedOffset,
|
||||||
)
|
pageCount
|
||||||
}
|
)
|
||||||
|
|
||||||
DisposableEffect(scrollState) {
|
DisposableEffect(scrollState) {
|
||||||
onDispose {
|
onDispose {
|
||||||
val lastIndex = scrollState.currentPage
|
val lastIndex = scrollState.currentPage
|
||||||
@@ -79,5 +83,6 @@ fun rememberForeverPagerState(
|
|||||||
savedScrollStates[key] = ScrollState(lastIndex, lastOffset)
|
savedScrollStates[key] = ScrollState(lastIndex, lastOffset)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return scrollState
|
return scrollState
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-2
@@ -50,7 +50,7 @@ fun BookmarkListScreen(accountViewModel: AccountViewModel, nav: (String) -> Unit
|
|||||||
|
|
||||||
Column(Modifier.fillMaxHeight()) {
|
Column(Modifier.fillMaxHeight()) {
|
||||||
Column(modifier = Modifier.padding(start = 10.dp, end = 10.dp)) {
|
Column(modifier = Modifier.padding(start = 10.dp, end = 10.dp)) {
|
||||||
val pagerState = rememberPagerState()
|
val pagerState = rememberPagerState() { 2 }
|
||||||
val coroutineScope = rememberCoroutineScope()
|
val coroutineScope = rememberCoroutineScope()
|
||||||
|
|
||||||
TabRow(
|
TabRow(
|
||||||
@@ -73,7 +73,7 @@ fun BookmarkListScreen(accountViewModel: AccountViewModel, nav: (String) -> Unit
|
|||||||
}
|
}
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
HorizontalPager(pageCount = 2, state = pagerState) { page ->
|
HorizontalPager(state = pagerState) { page ->
|
||||||
when (page) {
|
when (page) {
|
||||||
0 -> RefresheableFeedView(
|
0 -> RefresheableFeedView(
|
||||||
privateFeedViewModel,
|
privateFeedViewModel,
|
||||||
|
|||||||
+1
-2
@@ -57,7 +57,7 @@ fun ChatroomListScreen(
|
|||||||
accountViewModel: AccountViewModel,
|
accountViewModel: AccountViewModel,
|
||||||
nav: (String) -> Unit
|
nav: (String) -> Unit
|
||||||
) {
|
) {
|
||||||
val pagerState = rememberPagerState()
|
val pagerState = rememberPagerState() { 2 }
|
||||||
val coroutineScope = rememberCoroutineScope()
|
val coroutineScope = rememberCoroutineScope()
|
||||||
|
|
||||||
var moreActionsExpanded by remember { mutableStateOf(false) }
|
var moreActionsExpanded by remember { mutableStateOf(false) }
|
||||||
@@ -136,7 +136,6 @@ fun ChatroomListScreen(
|
|||||||
}
|
}
|
||||||
|
|
||||||
HorizontalPager(
|
HorizontalPager(
|
||||||
pageCount = 2,
|
|
||||||
state = pagerState,
|
state = pagerState,
|
||||||
modifier = Modifier.fillMaxSize()
|
modifier = Modifier.fillMaxSize()
|
||||||
) { page ->
|
) { page ->
|
||||||
|
|||||||
@@ -69,7 +69,17 @@ fun DiscoverScreen(
|
|||||||
) {
|
) {
|
||||||
val lifeCycleOwner = LocalLifecycleOwner.current
|
val lifeCycleOwner = LocalLifecycleOwner.current
|
||||||
|
|
||||||
val pagerState = rememberForeverPagerState(key = PagerStateKeys.DISCOVER_SCREEN)
|
val tabs by remember(discoveryLiveFeedViewModel, discoveryCommunityFeedViewModel, discoveryChatFeedViewModel) {
|
||||||
|
mutableStateOf(
|
||||||
|
listOf(
|
||||||
|
TabItem(R.string.discover_live, discoveryLiveFeedViewModel, Route.Discover.base + "Live", ScrollStateKeys.DISCOVER_LIVE, LiveActivitiesEvent.kind),
|
||||||
|
TabItem(R.string.discover_community, discoveryCommunityFeedViewModel, Route.Discover.base + "Community", ScrollStateKeys.DISCOVER_COMMUNITY, CommunityDefinitionEvent.kind),
|
||||||
|
TabItem(R.string.discover_chat, discoveryChatFeedViewModel, Route.Discover.base + "Chats", ScrollStateKeys.DISCOVER_CHATS, ChannelCreateEvent.kind)
|
||||||
|
).toImmutableList()
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
val pagerState = rememberForeverPagerState(key = PagerStateKeys.DISCOVER_SCREEN) { tabs.size }
|
||||||
|
|
||||||
WatchAccountForDiscoveryScreen(
|
WatchAccountForDiscoveryScreen(
|
||||||
discoveryLiveFeedViewModel = discoveryLiveFeedViewModel,
|
discoveryLiveFeedViewModel = discoveryLiveFeedViewModel,
|
||||||
@@ -92,16 +102,6 @@ fun DiscoverScreen(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
val tabs by remember(discoveryLiveFeedViewModel, discoveryCommunityFeedViewModel, discoveryChatFeedViewModel) {
|
|
||||||
mutableStateOf(
|
|
||||||
listOf(
|
|
||||||
TabItem(R.string.discover_live, discoveryLiveFeedViewModel, Route.Discover.base + "Live", ScrollStateKeys.DISCOVER_LIVE, LiveActivitiesEvent.kind),
|
|
||||||
TabItem(R.string.discover_community, discoveryCommunityFeedViewModel, Route.Discover.base + "Community", ScrollStateKeys.DISCOVER_COMMUNITY, CommunityDefinitionEvent.kind),
|
|
||||||
TabItem(R.string.discover_chat, discoveryChatFeedViewModel, Route.Discover.base + "Chats", ScrollStateKeys.DISCOVER_CHATS, ChannelCreateEvent.kind)
|
|
||||||
).toImmutableList()
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
Column(Modifier.fillMaxHeight()) {
|
Column(Modifier.fillMaxHeight()) {
|
||||||
Column(
|
Column(
|
||||||
modifier = Modifier.padding(vertical = 0.dp)
|
modifier = Modifier.padding(vertical = 0.dp)
|
||||||
@@ -139,7 +139,7 @@ private fun DiscoverPages(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
HorizontalPager(pageCount = 3, state = pagerState) { page ->
|
HorizontalPager(state = pagerState) { page ->
|
||||||
RefresheableView(tabs[page].viewModel, true) {
|
RefresheableView(tabs[page].viewModel, true) {
|
||||||
SaveableFeedState(tabs[page].viewModel, scrollStateKey = tabs[page].scrollStateKey) { listState ->
|
SaveableFeedState(tabs[page].viewModel, scrollStateKey = tabs[page].scrollStateKey) { listState ->
|
||||||
RenderDiscoverFeed(
|
RenderDiscoverFeed(
|
||||||
|
|||||||
+2
-2
@@ -78,7 +78,7 @@ fun HiddenUsersScreen(
|
|||||||
|
|
||||||
Column(Modifier.fillMaxHeight()) {
|
Column(Modifier.fillMaxHeight()) {
|
||||||
Column(modifier = Modifier.padding(start = 10.dp, end = 10.dp)) {
|
Column(modifier = Modifier.padding(start = 10.dp, end = 10.dp)) {
|
||||||
val pagerState = rememberPagerState()
|
val pagerState = rememberPagerState() { 2 }
|
||||||
val coroutineScope = rememberCoroutineScope()
|
val coroutineScope = rememberCoroutineScope()
|
||||||
var warnAboutReports by remember { mutableStateOf(accountViewModel.account.warnAboutPostsWithReports) }
|
var warnAboutReports by remember { mutableStateOf(accountViewModel.account.warnAboutPostsWithReports) }
|
||||||
var filterSpam by remember { mutableStateOf(accountViewModel.account.filterSpamFromStrangers) }
|
var filterSpam by remember { mutableStateOf(accountViewModel.account.filterSpamFromStrangers) }
|
||||||
@@ -129,7 +129,7 @@ fun HiddenUsersScreen(
|
|||||||
}
|
}
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
HorizontalPager(pageCount = 2, state = pagerState) { page ->
|
HorizontalPager(state = pagerState) { page ->
|
||||||
when (page) {
|
when (page) {
|
||||||
0 -> RefreshingUserFeedView(hiddenFeedViewModel, accountViewModel, nav)
|
0 -> RefreshingUserFeedView(hiddenFeedViewModel, accountViewModel, nav)
|
||||||
1 -> RefreshingUserFeedView(spammerFeedViewModel, accountViewModel, nav)
|
1 -> RefreshingUserFeedView(spammerFeedViewModel, accountViewModel, nav)
|
||||||
|
|||||||
@@ -56,7 +56,7 @@ fun HomeScreen(
|
|||||||
) {
|
) {
|
||||||
var wantsToAddNip47 by remember(nip47) { mutableStateOf(nip47) }
|
var wantsToAddNip47 by remember(nip47) { mutableStateOf(nip47) }
|
||||||
|
|
||||||
val pagerState = rememberForeverPagerState(key = PagerStateKeys.HOME_SCREEN)
|
val pagerState = rememberForeverPagerState(key = PagerStateKeys.HOME_SCREEN) { 2 }
|
||||||
|
|
||||||
WatchAccountForHomeScreen(homeFeedViewModel, repliesFeedViewModel, accountViewModel)
|
WatchAccountForHomeScreen(homeFeedViewModel, repliesFeedViewModel, accountViewModel)
|
||||||
|
|
||||||
@@ -124,7 +124,7 @@ private fun HomePages(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
HorizontalPager(pageCount = 2, state = pagerState) { page ->
|
HorizontalPager(state = pagerState) { page ->
|
||||||
RefresheableFeedView(
|
RefresheableFeedView(
|
||||||
viewModel = tabs[page].viewModel,
|
viewModel = tabs[page].viewModel,
|
||||||
routeForLastRead = tabs[page].routeForLastRead,
|
routeForLastRead = tabs[page].routeForLastRead,
|
||||||
|
|||||||
@@ -308,7 +308,6 @@ private fun RenderSurface(
|
|||||||
columnSize = it
|
columnSize = it
|
||||||
}
|
}
|
||||||
) {
|
) {
|
||||||
val pagerState = rememberPagerState()
|
|
||||||
val coroutineScope = rememberCoroutineScope()
|
val coroutineScope = rememberCoroutineScope()
|
||||||
val scrollState = rememberScrollState()
|
val scrollState = rememberScrollState()
|
||||||
|
|
||||||
@@ -347,7 +346,6 @@ private fun RenderSurface(
|
|||||||
) {
|
) {
|
||||||
RenderScreen(
|
RenderScreen(
|
||||||
baseUser,
|
baseUser,
|
||||||
pagerState,
|
|
||||||
tabRowModifier,
|
tabRowModifier,
|
||||||
pagerModifier,
|
pagerModifier,
|
||||||
threadsViewModel,
|
threadsViewModel,
|
||||||
@@ -370,7 +368,6 @@ private fun RenderSurface(
|
|||||||
@OptIn(ExperimentalFoundationApi::class)
|
@OptIn(ExperimentalFoundationApi::class)
|
||||||
private fun RenderScreen(
|
private fun RenderScreen(
|
||||||
baseUser: User,
|
baseUser: User,
|
||||||
pagerState: PagerState,
|
|
||||||
tabRowModifier: Modifier,
|
tabRowModifier: Modifier,
|
||||||
pagerModifier: Modifier,
|
pagerModifier: Modifier,
|
||||||
threadsViewModel: NostrUserProfileNewThreadsFeedViewModel,
|
threadsViewModel: NostrUserProfileNewThreadsFeedViewModel,
|
||||||
@@ -384,6 +381,8 @@ private fun RenderScreen(
|
|||||||
accountViewModel: AccountViewModel,
|
accountViewModel: AccountViewModel,
|
||||||
nav: (String) -> Unit
|
nav: (String) -> Unit
|
||||||
) {
|
) {
|
||||||
|
val pagerState = rememberPagerState { 9 }
|
||||||
|
|
||||||
Column() {
|
Column() {
|
||||||
ProfileHeader(baseUser, appRecommendations, nav, accountViewModel)
|
ProfileHeader(baseUser, appRecommendations, nav, accountViewModel)
|
||||||
ScrollableTabRow(
|
ScrollableTabRow(
|
||||||
@@ -395,7 +394,6 @@ private fun RenderScreen(
|
|||||||
CreateAndRenderTabs(baseUser, pagerState)
|
CreateAndRenderTabs(baseUser, pagerState)
|
||||||
}
|
}
|
||||||
HorizontalPager(
|
HorizontalPager(
|
||||||
pageCount = 9,
|
|
||||||
state = pagerState,
|
state = pagerState,
|
||||||
modifier = pagerModifier
|
modifier = pagerModifier
|
||||||
) { page ->
|
) { page ->
|
||||||
@@ -1089,7 +1087,7 @@ private fun DisplayAppRecommendations(
|
|||||||
Text(stringResource(id = R.string.recommended_apps))
|
Text(stringResource(id = R.string.recommended_apps))
|
||||||
|
|
||||||
FlowRow(
|
FlowRow(
|
||||||
verticalAlignment = Alignment.CenterVertically,
|
verticalArrangement = Arrangement.Center,
|
||||||
modifier = Modifier.padding(vertical = 5.dp)
|
modifier = Modifier.padding(vertical = 5.dp)
|
||||||
) {
|
) {
|
||||||
state.feed.value.forEach { app ->
|
state.feed.value.forEach { app ->
|
||||||
@@ -1174,7 +1172,7 @@ private fun RenderBadgeList(
|
|||||||
nav: (String) -> Unit
|
nav: (String) -> Unit
|
||||||
) {
|
) {
|
||||||
FlowRow(
|
FlowRow(
|
||||||
verticalAlignment = Alignment.CenterVertically,
|
verticalArrangement = Arrangement.Center,
|
||||||
modifier = Modifier.padding(vertical = 5.dp)
|
modifier = Modifier.padding(vertical = 5.dp)
|
||||||
) {
|
) {
|
||||||
list.forEach { badgeAwardEvent ->
|
list.forEach { badgeAwardEvent ->
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ import androidx.compose.foundation.layout.size
|
|||||||
import androidx.compose.foundation.layout.width
|
import androidx.compose.foundation.layout.width
|
||||||
import androidx.compose.foundation.pager.PagerState
|
import androidx.compose.foundation.pager.PagerState
|
||||||
import androidx.compose.foundation.pager.VerticalPager
|
import androidx.compose.foundation.pager.VerticalPager
|
||||||
|
import androidx.compose.foundation.pager.rememberPagerState
|
||||||
import androidx.compose.material.Icon
|
import androidx.compose.material.Icon
|
||||||
import androidx.compose.material.IconButton
|
import androidx.compose.material.IconButton
|
||||||
import androidx.compose.material.MaterialTheme
|
import androidx.compose.material.MaterialTheme
|
||||||
@@ -131,15 +132,7 @@ private fun SaveableFeedState(
|
|||||||
nav: (String) -> Unit,
|
nav: (String) -> Unit,
|
||||||
scrollStateKey: String? = null
|
scrollStateKey: String? = null
|
||||||
) {
|
) {
|
||||||
val pagerState = if (scrollStateKey != null) {
|
RenderPage(videoFeedView, accountViewModel, scrollStateKey, nav)
|
||||||
rememberForeverPagerState(scrollStateKey)
|
|
||||||
} else {
|
|
||||||
remember { PagerState() }
|
|
||||||
}
|
|
||||||
|
|
||||||
WatchScrollToTop(videoFeedView, pagerState)
|
|
||||||
|
|
||||||
RenderPage(videoFeedView, accountViewModel, pagerState, nav)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@OptIn(ExperimentalFoundationApi::class)
|
@OptIn(ExperimentalFoundationApi::class)
|
||||||
@@ -163,7 +156,7 @@ public fun WatchScrollToTop(
|
|||||||
fun RenderPage(
|
fun RenderPage(
|
||||||
videoFeedView: NostrVideoFeedViewModel,
|
videoFeedView: NostrVideoFeedViewModel,
|
||||||
accountViewModel: AccountViewModel,
|
accountViewModel: AccountViewModel,
|
||||||
pagerState: PagerState,
|
pagerStateKey: String?,
|
||||||
nav: (String) -> Unit
|
nav: (String) -> Unit
|
||||||
) {
|
) {
|
||||||
val feedState by videoFeedView.feedContent.collectAsState()
|
val feedState by videoFeedView.feedContent.collectAsState()
|
||||||
@@ -184,12 +177,7 @@ fun RenderPage(
|
|||||||
}
|
}
|
||||||
|
|
||||||
is FeedState.Loaded -> {
|
is FeedState.Loaded -> {
|
||||||
SlidingCarousel(
|
LoadedState(state, pagerStateKey, videoFeedView, accountViewModel, nav)
|
||||||
state.feed,
|
|
||||||
pagerState,
|
|
||||||
accountViewModel,
|
|
||||||
nav
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
is FeedState.Loading -> {
|
is FeedState.Loading -> {
|
||||||
@@ -201,6 +189,31 @@ fun RenderPage(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Composable
|
||||||
|
@OptIn(ExperimentalFoundationApi::class)
|
||||||
|
private fun LoadedState(
|
||||||
|
state: FeedState.Loaded,
|
||||||
|
pagerStateKey: String?,
|
||||||
|
videoFeedView: NostrVideoFeedViewModel,
|
||||||
|
accountViewModel: AccountViewModel,
|
||||||
|
nav: (String) -> Unit
|
||||||
|
) {
|
||||||
|
val pagerState = if (pagerStateKey != null) {
|
||||||
|
rememberForeverPagerState(pagerStateKey) { state.feed.value.size }
|
||||||
|
} else {
|
||||||
|
rememberPagerState { state.feed.value.size }
|
||||||
|
}
|
||||||
|
|
||||||
|
WatchScrollToTop(videoFeedView, pagerState)
|
||||||
|
|
||||||
|
SlidingCarousel(
|
||||||
|
state.feed,
|
||||||
|
pagerState,
|
||||||
|
accountViewModel,
|
||||||
|
nav
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
@OptIn(ExperimentalFoundationApi::class)
|
@OptIn(ExperimentalFoundationApi::class)
|
||||||
@Composable
|
@Composable
|
||||||
fun SlidingCarousel(
|
fun SlidingCarousel(
|
||||||
@@ -210,7 +223,6 @@ fun SlidingCarousel(
|
|||||||
nav: (String) -> Unit
|
nav: (String) -> Unit
|
||||||
) {
|
) {
|
||||||
VerticalPager(
|
VerticalPager(
|
||||||
pageCount = feed.value.size,
|
|
||||||
state = pagerState,
|
state = pagerState,
|
||||||
beyondBoundsPageCount = 1,
|
beyondBoundsPageCount = 1,
|
||||||
modifier = Modifier.fillMaxSize(1f),
|
modifier = Modifier.fillMaxSize(1f),
|
||||||
|
|||||||
+2
-1
@@ -4,7 +4,7 @@ buildscript {
|
|||||||
ext {
|
ext {
|
||||||
fragment_version = "1.6.1"
|
fragment_version = "1.6.1"
|
||||||
lifecycle_version = '2.6.1'
|
lifecycle_version = '2.6.1'
|
||||||
compose_ui_version = '1.4.3'
|
compose_ui_version = '1.5.0'
|
||||||
nav_version = "2.6.0"
|
nav_version = "2.6.0"
|
||||||
room_version = "2.4.3"
|
room_version = "2.4.3"
|
||||||
accompanist_version = '0.30.1'
|
accompanist_version = '0.30.1'
|
||||||
@@ -12,6 +12,7 @@ buildscript {
|
|||||||
vico_version = '1.7.3'
|
vico_version = '1.7.3'
|
||||||
exoplayer_version = '1.1.0'
|
exoplayer_version = '1.1.0'
|
||||||
media3_version = '1.1.0'
|
media3_version = '1.1.0'
|
||||||
|
core_ktx_version = '1.10.1'
|
||||||
}
|
}
|
||||||
dependencies {
|
dependencies {
|
||||||
classpath 'com.google.gms:google-services:4.3.15'
|
classpath 'com.google.gms:google-services:4.3.15'
|
||||||
|
|||||||
+1
-1
@@ -32,7 +32,7 @@ android {
|
|||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
implementation 'androidx.core:core-ktx:1.9.0'
|
implementation "androidx.core:core-ktx:$core_ktx_version"
|
||||||
|
|
||||||
// @Immutable and @Stable
|
// @Immutable and @Stable
|
||||||
implementation "androidx.compose.runtime:runtime:$compose_ui_version"
|
implementation "androidx.compose.runtime:runtime:$compose_ui_version"
|
||||||
|
|||||||
Reference in New Issue
Block a user