@@ -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