mirror of
https://github.com/status-im/status-mobile.git
synced 2025-01-28 01:16:50 +00:00
[performance] limit number of rendered messages when open a chat
This commit is contained in:
parent
d640b4c87c
commit
932ef27ee8
@ -29,7 +29,8 @@
|
|||||||
[status-im.utils.platform :as platform]
|
[status-im.utils.platform :as platform]
|
||||||
[status-im.utils.utils :as utils]
|
[status-im.utils.utils :as utils]
|
||||||
[status-im.utils.datetime :as datetime]
|
[status-im.utils.datetime :as datetime]
|
||||||
[status-im.ui.screens.chat.message.gap :as gap])
|
[status-im.ui.screens.chat.message.gap :as gap]
|
||||||
|
[reagent.core :as reagent])
|
||||||
(:require-macros [status-im.utils.views :refer [defview letsubs]]))
|
(:require-macros [status-im.utils.views :refer [defview letsubs]]))
|
||||||
|
|
||||||
(defn add-contact-bar [public-key]
|
(defn add-contact-bar [public-key]
|
||||||
@ -153,7 +154,8 @@
|
|||||||
(letsubs [intro-status [:chats/current-chat-intro-status]
|
(letsubs [intro-status [:chats/current-chat-intro-status]
|
||||||
height [:chats/content-layout-height]
|
height [:chats/content-layout-height]
|
||||||
input-height [:chats/current-chat-ui-prop :input-height]
|
input-height [:chats/current-chat-ui-prop :input-height]
|
||||||
{:keys [:lowest-request-from :highest-request-to]} [:chats/range]]
|
{:keys [:lowest-request-from :highest-request-to]} [:chats/range]
|
||||||
|
all-loaded? [:chats/all-loaded?]]
|
||||||
(let [icon-text (if public? chat-id name)
|
(let [icon-text (if public? chat-id name)
|
||||||
intro-name (if public? chat-name name)]
|
intro-name (if public? chat-name name)]
|
||||||
;; TODO This when check ought to be unnecessary but for now it prevents
|
;; TODO This when check ought to be unnecessary but for now it prevents
|
||||||
@ -237,12 +239,32 @@
|
|||||||
|
|
||||||
(defonce messages-list-ref (atom nil))
|
(defonce messages-list-ref (atom nil))
|
||||||
|
|
||||||
|
(def ^:const initial-limit 5)
|
||||||
|
(def ^:const second-initial-limit-step 6)
|
||||||
|
(def second-limit (+ initial-limit second-initial-limit-step))
|
||||||
|
(def ^:const third-initial-limit-step 11)
|
||||||
|
(def ^:const default-limit-step 20)
|
||||||
|
(def ^:const initial-threshold 0.5)
|
||||||
|
(def ^:const default-threshold 2)
|
||||||
|
|
||||||
|
(defonce messages-limit (reagent/atom initial-limit))
|
||||||
|
|
||||||
|
(defn increment-limit [lim]
|
||||||
|
(+ lim
|
||||||
|
(case lim
|
||||||
|
initial-limit second-initial-limit-step
|
||||||
|
second-limit third-initial-limit-step
|
||||||
|
default-limit-step)))
|
||||||
|
|
||||||
(defview messages-view
|
(defview messages-view
|
||||||
[{:keys [group-chat chat-id pending-invite-inviter-name] :as chat}
|
[{:keys [group-chat chat-id pending-invite-inviter-name] :as chat}
|
||||||
modal?]
|
modal?]
|
||||||
(letsubs [messages [:chats/current-chat-messages-stream]
|
(letsubs [messages [:chats/current-chat-messages-stream]
|
||||||
current-public-key [:account/public-key]]
|
current-public-key [:account/public-key]]
|
||||||
{:component-did-mount
|
{:component-will-mount
|
||||||
|
(fn []
|
||||||
|
(reset! messages-limit initial-limit))
|
||||||
|
:component-did-mount
|
||||||
(fn [args]
|
(fn [args]
|
||||||
(when-not (:messages-initialized? (second (.-argv (.-props args))))
|
(when-not (:messages-initialized? (second (.-argv (.-props args))))
|
||||||
(re-frame/dispatch [:chat.ui/load-more-messages]))
|
(re-frame/dispatch [:chat.ui/load-more-messages]))
|
||||||
@ -250,8 +272,12 @@
|
|||||||
{:messages-focused? true
|
{:messages-focused? true
|
||||||
:input-focused? false}]))}
|
:input-focused? false}]))}
|
||||||
(let [no-messages (empty? messages)
|
(let [no-messages (empty? messages)
|
||||||
|
m-limit @messages-limit
|
||||||
|
threshold (if (= m-limit initial-limit)
|
||||||
|
initial-threshold
|
||||||
|
default-threshold)
|
||||||
flat-list-conf
|
flat-list-conf
|
||||||
{:data messages
|
{:data (take m-limit messages)
|
||||||
:ref #(reset! messages-list-ref %)
|
:ref #(reset! messages-list-ref %)
|
||||||
:footer [chat-intro-header-container chat no-messages]
|
:footer [chat-intro-header-container chat no-messages]
|
||||||
:key-fn #(or (:message-id %) (:value %))
|
:key-fn #(or (:message-id %) (:value %))
|
||||||
@ -264,9 +290,12 @@
|
|||||||
:idx idx
|
:idx idx
|
||||||
:list-ref messages-list-ref}])
|
:list-ref messages-list-ref}])
|
||||||
:inverted true
|
:inverted true
|
||||||
:onEndReached #(re-frame/dispatch
|
:onEndReachedThreshold threshold
|
||||||
[:chat.ui/load-more-messages])
|
:onEndReached (fn []
|
||||||
:enableEmptySections true
|
(swap! messages-limit increment-limit)
|
||||||
|
(when (> @messages-limit (count messages))
|
||||||
|
(re-frame/dispatch
|
||||||
|
[:chat.ui/load-more-messages])))
|
||||||
:keyboardShouldPersistTaps :handled}
|
:keyboardShouldPersistTaps :handled}
|
||||||
group-header {:header [group-chat-footer chat-id]}]
|
group-header {:header [group-chat-footer chat-id]}]
|
||||||
(if pending-invite-inviter-name
|
(if pending-invite-inviter-name
|
||||||
|
Loading…
x
Reference in New Issue
Block a user