Skip to content

Commit

Permalink
Merge pull request #113 from VictorKabata/ktx_viewmodel
Browse files Browse the repository at this point in the history
Migrate to some Jetpack libs
  • Loading branch information
VictorKabata committed Jul 22, 2024
2 parents 3a24e6f + 921a2f5 commit 5dd8174
Show file tree
Hide file tree
Showing 34 changed files with 251 additions and 416 deletions.
33 changes: 20 additions & 13 deletions gradle/libs.versions.toml
Original file line number Diff line number Diff line change
Expand Up @@ -13,21 +13,22 @@ 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"
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"
Expand All @@ -50,7 +51,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" }
Expand All @@ -64,7 +64,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" }
Expand All @@ -77,11 +76,11 @@ 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" }
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" }
Expand All @@ -100,18 +99,21 @@ 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" }
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" }
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" }
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" }
Expand All @@ -133,4 +135,9 @@ 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" }
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"]
24 changes: 11 additions & 13 deletions shared/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ kotlin {
}
iosTarget("ios") {}

jvm()
jvm("desktop")

cocoapods {
summary = "Some description for the Shared Module"
Expand All @@ -50,29 +50,25 @@ 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)
implementation(libs.koin.composeViewModel)

implementation(libs.kotlinX.serializationJson)

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)

api(libs.preCompose)
api(libs.preCompose.viewmodel)
implementation(libs.navigation)

implementation(libs.sqlDelight.coroutine)

Expand Down Expand Up @@ -101,11 +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 {}
}
}

Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -30,9 +30,8 @@ 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
import org.koin.dsl.module

fun commonModule(enableNetworkLogs: Boolean) = module {
Expand Down Expand Up @@ -87,11 +86,11 @@ fun commonModule(enableNetworkLogs: Boolean) = module {
single<FavoritesRepository> { FavoritesRepositoryImpl(favoriteMovieDao = get()) }
single<SettingsRepository> { 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
4 changes: 2 additions & 2 deletions shared/src/commonMain/kotlin/com/vickbt/shared/di/Koin.kt
Original file line number Diff line number Diff line change
@@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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<NavigationItem>
) {
NavigationBar(
Expand All @@ -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(
Expand All @@ -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)
}
)
}
Expand Down
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -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
Expand All @@ -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),
Expand Down
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -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
Expand All @@ -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
Expand Down
Loading

0 comments on commit 5dd8174

Please sign in to comment.