Commit 07d9c48a authored by Hussein El Feky's avatar Hussein El Feky

Typing +:emoji_name: reacts to last message

parent 521f0a8b
...@@ -121,6 +121,7 @@ class ChatRoomPresenter @Inject constructor( ...@@ -121,6 +121,7 @@ class ChatRoomPresenter @Inject constructor(
private var lastState = manager.state private var lastState = manager.state
private var typingStatusList = arrayListOf<String>() private var typingStatusList = arrayListOf<String>()
private val roomChangesChannel = Channel<Room>(Channel.CONFLATED) private val roomChangesChannel = Channel<Room>(Channel.CONFLATED)
private var lastMessageId: String? = null
private lateinit var draftKey: String private lateinit var draftKey: String
fun setupChatRoom( fun setupChatRoom(
...@@ -220,6 +221,7 @@ class ChatRoomPresenter @Inject constructor( ...@@ -220,6 +221,7 @@ class ChatRoomPresenter @Inject constructor(
isBroadcast = chatIsBroadcast, isRoom = true isBroadcast = chatIsBroadcast, isRoom = true
) )
) )
lastMessageId = localMessages.first().id
val lastSyncDate = messagesRepository.getLastSyncDate(chatRoomId) val lastSyncDate = messagesRepository.getLastSyncDate(chatRoomId)
if (oldMessages.isNotEmpty() && lastSyncDate != null) { if (oldMessages.isNotEmpty() && lastSyncDate != null) {
view.showMessages(oldMessages, clearDataSet) view.showMessages(oldMessages, clearDataSet)
...@@ -368,6 +370,7 @@ class ChatRoomPresenter @Inject constructor( ...@@ -368,6 +370,7 @@ class ChatRoomPresenter @Inject constructor(
throw ex throw ex
} }
} }
lastMessageId = id
} else { } else {
client.updateMessage(chatRoomId, messageId, text) client.updateMessage(chatRoomId, messageId, text)
} }
...@@ -1071,7 +1074,7 @@ class ChatRoomPresenter @Inject constructor( ...@@ -1071,7 +1074,7 @@ class ChatRoomPresenter @Inject constructor(
/** /**
* Send an emoji reaction to a message. * Send an emoji reaction to a message.
*/ */
fun react(messageId: String, emoji: String) { fun react(messageId: String, emoji: String, roomId: String) {
launchUI(strategy) { launchUI(strategy) {
try { try {
retryIO("toggleEmoji($messageId, $emoji)") { retryIO("toggleEmoji($messageId, $emoji)") {
...@@ -1080,6 +1083,10 @@ class ChatRoomPresenter @Inject constructor( ...@@ -1080,6 +1083,10 @@ class ChatRoomPresenter @Inject constructor(
logReactionEvent() logReactionEvent()
} catch (ex: RocketChatException) { } catch (ex: RocketChatException) {
Timber.e(ex) Timber.e(ex)
// emoji is not valid, post it
sendMessage(roomId, "+$emoji", null)
} finally {
view.clearMessageComposition(true)
} }
} }
} }
...@@ -1178,6 +1185,7 @@ class ChatRoomPresenter @Inject constructor( ...@@ -1178,6 +1185,7 @@ class ChatRoomPresenter @Inject constructor(
// command is not valid, post it // command is not valid, post it
sendMessage(roomId, text, null) sendMessage(roomId, text, null)
} finally { } finally {
view.clearMessageComposition(true)
view.enableSendMessageButton() view.enableSendMessageButton()
} }
} }
...@@ -1246,8 +1254,8 @@ class ChatRoomPresenter @Inject constructor( ...@@ -1246,8 +1254,8 @@ class ChatRoomPresenter @Inject constructor(
launchUI(strategy) { launchUI(strategy) {
val viewModelStreamedMessage = mapper.map( val viewModelStreamedMessage = mapper.map(
streamedMessage, RoomUiModel( streamedMessage, RoomUiModel(
roles = chatRoles, isBroadcast = chatIsBroadcast, isRoom = true roles = chatRoles, isBroadcast = chatIsBroadcast, isRoom = true
) )
) )
val roomMessages = messagesRepository.getByRoomId(streamedMessage.roomId) val roomMessages = messagesRepository.getByRoomId(streamedMessage.roomId)
val index = roomMessages.indexOfFirst { msg -> msg.id == streamedMessage.id } val index = roomMessages.indexOfFirst { msg -> msg.id == streamedMessage.id }
...@@ -1281,6 +1289,7 @@ class ChatRoomPresenter @Inject constructor( ...@@ -1281,6 +1289,7 @@ class ChatRoomPresenter @Inject constructor(
fun clearDraftMessage() { fun clearDraftMessage() {
localRepository.clear(draftKey) localRepository.clear(draftKey)
} }
/** /**
* Get unfinished message from local repository, when user left chat room without * Get unfinished message from local repository, when user left chat room without
* sending a message and now the user is back. * sending a message and now the user is back.
...@@ -1290,4 +1299,8 @@ class ChatRoomPresenter @Inject constructor( ...@@ -1290,4 +1299,8 @@ class ChatRoomPresenter @Inject constructor(
fun getDraftUnfinishedMessage(): String? { fun getDraftUnfinishedMessage(): String? {
return localRepository.get(draftKey) return localRepository.get(draftKey)
} }
fun getLastMessageId(): String? {
return lastMessageId
}
} }
...@@ -148,10 +148,14 @@ private const val BUNDLE_CHAT_ROOM_MESSAGE = "chat_room_message" ...@@ -148,10 +148,14 @@ private const val BUNDLE_CHAT_ROOM_MESSAGE = "chat_room_message"
class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiReactionListener, class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiReactionListener,
ChatRoomAdapter.OnActionSelected, Drawable.Callback { ChatRoomAdapter.OnActionSelected, Drawable.Callback {
@Inject lateinit var presenter: ChatRoomPresenter @Inject
@Inject lateinit var parser: MessageParser lateinit var presenter: ChatRoomPresenter
@Inject lateinit var analyticsManager: AnalyticsManager @Inject
@Inject lateinit var navigator: ChatRoomNavigator lateinit var parser: MessageParser
@Inject
lateinit var analyticsManager: AnalyticsManager
@Inject
lateinit var navigator: ChatRoomNavigator
private lateinit var adapter: ChatRoomAdapter private lateinit var adapter: ChatRoomAdapter
internal lateinit var chatRoomId: String internal lateinit var chatRoomId: String
private lateinit var chatRoomName: String private lateinit var chatRoomName: String
...@@ -476,11 +480,17 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR ...@@ -476,11 +480,17 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR
override fun sendMessage(text: String) { override fun sendMessage(text: String) {
ui { ui {
if (!text.isBlank()) { if (!text.isBlank()) {
if (!text.startsWith("/")) { if (text.startsWith("/")) {
presenter.sendMessage(chatRoomId, text, editingMessageId)
} else {
presenter.runCommand(text, chatRoomId) presenter.runCommand(text, chatRoomId)
return@ui
} else if (text.startsWith("+") && presenter.getLastMessageId() != null) {
val trimmedText = text.substring(1).trimEnd()
if (trimmedText.length - trimmedText.removeSurrounding(":").length == 2) {
presenter.react(presenter.getLastMessageId()!!, trimmedText, chatRoomId)
return@ui
}
} }
presenter.sendMessage(chatRoomId, text, editingMessageId)
} }
} }
} }
...@@ -524,7 +534,6 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR ...@@ -524,7 +534,6 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR
} }
} }
override fun clearMessageComposition(deleteMessage: Boolean) { override fun clearMessageComposition(deleteMessage: Boolean) {
ui { ui {
citation = null citation = null
...@@ -671,11 +680,11 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR ...@@ -671,11 +680,11 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR
} }
override fun onReactionTouched(messageId: String, emojiShortname: String) { override fun onReactionTouched(messageId: String, emojiShortname: String) {
presenter.react(messageId, emojiShortname) presenter.react(messageId, emojiShortname, chatRoomId)
} }
override fun onReactionAdded(messageId: String, emoji: Emoji) { override fun onReactionAdded(messageId: String, emoji: Emoji) {
presenter.react(messageId, emoji.shortname) presenter.react(messageId, emoji.shortname, chatRoomId)
} }
override fun onReactionLongClicked( override fun onReactionLongClicked(
...@@ -896,7 +905,7 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR ...@@ -896,7 +905,7 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR
button_take_a_photo.setOnClickListener { button_take_a_photo.setOnClickListener {
// Check for camera permission // Check for camera permission
context?.let { context?.let {
if(hasCameraPermission(it)) { if (hasCameraPermission(it)) {
dispatchTakePictureIntent() dispatchTakePictureIntent()
} else { } else {
getCameraPermission(this) getCameraPermission(this)
...@@ -964,7 +973,7 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR ...@@ -964,7 +973,7 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR
grantResults: IntArray grantResults: IntArray
) { ) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults) super.onRequestPermissionsResult(requestCode, permissions, grantResults)
when(requestCode) { when (requestCode) {
AndroidPermissionsHelper.CAMERA_CODE -> { AndroidPermissionsHelper.CAMERA_CODE -> {
if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) { if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// permission was granted // permission was granted
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment