do not render not active screen

Signed-off-by: andrey <motor4ik@gmail.com>
This commit is contained in:
andrey 2021-04-12 11:25:52 +02:00
parent 5eed7bd560
commit f6e480344d
No known key found for this signature in database
GPG Key ID: 89B67245FD2F0272
3 changed files with 104 additions and 51 deletions

View File

@ -940,7 +940,7 @@
(empty? messages))) (empty? messages)))
(re-frame/reg-sub (re-frame/reg-sub
:chats/chat-messages-stream :chats/raw-chat-messages-stream
(fn [[_ chat-id] _] (fn [[_ chat-id] _]
[(re-frame/subscribe [:chats/message-list chat-id]) [(re-frame/subscribe [:chats/message-list chat-id])
(re-frame/subscribe [:chats/chat-messages chat-id]) (re-frame/subscribe [:chats/chat-messages chat-id])
@ -955,13 +955,49 @@
(hydrate-messages messages) (hydrate-messages messages)
(chat.db/add-gaps messages-gaps range all-loaded? public?)))) (chat.db/add-gaps messages-gaps range all-loaded? public?))))
;;we want to keep data unchanged so react doesn't change component when we leave screen
(def memo-chat-messages-stream (atom nil))
(re-frame/reg-sub
:chats/chat-messages-stream
(fn [[_ chat-id] _]
[(re-frame/subscribe [:chats/raw-chat-messages-stream chat-id])
(re-frame/subscribe [:view-id])])
(fn [[messages view-id]]
(if (= view-id :chat)
(do
(reset! memo-chat-messages-stream messages)
messages)
@memo-chat-messages-stream)))
(def memo-profile-messages-stream (atom nil))
(re-frame/reg-sub
:chats/profile-messages-stream
(fn [[_ chat-id] _]
[(re-frame/subscribe [:chats/raw-chat-messages-stream chat-id])
(re-frame/subscribe [:view-id])])
(fn [[messages view-id]]
(if (= view-id :profile)
(do
(reset! memo-profile-messages-stream messages)
messages)
@memo-profile-messages-stream)))
(def memo-timeline-messages-stream (atom nil))
(re-frame/reg-sub (re-frame/reg-sub
:chats/timeline-messages-stream :chats/timeline-messages-stream
:<- [:chats/message-list constants/timeline-chat-id] :<- [:chats/message-list constants/timeline-chat-id]
:<- [:chats/chat-messages constants/timeline-chat-id] :<- [:chats/chat-messages constants/timeline-chat-id]
(fn [[message-list messages]] :<- [:view-id]
(-> (models.message-list/->seq message-list) (fn [[message-list messages view-id]]
(hydrate-messages messages)))) (if (= view-id :status)
(let [res (-> (models.message-list/->seq message-list)
(hydrate-messages messages))]
(reset! memo-timeline-messages-stream res)
res)
@memo-timeline-messages-stream)))
(re-frame/reg-sub (re-frame/reg-sub
:chats/current-profile-chat :chats/current-profile-chat
@ -1281,29 +1317,44 @@
(fn [[{:keys [:stickers/recent-stickers]} packs]] (fn [[{:keys [:stickers/recent-stickers]} packs]]
(map (fn [hash] {:hash hash :pack (find-pack-id-for-hash hash packs)}) recent-stickers))) (map (fn [hash] {:hash hash :pack (find-pack-id-for-hash hash packs)}) recent-stickers)))
;;HOME ==============================================================================================================
(def memo-home-items (atom nil))
(re-frame/reg-sub (re-frame/reg-sub
:home-items :home-items
:<- [:search/home-filter] :<- [:search/home-filter]
:<- [:search/filtered-chats] :<- [:search/filtered-chats]
:<- [:communities/communities] :<- [:communities/communities]
(fn [[search-filter filtered-chats communities]] :<- [:view-id]
(let [communities-count (count communities) (fn [[search-filter filtered-chats communities view-id]]
chats-count (count filtered-chats) (if (= view-id :home)
;; If we have both communities & chats we want to display (let [communities-count (count communities)
;; a separator between them chats-count (count filtered-chats)
;; If we have both communities & chats we want to display
;; a separator between them
communities-with-separator (if (and (pos? communities-count) communities-with-separator (if (and (pos? communities-count)
(pos? chats-count)) (pos? chats-count))
(update communities (update communities
(dec communities-count) (dec communities-count)
assoc :last? true) assoc :last? true)
communities)] communities)
{:search-filter search-filter res {:search-filter search-filter
:items (concat communities-with-separator filtered-chats)}))) :items (concat communities-with-separator filtered-chats)}]
(reset! memo-home-items res)
res)
;;we want to keep data unchanged so react doesn't change component when we leave screen
@memo-home-items)))
(re-frame/reg-sub
:hide-home-tooltip?
:<- [:multiaccount]
(fn [multiaccount]
(:hide-home-tooltip? multiaccount)))
;;PAIRING ============================================================================================================== ;;PAIRING ==============================================================================================================
(re-frame/reg-sub (re-frame/reg-sub
:pairing/installations :pairing/installations
:<- [:get-pairing-installations] :<- [:get-pairing-installations]
@ -1316,7 +1367,7 @@
(re-frame/reg-sub (re-frame/reg-sub
:pairing/installation-id :pairing/installation-id
:<- [:multiaccount] :<- [:multiaccount]
:installation-id) (fn [multiaccount] (:installation-id multiaccount)))
(re-frame/reg-sub (re-frame/reg-sub
:pairing/installation-name :pairing/installation-name

View File

@ -151,39 +151,41 @@
[inner-item/home-list-item home-item] [inner-item/home-list-item home-item]
[communities.views/community-home-list-item home-item])) [communities.views/community-home-list-item home-item]))
(defn communities-and-chats [items loading? search-filter hide-home-tooltip?] (defn chat-list-key-fn [item]
[:<> (or (:chat-id item) (:id item)))
[connectivity/loading-indicator]
(if loading? (views/defview communities-and-chats []
[react/view {:flex 1 :align-items :center :justify-content :center} (views/letsubs [{:keys [items search-filter]} [:home-items]
[react/activity-indicator {:animating true}]] hide-home-tooltip? [:hide-home-tooltip?]]
(if (and (empty? items) (if (and (empty? items)
(empty? search-filter) (empty? search-filter)
hide-home-tooltip? hide-home-tooltip?
(not @search-active?)) (not @search-active?))
[welcome-blank-page] [welcome-blank-page]
[list/flat-list [list/flat-list
{:key-fn #(or (:chat-id %) (:id %)) {:key-fn chat-list-key-fn
:keyboard-should-persist-taps :always :keyboard-should-persist-taps :always
:data items :data items
:render-fn render-fn :render-fn render-fn
:header [:<> :header [:<>
(when (or (seq items) @search-active? (seq search-filter)) (when (or (seq items) @search-active? (seq search-filter))
[search-input-wrapper search-filter items]) [search-input-wrapper search-filter items])
[referral-item/list-item] [referral-item/list-item]
(when (and (empty? items) (when (and (empty? items)
(or @search-active? (seq search-filter))) (or @search-active? (seq search-filter)))
[start-suggestion search-filter])] [start-suggestion search-filter])]
:footer (if (and (not hide-home-tooltip?) (not @search-active?)) :footer (if (and (not hide-home-tooltip?) (not @search-active?))
[home-tooltip-view] [home-tooltip-view]
[react/view {:height 68}])}]))]) [react/view {:height 68}])}])))
(views/defview chats-list [] (views/defview chats-list []
(views/letsubs [loading? [:chats/loading?] (views/letsubs [loading? [:chats/loading?]]
{:keys [items [:<>
search-filter]} [:home-items] [connectivity/loading-indicator]
{:keys [hide-home-tooltip?]} [:multiaccount]] (if loading?
[communities-and-chats items loading? search-filter hide-home-tooltip?])) [react/view {:flex 1 :align-items :center :justify-content :center}
[react/activity-indicator {:animating true}]]
[communities-and-chats])]))
(views/defview plus-button [] (views/defview plus-button []
(views/letsubs [logging-in? [:multiaccounts/login]] (views/letsubs [logging-in? [:multiaccounts/login]]

View File

@ -158,7 +158,7 @@
(defn profile [] (defn profile []
(let [{:keys [public-key name ens-verified] :as contact} @(re-frame/subscribe [:contacts/current-contact]) (let [{:keys [public-key name ens-verified] :as contact} @(re-frame/subscribe [:contacts/current-contact])
current-chat-id @(re-frame/subscribe [:chats/current-profile-chat]) current-chat-id @(re-frame/subscribe [:chats/current-profile-chat])
messages @(re-frame/subscribe [:chats/chat-messages-stream current-chat-id]) messages @(re-frame/subscribe [:chats/profile-messages-stream current-chat-id])
no-messages? @(re-frame/subscribe [:chats/chat-no-messages? current-chat-id]) no-messages? @(re-frame/subscribe [:chats/chat-no-messages? current-chat-id])
muted? (:muted @(re-frame/subscribe [:chats/chat public-key])) muted? (:muted @(re-frame/subscribe [:chats/chat public-key]))
[first-name second-name] (multiaccounts/contact-two-names contact true) [first-name second-name] (multiaccounts/contact-two-names contact true)