[#4433] update mac os dock badge label on new messages

Signed-off-by: Dmitry Novotochinov <dmitry.novot@gmail.com>
This commit is contained in:
Dmitry Novotochinov 2018-10-19 23:15:01 +03:00
parent 6063134202
commit 737d44931f
No known key found for this signature in database
GPG Key ID: 43D1DAF5AD39C927
6 changed files with 89 additions and 19 deletions

View File

@ -115,3 +115,7 @@ void DesktopNotification::sendNotification(QString text) {
text, Snore::Icon::defaultIcon()); text, Snore::Icon::defaultIcon());
Snore::SnoreCore::instance().broadcastNotification(notification); Snore::SnoreCore::instance().broadcastNotification(notification);
} }
void DesktopNotification::setDockBadgeLabel(const QString label) {
Snore::SnoreCore::instance().setDockBadgeLabel(label);
}

View File

@ -36,6 +36,7 @@ public:
QVariantMap constantsToExport() override; QVariantMap constantsToExport() override;
Q_INVOKABLE void sendNotification(QString text); Q_INVOKABLE void sendNotification(QString text);
Q_INVOKABLE void setDockBadgeLabel(const QString label);
private: private:
QScopedPointer<DesktopNotificationPrivate> d_ptr; QScopedPointer<DesktopNotificationPrivate> d_ptr;
bool m_appHasFocus = false; bool m_appHasFocus = false;

View File

