@@ -52,7 +52,7 @@ import Server.WebSocket as SW
52
52
import Shared.Availability (Availability (..))
53
53
import Shared.DateTime (DateTimeWrapper (..))
54
54
import Shared.DateTime as SDT
55
- import Shared.Im.Types (AfterLogout (..), FullWebSocketPayloadClient (..), MessageError (..), MessageStatus , OutgoingRecord , WebSocketPayloadClient (..), WebSocketPayloadServer (..), EditedRecord )
55
+ import Shared.Im.Types (AfterLogout (..), EditedRecord , FullWebSocketPayloadClient (..), MessageError (..), MessageStatus , OutgoingRecord , WebSocketPayloadClient (..), WebSocketPayloadServer (..), DeletedRecord )
56
56
import Shared.Json as SJ
57
57
import Shared.Resource (updateHash )
58
58
import Shared.ResponseError (DatabaseError , ResponseError (..))
@@ -166,6 +166,7 @@ handleMessage payload = do
166
166
Ping ping → sendPong context.token context.loggedUserId context.allUsersAvailabilityRef ping
167
167
OutgoingMessage message → sendOutgoingMessage context.token context.loggedUserId allUsersAvailability message
168
168
EditedMessage message → sendEditedMessage context.token context.loggedUserId allUsersAvailability message
169
+ DeletedMessage message → unsendMessage context.token context.loggedUserId allUsersAvailability message
169
170
ChangeStatus changes → sendStatusChange context.token context.loggedUserId allUsersAvailability changes
170
171
Typing { id } → sendTyping context.loggedUserId allUsersAvailability id
171
172
SetOnline → setOnline context.loggedUserId
@@ -341,14 +342,14 @@ sendEditedMessage token loggedUserId allUsersAvailability edited = do
341
342
case processed of
342
343
Right content → do
343
344
let receipientUserAvailability = DH .lookup edited.userId allUsersAvailability
344
- withConnections receipientUserAvailability (sendRecipient edited.id content)
345
+ withConnections receipientUserAvailability (sendRecipient content)
345
346
346
347
let loggedUserConnections = (SU .fromJust loggedUserAvailability).connections
347
348
let senderConnection = DH .values $ DH .filterKeys (token == _) loggedUserConnections
348
- DF .traverse_ ( acknowledgeMessage edited.id) senderConnection
349
+ DF .traverse_ acknowledgeMessage senderConnection
349
350
350
351
let otherConnections = DH .values $ DH .filterKeys (token /= _) loggedUserConnections
351
- DF .traverse_ (sendRecipient edited.id content) otherConnections
352
+ DF .traverse_ (sendRecipient content) otherConnections
352
353
Left UserUnavailable →
353
354
sendLoggedUser <<< Content $ ContactUnavailable
354
355
{ userId: edited.userId
@@ -360,25 +361,47 @@ sendEditedMessage token loggedUserId allUsersAvailability edited = do
360
361
, temporaryMessageId: Just edited.id
361
362
}
362
363
where
363
- sendRecipient messageId content connection =
364
+ sendRecipient content connection =
364
365
sendWebSocketMessage connection <<< Content $ NewEditedMessage
365
- { id: messageId
366
+ { id: edited.id
366
367
, senderId: loggedUserId
367
368
, recipientId: edited.userId
368
369
, content
369
370
}
370
371
371
372
loggedUserAvailability = DH .lookup loggedUserId allUsersAvailability
372
373
373
- acknowledgeMessage messageId connection = sendWebSocketMessage connection <<< Content $ ServerReceivedMessage
374
- { previousId: messageId
375
- , id: messageId
374
+ acknowledgeMessage connection = sendWebSocketMessage connection <<< Content $ ServerReceivedMessage
375
+ { previousId: edited.id
376
+ , id: edited.id
376
377
, userId: edited.userId
377
378
}
378
379
379
380
sendLoggedUser payload = do
380
381
withConnections loggedUserAvailability $ \connection → sendWebSocketMessage connection payload
381
382
383
+ unsendMessage ∷ String → Int → HashMap Int UserAvailability → DeletedRecord → WebSocketEffect
384
+ unsendMessage token loggedUserId allUsersAvailability deleted = do
385
+ SIA .unsendMessage loggedUserId deleted.userId deleted.id
386
+
387
+ let receipientUserAvailability = DH .lookup deleted.userId allUsersAvailability
388
+ withConnections receipientUserAvailability (send loggedUserId)
389
+
390
+ let loggedUserConnections = (SU .fromJust loggedUserAvailability).connections
391
+ let senderConnection = DH .values $ DH .filterKeys (token == _) loggedUserConnections
392
+ DF .traverse_ (send deleted.userId) senderConnection
393
+
394
+ let otherConnections = DH .values $ DH .filterKeys (token /= _) loggedUserConnections
395
+ DF .traverse_ (send deleted.userId) otherConnections
396
+ where
397
+ send userId connection =
398
+ sendWebSocketMessage connection <<< Content $ NewDeletedMessage
399
+ { id: deleted.id
400
+ , userId
401
+ }
402
+
403
+ loggedUserAvailability = DH .lookup loggedUserId allUsersAvailability
404
+
382
405
makeUserAvailabity ∷ HashMap String WebSocketConnection → Either String String → Boolean → DateTime → Availability → UserAvailability
383
406
makeUserAvailabity connections token isActive lastSeen previousAvailability =
384
407
{ lastSeen
0 commit comments