1
0
Эх сурвалжийг харах

TG-8 save scroll position before updating ui

isundil 7 жил өмнө
parent
commit
a53beddd1c
3 өөрчлөгдсөн 181 нэмэгдсэн , 133 устгасан
  1. 46 7
      cli/ui.js
  2. 120 126
      srv/public/mimouchat.min.js
  3. 15 0
      srv/src/message.js

+ 46 - 7
cli/ui.js

@@ -317,6 +317,38 @@ function isSameGroup(group, msg) {
         msg.userId === group.userId;
 }
 
+function getCurrentScrollTopTs(container) {
+    var currentScrollPx = container.scrollTop,
+        msgId = null,
+        idFound = false;
+    idFound = MSG_GROUPS.some(function(group) {
+        for (var i =0, len =group.content.children.length; i < len; ++i) {
+            var item = group.content.children[i];
+            var offsetTop = item.offsetTop +item.parentElement.offsetTop +item.parentElement.parentElement.offsetTop;
+            if (offsetTop > currentScrollPx) {
+                msgId = item.id;
+                return true;
+            }
+        }
+    });
+
+    if (idFound) {
+        var msg = DATA.history[SELECTED_ROOM.id].getMessageByFullId(msgId);
+        if (msg)
+            return msg.ts;
+    }
+}
+
+function scrollToTs(container, ts) {
+    DATA.history[SELECTED_ROOM.id] && DATA.history[SELECTED_ROOM.id].messages.some(function(msg) {
+        if (msg.ts >= ts) {
+            var dom = msg.getDom();
+            container.scrollTop = dom.offsetTop +dom.parentElement.offsetTop +dom.parentElement.parentElement.offsetTop;
+            return true;
+        }
+    });
+}
+
 function onRoomUpdated() {
     var chatFrag = document.getElementById(R.id.currentRoom.content),
         prevMsg = null,
@@ -328,6 +360,7 @@ function onRoomUpdated() {
         document.getElementById(R.id.mainSection).classList.add(R.klass.starred);
     else
         document.getElementById(R.id.mainSection).classList.remove(R.klass.starred);
+    var currentScrollTopTs = getCurrentScrollTopTs(chatFrag);
     DATA.history[SELECTED_ROOM.id] && DATA.history[SELECTED_ROOM.id].messages.forEach(function(msg) {
         var groupDomCreated = false;
         if (MSG_GROUPS[currentGroup]) {
@@ -472,9 +505,17 @@ function onRoomUpdated() {
             MSG_GROUPS[currentGroup].messages.push(msg.id);
         }
     });
-    //TODO scroll lock
-    var content = document.getElementById(R.id.currentRoom.content);
-    content.scrollTop = content.scrollHeight -content.clientHeight;
+    MSG_GROUPS = MSG_GROUPS.filter(function(group) {
+        var result = group && group.messages.length && group.content.children.length;
+        if (!result && group)
+            group.remove();
+        return result;
+    });
+    if (currentScrollTopTs)
+        scrollToTs(chatFrag, currentScrollTopTs);
+    else
+        chatFrag.scrollTop = chatFrag.scrollHeight -chatFrag.clientHeight;
+
     updateTitle();
     if (window.hasFocus)
         markRoomAsRead(SELECTED_ROOM);
@@ -573,8 +614,7 @@ function chatClickDelegate(e) {
 
             messageId = getMessageId(e, target);
             if (messageId && attachmentIndex !== undefined && actionIndex !== undefined) {
-                messageId = messageId.substr(messageId.lastIndexOf("_") +1);
-                msg = DATA.history[SELECTED_ROOM.id].getMessageById(messageId);
+                msg = DATA.history[SELECTED_ROOM.id].getMessageByFullId(messageId);
 
                 if (msg && msg.attachments[attachmentIndex] && msg.attachments[attachmentIndex].actions && msg.attachments[attachmentIndex].actions[actionIndex]) {
                     confirmAction(SELECTED_ROOM.id, msg, msg.attachments[attachmentIndex], msg.attachments[attachmentIndex].actions[actionIndex]);
@@ -584,8 +624,7 @@ function chatClickDelegate(e) {
         }
         if (target.parentElement && target.parentElement.classList.contains(R.klass.msg.hover.container)) {
             if ((messageId = getMessageId(e, target))) {
-                messageId = messageId.substr(messageId.lastIndexOf("_") +1);
-                msg = DATA.history[SELECTED_ROOM.id].getMessageById(messageId);
+                msg = DATA.history[SELECTED_ROOM.id].getMessageByFullId(messageId);
 
                 if (msg)
                     onMsgClicked(target, msg);

Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 120 - 126
srv/public/mimouchat.min.js


+ 15 - 0
srv/src/message.js

@@ -314,6 +314,21 @@ RoomHistory.prototype.getMessageById = function(id) {
     return null;
 };
 
+/**
+ * @param {string} id
+ * @return {Message|null}
+**/
+RoomHistory.prototype.getMessageByFullId = function(id) {
+    if (id.indexOf(this.id) !== 0)
+        return null;
+    id = id.substr(this.id.length +1);
+    for (var i =0, nbMessages = this.messages.length; i < nbMessages; i++) {
+        if (this.messages[i].id == id)
+            return this.messages[i];
+    }
+    return null;
+};
+
 /**
  * @return {Array.<*>}
 **/

Энэ ялгаанд хэт олон файл өөрчлөгдсөн тул зарим файлыг харуулаагүй болно