Skip to content
Merged
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 @@ -49,6 +49,7 @@ fun NavGraphBuilder.itemListingGraph(
)
itemSearchDestination(
onNavigateBack = { navController.popBackStack() },
onNavigateToEdit = navigateToEditItem,
)
qrCodeScanDestination(
onNavigateBack = { navController.popBackStack() },
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@ import androidx.compose.ui.unit.dp
import com.bitwarden.authenticator.ui.authenticator.feature.search.handlers.SearchHandlers
import com.bitwarden.authenticator.ui.platform.components.listitem.VaultVerificationCodeItem
import com.bitwarden.authenticator.ui.platform.components.listitem.model.SharedCodesDisplayState
import com.bitwarden.authenticator.ui.platform.components.listitem.model.VaultDropdownMenuAction
import com.bitwarden.authenticator.ui.platform.components.listitem.model.VerificationCodeDisplayItem
import com.bitwarden.ui.platform.base.util.standardHorizontalMargin
import com.bitwarden.ui.platform.base.util.toListItemCardStyle
import com.bitwarden.ui.platform.components.header.BitwardenListHeaderText
Expand Down Expand Up @@ -53,7 +55,7 @@ fun ItemSearchContent(
VaultVerificationCodeItem(
displayItem = item,
onItemClick = { searchHandlers.onItemClick(item.authCode) },
onDropdownMenuClick = { },
onDropdownMenuClick = { searchHandlers.onDropdownMenuClick(it, item) },
cardStyle = viewState.itemList.toListItemCardStyle(index = index),
modifier = Modifier
.fillMaxWidth()
Expand All @@ -70,6 +72,7 @@ fun ItemSearchContent(
sharedCodes(
sharedItems = viewState.sharedItems,
onCopyClick = searchHandlers.onItemClick,
onDropdownMenuClick = searchHandlers.onDropdownMenuClick,
)

item {
Expand All @@ -82,6 +85,7 @@ fun ItemSearchContent(
private fun LazyListScope.sharedCodes(
sharedItems: SharedCodesDisplayState,
onCopyClick: (authCode: String) -> Unit,
onDropdownMenuClick: (VaultDropdownMenuAction, VerificationCodeDisplayItem) -> Unit,
) {
when (sharedItems) {
is SharedCodesDisplayState.Codes -> {
Expand All @@ -101,7 +105,7 @@ private fun LazyListScope.sharedCodes(
VaultVerificationCodeItem(
displayItem = item,
onItemClick = { onCopyClick(item.authCode) },
onDropdownMenuClick = { },
onDropdownMenuClick = { onDropdownMenuClick(it, item) },
cardStyle = section.codes.toListItemCardStyle(index = index),
modifier = Modifier
.fillMaxWidth()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,12 @@ data object ItemSearchRoute
*/
fun NavGraphBuilder.itemSearchDestination(
onNavigateBack: () -> Unit,
onNavigateToEdit: (String) -> Unit,
) {
composableWithSlideTransitions<ItemSearchRoute> {
ItemSearchScreen(
onNavigateBack = onNavigateBack,
onNavigateToEdit = onNavigateToEdit,
)
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package com.bitwarden.authenticator.ui.authenticator.feature.search

import android.widget.Toast
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.TopAppBarDefaults
Expand All @@ -10,8 +9,6 @@ import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier
import androidx.compose.ui.input.nestedscroll.nestedScroll
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalResources
import androidx.compose.ui.platform.testTag
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
Expand All @@ -22,36 +19,41 @@ import com.bitwarden.ui.platform.base.util.EventsEffect
import com.bitwarden.ui.platform.base.util.bottomDivider
import com.bitwarden.ui.platform.components.appbar.BitwardenSearchTopAppBar
import com.bitwarden.ui.platform.components.appbar.NavigationIcon
import com.bitwarden.ui.platform.components.dialog.BitwardenBasicDialog
import com.bitwarden.ui.platform.components.dialog.BitwardenLoadingDialog
import com.bitwarden.ui.platform.components.dialog.BitwardenTwoButtonDialog
import com.bitwarden.ui.platform.components.scaffold.BitwardenScaffold
import com.bitwarden.ui.platform.components.snackbar.BitwardenSnackbarHost
import com.bitwarden.ui.platform.components.snackbar.model.rememberBitwardenSnackbarHostState
import com.bitwarden.ui.platform.resource.BitwardenDrawable
import com.bitwarden.ui.platform.resource.BitwardenString

/**
* The search screen for authenticator items.
*/
@Suppress("LongMethod")
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun ItemSearchScreen(
viewModel: ItemSearchViewModel = hiltViewModel(),
onNavigateBack: () -> Unit,
onNavigateToEdit: (String) -> Unit,
) {
val state by viewModel.stateFlow.collectAsStateWithLifecycle()
val searchHandlers = remember(viewModel) { SearchHandlers.create(viewModel) }
val context = LocalContext.current
val resources = LocalResources.current

val snackbarHostState = rememberBitwardenSnackbarHostState()
EventsEffect(viewModel = viewModel) { event ->
when (event) {
is ItemSearchEvent.NavigateBack -> onNavigateBack()
is ItemSearchEvent.ShowToast -> {
Toast
.makeText(context, event.message(resources), Toast.LENGTH_SHORT)
.show()
}
is ItemSearchEvent.ShowSnackbar -> snackbarHostState.showSnackbar(event.data)
is ItemSearchEvent.NavigateToEditItem -> onNavigateToEdit(event.itemId)
}
}

ItemSearchDialogs(
dialogState = state.dialog,
searchHandlers = searchHandlers,
)

val scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior(rememberTopAppBarState())
BitwardenScaffold(
modifier = Modifier
Expand All @@ -73,6 +75,7 @@ fun ItemSearchScreen(
),
)
},
snackbarHost = { BitwardenSnackbarHost(bitwardenHostState = snackbarHostState) },
) {
when (val viewState = state.viewState) {
is ItemSearchState.ViewState.Content -> {
Expand All @@ -92,3 +95,38 @@ fun ItemSearchScreen(
}
}
}

@Composable
private fun ItemSearchDialogs(
dialogState: ItemSearchState.DialogState?,
searchHandlers: SearchHandlers,
) {
when (dialogState) {
is ItemSearchState.DialogState.Error -> {
BitwardenBasicDialog(
title = dialogState.title(),
message = dialogState.message(),
throwable = dialogState.throwable,
onDismissRequest = searchHandlers.onDismissDialog,
)
}

is ItemSearchState.DialogState.DeleteConfirmationPrompt -> {
BitwardenTwoButtonDialog(
title = stringResource(id = BitwardenString.delete),
message = dialogState.message(),
confirmButtonText = stringResource(id = BitwardenString.okay),
dismissButtonText = stringResource(id = BitwardenString.cancel),
onConfirmClick = { searchHandlers.onConfirmDeleteClick(dialogState.itemId) },
onDismissClick = searchHandlers.onDismissDialog,
onDismissRequest = searchHandlers.onDismissDialog,
)
}

ItemSearchState.DialogState.Loading -> {
BitwardenLoadingDialog(text = stringResource(id = BitwardenString.loading))
}

null -> Unit
}
}
Loading
Loading