@ -2109,6 +2109,7 @@ extension ConversationVC:
}
}
// D e l e t e t h e m e s s a g e f r o m t h e o p e n g r o u p
// D e l e t e t h e m e s s a g e f r o m t h e o p e n g r o u p
self . hideInputAccessoryView ( )
deleteRemotely (
deleteRemotely (
from : self ,
from : self ,
request : Storage . shared
request : Storage . shared
@ -2133,13 +2134,14 @@ extension ConversationVC:
userPublicKey :
userPublicKey :
cellViewModel . threadId
cellViewModel . threadId
)
)
let serverHash : String ? = Storage . shared . read { db -> String ? in
let serverHashes : Set < String > = Storage . shared
try Interaction
. read { db -> Set < String > in
. select ( . serverHash )
try Interaction . serverHashesForDeletion (
. filter ( id : cellViewModel . id )
db ,
. asRequest ( of : String . self )
interactionIds : [ cellViewModel . id ]
. fetchOne ( db )
)
}
}
. defaulting ( to : [ ] )
let unsendRequest : UnsendRequest = UnsendRequest (
let unsendRequest : UnsendRequest = UnsendRequest (
timestamp : UInt64 ( cellViewModel . timestampMs ) ,
timestamp : UInt64 ( cellViewModel . timestampMs ) ,
author : ( cellViewModel . variant = = . standardOutgoing ?
author : ( cellViewModel . variant = = . standardOutgoing ?
@ -2153,7 +2155,7 @@ extension ConversationVC:
)
)
// F o r i n c o m i n g i n t e r a c t i o n s o r i n t e r a c t i o n s w i t h n o s e r v e r H a s h j u s t d e l e t e t h e m l o c a l l y
// F o r i n c o m i n g i n t e r a c t i o n s o r i n t e r a c t i o n s w i t h n o s e r v e r H a s h j u s t d e l e t e t h e m l o c a l l y
guard cellViewModel . variant = = . standardOutgoing , let serverHash : String = serverHash else {
guard cellViewModel . variant = = . standardOutgoing , ! serverHashes . isEmpty else {
Storage . shared . writeAsync { db in
Storage . shared . writeAsync { db in
_ = try Interaction
_ = try Interaction
. filter ( id : cellViewModel . id )
. filter ( id : cellViewModel . id )
@ -2161,7 +2163,7 @@ extension ConversationVC:
// N o n e e d t o s e n d t h e u n s e n d R e q u e s t i f t h e r e i s n o s e r v e r H a s h ( i e . t h e m e s s a g e
// N o n e e d t o s e n d t h e u n s e n d R e q u e s t i f t h e r e i s n o s e r v e r H a s h ( i e . t h e m e s s a g e
// w a s o u t g o i n g b u t n e v e r g o t t o t h e s e r v e r )
// w a s o u t g o i n g b u t n e v e r g o t t o t h e s e r v e r )
guard serverHash != nil else { return }
guard ! serverHashes . isEmpty else { return }
MessageSender
MessageSender
. send (
. send (
@ -2209,7 +2211,6 @@ extension ConversationVC:
actionSheet . addAction ( UIAlertAction (
actionSheet . addAction ( UIAlertAction (
title : {
title : {
switch ( cellViewModel . threadVariant , cellViewModel . threadId ) {
switch ( cellViewModel . threadVariant , cellViewModel . threadId ) {
case ( . legacyGroup , _ ) , ( . group , _ ) : return " clearMessagesForEveryone " . localized ( )
case ( _ , userPublicKey ) : return " deleteMessageDevicesAll " . localized ( )
case ( _ , userPublicKey ) : return " deleteMessageDevicesAll " . localized ( )
default : return " deleteMessageEveryone " . localized ( )
default : return " deleteMessageEveryone " . localized ( )
}
}
@ -2219,6 +2220,10 @@ extension ConversationVC:
) { [ weak self ] _ in
) { [ weak self ] _ in
let completeServerDeletion = {
let completeServerDeletion = {
Storage . shared . writeAsync { db in
Storage . shared . writeAsync { db in
_ = try Interaction
. filter ( id : cellViewModel . id )
. deleteAll ( db )
try MessageSender
try MessageSender
. send (
. send (
db ,
db ,
@ -2228,7 +2233,15 @@ extension ConversationVC:
threadVariant : cellViewModel . threadVariant ,
threadVariant : cellViewModel . threadVariant ,
using : dependencies
using : dependencies
)
)
// / W e s h o u l d a l s o r e m o v e t h e ` S n o d e R e c e i v e d M e s s a g e I n f o ` e n t r i e s f o r t h e h a s h e s ( o t h e r w i s e w e
// / m i g h t t r y t o p o l l f o r a h a s h w h i c h n o l o n g e r e x i s t s , r e s u l t i n g i n f e t c h i n g t h e l a s t 1 4 d a y s o f m e s s a g e s )
try SnodeReceivedMessageInfo . handlePotentialDeletedOrInvalidHash (
db ,
potentiallyInvalidHashes : Array ( serverHashes )
)
}
}
self ? . showInputAccessoryView ( )
}
}
// W e c a n o n l y d e l e t e m e s s a g e s o n t h e s e r v e r f o r ` c o n t a c t ` a n d ` g r o u p ` c o n v e r s a t i o n s
// W e c a n o n l y d e l e t e m e s s a g e s o n t h e s e r v e r f o r ` c o n t a c t ` a n d ` g r o u p ` c o n v e r s a t i o n s
@ -2241,7 +2254,7 @@ extension ConversationVC:
request : SnodeAPI
request : SnodeAPI
. deleteMessages (
. deleteMessages (
swarmPublicKey : targetPublicKey ,
swarmPublicKey : targetPublicKey ,
serverHashes : [ serverHash ]
serverHashes : Array ( serverHashes )
)
)
. map { _ in ( ) }
. map { _ in ( ) }
. eraseToAnyPublisher ( )
. eraseToAnyPublisher ( )