Skip to content

Commit

Permalink
fix(TransferPasswordAlertDialog): Fix password state not being correc…
Browse files Browse the repository at this point in the history
…tly resetted
  • Loading branch information
FabianDevel committed Nov 5, 2024
1 parent 33453b7 commit 1d3cde8
Showing 1 changed file with 57 additions and 33 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
package com.infomaniak.swisstransfer.ui.screen.newtransfer.importfiles.components

import androidx.compose.animation.AnimatedVisibility
import androidx.compose.foundation.layout.ColumnScope
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.height
Expand Down Expand Up @@ -48,49 +49,72 @@ fun PasswordOptionAlertDialog(
isPasswordValid: () -> Boolean,
) {

var isChecked by rememberSaveable { mutableStateOf(password.get().isNotEmpty()) }
var savedPassword by remember { mutableStateOf("") }
var isPasswordActivated by rememberSaveable { mutableStateOf(password.get().isNotEmpty()) }
var lastValidPassword by remember { mutableStateOf("") }

fun onDismissRequest() {
isPasswordActivated = lastValidPassword.isNotEmpty()
password.set(lastValidPassword)
onDismiss()
}

fun onConfirmButtonClicked() {
val passwordOption = if (isPasswordActivated) {
PasswordTransferOption.ACTIVATED
} else {
password.set("")
PasswordTransferOption.NONE
}

lastValidPassword = password.get()
onConfirmation(passwordOption)
}

if (showPasswordOptionAlert()) {
SwissTransferAlertDialog(
titleRes = R.string.settingsOptionPassword,
descriptionRes = R.string.settingsPasswordDescription,
onDismissRequest = {
isChecked = savedPassword.isNotEmpty()
password.set(savedPassword)
onDismiss()
},
onConfirmation = {
savedPassword = password.get()
val passwordOption = if (isChecked) PasswordTransferOption.ACTIVATED else PasswordTransferOption.NONE
onConfirmation(passwordOption)
},
shouldEnableConfirmButton = { if (isChecked) isPasswordValid() else true },
onDismissRequest = ::onDismissRequest,
onConfirmation = ::onConfirmButtonClicked,
shouldEnableConfirmButton = { if (isPasswordActivated) isPasswordValid() else true },
) {
Row(verticalAlignment = Alignment.CenterVertically) {
Text(
text = stringResource(R.string.settingsPasswordToggleDescription),
style = SwissTransferTheme.typography.bodyMedium,
color = SwissTransferTheme.colors.primaryTextColor,
)
WeightOneSpacer(minWidth = Margin.Medium)
Switch(checked = isChecked, onCheckedChange = { isChecked = it })
}

AnimatedVisibility(isChecked) {
Spacer(Modifier.height(Margin.Mini))
SwissTransferTextField(
label = stringResource(R.string.settingsOptionPassword),
isPassword = true,
initialValue = password.get(),
errorMessage = { if (isPasswordValid()) null else stringResource(R.string.errorTransferPasswordLength) },
onValueChange = { password.set(it) },
)
}
ActivatePasswordSwitch(isChecked = isPasswordActivated, onCheckedChange = { isPasswordActivated = it })
AnimatedPasswordInput(isPasswordActivated, password, isPasswordValid)
}
}
}

@Composable
private fun ActivatePasswordSwitch(isChecked: Boolean, onCheckedChange: (Boolean) -> Unit) {
Row(verticalAlignment = Alignment.CenterVertically) {
Text(
text = stringResource(R.string.settingsPasswordToggleDescription),
style = SwissTransferTheme.typography.bodyMedium,
color = SwissTransferTheme.colors.primaryTextColor,
)
WeightOneSpacer(minWidth = Margin.Medium)
Switch(isChecked, onCheckedChange)
}
}

@Composable
private fun ColumnScope.AnimatedPasswordInput(
isChecked: Boolean,
password: GetSetCallbacks<String>,
isPasswordValid: () -> Boolean
) {
AnimatedVisibility(isChecked) {
Spacer(Modifier.height(Margin.Mini))
SwissTransferTextField(
label = stringResource(R.string.settingsOptionPassword),
isPassword = true,
initialValue = password.get(),
errorMessage = { if (isPasswordValid()) null else stringResource(R.string.errorTransferPasswordLength) },
onValueChange = { password.set(it) },
)
}
}

@Preview
@Composable
fun Preview() {
Expand Down

0 comments on commit 1d3cde8

Please sign in to comment.