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.

161 lines
6.7 KiB

5 years ago
  1. let topic = "";
  2. let emisorId;
  3. let isloading = false;
  4. let slaMsgsParent;
  5. window.addEventListener('resize', function () {
  6. document.querySelectorAll('.sala_logo')
  7. .forEach(el => el.style.height = el.clientWidth + 'px');
  8. });
  9. window.addEventListener('load', function() {
  10. document.querySelectorAll('.sala_logo')
  11. .forEach(el => el.style.height = el.clientWidth + 'px');
  12. let formElem = document.getElementById('chat-msg-form');
  13. if(formElem === undefined){
  14. return false;
  15. }
  16. slaMsgsParent = document.getElementById('sala-msgs-parent');
  17. emisorId = formElem.dataset.emisorId;
  18. emisorId = parseInt(emisorId);
  19. formElem.onsubmit = function (e) {
  20. e.preventDefault();
  21. if(!topic || topic === '')
  22. return false;
  23. const publishRoute = "chat/" + topic;
  24. let message = this.elements.message.value;
  25. fetch(publishRoute, {method: 'POST', body: JSON.stringify({message: message})});
  26. this.elements.message.value = '';
  27. this.elements.message.focus();
  28. }
  29. document.getElementById('chat-message').oninput = function (e) {
  30. document.getElementById('msgsubmit').disabled = this.value === '' || isloading;
  31. this.style.height = 'inherit';
  32. let computed = window.getComputedStyle(this);
  33. let height = parseInt(computed.getPropertyValue('border-top-width'), 10)
  34. + parseInt(computed.getPropertyValue('padding-top'), 10)
  35. + this.scrollHeight
  36. + parseInt(computed.getPropertyValue('padding-bottom'), 10)
  37. + parseInt(computed.getPropertyValue('border-bottom-width'), 10);
  38. this.style.height = height + 'px';
  39. }
  40. let dataURL= document.getElementById('chat-wrapper').dataset.subscribeUrl;
  41. const subscribeURL = new URL(dataURL);
  42. document.querySelectorAll('.sala_item')
  43. .forEach(el => {
  44. el.addEventListener('click', changeSala);
  45. el.addEventListener('keypress', changeSala);
  46. el.setAttribute('disabled', 'disabed');
  47. const pubUrl = el.dataset.publishUrl;
  48. topic = pubUrl.split("/").pop();
  49. subscribeURL.searchParams.append('topic', topic);
  50. //updateEventSource(subscribeURL);
  51. });
  52. new EventSource(subscribeURL).onmessage = ({data}) => {
  53. const message = JSON.parse(data);
  54. let ul = document.getElementById('message-list');
  55. if(!message) throw new Error("Datos no válidos");
  56. if(registration)
  57. registration.showNotification("Nuevo mensaje", {body:message.notifMsg});
  58. let htmlMsg = message.emisorId === emisorId ? message.emisorView : message.receptorView;
  59. let liElem = document.createElement("li");
  60. let sala = message.sala;
  61. updateLastMessageAndDate(sala, message.salaDescView);
  62. if(message.emisorId !== emisorId){
  63. if(!ul || (slaMsgsParent.dataset.activeChat && slaMsgsParent.dataset.activeChat !== sala)){
  64. updateUnreadedBadge(sala);
  65. }
  66. if(ul && slaMsgsParent.dataset.activeChat && slaMsgsParent.dataset.activeChat === sala){
  67. let liNewMsg = ul.getElementsByClassName( 'unreaded-list' );
  68. if(!liNewMsg || liNewMsg.length === 0){
  69. liElem.setAttribute("class", "unreaded-list");
  70. liElem.innerHTML = '<hr><span>Nuevo</span><hr>';
  71. ul.prepend(liElem);
  72. }
  73. }
  74. }
  75. if(ul && slaMsgsParent.dataset.activeChat && slaMsgsParent.dataset.activeChat === sala){
  76. liElem = document.createElement("li");
  77. liElem.innerHTML = htmlMsg;
  78. ul.prepend(liElem);
  79. }
  80. };
  81. });
  82. function updateLastMessageAndDate(sala, salaDescView){
  83. let salaItem = document.getElementById(sala);
  84. let salaDesc = salaItem.getElementsByClassName('sala_desc')[0];
  85. if(salaDesc){
  86. let salaOldNameItem = salaDesc.getElementsByClassName('sala_name')[0];
  87. let salaName = '';
  88. if(salaOldNameItem){
  89. salaName = salaOldNameItem.innerText;
  90. }
  91. salaDesc.innerHTML = salaDescView;
  92. salaOldNameItem = salaDesc.getElementsByClassName('sala_name')[0];
  93. salaOldNameItem.innerText = salaName;
  94. }
  95. salaItem.parentElement.prepend(salaItem);
  96. }
  97. function updateUnreadedBadge(sala){
  98. let salaItem = document.getElementById(sala);
  99. let unreadedBadge = salaItem.getElementsByClassName( 'unreaded' )[0];
  100. if(!unreadedBadge){
  101. unreadedBadge = document.createElement("span");
  102. unreadedBadge.setAttribute("class", "unreaded");
  103. unreadedBadge.innerText = "1";
  104. let salaImage = salaItem.getElementsByClassName( 'sala_img' )[0];
  105. if(salaImage){
  106. salaImage.prepend(unreadedBadge);
  107. }
  108. }else{
  109. let unreadedCount = parseInt(unreadedBadge.innerText);
  110. unreadedCount += 1;
  111. unreadedBadge.innerText = unreadedCount;
  112. }
  113. }
  114. function getUl(){
  115. let ul = document.getElementById('message-list');
  116. if(!ul){
  117. ul = document.createElement('ul');
  118. ul.id = "message-list";
  119. ul.setAttribute("class", "scroll-bar-custom");
  120. document.getElementById("sala-msgs-parent").append(ul);
  121. document.getElementById('sala-no-seleccionada').remove();
  122. }
  123. return ul;
  124. }
  125. function changeSala(e) {
  126. if (e.type === 'click' || e.keyCode === 9) {
  127. isloading = false;
  128. document.getElementById('msgsubmit').disabled = true;
  129. let currentTarget = e.currentTarget;
  130. let ul = getUl();
  131. ul.innerHTML = "";
  132. document.querySelector('.loader').classList.add('show');
  133. $.get(currentTarget.dataset.loadPath, function (data) {
  134. isloading = false;
  135. let chatMsgElem = document.getElementById('chat-message');
  136. chatMsgElem.disabled = false;
  137. chatMsgElem.placeholder = chatMsgElem.dataset.placeholder;
  138. const pubUrl = currentTarget.dataset.publishUrl;
  139. topic = pubUrl.split("/").pop();
  140. //const subscribeURL = new URL(dataURL);
  141. //subscribeURL.searchParams.append('topic', topic);
  142. //updateEventSource(subscribeURL);
  143. document.querySelector('.loader').classList.remove('show');
  144. let activeChat = document.querySelector('.active_chat');
  145. if(activeChat)
  146. activeChat.classList.remove('active_chat');
  147. currentTarget.classList.add('active_chat');
  148. let msgsBadge = currentTarget.getElementsByClassName("unreaded")[0];
  149. if(msgsBadge)
  150. msgsBadge.remove();
  151. slaMsgsParent.innerHTML = data;
  152. slaMsgsParent.dataset.activeChat = currentTarget.id;
  153. document.getElementById('msgsubmit').disabled = false;
  154. });
  155. }
  156. }