Skip to content

Commit

Permalink
Refactor: refactored viewmodels
Browse files Browse the repository at this point in the history
  • Loading branch information
Nagarjuna0033 committed Jan 29, 2025
1 parent 9369039 commit ae5d7a7
Show file tree
Hide file tree
Showing 9 changed files with 84 additions and 66 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/master_dev_ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@ jobs:
- name: Check Dependency Guard
id: dependencyguard_verify
continue-on-error: true
run: ./gradlew :mifos-android:dependencyGuard
run: ./gradlew dependencyGuard

- name: Prevent updating Dependency Guard baselines if this is a fork
id: checkfork_dependencyguard
Expand Down
2 changes: 1 addition & 1 deletion .run/mifospay-android.run.xml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="mifospay-android" type="AndroidRunConfigurationType" factoryName="Android App" activateToolWindowBeforeRun="false">
<configuration default="false" name="androidApp" type="AndroidRunConfigurationType" factoryName="Android App" activateToolWindowBeforeRun="false">
<module name="mobile-wallet.mifospay-android.main" />
<option name="DEPLOY" value="true" />
<option name="DEPLOY_APK_FROM_BUNDLE" value="false" />
Expand Down
2 changes: 0 additions & 2 deletions ci-prepush.sh
Original file line number Diff line number Diff line change
Expand Up @@ -28,8 +28,6 @@ tasks=(
"spotlessApply --no-configuration-cache"
"dependencyGuardBaseline"
"detekt"
":mifos-android:build"
":mifos-android:updateProdReleaseBadging"
)

