Remove confirmation dialog
This commit is contained in:
parent
4bee8f19cd
commit
6124f669e7
8 changed files with 7 additions and 52 deletions
|
|
@ -20,7 +20,5 @@ import io.element.android.libraries.matrix.ui.model.MatrixUser
|
||||||
|
|
||||||
sealed interface CreateRoomRootEvents {
|
sealed interface CreateRoomRootEvents {
|
||||||
object InvitePeople : CreateRoomRootEvents
|
object InvitePeople : CreateRoomRootEvents
|
||||||
data class SelectUser(val matrixUser: MatrixUser) : CreateRoomRootEvents
|
data class StartDM(val matrixUser: MatrixUser) : CreateRoomRootEvents
|
||||||
data class CreateDM(val matrixUser: MatrixUser) : CreateRoomRootEvents
|
|
||||||
object CancelCreateDM : CreateRoomRootEvents
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -18,13 +18,9 @@ package io.element.android.features.createroom.impl.root
|
||||||
|
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
import androidx.compose.runtime.MutableState
|
import androidx.compose.runtime.MutableState
|
||||||
import androidx.compose.runtime.getValue
|
|
||||||
import androidx.compose.runtime.mutableStateOf
|
import androidx.compose.runtime.mutableStateOf
|
||||||
import androidx.compose.runtime.remember
|
import androidx.compose.runtime.remember
|
||||||
import androidx.compose.runtime.rememberCoroutineScope
|
import androidx.compose.runtime.rememberCoroutineScope
|
||||||
import androidx.compose.runtime.saveable.rememberSaveable
|
|
||||||
import androidx.compose.runtime.setValue
|
|
||||||
import io.element.android.features.selectusers.api.SelectUsersEvents
|
|
||||||
import io.element.android.features.selectusers.api.SelectUsersPresenter
|
import io.element.android.features.selectusers.api.SelectUsersPresenter
|
||||||
import io.element.android.features.selectusers.api.SelectUsersPresenterArgs
|
import io.element.android.features.selectusers.api.SelectUsersPresenterArgs
|
||||||
import io.element.android.features.selectusers.api.SelectionMode
|
import io.element.android.features.selectusers.api.SelectionMode
|
||||||
|
|
@ -52,35 +48,24 @@ class CreateRoomRootPresenter @Inject constructor(
|
||||||
val selectUsersState = presenter.present()
|
val selectUsersState = presenter.present()
|
||||||
|
|
||||||
val localCoroutineScope = rememberCoroutineScope()
|
val localCoroutineScope = rememberCoroutineScope()
|
||||||
|
|
||||||
var showCreateDmConfirmationDialog by rememberSaveable { mutableStateOf(false) }
|
|
||||||
val startDmAction: MutableState<Async<RoomId>> = remember { mutableStateOf(Async.Uninitialized) }
|
val startDmAction: MutableState<Async<RoomId>> = remember { mutableStateOf(Async.Uninitialized) }
|
||||||
|
|
||||||
fun handleEvents(event: CreateRoomRootEvents) {
|
fun handleEvents(event: CreateRoomRootEvents) {
|
||||||
when (event) {
|
when (event) {
|
||||||
is CreateRoomRootEvents.SelectUser -> {
|
is CreateRoomRootEvents.StartDM -> {
|
||||||
val existingDM = matrixClient.findDM(event.matrixUser.id)
|
val existingDM = matrixClient.findDM(event.matrixUser.id)
|
||||||
if (existingDM == null) {
|
if (existingDM == null) {
|
||||||
showCreateDmConfirmationDialog = true
|
localCoroutineScope.createDM(event.matrixUser, startDmAction)
|
||||||
} else {
|
} else {
|
||||||
startDmAction.value = Async.Success(existingDM.roomId)
|
startDmAction.value = Async.Success(existingDM.roomId)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
is CreateRoomRootEvents.CreateDM -> {
|
|
||||||
showCreateDmConfirmationDialog = false
|
|
||||||
localCoroutineScope.createDM(event.matrixUser, startDmAction)
|
|
||||||
}
|
|
||||||
CreateRoomRootEvents.CancelCreateDM -> {
|
|
||||||
showCreateDmConfirmationDialog = false
|
|
||||||
selectUsersState.eventSink(SelectUsersEvents.ClearSelection)
|
|
||||||
}
|
|
||||||
CreateRoomRootEvents.InvitePeople -> Unit // Todo Handle invite people action
|
CreateRoomRootEvents.InvitePeople -> Unit // Todo Handle invite people action
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return CreateRoomRootState(
|
return CreateRoomRootState(
|
||||||
selectUsersState = selectUsersState,
|
selectUsersState = selectUsersState,
|
||||||
showCreateDmConfirmationDialog = showCreateDmConfirmationDialog,
|
|
||||||
startDmAction = startDmAction.value,
|
startDmAction = startDmAction.value,
|
||||||
eventSink = ::handleEvents,
|
eventSink = ::handleEvents,
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -22,7 +22,6 @@ import io.element.android.libraries.matrix.api.core.RoomId
|
||||||
|
|
||||||
data class CreateRoomRootState(
|
data class CreateRoomRootState(
|
||||||
val selectUsersState: SelectUsersState,
|
val selectUsersState: SelectUsersState,
|
||||||
val showCreateDmConfirmationDialog: Boolean,
|
|
||||||
val startDmAction: Async<RoomId>,
|
val startDmAction: Async<RoomId>,
|
||||||
val eventSink: (CreateRoomRootEvents) -> Unit,
|
val eventSink: (CreateRoomRootEvents) -> Unit,
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -27,7 +27,7 @@ open class CreateRoomRootStateProvider : PreviewParameterProvider<CreateRoomRoot
|
||||||
get() = sequenceOf(
|
get() = sequenceOf(
|
||||||
aCreateRoomRootState(),
|
aCreateRoomRootState(),
|
||||||
aCreateRoomRootState().copy(
|
aCreateRoomRootState().copy(
|
||||||
showCreateDmConfirmationDialog = true,
|
startDmAction = Async.Loading(),
|
||||||
selectUsersState = aMatrixUser().let {
|
selectUsersState = aMatrixUser().let {
|
||||||
aSelectUsersState().copy(
|
aSelectUsersState().copy(
|
||||||
searchQuery = it.id.value,
|
searchQuery = it.id.value,
|
||||||
|
|
@ -36,13 +36,12 @@ open class CreateRoomRootStateProvider : PreviewParameterProvider<CreateRoomRoot
|
||||||
isSearchActive = true,
|
isSearchActive = true,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
),
|
)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun aCreateRoomRootState() = CreateRoomRootState(
|
fun aCreateRoomRootState() = CreateRoomRootState(
|
||||||
eventSink = {},
|
eventSink = {},
|
||||||
startDmAction = Async.Uninitialized,
|
startDmAction = Async.Uninitialized,
|
||||||
showCreateDmConfirmationDialog = false,
|
|
||||||
selectUsersState = aSelectUsersState(),
|
selectUsersState = aSelectUsersState(),
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -42,7 +42,6 @@ import io.element.android.features.createroom.impl.R
|
||||||
import io.element.android.features.selectusers.api.SelectUsersView
|
import io.element.android.features.selectusers.api.SelectUsersView
|
||||||
import io.element.android.libraries.architecture.Async
|
import io.element.android.libraries.architecture.Async
|
||||||
import io.element.android.libraries.designsystem.components.ProgressDialog
|
import io.element.android.libraries.designsystem.components.ProgressDialog
|
||||||
import io.element.android.libraries.designsystem.components.dialogs.ConfirmationDialog
|
|
||||||
import io.element.android.libraries.designsystem.preview.ElementPreviewDark
|
import io.element.android.libraries.designsystem.preview.ElementPreviewDark
|
||||||
import io.element.android.libraries.designsystem.preview.ElementPreviewLight
|
import io.element.android.libraries.designsystem.preview.ElementPreviewLight
|
||||||
import io.element.android.libraries.designsystem.theme.components.CenterAlignedTopAppBar
|
import io.element.android.libraries.designsystem.theme.components.CenterAlignedTopAppBar
|
||||||
|
|
@ -51,7 +50,6 @@ import io.element.android.libraries.designsystem.theme.components.IconButton
|
||||||
import io.element.android.libraries.designsystem.theme.components.Scaffold
|
import io.element.android.libraries.designsystem.theme.components.Scaffold
|
||||||
import io.element.android.libraries.designsystem.theme.components.Text
|
import io.element.android.libraries.designsystem.theme.components.Text
|
||||||
import io.element.android.libraries.matrix.api.core.RoomId
|
import io.element.android.libraries.matrix.api.core.RoomId
|
||||||
import io.element.android.libraries.matrix.ui.model.getBestName
|
|
||||||
import io.element.android.libraries.designsystem.R as DrawableR
|
import io.element.android.libraries.designsystem.R as DrawableR
|
||||||
import io.element.android.libraries.ui.strings.R as StringR
|
import io.element.android.libraries.ui.strings.R as StringR
|
||||||
|
|
||||||
|
|
@ -85,7 +83,7 @@ fun CreateRoomRootView(
|
||||||
SelectUsersView(
|
SelectUsersView(
|
||||||
modifier = Modifier.fillMaxWidth(),
|
modifier = Modifier.fillMaxWidth(),
|
||||||
state = state.selectUsersState,
|
state = state.selectUsersState,
|
||||||
onUserSelected = { state.eventSink(CreateRoomRootEvents.SelectUser(it)) },
|
onUserSelected = { state.eventSink(CreateRoomRootEvents.StartDM(it)) },
|
||||||
)
|
)
|
||||||
|
|
||||||
if (!state.selectUsersState.isSearchActive) {
|
if (!state.selectUsersState.isSearchActive) {
|
||||||
|
|
@ -97,8 +95,6 @@ fun CreateRoomRootView(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
CreateDmConfirmationDialog(state)
|
|
||||||
|
|
||||||
if (state.startDmAction is Async.Loading) {
|
if (state.startDmAction is Async.Loading) {
|
||||||
ProgressDialog(text = "Creating room...")
|
ProgressDialog(text = "Creating room...")
|
||||||
}
|
}
|
||||||
|
|
@ -172,26 +168,6 @@ fun CreateRoomActionButton(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Composable
|
|
||||||
fun CreateDmConfirmationDialog(
|
|
||||||
state: CreateRoomRootState,
|
|
||||||
modifier: Modifier = Modifier,
|
|
||||||
) {
|
|
||||||
if (state.showCreateDmConfirmationDialog) {
|
|
||||||
val selectedUser = state.selectUsersState.selectedUsers.firstOrNull()
|
|
||||||
if (selectedUser != null) {
|
|
||||||
ConfirmationDialog(
|
|
||||||
modifier = modifier,
|
|
||||||
title = "Start chat",
|
|
||||||
content = "You're about starting a chat with ${selectedUser.getBestName()}, do you want to continue?",
|
|
||||||
submitText = stringResource(io.element.android.libraries.ui.strings.R.string.action_continue),
|
|
||||||
onSubmitClicked = { state.eventSink(CreateRoomRootEvents.CreateDM(selectedUser)) },
|
|
||||||
onDismiss = { state.eventSink(CreateRoomRootEvents.CancelCreateDM) },
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Preview
|
@Preview
|
||||||
@Composable
|
@Composable
|
||||||
fun CreateRoomRootViewLightPreview(@PreviewParameter(CreateRoomRootStateProvider::class) state: CreateRoomRootState) =
|
fun CreateRoomRootViewLightPreview(@PreviewParameter(CreateRoomRootStateProvider::class) state: CreateRoomRootState) =
|
||||||
|
|
|
||||||
|
|
@ -73,7 +73,7 @@ class CreateRoomRootPresenterTests {
|
||||||
}.test {
|
}.test {
|
||||||
val initialState = awaitItem()
|
val initialState = awaitItem()
|
||||||
val matrixUser = MatrixUser(UserId("@name:matrix.org"))
|
val matrixUser = MatrixUser(UserId("@name:matrix.org"))
|
||||||
initialState.eventSink(CreateRoomRootEvents.SelectUser(matrixUser))
|
initialState.eventSink(CreateRoomRootEvents.StartDM(matrixUser))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -22,6 +22,5 @@ sealed interface SelectUsersEvents {
|
||||||
data class UpdateSearchQuery(val query: String) : SelectUsersEvents
|
data class UpdateSearchQuery(val query: String) : SelectUsersEvents
|
||||||
data class AddToSelection(val matrixUser: MatrixUser) : SelectUsersEvents
|
data class AddToSelection(val matrixUser: MatrixUser) : SelectUsersEvents
|
||||||
data class RemoveFromSelection(val matrixUser: MatrixUser) : SelectUsersEvents
|
data class RemoveFromSelection(val matrixUser: MatrixUser) : SelectUsersEvents
|
||||||
object ClearSelection : SelectUsersEvents
|
|
||||||
data class OnSearchActiveChanged(val active: Boolean) : SelectUsersEvents
|
data class OnSearchActiveChanged(val active: Boolean) : SelectUsersEvents
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -79,7 +79,6 @@ class DefaultSelectUsersPresenter @AssistedInject constructor(
|
||||||
localCoroutineScope.scrollToFirstSelectedUser(selectedUsersListState)
|
localCoroutineScope.scrollToFirstSelectedUser(selectedUsersListState)
|
||||||
}
|
}
|
||||||
is SelectUsersEvents.RemoveFromSelection -> selectedUsers.value = selectedUsers.value.minus(event.matrixUser).toImmutableList()
|
is SelectUsersEvents.RemoveFromSelection -> selectedUsers.value = selectedUsers.value.minus(event.matrixUser).toImmutableList()
|
||||||
SelectUsersEvents.ClearSelection -> selectedUsers.value = persistentListOf()
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue