From cfc12117048c0ccce8789d41b7f1ce205464808e Mon Sep 17 00:00:00 2001 From: kapmaurya Date: Wed, 23 Apr 2025 01:07:13 +0530 Subject: [PATCH] cmp-activate migration --- .../main/kotlin/CMPFeatureConventionPlugin.kt | 4 +- feature/activate/build.gradle.kts | 28 +++++---- .../{main => androidMain}/AndroidManifest.xml | 0 .../composeResources}/values/strings.xml | 0 .../mifos/feature/activate/ActivateScreen.kt | 62 ++++++------------- .../mifos/feature/activate/ActivateUiState.kt | 6 +- .../feature/activate/ActivateViewModel.kt | 41 +++++++----- .../feature/activate/di/ActivateModule.kt | 0 .../activate/navigation/ActivateNavigation.kt | 0 .../activate/navigation/ActivateScreens.kt | 0 10 files changed, 64 insertions(+), 77 deletions(-) rename feature/activate/src/{main => androidMain}/AndroidManifest.xml (100%) rename feature/activate/src/{main/res => commonMain/composeResources}/values/strings.xml (100%) rename feature/activate/src/{main/java => commonMain/kotlin}/com/mifos/feature/activate/ActivateScreen.kt (76%) rename feature/activate/src/{main/java => commonMain/kotlin}/com/mifos/feature/activate/ActivateUiState.kt (71%) rename feature/activate/src/{main/java => commonMain/kotlin}/com/mifos/feature/activate/ActivateViewModel.kt (62%) rename feature/activate/src/{main/java => commonMain/kotlin}/com/mifos/feature/activate/di/ActivateModule.kt (100%) rename feature/activate/src/{main/java => commonMain/kotlin}/com/mifos/feature/activate/navigation/ActivateNavigation.kt (100%) rename feature/activate/src/{main/java => commonMain/kotlin}/com/mifos/feature/activate/navigation/ActivateScreens.kt (100%) diff --git a/build-logic/convention/src/main/kotlin/CMPFeatureConventionPlugin.kt b/build-logic/convention/src/main/kotlin/CMPFeatureConventionPlugin.kt index f5f1eb5c959..82909741528 100644 --- a/build-logic/convention/src/main/kotlin/CMPFeatureConventionPlugin.kt +++ b/build-logic/convention/src/main/kotlin/CMPFeatureConventionPlugin.kt @@ -17,8 +17,8 @@ class CMPFeatureConventionPlugin : Plugin { dependencies { add("commonMainImplementation", project(":core:ui")) add("commonMainImplementation", project(":core:designsystem")) - add("commonMainImplementation", project(":core:testing")) - add("commonMainImplementation", project(":core:data")) + //add("commonMainImplementation", project(":core:testing")) + //add("commonMainImplementation", project(":core:data")) add("commonMainImplementation", libs.findLibrary("koin.compose").get()) add("commonMainImplementation", libs.findLibrary("koin.compose.viewmodel").get()) diff --git a/feature/activate/build.gradle.kts b/feature/activate/build.gradle.kts index 0d6e5019241..b9cb4399c26 100644 --- a/feature/activate/build.gradle.kts +++ b/feature/activate/build.gradle.kts @@ -8,21 +8,25 @@ * See https://github.com/openMF/android-client/blob/master/LICENSE.md */ plugins { - alias(libs.plugins.mifos.android.feature) - alias(libs.plugins.mifos.android.library.compose) - alias(libs.plugins.mifos.android.library.jacoco) + alias(libs.plugins.mifos.cmp.feature) } android { namespace = "com.mifos.feature.activate" } -dependencies { - - implementation(projects.core.domain) - - testImplementation(libs.hilt.android.testing) - testImplementation(projects.core.testing) - - androidTestImplementation(projects.core.testing) -} \ No newline at end of file +kotlin { + sourceSets { + val commonMain by getting { + dependencies { + implementation(compose.material3) + implementation(compose.components.resources) + implementation(compose.ui) + api(projects.core.model) + api(projects.core.common) + api(projects.core.network) + //api(projects.core.domain) + } + } + } +} diff --git a/feature/activate/src/main/AndroidManifest.xml b/feature/activate/src/androidMain/AndroidManifest.xml similarity index 100% rename from feature/activate/src/main/AndroidManifest.xml rename to feature/activate/src/androidMain/AndroidManifest.xml diff --git a/feature/activate/src/main/res/values/strings.xml b/feature/activate/src/commonMain/composeResources/values/strings.xml similarity index 100% rename from feature/activate/src/main/res/values/strings.xml rename to feature/activate/src/commonMain/composeResources/values/strings.xml diff --git a/feature/activate/src/main/java/com/mifos/feature/activate/ActivateScreen.kt b/feature/activate/src/commonMain/kotlin/com/mifos/feature/activate/ActivateScreen.kt similarity index 76% rename from feature/activate/src/main/java/com/mifos/feature/activate/ActivateScreen.kt rename to feature/activate/src/commonMain/kotlin/com/mifos/feature/activate/ActivateScreen.kt index c5040deeff6..67eabfc891f 100644 --- a/feature/activate/src/main/java/com/mifos/feature/activate/ActivateScreen.kt +++ b/feature/activate/src/commonMain/kotlin/com/mifos/feature/activate/ActivateScreen.kt @@ -11,7 +11,11 @@ package com.mifos.feature.activate -import android.widget.Toast +import androidclient.feature.activate.generated.resources.Res +import androidclient.feature.activate.generated.resources.feature_activate +import androidclient.feature.activate.generated.resources.feature_activate_activation_date +import androidclient.feature.activate.generated.resources.feature_activate_cancel +import androidclient.feature.activate.generated.resources.feature_activate_select import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Spacer @@ -36,11 +40,7 @@ import androidx.compose.runtime.remember import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier -import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.res.stringResource -import androidx.compose.ui.tooling.preview.Preview -import androidx.compose.ui.tooling.preview.PreviewParameter -import androidx.compose.ui.tooling.preview.PreviewParameterProvider +import androidx.compose.ui.text.intl.Locale import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.lifecycle.compose.collectAsStateWithLifecycle @@ -50,9 +50,9 @@ import com.mifos.core.designsystem.component.MifosDatePickerTextField import com.mifos.core.designsystem.component.MifosScaffold import com.mifos.core.designsystem.component.MifosSweetError import com.mifos.core.model.objects.clients.ActivatePayload -import org.koin.androidx.compose.koinViewModel -import java.text.SimpleDateFormat -import java.util.Locale +import kotlinx.datetime.Clock +import org.jetbrains.compose.resources.stringResource +import org.koin.compose.viewmodel.koinViewModel @Composable internal fun ActivateScreen( @@ -104,22 +104,18 @@ internal fun ActivateScreen( val snackbarHostState = remember { SnackbarHostState() } MifosScaffold( - title = stringResource(id = R.string.feature_activate), + title = stringResource(Res.string.feature_activate), onBackPressed = onBackPressed, snackbarHostState = snackbarHostState, ) { paddingValues -> Column(modifier = modifier.padding(paddingValues)) { when (state) { is ActivateUiState.ActivatedSuccessfully -> { - Toast.makeText( - LocalContext.current, - stringResource(id = state.message), - Toast.LENGTH_SHORT, - ).show() + snackbarHostState.showSnackbar(message = stringResource(state.message)) onBackPressed() } - is ActivateUiState.Error -> MifosSweetError(message = stringResource(id = state.message)) {} + is ActivateUiState.Error -> MifosSweetError(message = stringResource( state.message)) {} is ActivateUiState.Loading -> MifosCircularProgress() @@ -136,12 +132,12 @@ private fun ActivateContent( ) { Column(modifier = modifier) { var showDatePicker by rememberSaveable { mutableStateOf(false) } - var activateDate by rememberSaveable { mutableLongStateOf(System.currentTimeMillis()) } + var activateDate by rememberSaveable { mutableLongStateOf(Clock.System.currentTimeMillis()) } val datePickerState = rememberDatePickerState( initialSelectedDateMillis = activateDate, selectableDates = object : SelectableDates { override fun isSelectableDate(utcTimeMillis: Long): Boolean { - return utcTimeMillis >= System.currentTimeMillis() + return utcTimeMillis >= Clock.System.currentTimeMillis() } }, ) @@ -159,14 +155,14 @@ private fun ActivateContent( activateDate = it } }, - ) { Text(stringResource(id = R.string.feature_activate_select)) } + ) { Text(stringResource(Res.string.feature_activate_select)) } }, dismissButton = { TextButton( onClick = { showDatePicker = false }, - ) { Text(stringResource(id = R.string.feature_activate_cancel)) } + ) { Text(stringResource(Res.string.feature_activate_cancel)) } }, ) { DatePicker(state = datePickerState) @@ -177,7 +173,7 @@ private fun ActivateContent( value = SimpleDateFormat("dd MMMM yyyy", Locale.getDefault()).format( activateDate, ), - label = stringResource(R.string.feature_activate_activation_date), + label = stringResource(Res.string.feature_activate_activation_date), openDatePicker = { showDatePicker = true }, @@ -199,30 +195,8 @@ private fun ActivateContent( .padding(start = 16.dp, end = 16.dp), contentPadding = PaddingValues(), ) { - Text(text = stringResource(id = R.string.feature_activate), fontSize = 16.sp) + Text(text = stringResource(Res.string.feature_activate), fontSize = 16.sp) } } } -private class ActivateUiStateProvider : PreviewParameterProvider { - - override val values: Sequence - get() = sequenceOf( - ActivateUiState.Loading, - ActivateUiState.Error(R.string.feature_activate_failed_to_activate_client), - ActivateUiState.ActivatedSuccessfully(R.string.feature_activate_client), - ActivateUiState.Initial, - ) -} - -@Preview(showBackground = true) -@Composable -private fun ActivateScreenPreview( - @PreviewParameter(ActivateUiStateProvider::class) state: ActivateUiState, -) { - ActivateScreen( - state = state, - onActivate = {}, - onBackPressed = {}, - ) -} diff --git a/feature/activate/src/main/java/com/mifos/feature/activate/ActivateUiState.kt b/feature/activate/src/commonMain/kotlin/com/mifos/feature/activate/ActivateUiState.kt similarity index 71% rename from feature/activate/src/main/java/com/mifos/feature/activate/ActivateUiState.kt rename to feature/activate/src/commonMain/kotlin/com/mifos/feature/activate/ActivateUiState.kt index dc4435c25ac..77327f52e94 100644 --- a/feature/activate/src/main/java/com/mifos/feature/activate/ActivateUiState.kt +++ b/feature/activate/src/commonMain/kotlin/com/mifos/feature/activate/ActivateUiState.kt @@ -9,6 +9,8 @@ */ package com.mifos.feature.activate +import org.jetbrains.compose.resources.StringResource + /** * Created by Aditya Gupta on 06/08/23. */ @@ -18,7 +20,7 @@ sealed class ActivateUiState { data object Loading : ActivateUiState() - data class Error(val message: Int) : ActivateUiState() + data class Error(val message: StringResource) : ActivateUiState() - data class ActivatedSuccessfully(val message: Int) : ActivateUiState() + data class ActivatedSuccessfully(val message: StringResource) : ActivateUiState() } diff --git a/feature/activate/src/main/java/com/mifos/feature/activate/ActivateViewModel.kt b/feature/activate/src/commonMain/kotlin/com/mifos/feature/activate/ActivateViewModel.kt similarity index 62% rename from feature/activate/src/main/java/com/mifos/feature/activate/ActivateViewModel.kt rename to feature/activate/src/commonMain/kotlin/com/mifos/feature/activate/ActivateViewModel.kt index a35dcb6ee29..772a3b6dd6e 100644 --- a/feature/activate/src/main/java/com/mifos/feature/activate/ActivateViewModel.kt +++ b/feature/activate/src/commonMain/kotlin/com/mifos/feature/activate/ActivateViewModel.kt @@ -9,24 +9,31 @@ */ package com.mifos.feature.activate +import androidclient.feature.activate.generated.resources.Res +import androidclient.feature.activate.generated.resources.feature_activate_center +import androidclient.feature.activate.generated.resources.feature_activate_client +import androidclient.feature.activate.generated.resources.feature_activate_failed_to_activate_center +import androidclient.feature.activate.generated.resources.feature_activate_failed_to_activate_client +import androidclient.feature.activate.generated.resources.feature_activate_failed_to_activate_group +import androidclient.feature.activate.generated.resources.feature_activate_group import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope +import com.mifos.core.common.network.MifosDispatchers import com.mifos.core.common.utils.Constants -import com.mifos.core.common.utils.Resource -import com.mifos.core.domain.useCases.ActivateCenterUseCase -import com.mifos.core.domain.useCases.ActivateClientUseCase -import com.mifos.core.domain.useCases.ActivateGroupUseCase +//import com.mifos.core.domain.useCases.ActivateCenterUseCase +//import com.mifos.core.domain.useCases.ActivateClientUseCase +//import com.mifos.core.domain.useCases.ActivateGroupUseCase import com.mifos.core.model.objects.clients.ActivatePayload -import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.launch +import org.jetbrains.compose.resources.Resource class ActivateViewModel( - private val activateClientUseCase: ActivateClientUseCase, - private val activateCenterUseCase: ActivateCenterUseCase, - private val activateGroupUseCase: ActivateGroupUseCase, +// private val activateClientUseCase: ActivateClientUseCase, +// private val activateCenterUseCase: ActivateCenterUseCase, +// private val activateGroupUseCase: ActivateGroupUseCase, savedStateHandle: SavedStateHandle, ) : ViewModel() { @@ -37,52 +44,52 @@ class ActivateViewModel( val activateUiState = _activateUiState.asStateFlow() fun activateClient(clientId: Int, clientPayload: ActivatePayload) = - viewModelScope.launch(Dispatchers.IO) { + viewModelScope.launch(MifosDispatchers.IO) { activateClientUseCase(clientId, clientPayload).collect { result -> when (result) { is Resource.Error<*> -> _activateUiState.value = - ActivateUiState.Error(R.string.feature_activate_failed_to_activate_client) + ActivateUiState.Error(Res.string.feature_activate_failed_to_activate_client) is Resource.Loading<*> -> _activateUiState.value = ActivateUiState.Loading is Resource.Success<*> -> _activateUiState.value = - ActivateUiState.ActivatedSuccessfully(R.string.feature_activate_client) + ActivateUiState.ActivatedSuccessfully(Res.string.feature_activate_client) } } } fun activateCenter(centerId: Int, centerPayload: ActivatePayload) = - viewModelScope.launch(Dispatchers.IO) { + viewModelScope.launch(MifosDispatchers.IO) { activateCenterUseCase(centerId, centerPayload).collect { result -> when (result) { is Resource.Error -> _activateUiState.value = - ActivateUiState.Error(R.string.feature_activate_failed_to_activate_center) + ActivateUiState.Error(Res.string.feature_activate_failed_to_activate_center) is Resource.Loading -> _activateUiState.value = ActivateUiState.Loading is Resource.Success -> _activateUiState.value = - ActivateUiState.ActivatedSuccessfully(R.string.feature_activate_center) + ActivateUiState.ActivatedSuccessfully(Res.string.feature_activate_center) } } } fun activateGroup(groupId: Int, groupPayload: ActivatePayload) = - viewModelScope.launch(Dispatchers.IO) { + viewModelScope.launch(MifosDispatchers.IO) { activateGroupUseCase(groupId, groupPayload).collect { result -> when (result) { is Resource.Error -> _activateUiState.value = - ActivateUiState.Error(R.string.feature_activate_failed_to_activate_group) + ActivateUiState.Error(Res.string.feature_activate_failed_to_activate_group) is Resource.Loading -> _activateUiState.value = ActivateUiState.Loading is Resource.Success -> _activateUiState.value = - ActivateUiState.ActivatedSuccessfully(R.string.feature_activate_group) + ActivateUiState.ActivatedSuccessfully(Res.string.feature_activate_group) } } } diff --git a/feature/activate/src/main/java/com/mifos/feature/activate/di/ActivateModule.kt b/feature/activate/src/commonMain/kotlin/com/mifos/feature/activate/di/ActivateModule.kt similarity index 100% rename from feature/activate/src/main/java/com/mifos/feature/activate/di/ActivateModule.kt rename to feature/activate/src/commonMain/kotlin/com/mifos/feature/activate/di/ActivateModule.kt diff --git a/feature/activate/src/main/java/com/mifos/feature/activate/navigation/ActivateNavigation.kt b/feature/activate/src/commonMain/kotlin/com/mifos/feature/activate/navigation/ActivateNavigation.kt similarity index 100% rename from feature/activate/src/main/java/com/mifos/feature/activate/navigation/ActivateNavigation.kt rename to feature/activate/src/commonMain/kotlin/com/mifos/feature/activate/navigation/ActivateNavigation.kt diff --git a/feature/activate/src/main/java/com/mifos/feature/activate/navigation/ActivateScreens.kt b/feature/activate/src/commonMain/kotlin/com/mifos/feature/activate/navigation/ActivateScreens.kt similarity index 100% rename from feature/activate/src/main/java/com/mifos/feature/activate/navigation/ActivateScreens.kt rename to feature/activate/src/commonMain/kotlin/com/mifos/feature/activate/navigation/ActivateScreens.kt