status-react/src/status_im/data_store/messages.cljs

103 lines
3.6 KiB
Plaintext
Raw Normal View History

(ns status-im.data-store.messages
(:require [re-frame.core :as re-frame]
2017-10-19 13:58:21 +00:00
[status-im.constants :as constants]
[status-im.data-store.realm.core :as core]
2018-10-23 12:27:24 +00:00
[status-im.utils.core :as utils]
[status-im.js-dependencies :as dependencies]))
(defn- transform-message [{:keys [content] :as message}]
(when-let [parsed-content (utils/safe-read-message-content content)]
(-> message
(update :message-type keyword)
(assoc :content parsed-content))))
2018-05-02 16:44:58 +00:00
(defn- get-by-chat-id
([chat-id]
(get-by-chat-id chat-id 0))
([chat-id from]
2018-05-02 16:44:58 +00:00
(let [messages (-> (core/get-by-field @core/account-realm :message :chat-id chat-id)
(core/sorted :timestamp :desc)
(core/page from (+ from constants/default-number-of-messages))
(core/all-clj :message))]
{:all-loaded? (> constants/default-number-of-messages (count messages))
:messages (keep transform-message messages)})))
2018-05-02 16:44:58 +00:00
(defn get-message-id-by-old [old-message-id]
(when-let
[js-message (core/single
(core/get-by-field
@core/account-realm
:message :old-message-id old-message-id))]
(aget js-message "message-id")))
(defn- get-references-by-ids
[message-ids]
(when (seq message-ids)
(keep (fn [{:keys [response-to response-to-v2]}]
(when-let [js-message
(if response-to-v2
(.objectForPrimaryKey @core/account-realm "message" response-to-v2)
(core/single (core/get-by-field
@core/account-realm
:message :old-message-id response-to)))]
(when-let [deserialized-message (-> js-message
(core/realm-obj->clj :message)
transform-message)]
[(or response-to-v2 response-to) deserialized-message])))
message-ids)))
2018-05-02 16:44:58 +00:00
(def default-values
{:to nil})
(re-frame/reg-cofx
:data-store/get-messages
(fn [cofx _]
(assoc cofx :get-stored-messages get-by-chat-id)))
2018-10-23 12:27:24 +00:00
(defn- sha3 [s]
(.sha3 dependencies/Web3.prototype s))
(re-frame/reg-cofx
:data-store/get-referenced-messages
(fn [cofx _]
(assoc cofx :get-referenced-messages get-references-by-ids)))
(defn prepare-content [content]
2017-12-05 13:03:25 +00:00
(if (string? content)
content
2018-09-24 16:27:04 +00:00
(pr-str content)))
2017-12-23 20:27:04 +00:00
(defn- prepare-message [message]
(utils/update-if-present message :content prepare-content))
2017-12-23 20:27:04 +00:00
2018-05-02 16:44:58 +00:00
(defn save-message-tx
"Returns tx function for saving message"
[{:keys [message-id from] :as message}]
(fn [realm]
(core/create realm
:message
(prepare-message (merge default-values
message
{:from (or from "anonymous")}))
true)))
2018-05-02 16:44:58 +00:00
(defn delete-message-tx
"Returns tx function for deleting message"
[message-id]
2018-05-02 16:44:58 +00:00
(fn [realm]
(when-let [message (core/get-by-field realm :message :message-id message-id)]
(core/delete realm message)
(core/delete realm (core/get-by-field realm :user-status :message-id message-id)))))
2018-05-02 16:44:58 +00:00
(defn delete-messages-tx
"Returns tx function for deleting messages with user statuses for given chat-id"
[chat-id]
(fn [realm]
(core/delete realm (core/get-by-field realm :message :chat-id chat-id))
(core/delete realm (core/get-by-field realm :user-status :chat-id chat-id))))
(defn message-exists? [message-id]
(if @core/account-realm
(not (nil? (.objectForPrimaryKey @core/account-realm "message" message-id)))
false))