status-mobile/src/status_im/data_store/user_statuses.cljs

47 lines
1.5 KiB
Clojure

(ns status-im.data-store.user-statuses
(:require [clojure.string :as string]
[re-frame.core :as re-frame]
[status-im.data-store.realm.core :as core]))
(defn- prepare-statuses [statuses]
(reduce (fn [acc {:keys [message-id public-key] :as user-status}]
(assoc-in acc
[message-id public-key]
(-> user-status
(update :status keyword)
(dissoc :status-id))))
{}
statuses))
(defn- get-by-chat-and-messages-ids
[chat-id message-ids]
(-> @core/account-realm
(.objects "user-status")
(.filtered (str "chat-id=\"" chat-id "\""
(when (seq message-ids)
(str " and (" (core/in-query "message-id" message-ids) ")"))))
(core/all-clj :user-status)
prepare-statuses))
(re-frame/reg-cofx
:data-store/get-user-statuses
(fn [cofx _]
(assoc cofx :get-stored-user-statuses get-by-chat-and-messages-ids)))
(defn- compute-status-id [{:keys [message-id public-key]}]
(str message-id "-" public-key))
(defn save-status-tx
"Returns tx function for saving message user status"
[user-status]
(fn [realm]
(let [status-id (compute-status-id user-status)]
(core/create realm :user-status (assoc user-status :status-id status-id) true))))
(defn save-statuses-tx
"Returns tx function for saving message user statuses"
[user-statuses]
(fn [realm]
(doseq [user-status user-statuses]
((save-status-tx user-status) realm))))