[fix 4212] update profiles with concurrent contact-requests
This commit is contained in:
parent
5a08383bde
commit
b40b042b67
|
@ -74,7 +74,8 @@
|
||||||
(let [{:keys [web3 current-public-key]} db
|
(let [{:keys [web3 current-public-key]} db
|
||||||
chat-transport-info (-> (get-in db [:transport/chats chat-id])
|
chat-transport-info (-> (get-in db [:transport/chats chat-id])
|
||||||
(assoc :sym-key-id sym-key-id
|
(assoc :sym-key-id sym-key-id
|
||||||
:sym-key sym-key))]
|
:sym-key sym-key
|
||||||
|
:topic topic))]
|
||||||
(handlers-macro/merge-fx cofx
|
(handlers-macro/merge-fx cofx
|
||||||
{:db (assoc-in db [:transport/chats chat-id] chat-transport-info)
|
{:db (assoc-in db [:transport/chats chat-id] chat-transport-info)
|
||||||
:shh/add-filter {:web3 web3
|
:shh/add-filter {:web3 web3
|
||||||
|
@ -92,7 +93,8 @@
|
||||||
(let [{:keys [web3 current-public-key]} db
|
(let [{:keys [web3 current-public-key]} db
|
||||||
chat-transport-info (-> (get-in db [:transport/chats chat-id])
|
chat-transport-info (-> (get-in db [:transport/chats chat-id])
|
||||||
(assoc :sym-key-id sym-key-id
|
(assoc :sym-key-id sym-key-id
|
||||||
:sym-key sym-key))]
|
:sym-key sym-key
|
||||||
|
:topic topic))]
|
||||||
(handlers-macro/merge-fx cofx
|
(handlers-macro/merge-fx cofx
|
||||||
{:db (assoc-in db
|
{:db (assoc-in db
|
||||||
[:transport/chats chat-id]
|
[:transport/chats chat-id]
|
||||||
|
|
|
@ -8,29 +8,6 @@
|
||||||
[status-im.utils.handlers :as handlers]
|
[status-im.utils.handlers :as handlers]
|
||||||
[status-im.data-store.transport :as transport-store]))
|
[status-im.data-store.transport :as transport-store]))
|
||||||
|
|
||||||
(defrecord NewContactKey [sym-key topic message]
|
|
||||||
message/StatusMessage
|
|
||||||
(send [this chat-id cofx]
|
|
||||||
(let [success-event [:transport/set-contact-message-envelope-hash chat-id]]
|
|
||||||
(protocol/send-with-pubkey {:chat-id chat-id
|
|
||||||
:payload this
|
|
||||||
:success-event success-event}
|
|
||||||
cofx)))
|
|
||||||
(receive [this chat-id signature cofx]
|
|
||||||
(let [on-success (fn [sym-key sym-key-id]
|
|
||||||
(re-frame/dispatch [:contact/add-new-sym-key
|
|
||||||
{:sym-key-id sym-key-id
|
|
||||||
:sym-key sym-key
|
|
||||||
:chat-id chat-id
|
|
||||||
:topic topic
|
|
||||||
:message message}]))]
|
|
||||||
(handlers-macro/merge-fx cofx
|
|
||||||
{:shh/add-new-sym-keys [{:web3 (get-in cofx [:db :web3])
|
|
||||||
:sym-key sym-key
|
|
||||||
:on-success on-success}]}
|
|
||||||
(protocol/init-chat {:chat-id chat-id
|
|
||||||
:topic topic})))))
|
|
||||||
|
|
||||||
(defrecord ContactRequest [name profile-image address fcm-token]
|
(defrecord ContactRequest [name profile-image address fcm-token]
|
||||||
message/StatusMessage
|
message/StatusMessage
|
||||||
(send [this chat-id {:keys [db random-id] :as cofx}]
|
(send [this chat-id {:keys [db random-id] :as cofx}]
|
||||||
|
@ -92,3 +69,54 @@
|
||||||
:payload this
|
:payload this
|
||||||
:success-event success-event}))))
|
:success-event success-event}))))
|
||||||
recipients))))
|
recipients))))
|
||||||
|
|
||||||
|
(defn remove-chat-filter
|
||||||
|
"Stops the filter for the given chat-id"
|
||||||
|
[chat-id {:keys [db]}]
|
||||||
|
(when-let [filter (get-in db [:transport/chats chat-id :filter])]
|
||||||
|
{:shh/remove-filter filter}))
|
||||||
|
|
||||||
|
(defn init-chat
|
||||||
|
[chat-id topic cofx]
|
||||||
|
(when-not (get-in cofx [:db :transport/chats chat-id])
|
||||||
|
(protocol/init-chat {:chat-id chat-id
|
||||||
|
:topic topic} cofx)))
|
||||||
|
|
||||||
|
(defrecord NewContactKey [sym-key topic message]
|
||||||
|
message/StatusMessage
|
||||||
|
(send [this chat-id cofx]
|
||||||
|
(let [success-event [:transport/set-contact-message-envelope-hash chat-id]]
|
||||||
|
(protocol/send-with-pubkey {:chat-id chat-id
|
||||||
|
:payload this
|
||||||
|
:success-event success-event}
|
||||||
|
cofx)))
|
||||||
|
(receive [this chat-id signature {:keys [db] :as cofx}]
|
||||||
|
(let [current-sym-key (get-in db [:transport/chats chat-id :sym-key])
|
||||||
|
;; NOTE(yenda) to support concurrent contact request without additional
|
||||||
|
;; interactions we don't save the new key if these conditions are met:
|
||||||
|
;; - the message is a contact request
|
||||||
|
;; - we already have a sym-key
|
||||||
|
;; - this sym-key is first in alphabetical order compared to the new one
|
||||||
|
save-key? (not (and (= ContactRequest (type message))
|
||||||
|
current-sym-key
|
||||||
|
(= current-sym-key
|
||||||
|
(first (sort [current-sym-key sym-key])))))]
|
||||||
|
(if save-key?
|
||||||
|
(let [on-success (fn [sym-key sym-key-id]
|
||||||
|
(re-frame/dispatch [:contact/add-new-sym-key
|
||||||
|
{:sym-key-id sym-key-id
|
||||||
|
:sym-key sym-key
|
||||||
|
:chat-id chat-id
|
||||||
|
:topic topic
|
||||||
|
:message message}]))]
|
||||||
|
(handlers-macro/merge-fx cofx
|
||||||
|
{:shh/add-new-sym-keys [{:web3 (:web3 db)
|
||||||
|
:sym-key sym-key
|
||||||
|
:on-success on-success}]}
|
||||||
|
(init-chat chat-id topic)
|
||||||
|
;; in case of concurrent contact request we want
|
||||||
|
;; to stop the filter for the previous key before
|
||||||
|
;; dereferrencing it
|
||||||
|
(remove-chat-filter chat-id)))
|
||||||
|
;; if we don't save the key, we read the message directly
|
||||||
|
(message/receive message chat-id chat-id cofx)))))
|
||||||
|
|
|
@ -7,14 +7,19 @@
|
||||||
[public-key
|
[public-key
|
||||||
{:keys [name profile-image address fcm-token]}
|
{:keys [name profile-image address fcm-token]}
|
||||||
{{:contacts/keys [contacts] :as db} :db :as cofx}]
|
{{:contacts/keys [contacts] :as db} :db :as cofx}]
|
||||||
(when-not (get contacts public-key)
|
(let [contact (get contacts public-key)
|
||||||
(let [contact-props {:whisper-identity public-key
|
contact-props {:whisper-identity public-key
|
||||||
:public-key public-key
|
:public-key public-key
|
||||||
:address address
|
:address address
|
||||||
:photo-path profile-image
|
:photo-path profile-image
|
||||||
:name name
|
:name name
|
||||||
:fcm-token fcm-token
|
:fcm-token fcm-token
|
||||||
:pending? true}]
|
;;NOTE (yenda) in case of concurrent contact request
|
||||||
|
:pending? (get contact :pending? true)}]
|
||||||
|
;;NOTE (yenda) only update if there is changes to the contact
|
||||||
|
(when-not (= contact-props
|
||||||
|
(select-keys contact [:whisper-identity :public-key :address
|
||||||
|
:photo-path :name :fcm-token :pending?]))
|
||||||
(handlers-macro/merge-fx cofx
|
(handlers-macro/merge-fx cofx
|
||||||
{:db (update-in db [:contacts/contacts public-key]
|
{:db (update-in db [:contacts/contacts public-key]
|
||||||
merge contact-props)
|
merge contact-props)
|
||||||
|
|
Loading…
Reference in New Issue