var helperFunctions = { scrollContent: function(direction) { var padding = 40 var scroll = document.querySelector('.content') if (!scroll) return var height = scroll.getBoundingClientRect().height var newpos = scroll.scrollTop + (height - padding) * direction if (typeof scroll.scrollTo == 'function') { scroll.scrollTo({top: newpos, left: 0, behavior: 'smooth'}) } else { scroll.scrollTop = newpos } } } var shortcutFunctions = { openItemLink: function() { if (vm.itemSelectedDetails && vm.itemSelectedDetails.link) { window.open(vm.itemSelectedDetails.link, '_blank', 'noopener,noreferrer') } }, toggleReadability: function() { vm.toggleReadability() }, toggleItemRead: function() { if (vm.itemSelected != null) { vm.toggleItemRead(vm.itemSelectedDetails) } }, markAllRead: function() { // same condition as 'Mark all read button' if (vm.filterSelected == 'unread'){ vm.markItemsRead() } }, toggleItemStarred: function() { if (vm.itemSelected != null) { vm.toggleItemStarred(vm.itemSelectedDetails) } }, focusSearch: function() { document.getElementById("searchbar").focus() }, nextItem(){ vm.navigateToItem(+1) }, previousItem() { vm.navigateToItem(-1) }, nextFeed(){ vm.navigateToFeed(+1) }, previousFeed() { vm.navigateToFeed(-1) }, scrollForward: function() { helperFunctions.scrollContent(+1) }, scrollBackward: function() { helperFunctions.scrollContent(-1) }, showAll() { vm.filterSelected = '' }, showUnread() { vm.filterSelected = 'unread' }, showStarred() { vm.filterSelected = 'starred' }, } // If you edit, make sure you update the help modal var keybindings = { "o": shortcutFunctions.openItemLink, "i": shortcutFunctions.toggleReadability, "r": shortcutFunctions.toggleItemRead, "R": shortcutFunctions.markAllRead, "s": shortcutFunctions.toggleItemStarred, "/": shortcutFunctions.focusSearch, "j": shortcutFunctions.nextItem, "k": shortcutFunctions.previousItem, "l": shortcutFunctions.nextFeed, "h": shortcutFunctions.previousFeed, "f": shortcutFunctions.scrollForward, "b": shortcutFunctions.scrollBackward, "1": shortcutFunctions.showUnread, "2": shortcutFunctions.showStarred, "3": shortcutFunctions.showAll, } var codebindings = { "KeyO": shortcutFunctions.openItemLink, "KeyI": shortcutFunctions.toggleReadability, //"r": shortcutFunctions.toggleItemRead, //"KeyR": shortcutFunctions.markAllRead, "KeyS": shortcutFunctions.toggleItemStarred, "Slash": shortcutFunctions.focusSearch, "KeyJ": shortcutFunctions.nextItem, "KeyK": shortcutFunctions.previousItem, "KeyL": shortcutFunctions.nextFeed, "KeyH": shortcutFunctions.previousFeed, "KeyF": shortcutFunctions.scrollForward, "KeyB": shortcutFunctions.scrollBackward, "Digit1": shortcutFunctions.showUnread, "Digit2": shortcutFunctions.showStarred, "Digit3": shortcutFunctions.showAll, } function isTextBox(element) { var tagName = element.tagName.toLowerCase() // Input elements that aren't text var inputBlocklist = ['button','checkbox','color','file','hidden','image','radio','range','reset','search','submit'] return tagName === 'textarea' || ( tagName === 'input' && inputBlocklist.indexOf(element.getAttribute('type').toLowerCase()) == -1 ) } document.addEventListener('keydown',function(event) { // Ignore while focused on text or // when using modifier keys (to not clash with browser behaviour) if (isTextBox(event.target) || event.metaKey || event.ctrlKey || event.altKey) { return } var keybindFunction = keybindings[event.key] || codebindings[event.code] if (keybindFunction) { event.preventDefault() keybindFunction() } })