jiti-meet/modules/UI/videolayout/LocalVideo.js

204 lines
6.7 KiB
JavaScript
Raw Normal View History

2016-02-10 15:26:16 +00:00
/* global $, interfaceConfig, APP, JitsiMeetJS */
2015-12-14 12:26:50 +00:00
import ConnectionIndicator from "./ConnectionIndicator";
import UIUtil from "../util/UIUtil";
import UIEvents from "../../../service/UI/UIEvents";
import SmallVideo from "./SmallVideo";
2015-06-23 08:00:46 +00:00
var LargeVideo = require("./LargeVideo");
2016-02-02 21:50:02 +00:00
const RTCUIUtils = JitsiMeetJS.util.RTCUIHelper;
2016-01-06 22:39:13 +00:00
const TrackEvents = JitsiMeetJS.events.track;
2015-12-01 12:53:01 +00:00
function LocalVideo(VideoLayout, emitter) {
2015-06-23 08:00:46 +00:00
this.videoSpanId = "localVideoContainer";
this.container = $("#localVideoContainer").get(0);
this.bindHoverHandler();
2015-06-23 08:00:46 +00:00
this.flipX = true;
this.isLocal = true;
2015-12-01 12:53:01 +00:00
this.emitter = emitter;
Object.defineProperty(this, 'id', {
get: function () {
return APP.conference.localId;
}
});
SmallVideo.call(this, VideoLayout);
2015-06-23 08:00:46 +00:00
}
LocalVideo.prototype = Object.create(SmallVideo.prototype);
LocalVideo.prototype.constructor = LocalVideo;
/**
* Creates the edit display name button.
*
* @returns {object} the edit button
2015-06-23 08:00:46 +00:00
*/
function createEditDisplayNameButton() {
var editButton = document.createElement('a');
editButton.className = 'displayname';
UIUtil.setTooltip(editButton,
"videothumbnail.editnickname",
"top");
editButton.innerHTML = '<i class="fa fa-pencil"></i>';
return editButton;
}
/**
* Sets the display name for the given video span id.
*/
LocalVideo.prototype.setDisplayName = function(displayName, key) {
if (!this.container) {
console.warn(
"Unable to set displayName - " + this.videoSpanId +
" does not exist");
2015-06-23 08:00:46 +00:00
return;
}
var nameSpan = $('#' + this.videoSpanId + '>span.displayname');
var defaultLocalDisplayName = APP.translation.generateTranslationHTML(
2015-06-23 08:00:46 +00:00
interfaceConfig.DEFAULT_LOCAL_DISPLAY_NAME);
var meHTML;
2015-06-23 08:00:46 +00:00
// If we already have a display name for this video.
if (nameSpan.length > 0) {
if (nameSpan.text() !== displayName) {
if (displayName && displayName.length > 0) {
meHTML = APP.translation.generateTranslationHTML("me");
$('#localDisplayName').html(
UIUtil.escapeHtml(displayName) + ' (' + meHTML + ')'
);
} else {
2015-06-23 08:00:46 +00:00
$('#localDisplayName').html(defaultLocalDisplayName);
}
2015-06-23 08:00:46 +00:00
}
2016-01-14 22:21:03 +00:00
this.updateView();
2015-06-23 08:00:46 +00:00
} else {
var editButton = createEditDisplayNameButton();
nameSpan = document.createElement('span');
nameSpan.className = 'displayname';
$('#' + this.videoSpanId)[0].appendChild(nameSpan);
if (displayName && displayName.length > 0) {
meHTML = APP.translation.generateTranslationHTML("me");
nameSpan.innerHTML = UIUtil.escapeHtml(displayName) + meHTML;
2015-06-23 08:00:46 +00:00
}
else {
nameSpan.innerHTML = defaultLocalDisplayName;
}
nameSpan.id = 'localDisplayName';
this.container.appendChild(editButton);
//translates popover of edit button
APP.translation.translateElement($("a.displayname"));
var editableText = document.createElement('input');
editableText.className = 'displayname';
editableText.type = 'text';
editableText.id = 'editDisplayName';
if (displayName && displayName.length) {
editableText.value = displayName;
}
var defaultNickname = APP.translation.translateString(
"defaultNickname", {name: "Jane Pink"});
editableText.setAttribute('style', 'display:none;');
editableText.setAttribute('data-18n',
'[placeholder]defaultNickname');
editableText.setAttribute("data-i18n-options",
JSON.stringify({name: "Jane Pink"}));
editableText.setAttribute("placeholder", defaultNickname);
this.container.appendChild(editableText);
var self = this;
$('#localVideoContainer .displayname')
.bind("click", function (e) {
var editDisplayName = $('#editDisplayName');
2015-06-23 08:00:46 +00:00
e.preventDefault();
e.stopPropagation();
$('#localDisplayName').hide();
editDisplayName.show();
editDisplayName.focus();
editDisplayName.select();
2015-06-23 08:00:46 +00:00
editDisplayName.one("focusout", function (e) {
self.emitter.emit(UIEvents.NICKNAME_CHANGED, this.value);
2015-12-01 12:53:01 +00:00
$('#editDisplayName').hide();
2015-06-23 08:00:46 +00:00
});
editDisplayName.on('keydown', function (e) {
2015-06-23 08:00:46 +00:00
if (e.keyCode === 13) {
e.preventDefault();
2015-12-01 12:53:01 +00:00
$('#editDisplayName').hide();
2015-12-18 13:59:38 +00:00
// focusout handler will save display name
2015-06-23 08:00:46 +00:00
}
});
});
}
};
2015-06-23 08:00:46 +00:00
LocalVideo.prototype.createConnectionIndicator = function() {
2015-06-23 08:00:46 +00:00
if(this.connectionIndicator)
return;
this.connectionIndicator = new ConnectionIndicator(this, null);
};
2015-06-23 08:00:46 +00:00
2015-12-14 12:26:50 +00:00
LocalVideo.prototype.changeVideo = function (stream) {
this.videoStream = stream;
2015-06-23 08:00:46 +00:00
2015-12-14 12:26:50 +00:00
let localVideoClick = (event) => {
// FIXME: with Temasys plugin event arg is not an event, but
// the clicked object itself, so we have to skip this call
if (event.stopPropagation) {
event.stopPropagation();
}
this.VideoLayout.handleVideoThumbClicked(this.id);
2015-12-14 12:26:50 +00:00
};
2015-06-23 08:00:46 +00:00
2015-12-14 12:26:50 +00:00
let localVideoContainerSelector = $('#localVideoContainer');
localVideoContainerSelector.off('click');
localVideoContainerSelector.on('click', localVideoClick);
2015-06-23 08:00:46 +00:00
2015-12-29 22:30:50 +00:00
this.flipX = stream.videoType != "desktop";
2015-12-14 12:26:50 +00:00
let localVideo = document.createElement('video');
localVideo.id = 'localVideo_' + stream.getId();
2016-02-02 21:50:02 +00:00
RTCUIUtils.setAutoPlay(localVideo, true);
RTCUIUtils.setVolume(localVideo, 0);
2015-06-23 08:00:46 +00:00
var localVideoContainer = document.getElementById('localVideoWrapper');
// Put the new video always in front
UIUtil.prependChild(localVideoContainer, localVideo);
2015-06-23 08:00:46 +00:00
// Add click handler to both video and video wrapper elements in case
// there's no video.
// onclick has to be used with Temasys plugin
localVideo.onclick = localVideoClick;
2015-06-23 08:00:46 +00:00
if (this.flipX) {
$(localVideo).addClass("flipVideoX");
2015-06-23 08:00:46 +00:00
}
// Attach WebRTC stream
localVideo = stream.attach(localVideo);
2015-12-14 12:26:50 +00:00
2016-01-06 22:39:13 +00:00
let endedHandler = () => {
2015-06-23 08:00:46 +00:00
localVideoContainer.removeChild(localVideo);
// when removing only the video element and we are on stage
// update the stage
if(this.VideoLayout.isCurrentlyOnLarge(this.id))
this.VideoLayout.updateLargeVideo(this.id);
stream.off(TrackEvents.LOCAL_TRACK_STOPPED, endedHandler);
2016-01-06 22:39:13 +00:00
};
stream.on(TrackEvents.LOCAL_TRACK_STOPPED, endedHandler);
};
2015-06-23 08:00:46 +00:00
2015-12-14 12:26:50 +00:00
export default LocalVideo;