glowing-bear/js/plugin-directive.js

87 lines
2.9 KiB
JavaScript

(function() {
'use strict';
var weechat = angular.module('weechat');
weechat.directive('plugin', ['$rootScope', 'settings', function($rootScope, settings) {
/*
* Plugin directive
* Shows additional plugin content
*/
return {
templateUrl: 'directives/plugin.html',
scope: {
plugin: '=data'
},
controller: ['$scope', function($scope) {
$scope.displayedContent = "";
// Auto-display embedded content only if it isn't NSFW
$scope.plugin.visible = !settings.noembed && !$scope.plugin.nsfw;
// user-accessible hash key that is a valid CSS class name
$scope.plugin.className = "embed_" + $scope.plugin.$$hashKey.replace(':','_');
$scope.plugin.getElement = function() {
return document.querySelector("." + $scope.plugin.className);
};
$scope.hideContent = function() {
$scope.plugin.visible = false;
};
$scope.showContent = function(automated) {
/*
* Shows the plugin content.
* displayedContent is bound to the DOM.
* Actual plugin content is only fetched when
* content is shown.
*/
var embed = $scope.plugin.getElement();
// If the plugin is asynchronous / lazy, execute it now and let it insert itself
// TODO store the result between channel switches
if ($scope.plugin.content instanceof Function){
// Don't rerun if the result is already there
if (!embed || embed.innerHTML === "") {
// if we're autoshowing, the element doesn't exist yet, and we need
// to do this async (wrapped in a setTimeout)
setTimeout(function() {
$scope.plugin.content();
});
}
} else {
$scope.displayedContent = $scope.plugin.content;
}
$scope.plugin.visible = true;
// Scroll embed content into view
var scroll;
if (automated) {
var wasBottom = $rootScope.bufferBottom;
scroll = function() {
$rootScope.updateBufferBottom(wasBottom);
};
} else {
scroll = function() {
if (embed && embed.scrollIntoViewIfNeeded !== undefined) {
embed.scrollIntoViewIfNeeded();
$rootScope.updateBufferBottom();
}
};
}
setTimeout(scroll, 500);
};
if ($scope.plugin.visible) {
$scope.showContent(true);
}
}]
};
}]);
})();