ComunicWeb/assets/js/components/calls/window.js

159 lines
3.2 KiB
JavaScript
Raw Normal View History

2020-04-10 11:18:26 +00:00
/**
* Calls window
*
* @author Pierre Hubert
*/
class CallWindow extends CustomEvents {
2020-04-10 11:18:26 +00:00
/**
* Create a new call window
*
* @param {Conversation} conv Information about the target conversation
*/
constructor(conv) {
super()
2020-04-10 14:07:05 +00:00
this.conv = conv;
2020-04-10 11:18:26 +00:00
this.construct(conv);
}
async construct(conv) {
2020-04-10 14:07:05 +00:00
try {
// Check if calls target exists or not
if(!byId("callsTarget"))
createElem2({
appendTo: byId("wrapper"),
type: "div",
id: "callsTarget",
})
this.conv = conv;
this.rootEl = createElem2({
appendTo: byId("callsTarget"),
2020-04-10 11:18:26 +00:00
type: "div",
2020-04-10 14:07:05 +00:00
class: "call-window"
2020-04-10 11:18:26 +00:00
})
2020-04-10 14:07:05 +00:00
// Construct head
this.windowHead = createElem2({
appendTo: this.rootEl,
type: "div",
class: "head",
innerHTML: "<i class='fa fa-phone'></i>" +
await getConvName(conv) +
" <span class='pull-right'></span>"
})
2020-04-10 11:18:26 +00:00
2020-04-10 14:07:05 +00:00
// Close button
this.closeButton = createElem2({
appendTo: this.windowHead.querySelector(".pull-right"),
type: "a",
innerHTML: "<i class='fa fa-times'></i>",
onclick: () => this.Close()
})
2020-04-10 11:18:26 +00:00
2020-04-10 14:07:05 +00:00
this.makeWindowDraggable();
// Join the call
await ws("calls/join", {
convID: this.conv.ID
})
2020-04-10 14:07:05 +00:00
} catch(e) {
console.error(e)
notify("Could not initialize call!", "danger");
}
2020-04-10 12:03:28 +00:00
}
/**
* Make the call window draggable
*/
makeWindowDraggable() {
const checkWindowMinPosition = () => {
if(window.innerHeight < this.rootEl.style.top.replace("px", ""))
this.rootEl.style.top = "0px";
if(window.innerWidth < this.rootEl.style.left.replace("px", ""))
this.rootEl.style.left = "0px";
if(this.rootEl.style.left.replace("px", "") < 0)
this.rootEl.style.left = "0px";
if(this.rootEl.style.top.replace("px", "") < 49)
this.rootEl.style.top = "50px";
}
//Enable dragging
{
var pos1 = 0, pos2 = 0, pos3 = 0, pos4 = 0;
this.windowHead.addEventListener("mousedown", (e) => {
e = e || window.event;
e.preventDefault();
//Check if the window is currently in full screen mode
if(IsFullScreen())
return;
//get the mouse cursor position at startup
pos3 = e.clientX;
pos4 = e.clientY;
document.onmouseup = closeDragElement;
document.onmousemove = elementDrag;
});
const elementDrag = (e) => {
e = e || window.event;
e.preventDefault();
//Calculate new cursor position
pos1 = pos3 - e.clientX;
pos2 = pos4 - e.clientY;
pos3 = e.clientX;
pos4 = e.clientY;
//Set element new position
this.rootEl.style.top = (this.rootEl.offsetTop - pos2) + "px";
this.rootEl.style.left = (this.rootEl.offsetLeft - pos1) + "px";
checkWindowMinPosition();
}
const closeDragElement = () => {
//Stop moving when mouse button is released
document.onmouseup = null;
document.onmousemove = null;
}
}
window.addEventListener("resize", () => {
checkWindowMinPosition();
});
2020-04-10 11:18:26 +00:00
}
/**
* Close this window & cancel the call
*
* @param {boolean} propagate Set to true to propagate
* the event
*/
2020-04-10 14:07:05 +00:00
async Close(propagate = true) {
this.rootEl.remove();
2020-04-10 14:07:05 +00:00
// Leave the call
2020-04-10 14:15:52 +00:00
if(UserWebSocket.IsConnected)
await ws("calls/leave", {
convID: this.conv.ID
})
2020-04-10 14:07:05 +00:00
if(propagate)
2020-04-10 11:57:43 +00:00
this.emitEvent("close");
}
2020-04-10 11:18:26 +00:00
}