From 268a6546171c6b99a37f8e3af445af1b28dc438c Mon Sep 17 00:00:00 2001 From: hippoz <10706925-hippoz@users.noreply.gitlab.com> Date: Tue, 20 Sep 2022 23:15:27 +0300 Subject: [PATCH] optimize messages list computation --- frontend/src/stores.js | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/frontend/src/stores.js b/frontend/src/stores.js index 3305f87..6594fc1 100644 --- a/frontend/src/stores.js +++ b/frontend/src/stores.js @@ -14,6 +14,10 @@ class Store { this.name = name; } + log(...e) { + return storeLog(`[${this.name}]`, ...e); + } + // like subscribe, but without initially calling the handler watch(handler) { storeLog(`[Watch] (${this.name})`, "handler:", handler); @@ -174,15 +178,18 @@ class MessageStore extends Store { } _recomputeMessages() { + const start = performance.now(); for (let i = 0; i < this.value.length; i++) { this.value[i] = this._processMessage(this.value[i], this.value[i - 1]); } + const delta = performance.now() - start; + this.log(`[_recomputeMessages] Computed ${this.value.length} messages in ${delta}ms`); } _processMessage(message, previous=null) { - message._createdAtDate = new Date(parseInt(message.created_at)); - message._createdAtTimeString = new Intl.DateTimeFormat(getItem("ui:locale"), { hour: "numeric", minute: "numeric" }).format(message._createdAtDate); - message._createdAtDateString = message._createdAtDate.toLocaleDateString(); + message._createdAtDate = message._createdAtDate || new Date(parseInt(message.created_at)); + message._createdAtTimeString = message._createdAtTimeString || new Intl.DateTimeFormat(getItem("ui:locale"), { hour: "numeric", minute: "numeric" }).format(message._createdAtDate); + message._createdAtDateString = message._createdAtDateString || message._createdAtDate.toLocaleDateString(); message._mentions = false; message._editable = false; message._clumped = false; @@ -196,7 +203,7 @@ class MessageStore extends Store { if (previous && (message._createdAtDate.getTime() - previous._createdAtDate.getTime()) <= 100 * 1000 && message.author_id === previous.author_id) { message._clumped = true; } - if (!previous || (previous._createdAtDateString !== message._createdAtDateString)) { + if (!previous || (previous._createdAtDateString !== message._createdAtDateString && !message._aboveDateMarker)) { message._aboveDateMarker = new Intl.DateTimeFormat(getItem("ui:locale"), { month: "long", day: "numeric", year: "numeric" }).format(message._createdAtDate); } return message;