fix: navigation issues

This commit is contained in:
Diego Beraldin 2023-09-09 12:40:25 +02:00
parent 58a65a4b8d
commit a661016e34
31 changed files with 197 additions and 143 deletions

View File

@ -5,6 +5,7 @@ import com.github.diegoberaldin.raccoonforlemmy.core.commonui.communitydetail.Co
import com.github.diegoberaldin.raccoonforlemmy.core.commonui.createcomment.CreateCommentViewModel
import com.github.diegoberaldin.raccoonforlemmy.core.commonui.createpost.CreatePostViewModel
import com.github.diegoberaldin.raccoonforlemmy.core.commonui.instanceinfo.InstanceInfoViewModel
import com.github.diegoberaldin.raccoonforlemmy.core.commonui.navigation.NavigationCoordinator
import com.github.diegoberaldin.raccoonforlemmy.core.commonui.postdetail.PostDetailViewModel
import com.github.diegoberaldin.raccoonforlemmy.core.commonui.userdetail.UserDetailViewModel
import com.github.diegoberaldin.raccoonforlemmy.core.commonui.userdetail.comments.UserCommentsViewModel
@ -15,6 +16,12 @@ import com.github.diegoberaldin.raccoonforlemmy.domain.lemmy.data.UserModel
import org.koin.core.parameter.parametersOf
import org.koin.java.KoinJavaComponent.inject
actual fun getNavigationCoordinator(): NavigationCoordinator {
val res: NavigationCoordinator by inject(NavigationCoordinator::class.java)
return res
}
actual fun getPostDetailViewModel(post: PostModel): PostDetailViewModel {
val res: PostDetailViewModel by inject(
clazz = PostDetailViewModel::class.java,

View File

@ -9,6 +9,8 @@ import com.github.diegoberaldin.raccoonforlemmy.core.commonui.createcomment.Crea
import com.github.diegoberaldin.raccoonforlemmy.core.commonui.createpost.CreatePostViewModel
import com.github.diegoberaldin.raccoonforlemmy.core.commonui.instanceinfo.InstanceInfoMviModel
import com.github.diegoberaldin.raccoonforlemmy.core.commonui.instanceinfo.InstanceInfoViewModel
import com.github.diegoberaldin.raccoonforlemmy.core.commonui.navigation.DefaultNavigationCoordinator
import com.github.diegoberaldin.raccoonforlemmy.core.commonui.navigation.NavigationCoordinator
import com.github.diegoberaldin.raccoonforlemmy.core.commonui.postdetail.PostDetailMviModel
import com.github.diegoberaldin.raccoonforlemmy.core.commonui.postdetail.PostDetailViewModel
import com.github.diegoberaldin.raccoonforlemmy.core.commonui.userdetail.UserDetailMviModel
@ -20,6 +22,9 @@ import com.github.diegoberaldin.raccoonforlemmy.core.commonui.userdetail.posts.U
import org.koin.dsl.module
val commonUiModule = module {
single<NavigationCoordinator> {
DefaultNavigationCoordinator()
}
factory { params ->
PostDetailViewModel(
mvi = DefaultMviModel(PostDetailMviModel.UiState()),

View File

@ -5,6 +5,7 @@ import com.github.diegoberaldin.raccoonforlemmy.core.commonui.communitydetail.Co
import com.github.diegoberaldin.raccoonforlemmy.core.commonui.createcomment.CreateCommentViewModel
import com.github.diegoberaldin.raccoonforlemmy.core.commonui.createpost.CreatePostViewModel
import com.github.diegoberaldin.raccoonforlemmy.core.commonui.instanceinfo.InstanceInfoViewModel
import com.github.diegoberaldin.raccoonforlemmy.core.commonui.navigation.NavigationCoordinator
import com.github.diegoberaldin.raccoonforlemmy.core.commonui.postdetail.PostDetailViewModel
import com.github.diegoberaldin.raccoonforlemmy.core.commonui.userdetail.UserDetailViewModel
import com.github.diegoberaldin.raccoonforlemmy.core.commonui.userdetail.comments.UserCommentsViewModel
@ -13,6 +14,8 @@ import com.github.diegoberaldin.raccoonforlemmy.domain.lemmy.data.CommunityModel
import com.github.diegoberaldin.raccoonforlemmy.domain.lemmy.data.PostModel
import com.github.diegoberaldin.raccoonforlemmy.domain.lemmy.data.UserModel
expect fun getNavigationCoordinator(): NavigationCoordinator
expect fun getPostDetailViewModel(
post: PostModel,
): PostDetailViewModel

View File

@ -0,0 +1,22 @@
package com.github.diegoberaldin.raccoonforlemmy.core.commonui.navigation
import androidx.compose.ui.input.nestedscroll.NestedScrollConnection
import cafe.adriel.voyager.navigator.Navigator
internal class DefaultNavigationCoordinator : NavigationCoordinator {
private var connection: NestedScrollConnection? = null
private var navigator: Navigator? = null
override fun setRootNavigator(value: Navigator?) {
navigator = value
}
override fun getRootNavigator(): Navigator? = navigator
override fun setBottomBarScrollConnection(value: NestedScrollConnection?) {
connection = value
}
override fun getBottomBarScrollConnection() = connection
}

View File

@ -0,0 +1,14 @@
package com.github.diegoberaldin.raccoonforlemmy.core.commonui.navigation
import androidx.compose.ui.input.nestedscroll.NestedScrollConnection
import cafe.adriel.voyager.navigator.Navigator
interface NavigationCoordinator {
fun setRootNavigator(value: Navigator?)
fun getRootNavigator(): Navigator?
fun setBottomBarScrollConnection(value: NestedScrollConnection?)
fun getBottomBarScrollConnection(): NestedScrollConnection?
}

View File

@ -24,6 +24,7 @@ import androidx.compose.ui.graphics.ColorFilter
import androidx.compose.ui.input.nestedscroll.nestedScroll
import cafe.adriel.voyager.core.model.rememberScreenModel
import cafe.adriel.voyager.core.screen.Screen
import cafe.adriel.voyager.navigator.Navigator
import cafe.adriel.voyager.navigator.bottomSheet.LocalBottomSheetNavigator
import com.github.diegoberaldin.racconforlemmy.core.utils.onClick
import com.github.diegoberaldin.raccoonforlemmy.core.appearance.theme.Spacing
@ -110,7 +111,7 @@ class UserDetailScreen(
verticalArrangement = Arrangement.spacedBy(Spacing.s),
horizontalAlignment = Alignment.CenterHorizontally,
) {
when (uiState.currentTab) {
val screen = when (uiState.currentTab) {
UserDetailSection.POSTS -> {
UserDetailPostsScreen(
modifier = Modifier.weight(1f).fillMaxWidth(),
@ -120,7 +121,7 @@ class UserDetailScreen(
onSectionSelected = {
model.reduce(UserDetailMviModel.Intent.SelectTab(it))
}
}.Content()
}
}
UserDetailSection.COMMENTS -> {
@ -132,9 +133,10 @@ class UserDetailScreen(
onSectionSelected = {
model.reduce(UserDetailMviModel.Intent.SelectTab(it))
}
}.Content()
}
}
}
Navigator(screen)
}
}
}

View File

@ -5,6 +5,7 @@ import com.github.diegoberaldin.raccoonforlemmy.core.commonui.communitydetail.Co
import com.github.diegoberaldin.raccoonforlemmy.core.commonui.createcomment.CreateCommentViewModel
import com.github.diegoberaldin.raccoonforlemmy.core.commonui.createpost.CreatePostViewModel
import com.github.diegoberaldin.raccoonforlemmy.core.commonui.instanceinfo.InstanceInfoViewModel
import com.github.diegoberaldin.raccoonforlemmy.core.commonui.navigation.NavigationCoordinator
import com.github.diegoberaldin.raccoonforlemmy.core.commonui.postdetail.PostDetailViewModel
import com.github.diegoberaldin.raccoonforlemmy.core.commonui.userdetail.UserDetailViewModel
import com.github.diegoberaldin.raccoonforlemmy.core.commonui.userdetail.comments.UserCommentsViewModel
@ -16,6 +17,8 @@ import org.koin.core.component.KoinComponent
import org.koin.core.component.inject
import org.koin.core.parameter.parametersOf
actual fun getNavigationCoordinator() = CommonUiViewModelHelper.navigationCoordinator
actual fun getPostDetailViewModel(post: PostModel): PostDetailViewModel =
CommonUiViewModelHelper.getPostDetailModel(post)
@ -48,6 +51,8 @@ actual fun getCreatePostViewModel(communityId: Int): CreatePostViewModel =
object CommonUiViewModelHelper : KoinComponent {
val navigationCoordinator: NavigationCoordinator by inject()
fun getPostDetailModel(post: PostModel): PostDetailViewModel {
val model: PostDetailViewModel by inject(
parameters = { parametersOf(post) },

View File

@ -1,15 +1,10 @@
package com.github.diegoberaldin.raccoonforlemmy.feature.home.di
import com.github.diegoberaldin.raccoonforlemmy.feature.home.postlist.BottomNavBarCoordinator
import com.github.diegoberaldin.raccoonforlemmy.core.commonui.navigation.NavigationCoordinator
import com.github.diegoberaldin.raccoonforlemmy.feature.home.postlist.PostListViewModel
import org.koin.java.KoinJavaComponent.inject
actual fun getHomeScreenModel(): PostListViewModel {
val res: PostListViewModel by inject(PostListViewModel::class.java)
return res
}
actual fun getBottomNavCoordinator(): BottomNavBarCoordinator {
val res: BottomNavBarCoordinator by inject(BottomNavBarCoordinator::class.java)
return res
}
}

View File

@ -3,8 +3,6 @@ package com.github.diegoberaldin.raccoonforlemmy.feature.home.di
import com.github.diegoberaldin.raccoonforlemmy.core.architecture.DefaultMviModel
import com.github.diegoberaldin.raccoonforlemmy.core.commonui.di.commonUiModule
import com.github.diegoberaldin.raccoonforlemmy.domain.lemmy.repository.di.repositoryModule
import com.github.diegoberaldin.raccoonforlemmy.feature.home.postlist.BottomNavBarCoordinator
import com.github.diegoberaldin.raccoonforlemmy.feature.home.postlist.DefaultBottomNavCoordinator
import com.github.diegoberaldin.raccoonforlemmy.feature.home.postlist.PostListMviModel
import com.github.diegoberaldin.raccoonforlemmy.feature.home.postlist.PostListViewModel
import org.koin.dsl.module
@ -25,7 +23,4 @@ val homeTabModule = module {
hapticFeedback = get(),
)
}
single<BottomNavBarCoordinator> {
DefaultBottomNavCoordinator()
}
}

View File

@ -1,8 +1,6 @@
package com.github.diegoberaldin.raccoonforlemmy.feature.home.di
import com.github.diegoberaldin.raccoonforlemmy.feature.home.postlist.BottomNavBarCoordinator
import com.github.diegoberaldin.raccoonforlemmy.core.commonui.navigation.NavigationCoordinator
import com.github.diegoberaldin.raccoonforlemmy.feature.home.postlist.PostListViewModel
expect fun getHomeScreenModel(): PostListViewModel
expect fun getBottomNavCoordinator(): BottomNavBarCoordinator

View File

@ -1,9 +0,0 @@
package com.github.diegoberaldin.raccoonforlemmy.feature.home.postlist
import androidx.compose.ui.input.nestedscroll.NestedScrollConnection
interface BottomNavBarCoordinator {
fun setConnection(value: NestedScrollConnection?)
fun getConnection(): NestedScrollConnection?
}

View File

@ -1,13 +0,0 @@
package com.github.diegoberaldin.raccoonforlemmy.feature.home.postlist
import androidx.compose.ui.input.nestedscroll.NestedScrollConnection
internal class DefaultBottomNavCoordinator : BottomNavBarCoordinator {
private var connection: NestedScrollConnection? = null
override fun setConnection(value: NestedScrollConnection?) {
connection = value
}
override fun getConnection() = connection
}

View File

@ -30,6 +30,7 @@ import androidx.compose.material3.TopAppBarDefaults
import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
@ -37,7 +38,6 @@ import androidx.compose.ui.input.nestedscroll.nestedScroll
import androidx.compose.ui.unit.dp
import cafe.adriel.voyager.core.model.rememberScreenModel
import cafe.adriel.voyager.core.screen.Screen
import cafe.adriel.voyager.navigator.LocalNavigator
import cafe.adriel.voyager.navigator.bottomSheet.LocalBottomSheetNavigator
import com.github.diegoberaldin.racconforlemmy.core.utils.onClick
import com.github.diegoberaldin.raccoonforlemmy.core.appearance.theme.Spacing
@ -46,11 +46,11 @@ import com.github.diegoberaldin.raccoonforlemmy.core.commonui.communitydetail.Co
import com.github.diegoberaldin.raccoonforlemmy.core.commonui.components.PostCard
import com.github.diegoberaldin.raccoonforlemmy.core.commonui.components.SwipeableCard
import com.github.diegoberaldin.raccoonforlemmy.core.commonui.createcomment.CreateCommentScreen
import com.github.diegoberaldin.raccoonforlemmy.core.commonui.di.getNavigationCoordinator
import com.github.diegoberaldin.raccoonforlemmy.core.commonui.modals.ListingTypeBottomSheet
import com.github.diegoberaldin.raccoonforlemmy.core.commonui.modals.SortBottomSheet
import com.github.diegoberaldin.raccoonforlemmy.core.commonui.postdetail.PostDetailScreen
import com.github.diegoberaldin.raccoonforlemmy.core.commonui.userdetail.UserDetailScreen
import com.github.diegoberaldin.raccoonforlemmy.feature.home.di.getBottomNavCoordinator
import com.github.diegoberaldin.raccoonforlemmy.feature.home.di.getHomeScreenModel
class PostListScreen : Screen {
@ -62,9 +62,9 @@ class PostListScreen : Screen {
model.bindToLifecycle(key)
val uiState by model.uiState.collectAsState()
val bottomSheetNavigator = LocalBottomSheetNavigator.current
val navigator = LocalNavigator.current?.parent ?: throw Exception("Navigator not found")
val scrollBehavior = TopAppBarDefaults.enterAlwaysScrollBehavior()
val bottomNavCoordinator = getBottomNavCoordinator()
val bottomNavCoordinator = remember { getNavigationCoordinator() }
val navigator = remember { getNavigationCoordinator().getRootNavigator() }
Scaffold(
modifier = Modifier.padding(Spacing.xxs),
@ -107,16 +107,13 @@ class PostListScreen : Screen {
model.reduce(PostListMviModel.Intent.Refresh)
})
Box(
modifier = Modifier
.padding(padding)
.nestedScroll(scrollBehavior.nestedScrollConnection)
.let {
val connection = bottomNavCoordinator.getConnection()
modifier = Modifier.padding(padding)
.nestedScroll(scrollBehavior.nestedScrollConnection).let {
val connection = bottomNavCoordinator.getBottomBarScrollConnection()
if (connection != null) {
it.nestedScroll(connection)
} else it
}
.pullRefresh(pullRefreshState),
}.pullRefresh(pullRefreshState),
) {
LazyColumn(
modifier = Modifier.fillMaxSize(),
@ -183,22 +180,21 @@ class PostListScreen : Screen {
)
},
content = {
PostCard(
modifier = Modifier.onClick {
navigator.push(
PostDetailScreen(
post = post,
).apply {
onBack = {
navigator.pop()
}
},
)
},
PostCard(modifier = Modifier.onClick {
navigator?.push(
PostDetailScreen(
post = post,
).apply {
onBack = {
navigator.pop()
}
},
)
},
post = post,
blurNsfw = uiState.blurNsfw,
onOpenCommunity = { community ->
navigator.push(
navigator?.push(
CommunityDetailScreen(
community = community,
).apply {
@ -209,7 +205,7 @@ class PostListScreen : Screen {
)
},
onOpenCreator = { user ->
navigator.push(
navigator?.push(
UserDetailScreen(
user = user,
).apply {
@ -245,16 +241,13 @@ class PostListScreen : Screen {
},
onReply = {
bottomSheetNavigator.show(
CreateCommentScreen(
originalPost = post,
CreateCommentScreen(originalPost = post,
onCommentCreated = {
bottomSheetNavigator.hide()
model.reduce(PostListMviModel.Intent.Refresh)
}
)
})
)
}
)
})
},
)
}

View File

@ -8,6 +8,7 @@ import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember
import androidx.compose.ui.graphics.vector.rememberVectorPainter
import androidx.compose.ui.input.nestedscroll.NestedScrollConnection
import cafe.adriel.voyager.navigator.Navigator
import cafe.adriel.voyager.navigator.tab.Tab
import cafe.adriel.voyager.navigator.tab.TabOptions
import com.github.diegoberaldin.raccoonforlemmy.feature.home.postlist.PostListScreen
@ -36,6 +37,6 @@ object HomeTab : Tab {
@Composable
override fun Content() {
PostListScreen().Content()
Navigator(PostListScreen())
}
}

View File

@ -1,16 +1,12 @@
package com.github.diegoberaldin.raccoonforlemmy.feature.home.di
import com.github.diegoberaldin.raccoonforlemmy.feature.home.postlist.BottomNavBarCoordinator
import com.github.diegoberaldin.raccoonforlemmy.core.commonui.navigation.NavigationCoordinator
import com.github.diegoberaldin.raccoonforlemmy.feature.home.postlist.PostListViewModel
import org.koin.core.component.KoinComponent
import org.koin.core.component.inject
actual fun getHomeScreenModel() = HomeScreenModelHelper.model
actual fun getBottomNavCoordinator() = HomeScreenModelHelper.bottomNavBarCoordinator
object HomeScreenModelHelper : KoinComponent {
val model: PostListViewModel by inject()
val bottomNavBarCoordinator: BottomNavBarCoordinator by inject()
}

View File

@ -22,6 +22,7 @@ import androidx.compose.ui.graphics.ColorFilter
import androidx.compose.ui.input.nestedscroll.nestedScroll
import cafe.adriel.voyager.core.model.rememberScreenModel
import cafe.adriel.voyager.core.screen.Screen
import cafe.adriel.voyager.navigator.Navigator
import cafe.adriel.voyager.navigator.bottomSheet.LocalBottomSheetNavigator
import com.github.diegoberaldin.racconforlemmy.core.utils.onClick
import com.github.diegoberaldin.raccoonforlemmy.core.appearance.theme.Spacing
@ -132,16 +133,19 @@ class InboxScreen : Screen {
model.reduce(InboxMviModel.Intent.ChangeSection(section))
},
)
when (uiState.section) {
val screen = when (uiState.section) {
InboxSection.REPLIES -> InboxRepliesScreen(
parentModel = model,
).Content()
)
InboxSection.MENTIONS -> InboxMentionsScreen(
parentModel = model,
).Content()
)
InboxSection.MESSAGES -> Unit
InboxSection.MESSAGES -> null
}
if (screen != null) {
Navigator(screen)
}
}
}

View File

@ -28,18 +28,19 @@ import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.unit.dp
import cafe.adriel.voyager.core.model.rememberScreenModel
import cafe.adriel.voyager.core.screen.Screen
import cafe.adriel.voyager.navigator.LocalNavigator
import com.github.diegoberaldin.raccoonforlemmy.core.appearance.theme.Spacing
import com.github.diegoberaldin.raccoonforlemmy.core.architecture.bindToLifecycle
import com.github.diegoberaldin.raccoonforlemmy.core.commonui.communitydetail.CommunityDetailScreen
import com.github.diegoberaldin.raccoonforlemmy.core.commonui.components.InboxMentionCard
import com.github.diegoberaldin.raccoonforlemmy.core.commonui.components.SwipeableCard
import com.github.diegoberaldin.raccoonforlemmy.core.commonui.di.getNavigationCoordinator
import com.github.diegoberaldin.raccoonforlemmy.core.commonui.postdetail.PostDetailScreen
import com.github.diegoberaldin.raccoonforlemmy.core.commonui.userdetail.UserDetailScreen
import com.github.diegoberaldin.raccoonforlemmy.feature.inbox.di.getInboxMentionsViewModel
@ -60,7 +61,7 @@ class InboxMentionsScreen(
model.bindToLifecycle(key)
val uiState by model.uiState.collectAsState()
val parentUiState by parentModel.uiState.collectAsState()
val navigator = LocalNavigator.current?.parent ?: throw Exception("Navigator not found")
val navigator = remember { getNavigationCoordinator().getRootNavigator() }
LaunchedEffect(parentModel) {
parentModel.uiState.map { it.unreadOnly }.distinctUntilChanged().onEach {
@ -151,7 +152,7 @@ class InboxMentionsScreen(
InboxMentionCard(
mention = mention,
onOpenPost = { post ->
navigator.push(
navigator?.push(
PostDetailScreen(
post = post,
).apply {
@ -162,7 +163,7 @@ class InboxMentionsScreen(
)
},
onOpenCreator = { user ->
navigator.push(
navigator?.push(
UserDetailScreen(
user = user,
).apply {
@ -173,7 +174,7 @@ class InboxMentionsScreen(
)
},
onOpenCommunity = { community ->
navigator.push(
navigator?.push(
CommunityDetailScreen(
community = community,
).apply {

View File

@ -28,18 +28,19 @@ import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.unit.dp
import cafe.adriel.voyager.core.model.rememberScreenModel
import cafe.adriel.voyager.core.screen.Screen
import cafe.adriel.voyager.navigator.LocalNavigator
import com.github.diegoberaldin.raccoonforlemmy.core.appearance.theme.Spacing
import com.github.diegoberaldin.raccoonforlemmy.core.architecture.bindToLifecycle
import com.github.diegoberaldin.raccoonforlemmy.core.commonui.communitydetail.CommunityDetailScreen
import com.github.diegoberaldin.raccoonforlemmy.core.commonui.components.InboxMentionCard
import com.github.diegoberaldin.raccoonforlemmy.core.commonui.components.SwipeableCard
import com.github.diegoberaldin.raccoonforlemmy.core.commonui.di.getNavigationCoordinator
import com.github.diegoberaldin.raccoonforlemmy.core.commonui.postdetail.PostDetailScreen
import com.github.diegoberaldin.raccoonforlemmy.core.commonui.userdetail.UserDetailScreen
import com.github.diegoberaldin.raccoonforlemmy.feature.inbox.di.getInboxRepliesViewModel
@ -60,7 +61,7 @@ class InboxRepliesScreen(
model.bindToLifecycle(key)
val uiState by model.uiState.collectAsState()
val parentUiState by parentModel.uiState.collectAsState()
val navigator = LocalNavigator.current?.parent ?: throw Exception("Navigator not found")
val navigator = remember { getNavigationCoordinator().getRootNavigator() }
LaunchedEffect(parentModel) {
parentModel.uiState.map { it.unreadOnly }.distinctUntilChanged().onEach {
@ -151,7 +152,7 @@ class InboxRepliesScreen(
InboxMentionCard(
mention = mention,
onOpenPost = { post ->
navigator.push(
navigator?.push(
PostDetailScreen(
post = post,
).apply {
@ -162,7 +163,7 @@ class InboxRepliesScreen(
)
},
onOpenCreator = { user ->
navigator.push(
navigator?.push(
UserDetailScreen(
user = user,
).apply {
@ -173,7 +174,7 @@ class InboxRepliesScreen(
)
},
onOpenCommunity = { community ->
navigator.push(
navigator?.push(
CommunityDetailScreen(
community = community,
).apply {

View File

@ -40,6 +40,6 @@ object InboxTab : Tab {
@Composable
override fun Content() {
InboxScreen().Content()
Navigator(InboxScreen())
}
}

View File

@ -22,6 +22,7 @@ import androidx.compose.ui.graphics.ColorFilter
import androidx.compose.ui.input.nestedscroll.nestedScroll
import cafe.adriel.voyager.core.model.rememberScreenModel
import cafe.adriel.voyager.core.screen.Screen
import cafe.adriel.voyager.navigator.Navigator
import cafe.adriel.voyager.navigator.bottomSheet.LocalBottomSheetNavigator
import com.github.diegoberaldin.racconforlemmy.core.utils.onClick
import com.github.diegoberaldin.raccoonforlemmy.core.appearance.theme.Spacing
@ -84,7 +85,7 @@ internal class ProfileContentScreen : Screen {
) {
if (!uiState.initial) {
val user = uiState.currentUser
if (user == null) {
val screen = if (user == null) {
ProfileNotLoggedContent().apply {
onLogin = {
bottomSheetNavigator.show(
@ -95,12 +96,13 @@ internal class ProfileContentScreen : Screen {
),
)
}
}.Content()
}
} else {
ProfileLoggedScreen(
user = user,
).Content()
)
}
Navigator(screen)
}
}
}

View File

@ -6,12 +6,16 @@ import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import cafe.adriel.voyager.core.model.rememberScreenModel
import cafe.adriel.voyager.core.screen.Screen
import cafe.adriel.voyager.navigator.CurrentScreen
import cafe.adriel.voyager.navigator.LocalNavigator
import cafe.adriel.voyager.navigator.Navigator
import com.github.diegoberaldin.raccoonforlemmy.core.appearance.theme.Spacing
import com.github.diegoberaldin.raccoonforlemmy.core.architecture.bindToLifecycle
import com.github.diegoberaldin.raccoonforlemmy.domain.lemmy.data.UserModel
@ -19,6 +23,10 @@ import com.github.diegoberaldin.raccoonforlemmy.feature.profile.content.logged.c
import com.github.diegoberaldin.raccoonforlemmy.feature.profile.content.logged.posts.ProfilePostsScreen
import com.github.diegoberaldin.raccoonforlemmy.feature.profile.content.logged.saved.ProfileSavedScreen
import com.github.diegoberaldin.raccoonforlemmy.feature.profile.di.getProfileLoggedViewModel
import kotlinx.coroutines.flow.distinctUntilChanged
import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.flow.onEach
internal class ProfileLoggedScreen(
private val user: UserModel,
@ -33,40 +41,52 @@ internal class ProfileLoggedScreen(
) {
val model = rememberScreenModel { getProfileLoggedViewModel() }
model.bindToLifecycle(key)
val uiState by model.uiState.collectAsState()
when (uiState.currentTab) {
ProfileLoggedSection.POSTS -> {
ProfilePostsScreen(
modifier = Modifier.weight(1f).fillMaxWidth(),
user = user,
).apply {
onSectionSelected = {
model.reduce(ProfileLoggedMviModel.Intent.SelectTab(it))
}
}.Content()
}
val screens = listOf(
ProfilePostsScreen(
modifier = Modifier.weight(1f).fillMaxWidth(),
user = user,
).apply {
onSectionSelected = {
model.reduce(ProfileLoggedMviModel.Intent.SelectTab(it))
}
},
ProfileCommentsScreen(
modifier = Modifier.weight(1f).fillMaxWidth(),
user = user,
).apply {
onSectionSelected = {
model.reduce(ProfileLoggedMviModel.Intent.SelectTab(it))
}
},
ProfileSavedScreen(
modifier = Modifier.weight(1f).fillMaxWidth(),
user = user,
).apply {
onSectionSelected = {
model.reduce(ProfileLoggedMviModel.Intent.SelectTab(it))
}
},
)
ProfileLoggedSection.COMMENTS -> {
ProfileCommentsScreen(
modifier = Modifier.weight(1f).fillMaxWidth(),
user = user,
).apply {
onSectionSelected = {
model.reduce(ProfileLoggedMviModel.Intent.SelectTab(it))
}
}.Content()
}
Navigator(screens) {
CurrentScreen()
ProfileLoggedSection.SAVED -> {
ProfileSavedScreen(
modifier = Modifier.weight(1f).fillMaxWidth(),
user = user,
).apply {
onSectionSelected = {
model.reduce(ProfileLoggedMviModel.Intent.SelectTab(it))
}
}.Content()
val navigator = LocalNavigator.current
LaunchedEffect(model) {
model.uiState.map { it.currentTab }
.distinctUntilChanged()
.onEach {
val index = when (it) {
ProfileLoggedSection.POSTS -> 0
ProfileLoggedSection.COMMENTS -> 1
ProfileLoggedSection.SAVED -> 2
}
navigator?.apply {
popUntilRoot()
push(screens[index])
}
}.launchIn(this)
}
}
}

View File

@ -20,13 +20,13 @@ import androidx.compose.material3.MaterialTheme
import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.graphicsLayer
import androidx.compose.ui.unit.dp
import cafe.adriel.voyager.core.model.rememberScreenModel
import cafe.adriel.voyager.core.screen.Screen
import cafe.adriel.voyager.navigator.LocalNavigator
import com.github.diegoberaldin.racconforlemmy.core.utils.toLocalPixel
import com.github.diegoberaldin.raccoonforlemmy.core.appearance.theme.Spacing
import com.github.diegoberaldin.raccoonforlemmy.core.architecture.bindToLifecycle
@ -34,6 +34,7 @@ import com.github.diegoberaldin.raccoonforlemmy.core.commonui.communitydetail.Co
import com.github.diegoberaldin.raccoonforlemmy.core.commonui.components.SectionSelector
import com.github.diegoberaldin.raccoonforlemmy.core.commonui.components.UserCounters
import com.github.diegoberaldin.raccoonforlemmy.core.commonui.components.UserHeader
import com.github.diegoberaldin.raccoonforlemmy.core.commonui.di.getNavigationCoordinator
import com.github.diegoberaldin.raccoonforlemmy.domain.lemmy.data.UserModel
import com.github.diegoberaldin.raccoonforlemmy.feature.profile.content.logged.ProfileLoggedSection
import com.github.diegoberaldin.raccoonforlemmy.feature.profile.di.getProfilePostsViewModel
@ -57,7 +58,7 @@ internal class ProfilePostsScreen(
}
model.bindToLifecycle(key)
val uiState by model.uiState.collectAsState()
val navigator = LocalNavigator.current?.parent ?: throw Exception("Navigator not found")
val navigator = remember { getNavigationCoordinator().getRootNavigator() }
val pullRefreshState = rememberPullRefreshState(uiState.refreshing, {
model.reduce(ProfilePostsMviModel.Intent.Refresh)
@ -103,7 +104,7 @@ internal class ProfilePostsScreen(
ProfilePostCard(
post = post,
onOpenCommunity = { community ->
navigator.push(
navigator?.push(
CommunityDetailScreen(
community = community,
).apply {

View File

@ -20,13 +20,13 @@ import androidx.compose.material3.MaterialTheme
import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.graphicsLayer
import androidx.compose.ui.unit.dp
import cafe.adriel.voyager.core.model.rememberScreenModel
import cafe.adriel.voyager.core.screen.Screen
import cafe.adriel.voyager.navigator.LocalNavigator
import com.github.diegoberaldin.racconforlemmy.core.utils.toLocalPixel
import com.github.diegoberaldin.raccoonforlemmy.core.appearance.theme.Spacing
import com.github.diegoberaldin.raccoonforlemmy.core.architecture.bindToLifecycle
@ -34,6 +34,7 @@ import com.github.diegoberaldin.raccoonforlemmy.core.commonui.communitydetail.Co
import com.github.diegoberaldin.raccoonforlemmy.core.commonui.components.SectionSelector
import com.github.diegoberaldin.raccoonforlemmy.core.commonui.components.UserCounters
import com.github.diegoberaldin.raccoonforlemmy.core.commonui.components.UserHeader
import com.github.diegoberaldin.raccoonforlemmy.core.commonui.di.getNavigationCoordinator
import com.github.diegoberaldin.raccoonforlemmy.domain.lemmy.data.UserModel
import com.github.diegoberaldin.raccoonforlemmy.feature.profile.content.logged.ProfileLoggedSection
import com.github.diegoberaldin.raccoonforlemmy.feature.profile.content.logged.posts.ProfilePostCard
@ -60,7 +61,7 @@ internal class ProfileSavedScreen(
}
model.bindToLifecycle(key)
val uiState by model.uiState.collectAsState()
val navigator = LocalNavigator.current?.parent ?: throw Exception("Navigator not found")
val navigator = remember { getNavigationCoordinator().getRootNavigator() }
val pullRefreshState = rememberPullRefreshState(uiState.refreshing, {
model.reduce(ProfilePostsMviModel.Intent.Refresh)
@ -106,7 +107,7 @@ internal class ProfileSavedScreen(
ProfilePostCard(
post = post,
onOpenCommunity = { community ->
navigator.push(
navigator?.push(
CommunityDetailScreen(
community = community,
).apply {

View File

@ -32,6 +32,6 @@ object ProfileTab : Tab {
@Composable
override fun Content() {
ProfileContentScreen().Content()
Navigator(ProfileContentScreen())
}
}

View File

@ -22,7 +22,7 @@ interface CommunityListMviModel :
val isLogged: Boolean = false,
val instance: String = "",
val searchText: String = "",
val listingType: ListingType = ListingType.All,
val listingType: ListingType = ListingType.Local,
val sortType: SortType = SortType.Active,
val communities: List<CommunityModel> = emptyList(),
)

View File

@ -41,7 +41,6 @@ import androidx.compose.ui.unit.Density
import androidx.compose.ui.unit.dp
import cafe.adriel.voyager.core.model.rememberScreenModel
import cafe.adriel.voyager.core.screen.Screen
import cafe.adriel.voyager.navigator.LocalNavigator
import cafe.adriel.voyager.navigator.bottomSheet.LocalBottomSheetNavigator
import com.github.diegoberaldin.racconforlemmy.core.utils.onClick
import com.github.diegoberaldin.raccoonforlemmy.core.appearance.di.getThemeRepository
@ -49,6 +48,7 @@ import com.github.diegoberaldin.raccoonforlemmy.core.appearance.theme.Spacing
import com.github.diegoberaldin.raccoonforlemmy.core.architecture.bindToLifecycle
import com.github.diegoberaldin.raccoonforlemmy.core.commonui.communitydetail.CommunityDetailScreen
import com.github.diegoberaldin.raccoonforlemmy.core.commonui.components.CommunityItem
import com.github.diegoberaldin.raccoonforlemmy.core.commonui.di.getNavigationCoordinator
import com.github.diegoberaldin.raccoonforlemmy.core.commonui.modals.ListingTypeBottomSheet
import com.github.diegoberaldin.raccoonforlemmy.core.commonui.modals.SortBottomSheet
import com.github.diegoberaldin.raccoonforlemmy.feature.search.di.getSearchScreenModel
@ -56,13 +56,14 @@ import com.github.diegoberaldin.raccoonforlemmy.resources.MR
import dev.icerock.moko.resources.compose.stringResource
class CommunityListScreen : Screen {
@OptIn(ExperimentalMaterial3Api::class, ExperimentalMaterialApi::class)
@Composable
override fun Content() {
val model = rememberScreenModel { getSearchScreenModel() }
model.bindToLifecycle(key)
val uiState by model.uiState.collectAsState()
val navigator = LocalNavigator.current?.parent ?: throw Exception("Navigator not found")
val navigator = remember { getNavigationCoordinator().getRootNavigator() }
val bottomNavigator = LocalBottomSheetNavigator.current
val scrollBehavior = TopAppBarDefaults.enterAlwaysScrollBehavior()
@ -158,7 +159,7 @@ class CommunityListScreen : Screen {
) {
CommunityItem(
modifier = Modifier.fillMaxWidth().onClick {
navigator.push(
navigator?.push(
CommunityDetailScreen(
community = community,
).apply {

View File

@ -35,6 +35,6 @@ object SearchTab : Tab {
@Composable
override fun Content() {
CommunityListScreen().Content()
Navigator(CommunityListScreen())
}
}

View File

@ -37,6 +37,6 @@ object SettingsTab : Tab {
@OptIn(ExperimentalMaterial3Api::class)
@Composable
override fun Content() {
SettingsScreen().Content()
Navigator(SettingsScreen())
}
}

View File

@ -59,6 +59,7 @@ kotlin {
implementation(projects.coreAppearance)
implementation(projects.corePreferences)
implementation(projects.coreApi)
implementation(projects.coreCommonui)
implementation(projects.coreNotifications)
implementation(projects.coreCrashreport)
implementation(projects.domainIdentity)

View File

@ -8,11 +8,14 @@ import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope
import cafe.adriel.voyager.navigator.CurrentScreen
import cafe.adriel.voyager.navigator.LocalNavigator
import cafe.adriel.voyager.navigator.Navigator
import cafe.adriel.voyager.navigator.bottomSheet.BottomSheetNavigator
import com.github.diegoberaldin.raccoonforlemmy.core.appearance.data.toThemeState
import com.github.diegoberaldin.raccoonforlemmy.core.appearance.di.getThemeRepository
import com.github.diegoberaldin.raccoonforlemmy.core.appearance.theme.AppTheme
import com.github.diegoberaldin.raccoonforlemmy.core.commonui.di.getNavigationCoordinator
import com.github.diegoberaldin.raccoonforlemmy.core.preferences.KeyStoreKeys
import com.github.diegoberaldin.raccoonforlemmy.core.preferences.di.getTemporaryKeyStore
import com.github.diegoberaldin.raccoonforlemmy.domain.identity.di.getApiConfigurationRepository
@ -63,6 +66,7 @@ fun App() {
themeRepository.changeDynamicColors(dynamicColors)
}
val useDynamicColors by themeRepository.dynamicColors.collectAsState()
val navigationCoordinator = remember { getNavigationCoordinator() }
AppTheme(
theme = currentTheme,
@ -73,7 +77,11 @@ fun App() {
LaunchedEffect(lang) {}
BottomSheetNavigator {
Navigator(MainScreen())
Navigator(MainScreen()) {
val navigator = LocalNavigator.current
navigationCoordinator.setRootNavigator(navigator)
CurrentScreen()
}
}
}
}

View File

@ -25,7 +25,7 @@ import com.github.diegoberaldin.raccoonforlemmy.core.appearance.di.getThemeRepos
import com.github.diegoberaldin.raccoonforlemmy.core.appearance.theme.md_theme_black_surface
import com.github.diegoberaldin.raccoonforlemmy.core.appearance.theme.md_theme_dark_surface
import com.github.diegoberaldin.raccoonforlemmy.core.appearance.theme.md_theme_light_surface
import com.github.diegoberaldin.raccoonforlemmy.feature.home.di.getBottomNavCoordinator
import com.github.diegoberaldin.raccoonforlemmy.core.commonui.di.getNavigationCoordinator
import com.github.diegoberaldin.raccoonforlemmy.feature.home.ui.HomeTab
import com.github.diegoberaldin.raccoonforlemmy.feature.inbox.ui.InboxTab
import com.github.diegoberaldin.raccoonforlemmy.feature.profile.ui.ProfileTab
@ -52,9 +52,9 @@ internal class MainScreen : Screen {
}
}
}
val bottomNavBarCoordinator = remember { getBottomNavCoordinator() }
val bottomNavBarCoordinator = remember { getNavigationCoordinator() }
LaunchedEffect(bottomNavBarCoordinator) {
bottomNavBarCoordinator.setConnection(bottomBarNestedScrollConnection)
bottomNavBarCoordinator.setBottomBarScrollConnection(bottomBarNestedScrollConnection)
}
TabNavigator(HomeTab) {