class WebRTCStreamerMenuElement extends HTMLElement {
static get observedAttributes() {
return ['selected', 'webrtcurl'];
}
constructor() {
super();
this.shadowDOM = this.attachShadow({ mode: 'open' });
this.shadowDOM.innerHTML = `
`;
}
connectedCallback() {
this.fillList();
}
attributeChangedCallback(attrName, oldVal, newVal) {
if (attrName === "selected") {
this.selected = newVal;
let mediaList = this.shadowDOM.getElementById("mediaList");
let newValjson = JSON.parse(newVal);
for (const option of mediaList.getElementsByTagName('a')) {
let optionjson = JSON.parse(option.value);
if (optionjson.video === newValjson.video) {
option.selected = true;
option.className = "active";
}
}
} else if (attrName === "webrtcurl") {
this.fillList();
}
}
fillList() {
let mediaList = this.shadowDOM.getElementById("mediaList");
const webrtcurl = this.getAttribute("webrtcurl") || "";
fetch(webrtcurl + "/api/getMediaList").then(r => r.json()).then((response) => {
response.forEach((media) => {
var option = document.createElement("a");
option.text = media.video;
option.value = JSON.stringify(media);
if (this.selected && (this.selected === option.text)) {
option.className = "active";
}
option.onclick = () => {
if (option.className === "active") {
option.className = "";
this.dispatchEvent(new CustomEvent('change', {
detail: { url: "" }
}));
} else {
for (const opt of mediaList.getElementsByTagName('a')) {
opt.className = "";
}
this.dispatchEvent(new CustomEvent('change', {
detail: { url: option.value }
}));
option.className = "active";
}
}
mediaList.appendChild(option);
});
this.dispatchEvent(new CustomEvent('init', {
detail: response
}));
var settings = document.createElement("a");
settings.onclick = () => {
if (settings.className === "active") {
settings.className = "";
this.dispatchEvent(new CustomEvent('settings', {
detail: "off"
}));
} else {
settings.className = "active";
this.dispatchEvent(new CustomEvent('settings', {
detail: "on"
}));
}
}
var img = document.createElement("img");
img.src = "webrtc.png"
settings.appendChild(img);
mediaList.appendChild(settings);
for (const option of mediaList.getElementsByTagName('a')) {
if (option.className === "active") {
this.dispatchEvent(new CustomEvent('change', {
detail: { url: option.value }
}));
}
}
});
}
}
customElements.define('webrtc-streamer-menu', WebRTCStreamerMenuElement);