ovenplayer
Version:
OvenPlayer is Open-Source HTML5 Player. OvenPlayer supports WebRTC Signaling from OvenMediaEngine for Sub-Second Latency Streaming.
159 lines (130 loc) • 5.43 kB
JavaScript
/**
* Created by hoho on 2018. 7. 19..
*/
import Templates from "view/engine/Templates";
import LA$ from 'utils/likeA$';
import _ from "utils/underscore";
/**
* @brief This is simple ui renderer. This returns onRendered callback, onDestroyed callback on Template. And this bind events for Templates.
* @param container dom element or LA$ object
* @param templateName templateName
* @param data preload data
* @param events Template's events.
* @param onRendered This callback occurs after append template.
* @param onDestroyed This callback occurs after destroyed template.
* @param isRoot
*
* */
const OvenTemplate = function (container, templateName, playerConfig, data, events, onRendered, onDestroyed, isRoot) {
let $container = _.isElement(container) ? LA$(container) : container;
let $template;
let viewEvents = {};
let uiText = null;
let that = {};
that.data = data;
let createAndSelectElement = function (html) {
const newElement = document.createElement('div');
newElement.innerHTML = html;
$template = LA$(newElement.firstChild);
return newElement.firstChild;
}
if(playerConfig && playerConfig.systemText){
uiText = playerConfig.systemText.ui;
}
if (isRoot) {
$container.replace(createAndSelectElement(Templates[templateName + "Template"](uiText, data)));
} else {
$container.append(createAndSelectElement(Templates[templateName + "Template"](uiText, data)));
}
if (onRendered) {
onRendered($template, that);
}
Object.keys(events).forEach(eventString => {
let explodedText = eventString.split(" ");
let eventName = explodedText[0].replace(/ /gi, "");
let target = explodedText[1].replace(/ /gi, "");
let $target = "";
if(target === "document" || target === "window" || target === "body"){
$target = LA$(target);
}else{
$target = $template.find(target) || ($template.hasClass(target.replace(".","")) ? $template : null);
}
if (eventName && target && $target) {
let id = Object.keys(viewEvents).length++;
//because It retuns another data.
let wrappedFunc = function (event) {
return events[eventString](event, $template, that);
};
viewEvents[id] = {name: eventName, target: target, callback: wrappedFunc};
/*$template.get().addEventListener(eventName,function(evt){
var gtarget = evt.target;
while (gtarget!= null){
if (gtarget.isEqualNode($target.get())){
console.log("isEqual", gtarget, $target.get());
wrappedFunc(evt);
return;
}
gtarget = gtarget.parentElement;
}
}, true);*/
let eventOption = null;
if (eventName.indexOf('touch') > -1) {
eventOption = { passive: true };
}
//sometimes target is NodeList
let nodeLength = $target.get().length;
if(nodeLength > 1){
let nodeList = $target.get();
for(let i = 0; i < nodeLength; i ++){
nodeList[i].addEventListener(eventName, wrappedFunc, eventOption);
}
//IE NodeList doesn't have forEach. It's wack.
//$target.get().forEach(function($item){
// $item.addEventListener(eventName, wrappedFunc);
//});
}else{
$target.get().addEventListener(eventName, wrappedFunc, eventOption);
}
} else {
return false;
}
});
that.destroy = function () {
Object.keys(viewEvents).forEach(id => {
let event = viewEvents[id];
let $target = "";
if(event.target === "document" || event.target === "window" || event.target === "body"){
$target = LA$(event.target);
}else{
$target = $template.find(event.target) || ($template.hasClass(event.target.replace(".","")) ? $template : null);
}
//sometimes target is NodeList
let nodeLength = $target.get().length;
if(nodeLength > 1){
let nodeList = $target.get();
for(let i = 0; i < nodeLength; i ++){
nodeList[i].removeEventListener(event.name, event.callback);
}
/*$target.get().forEach(function($item){
$item.removeEventListener(event.name, event.callback);
});*/
}else{
$target.get().removeEventListener(event.name, event.callback);
}
delete viewEvents[id];
});
if($template){
if(isRoot){
$template.removeChild();
$template.removeAttribute("class");
}else{
$template.remove();
}
}
if (onDestroyed) {
onDestroyed(that);
}
};
return that;
};
export default OvenTemplate;