Slash commands: popDraft() only in case of success, and display a loading dialog during processing
This commit is contained in:
parent
364654b685
commit
4626199761
|
@ -1451,8 +1451,8 @@ class RoomDetailFragment @Inject constructor(
|
|||
|
||||
private fun renderSendMessageResult(sendMessageResult: TextComposerViewEvents.SendMessageResult) {
|
||||
when (sendMessageResult) {
|
||||
is TextComposerViewEvents.SlashCommandHandled -> {
|
||||
sendMessageResult.messageRes?.let { showSnackWithMessage(getString(it)) }
|
||||
is TextComposerViewEvents.SlashCommandLoading -> {
|
||||
showLoading(null)
|
||||
}
|
||||
is TextComposerViewEvents.SlashCommandError -> {
|
||||
displayCommandError(getString(R.string.command_problem_with_parameters, sendMessageResult.command.command))
|
||||
|
@ -1461,9 +1461,12 @@ class RoomDetailFragment @Inject constructor(
|
|||
displayCommandError(getString(R.string.unrecognized_command, sendMessageResult.command))
|
||||
}
|
||||
is TextComposerViewEvents.SlashCommandResultOk -> {
|
||||
dismissLoadingDialog()
|
||||
views.composerLayout.setTextIfDifferent("")
|
||||
sendMessageResult.messageRes?.let { showSnackWithMessage(getString(it)) }
|
||||
}
|
||||
is TextComposerViewEvents.SlashCommandResultError -> {
|
||||
dismissLoadingDialog()
|
||||
displayCommandError(errorFormatter.toHumanReadable(sendMessageResult.throwable))
|
||||
}
|
||||
is TextComposerViewEvents.SlashCommandNotImplemented -> {
|
||||
|
|
|
@ -32,8 +32,8 @@ sealed class TextComposerViewEvents : VectorViewEvents {
|
|||
data class JoinRoomCommandSuccess(val roomId: String) : SendMessageResult()
|
||||
class SlashCommandError(val command: Command) : SendMessageResult()
|
||||
class SlashCommandUnknown(val command: String) : SendMessageResult()
|
||||
data class SlashCommandHandled(@StringRes val messageRes: Int? = null) : SendMessageResult()
|
||||
object SlashCommandResultOk : SendMessageResult()
|
||||
object SlashCommandLoading : SendMessageResult()
|
||||
data class SlashCommandResultOk(@StringRes val messageRes: Int? = null) : SendMessageResult()
|
||||
class SlashCommandResultError(val throwable: Throwable) : SendMessageResult()
|
||||
|
||||
data class OpenRoomMemberProfile(val userId: String) : TextComposerViewEvents()
|
||||
|
|
|
@ -176,19 +176,15 @@ class TextComposerViewModel @AssistedInject constructor(
|
|||
}
|
||||
is ParsedCommand.ChangeRoomName -> {
|
||||
handleChangeRoomNameSlashCommand(slashCommandResult)
|
||||
popDraft()
|
||||
}
|
||||
is ParsedCommand.Invite -> {
|
||||
handleInviteSlashCommand(slashCommandResult)
|
||||
popDraft()
|
||||
}
|
||||
is ParsedCommand.Invite3Pid -> {
|
||||
handleInvite3pidSlashCommand(slashCommandResult)
|
||||
popDraft()
|
||||
}
|
||||
is ParsedCommand.SetUserPowerLevel -> {
|
||||
handleSetUserPowerLevel(slashCommandResult)
|
||||
popDraft()
|
||||
}
|
||||
is ParsedCommand.ClearScalarToken -> {
|
||||
// TODO
|
||||
|
@ -196,29 +192,24 @@ class TextComposerViewModel @AssistedInject constructor(
|
|||
}
|
||||
is ParsedCommand.SetMarkdown -> {
|
||||
vectorPreferences.setMarkdownEnabled(slashCommandResult.enable)
|
||||
_viewEvents.post(TextComposerViewEvents.SlashCommandHandled(
|
||||
_viewEvents.post(TextComposerViewEvents.SlashCommandResultOk(
|
||||
if (slashCommandResult.enable) R.string.markdown_has_been_enabled else R.string.markdown_has_been_disabled))
|
||||
popDraft()
|
||||
}
|
||||
is ParsedCommand.BanUser -> {
|
||||
handleBanSlashCommand(slashCommandResult)
|
||||
popDraft()
|
||||
}
|
||||
is ParsedCommand.UnbanUser -> {
|
||||
handleUnbanSlashCommand(slashCommandResult)
|
||||
popDraft()
|
||||
}
|
||||
is ParsedCommand.IgnoreUser -> {
|
||||
handleIgnoreSlashCommand(slashCommandResult)
|
||||
popDraft()
|
||||
}
|
||||
is ParsedCommand.UnignoreUser -> {
|
||||
handleUnignoreSlashCommand(slashCommandResult)
|
||||
popDraft()
|
||||
}
|
||||
is ParsedCommand.KickUser -> {
|
||||
handleKickSlashCommand(slashCommandResult)
|
||||
popDraft()
|
||||
}
|
||||
is ParsedCommand.JoinRoom -> {
|
||||
handleJoinToAnotherRoomSlashCommand(slashCommandResult)
|
||||
|
@ -226,25 +217,24 @@ class TextComposerViewModel @AssistedInject constructor(
|
|||
}
|
||||
is ParsedCommand.PartRoom -> {
|
||||
handlePartSlashCommand(slashCommandResult)
|
||||
popDraft()
|
||||
}
|
||||
is ParsedCommand.SendEmote -> {
|
||||
room.sendTextMessage(slashCommandResult.message, msgType = MessageType.MSGTYPE_EMOTE, autoMarkdown = action.autoMarkdown)
|
||||
_viewEvents.post(TextComposerViewEvents.SlashCommandHandled())
|
||||
_viewEvents.post(TextComposerViewEvents.SlashCommandResultOk())
|
||||
popDraft()
|
||||
}
|
||||
is ParsedCommand.SendRainbow -> {
|
||||
slashCommandResult.message.toString().let {
|
||||
room.sendFormattedTextMessage(it, rainbowGenerator.generate(it))
|
||||
}
|
||||
_viewEvents.post(TextComposerViewEvents.SlashCommandHandled())
|
||||
_viewEvents.post(TextComposerViewEvents.SlashCommandResultOk())
|
||||
popDraft()
|
||||
}
|
||||
is ParsedCommand.SendRainbowEmote -> {
|
||||
slashCommandResult.message.toString().let {
|
||||
room.sendFormattedTextMessage(it, rainbowGenerator.generate(it), MessageType.MSGTYPE_EMOTE)
|
||||
}
|
||||
_viewEvents.post(TextComposerViewEvents.SlashCommandHandled())
|
||||
_viewEvents.post(TextComposerViewEvents.SlashCommandResultOk())
|
||||
popDraft()
|
||||
}
|
||||
is ParsedCommand.SendSpoiler -> {
|
||||
|
@ -252,61 +242,56 @@ class TextComposerViewModel @AssistedInject constructor(
|
|||
"[${stringProvider.getString(R.string.spoiler)}](${slashCommandResult.message})",
|
||||
"<span data-mx-spoiler>${slashCommandResult.message}</span>"
|
||||
)
|
||||
_viewEvents.post(TextComposerViewEvents.SlashCommandHandled())
|
||||
_viewEvents.post(TextComposerViewEvents.SlashCommandResultOk())
|
||||
popDraft()
|
||||
}
|
||||
is ParsedCommand.SendShrug -> {
|
||||
sendPrefixedMessage("¯\\_(ツ)_/¯", slashCommandResult.message)
|
||||
_viewEvents.post(TextComposerViewEvents.SlashCommandHandled())
|
||||
_viewEvents.post(TextComposerViewEvents.SlashCommandResultOk())
|
||||
popDraft()
|
||||
}
|
||||
is ParsedCommand.SendLenny -> {
|
||||
sendPrefixedMessage("( ͡° ͜ʖ ͡°)", slashCommandResult.message)
|
||||
_viewEvents.post(TextComposerViewEvents.SlashCommandHandled())
|
||||
_viewEvents.post(TextComposerViewEvents.SlashCommandResultOk())
|
||||
popDraft()
|
||||
}
|
||||
is ParsedCommand.SendChatEffect -> {
|
||||
sendChatEffect(slashCommandResult)
|
||||
_viewEvents.post(TextComposerViewEvents.SlashCommandHandled())
|
||||
_viewEvents.post(TextComposerViewEvents.SlashCommandResultOk())
|
||||
popDraft()
|
||||
}
|
||||
is ParsedCommand.SendPoll -> {
|
||||
room.sendPoll(slashCommandResult.question, slashCommandResult.options.mapIndexed { index, s -> OptionItem(s, "$index. $s") })
|
||||
_viewEvents.post(TextComposerViewEvents.SlashCommandHandled())
|
||||
_viewEvents.post(TextComposerViewEvents.SlashCommandResultOk())
|
||||
popDraft()
|
||||
}
|
||||
is ParsedCommand.ChangeTopic -> {
|
||||
handleChangeTopicSlashCommand(slashCommandResult)
|
||||
popDraft()
|
||||
}
|
||||
is ParsedCommand.ChangeDisplayName -> {
|
||||
handleChangeDisplayNameSlashCommand(slashCommandResult)
|
||||
popDraft()
|
||||
}
|
||||
is ParsedCommand.ChangeDisplayNameForRoom -> {
|
||||
handleChangeDisplayNameForRoomSlashCommand(slashCommandResult)
|
||||
popDraft()
|
||||
}
|
||||
is ParsedCommand.ChangeRoomAvatar -> {
|
||||
handleChangeRoomAvatarSlashCommand(slashCommandResult)
|
||||
popDraft()
|
||||
}
|
||||
is ParsedCommand.ChangeAvatarForRoom -> {
|
||||
handleChangeAvatarForRoomSlashCommand(slashCommandResult)
|
||||
popDraft()
|
||||
}
|
||||
is ParsedCommand.ShowUser -> {
|
||||
_viewEvents.post(TextComposerViewEvents.SlashCommandHandled())
|
||||
_viewEvents.post(TextComposerViewEvents.SlashCommandResultOk())
|
||||
handleWhoisSlashCommand(slashCommandResult)
|
||||
popDraft()
|
||||
}
|
||||
is ParsedCommand.DiscardSession -> {
|
||||
if (room.isEncrypted()) {
|
||||
session.cryptoService().discardOutboundSession(room.roomId)
|
||||
_viewEvents.post(TextComposerViewEvents.SlashCommandHandled())
|
||||
_viewEvents.post(TextComposerViewEvents.SlashCommandResultOk())
|
||||
popDraft()
|
||||
} else {
|
||||
_viewEvents.post(TextComposerViewEvents.SlashCommandHandled())
|
||||
_viewEvents.post(TextComposerViewEvents.SlashCommandResultOk())
|
||||
_viewEvents.post(
|
||||
TextComposerViewEvents
|
||||
.ShowMessage(stringProvider.getString(R.string.command_description_discard_session_not_handled))
|
||||
|
@ -314,6 +299,7 @@ class TextComposerViewModel @AssistedInject constructor(
|
|||
}
|
||||
}
|
||||
is ParsedCommand.CreateSpace -> {
|
||||
_viewEvents.post(TextComposerViewEvents.SlashCommandLoading)
|
||||
viewModelScope.launch(Dispatchers.IO) {
|
||||
try {
|
||||
val params = CreateSpaceParams().apply {
|
||||
|
@ -328,14 +314,16 @@ class TextComposerViewModel @AssistedInject constructor(
|
|||
null,
|
||||
true
|
||||
)
|
||||
popDraft()
|
||||
_viewEvents.post(TextComposerViewEvents.SlashCommandResultOk())
|
||||
} catch (failure: Throwable) {
|
||||
_viewEvents.post(TextComposerViewEvents.SlashCommandResultError(failure))
|
||||
}
|
||||
}
|
||||
_viewEvents.post(TextComposerViewEvents.SlashCommandHandled())
|
||||
popDraft()
|
||||
Unit
|
||||
}
|
||||
is ParsedCommand.AddToSpace -> {
|
||||
_viewEvents.post(TextComposerViewEvents.SlashCommandLoading)
|
||||
viewModelScope.launch(Dispatchers.IO) {
|
||||
try {
|
||||
session.spaceService().getSpace(slashCommandResult.spaceId)
|
||||
|
@ -345,34 +333,38 @@ class TextComposerViewModel @AssistedInject constructor(
|
|||
null,
|
||||
false
|
||||
)
|
||||
popDraft()
|
||||
_viewEvents.post(TextComposerViewEvents.SlashCommandResultOk())
|
||||
} catch (failure: Throwable) {
|
||||
_viewEvents.post(TextComposerViewEvents.SlashCommandResultError(failure))
|
||||
}
|
||||
}
|
||||
_viewEvents.post(TextComposerViewEvents.SlashCommandHandled())
|
||||
popDraft()
|
||||
Unit
|
||||
}
|
||||
is ParsedCommand.JoinSpace -> {
|
||||
_viewEvents.post(TextComposerViewEvents.SlashCommandLoading)
|
||||
viewModelScope.launch(Dispatchers.IO) {
|
||||
try {
|
||||
session.spaceService().joinSpace(slashCommandResult.spaceIdOrAlias)
|
||||
popDraft()
|
||||
_viewEvents.post(TextComposerViewEvents.SlashCommandResultOk())
|
||||
} catch (failure: Throwable) {
|
||||
_viewEvents.post(TextComposerViewEvents.SlashCommandResultError(failure))
|
||||
}
|
||||
}
|
||||
_viewEvents.post(TextComposerViewEvents.SlashCommandHandled())
|
||||
popDraft()
|
||||
Unit
|
||||
}
|
||||
is ParsedCommand.LeaveRoom -> {
|
||||
viewModelScope.launch(Dispatchers.IO) {
|
||||
try {
|
||||
session.getRoom(slashCommandResult.roomId)?.leave(null)
|
||||
popDraft()
|
||||
_viewEvents.post(TextComposerViewEvents.SlashCommandResultOk())
|
||||
} catch (failure: Throwable) {
|
||||
_viewEvents.post(TextComposerViewEvents.SlashCommandResultError(failure))
|
||||
}
|
||||
}
|
||||
_viewEvents.post(TextComposerViewEvents.SlashCommandHandled())
|
||||
popDraft()
|
||||
Unit
|
||||
}
|
||||
is ParsedCommand.UpgradeRoom -> {
|
||||
_viewEvents.post(
|
||||
|
@ -381,7 +373,7 @@ class TextComposerViewModel @AssistedInject constructor(
|
|||
room.roomSummary()?.isPublic ?: false
|
||||
)
|
||||
)
|
||||
_viewEvents.post(TextComposerViewEvents.SlashCommandHandled())
|
||||
_viewEvents.post(TextComposerViewEvents.SlashCommandResultOk())
|
||||
popDraft()
|
||||
}
|
||||
}.exhaustive
|
||||
|
@ -704,11 +696,12 @@ class TextComposerViewModel @AssistedInject constructor(
|
|||
}
|
||||
|
||||
private fun launchSlashCommandFlowSuspendable(block: suspend () -> Unit) {
|
||||
_viewEvents.post(TextComposerViewEvents.SlashCommandHandled())
|
||||
_viewEvents.post(TextComposerViewEvents.SlashCommandLoading)
|
||||
viewModelScope.launch {
|
||||
val event = try {
|
||||
block()
|
||||
TextComposerViewEvents.SlashCommandResultOk
|
||||
popDraft()
|
||||
TextComposerViewEvents.SlashCommandResultOk()
|
||||
} catch (failure: Throwable) {
|
||||
TextComposerViewEvents.SlashCommandResultError(failure)
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue