Created
November 7, 2020 18:37
-
-
Save Tobi-De/c079d9487227482d8cef9c490af52780 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
let connected = false; | |
const usernameInput = document.getElementById('username'); | |
const button = document.getElementById('join_leave'); | |
const container = document.getElementById('container'); | |
const count = document.getElementById('count'); | |
let room; | |
function getCookie(name) { | |
let cookieValue = null; | |
if (document.cookie && document.cookie !== '') { | |
const cookies = document.cookie.split(';'); | |
for (let i = 0; i < cookies.length; i++) { | |
const cookie = cookies[i].trim(); | |
// Does this cookie string begin with the name we want? | |
if (cookie.substring(0, name.length + 1) === (name + '=')) { | |
cookieValue = decodeURIComponent(cookie.substring(name.length + 1)); | |
break; | |
} | |
} | |
} | |
console.log(cookieValue) | |
return cookieValue; | |
} | |
const csrftoken = getCookie('csrftoken'); | |
function addLocalVideo() { | |
Twilio.Video.createLocalVideoTrack().then(track => { | |
let video = document.getElementById('local').firstChild; | |
video.appendChild(track.attach()); | |
}); | |
}; | |
function connectButtonHandler(event) { | |
event.preventDefault(); | |
if (!connected) { | |
let username = usernameInput.value; | |
if (!username) { | |
alert('Enter your name before connecting'); | |
return; | |
} | |
button.disabled = true; | |
button.innerHTML = 'Connecting...'; | |
connect(username).then(() => { | |
button.innerHTML = 'Leave call'; | |
button.disabled = false; | |
}).catch(() => { | |
alert('Connection failed. Is the backend running?'); | |
button.innerHTML = 'Join call'; | |
button.disabled = false; | |
}); | |
} else { | |
disconnect(); | |
button.innerHTML = 'Join call'; | |
connected = false; | |
} | |
}; | |
function connect(username) { | |
let promise = new Promise((resolve, reject) => { | |
// get a token from the back end | |
fetch('/stands/video-call/login/', { | |
method: 'POST', | |
body: JSON.stringify({'username': username}), | |
headers: {'X-CSRFToken': "1qcZfYTQUHjDU2fJsCbS8kXL2Dja5WyosbiccySvYXB4FLDSU2UeQK1mP9pLvhXi"}, | |
mode: 'same-origin' | |
}).then(res => res.json()).then(data => { | |
// join video call | |
console.log(data.token) | |
return Twilio.Video.connect(data.token); | |
}).then(_room => { | |
room = _room; | |
room.participants.forEach(participantConnected); | |
room.on('participantConnected', participantConnected); | |
room.on('participantDisconnected', participantDisconnected); | |
connected = true; | |
updateParticipantCount(); | |
resolve(); | |
}).catch(() => { | |
reject(); | |
}); | |
}); | |
return promise; | |
}; | |
function updateParticipantCount() { | |
if (!connected) | |
count.innerHTML = 'Disconnected.'; | |
else | |
count.innerHTML = (room.participants.size + 1) + ' participants online.'; | |
}; | |
function participantConnected(participant) { | |
let participantDiv = document.createElement('div'); | |
participantDiv.setAttribute('id', participant.sid); | |
participantDiv.setAttribute('class', 'participant'); | |
let tracksDiv = document.createElement('div'); | |
participantDiv.appendChild(tracksDiv); | |
let labelDiv = document.createElement('div'); | |
labelDiv.innerHTML = participant.identity; | |
participantDiv.appendChild(labelDiv); | |
container.appendChild(participantDiv); | |
participant.tracks.forEach(publication => { | |
if (publication.isSubscribed) | |
trackSubscribed(tracksDiv, publication.track); | |
}); | |
participant.on('trackSubscribed', track => trackSubscribed(tracksDiv, track)); | |
participant.on('trackUnsubscribed', trackUnsubscribed); | |
updateParticipantCount(); | |
}; | |
function participantDisconnected(participant) { | |
document.getElementById(participant.sid).remove(); | |
updateParticipantCount(); | |
}; | |
function trackSubscribed(div, track) { | |
div.appendChild(track.attach()); | |
}; | |
function trackUnsubscribed(track) { | |
track.detach().forEach(element => element.remove()); | |
}; | |
function disconnect() { | |
room.disconnect(); | |
while (container.lastChild.id != 'local') | |
container.removeChild(container.lastChild); | |
button.innerHTML = 'Join call'; | |
connected = false; | |
updateParticipantCount(); | |
}; | |
addLocalVideo(); | |
button.addEventListener('click', connectButtonHandler); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment