BIT-1081: Add log out ability to Vault Unlock screen (#285)

This commit is contained in:
Brian Yencho
2024-06-20 17:08:07 +01:00
committed by Álison Fernandes
parent 107ee1c08c
commit 04609b9a86
6 changed files with 138 additions and 20 deletions
@@ -38,11 +38,14 @@ import com.x8bit.bitwarden.ui.platform.components.BitwardenAccountSwitcher
import com.x8bit.bitwarden.ui.platform.components.BitwardenBasicDialog
import com.x8bit.bitwarden.ui.platform.components.BitwardenFilledButton
import com.x8bit.bitwarden.ui.platform.components.BitwardenLoadingDialog
import com.x8bit.bitwarden.ui.platform.components.BitwardenLogoutConfirmationDialog
import com.x8bit.bitwarden.ui.platform.components.BitwardenOverflowActionItem
import com.x8bit.bitwarden.ui.platform.components.BitwardenPasswordField
import com.x8bit.bitwarden.ui.platform.components.BitwardenScaffold
import com.x8bit.bitwarden.ui.platform.components.BitwardenTopAppBar
import com.x8bit.bitwarden.ui.platform.components.LoadingDialogState
import com.x8bit.bitwarden.ui.platform.components.OverflowMenuItemData
import kotlinx.collections.immutable.persistentListOf
import kotlinx.collections.immutable.toImmutableList
/**
@@ -76,6 +79,7 @@ fun VaultUnlockScreen(
canScroll = { !accountMenuVisible },
)
// Dynamic dialogs
when (val dialog = state.dialog) {
is VaultUnlockState.VaultUnlockDialog.Error -> BitwardenBasicDialog(
visibilityState = BasicDialogState.Shown(
@@ -94,6 +98,23 @@ fun VaultUnlockScreen(
null -> Unit
}
// Static dialogs
var showLogoutConfirmationDialog by remember { mutableStateOf(false) }
if (showLogoutConfirmationDialog) {
BitwardenLogoutConfirmationDialog(
onDismissRequest = { showLogoutConfirmationDialog = false },
onConfirmClick = remember(viewModel) {
{
showLogoutConfirmationDialog = false
viewModel.trySendAction(
VaultUnlockAction.ConfirmLogoutClick,
)
}
},
)
}
// Content
BitwardenScaffold(
modifier = Modifier
.fillMaxSize()
@@ -109,7 +130,14 @@ fun VaultUnlockScreen(
color = state.avatarColor,
onClick = { accountMenuVisible = !accountMenuVisible },
)
BitwardenOverflowActionItem()
BitwardenOverflowActionItem(
menuItemDataList = persistentListOf(
OverflowMenuItemData(
text = stringResource(id = R.string.log_out),
onClick = { showLogoutConfirmationDialog = true },
),
),
)
},
)
},
@@ -71,6 +71,7 @@ class VaultUnlockViewModel @Inject constructor(
when (action) {
VaultUnlockAction.AddAccountClick -> handleAddAccountClick()
VaultUnlockAction.DismissDialog -> handleDismissDialog()
VaultUnlockAction.ConfirmLogoutClick -> handleConfirmLogoutClick()
is VaultUnlockAction.PasswordInputChanged -> handlePasswordInputChanged(action)
is VaultUnlockAction.SwitchAccountClick -> handleSwitchAccountClick(action)
VaultUnlockAction.UnlockClick -> handleUnlockClick()
@@ -88,6 +89,10 @@ class VaultUnlockViewModel @Inject constructor(
mutableStateFlow.update { it.copy(dialog = null) }
}
private fun handleConfirmLogoutClick() {
authRepository.logout()
}
private fun handlePasswordInputChanged(action: VaultUnlockAction.PasswordInputChanged) {
mutableStateFlow.update {
it.copy(passwordInput = action.passwordInput)
@@ -213,6 +218,11 @@ sealed class VaultUnlockAction {
*/
data object DismissDialog : VaultUnlockAction()
/**
* The user has clicked on the logout confirmation button.
*/
data object ConfirmLogoutClick : VaultUnlockAction()
/**
* The user has modified the password input.
*/
@@ -0,0 +1,27 @@
package com.x8bit.bitwarden.ui.platform.components
import androidx.compose.runtime.Composable
import androidx.compose.ui.res.stringResource
import com.x8bit.bitwarden.R
/**
* A reusable dialog for confirming whether or not the user wants to log out.
*
* @param onDismissRequest A callback for when the dialog is requesting dismissal.
* @param onConfirmClick A callback for when the log out confirmation button is clicked.
*/
@Composable
fun BitwardenLogoutConfirmationDialog(
onDismissRequest: () -> Unit,
onConfirmClick: () -> Unit,
) {
BitwardenTwoButtonDialog(
title = stringResource(id = R.string.log_out),
message = stringResource(id = R.string.logout_confirmation),
confirmButtonText = stringResource(id = R.string.yes),
onConfirmClick = onConfirmClick,
dismissButtonText = stringResource(id = R.string.cancel),
onDismissClick = onDismissRequest,
onDismissRequest = onDismissRequest,
)
}
@@ -31,6 +31,7 @@ import com.x8bit.bitwarden.R
import com.x8bit.bitwarden.ui.platform.base.util.EventsEffect
import com.x8bit.bitwarden.ui.platform.base.util.IntentHandler
import com.x8bit.bitwarden.ui.platform.base.util.Text
import com.x8bit.bitwarden.ui.platform.components.BitwardenLogoutConfirmationDialog
import com.x8bit.bitwarden.ui.platform.components.BitwardenExternalLinkRow
import com.x8bit.bitwarden.ui.platform.components.BitwardenListHeaderText
import com.x8bit.bitwarden.ui.platform.components.BitwardenScaffold
@@ -39,7 +40,6 @@ import com.x8bit.bitwarden.ui.platform.components.BitwardenSelectionRow
import com.x8bit.bitwarden.ui.platform.components.BitwardenTextButton
import com.x8bit.bitwarden.ui.platform.components.BitwardenTextRow
import com.x8bit.bitwarden.ui.platform.components.BitwardenTopAppBar
import com.x8bit.bitwarden.ui.platform.components.BitwardenTwoButtonDialog
import com.x8bit.bitwarden.ui.platform.components.BitwardenWideSwitch
import com.x8bit.bitwarden.ui.platform.theme.LocalNonMaterialColors
import com.x8bit.bitwarden.ui.platform.theme.LocalNonMaterialTypography
@@ -76,8 +76,8 @@ fun AccountSecurityScreen(
}
when (state.dialog) {
AccountSecurityDialog.ConfirmLogout -> ConfirmLogoutDialog(
onDismiss = remember(viewModel) {
AccountSecurityDialog.ConfirmLogout -> BitwardenLogoutConfirmationDialog(
onDismissRequest = remember(viewModel) {
{ viewModel.trySendAction(AccountSecurityAction.DismissDialog) }
},
onConfirmClick = remember(viewModel) {
@@ -286,22 +286,6 @@ fun AccountSecurityScreen(
}
}
@Composable
private fun ConfirmLogoutDialog(
onDismiss: () -> Unit,
onConfirmClick: () -> Unit,
) {
BitwardenTwoButtonDialog(
title = stringResource(id = R.string.log_out),
message = stringResource(id = R.string.logout_confirmation),
confirmButtonText = stringResource(id = R.string.yes),
onConfirmClick = onConfirmClick,
dismissButtonText = stringResource(id = R.string.cancel),
onDismissClick = onDismiss,
onDismissRequest = onDismiss,
)
}
@Composable
private fun FingerPrintPhraseDialog(
fingerprintPhrase: Text,