From 12f3b74a429188e0378b6a68fb581a60402c7e81 Mon Sep 17 00:00:00 2001 From: Victor Kabata Date: Mon, 22 Jul 2024 10:36:34 +0300 Subject: [PATCH 01/14] Added jetpack viewmodel --- gradle/libs.versions.toml | 6 ++++-- shared/build.gradle.kts | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 44aa5990..eedf4f65 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -13,7 +13,8 @@ nativeCocoapod = "1.9.0" # Kotlin Multiplatform Version kotlinxCoroutines = "1.7.3" koinCore = "3.5.3" -koinCompose = "1.1.2" +koinCompose = "1.1.5" +koinComposeViewModel = "1.2.0-Beta4" koinAndroid = "3.5.3" koinAndroidxCompose = "3.5.3" kotlinxSerializationJson = "1.6.2" @@ -107,11 +108,12 @@ material-windowSizeClass = { module = "dev.chrisbanes.material3:material3-window #Android Lib Dependencies androidX-core = { module = "androidx.core:core-ktx", version.ref = "androidxCore" } -androidX-activity={module="androidx.activity:activity-compose", version.ref="androidxActivity"} +androidX-activity = { module = "androidx.activity:activity-compose", version.ref = "androidxActivity" } material = { module = "com.google.android.material:material", version.ref = "material" } koin-android = { module = "io.insert-koin:koin-android", version.ref = "koinAndroid" } koin-androidx-compose = { module = "io.insert-koin:koin-androidx-compose", version.ref = "koinAndroidxCompose" } koin-compose = { module = "io.insert-koin:koin-compose", version.ref = "koinCompose" } +koin-composeViewModel = { module = "io.insert-koin:koin-compose-viewmodel", version.ref = "koinComposeViewModel" } leakCanary = { module = "com.squareup.leakcanary:leakcanary-android", version.ref = "leakCanary" } firebase-BOM = { module = "com.google.firebase:firebase-bom", version.ref = "firebaseBOM" } firebase-analytics = { module = "com.google.firebase:firebase-analytics-ktx" } diff --git a/shared/build.gradle.kts b/shared/build.gradle.kts index e56e71c6..350ad1f8 100644 --- a/shared/build.gradle.kts +++ b/shared/build.gradle.kts @@ -59,6 +59,7 @@ kotlin { api(libs.koin.core) implementation(libs.koin.compose) + implementation(libs.koin.composeViewModel) implementation(libs.kotlinX.serializationJson) @@ -72,7 +73,6 @@ kotlin { implementation(libs.imageLoader) api(libs.preCompose) - api(libs.preCompose.viewmodel) implementation(libs.sqlDelight.coroutine) From 30c20810460c0023867189776841434cbc50ff12 Mon Sep 17 00:00:00 2001 From: Victor Kabata Date: Mon, 22 Jul 2024 10:41:22 +0300 Subject: [PATCH 02/14] Migrate all viewmodel to jetpack viewmodel --- .../ui/screens/details/DetailsScreen.kt | 3 ++- .../ui/screens/details/DetailsViewModel.kt | 4 ++-- .../ui/screens/favorites/FavoritesScreen.kt | 7 +++++-- .../screens/favorites/FavoritesViewModel.kt | 4 ++-- .../shared/ui/screens/home/HomeScreen.kt | 5 ++--- .../shared/ui/screens/home/HomeViewModel.kt | 6 +++--- .../shared/ui/screens/main/MainScreen.kt | 5 ++--- .../shared/ui/screens/main/MainViewModel.kt | 6 +++--- .../ui/screens/settings/SettingsScreen.kt | 20 +++++++++---------- .../ui/screens/settings/SettingsViewModel.kt | 3 ++- 10 files changed, 33 insertions(+), 30 deletions(-) diff --git a/shared/src/commonMain/kotlin/com/vickbt/shared/ui/screens/details/DetailsScreen.kt b/shared/src/commonMain/kotlin/com/vickbt/shared/ui/screens/details/DetailsScreen.kt index b38c2a34..3e846227 100644 --- a/shared/src/commonMain/kotlin/com/vickbt/shared/ui/screens/details/DetailsScreen.kt +++ b/shared/src/commonMain/kotlin/com/vickbt/shared/ui/screens/details/DetailsScreen.kt @@ -36,12 +36,13 @@ import com.vickbt.shared.utils.getRating import io.github.aakira.napier.Napier import moe.tlaster.precompose.navigation.Navigator import org.koin.compose.koinInject +import org.koin.compose.viewmodel.koinViewModel @Composable fun DetailsScreen( navigator: Navigator, windowSize: WindowSize = WindowSize.COMPACT, - viewModel: DetailsViewModel = koinInject(), + viewModel: DetailsViewModel = koinViewModel(), movieId: Int ) { LaunchedEffect(key1 = Unit) { diff --git a/shared/src/commonMain/kotlin/com/vickbt/shared/ui/screens/details/DetailsViewModel.kt b/shared/src/commonMain/kotlin/com/vickbt/shared/ui/screens/details/DetailsViewModel.kt index 34fbbfe4..84f973e3 100644 --- a/shared/src/commonMain/kotlin/com/vickbt/shared/ui/screens/details/DetailsViewModel.kt +++ b/shared/src/commonMain/kotlin/com/vickbt/shared/ui/screens/details/DetailsViewModel.kt @@ -1,5 +1,6 @@ package com.vickbt.shared.ui.screens.details +import androidx.lifecycle.ViewModel import com.vickbt.shared.domain.models.MovieDetails import com.vickbt.shared.domain.repositories.MovieDetailsRepository import com.vickbt.shared.utils.DetailsUiState @@ -14,11 +15,10 @@ import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch -import org.koin.core.component.KoinComponent class DetailsViewModel( private val movieDetailsRepository: MovieDetailsRepository -) : KoinComponent { +) : ViewModel() { private val _movieDetailsState = MutableStateFlow(DetailsUiState()) val movieDetailsState = _movieDetailsState.asStateFlow() diff --git a/shared/src/commonMain/kotlin/com/vickbt/shared/ui/screens/favorites/FavoritesScreen.kt b/shared/src/commonMain/kotlin/com/vickbt/shared/ui/screens/favorites/FavoritesScreen.kt index 75bca67a..6359bc54 100644 --- a/shared/src/commonMain/kotlin/com/vickbt/shared/ui/screens/favorites/FavoritesScreen.kt +++ b/shared/src/commonMain/kotlin/com/vickbt/shared/ui/screens/favorites/FavoritesScreen.kt @@ -15,10 +15,13 @@ import androidx.compose.ui.unit.dp import com.vickbt.shared.ui.components.MovieCardDescription import com.vickbt.shared.ui.components.appbars.AppBar import moe.tlaster.precompose.navigation.Navigator -import org.koin.compose.koinInject +import org.koin.compose.viewmodel.koinViewModel @Composable -fun FavoritesScreen(navigator: Navigator, viewModel: FavoritesViewModel = koinInject()) { +fun FavoritesScreen( + navigator: Navigator, + viewModel: FavoritesViewModel = koinViewModel() +) { val favoriteMovies = viewModel.favoriteMoviesState.collectAsState().value Scaffold( diff --git a/shared/src/commonMain/kotlin/com/vickbt/shared/ui/screens/favorites/FavoritesViewModel.kt b/shared/src/commonMain/kotlin/com/vickbt/shared/ui/screens/favorites/FavoritesViewModel.kt index 7708647c..6860c54d 100644 --- a/shared/src/commonMain/kotlin/com/vickbt/shared/ui/screens/favorites/FavoritesViewModel.kt +++ b/shared/src/commonMain/kotlin/com/vickbt/shared/ui/screens/favorites/FavoritesViewModel.kt @@ -1,5 +1,6 @@ package com.vickbt.shared.ui.screens.favorites +import androidx.lifecycle.ViewModel import com.vickbt.shared.domain.repositories.FavoritesRepository import com.vickbt.shared.utils.FavouritesUiState import kotlinx.coroutines.CoroutineExceptionHandler @@ -9,11 +10,10 @@ import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch -import org.koin.core.component.KoinComponent class FavoritesViewModel( private val favoritesRepository: FavoritesRepository -) : KoinComponent { +) : ViewModel() { private val _favoriteMoviesState = MutableStateFlow(FavouritesUiState()) val favoriteMoviesState = _favoriteMoviesState.asStateFlow() diff --git a/shared/src/commonMain/kotlin/com/vickbt/shared/ui/screens/home/HomeScreen.kt b/shared/src/commonMain/kotlin/com/vickbt/shared/ui/screens/home/HomeScreen.kt index a6cb8de3..38417600 100644 --- a/shared/src/commonMain/kotlin/com/vickbt/shared/ui/screens/home/HomeScreen.kt +++ b/shared/src/commonMain/kotlin/com/vickbt/shared/ui/screens/home/HomeScreen.kt @@ -45,7 +45,6 @@ import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp -import com.vickbt.shared.presentation.ui.screens.home.HomeViewModel import com.vickbt.shared.ui.components.MovieCardLandscape import com.vickbt.shared.ui.components.MovieCardPager import com.vickbt.shared.ui.components.MovieCardPagerIndicator @@ -55,14 +54,14 @@ import com.vickbt.shared.ui.screens.search.SearchScreen import com.vickbt.shared.ui.theme.DarkPrimaryColor import com.vickbt.shared.utils.WindowSize import moe.tlaster.precompose.navigation.Navigator -import org.koin.compose.koinInject +import org.koin.compose.viewmodel.koinViewModel @OptIn(ExperimentalFoundationApi::class, ExperimentalMaterial3Api::class) @Composable fun HomeScreen( navigator: Navigator, windowSize: WindowSize = WindowSize.COMPACT, - viewModel: HomeViewModel = koinInject(), + viewModel: HomeViewModel = koinViewModel(), paddingValues: PaddingValues ) { val scrollState = rememberScrollState() diff --git a/shared/src/commonMain/kotlin/com/vickbt/shared/ui/screens/home/HomeViewModel.kt b/shared/src/commonMain/kotlin/com/vickbt/shared/ui/screens/home/HomeViewModel.kt index d7793efe..f67cad30 100644 --- a/shared/src/commonMain/kotlin/com/vickbt/shared/ui/screens/home/HomeViewModel.kt +++ b/shared/src/commonMain/kotlin/com/vickbt/shared/ui/screens/home/HomeViewModel.kt @@ -1,5 +1,6 @@ -package com.vickbt.shared.presentation.ui.screens.home +package com.vickbt.shared.ui.screens.home +import androidx.lifecycle.ViewModel import com.vickbt.shared.domain.repositories.MoviesRepository import com.vickbt.shared.utils.HomeUiState import com.vickbt.shared.utils.SearchUiState @@ -15,9 +16,8 @@ import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch -import org.koin.core.component.KoinComponent -class HomeViewModel constructor(private val moviesRepository: MoviesRepository) : KoinComponent { +class HomeViewModel(private val moviesRepository: MoviesRepository) : ViewModel() { private val _homeUiState = MutableStateFlow(HomeUiState(isLoading = true)) val homeUiState = _homeUiState.asStateFlow() diff --git a/shared/src/commonMain/kotlin/com/vickbt/shared/ui/screens/main/MainScreen.kt b/shared/src/commonMain/kotlin/com/vickbt/shared/ui/screens/main/MainScreen.kt index a1ed91f2..f7cedcd0 100644 --- a/shared/src/commonMain/kotlin/com/vickbt/shared/ui/screens/main/MainScreen.kt +++ b/shared/src/commonMain/kotlin/com/vickbt/shared/ui/screens/main/MainScreen.kt @@ -12,7 +12,6 @@ import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import com.vickbt.shared.presentation.ui.navigation.NavigationItem -import com.vickbt.shared.presentation.ui.screens.main.MainViewModel import com.vickbt.shared.ui.components.BottomNavBar import com.vickbt.shared.ui.components.NavRailBar import com.vickbt.shared.ui.navigation.Navigation @@ -20,10 +19,10 @@ import com.vickbt.shared.ui.theme.NotflixTheme import com.vickbt.shared.utils.WindowSize import moe.tlaster.precompose.PreComposeApp import moe.tlaster.precompose.navigation.rememberNavigator -import org.koin.compose.koinInject +import org.koin.compose.viewmodel.koinViewModel @Composable -fun MainScreen(viewModel: MainViewModel = koinInject()) { +fun MainScreen(viewModel: MainViewModel = koinViewModel()) { PreComposeApp { val appUiState = viewModel.mainUiState.collectAsState().value var windowSize by remember { mutableStateOf(WindowSize.COMPACT) } diff --git a/shared/src/commonMain/kotlin/com/vickbt/shared/ui/screens/main/MainViewModel.kt b/shared/src/commonMain/kotlin/com/vickbt/shared/ui/screens/main/MainViewModel.kt index 3ef9e1ac..855d4b35 100644 --- a/shared/src/commonMain/kotlin/com/vickbt/shared/ui/screens/main/MainViewModel.kt +++ b/shared/src/commonMain/kotlin/com/vickbt/shared/ui/screens/main/MainViewModel.kt @@ -1,5 +1,6 @@ -package com.vickbt.shared.presentation.ui.screens.main +package com.vickbt.shared.ui.screens.main +import androidx.lifecycle.ViewModel import com.vickbt.shared.domain.repositories.SettingsRepository import com.vickbt.shared.utils.MainUiState import io.github.aakira.napier.Napier @@ -12,9 +13,8 @@ import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch -import org.koin.core.component.KoinComponent -class MainViewModel(private val settingsRepository: SettingsRepository) : KoinComponent { +class MainViewModel(private val settingsRepository: SettingsRepository) : ViewModel() { private val _mainUiState = MutableStateFlow(MainUiState()) val mainUiState = _mainUiState.asStateFlow() diff --git a/shared/src/commonMain/kotlin/com/vickbt/shared/ui/screens/settings/SettingsScreen.kt b/shared/src/commonMain/kotlin/com/vickbt/shared/ui/screens/settings/SettingsScreen.kt index c6378d38..9e272f78 100644 --- a/shared/src/commonMain/kotlin/com/vickbt/shared/ui/screens/settings/SettingsScreen.kt +++ b/shared/src/commonMain/kotlin/com/vickbt/shared/ui/screens/settings/SettingsScreen.kt @@ -18,13 +18,13 @@ import com.vickbt.shared.ui.components.appbars.AppBar import com.vickbt.shared.ui.components.preferences.DialogPreferenceSelection import com.vickbt.shared.ui.components.preferences.PreferencesGroup import com.vickbt.shared.ui.components.preferences.TextPreference -import org.koin.compose.koinInject +import org.koin.compose.viewmodel.koinViewModel private val themeLabels = listOf("Light", "Dark", "System Default") private val imageQualityLabels = listOf("High Quality", "Low Quality") @Composable -fun SettingsScreen(viewModel: SettingsViewModel = koinInject()) { +fun SettingsScreen(viewModel: SettingsViewModel = koinViewModel()) { val settingsUiState = viewModel.settingsUiState.collectAsState().value val showThemeDialog = remember { mutableStateOf(false) } @@ -47,10 +47,10 @@ fun SettingsScreen(viewModel: SettingsViewModel = koinInject()) { if (showThemeDialog.value) { ChangeTheme( - viewModel = viewModel, - showDialog = showThemeDialog, - currentValue = themeLabel - ) + viewModel = viewModel, + showDialog = showThemeDialog, + currentValue = themeLabel + ) } TextPreference( @@ -62,10 +62,10 @@ fun SettingsScreen(viewModel: SettingsViewModel = koinInject()) { if (showImageQualityDialog.value) { ChangeImageQuality( - viewModel = viewModel, - showDialog = showImageQualityDialog, - currentValue = imageQualityLabel - ) + viewModel = viewModel, + showDialog = showImageQualityDialog, + currentValue = imageQualityLabel + ) } } } diff --git a/shared/src/commonMain/kotlin/com/vickbt/shared/ui/screens/settings/SettingsViewModel.kt b/shared/src/commonMain/kotlin/com/vickbt/shared/ui/screens/settings/SettingsViewModel.kt index 765daa0e..05162182 100644 --- a/shared/src/commonMain/kotlin/com/vickbt/shared/ui/screens/settings/SettingsViewModel.kt +++ b/shared/src/commonMain/kotlin/com/vickbt/shared/ui/screens/settings/SettingsViewModel.kt @@ -1,5 +1,6 @@ package com.vickbt.shared.ui.screens.settings +import androidx.lifecycle.ViewModel import com.vickbt.shared.domain.repositories.SettingsRepository import com.vickbt.shared.utils.SettingsUiState import kotlinx.coroutines.CoroutineExceptionHandler @@ -13,7 +14,7 @@ import kotlinx.coroutines.launch import org.koin.core.component.KoinComponent class SettingsViewModel(private val settingsRepository: SettingsRepository) : - KoinComponent { + ViewModel() { private val _settingsUiState = MutableStateFlow(SettingsUiState(isLoading = true)) val settingsUiState = _settingsUiState.asStateFlow() From bc79615c0a6145b064bc2721fcc3a3c799aaf38b Mon Sep 17 00:00:00 2001 From: Victor Kabata Date: Mon, 22 Jul 2024 10:41:36 +0300 Subject: [PATCH 03/14] Migrate singleton viewmodel to koin viewmodel --- .../kotlin/com/vickbt/shared/di/CommonModule.kt | 16 +++++++++------- .../kotlin/com/vickbt/shared/di/Koin.kt | 4 ++-- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/shared/src/commonMain/kotlin/com/vickbt/shared/di/CommonModule.kt b/shared/src/commonMain/kotlin/com/vickbt/shared/di/CommonModule.kt index dfe1fcf3..34f37fd8 100644 --- a/shared/src/commonMain/kotlin/com/vickbt/shared/di/CommonModule.kt +++ b/shared/src/commonMain/kotlin/com/vickbt/shared/di/CommonModule.kt @@ -12,8 +12,8 @@ import com.vickbt.shared.domain.repositories.MoviesRepository import com.vickbt.shared.domain.repositories.SettingsRepository import com.vickbt.shared.domain.utils.Constants.BASE_URL import com.vickbt.shared.domain.utils.Constants.URL_PATH -import com.vickbt.shared.presentation.ui.screens.home.HomeViewModel -import com.vickbt.shared.presentation.ui.screens.main.MainViewModel +import com.vickbt.shared.ui.screens.home.HomeViewModel +import com.vickbt.shared.ui.screens.main.MainViewModel import com.vickbt.shared.ui.screens.settings.SettingsViewModel import com.vickbt.shared.ui.screens.details.DetailsViewModel import com.vickbt.shared.ui.screens.favorites.FavoritesViewModel @@ -30,6 +30,7 @@ import io.ktor.http.URLProtocol import io.ktor.http.path import io.ktor.serialization.kotlinx.json.json import kotlinx.serialization.json.Json +import org.koin.compose.viewmodel.dsl.viewModelOf import org.koin.core.module.Module import org.koin.core.module.dsl.factoryOf import org.koin.core.module.dsl.singleOf @@ -87,11 +88,12 @@ fun commonModule(enableNetworkLogs: Boolean) = module { single { FavoritesRepositoryImpl(favoriteMovieDao = get()) } single { SettingsRepositoryImpl(observableSettings = get()) } - singleOf(::MainViewModel) - singleOf(::HomeViewModel) - factoryOf(::DetailsViewModel) - singleOf(::SettingsViewModel) - singleOf(::FavoritesViewModel) + viewModelOf(::MainViewModel) + viewModelOf(::HomeViewModel) + viewModelOf(::DetailsViewModel) + viewModelOf(::SettingsViewModel) + viewModelOf(::FavoritesViewModel) + } expect fun platformModule(): Module diff --git a/shared/src/commonMain/kotlin/com/vickbt/shared/di/Koin.kt b/shared/src/commonMain/kotlin/com/vickbt/shared/di/Koin.kt index 44899aa8..b22f87f8 100644 --- a/shared/src/commonMain/kotlin/com/vickbt/shared/di/Koin.kt +++ b/shared/src/commonMain/kotlin/com/vickbt/shared/di/Koin.kt @@ -1,7 +1,7 @@ package com.vickbt.shared.di -import com.vickbt.shared.presentation.ui.screens.home.HomeViewModel -import com.vickbt.shared.presentation.ui.screens.main.MainViewModel +import com.vickbt.shared.ui.screens.home.HomeViewModel +import com.vickbt.shared.ui.screens.main.MainViewModel import com.vickbt.shared.ui.screens.settings.SettingsViewModel import org.koin.core.Koin import org.koin.core.KoinApplication From 504254af1df2a66ecaedb91f3e2feff6fe79d3e5 Mon Sep 17 00:00:00 2001 From: Victor Kabata Date: Mon, 22 Jul 2024 10:47:57 +0300 Subject: [PATCH 04/14] Added jetpack navigation lib --- gradle/libs.versions.toml | 3 ++- shared/build.gradle.kts | 2 ++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index eedf4f65..13e14b82 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -29,6 +29,7 @@ kover = "0.6.1" preCompose = "1.5.10" imageLoader = "1.7.1" materialWindowSizeClass = "0.3.0" +navigation = "2.7.0-alpha07" #Android Versions androidxActivity = "1.8.2" @@ -103,8 +104,8 @@ multiplatformSettings-coroutines = { module = "com.russhwolf:multiplatform-setti multiplatformSettings-test = { module = "com.russhwolf:multiplatform-settings-test", version.ref = "multiplatformSettings" } imageLoader = { module = "io.github.qdsfdhvh:image-loader", version.ref = "imageLoader" } preCompose = { module = "moe.tlaster:precompose", version.ref = "preCompose" } -preCompose-viewmodel = { module = "moe.tlaster:precompose-viewmodel", version.ref = "preCompose" } material-windowSizeClass = { module = "dev.chrisbanes.material3:material3-window-size-class-multiplatform", version.ref = "materialWindowSizeClass" } +navigation = { module = "org.jetbrains.androidx.navigation:navigation-compose", version.ref = "navigation" } #Android Lib Dependencies androidX-core = { module = "androidx.core:core-ktx", version.ref = "androidxCore" } diff --git a/shared/build.gradle.kts b/shared/build.gradle.kts index 350ad1f8..d24603f5 100644 --- a/shared/build.gradle.kts +++ b/shared/build.gradle.kts @@ -74,6 +74,8 @@ kotlin { api(libs.preCompose) + implementation(libs.navigation) + implementation(libs.sqlDelight.coroutine) // implementation(libs.material.windowSizeClass) From 0e0bc3fdaecfd04bdd086343f56933bfd126e75e Mon Sep 17 00:00:00 2001 From: Victor Kabata Date: Mon, 22 Jul 2024 12:18:09 +0300 Subject: [PATCH 05/14] Migrate to jetpack navigation --- gradle/libs.versions.toml | 16 ++++++++++------ shared/build.gradle.kts | 3 +-- .../vickbt/shared/ui/components/BottomNavBar.kt | 12 ++++++------ .../vickbt/shared/ui/components/NavRailBar.kt | 12 ++++++------ .../shared/ui/screens/details/DetailsScreen.kt | 7 +++---- .../ui/screens/favorites/FavoritesScreen.kt | 4 ++-- .../vickbt/shared/ui/screens/home/HomeScreen.kt | 3 ++- .../vickbt/shared/ui/screens/main/MainScreen.kt | 15 ++++++++------- .../shared/ui/screens/search/SearchScreen.kt | 3 ++- 9 files changed, 40 insertions(+), 35 deletions(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 13e14b82..9580de3d 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -17,19 +17,19 @@ koinCompose = "1.1.5" koinComposeViewModel = "1.2.0-Beta4" koinAndroid = "3.5.3" koinAndroidxCompose = "3.5.3" +composeMultiplatform = "1.5.11" kotlinxSerializationJson = "1.6.2" kotlinxDateTime = "0.5.0" napier = "2.6.1" ktor = "2.3.7" sqlDelight = "2.0.1" multiplatformSettings = "1.1.1" -kmpNativeCoroutines = "0.12.1-new-mm" buildKonfig = "0.13.3" kover = "0.6.1" -preCompose = "1.5.10" imageLoader = "1.7.1" materialWindowSizeClass = "0.3.0" navigation = "2.7.0-alpha07" +coil = "3.0.0-alpha06" #Android Versions androidxActivity = "1.8.2" @@ -52,7 +52,6 @@ espresso = "3.5.1" test = "1.5.0" archTestCore = "2.2.0" turbine = "0.12.3" -composeMultiplatform = "1.5.11" [plugins] ktLint = { id = "org.jlleitschuh.gradle.ktlint", version.ref = "ktLint" } @@ -66,7 +65,6 @@ android-library = { id = "com.android.library", version.ref = "gradle" } android-application = { id = "com.android.application", version.ref = "gradle" } jvm = { id = "org.jetbrains.kotlin.jvm", version.ref = "kotlin" } kotlinX-serialization-plugin = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin" } -kmp-NativeCoroutines-plugin = { id = "com.rickclephas.kmp.nativecoroutines", version.ref = "kmpNativeCoroutines" } buildKonfig = { id = "com.codingfeline.buildkonfig", version.ref = "buildKonfig" } compose = { id = "org.jetbrains.compose", version.ref = "composeMultiplatform" } sqlDelight = { id = "app.cash.sqldelight", version.ref = "sqlDelight" } @@ -103,9 +101,12 @@ multiplatformSettings-noArg = { module = "com.russhwolf:multiplatform-settings-n multiplatformSettings-coroutines = { module = "com.russhwolf:multiplatform-settings-coroutines", version.ref = "multiplatformSettings" } multiplatformSettings-test = { module = "com.russhwolf:multiplatform-settings-test", version.ref = "multiplatformSettings" } imageLoader = { module = "io.github.qdsfdhvh:image-loader", version.ref = "imageLoader" } -preCompose = { module = "moe.tlaster:precompose", version.ref = "preCompose" } material-windowSizeClass = { module = "dev.chrisbanes.material3:material3-window-size-class-multiplatform", version.ref = "materialWindowSizeClass" } navigation = { module = "org.jetbrains.androidx.navigation:navigation-compose", version.ref = "navigation" } +coil-compose = { module = "io.coil-kt.coil3:coil-compose", version.ref = "coil" } +coil-compose-core = { module = "io.coil-kt.coil3:coil-compose-core", version.ref = "coil" } +coil-ktor = { module = "io.coil-kt.coil3:coil-network-ktor", version.ref = "coil" } +coil-multiplatform = { module = "io.coil-kt.coil3:coil", version.ref = "coil" } #Android Lib Dependencies androidX-core = { module = "androidx.core:core-ktx", version.ref = "androidxCore" } @@ -136,4 +137,7 @@ test-core = { module = "androidx.test:core-ktx", version.ref = "test" } archTestCore = { module = "androidx.arch.core:core-testing", version.ref = "archTestCore" } test-rules = { module = "androidx.test:rules", version.ref = "test" } test-runner = { module = "androidx.test:runner", version.ref = "test" } -turbine = { module = "app.cash.turbine:turbine", version.ref = "turbine" } \ No newline at end of file +turbine = { module = "app.cash.turbine:turbine", version.ref = "turbine" } + +[bundles] +coil=["coil-compose-core", "coil-compose", "coil-ktor", "coil-multiplatform"] \ No newline at end of file diff --git a/shared/build.gradle.kts b/shared/build.gradle.kts index d24603f5..ae9353b4 100644 --- a/shared/build.gradle.kts +++ b/shared/build.gradle.kts @@ -71,8 +71,7 @@ kotlin { api(libs.napier) implementation(libs.imageLoader) - - api(libs.preCompose) + implementation(libs.bundles.coil) implementation(libs.navigation) diff --git a/shared/src/commonMain/kotlin/com/vickbt/shared/ui/components/BottomNavBar.kt b/shared/src/commonMain/kotlin/com/vickbt/shared/ui/components/BottomNavBar.kt index f5e45590..b878cb36 100644 --- a/shared/src/commonMain/kotlin/com/vickbt/shared/ui/components/BottomNavBar.kt +++ b/shared/src/commonMain/kotlin/com/vickbt/shared/ui/components/BottomNavBar.kt @@ -8,16 +8,16 @@ import androidx.compose.material3.NavigationBarItem import androidx.compose.material3.NavigationBarItemDefaults import androidx.compose.material3.Text import androidx.compose.runtime.Composable -import androidx.compose.runtime.collectAsState import androidx.compose.ui.Modifier -import com.vickbt.shared.presentation.ui.navigation.NavigationItem +import androidx.navigation.NavHostController +import androidx.navigation.compose.currentBackStackEntryAsState +import com.vickbt.shared.ui.navigation.NavigationItem import com.vickbt.shared.ui.theme.Gray -import moe.tlaster.precompose.navigation.Navigator @Composable fun BottomNavBar( modifier: Modifier = Modifier, - navigator: Navigator, + navHostController: NavHostController, bottomNavItems: List ) { NavigationBar( @@ -27,7 +27,7 @@ fun BottomNavBar( bottomNavItems.iterator().forEach { item -> val currentDestination = - navigator.currentEntry.collectAsState(null).value?.route?.route + navHostController.currentBackStackEntryAsState().value?.destination?.route val isSelected = item.route == currentDestination NavigationBarItem( @@ -45,7 +45,7 @@ fun BottomNavBar( ), selected = isSelected, onClick = { - if (item.route != currentDestination) navigator.navigate(route = item.route) + if (item.route != currentDestination) navHostController.navigate(route = item.route) } ) } diff --git a/shared/src/commonMain/kotlin/com/vickbt/shared/ui/components/NavRailBar.kt b/shared/src/commonMain/kotlin/com/vickbt/shared/ui/components/NavRailBar.kt index 03ca7b63..88569096 100644 --- a/shared/src/commonMain/kotlin/com/vickbt/shared/ui/components/NavRailBar.kt +++ b/shared/src/commonMain/kotlin/com/vickbt/shared/ui/components/NavRailBar.kt @@ -8,18 +8,18 @@ import androidx.compose.material3.NavigationRailItem import androidx.compose.material3.NavigationRailItemDefaults import androidx.compose.material3.Text import androidx.compose.runtime.Composable -import androidx.compose.runtime.collectAsState import androidx.compose.ui.Modifier import androidx.compose.ui.draw.alpha -import com.vickbt.shared.presentation.ui.navigation.NavigationItem +import androidx.navigation.NavHostController +import androidx.navigation.compose.currentBackStackEntryAsState +import com.vickbt.shared.ui.navigation.NavigationItem import com.vickbt.shared.ui.theme.Gray import com.vickbt.shared.ui.theme.PrimaryColor -import moe.tlaster.precompose.navigation.Navigator @Composable fun NavRailBar( modifier: Modifier = Modifier, - navigator: Navigator, + navHostController: NavHostController, navigationItems: List ) { NavigationRail( @@ -37,7 +37,7 @@ fun NavRailBar( navigationItems.forEach { item -> val currentDestination = - navigator.currentEntry.collectAsState(null).value?.route?.route + navHostController.currentBackStackEntryAsState().value?.destination?.route val isSelected = item.route == currentDestination NavigationRailItem( @@ -57,7 +57,7 @@ fun NavRailBar( alwaysShowLabel = false, selected = isSelected, onClick = { - if (item.route != currentDestination) navigator.navigate(route = item.route) + if (item.route != currentDestination) navHostController.navigate(route = item.route) } ) } diff --git a/shared/src/commonMain/kotlin/com/vickbt/shared/ui/screens/details/DetailsScreen.kt b/shared/src/commonMain/kotlin/com/vickbt/shared/ui/screens/details/DetailsScreen.kt index 3e846227..9fcdcd98 100644 --- a/shared/src/commonMain/kotlin/com/vickbt/shared/ui/screens/details/DetailsScreen.kt +++ b/shared/src/commonMain/kotlin/com/vickbt/shared/ui/screens/details/DetailsScreen.kt @@ -23,6 +23,7 @@ import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp +import androidx.navigation.NavHostController import com.vickbt.shared.ui.components.ItemMovieCast import com.vickbt.shared.ui.components.MovieCardPortrait import com.vickbt.shared.ui.components.MovieRatingSection @@ -34,13 +35,11 @@ import com.vickbt.shared.utils.WindowSize import com.vickbt.shared.utils.getPopularity import com.vickbt.shared.utils.getRating import io.github.aakira.napier.Napier -import moe.tlaster.precompose.navigation.Navigator -import org.koin.compose.koinInject import org.koin.compose.viewmodel.koinViewModel @Composable fun DetailsScreen( - navigator: Navigator, + navigator: NavHostController, windowSize: WindowSize = WindowSize.COMPACT, viewModel: DetailsViewModel = koinViewModel(), movieId: Int @@ -78,7 +77,7 @@ fun DetailsScreen( modifier = Modifier.fillMaxWidth(), collapsingScrollState = collapsingScrollState, movieDetailsState = movieDetailsState, - onNavigationIconClick = { navigator.goBack() }, + onNavigationIconClick = { navigator.navigateUp() }, onShareIconClick = {}, onFavoriteIconClick = { movieDetails, isFavorite -> if (isFavorite == true) { diff --git a/shared/src/commonMain/kotlin/com/vickbt/shared/ui/screens/favorites/FavoritesScreen.kt b/shared/src/commonMain/kotlin/com/vickbt/shared/ui/screens/favorites/FavoritesScreen.kt index 6359bc54..b67a72e6 100644 --- a/shared/src/commonMain/kotlin/com/vickbt/shared/ui/screens/favorites/FavoritesScreen.kt +++ b/shared/src/commonMain/kotlin/com/vickbt/shared/ui/screens/favorites/FavoritesScreen.kt @@ -12,14 +12,14 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp +import androidx.navigation.NavHostController import com.vickbt.shared.ui.components.MovieCardDescription import com.vickbt.shared.ui.components.appbars.AppBar -import moe.tlaster.precompose.navigation.Navigator import org.koin.compose.viewmodel.koinViewModel @Composable fun FavoritesScreen( - navigator: Navigator, + navigator: NavHostController, viewModel: FavoritesViewModel = koinViewModel() ) { val favoriteMovies = viewModel.favoriteMoviesState.collectAsState().value diff --git a/shared/src/commonMain/kotlin/com/vickbt/shared/ui/screens/home/HomeScreen.kt b/shared/src/commonMain/kotlin/com/vickbt/shared/ui/screens/home/HomeScreen.kt index 38417600..1a0522c8 100644 --- a/shared/src/commonMain/kotlin/com/vickbt/shared/ui/screens/home/HomeScreen.kt +++ b/shared/src/commonMain/kotlin/com/vickbt/shared/ui/screens/home/HomeScreen.kt @@ -45,6 +45,7 @@ import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp +import androidx.navigation.NavHostController import com.vickbt.shared.ui.components.MovieCardLandscape import com.vickbt.shared.ui.components.MovieCardPager import com.vickbt.shared.ui.components.MovieCardPagerIndicator @@ -59,7 +60,7 @@ import org.koin.compose.viewmodel.koinViewModel @OptIn(ExperimentalFoundationApi::class, ExperimentalMaterial3Api::class) @Composable fun HomeScreen( - navigator: Navigator, + navigator: NavHostController, windowSize: WindowSize = WindowSize.COMPACT, viewModel: HomeViewModel = koinViewModel(), paddingValues: PaddingValues diff --git a/shared/src/commonMain/kotlin/com/vickbt/shared/ui/screens/main/MainScreen.kt b/shared/src/commonMain/kotlin/com/vickbt/shared/ui/screens/main/MainScreen.kt index f7cedcd0..a5bc9050 100644 --- a/shared/src/commonMain/kotlin/com/vickbt/shared/ui/screens/main/MainScreen.kt +++ b/shared/src/commonMain/kotlin/com/vickbt/shared/ui/screens/main/MainScreen.kt @@ -11,14 +11,15 @@ import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier -import com.vickbt.shared.presentation.ui.navigation.NavigationItem +import androidx.navigation.compose.currentBackStackEntryAsState +import androidx.navigation.compose.rememberNavController +import com.vickbt.shared.ui.navigation.NavigationItem import com.vickbt.shared.ui.components.BottomNavBar import com.vickbt.shared.ui.components.NavRailBar import com.vickbt.shared.ui.navigation.Navigation import com.vickbt.shared.ui.theme.NotflixTheme import com.vickbt.shared.utils.WindowSize import moe.tlaster.precompose.PreComposeApp -import moe.tlaster.precompose.navigation.rememberNavigator import org.koin.compose.viewmodel.koinViewModel @Composable @@ -30,7 +31,7 @@ fun MainScreen(viewModel: MainViewModel = koinViewModel()) { val isDarkTheme = appUiState.selectedTheme != 0 NotflixTheme(darkTheme = isDarkTheme) { - val navigator = rememberNavigator() + val navHostController = rememberNavController() val topLevelDestinations = listOf( NavigationItem.Home, @@ -39,14 +40,14 @@ fun MainScreen(viewModel: MainViewModel = koinViewModel()) { ) val isTopLevelDestination = - navigator.currentEntry.collectAsState(null).value?.route?.route in topLevelDestinations.map { it.route } + navHostController.currentBackStackEntryAsState().value?.destination?.route in topLevelDestinations.map { it.route } val showNavigationRail = windowSize != WindowSize.COMPACT Scaffold( bottomBar = { if (isTopLevelDestination && !showNavigationRail) { - BottomNavBar(bottomNavItems = topLevelDestinations, navigator = navigator) + BottomNavBar(bottomNavItems = topLevelDestinations, navHostController = navHostController) } } ) { paddingValues -> @@ -58,12 +59,12 @@ fun MainScreen(viewModel: MainViewModel = koinViewModel()) { if (isTopLevelDestination && showNavigationRail) { NavRailBar( navigationItems = topLevelDestinations, - navigator = navigator + navHostController = navHostController ) } Navigation( - navigator = navigator, + navHostController = navHostController, windowSize = windowSize, paddingValues = paddingValues ) diff --git a/shared/src/commonMain/kotlin/com/vickbt/shared/ui/screens/search/SearchScreen.kt b/shared/src/commonMain/kotlin/com/vickbt/shared/ui/screens/search/SearchScreen.kt index 1a85d8c2..74bd199c 100644 --- a/shared/src/commonMain/kotlin/com/vickbt/shared/ui/screens/search/SearchScreen.kt +++ b/shared/src/commonMain/kotlin/com/vickbt/shared/ui/screens/search/SearchScreen.kt @@ -17,6 +17,7 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp +import androidx.navigation.NavHostController import com.vickbt.shared.ui.components.MovieCardPortrait import com.vickbt.shared.utils.SearchUiState import com.vickbt.shared.utils.WindowSize @@ -24,7 +25,7 @@ import moe.tlaster.precompose.navigation.Navigator @Composable fun SearchScreen( - navigator: Navigator, + navigator: NavHostController, searchUiState: SearchUiState, windowSize: WindowSize = WindowSize.COMPACT ) { From 8ed238281219132bfaee5915e36ada03af41df1f Mon Sep 17 00:00:00 2001 From: Victor Kabata Date: Mon, 22 Jul 2024 12:19:57 +0300 Subject: [PATCH 06/14] Migrate navigation to jetpack navigation --- .../vickbt/shared/ui/navigation/Navigation.kt | 38 ++++++++++++------- .../shared/ui/navigation/NavigationItem.kt | 4 +- 2 files changed, 26 insertions(+), 16 deletions(-) diff --git a/shared/src/commonMain/kotlin/com/vickbt/shared/ui/navigation/Navigation.kt b/shared/src/commonMain/kotlin/com/vickbt/shared/ui/navigation/Navigation.kt index 93e6942e..20ea4ae1 100644 --- a/shared/src/commonMain/kotlin/com/vickbt/shared/ui/navigation/Navigation.kt +++ b/shared/src/commonMain/kotlin/com/vickbt/shared/ui/navigation/Navigation.kt @@ -2,42 +2,52 @@ package com.vickbt.shared.ui.navigation import androidx.compose.foundation.layout.PaddingValues import androidx.compose.runtime.Composable -import com.vickbt.shared.presentation.ui.navigation.NavigationItem +import androidx.navigation.NavHostController +import androidx.navigation.NavType +import androidx.navigation.compose.NavHost +import androidx.navigation.compose.composable +import androidx.navigation.navArgument import com.vickbt.shared.ui.screens.details.DetailsScreen import com.vickbt.shared.ui.screens.favorites.FavoritesScreen import com.vickbt.shared.ui.screens.home.HomeScreen import com.vickbt.shared.ui.screens.settings.SettingsScreen import com.vickbt.shared.utils.WindowSize -import moe.tlaster.precompose.navigation.NavHost -import moe.tlaster.precompose.navigation.Navigator -import moe.tlaster.precompose.navigation.path +import io.github.aakira.napier.Napier @Composable fun Navigation( - navigator: Navigator, + navHostController: NavHostController, windowSize: WindowSize, paddingValues: PaddingValues = PaddingValues() ) { - NavHost(navigator = navigator, initialRoute = NavigationItem.Home.route) { - scene(NavigationItem.Home.route) { + NavHost(navController = navHostController, startDestination = NavigationItem.Home.route) { + composable(route = NavigationItem.Home.route) { HomeScreen( - navigator = navigator, + navigator = navHostController, windowSize = windowSize, paddingValues = paddingValues ) } - scene(NavigationItem.Favorites.route) { - FavoritesScreen(navigator = navigator) + composable(route = NavigationItem.Favorites.route) { + FavoritesScreen(navigator = navHostController) } - scene(NavigationItem.Settings.route) { + composable(route = NavigationItem.Settings.route) { SettingsScreen() } - scene(NavigationItem.Details.route) { backStackEntry -> - backStackEntry.path("id")?.let { movieId -> - DetailsScreen(navigator = navigator, windowSize = windowSize, movieId = movieId) + composable( + route = NavigationItem.Details.route, + arguments = listOf(navArgument("movieId") { type = NavType.IntType }) + ) { backStackEntry -> + backStackEntry.arguments?.getInt("movieId")?.let { movieId -> + Napier.e("Movie ID: $movieId") + DetailsScreen( + navigator = navHostController, + windowSize = windowSize, + movieId = movieId + ) } } } diff --git a/shared/src/commonMain/kotlin/com/vickbt/shared/ui/navigation/NavigationItem.kt b/shared/src/commonMain/kotlin/com/vickbt/shared/ui/navigation/NavigationItem.kt index e46d85f3..9f136136 100644 --- a/shared/src/commonMain/kotlin/com/vickbt/shared/ui/navigation/NavigationItem.kt +++ b/shared/src/commonMain/kotlin/com/vickbt/shared/ui/navigation/NavigationItem.kt @@ -1,4 +1,4 @@ -package com.vickbt.shared.presentation.ui.navigation +package com.vickbt.shared.ui.navigation import androidx.compose.material.icons.Icons import androidx.compose.material.icons.rounded.Favorite @@ -15,5 +15,5 @@ sealed class NavigationItem( object Home : NavigationItem("/home", "Home", Icons.Rounded.Home) object Favorites : NavigationItem("/favorites", "Favorites", Icons.Rounded.Favorite) object Settings : NavigationItem("/settings", "Settings", Icons.Rounded.Settings) - object Details : NavigationItem("/details/{id:[0-9]+}", "Details", null) + object Details : NavigationItem("/details/{movieId}", "Details", null) } From 195a451e547fc02e8c81e484d4f6eb9fcc24f6ed Mon Sep 17 00:00:00 2001 From: Victor Kabata Date: Mon, 22 Jul 2024 12:39:53 +0300 Subject: [PATCH 07/14] Replaced image loader with coil --- .../vickbt/shared/utils/CustomImageLoader.kt | 33 --------- .../com/vickbt/shared/di/CommonModule.kt | 3 - .../shared/ui/components/ItemMovieCast.kt | 20 ++---- .../ui/components/MovieCardDescription.kt | 26 +++---- .../ui/components/MovieCardLandscape.kt | 29 +++----- .../shared/ui/components/MovieCardPager.kt | 26 +++---- .../ui/components/MovieCardPortraitCompact.kt | 28 +++----- .../ui/components/appbars/DetailsAppBar.kt | 27 +++---- .../shared/ui/screens/home/HomeScreen.kt | 1 - .../shared/ui/screens/main/MainScreen.kt | 72 +++++++++---------- .../shared/ui/screens/search/SearchScreen.kt | 1 - .../ui/screens/settings/SettingsViewModel.kt | 1 - .../com/vickbt/shared/ui/theme/Theme.kt | 6 ++ .../vickbt/shared/utils/CustomImageLoader.kt | 20 ------ .../com/vickbt/shared/utils/Extensions.kt | 9 +++ .../vickbt/shared/utils/CustomImageLoader.kt | 35 --------- .../vickbt/shared/utils/CustomImageLoader.kt | 59 --------------- 17 files changed, 111 insertions(+), 285 deletions(-) delete mode 100644 shared/src/androidMain/kotlin/com/vickbt/shared/utils/CustomImageLoader.kt delete mode 100644 shared/src/commonMain/kotlin/com/vickbt/shared/utils/CustomImageLoader.kt delete mode 100644 shared/src/iosMain/kotlin/com/vickbt/shared/utils/CustomImageLoader.kt delete mode 100644 shared/src/jvmMain/kotlin/com/vickbt/shared/utils/CustomImageLoader.kt diff --git a/shared/src/androidMain/kotlin/com/vickbt/shared/utils/CustomImageLoader.kt b/shared/src/androidMain/kotlin/com/vickbt/shared/utils/CustomImageLoader.kt deleted file mode 100644 index 9ca77e28..00000000 --- a/shared/src/androidMain/kotlin/com/vickbt/shared/utils/CustomImageLoader.kt +++ /dev/null @@ -1,33 +0,0 @@ -package com.vickbt.shared.utils - -import com.seiko.imageloader.ImageLoader -import com.seiko.imageloader.cache.memory.maxSizePercent -import com.seiko.imageloader.component.setupDefaultComponents -import com.seiko.imageloader.option.androidContext -import okio.Path.Companion.toOkioPath - -actual object CustomImageLoader { - - actual fun generateImageLoader(): ImageLoader { - val context = ContextUtils.context - - return ImageLoader { - options { - androidContext(context) - } - components { - setupDefaultComponents() - } - interceptor { - memoryCacheConfig { - // Set the max size to 25% of the app's available memory. - maxSizePercent(context, 0.25) - } - diskCacheConfig { - directory(context.cacheDir.toOkioPath()) - maxSizeBytes(512L * 1024 * 1024) // 512MB - } - } - } - } -} diff --git a/shared/src/commonMain/kotlin/com/vickbt/shared/di/CommonModule.kt b/shared/src/commonMain/kotlin/com/vickbt/shared/di/CommonModule.kt index 34f37fd8..5d11e6dc 100644 --- a/shared/src/commonMain/kotlin/com/vickbt/shared/di/CommonModule.kt +++ b/shared/src/commonMain/kotlin/com/vickbt/shared/di/CommonModule.kt @@ -32,8 +32,6 @@ import io.ktor.serialization.kotlinx.json.json import kotlinx.serialization.json.Json import org.koin.compose.viewmodel.dsl.viewModelOf import org.koin.core.module.Module -import org.koin.core.module.dsl.factoryOf -import org.koin.core.module.dsl.singleOf import org.koin.dsl.module fun commonModule(enableNetworkLogs: Boolean) = module { @@ -93,7 +91,6 @@ fun commonModule(enableNetworkLogs: Boolean) = module { viewModelOf(::DetailsViewModel) viewModelOf(::SettingsViewModel) viewModelOf(::FavoritesViewModel) - } expect fun platformModule(): Module diff --git a/shared/src/commonMain/kotlin/com/vickbt/shared/ui/components/ItemMovieCast.kt b/shared/src/commonMain/kotlin/com/vickbt/shared/ui/components/ItemMovieCast.kt index a6cd76fa..4f0f4495 100644 --- a/shared/src/commonMain/kotlin/com/vickbt/shared/ui/components/ItemMovieCast.kt +++ b/shared/src/commonMain/kotlin/com/vickbt/shared/ui/components/ItemMovieCast.kt @@ -1,6 +1,5 @@ package com.vickbt.shared.ui.components -import androidx.compose.foundation.Image import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.size @@ -17,10 +16,9 @@ import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp -import com.seiko.imageloader.rememberImagePainter +import coil3.compose.AsyncImage import com.vickbt.shared.domain.models.Actor import com.vickbt.shared.ui.theme.TextSecondary -import com.vickbt.shared.utils.commonImageLoader import com.vickbt.shared.utils.loadImage @Composable @@ -30,16 +28,12 @@ fun ItemMovieCast(modifier: Modifier = Modifier, actor: Actor) { horizontalAlignment = Alignment.CenterHorizontally, verticalArrangement = Arrangement.spacedBy(space = 1.dp) ) { - commonImageLoader { - val painter = rememberImagePainter(actor.profilePath?.loadImage() ?: "") - - Image( - modifier = Modifier.size(80.dp).clip(CircleShape), - painter = painter, - contentDescription = "Cast", - contentScale = ContentScale.Crop - ) - } + AsyncImage( + modifier = Modifier.size(80.dp).clip(CircleShape), + model = actor.profilePath?.loadImage(), + contentDescription = "Cast", + contentScale = ContentScale.Crop, + ) Text( modifier = Modifier.width(78.dp), diff --git a/shared/src/commonMain/kotlin/com/vickbt/shared/ui/components/MovieCardDescription.kt b/shared/src/commonMain/kotlin/com/vickbt/shared/ui/components/MovieCardDescription.kt index 376b747b..180e9c1f 100644 --- a/shared/src/commonMain/kotlin/com/vickbt/shared/ui/components/MovieCardDescription.kt +++ b/shared/src/commonMain/kotlin/com/vickbt/shared/ui/components/MovieCardDescription.kt @@ -1,6 +1,5 @@ package com.vickbt.shared.ui.components -import androidx.compose.foundation.Image import androidx.compose.foundation.background import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Box @@ -26,9 +25,8 @@ import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp -import com.seiko.imageloader.rememberImagePainter +import coil3.compose.AsyncImage import com.vickbt.shared.domain.models.MovieDetails -import com.vickbt.shared.utils.commonImageLoader import com.vickbt.shared.utils.loadImage @Composable @@ -45,19 +43,15 @@ fun MovieCardDescription( Card(modifier = modifier.clickable { onItemClick(movie) }) { Box { //region Movie Cover Image - commonImageLoader { - val painter = rememberImagePainter(movie.backdropPath?.loadImage() ?: "") - - Image( - modifier = Modifier - .fillMaxSize() - .align(Alignment.Center), - alignment = Alignment.Center, - contentScale = ContentScale.Crop, - painter = painter, - contentDescription = null - ) - } + AsyncImage( + modifier = Modifier + .fillMaxSize() + .align(Alignment.Center), + model = movie.backdropPath?.loadImage(), + contentDescription = null, + contentScale = ContentScale.Crop, + alignment = Alignment.Center, + ) //endregion //region Fading Edge Box diff --git a/shared/src/commonMain/kotlin/com/vickbt/shared/ui/components/MovieCardLandscape.kt b/shared/src/commonMain/kotlin/com/vickbt/shared/ui/components/MovieCardLandscape.kt index 83ea8aa0..74ef4ad4 100644 --- a/shared/src/commonMain/kotlin/com/vickbt/shared/ui/components/MovieCardLandscape.kt +++ b/shared/src/commonMain/kotlin/com/vickbt/shared/ui/components/MovieCardLandscape.kt @@ -1,6 +1,5 @@ package com.vickbt.shared.ui.components -import androidx.compose.foundation.Image import androidx.compose.foundation.background import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement @@ -33,13 +32,12 @@ import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp -import com.seiko.imageloader.rememberImagePainter +import coil3.compose.AsyncImage import com.vickbt.shared.domain.models.Movie import com.vickbt.shared.ui.components.ratingbar.RatingBar import com.vickbt.shared.ui.components.ratingbar.RatingBarStyle import com.vickbt.shared.ui.components.ratingbar.StepSize import com.vickbt.shared.utils.capitalizeEachWord -import com.vickbt.shared.utils.commonImageLoader import com.vickbt.shared.utils.getRating import com.vickbt.shared.utils.getReleaseDate import com.vickbt.shared.utils.loadImage @@ -59,20 +57,15 @@ fun MovieCardLandscape( shape = RoundedCornerShape(4.dp) ) { Box(modifier = modifier) { - commonImageLoader { - val painter = rememberImagePainter(movie.backdropPath?.loadImage() ?: "") - - //region Movie Cover - Image( - modifier = Modifier - .fillMaxSize() - .align(Alignment.Center), - alignment = Alignment.Center, - contentScale = ContentScale.Crop, - painter = painter, - contentDescription = null - ) - } + AsyncImage( + modifier = Modifier + .fillMaxSize() + .align(Alignment.Center), + model = movie.backdropPath?.loadImage(), + contentDescription = null, + contentScale = ContentScale.Crop, + alignment = Alignment.Center, + ) //endregion //region Fading Edge @@ -140,7 +133,7 @@ fun MovieCardLandscape( Text( modifier = Modifier, - text = movie.releaseDate.getReleaseDate()?.capitalizeEachWord() ?: "", + text = movie.releaseDate.getReleaseDate().capitalizeEachWord(), fontSize = 14.sp, maxLines = 1, style = MaterialTheme.typography.labelSmall, diff --git a/shared/src/commonMain/kotlin/com/vickbt/shared/ui/components/MovieCardPager.kt b/shared/src/commonMain/kotlin/com/vickbt/shared/ui/components/MovieCardPager.kt index 3ab20b4f..dc189fd1 100644 --- a/shared/src/commonMain/kotlin/com/vickbt/shared/ui/components/MovieCardPager.kt +++ b/shared/src/commonMain/kotlin/com/vickbt/shared/ui/components/MovieCardPager.kt @@ -2,7 +2,6 @@ package com.vickbt.shared.ui.components import androidx.compose.foundation.Canvas import androidx.compose.foundation.ExperimentalFoundationApi -import androidx.compose.foundation.Image import androidx.compose.foundation.background import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement @@ -33,12 +32,11 @@ import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp -import com.seiko.imageloader.rememberImagePainter +import coil3.compose.AsyncImage import com.vickbt.shared.domain.models.Movie import com.vickbt.shared.ui.components.ratingbar.RatingBar import com.vickbt.shared.ui.components.ratingbar.RatingBarStyle import com.vickbt.shared.ui.components.ratingbar.StepSize -import com.vickbt.shared.utils.commonImageLoader import com.vickbt.shared.utils.getRating import com.vickbt.shared.utils.loadImage @@ -54,19 +52,15 @@ fun MovieCardPager( Card(modifier = modifier.clickable { onItemClick(movie) }) { Box { //region Movie Cover Image - commonImageLoader { - val painter = rememberImagePainter(movie.backdropPath?.loadImage() ?: "") - - Image( - modifier = Modifier - .fillMaxSize() - .align(Alignment.Center), - alignment = Alignment.Center, - contentScale = ContentScale.Crop, - painter = painter, - contentDescription = null - ) - } + AsyncImage( + modifier = Modifier + .fillMaxSize() + .align(Alignment.Center), + model = movie.backdropPath?.loadImage(), + contentDescription = null, + contentScale = ContentScale.Crop, + alignment = Alignment.Center, + ) //endregion //region Fading Edge Box diff --git a/shared/src/commonMain/kotlin/com/vickbt/shared/ui/components/MovieCardPortraitCompact.kt b/shared/src/commonMain/kotlin/com/vickbt/shared/ui/components/MovieCardPortraitCompact.kt index 9075aab9..59b53ba0 100644 --- a/shared/src/commonMain/kotlin/com/vickbt/shared/ui/components/MovieCardPortraitCompact.kt +++ b/shared/src/commonMain/kotlin/com/vickbt/shared/ui/components/MovieCardPortraitCompact.kt @@ -1,6 +1,5 @@ package com.vickbt.shared.ui.components -import androidx.compose.foundation.Image import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column @@ -22,9 +21,8 @@ import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp -import com.seiko.imageloader.rememberImagePainter +import coil3.compose.AsyncImage import com.vickbt.shared.domain.models.Movie -import com.vickbt.shared.utils.commonImageLoader import com.vickbt.shared.utils.loadImage @Composable @@ -45,20 +43,16 @@ fun MovieCardPortraitCompact( elevation = CardDefaults.cardElevation(8.dp), shape = RoundedCornerShape(4.dp) ) { - commonImageLoader { - val painter = rememberImagePainter(movie.posterPath?.loadImage() ?: "") - - Image( - modifier = Modifier - .fillMaxWidth() - .height(220.dp) - .sizeIn(minHeight = 30.dp), - painter = painter, - alignment = Alignment.Center, - contentScale = ContentScale.Crop, - contentDescription = "Trending movie poster" - ) - } + AsyncImage( + modifier = Modifier + .fillMaxWidth() + .height(220.dp) + .sizeIn(minHeight = 30.dp), + model = movie.posterPath?.loadImage(), + contentDescription = "Trending movie poster", + contentScale = ContentScale.Crop, + alignment = Alignment.Center, + ) } Text( diff --git a/shared/src/commonMain/kotlin/com/vickbt/shared/ui/components/appbars/DetailsAppBar.kt b/shared/src/commonMain/kotlin/com/vickbt/shared/ui/components/appbars/DetailsAppBar.kt index 53bfe0b1..623e7ef0 100644 --- a/shared/src/commonMain/kotlin/com/vickbt/shared/ui/components/appbars/DetailsAppBar.kt +++ b/shared/src/commonMain/kotlin/com/vickbt/shared/ui/components/appbars/DetailsAppBar.kt @@ -1,7 +1,6 @@ package com.vickbt.shared.ui.components.appbars import androidx.compose.animation.animateColorAsState -import androidx.compose.foundation.Image import androidx.compose.foundation.background import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box @@ -39,11 +38,10 @@ import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp -import com.seiko.imageloader.rememberImagePainter +import coil3.compose.AsyncImage import com.vickbt.shared.domain.models.MovieDetails import com.vickbt.shared.ui.components.collapsingToolbar.CollapsingToolbarScaffoldState import com.vickbt.shared.utils.DetailsUiState -import com.vickbt.shared.utils.commonImageLoader import com.vickbt.shared.utils.getMovieDuration import com.vickbt.shared.utils.loadImage @@ -78,19 +76,16 @@ fun DetailsAppBar( .height(350.dp) .graphicsLayer { alpha = scrollProgress } ) { - commonImageLoader { - val painter = rememberImagePainter(movieDetails?.backdropPath?.loadImage() ?: "") - - Image( - modifier = Modifier - .fillMaxSize() - .align(Alignment.Center) - .aspectRatio(scrollProgress.coerceAtLeast(.1f)), - painter = painter, - contentDescription = "Movie poster", - contentScale = ContentScale.Crop - ) - } + AsyncImage( + modifier = Modifier + .fillMaxSize() + .align(Alignment.Center) + .aspectRatio(scrollProgress.coerceAtLeast(.1f)), + model = movieDetails?.backdropPath?.loadImage(), + contentDescription = "Movie poster", + contentScale = ContentScale.Crop, + alignment = Alignment.Center, + ) Box( modifier = Modifier diff --git a/shared/src/commonMain/kotlin/com/vickbt/shared/ui/screens/home/HomeScreen.kt b/shared/src/commonMain/kotlin/com/vickbt/shared/ui/screens/home/HomeScreen.kt index 1a0522c8..e42a16e4 100644 --- a/shared/src/commonMain/kotlin/com/vickbt/shared/ui/screens/home/HomeScreen.kt +++ b/shared/src/commonMain/kotlin/com/vickbt/shared/ui/screens/home/HomeScreen.kt @@ -54,7 +54,6 @@ import com.vickbt.shared.ui.components.SectionSeparator import com.vickbt.shared.ui.screens.search.SearchScreen import com.vickbt.shared.ui.theme.DarkPrimaryColor import com.vickbt.shared.utils.WindowSize -import moe.tlaster.precompose.navigation.Navigator import org.koin.compose.viewmodel.koinViewModel @OptIn(ExperimentalFoundationApi::class, ExperimentalMaterial3Api::class) diff --git a/shared/src/commonMain/kotlin/com/vickbt/shared/ui/screens/main/MainScreen.kt b/shared/src/commonMain/kotlin/com/vickbt/shared/ui/screens/main/MainScreen.kt index a5bc9050..31ddfdde 100644 --- a/shared/src/commonMain/kotlin/com/vickbt/shared/ui/screens/main/MainScreen.kt +++ b/shared/src/commonMain/kotlin/com/vickbt/shared/ui/screens/main/MainScreen.kt @@ -13,62 +13,62 @@ import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.navigation.compose.currentBackStackEntryAsState import androidx.navigation.compose.rememberNavController -import com.vickbt.shared.ui.navigation.NavigationItem import com.vickbt.shared.ui.components.BottomNavBar import com.vickbt.shared.ui.components.NavRailBar import com.vickbt.shared.ui.navigation.Navigation +import com.vickbt.shared.ui.navigation.NavigationItem import com.vickbt.shared.ui.theme.NotflixTheme import com.vickbt.shared.utils.WindowSize -import moe.tlaster.precompose.PreComposeApp import org.koin.compose.viewmodel.koinViewModel @Composable fun MainScreen(viewModel: MainViewModel = koinViewModel()) { - PreComposeApp { - val appUiState = viewModel.mainUiState.collectAsState().value - var windowSize by remember { mutableStateOf(WindowSize.COMPACT) } + val appUiState = viewModel.mainUiState.collectAsState().value + var windowSize by remember { mutableStateOf(WindowSize.COMPACT) } - val isDarkTheme = appUiState.selectedTheme != 0 + val isDarkTheme = appUiState.selectedTheme != 0 - NotflixTheme(darkTheme = isDarkTheme) { - val navHostController = rememberNavController() + NotflixTheme(darkTheme = isDarkTheme) { + val navHostController = rememberNavController() - val topLevelDestinations = listOf( - NavigationItem.Home, - NavigationItem.Favorites, - NavigationItem.Settings - ) + val topLevelDestinations = listOf( + NavigationItem.Home, + NavigationItem.Favorites, + NavigationItem.Settings + ) - val isTopLevelDestination = - navHostController.currentBackStackEntryAsState().value?.destination?.route in topLevelDestinations.map { it.route } + val isTopLevelDestination = + navHostController.currentBackStackEntryAsState().value?.destination?.route in topLevelDestinations.map { it.route } - val showNavigationRail = windowSize != WindowSize.COMPACT + val showNavigationRail = windowSize != WindowSize.COMPACT - Scaffold( - bottomBar = { - if (isTopLevelDestination && !showNavigationRail) { - BottomNavBar(bottomNavItems = topLevelDestinations, navHostController = navHostController) - } + Scaffold( + bottomBar = { + if (isTopLevelDestination && !showNavigationRail) { + BottomNavBar( + bottomNavItems = topLevelDestinations, + navHostController = navHostController + ) } - ) { paddingValues -> - - BoxWithConstraints(modifier = Modifier.fillMaxSize()) { - windowSize = WindowSize.basedOnWidth(this.minWidth) + } + ) { paddingValues -> - Row(modifier = Modifier.fillMaxSize()) { - if (isTopLevelDestination && showNavigationRail) { - NavRailBar( - navigationItems = topLevelDestinations, - navHostController = navHostController - ) - } + BoxWithConstraints(modifier = Modifier.fillMaxSize()) { + windowSize = WindowSize.basedOnWidth(this.minWidth) - Navigation( - navHostController = navHostController, - windowSize = windowSize, - paddingValues = paddingValues + Row(modifier = Modifier.fillMaxSize()) { + if (isTopLevelDestination && showNavigationRail) { + NavRailBar( + navigationItems = topLevelDestinations, + navHostController = navHostController ) } + + Navigation( + navHostController = navHostController, + windowSize = windowSize, + paddingValues = paddingValues + ) } } } diff --git a/shared/src/commonMain/kotlin/com/vickbt/shared/ui/screens/search/SearchScreen.kt b/shared/src/commonMain/kotlin/com/vickbt/shared/ui/screens/search/SearchScreen.kt index 74bd199c..dfeb5e7d 100644 --- a/shared/src/commonMain/kotlin/com/vickbt/shared/ui/screens/search/SearchScreen.kt +++ b/shared/src/commonMain/kotlin/com/vickbt/shared/ui/screens/search/SearchScreen.kt @@ -21,7 +21,6 @@ import androidx.navigation.NavHostController import com.vickbt.shared.ui.components.MovieCardPortrait import com.vickbt.shared.utils.SearchUiState import com.vickbt.shared.utils.WindowSize -import moe.tlaster.precompose.navigation.Navigator @Composable fun SearchScreen( diff --git a/shared/src/commonMain/kotlin/com/vickbt/shared/ui/screens/settings/SettingsViewModel.kt b/shared/src/commonMain/kotlin/com/vickbt/shared/ui/screens/settings/SettingsViewModel.kt index 05162182..4dd7d997 100644 --- a/shared/src/commonMain/kotlin/com/vickbt/shared/ui/screens/settings/SettingsViewModel.kt +++ b/shared/src/commonMain/kotlin/com/vickbt/shared/ui/screens/settings/SettingsViewModel.kt @@ -11,7 +11,6 @@ import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch -import org.koin.core.component.KoinComponent class SettingsViewModel(private val settingsRepository: SettingsRepository) : ViewModel() { diff --git a/shared/src/commonMain/kotlin/com/vickbt/shared/ui/theme/Theme.kt b/shared/src/commonMain/kotlin/com/vickbt/shared/ui/theme/Theme.kt index df9a733d..ac1a0728 100644 --- a/shared/src/commonMain/kotlin/com/vickbt/shared/ui/theme/Theme.kt +++ b/shared/src/commonMain/kotlin/com/vickbt/shared/ui/theme/Theme.kt @@ -5,6 +5,8 @@ import androidx.compose.material3.MaterialTheme import androidx.compose.material3.darkColorScheme import androidx.compose.material3.lightColorScheme import androidx.compose.runtime.Composable +import coil3.compose.setSingletonImageLoaderFactory +import com.vickbt.shared.utils.getAsyncImageLoader private val DarkColorPalette = darkColorScheme( primary = DarkPrimaryColor, @@ -29,6 +31,10 @@ fun NotflixTheme( ) { val colorScheme = if (darkTheme) DarkColorPalette else LightColorPalette + setSingletonImageLoaderFactory { context -> + context.getAsyncImageLoader() + } + MaterialTheme( colorScheme = colorScheme, // typography = Typography, diff --git a/shared/src/commonMain/kotlin/com/vickbt/shared/utils/CustomImageLoader.kt b/shared/src/commonMain/kotlin/com/vickbt/shared/utils/CustomImageLoader.kt deleted file mode 100644 index a7c111be..00000000 --- a/shared/src/commonMain/kotlin/com/vickbt/shared/utils/CustomImageLoader.kt +++ /dev/null @@ -1,20 +0,0 @@ -package com.vickbt.shared.utils - -import androidx.compose.runtime.Composable -import androidx.compose.runtime.CompositionLocalProvider -import androidx.compose.runtime.remember -import com.seiko.imageloader.ImageLoader -import com.seiko.imageloader.LocalImageLoader - -expect object CustomImageLoader { - fun generateImageLoader(): ImageLoader -} - -@Composable -fun commonImageLoader(content: @Composable () -> Unit) { - CompositionLocalProvider( - LocalImageLoader provides remember { CustomImageLoader.generateImageLoader() } - ) { - content() - } -} diff --git a/shared/src/commonMain/kotlin/com/vickbt/shared/utils/Extensions.kt b/shared/src/commonMain/kotlin/com/vickbt/shared/utils/Extensions.kt index b94be38f..c10d554a 100644 --- a/shared/src/commonMain/kotlin/com/vickbt/shared/utils/Extensions.kt +++ b/shared/src/commonMain/kotlin/com/vickbt/shared/utils/Extensions.kt @@ -2,6 +2,10 @@ package com.vickbt.shared.utils import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState +import coil3.ImageLoader +import coil3.PlatformContext +import coil3.request.crossfade +import coil3.util.DebugLogger import com.vickbt.shared.ui.screens.settings.SettingsViewModel import org.koin.compose.koinInject @@ -20,3 +24,8 @@ fun String.loadImage(): String { return "https://image.tmdb.org/t/p/$quality/$this" } + +fun PlatformContext.getAsyncImageLoader() = ImageLoader.Builder(this) + .crossfade(true) + .logger(DebugLogger()) + .build() diff --git a/shared/src/iosMain/kotlin/com/vickbt/shared/utils/CustomImageLoader.kt b/shared/src/iosMain/kotlin/com/vickbt/shared/utils/CustomImageLoader.kt deleted file mode 100644 index 7614e581..00000000 --- a/shared/src/iosMain/kotlin/com/vickbt/shared/utils/CustomImageLoader.kt +++ /dev/null @@ -1,35 +0,0 @@ -package com.vickbt.shared.utils - -import com.seiko.imageloader.ImageLoader -import com.seiko.imageloader.component.setupDefaultComponents -import okio.Path.Companion.toPath -import platform.Foundation.NSCachesDirectory -import platform.Foundation.NSSearchPathForDirectoriesInDomains -import platform.Foundation.NSUserDomainMask - -actual object CustomImageLoader { - actual fun generateImageLoader(): ImageLoader { - return ImageLoader { - components { - setupDefaultComponents() - } - interceptor { - memoryCacheConfig { - maxSizeBytes(32 * 1024 * 1024) // 32MB - } - diskCacheConfig { - directory(getCacheDir().toPath().resolve("image_cache")) - maxSizeBytes(512L * 1024 * 1024) // 512MB - } - } - } - } - - private fun getCacheDir(): String { - return NSSearchPathForDirectoriesInDomains( - NSCachesDirectory, - NSUserDomainMask, - true, - ).first() as String - } -} diff --git a/shared/src/jvmMain/kotlin/com/vickbt/shared/utils/CustomImageLoader.kt b/shared/src/jvmMain/kotlin/com/vickbt/shared/utils/CustomImageLoader.kt deleted file mode 100644 index 42e8189d..00000000 --- a/shared/src/jvmMain/kotlin/com/vickbt/shared/utils/CustomImageLoader.kt +++ /dev/null @@ -1,59 +0,0 @@ -package com.vickbt.shared.utils - -import com.seiko.imageloader.ImageLoader -import com.seiko.imageloader.component.setupDefaultComponents -import okio.Path.Companion.toOkioPath -import java.io.File - -actual object CustomImageLoader { - - actual fun generateImageLoader(): ImageLoader { - return ImageLoader { - components { - setupDefaultComponents() - } - interceptor { - memoryCacheConfig { - maxSizeBytes(32 * 1024 * 1024) // 32MB - } - diskCacheConfig { - directory(getCacheDir().toOkioPath().resolve("image_cache")) - maxSizeBytes(512L * 1024 * 1024) // 512MB - } - } - } - } - - private fun getCacheDir() = when (currentOperatingSystem) { - OperatingSystem.Windows -> File(System.getenv("AppData"), "$applicationName/cache") - OperatingSystem.Linux -> File(System.getProperty("user.home"), ".cache/$applicationName") - OperatingSystem.MacOS -> File( - System.getProperty("user.home"), - "Library/Caches/$applicationName" - ) - - else -> throw IllegalStateException("Unsupported operating system") - } - - private enum class OperatingSystem { - Windows, Linux, MacOS, Unknown - } - - private val currentOperatingSystem: OperatingSystem - get() { - val operSys = System.getProperty("os.name").lowercase() - return if (operSys.contains("win")) { - OperatingSystem.Windows - } else if (operSys.contains("nix") || operSys.contains("nux") || - operSys.contains("aix") - ) { - OperatingSystem.Linux - } else if (operSys.contains("mac")) { - OperatingSystem.MacOS - } else { - OperatingSystem.Unknown - } - } - - private val applicationName = "Notflix" -} From 8f7ba286b78aa967e22a6f0099be080ea6619d38 Mon Sep 17 00:00:00 2001 From: Victor Kabata Date: Mon, 22 Jul 2024 12:46:41 +0300 Subject: [PATCH 08/14] Set up memory cache for coil --- .../commonMain/kotlin/com/vickbt/shared/utils/Extensions.kt | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/shared/src/commonMain/kotlin/com/vickbt/shared/utils/Extensions.kt b/shared/src/commonMain/kotlin/com/vickbt/shared/utils/Extensions.kt index c10d554a..a474bcdd 100644 --- a/shared/src/commonMain/kotlin/com/vickbt/shared/utils/Extensions.kt +++ b/shared/src/commonMain/kotlin/com/vickbt/shared/utils/Extensions.kt @@ -4,6 +4,8 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState import coil3.ImageLoader import coil3.PlatformContext +import coil3.memory.MemoryCache +import coil3.request.CachePolicy import coil3.request.crossfade import coil3.util.DebugLogger import com.vickbt.shared.ui.screens.settings.SettingsViewModel @@ -27,5 +29,9 @@ fun String.loadImage(): String { fun PlatformContext.getAsyncImageLoader() = ImageLoader.Builder(this) .crossfade(true) + .memoryCachePolicy(CachePolicy.ENABLED) + .memoryCache { + MemoryCache.Builder().maxSizePercent(this, 0.3).strongReferencesEnabled(true).build() + } .logger(DebugLogger()) .build() From b594f23c97065eb7b4810859f4ec8c7b9b5c27c8 Mon Sep 17 00:00:00 2001 From: Victor Kabata Date: Mon, 22 Jul 2024 12:58:23 +0300 Subject: [PATCH 09/14] Added coil lib to project --- gradle/libs.versions.toml | 6 ++---- shared/build.gradle.kts | 4 +--- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 9580de3d..7e2ddc77 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -26,7 +26,6 @@ sqlDelight = "2.0.1" multiplatformSettings = "1.1.1" buildKonfig = "0.13.3" kover = "0.6.1" -imageLoader = "1.7.1" materialWindowSizeClass = "0.3.0" navigation = "2.7.0-alpha07" coil = "3.0.0-alpha06" @@ -81,7 +80,6 @@ kotlinX-coroutines = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-core", koin-core = { module = "io.insert-koin:koin-core", version.ref = "koinCore" } kotlinX-serializationJson = { module = "org.jetbrains.kotlinx:kotlinx-serialization-json", version.ref = "kotlinxSerializationJson" } ktor-core = { module = "io.ktor:ktor-client-core", version.ref = "ktor" } -ktor-serialization = { module = "io.ktor:ktor-client-serialization", version.ref = "ktor" } ktor-contentNegotiation = { module = "io.ktor:ktor-client-content-negotiation", version.ref = "ktor" } ktor-json = { module = "io.ktor:ktor-serialization-kotlinx-json", version.ref = "ktor" } ktor-logging = { module = "io.ktor:ktor-client-logging", version.ref = "ktor" } @@ -100,7 +98,6 @@ kotlinX-dateTime = { module = "org.jetbrains.kotlinx:kotlinx-datetime", version. multiplatformSettings-noArg = { module = "com.russhwolf:multiplatform-settings-no-arg", version.ref = "multiplatformSettings" } multiplatformSettings-coroutines = { module = "com.russhwolf:multiplatform-settings-coroutines", version.ref = "multiplatformSettings" } multiplatformSettings-test = { module = "com.russhwolf:multiplatform-settings-test", version.ref = "multiplatformSettings" } -imageLoader = { module = "io.github.qdsfdhvh:image-loader", version.ref = "imageLoader" } material-windowSizeClass = { module = "dev.chrisbanes.material3:material3-window-size-class-multiplatform", version.ref = "materialWindowSizeClass" } navigation = { module = "org.jetbrains.androidx.navigation:navigation-compose", version.ref = "navigation" } coil-compose = { module = "io.coil-kt.coil3:coil-compose", version.ref = "coil" } @@ -140,4 +137,5 @@ test-runner = { module = "androidx.test:runner", version.ref = "test" } turbine = { module = "app.cash.turbine:turbine", version.ref = "turbine" } [bundles] -coil=["coil-compose-core", "coil-compose", "coil-ktor", "coil-multiplatform"] \ No newline at end of file +coil = ["coil-compose-core", "coil-compose", "coil-ktor", "coil-multiplatform"] +multiplatformSettings = ["multiplatformSettings-coroutines", "multiplatformSettings-noArg"] \ No newline at end of file diff --git a/shared/build.gradle.kts b/shared/build.gradle.kts index ae9353b4..46d976f8 100644 --- a/shared/build.gradle.kts +++ b/shared/build.gradle.kts @@ -65,12 +65,10 @@ kotlin { implementation(libs.kotlinX.dateTime) - implementation(libs.multiplatformSettings.noArg) - implementation(libs.multiplatformSettings.coroutines) + implementation(libs.bundles.multiplatformSettings) api(libs.napier) - implementation(libs.imageLoader) implementation(libs.bundles.coil) implementation(libs.navigation) From 475db30ff57c63317d93310ecdce52e4450e1381 Mon Sep 17 00:00:00 2001 From: Victor Kabata Date: Mon, 22 Jul 2024 15:17:42 +0300 Subject: [PATCH 10/14] Added coroutines support for swing --- gradle/libs.versions.toml | 4 +++- shared/build.gradle.kts | 9 ++++----- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 7e2ddc77..a79819b7 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -76,7 +76,8 @@ firebase-performance-plugin = { id = "com.google.firebase.firebase-perf", versio [libraries] #Kotlin Multiplatform Lib Dependencies -kotlinX-coroutines = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-core", version.ref = "kotlinxCoroutines" } +coroutines = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-core", version.ref = "kotlinxCoroutines" } +coroutines-swing={module="org.jetbrains.kotlinx:kotlinx-coroutines-swing", version.ref="coroutines"} koin-core = { module = "io.insert-koin:koin-core", version.ref = "koinCore" } kotlinX-serializationJson = { module = "org.jetbrains.kotlinx:kotlinx-serialization-json", version.ref = "kotlinxSerializationJson" } ktor-core = { module = "io.ktor:ktor-client-core", version.ref = "ktor" } @@ -137,5 +138,6 @@ test-runner = { module = "androidx.test:runner", version.ref = "test" } turbine = { module = "app.cash.turbine:turbine", version.ref = "turbine" } [bundles] +ktor = ["ktor-core", "ktor-contentNegotiation", "ktor-json", "ktor-logging"] coil = ["coil-compose-core", "coil-compose", "coil-ktor", "coil-multiplatform"] multiplatformSettings = ["multiplatformSettings-coroutines", "multiplatformSettings-noArg"] \ No newline at end of file diff --git a/shared/build.gradle.kts b/shared/build.gradle.kts index 46d976f8..13f4dff6 100644 --- a/shared/build.gradle.kts +++ b/shared/build.gradle.kts @@ -50,12 +50,9 @@ kotlin { api(compose.components.resources) api(compose.materialIconsExtended) - implementation(libs.kotlinX.coroutines) + implementation(libs.coroutines) - api(libs.ktor.core) - implementation(libs.ktor.contentNegotiation) - implementation(libs.ktor.json) - implementation(libs.ktor.logging) + implementation(libs.bundles.ktor) api(libs.koin.core) implementation(libs.koin.compose) @@ -101,7 +98,9 @@ kotlin { sourceSets["iosTest"].dependencies {} sourceSets["jvmMain"].dependencies { + implementation(libs.ktor.java) implementation(libs.sqlDelight.jvm) + implementation(libs.coroutines.swing) } sourceSets["jvmTest"].dependencies {} From 89776070fcf3f1444def41af1e4e96d0e11f6335 Mon Sep 17 00:00:00 2001 From: Victor Kabata Date: Mon, 22 Jul 2024 17:00:22 +0300 Subject: [PATCH 11/14] Move to jetpack viewmodel --- .../com/vickbt/shared/ui/screens/details/DetailsViewModel.kt | 3 +-- .../vickbt/shared/ui/screens/favorites/FavoritesViewModel.kt | 3 +-- .../kotlin/com/vickbt/shared/ui/screens/home/HomeViewModel.kt | 3 +-- .../kotlin/com/vickbt/shared/ui/screens/main/MainViewModel.kt | 3 +-- .../com/vickbt/shared/ui/screens/settings/SettingsViewModel.kt | 3 +-- 5 files changed, 5 insertions(+), 10 deletions(-) diff --git a/shared/src/commonMain/kotlin/com/vickbt/shared/ui/screens/details/DetailsViewModel.kt b/shared/src/commonMain/kotlin/com/vickbt/shared/ui/screens/details/DetailsViewModel.kt index 84f973e3..446ee097 100644 --- a/shared/src/commonMain/kotlin/com/vickbt/shared/ui/screens/details/DetailsViewModel.kt +++ b/shared/src/commonMain/kotlin/com/vickbt/shared/ui/screens/details/DetailsViewModel.kt @@ -1,6 +1,7 @@ package com.vickbt.shared.ui.screens.details import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope import com.vickbt.shared.domain.models.MovieDetails import com.vickbt.shared.domain.repositories.MovieDetailsRepository import com.vickbt.shared.utils.DetailsUiState @@ -23,8 +24,6 @@ class DetailsViewModel( private val _movieDetailsState = MutableStateFlow(DetailsUiState()) val movieDetailsState = _movieDetailsState.asStateFlow() - private val viewModelScope = CoroutineScope(Dispatchers.Default) - private val coroutineExceptionHandler = CoroutineExceptionHandler { _, exception -> _movieDetailsState.update { it.copy(isLoading = false, error = exception.message) } } diff --git a/shared/src/commonMain/kotlin/com/vickbt/shared/ui/screens/favorites/FavoritesViewModel.kt b/shared/src/commonMain/kotlin/com/vickbt/shared/ui/screens/favorites/FavoritesViewModel.kt index 6860c54d..574f84ce 100644 --- a/shared/src/commonMain/kotlin/com/vickbt/shared/ui/screens/favorites/FavoritesViewModel.kt +++ b/shared/src/commonMain/kotlin/com/vickbt/shared/ui/screens/favorites/FavoritesViewModel.kt @@ -1,6 +1,7 @@ package com.vickbt.shared.ui.screens.favorites import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope import com.vickbt.shared.domain.repositories.FavoritesRepository import com.vickbt.shared.utils.FavouritesUiState import kotlinx.coroutines.CoroutineExceptionHandler @@ -18,8 +19,6 @@ class FavoritesViewModel( private val _favoriteMoviesState = MutableStateFlow(FavouritesUiState()) val favoriteMoviesState = _favoriteMoviesState.asStateFlow() - private val viewModelScope = CoroutineScope(Dispatchers.Default) - private val coroutineExceptionHandler = CoroutineExceptionHandler { _, exception -> _favoriteMoviesState.update { it.copy(isLoading = false, error = exception.message) } } diff --git a/shared/src/commonMain/kotlin/com/vickbt/shared/ui/screens/home/HomeViewModel.kt b/shared/src/commonMain/kotlin/com/vickbt/shared/ui/screens/home/HomeViewModel.kt index f67cad30..5e21843f 100644 --- a/shared/src/commonMain/kotlin/com/vickbt/shared/ui/screens/home/HomeViewModel.kt +++ b/shared/src/commonMain/kotlin/com/vickbt/shared/ui/screens/home/HomeViewModel.kt @@ -1,6 +1,7 @@ package com.vickbt.shared.ui.screens.home import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope import com.vickbt.shared.domain.repositories.MoviesRepository import com.vickbt.shared.utils.HomeUiState import com.vickbt.shared.utils.SearchUiState @@ -28,8 +29,6 @@ class HomeViewModel(private val moviesRepository: MoviesRepository) : ViewModel( private val _searchQuery = MutableStateFlow("") val searchQuery = _searchQuery.asStateFlow() - private val viewModelScope = CoroutineScope(Dispatchers.IO) - private val coroutineExceptionHandler = CoroutineExceptionHandler { _, exception -> _homeUiState.update { it.copy(isLoading = false, error = exception.message) } } diff --git a/shared/src/commonMain/kotlin/com/vickbt/shared/ui/screens/main/MainViewModel.kt b/shared/src/commonMain/kotlin/com/vickbt/shared/ui/screens/main/MainViewModel.kt index 855d4b35..81db7035 100644 --- a/shared/src/commonMain/kotlin/com/vickbt/shared/ui/screens/main/MainViewModel.kt +++ b/shared/src/commonMain/kotlin/com/vickbt/shared/ui/screens/main/MainViewModel.kt @@ -1,6 +1,7 @@ package com.vickbt.shared.ui.screens.main import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope import com.vickbt.shared.domain.repositories.SettingsRepository import com.vickbt.shared.utils.MainUiState import io.github.aakira.napier.Napier @@ -19,8 +20,6 @@ class MainViewModel(private val settingsRepository: SettingsRepository) : ViewMo private val _mainUiState = MutableStateFlow(MainUiState()) val mainUiState = _mainUiState.asStateFlow() - private val viewModelScope = CoroutineScope(Dispatchers.IO) - private val coroutineExceptionHandler = CoroutineExceptionHandler { _, _ -> } init { diff --git a/shared/src/commonMain/kotlin/com/vickbt/shared/ui/screens/settings/SettingsViewModel.kt b/shared/src/commonMain/kotlin/com/vickbt/shared/ui/screens/settings/SettingsViewModel.kt index 4dd7d997..d03e8dff 100644 --- a/shared/src/commonMain/kotlin/com/vickbt/shared/ui/screens/settings/SettingsViewModel.kt +++ b/shared/src/commonMain/kotlin/com/vickbt/shared/ui/screens/settings/SettingsViewModel.kt @@ -1,6 +1,7 @@ package com.vickbt.shared.ui.screens.settings import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope import com.vickbt.shared.domain.repositories.SettingsRepository import com.vickbt.shared.utils.SettingsUiState import kotlinx.coroutines.CoroutineExceptionHandler @@ -18,8 +19,6 @@ class SettingsViewModel(private val settingsRepository: SettingsRepository) : private val _settingsUiState = MutableStateFlow(SettingsUiState(isLoading = true)) val settingsUiState = _settingsUiState.asStateFlow() - private val viewModelScope = CoroutineScope(Dispatchers.IO) - private val coroutineExceptionHandler = CoroutineExceptionHandler { _, exception -> _settingsUiState.update { it.copy(isLoading = false, error = exception.message) } } From d8cb05e23d21dcfa4da6191f6fb9708b36a2f94b Mon Sep 17 00:00:00 2001 From: Victor Kabata Date: Mon, 22 Jul 2024 17:03:11 +0300 Subject: [PATCH 12/14] Moved home screen code to vm init block --- .../kotlin/com/vickbt/shared/ui/screens/home/HomeScreen.kt | 7 ------- .../com/vickbt/shared/ui/screens/home/HomeViewModel.kt | 7 +++++++ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/shared/src/commonMain/kotlin/com/vickbt/shared/ui/screens/home/HomeScreen.kt b/shared/src/commonMain/kotlin/com/vickbt/shared/ui/screens/home/HomeScreen.kt index e42a16e4..234d0559 100644 --- a/shared/src/commonMain/kotlin/com/vickbt/shared/ui/screens/home/HomeScreen.kt +++ b/shared/src/commonMain/kotlin/com/vickbt/shared/ui/screens/home/HomeScreen.kt @@ -66,13 +66,6 @@ fun HomeScreen( ) { val scrollState = rememberScrollState() - LaunchedEffect(key1 = viewModel) { - viewModel.fetchNowPlayingMovies() - viewModel.fetchTrendingMovies() - viewModel.fetchUpcomingMovies() - viewModel.fetchPopularMovies() - } - val homeUiState = viewModel.homeUiState.collectAsState().value val searchUiState = viewModel.searchUiState.collectAsState().value diff --git a/shared/src/commonMain/kotlin/com/vickbt/shared/ui/screens/home/HomeViewModel.kt b/shared/src/commonMain/kotlin/com/vickbt/shared/ui/screens/home/HomeViewModel.kt index 5e21843f..aaa70d6c 100644 --- a/shared/src/commonMain/kotlin/com/vickbt/shared/ui/screens/home/HomeViewModel.kt +++ b/shared/src/commonMain/kotlin/com/vickbt/shared/ui/screens/home/HomeViewModel.kt @@ -33,6 +33,13 @@ class HomeViewModel(private val moviesRepository: MoviesRepository) : ViewModel( _homeUiState.update { it.copy(isLoading = false, error = exception.message) } } + init { + fetchNowPlayingMovies() + fetchTrendingMovies() + fetchUpcomingMovies() + fetchPopularMovies() + } + fun fetchNowPlayingMovies() = viewModelScope.launch(coroutineExceptionHandler) { moviesRepository.fetchNowPlayingMovies().collectLatest { moviesResult -> moviesResult.isLoading { isLoading -> From 97c88385865399b52fdc0fce2c699eadd2a0e95d Mon Sep 17 00:00:00 2001 From: Victor Kabata Date: Mon, 22 Jul 2024 19:48:58 +0300 Subject: [PATCH 13/14] Linting --- .../com/vickbt/shared/ui/screens/details/DetailsViewModel.kt | 2 -- .../vickbt/shared/ui/screens/favorites/FavoritesViewModel.kt | 2 -- .../kotlin/com/vickbt/shared/ui/screens/home/HomeScreen.kt | 1 - .../kotlin/com/vickbt/shared/ui/screens/home/HomeViewModel.kt | 3 --- .../kotlin/com/vickbt/shared/ui/screens/main/MainViewModel.kt | 3 --- .../com/vickbt/shared/ui/screens/settings/SettingsViewModel.kt | 3 --- 6 files changed, 14 deletions(-) diff --git a/shared/src/commonMain/kotlin/com/vickbt/shared/ui/screens/details/DetailsViewModel.kt b/shared/src/commonMain/kotlin/com/vickbt/shared/ui/screens/details/DetailsViewModel.kt index 446ee097..0bba50df 100644 --- a/shared/src/commonMain/kotlin/com/vickbt/shared/ui/screens/details/DetailsViewModel.kt +++ b/shared/src/commonMain/kotlin/com/vickbt/shared/ui/screens/details/DetailsViewModel.kt @@ -10,8 +10,6 @@ import com.vickbt.shared.utils.onFailure import com.vickbt.shared.utils.onSuccess import io.github.aakira.napier.Napier import kotlinx.coroutines.CoroutineExceptionHandler -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.update diff --git a/shared/src/commonMain/kotlin/com/vickbt/shared/ui/screens/favorites/FavoritesViewModel.kt b/shared/src/commonMain/kotlin/com/vickbt/shared/ui/screens/favorites/FavoritesViewModel.kt index 574f84ce..d4d749a5 100644 --- a/shared/src/commonMain/kotlin/com/vickbt/shared/ui/screens/favorites/FavoritesViewModel.kt +++ b/shared/src/commonMain/kotlin/com/vickbt/shared/ui/screens/favorites/FavoritesViewModel.kt @@ -5,8 +5,6 @@ import androidx.lifecycle.viewModelScope import com.vickbt.shared.domain.repositories.FavoritesRepository import com.vickbt.shared.utils.FavouritesUiState import kotlinx.coroutines.CoroutineExceptionHandler -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.update diff --git a/shared/src/commonMain/kotlin/com/vickbt/shared/ui/screens/home/HomeScreen.kt b/shared/src/commonMain/kotlin/com/vickbt/shared/ui/screens/home/HomeScreen.kt index 234d0559..6d2a7446 100644 --- a/shared/src/commonMain/kotlin/com/vickbt/shared/ui/screens/home/HomeScreen.kt +++ b/shared/src/commonMain/kotlin/com/vickbt/shared/ui/screens/home/HomeScreen.kt @@ -32,7 +32,6 @@ import androidx.compose.material3.SearchBar import androidx.compose.material3.SearchBarDefaults import androidx.compose.material3.Text import androidx.compose.runtime.Composable -import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf diff --git a/shared/src/commonMain/kotlin/com/vickbt/shared/ui/screens/home/HomeViewModel.kt b/shared/src/commonMain/kotlin/com/vickbt/shared/ui/screens/home/HomeViewModel.kt index aaa70d6c..fc8a19ee 100644 --- a/shared/src/commonMain/kotlin/com/vickbt/shared/ui/screens/home/HomeViewModel.kt +++ b/shared/src/commonMain/kotlin/com/vickbt/shared/ui/screens/home/HomeViewModel.kt @@ -9,9 +9,6 @@ import com.vickbt.shared.utils.isLoading import com.vickbt.shared.utils.onFailure import com.vickbt.shared.utils.onSuccess import kotlinx.coroutines.CoroutineExceptionHandler -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.IO import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.collectLatest diff --git a/shared/src/commonMain/kotlin/com/vickbt/shared/ui/screens/main/MainViewModel.kt b/shared/src/commonMain/kotlin/com/vickbt/shared/ui/screens/main/MainViewModel.kt index 81db7035..d956b212 100644 --- a/shared/src/commonMain/kotlin/com/vickbt/shared/ui/screens/main/MainViewModel.kt +++ b/shared/src/commonMain/kotlin/com/vickbt/shared/ui/screens/main/MainViewModel.kt @@ -6,9 +6,6 @@ import com.vickbt.shared.domain.repositories.SettingsRepository import com.vickbt.shared.utils.MainUiState import io.github.aakira.napier.Napier import kotlinx.coroutines.CoroutineExceptionHandler -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.IO import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.collectLatest diff --git a/shared/src/commonMain/kotlin/com/vickbt/shared/ui/screens/settings/SettingsViewModel.kt b/shared/src/commonMain/kotlin/com/vickbt/shared/ui/screens/settings/SettingsViewModel.kt index d03e8dff..7b2218d7 100644 --- a/shared/src/commonMain/kotlin/com/vickbt/shared/ui/screens/settings/SettingsViewModel.kt +++ b/shared/src/commonMain/kotlin/com/vickbt/shared/ui/screens/settings/SettingsViewModel.kt @@ -5,9 +5,6 @@ import androidx.lifecycle.viewModelScope import com.vickbt.shared.domain.repositories.SettingsRepository import com.vickbt.shared.utils.SettingsUiState import kotlinx.coroutines.CoroutineExceptionHandler -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.IO import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.update From 921a2f5eb11dc776e8a1a68a4552b3e26088b2db Mon Sep 17 00:00:00 2001 From: Victor Kabata Date: Mon, 22 Jul 2024 20:02:38 +0300 Subject: [PATCH 14/14] Update jvmMain to desktopMain --- shared/build.gradle.kts | 6 +++--- .../kotlin/com/vickbt/shared/di/Module.kt | 0 .../kotlin/com/vickbt/shared/utils/DatabaseDriverFactory.kt | 0 .../com/vickbt/shared/utils/MultiplatformSettingsWrapper.kt | 0 4 files changed, 3 insertions(+), 3 deletions(-) rename shared/src/{jvmMain => desktopMain}/kotlin/com/vickbt/shared/di/Module.kt (100%) rename shared/src/{jvmMain => desktopMain}/kotlin/com/vickbt/shared/utils/DatabaseDriverFactory.kt (100%) rename shared/src/{jvmMain => desktopMain}/kotlin/com/vickbt/shared/utils/MultiplatformSettingsWrapper.kt (100%) diff --git a/shared/build.gradle.kts b/shared/build.gradle.kts index 13f4dff6..41a03695 100644 --- a/shared/build.gradle.kts +++ b/shared/build.gradle.kts @@ -27,7 +27,7 @@ kotlin { } iosTarget("ios") {} - jvm() + jvm("desktop") cocoapods { summary = "Some description for the Shared Module" @@ -97,13 +97,13 @@ kotlin { sourceSets["iosTest"].dependencies {} - sourceSets["jvmMain"].dependencies { + sourceSets["desktopMain"].dependencies { implementation(libs.ktor.java) implementation(libs.sqlDelight.jvm) implementation(libs.coroutines.swing) } - sourceSets["jvmTest"].dependencies {} + sourceSets["desktopTest"].dependencies {} } } diff --git a/shared/src/jvmMain/kotlin/com/vickbt/shared/di/Module.kt b/shared/src/desktopMain/kotlin/com/vickbt/shared/di/Module.kt similarity index 100% rename from shared/src/jvmMain/kotlin/com/vickbt/shared/di/Module.kt rename to shared/src/desktopMain/kotlin/com/vickbt/shared/di/Module.kt diff --git a/shared/src/jvmMain/kotlin/com/vickbt/shared/utils/DatabaseDriverFactory.kt b/shared/src/desktopMain/kotlin/com/vickbt/shared/utils/DatabaseDriverFactory.kt similarity index 100% rename from shared/src/jvmMain/kotlin/com/vickbt/shared/utils/DatabaseDriverFactory.kt rename to shared/src/desktopMain/kotlin/com/vickbt/shared/utils/DatabaseDriverFactory.kt diff --git a/shared/src/jvmMain/kotlin/com/vickbt/shared/utils/MultiplatformSettingsWrapper.kt b/shared/src/desktopMain/kotlin/com/vickbt/shared/utils/MultiplatformSettingsWrapper.kt similarity index 100% rename from shared/src/jvmMain/kotlin/com/vickbt/shared/utils/MultiplatformSettingsWrapper.kt rename to shared/src/desktopMain/kotlin/com/vickbt/shared/utils/MultiplatformSettingsWrapper.kt