2022-11-14 18:16:55 +00:00
|
|
|
(ns status-im2.subs.activity-center
|
2022-09-21 14:03:06 +00:00
|
|
|
(:require [re-frame.core :as re-frame]
|
|
|
|
[status-im.utils.datetime :as datetime]
|
|
|
|
[status-im.multiaccounts.core :as multiaccounts]
|
|
|
|
[status-im.constants :as constants]
|
2022-11-07 20:48:33 +00:00
|
|
|
[status-im.activity-center.notification-types :as types]
|
2022-09-21 14:03:06 +00:00
|
|
|
[clojure.string :as string]))
|
|
|
|
|
|
|
|
(re-frame/reg-sub
|
2022-10-10 19:33:42 +00:00
|
|
|
:activity-center/notifications
|
|
|
|
:<- [:activity-center]
|
|
|
|
(fn [activity-center]
|
|
|
|
(:notifications activity-center)))
|
2022-09-21 14:03:06 +00:00
|
|
|
|
|
|
|
(re-frame/reg-sub
|
2022-10-10 19:33:42 +00:00
|
|
|
:activity-center/filter-status
|
|
|
|
:<- [:activity-center]
|
|
|
|
(fn [activity-center]
|
|
|
|
(get-in activity-center [:filter :status])))
|
2022-09-21 14:03:06 +00:00
|
|
|
|
|
|
|
(re-frame/reg-sub
|
2022-10-10 19:33:42 +00:00
|
|
|
:activity-center/filter-type
|
|
|
|
:<- [:activity-center]
|
|
|
|
(fn [activity-center]
|
2022-11-07 20:48:33 +00:00
|
|
|
(get-in activity-center [:filter :type] types/no-type)))
|
2022-09-21 14:03:06 +00:00
|
|
|
|
2022-10-05 17:44:37 +00:00
|
|
|
(re-frame/reg-sub
|
2022-10-10 19:33:42 +00:00
|
|
|
:activity-center/filtered-notifications
|
|
|
|
:<- [:activity-center/filter-type]
|
|
|
|
:<- [:activity-center/filter-status]
|
|
|
|
:<- [:activity-center/notifications]
|
|
|
|
(fn [[filter-type filter-status notifications]]
|
|
|
|
(get-in notifications [filter-type filter-status :data])))
|
2022-10-05 17:44:37 +00:00
|
|
|
|
2022-09-21 14:03:06 +00:00
|
|
|
(re-frame/reg-sub
|
2022-10-10 19:33:42 +00:00
|
|
|
:activity-center/filter-status-unread-enabled?
|
|
|
|
:<- [:activity-center/filter-status]
|
|
|
|
(fn [filter-status]
|
|
|
|
(= :unread filter-status)))
|
2022-09-21 14:03:06 +00:00
|
|
|
|
|
|
|
(defn- group-notifications-by-date
|
|
|
|
[notifications]
|
|
|
|
(->> notifications
|
|
|
|
(group-by #(datetime/timestamp->date-key (:timestamp %)))
|
|
|
|
(sort-by key >)
|
|
|
|
(map (fn [[date-key notifications]]
|
|
|
|
(let [first-notification (first notifications)]
|
|
|
|
{:title (string/capitalize (datetime/day-relative (:timestamp first-notification)))
|
|
|
|
:key date-key
|
|
|
|
:data (sort-by :timestamp > notifications)})))))
|
|
|
|
|
|
|
|
(re-frame/reg-sub
|
|
|
|
:activity.center/notifications-grouped-by-date
|
|
|
|
:<- [:activity.center/notifications]
|
|
|
|
:<- [:contacts/contacts]
|
|
|
|
(fn [[{:keys [notifications]} contacts]]
|
|
|
|
(let [supported-notifications
|
|
|
|
(filter (fn [{:keys [type last-message message]}]
|
2022-11-07 20:48:33 +00:00
|
|
|
(or (and (= types/one-to-one-chat type)
|
2022-09-21 14:03:06 +00:00
|
|
|
(not (nil? last-message)))
|
2022-11-07 20:48:33 +00:00
|
|
|
(and (= types/contact-request type)
|
2022-09-21 14:03:06 +00:00
|
|
|
(not= constants/contact-request-message-state-none
|
|
|
|
(-> contacts
|
|
|
|
(multiaccounts/contact-by-identity (:from message))
|
|
|
|
:contact-request-state)))
|
2022-11-07 20:48:33 +00:00
|
|
|
(= types/contact-request-retracted type)
|
|
|
|
(= types/private-group-chat type)
|
|
|
|
(= types/reply type)
|
|
|
|
(= types/mention type)))
|
2022-09-21 14:03:06 +00:00
|
|
|
notifications)]
|
|
|
|
(group-notifications-by-date
|
|
|
|
(map #(assoc %
|
|
|
|
:timestamp (or (:timestamp %) (:timestamp (or (:message %) (:last-message %))))
|
|
|
|
:contact (multiaccounts/contact-by-identity contacts (get-in % [:message :from])))
|
2022-10-05 17:44:37 +00:00
|
|
|
supported-notifications)))))
|
2022-11-23 13:33:40 +00:00
|
|
|
|
|
|
|
(re-frame/reg-sub
|
|
|
|
:activity.center/notifications-contact-requests
|
|
|
|
:<- [:activity.center/notifications-grouped-by-date]
|
|
|
|
(fn [notifications]
|
|
|
|
(reduce
|
|
|
|
(fn [acc {:keys [data]}]
|
|
|
|
(concat acc (filter #(= 1 (get-in % [:message :contact-request-state])) data)))
|
|
|
|
[]
|
|
|
|
notifications)))
|