for task in "${tasks[@]}"; do
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,8 @@ fun MifosBasicDialog(
visibilityState: BasicDialogState,
onConfirm: () -> Unit,
onDismissRequest: () -> Unit,
confirmText: String = "Ok",
cancelText: String = "Cancel",
): Unit = when (visibilityState) {
BasicDialogState.Hidden -> Unit
is BasicDialogState.Shown -> {
Expand All @@ -75,7 +77,7 @@ fun MifosBasicDialog(
confirmButton = {
MifosTextButton(
content = {
Text(text = "Ok")
Text(text = confirmText)
},
onClick = onConfirm,
modifier = Modifier.testTag("AcceptAlertButton"),
Expand All @@ -84,7 +86,7 @@ fun MifosBasicDialog(
dismissButton = {
MifosTextButton(
content = {
Text(text = "Cancel")
Text(text = cancelText)
},
onClick = onDismissRequest,
modifier = Modifier.testTag("DismissAlertButton"),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@ import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.verticalScroll
import androidx.compose.material3.ButtonDefaults
import androidx.compose.material3.HorizontalDivider
import androidx.compose.material3.Icon
import androidx.compose.material3.MaterialTheme
Expand Down Expand Up @@ -171,6 +170,7 @@ private fun LoginScreenContent(
},
)
},
verticalArrangement = Arrangement.spacedBy(8.dp),
) {
MifosMobileIcon(mobileIcon = Res.drawable.feature_auth_mifos_logo)

Expand All @@ -188,8 +188,6 @@ private fun LoginScreenContent(
},
)

Spacer(modifier = Modifier.height(8.dp))

MifosPasswordField(
label = stringResource(Res.string.password),
value = state.password,
Expand All @@ -204,17 +202,12 @@ private fun LoginScreenContent(

)

Spacer(modifier = Modifier.height(8.dp))
val isLoginButtonEnabled = state.username.isNotEmpty() && state.password.isNotEmpty()
MifosButton(
modifier = Modifier
.fillMaxWidth()
.padding(start = 16.dp, end = 16.dp, top = 4.dp),
contentPadding = PaddingValues(12.dp),
colors = ButtonDefaults.buttonColors(
containerColor = MaterialTheme.colorScheme.primary,
),
enabled = isLoginButtonEnabled,
enabled = state.isLoginButtonEnabled,
onClick = {
onAction(LoginAction.LoginClicked)
},
Expand Down Expand Up @@ -262,9 +255,6 @@ private fun LoginScreenContent(
modifier = Modifier
.fillMaxWidth()
.align(Alignment.CenterHorizontally),
colors = ButtonDefaults.textButtonColors(
contentColor = MaterialTheme.colorScheme.primary,
),
) {
Text(text = stringResource(Res.string.create_an_account))
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,10 +51,20 @@ class LoginViewModel(
override fun handleAction(action: LoginAction) {
when (action) {
is LoginAction.UsernameChanged -> {
updateState { it.copy(username = action.username) }
updateState {
it.copy(
username = action.username,
isLoginButtonEnabled = action.username.isNotEmpty() && it.password.isNotEmpty(),
)
}
}
is LoginAction.PasswordChanged -> {
updateState { it.copy(password = action.password) }
updateState {
it.copy(
password = action.password,
isLoginButtonEnabled = it.username.isNotEmpty() && it.password.isNotEmpty(),
)
}
}
is LoginAction.TogglePasswordVisibility -> {
updateState { it.copy(isPasswordVisible = !it.isPasswordVisible) }
Expand Down Expand Up @@ -139,6 +149,7 @@ data class LoginState(
val isPasswordVisible: Boolean = false,
val clientName: String = "",
val dialogState: DialogState?,
val isLoginButtonEnabled: Boolean = false,
) : Parcelable {
sealed class DialogState : Parcelable {
@Parcelize
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,12 +19,10 @@ import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.text.KeyboardOptions
import androidx.compose.material3.AlertDialog
import androidx.compose.material3.ButtonDefaults
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.SnackbarHost
import androidx.compose.material3.SnackbarHostState
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember
Expand All @@ -51,10 +49,13 @@ import mifos_mobile.feature.auth.generated.resources.yes
import org.jetbrains.compose.resources.painterResource
import org.jetbrains.compose.resources.stringResource
import org.koin.compose.viewmodel.koinViewModel
import org.mifos.mobile.core.designsystem.component.BasicDialogState
import org.mifos.mobile.core.designsystem.component.LoadingDialogState
import org.mifos.mobile.core.designsystem.component.MifosBasicDialog
import org.mifos.mobile.core.designsystem.component.MifosButton
import org.mifos.mobile.core.designsystem.component.MifosLoadingDialog
import org.mifos.mobile.core.designsystem.component.MifosOutlinedTextField
import org.mifos.mobile.core.designsystem.component.MifosScaffold
import org.mifos.mobile.core.designsystem.component.MifosTextButton
import org.mifos.mobile.core.designsystem.theme.MifosMobileTheme
import org.mifos.mobile.core.ui.component.MifosProgressIndicatorOverlay
import org.mifos.mobile.core.ui.utils.DevicePreviews
Expand All @@ -64,7 +65,6 @@ import org.mifos.mobile.core.ui.utils.EventsEffect
internal fun RegistrationVerificationScreen(
navigateBack: () -> Unit?,
onVerified: () -> Unit,
modifier: Modifier = Modifier,
viewModel: RegistrationVerificationViewModel = koinViewModel(),
) {
val state by viewModel.stateFlow.collectAsStateWithLifecycle()
Expand All @@ -75,33 +75,15 @@ internal fun RegistrationVerificationScreen(
VerificationAction.ConfirmationDialog(true)
}

if (state.showConfirmationDialog) {
AlertDialog(
onDismissRequest = { VerificationAction.ConfirmationDialog(false) },
title = { Text(text = stringResource(Res.string.dialog_cancel_registration_title)) },
text = {
Text(text = stringResource(Res.string.dialog_cancel_registration_message))
},
modifier = modifier,
confirmButton = {
MifosTextButton(
onClick = {
VerificationAction.ConfirmationDialog(false)
navigateBack.invoke()
},
) {
Text(text = stringResource(Res.string.yes))
}
},
dismissButton = {
MifosTextButton(
onClick = { VerificationAction.ConfirmationDialog(false) },
) {
Text(text = stringResource(Res.string.no))
}
},
)
}
VerificationDialogs(
dialogState = state.dialogState,
showConfirmationDialog = state.showConfirmationDialog,
onDismissRequest = { VerificationAction.ConfirmationDialog(false) },
onConfirmExit = {
VerificationAction.ConfirmationDialog(false)
navigateBack()
},
)

EventsEffect(viewModel) { event ->
when (event) {
Expand All @@ -128,6 +110,43 @@ internal fun RegistrationVerificationScreen(
)
}

@Composable
private fun VerificationDialogs(
dialogState: VerificationState.VerificationDialog?,
showConfirmationDialog: Boolean,
onDismissRequest: () -> Unit,
onConfirmExit: () -> Unit,
) {
when (dialogState) {
is VerificationState.VerificationDialog.Error -> MifosBasicDialog(
visibilityState = BasicDialogState.Shown(
title = "Error",
message = dialogState.message,
),
onDismissRequest = onDismissRequest,
)

is VerificationState.VerificationDialog.Loading -> MifosLoadingDialog(
visibilityState = LoadingDialogState.Shown,
)

null -> Unit
}

if (showConfirmationDialog) {
MifosBasicDialog(
visibilityState = BasicDialogState.Shown(
title = stringResource(Res.string.dialog_cancel_registration_title),
message = stringResource(Res.string.dialog_cancel_registration_message),
),
confirmText = stringResource(Res.string.yes),
cancelText = stringResource(Res.string.no),
onDismissRequest = onDismissRequest,
onConfirm = onConfirmExit,
)
}
}

@Composable
private fun RegistrationVerificationScreen(
state: VerificationState,
Expand All @@ -149,8 +168,8 @@ private fun RegistrationVerificationScreen(
) {
RegistrationVerificationContent(state = state, onAction = onAction)
when (state.dialogState) {
is VerificationDialog.Loading -> MifosProgressIndicatorOverlay()
is VerificationDialog.Error -> {}
is VerificationState.VerificationDialog.Loading -> MifosProgressIndicatorOverlay()
is VerificationState.VerificationDialog.Error -> {}
null -> {}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ class RegistrationVerificationViewModel(
private fun handleSubmitClick() {
val errorMessage = validateForm()
if (errorMessage != null) {
updateState { it.copy(dialogState = VerificationDialog.Error(errorMessage)) }
updateState { it.copy(dialogState = VerificationState.VerificationDialog.Error(errorMessage)) }
} else {
verifyUser()
}
Expand All @@ -67,11 +67,11 @@ class RegistrationVerificationViewModel(

is DataState.Error -> {
updateState {
it.copy(dialogState = VerificationDialog.Error(result.exception.message ?: "An error occurred."))
it.copy(dialogState = VerificationState.VerificationDialog.Error(result.exception.message ?: "An error occurred."))
}
}

DataState.Loading -> updateState { it.copy(dialogState = VerificationDialog.Loading) }
DataState.Loading -> updateState { it.copy(dialogState = VerificationState.VerificationDialog.Loading) }

else -> {}
}
Expand Down Expand Up @@ -102,7 +102,7 @@ class RegistrationVerificationViewModel(
),
)
} catch (e: Exception) {
updateState { it.copy(dialogState = VerificationDialog.Error((e.message ?: Res.string.could_not_register_user_error).toString())) }
updateState { it.copy(dialogState = VerificationState.VerificationDialog.Error((e.message ?: Res.string.could_not_register_user_error).toString())) }
}
}
}
Expand All @@ -115,16 +115,15 @@ data class VerificationState(
val requestIdError: Boolean = false,
val showConfirmationDialog: Boolean = false,
val dialogState: VerificationDialog? = null,
) : Parcelable
) : Parcelable {
sealed interface VerificationDialog : Parcelable {
@Parcelize
data object Loading : VerificationDialog

sealed interface VerificationDialog : Parcelable {
@Parcelize
data object Loading : VerificationDialog

@Parcelize
data class Error(val message: String) : VerificationDialog
@Parcelize
data class Error(val message: String) : VerificationDialog
}
}

sealed interface VerificationEvent {
data class ShowToast(val message: String) : VerificationEvent
data class NavigateToLogin(val username: String) : VerificationEvent
Expand Down
1 change: 0 additions & 1 deletion gradle/libs.versions.toml
Original file line number Diff line number Diff line change
Expand Up @@ -317,7 +317,6 @@ moko-permission-compose = { group = "dev.icerock.moko", name = "permissions-comp

window-size = { group = "dev.chrisbanes.material3", name = "material3-window-size-class-multiplatform", version.ref = "windowsSizeClass" }
androidx-room-common = { group = "androidx.room", name = "room-common", version.ref = "roomCommonVersion" }
material = { group = "com.google.android.material", name = "material", version.ref = "materialVersion" }

[bundles]
androidx-compose-ui-test = [
Expand Down

0 comments on commit ae5d7a7

Please sign in to comment.