@ -14,6 +14,8 @@
[status-im.utils.fx :as fx] [status-im.utils.fx :as fx]
[status-im.utils.gfycat.core :as gfycat] [status-im.utils.gfycat.core :as gfycat]
[status-im.utils.utils :as utils] [status-im.utils.utils :as utils]
[status-im.ui.components.colors :as colors]
[status-im.ui.components.react :as react]
[status-im.utils.platform :as platform])) [status-im.utils.platform :as platform]))
(defn multi-user-chat? [cofx chat-id] (defn multi-user-chat? [cofx chat-id]
@ -130,6 +132,23 @@
(when (not (get-in db [:chats chat-id :group-chat])) (when (not (get-in db [:chats chat-id :group-chat]))
(protocol/send (protocol/map->MessagesSeen {:message-ids message-ids}) chat-id cofx))) (protocol/send (protocol/map->MessagesSeen {:message-ids message-ids}) chat-id cofx)))
(defn- unread-messages-number [chats]
(apply + (map (comp count :unviewed-messages) chats)))
(fx/defn update-dock-badge-label
[cofx]
(let [chats (get-in cofx [:db :chats])
active-chats (filter :is-active (vals chats))
private-chats (filter (complement :public?) active-chats)
public-chats (filter :public? active-chats)
private-chats-unread-count (unread-messages-number private-chats)
public-chats-unread-count (unread-messages-number public-chats)
label (cond
(pos? private-chats-unread-count) private-chats-unread-count
(pos? public-chats-unread-count) "•"
:else nil)]
{:set-dock-badge-label label}))
;; TODO (janherich) - ressurect `constants/system` messages for group chats in the future ;; TODO (janherich) - ressurect `constants/system` messages for group chats in the future
(fx/defn mark-messages-seen (fx/defn mark-messages-seen
"Marks all unviewed loaded messages as seen in particular chat" "Marks all unviewed loaded messages as seen in particular chat"
@ -154,7 +173,9 @@
(update-in [:chats chat-id :unviewed-messages] (update-in [:chats chat-id :unviewed-messages]
#(apply disj % loaded-unviewed-ids))) #(apply disj % loaded-unviewed-ids)))
:data-store/tx [(user-statuses-store/save-statuses-tx updated-statuses)]} :data-store/tx [(user-statuses-store/save-statuses-tx updated-statuses)]}
(send-messages-seen chat-id loaded-unviewed-ids)))))) (send-messages-seen chat-id loaded-unviewed-ids)
(when platform/desktop?
(update-dock-badge-label)))))))
(fx/defn preload-chat-data (fx/defn preload-chat-data
"Takes chat-id and coeffects map, returns effects necessary when navigating to chat" "Takes chat-id and coeffects map, returns effects necessary when navigating to chat"
@ -217,3 +238,12 @@
(utils/show-popup nil (utils/show-popup nil
(i18n/label :cooldown/warning-message) (i18n/label :cooldown/warning-message)
#()))) #())))
(defn set-dock-badge-label [label]
"Sets dock badge label (OSX only for now).
Label must be a string. Pass nil or empty string to clear the label."
(.setDockBadgeLabel react/desktop-notification label))
(re-frame/reg-fx
:set-dock-badge-label
set-dock-badge-label)

View File

@ -98,21 +98,23 @@
(get-in db [:account/account :desktop-notifications?]) (get-in db [:account/account :desktop-notifications?])
(< (time/seconds-ago (time/to-date timestamp)) constants/one-earth-day)) (< (time/seconds-ago (time/to-date timestamp)) constants/one-earth-day))
(.sendNotification react/desktop-notification (:text content))) (.sendNotification react/desktop-notification (:text content)))
(let [fx {:db (cond-> (fx/merge cofx
(-> db {:db (cond->
(update-in [:chats chat-id :messages] assoc message-id prepared-message) (-> db
;; this will increase last-clock-value twice when sending our own messages (update-in [:chats chat-id :messages] assoc message-id prepared-message)
(update-in [:chats chat-id :last-clock-value] (partial utils.clocks/receive clock-value))) ;; this will increase last-clock-value twice when sending our own messages
(and (not current-chat?) (update-in [:chats chat-id :last-clock-value] (partial utils.clocks/receive clock-value)))
(not= from (:current-public-key db))) (and (not current-chat?)
(update-in [:chats chat-id :unviewed-messages] (fnil conj #{}) message-id)) (not= from (:current-public-key db)))
:data-store/tx [(messages-store/save-message-tx prepared-message)]}] (update-in [:chats chat-id :unviewed-messages] (fnil conj #{}) message-id))
(if batch? :data-store/tx [(messages-store/save-message-tx prepared-message)]}
fx (when (and platform/desktop?
(fx/merge cofx (not batch?))
fx (chat-model/update-dock-badge-label))
(re-index-message-groups chat-id) (when-not batch?
(chat-loading/group-chat-messages chat-id [message])))))) (re-index-message-groups chat-id))
(when-not batch?
(chat-loading/group-chat-messages chat-id [message])))))
(fx/defn send-message-seen (fx/defn send-message-seen
[cofx chat-id message-id send-seen?] [cofx chat-id message-id send-seen?]
@ -217,7 +219,11 @@
chat-ids) chat-ids)
messages-fx-fns (map #(add-received-message true %) deduped-messages) messages-fx-fns (map #(add-received-message true %) deduped-messages)
groups-fx-fns (map #(update-group-messages chat->message %) chat-ids)] groups-fx-fns (map #(update-group-messages chat->message %) chat-ids)]
(apply fx/merge cofx (concat chats-fx-fns messages-fx-fns groups-fx-fns)))) (apply fx/merge cofx (concat chats-fx-fns
messages-fx-fns
groups-fx-fns
(when platform/desktop?
[(chat-model/update-dock-badge-label)])))))
(defn system-message [{:keys [now] :as cofx} {:keys [clock-value chat-id content from]}] (defn system-message [{:keys [now] :as cofx} {:keys [clock-value chat-id content from]}]
(let [{:keys [last-clock-value]} (get-in cofx [:db :chats chat-id]) (let [{:keys [last-clock-value]} (get-in cofx [:db :chats chat-id])

View File

@ -27,7 +27,8 @@
[status-im.utils.universal-links.core :as universal-links] [status-im.utils.universal-links.core :as universal-links]
[status-im.utils.utils :as utils] [status-im.utils.utils :as utils]
[taoensso.timbre :as log] [taoensso.timbre :as log]
[status-im.utils.fx :as fx])) [status-im.utils.fx :as fx]
[status-im.chat.models :as chat-model]))
(defn init-store! (defn init-store!
"Try to decrypt the database, move on if successful otherwise go back to "Try to decrypt the database, move on if successful otherwise go back to
@ -188,7 +189,9 @@
{:notifications/request-notifications-permissions nil} {:notifications/request-notifications-permissions nil}
(navigation/navigate-to-cofx :home nil) (navigation/navigate-to-cofx :home nil)
(universal-links/process-stored-event) (universal-links/process-stored-event)
(notifications/process-stored-event address))) (notifications/process-stored-event address)
(when platform/desktop?
(chat-model/update-dock-badge-label))))
(defn dev-mode? [cofx] (defn dev-mode? [cofx]
(get-in cofx [:db :account/account :dev-mode?])) (get-in cofx [:db :account/account :dev-mode?]))

View File

@ -253,3 +253,29 @@
(is (= #{"4" "5" "6"} (is (= #{"4" "5" "6"}
(set (get-in (chat/mark-messages-seen {:db test-db} "1-1") (set (get-in (chat/mark-messages-seen {:db test-db} "1-1")
[:shh/post 0 :message :payload :message-ids])))))) [:shh/post 0 :message :payload :message-ids]))))))
(deftest update-dock-badge-label
(testing "When user has unseen private messages"
(is (= {:set-dock-badge-label 3}
(chat/update-dock-badge-label {:db {:chats {"0x0" {:is-active true
:public? false
:unviewed-messages #{1 2 3}}
"status" {:is-active true
:public? true
:unviewed-messages #{1 2}}}}}))))
(testing "When user has unseen public messages and no unseen private messages"
(is (= {:set-dock-badge-label "•"}
(chat/update-dock-badge-label {:db {:chats {"0x0" {:is-active true
:public? false
:unviewed-messages #{}}
"status" {:is-active true
:public? true
:unviewed-messages #{1 2}}}}}))))
(testing "When user has no unseen messages"
(is (= {:set-dock-badge-label nil}
(chat/update-dock-badge-label {:db {:chats {"0x0" {:is-active true
:public? false
:unviewed-messages #{}}
"status" {:is-active true
:public? true
:unviewed-messages #{}}}}})))))