diff --git a/android/core/ui/build.gradle.kts b/android/core/ui/build.gradle.kts index 05528b13..f2f651cf 100644 --- a/android/core/ui/build.gradle.kts +++ b/android/core/ui/build.gradle.kts @@ -1,43 +1,11 @@ plugins { - alias(libs.plugins.androidLibrary) - alias(libs.plugins.jetbrainsKotlinAndroid) + alias(libs.plugins.sixkids.android.library) + alias(libs.plugins.sixkids.android.library.compose) } android { namespace = "com.sixkids.ui" - compileSdk = 34 - - defaultConfig { - minSdk = 26 - - testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" - consumerProguardFiles("consumer-rules.pro") - } - - buildTypes { - release { - isMinifyEnabled = false - proguardFiles( - getDefaultProguardFile("proguard-android-optimize.txt"), - "proguard-rules.pro" - ) - } - } - compileOptions { - sourceCompatibility = JavaVersion.VERSION_17 - targetCompatibility = JavaVersion.VERSION_17 - } - kotlinOptions { - jvmTarget = "17" - } } dependencies { - - implementation(libs.androidx.core.ktx) - implementation(libs.androidx.appcompat) - implementation(libs.material) - testImplementation(libs.junit) - androidTestImplementation(libs.androidx.junit) - androidTestImplementation(libs.androidx.espresso.core) } diff --git a/android/core/ui/src/main/java/com/sixkids/ui/base/BaseViewModel.kt b/android/core/ui/src/main/java/com/sixkids/ui/base/BaseViewModel.kt new file mode 100644 index 00000000..cecd3d21 --- /dev/null +++ b/android/core/ui/src/main/java/com/sixkids/ui/base/BaseViewModel.kt @@ -0,0 +1,35 @@ +package com.sixkids.ui.base + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import kotlinx.coroutines.channels.Channel +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.flow.receiveAsFlow +import kotlinx.coroutines.launch + +abstract class BaseViewModel( + initialState: UI_STATE +) : ViewModel() { + private val _uiState = MutableStateFlow(initialState) + val uiState = _uiState.asStateFlow() + + private val _sideEffect: Channel = Channel() + val sideEffect = _sideEffect.receiveAsFlow() + + protected val currentState: UI_STATE + get() = _uiState.value + + protected fun intent(reduce: UI_STATE.() -> UI_STATE) { + val state = currentState.reduce() + _uiState.value = state + } + + protected fun postSideEffect(vararg builder: SIDE_EFFECT) { + for (effectValue in builder) { + viewModelScope.launch { + _sideEffect.send(effectValue) + } + } + } +} diff --git a/android/core/ui/src/main/java/com/sixkids/ui/base/SideEffect.kt b/android/core/ui/src/main/java/com/sixkids/ui/base/SideEffect.kt new file mode 100644 index 00000000..069979a1 --- /dev/null +++ b/android/core/ui/src/main/java/com/sixkids/ui/base/SideEffect.kt @@ -0,0 +1,3 @@ +package com.sixkids.ui.base + +interface SideEffect diff --git a/android/core/ui/src/main/java/com/sixkids/ui/base/UiState.kt b/android/core/ui/src/main/java/com/sixkids/ui/base/UiState.kt new file mode 100644 index 00000000..d50b60d2 --- /dev/null +++ b/android/core/ui/src/main/java/com/sixkids/ui/base/UiState.kt @@ -0,0 +1,3 @@ +package com.sixkids.ui.base + +interface UiState