Skip to content

Commit ee1c31c

Browse files
committed
Implements infinite scrolling
- Implements infinite scrolling by binding to the scroll method - Changes pagination from a clickable div to a nice looking spinner when loading messages - Adds silence_mentions to make sure mentions are not fired when loading old messages - When pulling old messages we do not navigate to oldest message anymore - Fixes #186 - Fixes #180
1 parent d3d6cde commit ee1c31c

File tree

5 files changed

+47
-26
lines changed

5 files changed

+47
-26
lines changed

app/assets/javascripts/backbone/views/channel_pane.js.coffee

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,16 @@ class Kandan.Views.ChannelPane extends Backbone.View
44
render: (container)->
55
$container = $(container || @el)
66
$container.html @paginatedActivitiesView()
7+
8+
# Flag to avoid pulling new messages when we already requested new messages from the server
9+
@loading_new_messages = false
10+
11+
$container.bind 'scroll', ()=>
12+
if $container.scrollTop() <= 100 && !@loading_new_messages
13+
@loading_new_messages = true
14+
@loadMoreActivities($container)
15+
return
16+
717
$container.append @chatboxView()
818
@setIdAndData($container)
919
$li = $("a[href=#channels-#{@options.channel.get('id')}]").parent()
@@ -27,3 +37,31 @@ class Kandan.Views.ChannelPane extends Backbone.View
2737
chatboxView: ()->
2838
view = new Kandan.Views.Chatbox({channel: @options.channel})
2939
view.render().el
40+
41+
loadMoreActivities: ($container)->
42+
$channel_activities = $container.find(".channel-activities")
43+
44+
# Keeping a reference of the first child to find the offset after the elements are added
45+
$current_top_element = $channel_activities.children().first()
46+
47+
$pagination = $container.find(".pagination")
48+
oldest = $pagination.data("oldest")
49+
50+
activities = new Kandan.Collections.Activities([], {channel_id: @options.channel.get("id")})
51+
activities.fetch({
52+
data: { oldest: oldest },
53+
success: (collection)=>
54+
for activity in collection.models.reverse()
55+
activityView = new Kandan.Views.ShowActivity({activity: activity, silence_mentions: true})
56+
$container.find(".channel-activities").prepend(activityView.render().el)
57+
58+
$container.scrollTop($current_top_element.offset().top)
59+
60+
Kandan.Helpers.Channels.setPaginationState(
61+
collection.channelId,
62+
collection.moreActivities,
63+
_.last(collection.models).get("id")
64+
)
65+
66+
@loading_new_messages = false
67+
})

app/assets/javascripts/backbone/views/paginated_activities.js.coffee

Lines changed: 0 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -4,17 +4,13 @@ class Kandan.Views.PaginatedActivities extends Backbone.View
44
className: 'paginated-activities'
55
template: JST['paginated_activities']
66

7-
events:
8-
"click .pagination": "loadMoreActivities"
9-
107
setPagination: ()->
118
oldestActivityId = 0
129
if @channel.activities and @channel.activities.models.length > 0
1310
oldestActivityId = _.first(@channel.activities.models).get("id")
1411

1512
$(@el).find(".pagination").data("oldest", oldestActivityId)
1613

17-
1814
render: ()->
1915
@channel = @options.channel
2016
$(@el).html @template()
@@ -24,21 +20,3 @@ class Kandan.Views.PaginatedActivities extends Backbone.View
2420
listActivitiesView = new Kandan.Views.ListActivities({channel: @channel})
2521
$(@el).append listActivitiesView.render().el
2622
@
27-
28-
29-
loadMoreActivities: ()->
30-
oldest = $(@el).find(".pagination").data("oldest")
31-
activities = new Kandan.Collections.Activities([], {channel_id: @channel.get("id")})
32-
activities.fetch({
33-
data: { oldest: oldest },
34-
success: (collection)=>
35-
for activity in collection.models.reverse()
36-
activityView = new Kandan.Views.ShowActivity({activity: activity})
37-
$(@el).find(".channel-activities").prepend(activityView.render().el)
38-
39-
Kandan.Helpers.Channels.setPaginationState(
40-
collection.channelId,
41-
collection.moreActivities,
42-
_.last(collection.models).get("id")
43-
)
44-
})

app/assets/javascripts/backbone/views/show_activity.js.coffee

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,8 @@ class Kandan.Views.ShowActivity extends Backbone.View
2323
if activity.user.id == Kandan.Helpers.Users.currentUser().id
2424
$(@el).addClass("current_user")
2525

26-
if user_mention_regex.test(@compiledTemplate) || all_mention_regex.test(@compiledTemplate)
26+
# Only fire mentions if we are not loading old messages
27+
if !@options.silence_mentions && (user_mention_regex.test(@compiledTemplate) || all_mention_regex.test(@compiledTemplate))
2728
$(@el).addClass("mentioned_user")
2829
Kandan.Plugins.Notifications?.playAudioNotification('attention')
2930

app/assets/stylesheets/_chat_area.sass

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -114,8 +114,12 @@ html body .ui-tabs .ui-tabs-nav li
114114
min-height: 110%
115115
padding-bottom: 0px
116116
.pagination
117-
text-decoration: underline
118-
cursor: pointer
117+
text-align: center
118+
font-size: 14px
119+
span
120+
position: relative
121+
top: -6px
122+
left: 10px
119123
.channel-activities
120124
width: 100%
121125

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
<div class="pagination">previous messages</div>
1+
<div class="pagination"><i class="icon-spinner icon-spin icon-2x"></i><span>Loading previous messages</span></div>

0 commit comments

Comments
 (0)