Handle errors on create DM

This commit is contained in:
Florian Renaud 2023-03-29 13:48:54 +02:00
parent e325c58cb0
commit f65375b5c4
7 changed files with 130 additions and 16 deletions

View file

@ -21,4 +21,6 @@ import io.element.android.libraries.matrix.ui.model.MatrixUser
sealed interface CreateRoomRootEvents {
object InvitePeople : CreateRoomRootEvents
data class StartDM(val matrixUser: MatrixUser) : CreateRoomRootEvents
object RetryStartDM : CreateRoomRootEvents
object CancelStartDM : CreateRoomRootEvents
}

View file

@ -50,16 +50,24 @@ class CreateRoomRootPresenter @Inject constructor(
val localCoroutineScope = rememberCoroutineScope()
val startDmAction: MutableState<Async<RoomId>> = remember { mutableStateOf(Async.Uninitialized) }
fun startDm(matrixUser: MatrixUser) {
startDmAction.value = Async.Uninitialized
val existingDM = matrixClient.findDM(matrixUser.id)
if (existingDM == null) {
localCoroutineScope.createDM(matrixUser, startDmAction)
} else {
startDmAction.value = Async.Success(existingDM.roomId)
}
}
fun handleEvents(event: CreateRoomRootEvents) {
when (event) {
is CreateRoomRootEvents.StartDM -> {
val existingDM = matrixClient.findDM(event.matrixUser.id)
if (existingDM == null) {
localCoroutineScope.createDM(event.matrixUser, startDmAction)
} else {
startDmAction.value = Async.Success(existingDM.roomId)
}
is CreateRoomRootEvents.StartDM -> startDm(event.matrixUser)
CreateRoomRootEvents.RetryStartDM -> {
startDmAction.value = Async.Uninitialized
selectUsersState.selectedUsers.firstOrNull()?.let { startDm(it) }
}
CreateRoomRootEvents.CancelStartDM -> startDmAction.value = Async.Uninitialized
CreateRoomRootEvents.InvitePeople -> Unit // Todo Handle invite people action
}
}

View file

@ -36,7 +36,18 @@ open class CreateRoomRootStateProvider : PreviewParameterProvider<CreateRoomRoot
isSearchActive = true,
)
}
)
),
aCreateRoomRootState().copy(
startDmAction = Async.Failure(Throwable("An error occurred when trying to start a chat")),
selectUsersState = aMatrixUser().let {
aSelectUsersState().copy(
searchQuery = it.id.value,
searchResults = persistentListOf(it),
selectedUsers = persistentListOf(it),
isSearchActive = true,
)
}
),
)
}

View file

@ -42,6 +42,7 @@ import io.element.android.features.createroom.impl.R
import io.element.android.features.selectusers.api.SelectUsersView
import io.element.android.libraries.architecture.Async
import io.element.android.libraries.designsystem.components.ProgressDialog
import io.element.android.libraries.designsystem.components.dialogs.ErrorDialog
import io.element.android.libraries.designsystem.preview.ElementPreviewDark
import io.element.android.libraries.designsystem.preview.ElementPreviewLight
import io.element.android.libraries.designsystem.theme.components.CenterAlignedTopAppBar
@ -95,8 +96,20 @@ fun CreateRoomRootView(
}
}
if (state.startDmAction is Async.Loading) {
ProgressDialog(text = stringResource(id = StringR.string.common_creating_room))
when (state.startDmAction) {
is Async.Loading -> {
ProgressDialog(text = stringResource(id = StringR.string.common_creating_room))
}
is Async.Failure -> {
ErrorDialog(
content = stringResource(id = StringR.string.screen_start_chat_error_starting_chat),
dismissText = stringResource(id = StringR.string.action_cancel),
submitText = stringResource(id = StringR.string.action_retry),
onDismiss = { state.eventSink(CreateRoomRootEvents.CancelStartDM) },
onSubmit = { state.eventSink(CreateRoomRootEvents.RetryStartDM) },
)
}
else -> Unit
}
}