mirror of
https://github.com/bitwarden/android.git
synced 2026-07-31 10:09:53 -05:00
BIT-482: Display share sheet after saving a new send (#532)
This commit is contained in:
committed by
Álison Fernandes
parent
185849951f
commit
70a425dfd8
@@ -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) },
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
+4
-2
@@ -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()
|
||||
}
|
||||
|
||||
+18
-2
@@ -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.
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user