Move all the legacy handling into transit
This commit is contained in:
parent
f507484dc8
commit
66ef32d3b9
|
@ -2,20 +2,11 @@
|
|||
(:require [status-im.chat.commands.protocol :as protocol]
|
||||
[status-im.utils.fx :as fx]))
|
||||
|
||||
;; TODO(janherich) remove after couple of releases when danger of messages
|
||||
;; with old command references will be low
|
||||
(def ^:private old->new-path
|
||||
{["transactor" :command 83 "send"] ["send" #{:personal-chats}]
|
||||
["transactor" :command 83 "request"] ["request" #{:personal-chats}]})
|
||||
|
||||
(defn lookup-command-by-ref
|
||||
"Function which takes message object and looks up associated entry from the
|
||||
`id->command` map if it can be found"
|
||||
[{:keys [content]} id->command]
|
||||
(when-let [path (or (:command-path content)
|
||||
(:command-ref content))]
|
||||
(or (get id->command path)
|
||||
(get id->command (get old->new-path path)))))
|
||||
(get id->command (:command-path content)))
|
||||
|
||||
(fx/defn receive
|
||||
"Performs receive effects for command message. Does nothing
|
||||
|
|
|
@ -7,40 +7,16 @@
|
|||
[status-im.chat.models.message :as chat.message]
|
||||
[status-im.utils.fx :as fx]))
|
||||
|
||||
;; TODO(janherich) remove after couple of releases when danger of messages
|
||||
;; with old command references will be low
|
||||
(defn- new->old
|
||||
[path parameter-map]
|
||||
(get {["send" #{:personal-chats}] {:content {:command-ref ["transactor" :command 83 "send"]
|
||||
:command "send"
|
||||
:bot "transactor"
|
||||
:command-scope-bitmask 83}
|
||||
:content-type constants/content-type-command}
|
||||
["request" #{:personal-chats}] {:content {:command-ref ["transactor" :command 83 "request"]
|
||||
:request-command-ref ["transactor" :command 83 "send"]
|
||||
:command "request"
|
||||
:request-command "send"
|
||||
:bot "transactor"
|
||||
:command-scope-bitmask 83
|
||||
:prefill [(get parameter-map :asset)
|
||||
(get parameter-map :amount)]}
|
||||
:content-type constants/content-type-command-request}}
|
||||
path
|
||||
{:content-type constants/content-type-command}))
|
||||
|
||||
(defn- create-command-message
|
||||
"Create message map from chat-id, command & input parameters"
|
||||
[chat-id type parameter-map cofx]
|
||||
(let [command-path (commands/command-id type)
|
||||
;; TODO(janherich) this is just for backward compatibility, can be removed later
|
||||
{:keys [content content-type]} (new->old command-path parameter-map)
|
||||
new-parameter-map (and (satisfies? protocol/EnhancedParameters type)
|
||||
(protocol/enhance-send-parameters type parameter-map cofx))]
|
||||
(let [command-path (commands/command-id type)
|
||||
new-parameter-map (and (satisfies? protocol/EnhancedParameters type)
|
||||
(protocol/enhance-send-parameters type parameter-map cofx))]
|
||||
{:chat-id chat-id
|
||||
:content-type content-type
|
||||
:content (merge {:command-path command-path
|
||||
:params (or new-parameter-map parameter-map)}
|
||||
content)}))
|
||||
:content-type constants/content-type-command
|
||||
:content {:command-path command-path
|
||||
:params (or new-parameter-map parameter-map)}}))
|
||||
|
||||
(fx/defn validate-and-send
|
||||
"Validates and sends command in current chat"
|
||||
|
|
|
@ -125,7 +125,7 @@
|
|||
(fx/merge cofx
|
||||
{:db (assoc-in db [:chats current-chat-id :metadata :responding-to-message] nil)}
|
||||
(chat.message/send-message {:chat-id current-chat-id
|
||||
:content-type constants/text-content-type
|
||||
:content-type constants/content-type-text
|
||||
:content (cond-> {:text input-text}
|
||||
reply-to-message
|
||||
(assoc :response-to reply-to-message))})
|
||||
|
|
|
@ -101,11 +101,6 @@
|
|||
message
|
||||
(assoc message :clock-value (utils.clocks/send last-clock-value))))
|
||||
|
||||
(defn- update-legacy-data [{:keys [content-type content] :as message}]
|
||||
(cond-> message
|
||||
(= constants/content-type-command-request content-type)
|
||||
(assoc :content-type constants/content-type-command)))
|
||||
|
||||
(fx/defn display-notification
|
||||
[cofx chat-id]
|
||||
(when config/in-app-notifications-enabled?
|
||||
|
@ -130,9 +125,7 @@
|
|||
(commands-receiving/enhance-receive-parameters cofx)
|
||||
(ensure-clock-value chat)
|
||||
;; TODO (cammellos): Refactor so it's not computed twice
|
||||
(add-outgoing-status cofx)
|
||||
;; TODO (janherich): Remove after couple of releases
|
||||
update-legacy-data)]
|
||||
(add-outgoing-status cofx))]
|
||||
(fx/merge cofx
|
||||
{:confirm-messages-processed [{:web3 web3
|
||||
:js-obj js-obj}]}
|
||||
|
@ -207,7 +200,7 @@
|
|||
:timestamp timestamp
|
||||
:show? true
|
||||
:content content
|
||||
:content-type constants/text-content-type})
|
||||
:content-type constants/content-type-text})
|
||||
|
||||
(defn group-message? [{:keys [message-type]}]
|
||||
(#{:group-user-message :public-group-user-message} message-type))
|
||||
|
|
|
@ -6,14 +6,14 @@
|
|||
|
||||
(def ethereum-rpc-url "http://localhost:8545")
|
||||
|
||||
(def text-content-type "text/plain")
|
||||
(def content-type-text "text/plain")
|
||||
(def content-type-command "command")
|
||||
(def content-type-command-request "command-request")
|
||||
(def content-type-status "status")
|
||||
(def content-type-emoji "emoji")
|
||||
|
||||
(def desktop-content-types
|
||||
#{text-content-type content-type-emoji})
|
||||
#{content-type-text content-type-emoji})
|
||||
|
||||
(def min-password-length 6)
|
||||
(def max-chat-name-length 20)
|
||||
|
|
|
@ -142,6 +142,16 @@
|
|||
browser/v8
|
||||
dapp-permissions/v9])
|
||||
|
||||
(def v14 [chat/v6
|
||||
transport/v6
|
||||
contact/v1
|
||||
message/v7
|
||||
mailserver/v11
|
||||
user-status/v1
|
||||
local-storage/v1
|
||||
browser/v8
|
||||
dapp-permissions/v9])
|
||||
|
||||
;; put schemas ordered by version
|
||||
(def schemas [{:schema v1
|
||||
:schemaVersion 1
|
||||
|
@ -181,4 +191,7 @@
|
|||
:migration migrations/v12}
|
||||
{:schema v13
|
||||
:schemaVersion 13
|
||||
:migration migrations/v13}])
|
||||
:migration migrations/v13}
|
||||
{:schema v14
|
||||
:schemaVersion 14
|
||||
:migration migrations/v14}])
|
||||
|
|
|
@ -86,3 +86,11 @@
|
|||
|
||||
(defn v13 [old-realm new-realm]
|
||||
(log/debug "migrating v13 account database"))
|
||||
|
||||
(defn v14 [old-realm new-realm]
|
||||
(log/debug "migrating v14 account database")
|
||||
(some-> new-realm
|
||||
(.objects "message")
|
||||
(.filtered (str "content-type = \"command-request\""))
|
||||
(.map (fn [message _ _]
|
||||
(aset message "content-type" "command")))))
|
||||
|
|
|
@ -44,14 +44,36 @@
|
|||
(rep [this {:keys [name profile-image address fcm-token]}]
|
||||
#js [name profile-image address fcm-token]))
|
||||
|
||||
;; It's necessary to support old clients understanding only older, verbose command content (`release/0.9.25` and older)
|
||||
(defn- new->legacy-command-data [{:keys [command-path params] :as content}]
|
||||
(get {["send" #{:personal-chats}] [{:command-ref ["transactor" :command 83 "send"]
|
||||
:command "send"
|
||||
:bot "transactor"
|
||||
:command-scope-bitmask 83}
|
||||
constants/content-type-command]
|
||||
["request" #{:personal-chats}] [{:command-ref ["transactor" :command 83 "request"]
|
||||
:request-command-ref ["transactor" :command 83 "send"]
|
||||
:command "request"
|
||||
:request-command "send"
|
||||
:bot "transactor"
|
||||
:command-scope-bitmask 83
|
||||
:prefill [(get params :asset)
|
||||
(get params :amount)]}
|
||||
constants/content-type-command-request]}
|
||||
command-path))
|
||||
|
||||
(deftype MessageHandler []
|
||||
Object
|
||||
(tag [this v] "c4")
|
||||
(rep [this {:keys [content content-type message-type clock-value timestamp]}]
|
||||
(if (= content-type constants/text-content-type)
|
||||
;; append new content add the end, still pass content the old way at the old index
|
||||
(condp = content-type
|
||||
constants/content-type-text ;; append new content add the end, still pass content the old way at the old index
|
||||
#js [(:text content) content-type message-type clock-value timestamp content]
|
||||
#js [content content-type message-type clock-value timestamp content])))
|
||||
constants/content-type-command ;; handle command compatibility issues
|
||||
(let [[legacy-content legacy-content-type] (new->legacy-command-data content)]
|
||||
#js [(merge content legacy-content) (or legacy-content-type content-type) message-type clock-value timestamp])
|
||||
;; no need for legacy conversions for rest of the content types
|
||||
#js [content content-type message-type clock-value timestamp])))
|
||||
|
||||
(deftype MessagesSeenHandler []
|
||||
Object
|
||||
|
@ -86,15 +108,31 @@
|
|||
;; Reader handlers
|
||||
;;
|
||||
|
||||
(defn- safe-content-parse [content-type content]
|
||||
(def ^:private legacy-ref->new-path
|
||||
{["transactor" :command 83 "send"] ["send" #{:personal-chats}]
|
||||
["transactor" :command 83 "request"] ["request" #{:personal-chats}]})
|
||||
|
||||
(defn- legacy->new-command-content [{:keys [command-path command-ref] :as content}]
|
||||
(if command-path
|
||||
;; `:command-path` set, message produced by newer app version, nothing to do
|
||||
content
|
||||
;; we have to look up `:command-path` based on legacy `:command-ref` value (`release/0.9.25` and older) and assoc it to content
|
||||
(assoc content :command-path (get legacy-ref->new-path command-ref))))
|
||||
|
||||
(defn- legacy->new-message-data [content content-type]
|
||||
;; handling only the text content case
|
||||
(if (= content-type constants/text-content-type)
|
||||
(cond
|
||||
(= content-type constants/content-type-text)
|
||||
(if (and (map? content) (string? (:text content)))
|
||||
;; correctly formatted map
|
||||
content
|
||||
[content content-type]
|
||||
;; create safe `{:text string-content}` value from anything else
|
||||
{:text (str content)})
|
||||
content))
|
||||
[{:text (str content)} content-type])
|
||||
(or (= content-type constants/content-type-command)
|
||||
(= content-type constants/content-type-command-request))
|
||||
[(legacy->new-command-content content) constants/content-type-command]
|
||||
:else
|
||||
[content content-type]))
|
||||
|
||||
;; Here we only need to call the record with the arguments parsed from the clojure datastructures
|
||||
(def reader (transit/reader :json
|
||||
|
@ -106,9 +144,10 @@
|
|||
"c3" (fn [[name profile-image address fcm-token]]
|
||||
(v1.contact/ContactRequestConfirmed. name profile-image address fcm-token))
|
||||
"c4" (fn [[legacy-content content-type message-type clock-value timestamp content]]
|
||||
(v1.protocol/Message. (safe-content-parse content-type (or content legacy-content)) content-type message-type clock-value timestamp))
|
||||
(let [[new-content new-content-type] (legacy->new-message-data (or content legacy-content) content-type)]
|
||||
(v1.protocol/Message. new-content new-content-type message-type clock-value timestamp)))
|
||||
"c7" (fn [[content content-type message-type clock-value timestamp]]
|
||||
(v1.protocol/Message. (safe-content-parse content-type content) content-type message-type clock-value timestamp))
|
||||
(v1.protocol/Message. content content-type message-type clock-value timestamp))
|
||||
"c5" (fn [message-ids]
|
||||
(v1.protocol/MessagesSeen. message-ids))
|
||||
"c6" (fn [[name profile-image address fcm-token]]
|
||||
|
|
|
@ -211,7 +211,7 @@
|
|||
|
||||
(defmulti message-content (fn [_ message _] (message :content-type)))
|
||||
|
||||
(defmethod message-content constants/text-content-type
|
||||
(defmethod message-content constants/content-type-text
|
||||
[wrapper message]
|
||||
[wrapper message [text-message message]])
|
||||
|
||||
|
@ -219,13 +219,6 @@
|
|||
[_ _]
|
||||
[message-content-status])
|
||||
|
||||
;; TODO(janherich) in the future, `content-type-command-request` will be deprecated
|
||||
;; as it's the same thing as command
|
||||
(defmethod message-content constants/content-type-command-request
|
||||
[wrapper message]
|
||||
[wrapper message
|
||||
[message-view message [message-content-command message]]])
|
||||
|
||||
(defmethod message-content constants/content-type-command
|
||||
[wrapper message]
|
||||
[wrapper message
|
||||
|
@ -359,7 +352,7 @@
|
|||
[react/touchable-highlight {:on-press (fn [_]
|
||||
(re-frame/dispatch [:chat.ui/set-chat-ui-props {:messages-focused? true}])
|
||||
(react/dismiss-keyboard!))
|
||||
:on-long-press #(when (= content-type constants/text-content-type)
|
||||
:on-long-press #(when (= content-type constants/content-type-text)
|
||||
(list-selection/chat-message message-id (:text content) (i18n/label :t/message)))}
|
||||
[react/view {:accessibility-label :chat-item}
|
||||
(let [incoming-group (and group-chat (not outgoing))]
|
||||
|
|
|
@ -44,9 +44,7 @@
|
|||
:accessibility-label :chat-message-text}
|
||||
(:text content)]
|
||||
|
||||
(contains? #{constants/content-type-command
|
||||
constants/content-type-command-request}
|
||||
content-type)
|
||||
(= constants/content-type-command content-type)
|
||||
[command-short-preview message]
|
||||
|
||||
:else
|
||||
|
|
Loading…
Reference in New Issue