117 lines
3.3 KiB
JavaScript
117 lines
3.3 KiB
JavaScript
// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-v3-or-Later
|
|
|
|
app.views.StreamShortcuts = Backbone.View.extend({
|
|
_headerSize: 60,
|
|
|
|
initialize: function() {
|
|
app.helpers.Shortcuts("keydown", this._onHotkeyDown.bind(this));
|
|
app.helpers.Shortcuts("keyup", this._onHotkeyUp.bind(this));
|
|
},
|
|
|
|
_onHotkeyDown: function(event) {
|
|
// trigger the events based on what key was pressed
|
|
switch (String.fromCharCode( event.which ).toLowerCase()) {
|
|
case "j":
|
|
this.gotoNext();
|
|
break;
|
|
case "k":
|
|
this.gotoPrev();
|
|
break;
|
|
default:
|
|
}
|
|
},
|
|
|
|
_onHotkeyUp: function(event) {
|
|
// trigger the events based on what key was pressed
|
|
switch (String.fromCharCode( event.which ).toLowerCase()) {
|
|
case "c":
|
|
this.commentSelected();
|
|
break;
|
|
case "l":
|
|
this.likeSelected();
|
|
break;
|
|
case "r":
|
|
this.reshareSelected();
|
|
break;
|
|
case "m":
|
|
this.expandSelected();
|
|
break;
|
|
case "o":
|
|
this.openFirstLinkSelected();
|
|
break;
|
|
default:
|
|
}
|
|
},
|
|
|
|
gotoNext: function() {
|
|
// select next post: take the first post under the header
|
|
var streamElements = this.$("div.stream-element.loaded");
|
|
var posUser = window.pageYOffset;
|
|
|
|
for (var i = 0; i < streamElements.length; i++) {
|
|
if (Math.round($(streamElements[i]).offset().top) > posUser + this._headerSize) {
|
|
this.selectPost(streamElements[i]);
|
|
return;
|
|
}
|
|
}
|
|
// standard: last post
|
|
if (streamElements[streamElements.length - 1]) {
|
|
this.selectPost(streamElements[streamElements.length - 1]);
|
|
}
|
|
},
|
|
|
|
gotoPrev: function() {
|
|
// select previous post: take the first post above the header
|
|
var streamElements = this.$("div.stream-element.loaded");
|
|
var posUser = window.pageYOffset;
|
|
|
|
for (var i = streamElements.length - 1; i >= 0; i--) {
|
|
if (Math.round($(streamElements[i]).offset().top) < posUser + this._headerSize) {
|
|
this.selectPost(streamElements[i]);
|
|
return;
|
|
}
|
|
}
|
|
// standard: first post
|
|
if (streamElements[0]) {
|
|
this.selectPost(streamElements[0]);
|
|
}
|
|
},
|
|
|
|
commentSelected: function() {
|
|
this.shortcutSelected().find("a.focus_comment_textarea").click();
|
|
},
|
|
|
|
likeSelected: function() {
|
|
this.shortcutSelected().find("a.like:first").click();
|
|
},
|
|
|
|
reshareSelected: function() {
|
|
this.shortcutSelected().find("a.reshare:first").click();
|
|
},
|
|
|
|
expandSelected: function() {
|
|
this.shortcutSelected().find("div.expander:first").click();
|
|
},
|
|
|
|
shortcutSelected: function() {
|
|
return this.$("div.stream-element.loaded.shortcut_selected");
|
|
},
|
|
|
|
openFirstLinkSelected: function() {
|
|
var link = $("div.collapsible a[target='_blank']:first");
|
|
if(link.length > 0) {
|
|
// click does only work with vanilla javascript
|
|
link[0].click();
|
|
}
|
|
},
|
|
|
|
selectPost: function(element){
|
|
//remove the selection and selected-class from all posts
|
|
this.shortcutSelected().removeClass("shortcut_selected").removeClass("highlighted");
|
|
//move to new post
|
|
window.scrollTo(window.pageXOffset, Math.round($(element).offset().top - this._headerSize));
|
|
//add the selection and selected-class to new post
|
|
element.className+=" shortcut_selected highlighted";
|
|
}
|
|
});
|
|
// @license-end
|