diaspora/app/assets/javascripts/app/views/contact_stream_view.js
2017-03-06 21:11:47 +01:00

79 lines
2.2 KiB
JavaScript

// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-v3-or-Later
app.views.ContactStream = Backbone.View.extend({
initialize: function(opts) {
this.page = 1;
var throttledScroll = _.throttle(_.bind(this.infScroll, this), 200);
$(window).scroll(throttledScroll);
this.on("fetchContacts", this.fetchContacts, this);
this.urlParams = opts.urlParams;
},
render: function() {
this.fetchContacts();
},
fetchContacts: function() {
this.$el.addClass("loading");
$("#paginate .loader").removeClass("hidden");
$.ajax(this._fetchUrl(), {
context: this
}).done(function(response) {
if (response.length === 0) {
this.onEmptyResponse();
} else {
this.appendContactViews(response);
this.page++;
}
});
},
_fetchUrl: function() {
var url = Routes.contacts({format: "json", page: this.page});
if (this.urlParams) {
url += "&" + this.urlParams;
}
return url;
},
onEmptyResponse: function() {
if (this.collection.length === 0) {
var content = document.createDocumentFragment();
content = "<div id='no_contacts' class='well'>" +
" <h4>" +
Diaspora.I18n.t("contacts.search_no_results") +
" </h4>" +
"</div>";
this.$el.html(content);
}
this.off("fetchContacts");
this.$el.removeClass("loading");
$("#paginate .loader").addClass("hidden");
},
appendContactViews: function(contacts) {
var content = document.createDocumentFragment();
contacts.forEach(function(contactData) {
var contact = new app.models.Contact(contactData);
this.collection.add(contact);
var view = new app.views.Contact({model: contact});
content.appendChild(view.render().el);
}.bind(this));
this.$el.append(content);
this.$el.removeClass("loading");
$("#paginate .loader").addClass("hidden");
},
infScroll: function() {
if (this.$el.hasClass("loading")) {
return;
}
var distanceTop = $(window).height() + $(window).scrollTop(),
distanceBottom = $(document).height() - distanceTop;
if (distanceBottom < 300) {
this.trigger("fetchContacts");
}
}
});
// @license-end