mirror of
https://github.com/LiveFastEatTrashRaccoon/RaccoonForLemmy.git
synced 2025-02-09 07:48:44 +01:00
refactor: modularization home, search and settings features (#326)
* refactor: add unit-postlist module * refactor: add unit-managesubscriptions and unit-multicommunity modules * refactor: add unit-about module
This commit is contained in:
parent
072d1420d6
commit
a79b29fe63
@ -4,7 +4,6 @@ import androidx.compose.ui.input.nestedscroll.NestedScrollConnection
|
||||
import cafe.adriel.voyager.core.screen.Screen
|
||||
import cafe.adriel.voyager.navigator.Navigator
|
||||
import cafe.adriel.voyager.navigator.bottomSheet.BottomSheetNavigator
|
||||
import cafe.adriel.voyager.navigator.tab.Tab
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
import kotlinx.coroutines.Job
|
||||
import kotlinx.coroutines.SupervisorJob
|
||||
@ -16,7 +15,7 @@ import kotlinx.coroutines.launch
|
||||
|
||||
internal class DefaultNavigationCoordinator : NavigationCoordinator {
|
||||
|
||||
override val onDoubleTabSelection = MutableSharedFlow<Tab>()
|
||||
override val onDoubleTabSelection = MutableSharedFlow<TabNavigationSection>()
|
||||
override val deepLinkUrl = MutableSharedFlow<String>()
|
||||
override val inboxUnread = MutableStateFlow(0)
|
||||
override val canPop = MutableStateFlow(false)
|
||||
@ -26,7 +25,7 @@ internal class DefaultNavigationCoordinator : NavigationCoordinator {
|
||||
private var connection: NestedScrollConnection? = null
|
||||
private var navigator: Navigator? = null
|
||||
private var bottomNavigator: BottomSheetNavigator? = null
|
||||
private var currentTab: Tab? = null
|
||||
private var currentTab: TabNavigationSection? = null
|
||||
private val scope = CoroutineScope(SupervisorJob())
|
||||
private var canGoBackCallback: (() -> Boolean)? = null
|
||||
private var job: Job? = null
|
||||
@ -48,12 +47,12 @@ internal class DefaultNavigationCoordinator : NavigationCoordinator {
|
||||
|
||||
override fun getBottomBarScrollConnection() = connection
|
||||
|
||||
override fun setCurrentSection(tab: Tab) {
|
||||
override fun setCurrentSection(section: TabNavigationSection) {
|
||||
val oldTab = currentTab
|
||||
currentTab = tab
|
||||
if (tab == oldTab) {
|
||||
currentTab = section
|
||||
if (section == oldTab) {
|
||||
scope.launch {
|
||||
onDoubleTabSelection.emit(tab)
|
||||
onDoubleTabSelection.emit(section)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -5,21 +5,28 @@ import androidx.compose.ui.input.nestedscroll.NestedScrollConnection
|
||||
import cafe.adriel.voyager.core.screen.Screen
|
||||
import cafe.adriel.voyager.navigator.Navigator
|
||||
import cafe.adriel.voyager.navigator.bottomSheet.BottomSheetNavigator
|
||||
import cafe.adriel.voyager.navigator.tab.Tab
|
||||
import kotlinx.coroutines.flow.Flow
|
||||
import kotlinx.coroutines.flow.StateFlow
|
||||
|
||||
sealed interface TabNavigationSection {
|
||||
data object Home : TabNavigationSection
|
||||
data object Explore : TabNavigationSection
|
||||
data object Profile : TabNavigationSection
|
||||
data object Inbox : TabNavigationSection
|
||||
data object Settings : TabNavigationSection
|
||||
}
|
||||
|
||||
@Stable
|
||||
interface NavigationCoordinator {
|
||||
|
||||
val onDoubleTabSelection: Flow<Tab>
|
||||
val onDoubleTabSelection: Flow<TabNavigationSection>
|
||||
val inboxUnread: StateFlow<Int>
|
||||
val deepLinkUrl: Flow<String?>
|
||||
val canPop: StateFlow<Boolean>
|
||||
val exitMessageVisible: StateFlow<Boolean>
|
||||
val bottomSheetGesturesEnabled: StateFlow<Boolean>
|
||||
|
||||
fun setCurrentSection(tab: Tab)
|
||||
fun setCurrentSection(section: TabNavigationSection)
|
||||
fun submitDeeplink(url: String)
|
||||
fun setRootNavigator(value: Navigator?)
|
||||
fun setCanGoBackCallback(value: (() -> Boolean)?)
|
||||
|
@ -52,12 +52,13 @@ kotlin {
|
||||
implementation(projects.coreCommonui.components)
|
||||
implementation(projects.coreCommonui.lemmyui)
|
||||
implementation(projects.coreCommonui.modals)
|
||||
implementation(projects.coreCommonui.detailopenerApi)
|
||||
implementation(projects.unitZoomableimage)
|
||||
implementation(projects.unitWeb)
|
||||
implementation(projects.unitCreatereport)
|
||||
implementation(projects.unitCreatecomment)
|
||||
implementation(projects.unitCreatepost)
|
||||
implementation(projects.coreCommonui.detailopenerApi)
|
||||
implementation(projects.unitPostlist)
|
||||
implementation(projects.coreNotifications)
|
||||
|
||||
implementation(projects.domainIdentity)
|
||||
|
@ -1,27 +1,10 @@
|
||||
package com.github.diegoberaldin.raccoonforlemmy.feature.home.di
|
||||
|
||||
import com.github.diegoberaldin.raccoonforlemmy.core.architecture.DefaultMviModel
|
||||
import com.github.diegoberaldin.raccoonforlemmy.feature.home.postlist.PostListMviModel
|
||||
import com.github.diegoberaldin.raccoonforlemmy.feature.home.postlist.PostListViewModel
|
||||
import com.github.diegoberaldin.raccoonforlemmy.unit.postlist.di.postListModule
|
||||
import org.koin.dsl.module
|
||||
|
||||
val homeTabModule = module {
|
||||
factory<PostListMviModel> {
|
||||
PostListViewModel(
|
||||
mvi = DefaultMviModel(PostListMviModel.UiState()),
|
||||
postRepository = get(),
|
||||
apiConfigurationRepository = get(),
|
||||
identityRepository = get(),
|
||||
siteRepository = get(),
|
||||
themeRepository = get(),
|
||||
settingsRepository = get(),
|
||||
shareHelper = get(),
|
||||
notificationCenter = get(),
|
||||
hapticFeedback = get(),
|
||||
zombieModeHelper = get(),
|
||||
imagePreloadManager = get(),
|
||||
contentResetCoordinator = get(),
|
||||
getSortTypesUseCase = get(),
|
||||
)
|
||||
}
|
||||
includes(
|
||||
postListModule,
|
||||
)
|
||||
}
|
||||
|
@ -1,5 +0,0 @@
|
||||
package com.github.diegoberaldin.raccoonforlemmy.feature.home.di
|
||||
|
||||
import com.github.diegoberaldin.raccoonforlemmy.feature.home.postlist.PostListMviModel
|
||||
|
||||
expect fun getHomeScreenModel(): PostListMviModel
|
@ -10,10 +10,10 @@ import androidx.compose.ui.graphics.vector.rememberVectorPainter
|
||||
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
|
||||
import com.github.diegoberaldin.raccoonforlemmy.resources.MR
|
||||
import com.github.diegoberaldin.raccoonforlemmy.resources.di.getLanguageRepository
|
||||
import com.github.diegoberaldin.raccoonforlemmy.resources.di.staticString
|
||||
import com.github.diegoberaldin.raccoonforlemmy.unit.postlist.PostListScreen
|
||||
import dev.icerock.moko.resources.desc.desc
|
||||
|
||||
object HomeTab : Tab {
|
||||
|
@ -1,11 +0,0 @@
|
||||
package com.github.diegoberaldin.raccoonforlemmy.feature.home.di
|
||||
|
||||
import com.github.diegoberaldin.raccoonforlemmy.feature.home.postlist.PostListMviModel
|
||||
import org.koin.core.component.KoinComponent
|
||||
import org.koin.core.component.inject
|
||||
|
||||
actual fun getHomeScreenModel(): PostListMviModel = HomeScreenModelHelper.model
|
||||
|
||||
object HomeScreenModelHelper : KoinComponent {
|
||||
val model: PostListMviModel by inject()
|
||||
}
|
@ -49,11 +49,11 @@ import com.github.diegoberaldin.raccoonforlemmy.core.commonui.lemmyui.InboxCardP
|
||||
import com.github.diegoberaldin.raccoonforlemmy.core.commonui.lemmyui.InboxCardType
|
||||
import com.github.diegoberaldin.raccoonforlemmy.core.commonui.lemmyui.Option
|
||||
import com.github.diegoberaldin.raccoonforlemmy.core.commonui.lemmyui.OptionId
|
||||
import com.github.diegoberaldin.raccoonforlemmy.core.navigation.TabNavigationSection
|
||||
import com.github.diegoberaldin.raccoonforlemmy.core.navigation.di.getNavigationCoordinator
|
||||
import com.github.diegoberaldin.raccoonforlemmy.core.utils.compose.rememberCallback
|
||||
import com.github.diegoberaldin.raccoonforlemmy.core.utils.compose.rememberCallbackArgs
|
||||
import com.github.diegoberaldin.raccoonforlemmy.feature.inbox.di.getInboxMentionsViewModel
|
||||
import com.github.diegoberaldin.raccoonforlemmy.feature.inbox.ui.InboxTab
|
||||
import com.github.diegoberaldin.raccoonforlemmy.resources.MR
|
||||
import com.github.diegoberaldin.raccoonforlemmy.unit.zoomableimage.ZoomableImageScreen
|
||||
import dev.icerock.moko.resources.compose.stringResource
|
||||
@ -78,8 +78,8 @@ class InboxMentionsScreen : Tab {
|
||||
val detailOpener = remember { getDetailOpener() }
|
||||
|
||||
LaunchedEffect(navigationCoordinator) {
|
||||
navigationCoordinator.onDoubleTabSelection.onEach {
|
||||
if (it == InboxTab) {
|
||||
navigationCoordinator.onDoubleTabSelection.onEach { section ->
|
||||
if (section == TabNavigationSection.Inbox) {
|
||||
lazyListState.scrollToItem(0)
|
||||
}
|
||||
}.launchIn(this)
|
||||
|
@ -33,12 +33,12 @@ import cafe.adriel.voyager.navigator.tab.TabOptions
|
||||
import com.github.diegoberaldin.raccoonforlemmy.core.appearance.theme.Spacing
|
||||
import com.github.diegoberaldin.raccoonforlemmy.core.architecture.bindToLifecycle
|
||||
import com.github.diegoberaldin.raccoonforlemmy.core.commonui.detailopener.api.getDetailOpener
|
||||
import com.github.diegoberaldin.raccoonforlemmy.core.navigation.TabNavigationSection
|
||||
import com.github.diegoberaldin.raccoonforlemmy.core.navigation.di.getNavigationCoordinator
|
||||
import com.github.diegoberaldin.raccoonforlemmy.core.utils.compose.rememberCallback
|
||||
import com.github.diegoberaldin.raccoonforlemmy.core.utils.compose.rememberCallbackArgs
|
||||
import com.github.diegoberaldin.raccoonforlemmy.domain.lemmy.data.otherUser
|
||||
import com.github.diegoberaldin.raccoonforlemmy.feature.inbox.di.getInboxMessagesViewModel
|
||||
import com.github.diegoberaldin.raccoonforlemmy.feature.inbox.ui.InboxTab
|
||||
import com.github.diegoberaldin.raccoonforlemmy.resources.MR
|
||||
import com.github.diegoberaldin.raccoonforlemmy.unit.chat.InboxChatScreen
|
||||
import dev.icerock.moko.resources.compose.stringResource
|
||||
@ -63,8 +63,8 @@ class InboxMessagesScreen : Tab {
|
||||
val detailOpener = remember { getDetailOpener() }
|
||||
|
||||
LaunchedEffect(navigationCoordinator) {
|
||||
navigationCoordinator.onDoubleTabSelection.onEach {
|
||||
if (it == InboxTab) {
|
||||
navigationCoordinator.onDoubleTabSelection.onEach { section ->
|
||||
if (section == TabNavigationSection.Inbox) {
|
||||
lazyListState.scrollToItem(0)
|
||||
}
|
||||
}.launchIn(this)
|
||||
|
@ -49,11 +49,11 @@ import com.github.diegoberaldin.raccoonforlemmy.core.commonui.lemmyui.InboxCardP
|
||||
import com.github.diegoberaldin.raccoonforlemmy.core.commonui.lemmyui.InboxCardType
|
||||
import com.github.diegoberaldin.raccoonforlemmy.core.commonui.lemmyui.Option
|
||||
import com.github.diegoberaldin.raccoonforlemmy.core.commonui.lemmyui.OptionId
|
||||
import com.github.diegoberaldin.raccoonforlemmy.core.navigation.TabNavigationSection
|
||||
import com.github.diegoberaldin.raccoonforlemmy.core.navigation.di.getNavigationCoordinator
|
||||
import com.github.diegoberaldin.raccoonforlemmy.core.utils.compose.rememberCallback
|
||||
import com.github.diegoberaldin.raccoonforlemmy.core.utils.compose.rememberCallbackArgs
|
||||
import com.github.diegoberaldin.raccoonforlemmy.feature.inbox.di.getInboxRepliesViewModel
|
||||
import com.github.diegoberaldin.raccoonforlemmy.feature.inbox.ui.InboxTab
|
||||
import com.github.diegoberaldin.raccoonforlemmy.resources.MR
|
||||
import com.github.diegoberaldin.raccoonforlemmy.unit.zoomableimage.ZoomableImageScreen
|
||||
import dev.icerock.moko.resources.compose.stringResource
|
||||
@ -77,8 +77,8 @@ class InboxRepliesScreen : Tab {
|
||||
val detailOpener = remember { getDetailOpener() }
|
||||
|
||||
LaunchedEffect(navigationCoordinator) {
|
||||
navigationCoordinator.onDoubleTabSelection.onEach {
|
||||
if (it == InboxTab) {
|
||||
navigationCoordinator.onDoubleTabSelection.onEach { section ->
|
||||
if (section == TabNavigationSection.Inbox) {
|
||||
lazyListState.scrollToItem(0)
|
||||
}
|
||||
}.launchIn(this)
|
||||
|
@ -49,6 +49,7 @@ import com.github.diegoberaldin.raccoonforlemmy.core.commonui.lemmyui.PostCardPl
|
||||
import com.github.diegoberaldin.raccoonforlemmy.core.commonui.lemmyui.ProfileLoggedSection
|
||||
import com.github.diegoberaldin.raccoonforlemmy.core.commonui.lemmyui.UserHeader
|
||||
import com.github.diegoberaldin.raccoonforlemmy.core.commonui.modals.RawContentDialog
|
||||
import com.github.diegoberaldin.raccoonforlemmy.core.navigation.TabNavigationSection
|
||||
import com.github.diegoberaldin.raccoonforlemmy.core.navigation.di.getNavigationCoordinator
|
||||
import com.github.diegoberaldin.raccoonforlemmy.core.notifications.NotificationCenterEvent
|
||||
import com.github.diegoberaldin.raccoonforlemmy.core.notifications.di.getNotificationCenter
|
||||
@ -57,7 +58,6 @@ import com.github.diegoberaldin.raccoonforlemmy.core.utils.compose.rememberCallb
|
||||
import com.github.diegoberaldin.raccoonforlemmy.domain.lemmy.data.CommentModel
|
||||
import com.github.diegoberaldin.raccoonforlemmy.domain.lemmy.data.PostModel
|
||||
import com.github.diegoberaldin.raccoonforlemmy.feature.profile.di.getProfileLoggedViewModel
|
||||
import com.github.diegoberaldin.raccoonforlemmy.feature.profile.ui.ProfileTab
|
||||
import com.github.diegoberaldin.raccoonforlemmy.resources.MR
|
||||
import com.github.diegoberaldin.raccoonforlemmy.unit.createcomment.CreateCommentScreen
|
||||
import com.github.diegoberaldin.raccoonforlemmy.unit.createpost.CreatePostScreen
|
||||
@ -88,8 +88,8 @@ internal object ProfileLoggedScreen : Tab {
|
||||
val detailOpener = remember { getDetailOpener() }
|
||||
|
||||
LaunchedEffect(navigationCoordinator) {
|
||||
navigationCoordinator.onDoubleTabSelection.onEach { tab ->
|
||||
if (tab == ProfileTab) {
|
||||
navigationCoordinator.onDoubleTabSelection.onEach { section ->
|
||||
if (section == TabNavigationSection.Profile) {
|
||||
lazyListState.scrollToItem(0)
|
||||
}
|
||||
}.launchIn(this)
|
||||
|
@ -1,35 +1,9 @@
|
||||
package com.github.diegoberaldin.raccoonforlemmy.feature.search.di
|
||||
|
||||
import com.github.diegoberaldin.raccoonforlemmy.core.persistence.data.MultiCommunityModel
|
||||
import com.github.diegoberaldin.raccoonforlemmy.feature.search.main.ExploreMviModel
|
||||
import com.github.diegoberaldin.raccoonforlemmy.feature.search.managesubscriptions.ManageSubscriptionsMviModel
|
||||
import com.github.diegoberaldin.raccoonforlemmy.feature.search.multicommunity.detail.MultiCommunityMviModel
|
||||
import com.github.diegoberaldin.raccoonforlemmy.feature.search.multicommunity.editor.MultiCommunityEditorMviModel
|
||||
import org.koin.core.parameter.parametersOf
|
||||
import org.koin.java.KoinJavaComponent.inject
|
||||
|
||||
actual fun getExploreViewModel(): ExploreMviModel {
|
||||
val res: ExploreMviModel by inject(ExploreMviModel::class.java)
|
||||
return res
|
||||
}
|
||||
|
||||
actual fun getManageSubscriptionsViewModel(): ManageSubscriptionsMviModel {
|
||||
val res: ManageSubscriptionsMviModel by inject(ManageSubscriptionsMviModel::class.java)
|
||||
return res
|
||||
}
|
||||
|
||||
actual fun getMultiCommunityViewModel(community: MultiCommunityModel): MultiCommunityMviModel {
|
||||
val res: MultiCommunityMviModel by inject(
|
||||
MultiCommunityMviModel::class.java,
|
||||
parameters = { parametersOf(community) }
|
||||
)
|
||||
return res
|
||||
}
|
||||
|
||||
actual fun getMultiCommunityEditorViewModel(editedCommunity: MultiCommunityModel?): MultiCommunityEditorMviModel {
|
||||
val res: MultiCommunityEditorMviModel by inject(
|
||||
MultiCommunityEditorMviModel::class.java,
|
||||
parameters = { parametersOf(editedCommunity) }
|
||||
)
|
||||
return res
|
||||
}
|
||||
|
@ -3,14 +3,6 @@ package com.github.diegoberaldin.raccoonforlemmy.feature.search.di
|
||||
import com.github.diegoberaldin.raccoonforlemmy.core.architecture.DefaultMviModel
|
||||
import com.github.diegoberaldin.raccoonforlemmy.feature.search.main.ExploreMviModel
|
||||
import com.github.diegoberaldin.raccoonforlemmy.feature.search.main.ExploreViewModel
|
||||
import com.github.diegoberaldin.raccoonforlemmy.feature.search.managesubscriptions.ManageSubscriptionsMviModel
|
||||
import com.github.diegoberaldin.raccoonforlemmy.feature.search.managesubscriptions.ManageSubscriptionsViewModel
|
||||
import com.github.diegoberaldin.raccoonforlemmy.feature.search.multicommunity.detail.MultiCommunityMviModel
|
||||
import com.github.diegoberaldin.raccoonforlemmy.feature.search.multicommunity.detail.MultiCommunityViewModel
|
||||
import com.github.diegoberaldin.raccoonforlemmy.feature.search.multicommunity.editor.MultiCommunityEditorMviModel
|
||||
import com.github.diegoberaldin.raccoonforlemmy.feature.search.multicommunity.editor.MultiCommunityEditorViewModel
|
||||
import com.github.diegoberaldin.raccoonforlemmy.feature.search.multicommunity.utils.DefaultMultiCommunityPaginator
|
||||
import com.github.diegoberaldin.raccoonforlemmy.feature.search.multicommunity.utils.MultiCommunityPaginator
|
||||
import org.koin.dsl.module
|
||||
|
||||
val exploreTabModule = module {
|
||||
@ -30,51 +22,4 @@ val exploreTabModule = module {
|
||||
getSortTypesUseCase = get(),
|
||||
)
|
||||
}
|
||||
factory<ManageSubscriptionsMviModel> {
|
||||
ManageSubscriptionsViewModel(
|
||||
mvi = DefaultMviModel(ManageSubscriptionsMviModel.UiState()),
|
||||
identityRepository = get(),
|
||||
communityRepository = get(),
|
||||
accountRepository = get(),
|
||||
multiCommunityRepository = get(),
|
||||
hapticFeedback = get(),
|
||||
notificationCenter = get(),
|
||||
settingsRepository = get(),
|
||||
)
|
||||
}
|
||||
factory<MultiCommunityMviModel> { params ->
|
||||
MultiCommunityViewModel(
|
||||
mvi = DefaultMviModel(MultiCommunityMviModel.UiState()),
|
||||
community = params[0],
|
||||
postRepository = get(),
|
||||
identityRepository = get(),
|
||||
apiConfigurationRepository = get(),
|
||||
siteRepository = get(),
|
||||
themeRepository = get(),
|
||||
shareHelper = get(),
|
||||
settingsRepository = get(),
|
||||
notificationCenter = get(),
|
||||
hapticFeedback = get(),
|
||||
paginator = get(),
|
||||
imagePreloadManager = get(),
|
||||
getSortTypesUseCase = get(),
|
||||
)
|
||||
}
|
||||
factory<MultiCommunityPaginator> {
|
||||
DefaultMultiCommunityPaginator(
|
||||
postRepository = get(),
|
||||
)
|
||||
}
|
||||
factory<MultiCommunityEditorMviModel> { params ->
|
||||
MultiCommunityEditorViewModel(
|
||||
mvi = DefaultMviModel(MultiCommunityEditorMviModel.UiState()),
|
||||
editedCommunity = params[0],
|
||||
identityRepository = get(),
|
||||
communityRepository = get(),
|
||||
accountRepository = get(),
|
||||
multiCommunityRepository = get(),
|
||||
notificationCenter = get(),
|
||||
settingsRepository = get(),
|
||||
)
|
||||
}
|
||||
}
|
||||
|
@ -1,15 +1,5 @@
|
||||
package com.github.diegoberaldin.raccoonforlemmy.feature.search.di
|
||||
|
||||
import com.github.diegoberaldin.raccoonforlemmy.core.persistence.data.MultiCommunityModel
|
||||
import com.github.diegoberaldin.raccoonforlemmy.feature.search.main.ExploreMviModel
|
||||
import com.github.diegoberaldin.raccoonforlemmy.feature.search.managesubscriptions.ManageSubscriptionsMviModel
|
||||
import com.github.diegoberaldin.raccoonforlemmy.feature.search.multicommunity.detail.MultiCommunityMviModel
|
||||
import com.github.diegoberaldin.raccoonforlemmy.feature.search.multicommunity.editor.MultiCommunityEditorMviModel
|
||||
|
||||
expect fun getExploreViewModel(): ExploreMviModel
|
||||
|
||||
expect fun getManageSubscriptionsViewModel(): ManageSubscriptionsMviModel
|
||||
|
||||
expect fun getMultiCommunityViewModel(community: MultiCommunityModel): MultiCommunityMviModel
|
||||
|
||||
expect fun getMultiCommunityEditorViewModel(editedCommunity: MultiCommunityModel?): MultiCommunityEditorMviModel
|
||||
|
@ -72,6 +72,7 @@ import com.github.diegoberaldin.raccoonforlemmy.core.commonui.lemmyui.PostCardPl
|
||||
import com.github.diegoberaldin.raccoonforlemmy.core.commonui.lemmyui.UserItem
|
||||
import com.github.diegoberaldin.raccoonforlemmy.core.commonui.modals.ListingTypeBottomSheet
|
||||
import com.github.diegoberaldin.raccoonforlemmy.core.commonui.modals.SortBottomSheet
|
||||
import com.github.diegoberaldin.raccoonforlemmy.core.navigation.TabNavigationSection
|
||||
import com.github.diegoberaldin.raccoonforlemmy.core.navigation.di.getDrawerCoordinator
|
||||
import com.github.diegoberaldin.raccoonforlemmy.core.navigation.di.getNavigationCoordinator
|
||||
import com.github.diegoberaldin.raccoonforlemmy.core.persistence.di.getSettingsRepository
|
||||
@ -82,7 +83,6 @@ import com.github.diegoberaldin.raccoonforlemmy.domain.lemmy.data.PostModel
|
||||
import com.github.diegoberaldin.raccoonforlemmy.domain.lemmy.data.SearchResult
|
||||
import com.github.diegoberaldin.raccoonforlemmy.domain.lemmy.data.SearchResultType
|
||||
import com.github.diegoberaldin.raccoonforlemmy.feature.search.di.getExploreViewModel
|
||||
import com.github.diegoberaldin.raccoonforlemmy.feature.search.ui.ExploreTab
|
||||
import com.github.diegoberaldin.raccoonforlemmy.resources.MR
|
||||
import com.github.diegoberaldin.raccoonforlemmy.unit.createcomment.CreateCommentScreen
|
||||
import com.github.diegoberaldin.raccoonforlemmy.unit.web.WebViewScreen
|
||||
@ -123,8 +123,8 @@ class ExploreScreen : Screen {
|
||||
val detailOpener = remember { getDetailOpener() }
|
||||
|
||||
LaunchedEffect(navigationCoordinator) {
|
||||
navigationCoordinator.onDoubleTabSelection.onEach { tab ->
|
||||
if (tab == ExploreTab) {
|
||||
navigationCoordinator.onDoubleTabSelection.onEach { section ->
|
||||
if (section == TabNavigationSection.Explore) {
|
||||
lazyListState.scrollToItem(0)
|
||||
topAppBarState.heightOffset = 0f
|
||||
topAppBarState.contentOffset = 0f
|
||||
|
@ -1,36 +1,11 @@
|
||||
package com.github.diegoberaldin.raccoonforlemmy.feature.search.di
|
||||
|
||||
import com.github.diegoberaldin.raccoonforlemmy.core.persistence.data.MultiCommunityModel
|
||||
import com.github.diegoberaldin.raccoonforlemmy.feature.search.main.ExploreMviModel
|
||||
import com.github.diegoberaldin.raccoonforlemmy.feature.search.managesubscriptions.ManageSubscriptionsMviModel
|
||||
import com.github.diegoberaldin.raccoonforlemmy.feature.search.multicommunity.detail.MultiCommunityMviModel
|
||||
import com.github.diegoberaldin.raccoonforlemmy.feature.search.multicommunity.editor.MultiCommunityEditorMviModel
|
||||
import org.koin.core.component.KoinComponent
|
||||
import org.koin.core.component.inject
|
||||
import org.koin.core.parameter.parametersOf
|
||||
|
||||
actual fun getExploreViewModel(): ExploreMviModel = ExploreInjectHelper.model
|
||||
|
||||
actual fun getManageSubscriptionsViewModel(): ManageSubscriptionsMviModel =
|
||||
ExploreInjectHelper.manageSuscriptionsViewModel
|
||||
|
||||
actual fun getMultiCommunityViewModel(community: MultiCommunityModel): MultiCommunityMviModel =
|
||||
ExploreInjectHelper.getMultiCommunityViewModel(community)
|
||||
|
||||
actual fun getMultiCommunityEditorViewModel(editedCommunity: MultiCommunityModel?): MultiCommunityEditorMviModel =
|
||||
ExploreInjectHelper.getMultiCommunityEditorViewModel(editedCommunity)
|
||||
|
||||
object ExploreInjectHelper : KoinComponent {
|
||||
val model: ExploreMviModel by inject()
|
||||
val manageSuscriptionsViewModel: ManageSubscriptionsMviModel by inject()
|
||||
|
||||
internal fun getMultiCommunityViewModel(community: MultiCommunityModel): MultiCommunityMviModel {
|
||||
val res: MultiCommunityMviModel by inject(parameters = { parametersOf(community) })
|
||||
return res
|
||||
}
|
||||
|
||||
internal fun getMultiCommunityEditorViewModel(editedCommunity: MultiCommunityModel?): MultiCommunityEditorMviModel {
|
||||
val res: MultiCommunityEditorMviModel by inject(parameters = { parametersOf(editedCommunity) })
|
||||
return res
|
||||
}
|
||||
}
|
||||
|
@ -51,13 +51,14 @@ kotlin {
|
||||
implementation(projects.coreCommonui.components)
|
||||
implementation(projects.coreCommonui.lemmyui)
|
||||
implementation(projects.coreCommonui.modals)
|
||||
implementation(projects.unitWeb)
|
||||
implementation(projects.coreCommonui.detailopenerApi)
|
||||
implementation(projects.unitWeb)
|
||||
implementation(projects.unitAbout)
|
||||
implementation(projects.coreNotifications)
|
||||
implementation(projects.resources)
|
||||
implementation(projects.domainLemmy.data)
|
||||
implementation(projects.domainLemmy.repository)
|
||||
implementation(projects.domainIdentity)
|
||||
implementation(projects.resources)
|
||||
}
|
||||
}
|
||||
val commonTest by getting {
|
||||
|
@ -1,15 +1,9 @@
|
||||
package com.github.diegoberaldin.raccoonforlemmy.feature.settings.di
|
||||
|
||||
import com.github.diegoberaldin.raccoonforlemmy.feature.settings.dialog.AboutDialogMviModel
|
||||
import com.github.diegoberaldin.raccoonforlemmy.feature.settings.main.SettingsMviModel
|
||||
import org.koin.java.KoinJavaComponent.inject
|
||||
|
||||
actual fun getSettingsViewModel(): SettingsMviModel {
|
||||
val res: SettingsMviModel by inject(SettingsMviModel::class.java)
|
||||
return res
|
||||
}
|
||||
|
||||
actual fun getAboutDialogViewModel(): AboutDialogMviModel {
|
||||
val res: AboutDialogMviModel by inject(AboutDialogMviModel::class.java)
|
||||
return res
|
||||
}
|
||||
}
|
@ -1,13 +1,13 @@
|
||||
package com.github.diegoberaldin.raccoonforlemmy.feature.settings.di
|
||||
|
||||
import com.github.diegoberaldin.raccoonforlemmy.core.architecture.DefaultMviModel
|
||||
import com.github.diegoberaldin.raccoonforlemmy.feature.settings.dialog.AboutDialogMviModel
|
||||
import com.github.diegoberaldin.raccoonforlemmy.feature.settings.dialog.AboutDialogViewModel
|
||||
import com.github.diegoberaldin.raccoonforlemmy.feature.settings.main.SettingsMviModel
|
||||
import com.github.diegoberaldin.raccoonforlemmy.feature.settings.main.SettingsViewModel
|
||||
import com.github.diegoberaldin.raccoonforlemmy.unit.about.di.aboutModule
|
||||
import org.koin.dsl.module
|
||||
|
||||
val settingsTabModule = module {
|
||||
includes(aboutModule)
|
||||
factory<SettingsMviModel> {
|
||||
SettingsViewModel(
|
||||
mvi = DefaultMviModel(SettingsMviModel.UiState()),
|
||||
@ -24,11 +24,4 @@ val settingsTabModule = module {
|
||||
getSortTypesUseCase = get(),
|
||||
)
|
||||
}
|
||||
factory<AboutDialogMviModel> {
|
||||
AboutDialogViewModel(
|
||||
mvi = DefaultMviModel(AboutDialogMviModel.UiState()),
|
||||
identityRepository = get(),
|
||||
communityRepository = get(),
|
||||
)
|
||||
}
|
||||
}
|
||||
|
@ -1,8 +1,5 @@
|
||||
package com.github.diegoberaldin.raccoonforlemmy.feature.settings.di
|
||||
|
||||
import com.github.diegoberaldin.raccoonforlemmy.feature.settings.dialog.AboutDialogMviModel
|
||||
import com.github.diegoberaldin.raccoonforlemmy.feature.settings.main.SettingsMviModel
|
||||
|
||||
expect fun getSettingsViewModel(): SettingsMviModel
|
||||
|
||||
expect fun getAboutDialogViewModel(): AboutDialogMviModel
|
||||
|
@ -61,6 +61,7 @@ import com.github.diegoberaldin.raccoonforlemmy.core.commonui.modals.SortBottomS
|
||||
import com.github.diegoberaldin.raccoonforlemmy.core.commonui.modals.ThemeBottomSheet
|
||||
import com.github.diegoberaldin.raccoonforlemmy.core.commonui.modals.VoteFormatBottomSheet
|
||||
import com.github.diegoberaldin.raccoonforlemmy.core.commonui.modals.VoteThemeBottomSheet
|
||||
import com.github.diegoberaldin.raccoonforlemmy.core.navigation.TabNavigationSection
|
||||
import com.github.diegoberaldin.raccoonforlemmy.core.navigation.di.getDrawerCoordinator
|
||||
import com.github.diegoberaldin.raccoonforlemmy.core.navigation.di.getNavigationCoordinator
|
||||
import com.github.diegoberaldin.raccoonforlemmy.core.notifications.NotificationCenterEvent
|
||||
@ -74,7 +75,6 @@ import com.github.diegoberaldin.raccoonforlemmy.core.utils.toLanguageName
|
||||
import com.github.diegoberaldin.raccoonforlemmy.core.utils.toLocalDp
|
||||
import com.github.diegoberaldin.raccoonforlemmy.domain.lemmy.data.toReadableName
|
||||
import com.github.diegoberaldin.raccoonforlemmy.feature.settings.di.getSettingsViewModel
|
||||
import com.github.diegoberaldin.raccoonforlemmy.feature.settings.dialog.AboutDialog
|
||||
import com.github.diegoberaldin.raccoonforlemmy.feature.settings.ui.SettingsTab
|
||||
import com.github.diegoberaldin.raccoonforlemmy.feature.settings.ui.components.SettingsColorRow
|
||||
import com.github.diegoberaldin.raccoonforlemmy.feature.settings.ui.components.SettingsHeader
|
||||
@ -84,6 +84,7 @@ import com.github.diegoberaldin.raccoonforlemmy.feature.settings.ui.components.S
|
||||
import com.github.diegoberaldin.raccoonforlemmy.resources.MR
|
||||
import com.github.diegoberaldin.raccoonforlemmy.resources.di.getLanguageRepository
|
||||
import com.github.diegoberaldin.raccoonforlemmy.resources.di.staticString
|
||||
import com.github.diegoberaldin.raccoonforlemmy.unit.about.AboutDialog
|
||||
import dev.icerock.moko.resources.compose.stringResource
|
||||
import dev.icerock.moko.resources.desc.desc
|
||||
import kotlinx.coroutines.delay
|
||||
@ -126,8 +127,8 @@ class SettingsScreen : Screen {
|
||||
}.launchIn(this)
|
||||
}
|
||||
LaunchedEffect(Unit) {
|
||||
navigationCoordinator.onDoubleTabSelection.onEach { tab ->
|
||||
if (tab == SettingsTab) {
|
||||
navigationCoordinator.onDoubleTabSelection.onEach { section ->
|
||||
if (section == TabNavigationSection.Settings) {
|
||||
scrollState.scrollTo(0)
|
||||
topAppBarState.heightOffset = 0f
|
||||
topAppBarState.contentOffset = 0f
|
||||
|
@ -1,14 +1,11 @@
|
||||
package com.github.diegoberaldin.raccoonforlemmy.feature.settings.di
|
||||
|
||||
import com.github.diegoberaldin.raccoonforlemmy.feature.settings.dialog.AboutDialogMviModel
|
||||
import com.github.diegoberaldin.raccoonforlemmy.feature.settings.main.SettingsMviModel
|
||||
import org.koin.core.component.KoinComponent
|
||||
import org.koin.core.component.inject
|
||||
|
||||
actual fun getSettingsViewModel(): SettingsMviModel = SettingsScreenModelHelper.settingsViewModel
|
||||
actual fun getAboutDialogViewModel(): AboutDialogMviModel = SettingsScreenModelHelper.aboutViewModel
|
||||
|
||||
object SettingsScreenModelHelper : KoinComponent {
|
||||
val settingsViewModel: SettingsMviModel by inject()
|
||||
val aboutViewModel: AboutDialogMviModel by inject()
|
||||
}
|
||||
|
@ -61,3 +61,7 @@ include(":unit-selectcommunity")
|
||||
include(":unit-userdetail")
|
||||
include(":unit-web")
|
||||
include(":unit-zoomableimage")
|
||||
include(":unit-postlist")
|
||||
include(":unit-managesubscriptions")
|
||||
include(":unit-multicommunity")
|
||||
include(":unit-about")
|
||||
|
@ -75,6 +75,8 @@ kotlin {
|
||||
implementation(projects.unitPostdetail)
|
||||
implementation(projects.unitCommunitydetail)
|
||||
implementation(projects.unitUserdetail)
|
||||
implementation(projects.unitManagesubscriptions)
|
||||
implementation(projects.unitMulticommunity)
|
||||
|
||||
api(projects.resources)
|
||||
api(projects.featureHome)
|
||||
|
@ -30,6 +30,7 @@ import com.github.diegoberaldin.raccoonforlemmy.unit.createpost.di.createPostMod
|
||||
import com.github.diegoberaldin.raccoonforlemmy.unit.createreport.di.createReportModule
|
||||
import com.github.diegoberaldin.raccoonforlemmy.unit.drawer.di.drawerModule
|
||||
import com.github.diegoberaldin.raccoonforlemmy.unit.instanceinfo.di.instanceInfoModule
|
||||
import com.github.diegoberaldin.raccoonforlemmy.unit.managesubscriptions.di.manageSubscriptionsModule
|
||||
import com.github.diegoberaldin.raccoonforlemmy.unit.postdetail.di.postDetailModule
|
||||
import com.github.diegoberaldin.raccoonforlemmy.unit.remove.di.removeModule
|
||||
import com.github.diegoberaldin.raccoonforlemmy.unit.reportlist.di.reportListModule
|
||||
@ -79,5 +80,6 @@ val sharedHelperModule = module {
|
||||
postDetailModule,
|
||||
communityDetailModule,
|
||||
userDetailModule,
|
||||
manageSubscriptionsModule,
|
||||
)
|
||||
}
|
||||
|
@ -48,11 +48,11 @@ import com.github.diegoberaldin.raccoonforlemmy.core.utils.debug.getCrashReportC
|
||||
import com.github.diegoberaldin.raccoonforlemmy.core.utils.debug.getCrashReportSender
|
||||
import com.github.diegoberaldin.raccoonforlemmy.core.utils.toLanguageDirection
|
||||
import com.github.diegoberaldin.raccoonforlemmy.domain.identity.di.getApiConfigurationRepository
|
||||
import com.github.diegoberaldin.raccoonforlemmy.feature.search.managesubscriptions.ManageSubscriptionsScreen
|
||||
import com.github.diegoberaldin.raccoonforlemmy.feature.search.multicommunity.detail.MultiCommunityScreen
|
||||
import com.github.diegoberaldin.raccoonforlemmy.resources.MR
|
||||
import com.github.diegoberaldin.raccoonforlemmy.resources.di.getLanguageRepository
|
||||
import com.github.diegoberaldin.raccoonforlemmy.unit.drawer.ModalDrawerContent
|
||||
import com.github.diegoberaldin.raccoonforlemmy.unit.managesubscriptions.ManageSubscriptionsScreen
|
||||
import com.github.diegoberaldin.raccoonforlemmy.unit.multicommunity.detail.MultiCommunityScreen
|
||||
import com.github.diegoberaldin.raccoonforlemmy.unit.saveditems.SavedItemsScreen
|
||||
import dev.icerock.moko.resources.compose.stringResource
|
||||
import dev.icerock.moko.resources.desc.StringDesc
|
||||
|
@ -33,6 +33,7 @@ import cafe.adriel.voyager.navigator.tab.TabNavigator
|
||||
import com.github.diegoberaldin.raccoonforlemmy.core.appearance.di.getThemeRepository
|
||||
import com.github.diegoberaldin.raccoonforlemmy.core.architecture.bindToLifecycle
|
||||
import com.github.diegoberaldin.raccoonforlemmy.core.navigation.DrawerEvent
|
||||
import com.github.diegoberaldin.raccoonforlemmy.core.navigation.TabNavigationSection
|
||||
import com.github.diegoberaldin.raccoonforlemmy.core.navigation.di.getDrawerCoordinator
|
||||
import com.github.diegoberaldin.raccoonforlemmy.core.navigation.di.getNavigationCoordinator
|
||||
import com.github.diegoberaldin.raccoonforlemmy.core.notifications.NotificationCenterEvent
|
||||
@ -94,7 +95,7 @@ internal object MainScreen : Screen {
|
||||
}
|
||||
navigationCoordinator.apply {
|
||||
setBottomBarScrollConnection(scrollConnection)
|
||||
setCurrentSection(HomeTab)
|
||||
setCurrentSection(TabNavigationSection.Home)
|
||||
}
|
||||
|
||||
navigationCoordinator.exitMessageVisible.onEach {
|
||||
|
@ -27,7 +27,12 @@ import cafe.adriel.voyager.navigator.tab.LocalTabNavigator
|
||||
import cafe.adriel.voyager.navigator.tab.Tab
|
||||
import com.github.diegoberaldin.raccoonforlemmy.core.appearance.theme.IconSize
|
||||
import com.github.diegoberaldin.raccoonforlemmy.core.appearance.theme.Spacing
|
||||
import com.github.diegoberaldin.raccoonforlemmy.core.navigation.TabNavigationSection
|
||||
import com.github.diegoberaldin.raccoonforlemmy.core.navigation.di.getNavigationCoordinator
|
||||
import com.github.diegoberaldin.raccoonforlemmy.feature.inbox.ui.InboxTab
|
||||
import com.github.diegoberaldin.raccoonforlemmy.feature.profile.ui.ProfileTab
|
||||
import com.github.diegoberaldin.raccoonforlemmy.feature.search.ui.ExploreTab
|
||||
import com.github.diegoberaldin.raccoonforlemmy.feature.settings.ui.SettingsTab
|
||||
import com.github.diegoberaldin.raccoonforlemmy.resources.MR
|
||||
import com.github.diegoberaldin.raccoonforlemmy.resources.di.staticString
|
||||
import dev.icerock.moko.resources.desc.desc
|
||||
@ -43,7 +48,14 @@ internal fun RowScope.TabNavigationItem(tab: Tab, withText: Boolean = true) {
|
||||
modifier = Modifier.weight(1f).fillMaxHeight(),
|
||||
onClick = {
|
||||
tabNavigator.current = tab
|
||||
navigationCoordinator.setCurrentSection(tab)
|
||||
val section = when (tab) {
|
||||
ExploreTab -> TabNavigationSection.Explore
|
||||
ProfileTab -> TabNavigationSection.Profile
|
||||
InboxTab -> TabNavigationSection.Inbox
|
||||
SettingsTab -> TabNavigationSection.Settings
|
||||
else -> TabNavigationSection.Home
|
||||
}
|
||||
navigationCoordinator.setCurrentSection(section)
|
||||
},
|
||||
selected = tabNavigator.current == tab,
|
||||
icon = {
|
||||
|
@ -30,6 +30,7 @@ import com.github.diegoberaldin.raccoonforlemmy.unit.createpost.di.createPostMod
|
||||
import com.github.diegoberaldin.raccoonforlemmy.unit.createreport.di.createReportModule
|
||||
import com.github.diegoberaldin.raccoonforlemmy.unit.drawer.di.drawerModule
|
||||
import com.github.diegoberaldin.raccoonforlemmy.unit.instanceinfo.di.instanceInfoModule
|
||||
import com.github.diegoberaldin.raccoonforlemmy.unit.managesubscriptions.di.manageSubscriptionsModule
|
||||
import com.github.diegoberaldin.raccoonforlemmy.unit.postdetail.di.postDetailModule
|
||||
import com.github.diegoberaldin.raccoonforlemmy.unit.remove.di.removeModule
|
||||
import com.github.diegoberaldin.raccoonforlemmy.unit.reportlist.di.reportListModule
|
||||
@ -80,6 +81,7 @@ fun initKoin() {
|
||||
postDetailModule,
|
||||
communityDetailModule,
|
||||
userDetailModule,
|
||||
manageSubscriptionsModule,
|
||||
)
|
||||
}
|
||||
|
||||
|
68
unit-about/build.gradle.kts
Normal file
68
unit-about/build.gradle.kts
Normal file
@ -0,0 +1,68 @@
|
||||
plugins {
|
||||
alias(libs.plugins.kotlin.multiplatform)
|
||||
alias(libs.plugins.android.library)
|
||||
alias(libs.plugins.compose)
|
||||
}
|
||||
|
||||
@OptIn(org.jetbrains.kotlin.gradle.ExperimentalKotlinGradlePluginApi::class)
|
||||
kotlin {
|
||||
applyDefaultHierarchyTemplate()
|
||||
|
||||
androidTarget {
|
||||
compilations.all {
|
||||
kotlinOptions {
|
||||
jvmTarget = "1.8"
|
||||
}
|
||||
}
|
||||
}
|
||||
iosX64()
|
||||
iosArm64()
|
||||
iosSimulatorArm64()
|
||||
|
||||
sourceSets {
|
||||
val commonMain by getting {
|
||||
dependencies {
|
||||
implementation(libs.koin.core)
|
||||
|
||||
implementation(compose.runtime)
|
||||
implementation(compose.foundation)
|
||||
implementation(compose.material3)
|
||||
implementation(compose.materialIconsExtended)
|
||||
@OptIn(org.jetbrains.compose.ExperimentalComposeLibrary::class)
|
||||
implementation(compose.components.resources)
|
||||
|
||||
implementation(libs.voyager.navigator)
|
||||
implementation(libs.voyager.screenmodel)
|
||||
|
||||
implementation(projects.coreAppearance)
|
||||
implementation(projects.corePreferences)
|
||||
implementation(projects.coreArchitecture)
|
||||
implementation(projects.coreUtils)
|
||||
implementation(projects.coreNavigation)
|
||||
implementation(projects.coreCommonui.components)
|
||||
implementation(projects.coreCommonui.lemmyui)
|
||||
implementation(projects.coreCommonui.detailopenerApi)
|
||||
implementation(projects.unitWeb)
|
||||
implementation(projects.coreNotifications)
|
||||
implementation(projects.corePersistence)
|
||||
implementation(projects.domainIdentity)
|
||||
implementation(projects.domainLemmy.data)
|
||||
implementation(projects.domainLemmy.repository)
|
||||
implementation(projects.resources)
|
||||
}
|
||||
}
|
||||
val commonTest by getting {
|
||||
dependencies {
|
||||
implementation(kotlin("test"))
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
android {
|
||||
namespace = "com.github.diegoberaldin.raccoonforlemmy.unit.about"
|
||||
compileSdk = libs.versions.android.targetSdk.get().toInt()
|
||||
defaultConfig {
|
||||
minSdk = libs.versions.android.minSdk.get().toInt()
|
||||
}
|
||||
}
|
@ -0,0 +1,9 @@
|
||||
package com.github.diegoberaldin.raccoonforlemmy.unit.about.di
|
||||
|
||||
import com.github.diegoberaldin.raccoonforlemmy.unit.about.AboutDialogMviModel
|
||||
import org.koin.java.KoinJavaComponent
|
||||
|
||||
actual fun getAboutDialogViewModel(): AboutDialogMviModel {
|
||||
val res: AboutDialogMviModel by KoinJavaComponent.inject(AboutDialogMviModel::class.java)
|
||||
return res
|
||||
}
|
@ -1,6 +1,6 @@
|
||||
package com.github.diegoberaldin.raccoonforlemmy.feature.settings.dialog
|
||||
package com.github.diegoberaldin.raccoonforlemmy.unit.about
|
||||
|
||||
internal object AboutContants {
|
||||
internal object AboutConstants {
|
||||
const val REPORT_URL =
|
||||
"https://github.com/diegoberaldin/RaccoonForLemmy/issues/new?labels=bug"
|
||||
const val CHANGELOG_URL =
|
@ -1,4 +1,4 @@
|
||||
package com.github.diegoberaldin.raccoonforlemmy.feature.settings.dialog
|
||||
package com.github.diegoberaldin.raccoonforlemmy.unit.about
|
||||
|
||||
import androidx.compose.foundation.Image
|
||||
import androidx.compose.foundation.background
|
||||
@ -44,12 +44,12 @@ import com.github.diegoberaldin.raccoonforlemmy.core.notifications.di.getNotific
|
||||
import com.github.diegoberaldin.raccoonforlemmy.core.persistence.di.getSettingsRepository
|
||||
import com.github.diegoberaldin.raccoonforlemmy.core.utils.compose.onClick
|
||||
import com.github.diegoberaldin.raccoonforlemmy.core.utils.compose.rememberCallback
|
||||
import com.github.diegoberaldin.raccoonforlemmy.feature.settings.di.getAboutDialogViewModel
|
||||
import com.github.diegoberaldin.raccoonforlemmy.feature.settings.dialog.AboutContants.CHANGELOG_URL
|
||||
import com.github.diegoberaldin.raccoonforlemmy.feature.settings.dialog.AboutContants.REPORT_EMAIL_ADDRESS
|
||||
import com.github.diegoberaldin.raccoonforlemmy.feature.settings.dialog.AboutContants.REPORT_URL
|
||||
import com.github.diegoberaldin.raccoonforlemmy.feature.settings.dialog.AboutContants.WEBSITE_URL
|
||||
import com.github.diegoberaldin.raccoonforlemmy.resources.MR
|
||||
import com.github.diegoberaldin.raccoonforlemmy.unit.about.AboutConstants.CHANGELOG_URL
|
||||
import com.github.diegoberaldin.raccoonforlemmy.unit.about.AboutConstants.REPORT_EMAIL_ADDRESS
|
||||
import com.github.diegoberaldin.raccoonforlemmy.unit.about.AboutConstants.REPORT_URL
|
||||
import com.github.diegoberaldin.raccoonforlemmy.unit.about.AboutConstants.WEBSITE_URL
|
||||
import com.github.diegoberaldin.raccoonforlemmy.unit.about.di.getAboutDialogViewModel
|
||||
import com.github.diegoberaldin.raccoonforlemmy.unit.web.WebViewScreen
|
||||
import dev.icerock.moko.resources.compose.painterResource
|
||||
import dev.icerock.moko.resources.compose.stringResource
|
@ -1,4 +1,4 @@
|
||||
package com.github.diegoberaldin.raccoonforlemmy.feature.settings.dialog
|
||||
package com.github.diegoberaldin.raccoonforlemmy.unit.about
|
||||
|
||||
import cafe.adriel.voyager.core.model.ScreenModel
|
||||
import com.github.diegoberaldin.raccoonforlemmy.core.architecture.MviModel
|
@ -1,12 +1,12 @@
|
||||
package com.github.diegoberaldin.raccoonforlemmy.feature.settings.dialog
|
||||
package com.github.diegoberaldin.raccoonforlemmy.unit.about
|
||||
|
||||
import com.github.diegoberaldin.raccoonforlemmy.core.architecture.DefaultMviModel
|
||||
import com.github.diegoberaldin.raccoonforlemmy.core.architecture.MviModel
|
||||
import com.github.diegoberaldin.raccoonforlemmy.core.utils.debug.AppInfo
|
||||
import com.github.diegoberaldin.raccoonforlemmy.domain.identity.repository.IdentityRepository
|
||||
import com.github.diegoberaldin.raccoonforlemmy.domain.lemmy.repository.CommunityRepository
|
||||
import com.github.diegoberaldin.raccoonforlemmy.feature.settings.dialog.AboutContants.LEMMY_COMMUNITY_INSTANCE
|
||||
import com.github.diegoberaldin.raccoonforlemmy.feature.settings.dialog.AboutContants.LEMMY_COMMUNITY_NAME
|
||||
import com.github.diegoberaldin.raccoonforlemmy.unit.about.AboutConstants.LEMMY_COMMUNITY_INSTANCE
|
||||
import com.github.diegoberaldin.raccoonforlemmy.unit.about.AboutConstants.LEMMY_COMMUNITY_NAME
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.IO
|
||||
import kotlinx.coroutines.launch
|
@ -0,0 +1,16 @@
|
||||
package com.github.diegoberaldin.raccoonforlemmy.unit.about.di
|
||||
|
||||
import com.github.diegoberaldin.raccoonforlemmy.core.architecture.DefaultMviModel
|
||||
import com.github.diegoberaldin.raccoonforlemmy.unit.about.AboutDialogMviModel
|
||||
import com.github.diegoberaldin.raccoonforlemmy.unit.about.AboutDialogViewModel
|
||||
import org.koin.dsl.module
|
||||
|
||||
val aboutModule = module {
|
||||
factory<AboutDialogMviModel> {
|
||||
AboutDialogViewModel(
|
||||
mvi = DefaultMviModel(AboutDialogMviModel.UiState()),
|
||||
identityRepository = get(),
|
||||
communityRepository = get(),
|
||||
)
|
||||
}
|
||||
}
|
@ -0,0 +1,5 @@
|
||||
package com.github.diegoberaldin.raccoonforlemmy.unit.about.di
|
||||
|
||||
import com.github.diegoberaldin.raccoonforlemmy.unit.about.AboutDialogMviModel
|
||||
|
||||
expect fun getAboutDialogViewModel(): AboutDialogMviModel
|
@ -0,0 +1,11 @@
|
||||
package com.github.diegoberaldin.raccoonforlemmy.unit.about.di
|
||||
|
||||
import com.github.diegoberaldin.raccoonforlemmy.unit.about.AboutDialogMviModel
|
||||
import org.koin.core.component.KoinComponent
|
||||
import org.koin.core.component.inject
|
||||
|
||||
actual fun getAboutDialogViewModel(): AboutDialogMviModel = UnitAboutDiHelper.aboutViewModel
|
||||
|
||||
object UnitAboutDiHelper : KoinComponent {
|
||||
val aboutViewModel: AboutDialogMviModel by inject()
|
||||
}
|
@ -105,7 +105,6 @@ object ModalDrawerContent : Tab {
|
||||
Column(
|
||||
modifier = Modifier.fillMaxWidth(0.9f)
|
||||
) {
|
||||
|
||||
DrawerHeader(
|
||||
user = uiState.user,
|
||||
instance = uiState.instance,
|
||||
@ -150,7 +149,7 @@ object ModalDrawerContent : Tab {
|
||||
DrawerShortcut(
|
||||
title = listingType.toReadableName(),
|
||||
icon = listingType.toIcon(),
|
||||
onSelected = {
|
||||
onSelected = rememberCallback(coordinator) {
|
||||
coordinator.toggleDrawer()
|
||||
coordinator.sendEvent(
|
||||
DrawerEvent.ChangeListingType(listingType)
|
||||
@ -162,7 +161,7 @@ object ModalDrawerContent : Tab {
|
||||
item {
|
||||
DrawerShortcut(title = stringResource(MR.strings.navigation_drawer_title_bookmarks),
|
||||
icon = Icons.Default.Bookmarks,
|
||||
onSelected = {
|
||||
onSelected = rememberCallback(coordinator) {
|
||||
coordinator.toggleDrawer()
|
||||
coordinator.sendEvent(DrawerEvent.OpenBookmarks)
|
||||
})
|
||||
@ -171,7 +170,7 @@ object ModalDrawerContent : Tab {
|
||||
DrawerShortcut(
|
||||
title = stringResource(MR.strings.navigation_drawer_title_subscriptions),
|
||||
icon = Icons.Default.ManageAccounts,
|
||||
onSelected = {
|
||||
onSelected = rememberCallback(coordinator) {
|
||||
coordinator.toggleDrawer()
|
||||
coordinator.sendEvent(DrawerEvent.ManageSubscriptions)
|
||||
})
|
||||
|
81
unit-managesubscriptions/build.gradle.kts
Normal file
81
unit-managesubscriptions/build.gradle.kts
Normal file
@ -0,0 +1,81 @@
|
||||
plugins {
|
||||
alias(libs.plugins.kotlin.multiplatform)
|
||||
alias(libs.plugins.android.library)
|
||||
alias(libs.plugins.compose)
|
||||
}
|
||||
|
||||
@OptIn(org.jetbrains.kotlin.gradle.ExperimentalKotlinGradlePluginApi::class)
|
||||
kotlin {
|
||||
applyDefaultHierarchyTemplate()
|
||||
|
||||
androidTarget {
|
||||
compilations.all {
|
||||
kotlinOptions {
|
||||
jvmTarget = "1.8"
|
||||
}
|
||||
}
|
||||
}
|
||||
iosX64()
|
||||
iosArm64()
|
||||
iosSimulatorArm64()
|
||||
|
||||
sourceSets {
|
||||
val commonMain by getting {
|
||||
dependencies {
|
||||
implementation(compose.runtime)
|
||||
implementation(compose.foundation)
|
||||
implementation(compose.material)
|
||||
implementation(compose.material3)
|
||||
@OptIn(org.jetbrains.compose.ExperimentalComposeLibrary::class)
|
||||
implementation(compose.components.resources)
|
||||
implementation(compose.materialIconsExtended)
|
||||
|
||||
implementation(libs.koin.core)
|
||||
implementation(libs.voyager.screenmodel)
|
||||
implementation(libs.voyager.navigator)
|
||||
|
||||
implementation(projects.coreUtils)
|
||||
implementation(projects.coreAppearance)
|
||||
implementation(projects.coreArchitecture)
|
||||
implementation(projects.coreCommonui.components)
|
||||
implementation(projects.coreCommonui.lemmyui)
|
||||
implementation(projects.coreCommonui.modals)
|
||||
implementation(projects.coreCommonui.detailopenerApi)
|
||||
implementation(projects.unitZoomableimage)
|
||||
implementation(projects.unitWeb)
|
||||
implementation(projects.unitCreatereport)
|
||||
implementation(projects.unitCreatecomment)
|
||||
implementation(projects.unitCreatepost)
|
||||
implementation(projects.unitRemove)
|
||||
implementation(projects.unitBan)
|
||||
implementation(projects.unitCommunityinfo)
|
||||
implementation(projects.unitInstanceinfo)
|
||||
implementation(projects.unitCreatereport)
|
||||
implementation(projects.unitReportlist)
|
||||
implementation(projects.unitMulticommunity)
|
||||
implementation(projects.coreNavigation)
|
||||
implementation(projects.corePersistence)
|
||||
implementation(projects.coreNotifications)
|
||||
|
||||
implementation(projects.domainIdentity)
|
||||
implementation(projects.domainLemmy.data)
|
||||
implementation(projects.domainLemmy.repository)
|
||||
|
||||
implementation(projects.resources)
|
||||
}
|
||||
}
|
||||
val commonTest by getting {
|
||||
dependencies {
|
||||
implementation(kotlin("test"))
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
android {
|
||||
namespace = "com.github.diegoberaldin.raccoonforlemmy.unit.managesubscriptions"
|
||||
compileSdk = libs.versions.android.targetSdk.get().toInt()
|
||||
defaultConfig {
|
||||
minSdk = libs.versions.android.minSdk.get().toInt()
|
||||
}
|
||||
}
|
@ -0,0 +1,9 @@
|
||||
package com.github.diegoberaldin.raccoonforlemmy.unit.managesubscriptions.di
|
||||
|
||||
import com.github.diegoberaldin.raccoonforlemmy.unit.managesubscriptions.ManageSubscriptionsMviModel
|
||||
import org.koin.java.KoinJavaComponent
|
||||
|
||||
actual fun getManageSubscriptionsViewModel(): ManageSubscriptionsMviModel {
|
||||
val res: ManageSubscriptionsMviModel by KoinJavaComponent.inject(ManageSubscriptionsMviModel::class.java)
|
||||
return res
|
||||
}
|
@ -1,4 +1,4 @@
|
||||
package com.github.diegoberaldin.raccoonforlemmy.feature.search.managesubscriptions
|
||||
package com.github.diegoberaldin.raccoonforlemmy.unit.managesubscriptions
|
||||
|
||||
import androidx.compose.runtime.Stable
|
||||
import cafe.adriel.voyager.core.model.ScreenModel
|
@ -1,4 +1,4 @@
|
||||
package com.github.diegoberaldin.raccoonforlemmy.feature.search.managesubscriptions
|
||||
package com.github.diegoberaldin.raccoonforlemmy.unit.managesubscriptions
|
||||
|
||||
import androidx.compose.animation.AnimatedVisibility
|
||||
import androidx.compose.animation.slideInVertically
|
||||
@ -58,10 +58,10 @@ import com.github.diegoberaldin.raccoonforlemmy.core.navigation.di.getNavigation
|
||||
import com.github.diegoberaldin.raccoonforlemmy.core.utils.compose.onClick
|
||||
import com.github.diegoberaldin.raccoonforlemmy.core.utils.compose.rememberCallback
|
||||
import com.github.diegoberaldin.raccoonforlemmy.core.utils.compose.rememberCallbackArgs
|
||||
import com.github.diegoberaldin.raccoonforlemmy.feature.search.di.getManageSubscriptionsViewModel
|
||||
import com.github.diegoberaldin.raccoonforlemmy.feature.search.multicommunity.detail.MultiCommunityScreen
|
||||
import com.github.diegoberaldin.raccoonforlemmy.feature.search.multicommunity.editor.MultiCommunityEditorScreen
|
||||
import com.github.diegoberaldin.raccoonforlemmy.resources.MR
|
||||
import com.github.diegoberaldin.raccoonforlemmy.unit.managesubscriptions.di.getManageSubscriptionsViewModel
|
||||
import com.github.diegoberaldin.raccoonforlemmy.unit.multicommunity.detail.MultiCommunityScreen
|
||||
import com.github.diegoberaldin.raccoonforlemmy.unit.multicommunity.editor.MultiCommunityEditorScreen
|
||||
import dev.icerock.moko.resources.compose.stringResource
|
||||
import kotlinx.coroutines.launch
|
||||
|
@ -1,4 +1,4 @@
|
||||
package com.github.diegoberaldin.raccoonforlemmy.feature.search.managesubscriptions
|
||||
package com.github.diegoberaldin.raccoonforlemmy.unit.managesubscriptions
|
||||
|
||||
import com.github.diegoberaldin.raccoonforlemmy.core.architecture.DefaultMviModel
|
||||
import com.github.diegoberaldin.raccoonforlemmy.core.architecture.MviModel
|
@ -0,0 +1,24 @@
|
||||
package com.github.diegoberaldin.raccoonforlemmy.unit.managesubscriptions.di
|
||||
|
||||
import com.github.diegoberaldin.raccoonforlemmy.core.architecture.DefaultMviModel
|
||||
import com.github.diegoberaldin.raccoonforlemmy.unit.managesubscriptions.ManageSubscriptionsMviModel
|
||||
import com.github.diegoberaldin.raccoonforlemmy.unit.managesubscriptions.ManageSubscriptionsViewModel
|
||||
import com.github.diegoberaldin.raccoonforlemmy.unit.multicommunity.di.multiCommunityModule
|
||||
import org.koin.dsl.module
|
||||
|
||||
val manageSubscriptionsModule = module {
|
||||
includes(multiCommunityModule)
|
||||
|
||||
factory<ManageSubscriptionsMviModel> {
|
||||
ManageSubscriptionsViewModel(
|
||||
mvi = DefaultMviModel(ManageSubscriptionsMviModel.UiState()),
|
||||
identityRepository = get(),
|
||||
communityRepository = get(),
|
||||
accountRepository = get(),
|
||||
multiCommunityRepository = get(),
|
||||
hapticFeedback = get(),
|
||||
notificationCenter = get(),
|
||||
settingsRepository = get(),
|
||||
)
|
||||
}
|
||||
}
|
@ -0,0 +1,5 @@
|
||||
package com.github.diegoberaldin.raccoonforlemmy.unit.managesubscriptions.di
|
||||
|
||||
import com.github.diegoberaldin.raccoonforlemmy.unit.managesubscriptions.ManageSubscriptionsMviModel
|
||||
|
||||
expect fun getManageSubscriptionsViewModel(): ManageSubscriptionsMviModel
|
@ -0,0 +1,12 @@
|
||||
package com.github.diegoberaldin.raccoonforlemmy.unit.managesubscriptions.di
|
||||
|
||||
import com.github.diegoberaldin.raccoonforlemmy.unit.managesubscriptions.ManageSubscriptionsMviModel
|
||||
import org.koin.core.component.KoinComponent
|
||||
import org.koin.core.component.inject
|
||||
|
||||
actual fun getManageSubscriptionsViewModel(): ManageSubscriptionsMviModel =
|
||||
UnitManageSubscriptionsDiHelper.manageSuscriptionsViewModel
|
||||
|
||||
object UnitManageSubscriptionsDiHelper : KoinComponent {
|
||||
val manageSuscriptionsViewModel: ManageSubscriptionsMviModel by inject()
|
||||
}
|
80
unit-multicommunity/build.gradle.kts
Normal file
80
unit-multicommunity/build.gradle.kts
Normal file
@ -0,0 +1,80 @@
|
||||
plugins {
|
||||
alias(libs.plugins.kotlin.multiplatform)
|
||||
alias(libs.plugins.android.library)
|
||||
alias(libs.plugins.compose)
|
||||
}
|
||||
|
||||
@OptIn(org.jetbrains.kotlin.gradle.ExperimentalKotlinGradlePluginApi::class)
|
||||
kotlin {
|
||||
applyDefaultHierarchyTemplate()
|
||||
|
||||
androidTarget {
|
||||
compilations.all {
|
||||
kotlinOptions {
|
||||
jvmTarget = "1.8"
|
||||
}
|
||||
}
|
||||
}
|
||||
iosX64()
|
||||
iosArm64()
|
||||
iosSimulatorArm64()
|
||||
|
||||
sourceSets {
|
||||
val commonMain by getting {
|
||||
dependencies {
|
||||
implementation(compose.runtime)
|
||||
implementation(compose.foundation)
|
||||
implementation(compose.material)
|
||||
implementation(compose.material3)
|
||||
@OptIn(org.jetbrains.compose.ExperimentalComposeLibrary::class)
|
||||
implementation(compose.components.resources)
|
||||
implementation(compose.materialIconsExtended)
|
||||
|
||||
implementation(libs.koin.core)
|
||||
implementation(libs.voyager.screenmodel)
|
||||
implementation(libs.voyager.navigator)
|
||||
|
||||
implementation(projects.coreUtils)
|
||||
implementation(projects.coreAppearance)
|
||||
implementation(projects.coreArchitecture)
|
||||
implementation(projects.coreCommonui.components)
|
||||
implementation(projects.coreCommonui.lemmyui)
|
||||
implementation(projects.coreCommonui.modals)
|
||||
implementation(projects.unitZoomableimage)
|
||||
implementation(projects.unitWeb)
|
||||
implementation(projects.unitCreatereport)
|
||||
implementation(projects.unitCreatecomment)
|
||||
implementation(projects.unitCreatepost)
|
||||
implementation(projects.unitRemove)
|
||||
implementation(projects.unitBan)
|
||||
implementation(projects.unitCommunityinfo)
|
||||
implementation(projects.unitInstanceinfo)
|
||||
implementation(projects.unitCreatereport)
|
||||
implementation(projects.unitReportlist)
|
||||
implementation(projects.coreCommonui.detailopenerApi)
|
||||
implementation(projects.coreNavigation)
|
||||
implementation(projects.corePersistence)
|
||||
implementation(projects.coreNotifications)
|
||||
|
||||
implementation(projects.domainIdentity)
|
||||
implementation(projects.domainLemmy.data)
|
||||
implementation(projects.domainLemmy.repository)
|
||||
|
||||
implementation(projects.resources)
|
||||
}
|
||||
}
|
||||
val commonTest by getting {
|
||||
dependencies {
|
||||
implementation(kotlin("test"))
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
android {
|
||||
namespace = "com.github.diegoberaldin.raccoonforlemmy.unit.multicommunity"
|
||||
compileSdk = libs.versions.android.targetSdk.get().toInt()
|
||||
defaultConfig {
|
||||
minSdk = libs.versions.android.minSdk.get().toInt()
|
||||
}
|
||||
}
|
@ -0,0 +1,23 @@
|
||||
package com.github.diegoberaldin.raccoonforlemmy.unit.multicommunity.di
|
||||
|
||||
import com.github.diegoberaldin.raccoonforlemmy.core.persistence.data.MultiCommunityModel
|
||||
import com.github.diegoberaldin.raccoonforlemmy.unit.multicommunity.detail.MultiCommunityMviModel
|
||||
import com.github.diegoberaldin.raccoonforlemmy.unit.multicommunity.editor.MultiCommunityEditorMviModel
|
||||
import org.koin.core.parameter.parametersOf
|
||||
import org.koin.java.KoinJavaComponent
|
||||
|
||||
actual fun getMultiCommunityViewModel(community: MultiCommunityModel): MultiCommunityMviModel {
|
||||
val res: MultiCommunityMviModel by KoinJavaComponent.inject(
|
||||
MultiCommunityMviModel::class.java,
|
||||
parameters = { parametersOf(community) }
|
||||
)
|
||||
return res
|
||||
}
|
||||
|
||||
actual fun getMultiCommunityEditorViewModel(editedCommunity: MultiCommunityModel?): MultiCommunityEditorMviModel {
|
||||
val res: MultiCommunityEditorMviModel by KoinJavaComponent.inject(
|
||||
MultiCommunityEditorMviModel::class.java,
|
||||
parameters = { parametersOf(editedCommunity) }
|
||||
)
|
||||
return res
|
||||
}
|
@ -1,4 +1,4 @@
|
||||
package com.github.diegoberaldin.raccoonforlemmy.feature.search.multicommunity.detail
|
||||
package com.github.diegoberaldin.raccoonforlemmy.unit.multicommunity.detail
|
||||
|
||||
import cafe.adriel.voyager.core.model.ScreenModel
|
||||
import com.github.diegoberaldin.raccoonforlemmy.core.appearance.data.PostLayout
|
@ -1,4 +1,4 @@
|
||||
package com.github.diegoberaldin.raccoonforlemmy.feature.search.multicommunity.detail
|
||||
package com.github.diegoberaldin.raccoonforlemmy.unit.multicommunity.detail
|
||||
|
||||
import androidx.compose.animation.AnimatedVisibility
|
||||
import androidx.compose.animation.slideInVertically
|
||||
@ -75,9 +75,9 @@ import com.github.diegoberaldin.raccoonforlemmy.core.utils.compose.rememberCallb
|
||||
import com.github.diegoberaldin.raccoonforlemmy.core.utils.compose.rememberCallbackArgs
|
||||
import com.github.diegoberaldin.raccoonforlemmy.domain.lemmy.data.getAdditionalLabel
|
||||
import com.github.diegoberaldin.raccoonforlemmy.domain.lemmy.data.toIcon
|
||||
import com.github.diegoberaldin.raccoonforlemmy.feature.search.di.getMultiCommunityViewModel
|
||||
import com.github.diegoberaldin.raccoonforlemmy.resources.MR
|
||||
import com.github.diegoberaldin.raccoonforlemmy.unit.createreport.CreateReportScreen
|
||||
import com.github.diegoberaldin.raccoonforlemmy.unit.multicommunity.di.getMultiCommunityViewModel
|
||||
import com.github.diegoberaldin.raccoonforlemmy.unit.web.WebViewScreen
|
||||
import com.github.diegoberaldin.raccoonforlemmy.unit.zoomableimage.ZoomableImageScreen
|
||||
import dev.icerock.moko.resources.compose.stringResource
|
@ -1,4 +1,4 @@
|
||||
package com.github.diegoberaldin.raccoonforlemmy.feature.search.multicommunity.detail
|
||||
package com.github.diegoberaldin.raccoonforlemmy.unit.multicommunity.detail
|
||||
|
||||
import com.github.diegoberaldin.raccoonforlemmy.core.appearance.repository.ThemeRepository
|
||||
import com.github.diegoberaldin.raccoonforlemmy.core.architecture.DefaultMviModel
|
||||
@ -19,7 +19,7 @@ import com.github.diegoberaldin.raccoonforlemmy.domain.lemmy.data.toSortType
|
||||
import com.github.diegoberaldin.raccoonforlemmy.domain.lemmy.repository.GetSortTypesUseCase
|
||||
import com.github.diegoberaldin.raccoonforlemmy.domain.lemmy.repository.PostRepository
|
||||
import com.github.diegoberaldin.raccoonforlemmy.domain.lemmy.repository.SiteRepository
|
||||
import com.github.diegoberaldin.raccoonforlemmy.feature.search.multicommunity.utils.MultiCommunityPaginator
|
||||
import com.github.diegoberaldin.raccoonforlemmy.unit.multicommunity.utils.MultiCommunityPaginator
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.IO
|
||||
import kotlinx.coroutines.flow.launchIn
|
@ -0,0 +1,48 @@
|
||||
package com.github.diegoberaldin.raccoonforlemmy.unit.multicommunity.di
|
||||
|
||||
import com.github.diegoberaldin.raccoonforlemmy.core.architecture.DefaultMviModel
|
||||
import com.github.diegoberaldin.raccoonforlemmy.unit.multicommunity.detail.MultiCommunityMviModel
|
||||
import com.github.diegoberaldin.raccoonforlemmy.unit.multicommunity.detail.MultiCommunityViewModel
|
||||
import com.github.diegoberaldin.raccoonforlemmy.unit.multicommunity.editor.MultiCommunityEditorMviModel
|
||||
import com.github.diegoberaldin.raccoonforlemmy.unit.multicommunity.editor.MultiCommunityEditorViewModel
|
||||
import com.github.diegoberaldin.raccoonforlemmy.unit.multicommunity.utils.DefaultMultiCommunityPaginator
|
||||
import com.github.diegoberaldin.raccoonforlemmy.unit.multicommunity.utils.MultiCommunityPaginator
|
||||
import org.koin.dsl.module
|
||||
|
||||
val multiCommunityModule = module {
|
||||
factory<MultiCommunityMviModel> { params ->
|
||||
MultiCommunityViewModel(
|
||||
mvi = DefaultMviModel(MultiCommunityMviModel.UiState()),
|
||||
community = params[0],
|
||||
postRepository = get(),
|
||||
identityRepository = get(),
|
||||
apiConfigurationRepository = get(),
|
||||
siteRepository = get(),
|
||||
themeRepository = get(),
|
||||
shareHelper = get(),
|
||||
settingsRepository = get(),
|
||||
notificationCenter = get(),
|
||||
hapticFeedback = get(),
|
||||
paginator = get(),
|
||||
imagePreloadManager = get(),
|
||||
getSortTypesUseCase = get(),
|
||||
)
|
||||
}
|
||||
factory<MultiCommunityPaginator> {
|
||||
DefaultMultiCommunityPaginator(
|
||||
postRepository = get(),
|
||||
)
|
||||
}
|
||||
factory<MultiCommunityEditorMviModel> { params ->
|
||||
MultiCommunityEditorViewModel(
|
||||
mvi = DefaultMviModel(MultiCommunityEditorMviModel.UiState()),
|
||||
editedCommunity = params[0],
|
||||
identityRepository = get(),
|
||||
communityRepository = get(),
|
||||
accountRepository = get(),
|
||||
multiCommunityRepository = get(),
|
||||
notificationCenter = get(),
|
||||
settingsRepository = get(),
|
||||
)
|
||||
}
|
||||
}
|
@ -0,0 +1,9 @@
|
||||
package com.github.diegoberaldin.raccoonforlemmy.unit.multicommunity.di
|
||||
|
||||
import com.github.diegoberaldin.raccoonforlemmy.core.persistence.data.MultiCommunityModel
|
||||
import com.github.diegoberaldin.raccoonforlemmy.unit.multicommunity.detail.MultiCommunityMviModel
|
||||
import com.github.diegoberaldin.raccoonforlemmy.unit.multicommunity.editor.MultiCommunityEditorMviModel
|
||||
|
||||
expect fun getMultiCommunityViewModel(community: MultiCommunityModel): MultiCommunityMviModel
|
||||
|
||||
expect fun getMultiCommunityEditorViewModel(editedCommunity: MultiCommunityModel?): MultiCommunityEditorMviModel
|
@ -1,4 +1,4 @@
|
||||
package com.github.diegoberaldin.raccoonforlemmy.feature.search.multicommunity.editor
|
||||
package com.github.diegoberaldin.raccoonforlemmy.unit.multicommunity.editor
|
||||
|
||||
import cafe.adriel.voyager.core.model.ScreenModel
|
||||
import com.github.diegoberaldin.raccoonforlemmy.core.architecture.MviModel
|
@ -1,4 +1,4 @@
|
||||
package com.github.diegoberaldin.raccoonforlemmy.feature.search.multicommunity.editor
|
||||
package com.github.diegoberaldin.raccoonforlemmy.unit.multicommunity.editor
|
||||
|
||||
import androidx.compose.foundation.Image
|
||||
import androidx.compose.foundation.background
|
||||
@ -63,8 +63,8 @@ import com.github.diegoberaldin.raccoonforlemmy.core.navigation.di.getNavigation
|
||||
import com.github.diegoberaldin.raccoonforlemmy.core.persistence.data.MultiCommunityModel
|
||||
import com.github.diegoberaldin.raccoonforlemmy.core.utils.compose.onClick
|
||||
import com.github.diegoberaldin.raccoonforlemmy.core.utils.compose.rememberCallback
|
||||
import com.github.diegoberaldin.raccoonforlemmy.feature.search.di.getMultiCommunityEditorViewModel
|
||||
import com.github.diegoberaldin.raccoonforlemmy.resources.MR
|
||||
import com.github.diegoberaldin.raccoonforlemmy.unit.multicommunity.di.getMultiCommunityEditorViewModel
|
||||
import dev.icerock.moko.resources.compose.localized
|
||||
import dev.icerock.moko.resources.compose.stringResource
|
||||
import kotlinx.coroutines.flow.launchIn
|
@ -1,4 +1,4 @@
|
||||
package com.github.diegoberaldin.raccoonforlemmy.feature.search.multicommunity.editor
|
||||
package com.github.diegoberaldin.raccoonforlemmy.unit.multicommunity.editor
|
||||
|
||||
import com.github.diegoberaldin.raccoonforlemmy.core.architecture.DefaultMviModel
|
||||
import com.github.diegoberaldin.raccoonforlemmy.core.architecture.MviModel
|
@ -1,4 +1,4 @@
|
||||
package com.github.diegoberaldin.raccoonforlemmy.feature.search.multicommunity.utils
|
||||
package com.github.diegoberaldin.raccoonforlemmy.unit.multicommunity.utils
|
||||
|
||||
import com.github.diegoberaldin.raccoonforlemmy.domain.lemmy.data.ListingType
|
||||
import com.github.diegoberaldin.raccoonforlemmy.domain.lemmy.data.PostModel
|
@ -1,4 +1,4 @@
|
||||
package com.github.diegoberaldin.raccoonforlemmy.feature.search.multicommunity.utils
|
||||
package com.github.diegoberaldin.raccoonforlemmy.unit.multicommunity.utils
|
||||
|
||||
import com.github.diegoberaldin.raccoonforlemmy.domain.lemmy.data.PostModel
|
||||
import com.github.diegoberaldin.raccoonforlemmy.domain.lemmy.data.SortType
|
@ -1,4 +1,4 @@
|
||||
package com.github.diegoberaldin.raccoonforlemmy.feature.search.multicommunity.utils
|
||||
package com.github.diegoberaldin.raccoonforlemmy.unit.multicommunity.utils
|
||||
|
||||
import com.github.diegoberaldin.raccoonforlemmy.domain.lemmy.data.PostModel
|
||||
import com.github.diegoberaldin.raccoonforlemmy.domain.lemmy.data.SortType
|
@ -0,0 +1,26 @@
|
||||
package com.github.diegoberaldin.raccoonforlemmy.unit.multicommunity.di
|
||||
|
||||
import com.github.diegoberaldin.raccoonforlemmy.core.persistence.data.MultiCommunityModel
|
||||
import com.github.diegoberaldin.raccoonforlemmy.unit.multicommunity.detail.MultiCommunityMviModel
|
||||
import com.github.diegoberaldin.raccoonforlemmy.unit.multicommunity.editor.MultiCommunityEditorMviModel
|
||||
import org.koin.core.component.KoinComponent
|
||||
import org.koin.core.component.inject
|
||||
import org.koin.core.parameter.parametersOf
|
||||
|
||||
actual fun getMultiCommunityViewModel(community: MultiCommunityModel): MultiCommunityMviModel =
|
||||
UnitMultiCommunityDiHelper.getMultiCommunityViewModel(community)
|
||||
|
||||
actual fun getMultiCommunityEditorViewModel(editedCommunity: MultiCommunityModel?): MultiCommunityEditorMviModel =
|
||||
UnitMultiCommunityDiHelper.getMultiCommunityEditorViewModel(editedCommunity)
|
||||
|
||||
object UnitMultiCommunityDiHelper : KoinComponent {
|
||||
internal fun getMultiCommunityViewModel(community: MultiCommunityModel): MultiCommunityMviModel {
|
||||
val res: MultiCommunityMviModel by inject(parameters = { parametersOf(community) })
|
||||
return res
|
||||
}
|
||||
|
||||
internal fun getMultiCommunityEditorViewModel(editedCommunity: MultiCommunityModel?): MultiCommunityEditorMviModel {
|
||||
val res: MultiCommunityEditorMviModel by inject(parameters = { parametersOf(editedCommunity) })
|
||||
return res
|
||||
}
|
||||
}
|
80
unit-postlist/build.gradle.kts
Normal file
80
unit-postlist/build.gradle.kts
Normal file
@ -0,0 +1,80 @@
|
||||
plugins {
|
||||
alias(libs.plugins.kotlin.multiplatform)
|
||||
alias(libs.plugins.android.library)
|
||||
alias(libs.plugins.compose)
|
||||
}
|
||||
|
||||
@OptIn(org.jetbrains.kotlin.gradle.ExperimentalKotlinGradlePluginApi::class)
|
||||
kotlin {
|
||||
applyDefaultHierarchyTemplate()
|
||||
|
||||
androidTarget {
|
||||
compilations.all {
|
||||
kotlinOptions {
|
||||
jvmTarget = "1.8"
|
||||
}
|
||||
}
|
||||
}
|
||||
iosX64()
|
||||
iosArm64()
|
||||
iosSimulatorArm64()
|
||||
|
||||
sourceSets {
|
||||
val commonMain by getting {
|
||||
dependencies {
|
||||
implementation(compose.runtime)
|
||||
implementation(compose.foundation)
|
||||
implementation(compose.material)
|
||||
implementation(compose.material3)
|
||||
@OptIn(org.jetbrains.compose.ExperimentalComposeLibrary::class)
|
||||
implementation(compose.components.resources)
|
||||
implementation(compose.materialIconsExtended)
|
||||
|
||||
implementation(libs.koin.core)
|
||||
implementation(libs.voyager.screenmodel)
|
||||
implementation(libs.voyager.navigator)
|
||||
|
||||
implementation(projects.coreUtils)
|
||||
implementation(projects.coreAppearance)
|
||||
implementation(projects.coreArchitecture)
|
||||
implementation(projects.coreCommonui.components)
|
||||
implementation(projects.coreCommonui.lemmyui)
|
||||
implementation(projects.coreCommonui.modals)
|
||||
implementation(projects.unitZoomableimage)
|
||||
implementation(projects.unitWeb)
|
||||
implementation(projects.unitCreatereport)
|
||||
implementation(projects.unitCreatecomment)
|
||||
implementation(projects.unitCreatepost)
|
||||
implementation(projects.unitRemove)
|
||||
implementation(projects.unitBan)
|
||||
implementation(projects.unitCommunityinfo)
|
||||
implementation(projects.unitInstanceinfo)
|
||||
implementation(projects.unitCreatereport)
|
||||
implementation(projects.unitReportlist)
|
||||
implementation(projects.coreCommonui.detailopenerApi)
|
||||
implementation(projects.coreNavigation)
|
||||
implementation(projects.corePersistence)
|
||||
implementation(projects.coreNotifications)
|
||||
|
||||
implementation(projects.domainIdentity)
|
||||
implementation(projects.domainLemmy.data)
|
||||
implementation(projects.domainLemmy.repository)
|
||||
|
||||
implementation(projects.resources)
|
||||
}
|
||||
}
|
||||
val commonTest by getting {
|
||||
dependencies {
|
||||
implementation(kotlin("test"))
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
android {
|
||||
namespace = "com.github.diegoberaldin.raccoonforlemmy.unit.postlist"
|
||||
compileSdk = libs.versions.android.targetSdk.get().toInt()
|
||||
defaultConfig {
|
||||
minSdk = libs.versions.android.minSdk.get().toInt()
|
||||
}
|
||||
}
|
@ -1,6 +1,6 @@
|
||||
package com.github.diegoberaldin.raccoonforlemmy.feature.home.di
|
||||
package com.github.diegoberaldin.raccoonforlemmy.unit.postlist.di
|
||||
|
||||
import com.github.diegoberaldin.raccoonforlemmy.feature.home.postlist.PostListMviModel
|
||||
import com.github.diegoberaldin.raccoonforlemmy.unit.postlist.PostListMviModel
|
||||
import org.koin.java.KoinJavaComponent.inject
|
||||
|
||||
actual fun getHomeScreenModel(): PostListMviModel {
|
@ -1,4 +1,4 @@
|
||||
package com.github.diegoberaldin.raccoonforlemmy.feature.home.postlist
|
||||
package com.github.diegoberaldin.raccoonforlemmy.unit.postlist
|
||||
|
||||
import androidx.compose.runtime.Stable
|
||||
import cafe.adriel.voyager.core.model.ScreenModel
|
@ -1,4 +1,4 @@
|
||||
package com.github.diegoberaldin.raccoonforlemmy.feature.home.postlist
|
||||
package com.github.diegoberaldin.raccoonforlemmy.unit.postlist
|
||||
|
||||
import androidx.compose.animation.AnimatedVisibility
|
||||
import androidx.compose.animation.core.tween
|
||||
@ -69,6 +69,7 @@ import com.github.diegoberaldin.raccoonforlemmy.core.commonui.lemmyui.di.getFabN
|
||||
import com.github.diegoberaldin.raccoonforlemmy.core.commonui.modals.ListingTypeBottomSheet
|
||||
import com.github.diegoberaldin.raccoonforlemmy.core.commonui.modals.RawContentDialog
|
||||
import com.github.diegoberaldin.raccoonforlemmy.core.commonui.modals.SortBottomSheet
|
||||
import com.github.diegoberaldin.raccoonforlemmy.core.navigation.TabNavigationSection
|
||||
import com.github.diegoberaldin.raccoonforlemmy.core.navigation.di.getDrawerCoordinator
|
||||
import com.github.diegoberaldin.raccoonforlemmy.core.navigation.di.getNavigationCoordinator
|
||||
import com.github.diegoberaldin.raccoonforlemmy.core.persistence.di.getSettingsRepository
|
||||
@ -76,12 +77,11 @@ import com.github.diegoberaldin.raccoonforlemmy.core.utils.compose.rememberCallb
|
||||
import com.github.diegoberaldin.raccoonforlemmy.core.utils.compose.rememberCallbackArgs
|
||||
import com.github.diegoberaldin.raccoonforlemmy.core.utils.keepscreenon.rememberKeepScreenOn
|
||||
import com.github.diegoberaldin.raccoonforlemmy.domain.lemmy.data.PostModel
|
||||
import com.github.diegoberaldin.raccoonforlemmy.feature.home.di.getHomeScreenModel
|
||||
import com.github.diegoberaldin.raccoonforlemmy.feature.home.ui.HomeTab
|
||||
import com.github.diegoberaldin.raccoonforlemmy.resources.MR
|
||||
import com.github.diegoberaldin.raccoonforlemmy.unit.createcomment.CreateCommentScreen
|
||||
import com.github.diegoberaldin.raccoonforlemmy.unit.createpost.CreatePostScreen
|
||||
import com.github.diegoberaldin.raccoonforlemmy.unit.createreport.CreateReportScreen
|
||||
import com.github.diegoberaldin.raccoonforlemmy.unit.postlist.di.getHomeScreenModel
|
||||
import com.github.diegoberaldin.raccoonforlemmy.unit.web.WebViewScreen
|
||||
import com.github.diegoberaldin.raccoonforlemmy.unit.zoomableimage.ZoomableImageScreen
|
||||
import dev.icerock.moko.resources.compose.stringResource
|
||||
@ -117,8 +117,8 @@ class PostListScreen : Screen {
|
||||
val detailOpener = remember { getDetailOpener() }
|
||||
|
||||
LaunchedEffect(navigationCoordinator) {
|
||||
navigationCoordinator.onDoubleTabSelection.onEach { tab ->
|
||||
if (tab == HomeTab) {
|
||||
navigationCoordinator.onDoubleTabSelection.onEach { section ->
|
||||
if (section == TabNavigationSection.Home) {
|
||||
lazyListState.scrollToItem(0)
|
||||
topAppBarState.heightOffset = 0f
|
||||
topAppBarState.contentOffset = 0f
|
@ -1,4 +1,4 @@
|
||||
package com.github.diegoberaldin.raccoonforlemmy.feature.home.postlist
|
||||
package com.github.diegoberaldin.raccoonforlemmy.unit.postlist
|
||||
|
||||
import com.github.diegoberaldin.raccoonforlemmy.core.appearance.repository.ThemeRepository
|
||||
import com.github.diegoberaldin.raccoonforlemmy.core.architecture.DefaultMviModel
|
@ -1,4 +1,4 @@
|
||||
package com.github.diegoberaldin.raccoonforlemmy.feature.home.postlist
|
||||
package com.github.diegoberaldin.raccoonforlemmy.unit.postlist
|
||||
|
||||
import androidx.compose.foundation.Image
|
||||
import androidx.compose.foundation.layout.Box
|
@ -0,0 +1,27 @@
|
||||
package com.github.diegoberaldin.raccoonforlemmy.unit.postlist.di
|
||||
|
||||
import com.github.diegoberaldin.raccoonforlemmy.core.architecture.DefaultMviModel
|
||||
import com.github.diegoberaldin.raccoonforlemmy.unit.postlist.PostListMviModel
|
||||
import com.github.diegoberaldin.raccoonforlemmy.unit.postlist.PostListViewModel
|
||||
import org.koin.dsl.module
|
||||
|
||||
val postListModule = module {
|
||||
factory<PostListMviModel> {
|
||||
PostListViewModel(
|
||||
mvi = DefaultMviModel(PostListMviModel.UiState()),
|
||||
postRepository = get(),
|
||||
apiConfigurationRepository = get(),
|
||||
identityRepository = get(),
|
||||
siteRepository = get(),
|
||||
themeRepository = get(),
|
||||
settingsRepository = get(),
|
||||
shareHelper = get(),
|
||||
notificationCenter = get(),
|
||||
hapticFeedback = get(),
|
||||
zombieModeHelper = get(),
|
||||
imagePreloadManager = get(),
|
||||
contentResetCoordinator = get(),
|
||||
getSortTypesUseCase = get(),
|
||||
)
|
||||
}
|
||||
}
|
@ -0,0 +1,5 @@
|
||||
package com.github.diegoberaldin.raccoonforlemmy.unit.postlist.di
|
||||
|
||||
import com.github.diegoberaldin.raccoonforlemmy.unit.postlist.PostListMviModel
|
||||
|
||||
expect fun getHomeScreenModel(): PostListMviModel
|
@ -0,0 +1,11 @@
|
||||
package com.github.diegoberaldin.raccoonforlemmy.unit.postlist.di
|
||||
|
||||
import com.github.diegoberaldin.raccoonforlemmy.unit.postlist.PostListMviModel
|
||||
import org.koin.core.component.KoinComponent
|
||||
import org.koin.core.component.inject
|
||||
|
||||
actual fun getHomeScreenModel(): PostListMviModel = UnitPostListDiHelper.model
|
||||
|
||||
object UnitPostListDiHelper : KoinComponent {
|
||||
val model: PostListMviModel by inject()
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user