BIT-482: Display share sheet after saving a new send (#532)

This commit is contained in:
David Perez
2024-06-20 17:08:07 +01:00
committed by Álison Fernandes
parent 185849951f
commit 70a425dfd8
7 changed files with 104 additions and 29 deletions
@@ -43,6 +43,7 @@ import com.x8bit.bitwarden.data.vault.repository.util.toEncryptedNetworkSend
import com.x8bit.bitwarden.data.vault.repository.util.toEncryptedSdkCipherList
import com.x8bit.bitwarden.data.vault.repository.util.toEncryptedSdkCollectionList
import com.x8bit.bitwarden.data.vault.repository.util.toEncryptedSdkFolderList
import com.x8bit.bitwarden.data.vault.repository.util.toEncryptedSdkSend
import com.x8bit.bitwarden.data.vault.repository.util.toEncryptedSdkSendList
import com.x8bit.bitwarden.data.vault.repository.util.toVaultUnlockResult
import kotlinx.coroutines.CoroutineScope
@@ -435,12 +436,19 @@ class VaultRepositoryImpl(
sendView = sendView,
)
.flatMap { send -> sendsService.createSend(body = send.toEncryptedNetworkSend()) }
.onSuccess {
// Save the send immediately, regardless of whether the decrypt succeeds
vaultDiskSource.saveSend(userId = userId, send = it)
}
.flatMap {
vaultSdkSource.decryptSend(
userId = userId,
send = it.toEncryptedSdkSend(),
)
}
.fold(
onFailure = { CreateSendResult.Error },
onSuccess = {
vaultDiskSource.saveSend(userId = userId, send = it)
CreateSendResult.Success
},
onSuccess = { CreateSendResult.Success(it) },
)
}
@@ -1,14 +1,16 @@
package com.x8bit.bitwarden.data.vault.repository.model
import com.bitwarden.core.SendView
/**
* Models result of creating a send.
*/
sealed class CreateSendResult {
/**
* send created successfully.
* Send created successfully and contains the decrypted [SendView].
*/
data object Success : CreateSendResult()
data class Success(val sendView: SendView) : CreateSendResult()
/**
* Generic error while creating a send.
@@ -19,6 +19,7 @@ import androidx.hilt.navigation.compose.hiltViewModel
import androidx.lifecycle.compose.collectAsStateWithLifecycle
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.components.BasicDialogState
import com.x8bit.bitwarden.ui.platform.components.BitwardenBasicDialog
import com.x8bit.bitwarden.ui.platform.components.BitwardenErrorContent
@@ -38,6 +39,7 @@ import com.x8bit.bitwarden.ui.tools.feature.send.addsend.handlers.AddSendHandler
@Composable
fun AddSendScreen(
viewModel: AddSendViewModel = hiltViewModel(),
intentHandler: IntentHandler = IntentHandler(LocalContext.current),
onNavigateBack: () -> Unit,
) {
val state by viewModel.stateFlow.collectAsStateWithLifecycle()
@@ -47,6 +49,10 @@ fun AddSendScreen(
EventsEffect(viewModel = viewModel) { event ->
when (event) {
is AddSendEvent.NavigateBack -> onNavigateBack()
is AddSendEvent.ShowShareSheet -> {
intentHandler.shareText(event.message)
}
is AddSendEvent.ShowToast -> {
Toast.makeText(context, event.message, Toast.LENGTH_SHORT).show()
}
@@ -6,12 +6,15 @@ import androidx.lifecycle.viewModelScope
import com.x8bit.bitwarden.R
import com.x8bit.bitwarden.data.auth.repository.AuthRepository
import com.x8bit.bitwarden.data.auth.repository.model.UserState
import com.x8bit.bitwarden.data.platform.repository.EnvironmentRepository
import com.x8bit.bitwarden.data.platform.repository.util.baseWebSendUrl
import com.x8bit.bitwarden.data.vault.repository.VaultRepository
import com.x8bit.bitwarden.data.vault.repository.model.CreateSendResult
import com.x8bit.bitwarden.ui.platform.base.BaseViewModel
import com.x8bit.bitwarden.ui.platform.base.util.Text
import com.x8bit.bitwarden.ui.platform.base.util.asText
import com.x8bit.bitwarden.ui.tools.feature.send.addsend.util.toSendView
import com.x8bit.bitwarden.ui.tools.feature.send.util.toSendUrl
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.map
@@ -31,6 +34,7 @@ private const val KEY_STATE = "state"
class AddSendViewModel @Inject constructor(
savedStateHandle: SavedStateHandle,
authRepo: AuthRepository,
private val environmentRepo: EnvironmentRepository,
private val vaultRepo: VaultRepository,
) : BaseViewModel<AddSendState, AddSendEvent, AddSendAction>(
initialState = savedStateHandle[KEY_STATE] ?: AddSendState(
@@ -50,6 +54,7 @@ class AddSendViewModel @Inject constructor(
),
dialogState = null,
isPremiumUser = authRepo.userStateFlow.value?.activeAccount?.isPremium == true,
baseWebSendUrl = environmentRepo.environment.environmentUrlData.baseWebSendUrl,
),
) {
@@ -91,7 +96,7 @@ class AddSendViewModel @Inject constructor(
private fun handleCreateSendResultReceive(
action: AddSendAction.Internal.CreateSendResultReceive,
) {
when (action.result) {
when (val result = action.result) {
CreateSendResult.Error -> {
mutableStateFlow.update {
it.copy(
@@ -103,9 +108,14 @@ class AddSendViewModel @Inject constructor(
}
}
CreateSendResult.Success -> {
is CreateSendResult.Success -> {
mutableStateFlow.update { it.copy(dialogState = null) }
sendEvent(AddSendEvent.NavigateBack)
sendEvent(
AddSendEvent.ShowShareSheet(
message = result.sendView.toSendUrl(state.baseWebSendUrl),
),
)
}
}
}
@@ -287,6 +297,7 @@ data class AddSendState(
val dialogState: DialogState?,
val viewState: ViewState,
val isPremiumUser: Boolean,
val baseWebSendUrl: String,
) : Parcelable {
/**
@@ -383,6 +394,11 @@ sealed class AddSendEvent {
*/
data object NavigateBack : AddSendEvent()
/**
* Show share sheet.
*/
data class ShowShareSheet(val message: String) : AddSendEvent()
/**
* Show Toast.
*/