Commit 43f488516048e407091d1c25baae60fa198b3257

Authored by Rodrigo Souto
1 parent 892e21db

Chat scrollback

app/controllers/public/chat_controller.rb
... ... @@ -51,7 +51,7 @@ class ChatController < PublicController
51 51 messages = ChatMessage.where('(to_id=:other and from_id=:me) or (to_id=:me and from_id=:other)', {:me => user.id, :other => other.id})
52 52 end
53 53  
54   - messages = messages.order('created_at DESC').includes(:to, :from).limit(20)
  54 + messages = messages.order('created_at DESC').includes(:to, :from).offset(params[:offset]).limit(20)
55 55 messages_json = messages.map do |message|
56 56 {
57 57 :body => message.body,
... ...
public/javascripts/chat.js
... ... @@ -116,13 +116,19 @@ jQuery(function($) {
116 116 return body;
117 117 },
118 118  
119   - show_message: function (jid, name, body, who, identifier, time) {
  119 + show_message: function (jid, name, body, who, identifier, time, offset) {
120 120 if (body) {
121 121 body = Jabber.render_body_message(body);
122 122 var jid_id = Jabber.jid_to_id(jid);
123 123 var tab_id = '#' + Jabber.conversation_prefix + jid_id;
124   - if ($(tab_id).find('.message').length > 0 && $(tab_id).find('.message:last').attr('data-who') == who) {
125   - $(tab_id).find('.history').find('.message:last .content').append('<p>' + body + '</p>');
  124 + var history = $(tab_id).find('.history');
  125 +
  126 + var offset_container = $('#chat-offset-container-'+offset);
  127 + if(offset_container.length == 0)
  128 + offset_container = $('<div id="chat-offset-container-'+offset+'"></div>').prependTo(history);
  129 +
  130 + if (offset_container.find('.message:last').attr('data-who') == who) {
  131 + offset_container.find('.message:last .content').append('<p>' + body + '</p>');
126 132 }
127 133 else {
128 134 if (time==undefined) {
... ... @@ -134,10 +140,11 @@ jQuery(function($) {
134 140 .replace('%{time}', time)
135 141 .replace('%{name}', name)
136 142 .replace('%{avatar}', getAvatar(identifier));
137   - $('#' + Jabber.conversation_prefix + jid_id).find('.history').append(message_html);
  143 + offset_container.append(message_html);
138 144 $(".message span.time").timeago();
139 145 }
140   - $(tab_id).find('.history').scrollTo({top:'100%', left:'0%'});
  146 + if(offset == 0) history.scrollTo({top:'100%', left:'0%'});
  147 + else history.scrollTo(offset_container.height());
141 148 if (who != "self") {
142 149 if ($(tab_id).find('.history:visible').length == 0) {
143 150 count_unread_messages(jid_id);
... ... @@ -568,6 +575,13 @@ jQuery(function($) {
568 575 panel.find('.chat-target .other-name').html(title);
569 576 $('#chat .history').perfectScrollbar();
570 577  
  578 + panel.find('.history').scroll(function(){
  579 + if($(this).scrollTop() == 0){
  580 + var offset = panel.find('.message').size();
  581 + recent_messages(jid, offset);
  582 + }
  583 + });
  584 +
571 585 var textarea = panel.find('textarea');
572 586 textarea.attr('name', panel.id);
573 587  
... ... @@ -581,10 +595,9 @@ jQuery(function($) {
581 595 return panel;
582 596 }
583 597  
584   - function recent_messages(jid) {
585   - $.getJSON('/chat/recent_messages', {
586   - identifier: getIdentifier(jid)
587   - }, function(data) {
  598 + function recent_messages(jid, offset) {
  599 + if(!offset) offset = 0;
  600 + $.getJSON('/chat/recent_messages', {identifier: getIdentifier(jid), offset: offset}, function(data) {
588 601 $.each(data, function(i, message) {
589 602 var body = message['body'];
590 603 var from = message['from'];
... ... @@ -592,7 +605,7 @@ jQuery(function($) {
592 605 var date = message['created_at'];
593 606 var who = from['id']==getCurrentIdentifier() ? 'self' : from['id']
594 607  
595   - Jabber.show_message(jid, from['name'], body, who, from['id'], date);
  608 + Jabber.show_message(jid, from['name'], body, who, from['id'], date, offset);
596 609 });
597 610 });
598 611 }
... ...