Skip to content

Commit d07fefc

Browse files
committed
fix: add 200ms debounce to handleSendMessage to prevent rapid fire sends
1 parent c27a6d0 commit d07fefc

File tree

1 file changed

+19
-24
lines changed

1 file changed

+19
-24
lines changed

app/src/main/java/ir/amirroid/chatguard/features/web_frame/WebFrameViewModel.kt

Lines changed: 19 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,8 @@ class WebFrameViewModel(
6363
private val platform = savedStateHandle.get<MessengerPlatform>("platform")!!
6464
private val _userPublicKey = MutableStateFlow<Result<CryptoKey>?>(null)
6565

66+
private var lastSendMessageTime = 0L
67+
6668
init {
6769
startTaskProcessor()
6870
}
@@ -78,15 +80,12 @@ class WebFrameViewModel(
7880
fun handleUserInfoKey(userInfo: ExtractedUserInfo) = viewModelScope.launch(Dispatchers.IO) {
7981
currentUsername = userInfo.username
8082

81-
getPublicKeyUseCase(userInfo.username, platform.packageName)
82-
.onSuccess {
83+
getPublicKeyUseCase(userInfo.username, platform.packageName).onSuccess {
8384
_events.send(WebFrameEvent.ClearInfoMessage)
84-
}
85-
.onFailure {
85+
}.onFailure {
8686
_events.send(
8787
WebFrameEvent.ShowInfoMessageResource(
88-
R.string.encryption_key_was_not_found,
89-
InfoMessageType.ERROR
88+
R.string.encryption_key_was_not_found, InfoMessageType.ERROR
9089
)
9190
)
9291
}.also { result ->
@@ -180,17 +179,15 @@ class WebFrameViewModel(
180179
result.updatedMessage?.let { newText ->
181180
_events.send(
182181
WebFrameEvent.UpdateMessageText(
183-
messageId = messageId,
184-
newText = newText
182+
messageId = messageId, newText = newText
185183
)
186184
)
187185
}
188186
}
189187

190188
private fun startTaskProcessor() {
191189
viewModelScope.launch(Dispatchers.IO) {
192-
taskQueue.consumeAsFlow()
193-
.collect { task ->
190+
taskQueue.consumeAsFlow().collect { task ->
194191
launch(Dispatchers.IO) {
195192
processMessageTask(task)
196193
}
@@ -208,20 +205,16 @@ class WebFrameViewModel(
208205
val username = currentUsername ?: return
209206

210207
addUserPublicKeyUseCase(
211-
packageName = platform.packageName,
212-
username = username,
213-
key = publicKey
208+
packageName = platform.packageName, username = username, key = publicKey
214209
).onSuccess {
215210
clearResultsForUser(username)
216211
_events.send(WebFrameEvent.RefreshWebView)
217212
}
218213
}
219214

220215
private fun clearResultsForUser(username: String) {
221-
val messageIdsToRemove = messageToUsername
222-
.filter { (_, user) -> user == username }
223-
.map { (messageId, _) -> messageId }
224-
.toSet()
216+
val messageIdsToRemove = messageToUsername.filter { (_, user) -> user == username }
217+
.map { (messageId, _) -> messageId }.toSet()
225218

226219
messageIdsToRemove.forEach { messageId ->
227220
val result = taskResults[messageId]
@@ -239,9 +232,14 @@ class WebFrameViewModel(
239232
}
240233

241234
fun handleSendMessage(message: String) = viewModelScope.launch(Dispatchers.IO) {
235+
val now = System.currentTimeMillis()
236+
if (now - lastSendMessageTime < 200) {
237+
return@launch
238+
}
239+
lastSendMessageTime = now
240+
242241
_userPublicKey.filterNotNull().firstOrNull()?.onSuccess { key ->
243-
encryptionUseCase(message, key)
244-
.onSuccess { encryptedMessage ->
242+
encryptionUseCase(message, key).onSuccess { encryptedMessage ->
245243
_events.send(WebFrameEvent.SendMessage(encryptedMessage))
246244
}
247245
}?.onFailure {
@@ -255,8 +253,7 @@ class WebFrameViewModel(
255253
viewModelScope.launch(Dispatchers.IO) {
256254
when (data.buttonType) {
257255
ButtonType.CHOOSE_KEY -> {
258-
getPoeticPublicKeyUseCase(messageResult.realMessage)
259-
.onSuccess { publicKey ->
256+
getPoeticPublicKeyUseCase(messageResult.realMessage).onSuccess { publicKey ->
260257
savePublicKey(publicKey)
261258
}
262259
}
@@ -273,9 +270,7 @@ class WebFrameViewModel(
273270

274271
_userPublicKey.filterNotNull().firstOrNull()?.onSuccess { key ->
275272
decryptionUseCase(
276-
task.data.message,
277-
key,
278-
isAmSender = task.data.isMyMessage
273+
task.data.message, key, isAmSender = task.data.isMyMessage
279274
).getOrNull()?.also {
280275
updatedMessage = "🔒 $it"
281276
}

0 commit comments

Comments
 (0)