Skip to content

draft: feat: activate migrate to cmp #2365

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Draft
wants to merge 1 commit into
base: kmp-impl
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,8 @@ class CMPFeatureConventionPlugin : Plugin<Project> {
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())
Expand Down
28 changes: 16 additions & 12 deletions feature/activate/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -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)
}
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)
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand All @@ -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(
Expand Down Expand Up @@ -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()

Expand All @@ -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()
}
},
)
Expand All @@ -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)
Expand All @@ -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
},
Expand All @@ -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<ActivateUiState> {

override val values: Sequence<ActivateUiState>
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 = {},
)
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@
*/
package com.mifos.feature.activate

import org.jetbrains.compose.resources.StringResource

/**
* Created by Aditya Gupta on 06/08/23.
*/
Expand All @@ -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()
}
Original file line number Diff line number Diff line change
Expand Up @@ -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() {

Expand All @@ -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)
}
}
}
Expand Down
Loading