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:
Diego Beraldin 2023-12-19 12:41:49 +01:00 committed by GitHub
parent 072d1420d6
commit a79b29fe63
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
70 changed files with 667 additions and 255 deletions

View File

@ -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)
}
}
}

View File

@ -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)?)

View File

@ -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)

View File

@ -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,
)
}

View File

@ -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

View File

@ -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 {

View File

@ -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()
}

View File

@ -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)

View File

@ -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)

View File

@ -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)

View File

@ -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)

View File

@ -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
}

View File

@ -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(),
)
}
}

View File

@ -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

View File

@ -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

View File

@ -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
}
}

View File

@ -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 {

View File

@ -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
}
}

View File

@ -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(),
)
}
}

View File

@ -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

View File

@ -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

View File

@ -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()
}

View File

@ -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")

View File

@ -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)

View File

@ -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,
)
}

View File

@ -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

View File

@ -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 {

View File

@ -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 = {

View File

@ -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,
)
}

View 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()
}
}

View File

@ -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
}

View File

@ -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 =

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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(),
)
}
}

View File

@ -0,0 +1,5 @@
package com.github.diegoberaldin.raccoonforlemmy.unit.about.di
import com.github.diegoberaldin.raccoonforlemmy.unit.about.AboutDialogMviModel
expect fun getAboutDialogViewModel(): AboutDialogMviModel

View File

@ -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()
}

View File

@ -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)
})

View 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()
}
}

View File

@ -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
}

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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(),
)
}
}

View File

@ -0,0 +1,5 @@
package com.github.diegoberaldin.raccoonforlemmy.unit.managesubscriptions.di
import com.github.diegoberaldin.raccoonforlemmy.unit.managesubscriptions.ManageSubscriptionsMviModel
expect fun getManageSubscriptionsViewModel(): ManageSubscriptionsMviModel

View File

@ -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()
}

View 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()
}
}

View File

@ -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
}

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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(),
)
}
}

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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
}
}

View 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()
}
}

View File

@ -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 {

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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(),
)
}
}

View File

@ -0,0 +1,5 @@
package com.github.diegoberaldin.raccoonforlemmy.unit.postlist.di
import com.github.diegoberaldin.raccoonforlemmy.unit.postlist.PostListMviModel
expect fun getHomeScreenModel(): PostListMviModel

View File

@ -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()
}