Self verification : makes sure cancellation works properly

This commit is contained in:
ganfra
2024-09-09 10:30:35 +02:00
parent 2be46edc17
commit 82a31d3ede
2 changed files with 25 additions and 21 deletions

View File

@@ -70,8 +70,17 @@ fun VerifySelfSessionView(
onSuccessLogout: (String?) -> Unit,
modifier: Modifier = Modifier,
) {
fun resetFlow() {
state.eventSink(VerifySelfSessionViewEvents.Reset)
fun cancelOrResetFlow() {
when (state.verificationFlowStep) {
is FlowStep.Canceled -> state.eventSink(VerifySelfSessionViewEvents.Reset)
is FlowStep.AwaitingOtherDeviceResponse, FlowStep.Ready -> state.eventSink(VerifySelfSessionViewEvents.Cancel)
is FlowStep.Verifying -> {
if (!state.verificationFlowStep.state.isLoading()) {
state.eventSink(VerifySelfSessionViewEvents.DeclineVerification)
}
}
else -> Unit
}
}
val latestOnFinish by rememberUpdatedState(newValue = onFinish)
@@ -81,16 +90,7 @@ fun VerifySelfSessionView(
}
}
BackHandler {
when (state.verificationFlowStep) {
is FlowStep.Canceled -> resetFlow()
is FlowStep.AwaitingOtherDeviceResponse, FlowStep.Ready -> state.eventSink(VerifySelfSessionViewEvents.Cancel)
is FlowStep.Verifying -> {
if (!state.verificationFlowStep.state.isLoading()) {
state.eventSink(VerifySelfSessionViewEvents.DeclineVerification)
}
}
else -> Unit
}
cancelOrResetFlow()
}
val verificationFlowStep = state.verificationFlowStep
@@ -133,9 +133,9 @@ fun VerifySelfSessionView(
footer = {
BottomMenu(
screenState = state,
goBack = ::resetFlow,
onCancelClick = ::cancelOrResetFlow,
onEnterRecoveryKey = onEnterRecoveryKey,
onFinish = onFinish,
onContinueClick = onFinish,
onResetKey = onResetKey,
)
}
@@ -268,8 +268,8 @@ private fun BottomMenu(
screenState: VerifySelfSessionState,
onEnterRecoveryKey: () -> Unit,
onResetKey: () -> Unit,
goBack: () -> Unit,
onFinish: () -> Unit,
onCancelClick: () -> Unit,
onContinueClick: () -> Unit,
) {
val verificationViewState = screenState.verificationFlowStep
val eventSink = screenState.eventSink
@@ -316,7 +316,7 @@ private fun BottomMenu(
TextButton(
modifier = Modifier.fillMaxWidth(),
text = stringResource(CommonStrings.action_cancel),
onClick = goBack,
onClick = onCancelClick,
)
}
}
@@ -330,7 +330,7 @@ private fun BottomMenu(
TextButton(
modifier = Modifier.fillMaxWidth(),
text = stringResource(CommonStrings.action_cancel),
onClick = goBack,
onClick = onCancelClick,
)
}
}
@@ -375,7 +375,7 @@ private fun BottomMenu(
Button(
modifier = Modifier.fillMaxWidth(),
text = stringResource(CommonStrings.action_continue),
onClick = onFinish,
onClick = onContinueClick,
)
// Placeholder so the 1st button keeps its vertical position
Spacer(modifier = Modifier.height(48.dp))

View File

@@ -97,7 +97,7 @@ class RustSessionVerificationService(
updateVerificationStatus()
}
}
.launchIn(sessionCoroutineScope)
.launchIn(sessionCoroutineScope)
}
override suspend fun requestVerification() = tryOrFail {
@@ -105,7 +105,11 @@ class RustSessionVerificationService(
verificationController.requestVerification()
}
override suspend fun cancelVerification() = tryOrFail { verificationController.cancelVerification() }
override suspend fun cancelVerification() = tryOrFail {
verificationController.cancelVerification()
// We need to manually set the state to canceled, as the Rust SDK doesn't always call `didCancel` when it should
didCancel()
}
override suspend fun approveVerification() = tryOrFail { verificationController.approveVerification() }