|
|
@@ -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);
|