Licitator 1.0
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

162 lines
6.7 KiB

let topic = "";
let emisorId;
let isloading = false;
let slaMsgsParent;
window.addEventListener('resize', function () {
document.querySelectorAll('.sala_logo')
.forEach(el => el.style.height = el.clientWidth + 'px');
});
window.addEventListener('load', function() {
document.querySelectorAll('.sala_logo')
.forEach(el => el.style.height = el.clientWidth + 'px');
let formElem = document.getElementById('chat-msg-form');
if(formElem === undefined){
return false;
}
slaMsgsParent = document.getElementById('sala-msgs-parent');
emisorId = formElem.dataset.emisorId;
emisorId = parseInt(emisorId);
formElem.onsubmit = function (e) {
e.preventDefault();
if(!topic || topic === '')
return false;
const publishRoute = "chat/" + topic;
let message = this.elements.message.value;
fetch(publishRoute, {method: 'POST', body: JSON.stringify({message: message})});
this.elements.message.value = '';
this.elements.message.focus();
}
document.getElementById('chat-message').oninput = function (e) {
document.getElementById('msgsubmit').disabled = this.value === '' || isloading;
this.style.height = 'inherit';
let computed = window.getComputedStyle(this);
let height = parseInt(computed.getPropertyValue('border-top-width'), 10)
+ parseInt(computed.getPropertyValue('padding-top'), 10)
+ this.scrollHeight
+ parseInt(computed.getPropertyValue('padding-bottom'), 10)
+ parseInt(computed.getPropertyValue('border-bottom-width'), 10);
this.style.height = height + 'px';
}
let dataURL= document.getElementById('chat-wrapper').dataset.subscribeUrl;
const subscribeURL = new URL(dataURL);
document.querySelectorAll('.sala_item')
.forEach(el => {
el.addEventListener('click', changeSala);
el.addEventListener('keypress', changeSala);
el.setAttribute('disabled', 'disabed');
const pubUrl = el.dataset.publishUrl;
topic = pubUrl.split("/").pop();
subscribeURL.searchParams.append('topic', topic);
//updateEventSource(subscribeURL);
});
new EventSource(subscribeURL).onmessage = ({data}) => {
const message = JSON.parse(data);
let ul = document.getElementById('message-list');
if(!message) throw new Error("Datos no válidos");
if(registration)
registration.showNotification("Nuevo mensaje", {body:message.notifMsg});
let htmlMsg = message.emisorId === emisorId ? message.emisorView : message.receptorView;
let liElem = document.createElement("li");
let sala = message.sala;
updateLastMessageAndDate(sala, message.salaDescView);
if(message.emisorId !== emisorId){
if(!ul || (slaMsgsParent.dataset.activeChat && slaMsgsParent.dataset.activeChat !== sala)){
updateUnreadedBadge(sala);
}
if(ul && slaMsgsParent.dataset.activeChat && slaMsgsParent.dataset.activeChat === sala){
let liNewMsg = ul.getElementsByClassName( 'unreaded-list' );
if(!liNewMsg || liNewMsg.length === 0){
liElem.setAttribute("class", "unreaded-list");
liElem.innerHTML = '<hr><span>Nuevo</span><hr>';
ul.prepend(liElem);
}
}
}
if(ul && slaMsgsParent.dataset.activeChat && slaMsgsParent.dataset.activeChat === sala){
liElem = document.createElement("li");
liElem.innerHTML = htmlMsg;
ul.prepend(liElem);
}
};
});
function updateLastMessageAndDate(sala, salaDescView){
let salaItem = document.getElementById(sala);
let salaDesc = salaItem.getElementsByClassName('sala_desc')[0];
if(salaDesc){
let salaOldNameItem = salaDesc.getElementsByClassName('sala_name')[0];
let salaName = '';
if(salaOldNameItem){
salaName = salaOldNameItem.innerText;
}
salaDesc.innerHTML = salaDescView;
salaOldNameItem = salaDesc.getElementsByClassName('sala_name')[0];
salaOldNameItem.innerText = salaName;
}
salaItem.parentElement.prepend(salaItem);
}
function updateUnreadedBadge(sala){
let salaItem = document.getElementById(sala);
let unreadedBadge = salaItem.getElementsByClassName( 'unreaded' )[0];
if(!unreadedBadge){
unreadedBadge = document.createElement("span");
unreadedBadge.setAttribute("class", "unreaded");
unreadedBadge.innerText = "1";
let salaImage = salaItem.getElementsByClassName( 'sala_img' )[0];
if(salaImage){
salaImage.prepend(unreadedBadge);
}
}else{
let unreadedCount = parseInt(unreadedBadge.innerText);
unreadedCount += 1;
unreadedBadge.innerText = unreadedCount;
}
}
function getUl(){
let ul = document.getElementById('message-list');
if(!ul){
ul = document.createElement('ul');
ul.id = "message-list";
ul.setAttribute("class", "scroll-bar-custom");
document.getElementById("sala-msgs-parent").append(ul);
document.getElementById('sala-no-seleccionada').remove();
}
return ul;
}
function changeSala(e) {
if (e.type === 'click' || e.keyCode === 9) {
isloading = false;
document.getElementById('msgsubmit').disabled = true;
let currentTarget = e.currentTarget;
let ul = getUl();
ul.innerHTML = "";
document.querySelector('.loader').classList.add('show');
$.get(currentTarget.dataset.loadPath, function (data) {
isloading = false;
let chatMsgElem = document.getElementById('chat-message');
chatMsgElem.disabled = false;
chatMsgElem.placeholder = chatMsgElem.dataset.placeholder;
const pubUrl = currentTarget.dataset.publishUrl;
topic = pubUrl.split("/").pop();
//const subscribeURL = new URL(dataURL);
//subscribeURL.searchParams.append('topic', topic);
//updateEventSource(subscribeURL);
document.querySelector('.loader').classList.remove('show');
let activeChat = document.querySelector('.active_chat');
if(activeChat)
activeChat.classList.remove('active_chat');
currentTarget.classList.add('active_chat');
let msgsBadge = currentTarget.getElementsByClassName("unreaded")[0];
if(msgsBadge)
msgsBadge.remove();
slaMsgsParent.innerHTML = data;
slaMsgsParent.dataset.activeChat = currentTarget.id;
document.getElementById('msgsubmit').disabled = false;
});
}
}