Rohan Sircar
4 years ago
10 changed files with 2 additions and 2431 deletions
-
3chatto/.gitignore
-
3chatto/src/main/javascript/app.css
-
560chatto/src/main/javascript/chat.js
-
0chatto/src/main/javascript/index.html
-
1chatto/src/main/javascript/test.js
-
794chatto/src/main/javascript/ts/bundle.js
-
311chatto/src/main/javascript/ts/test.html
-
157chatto/src/main/javascript/yarn-error.log
-
547chatto/src/main/resources/static/js/chat.js
-
57chatto/src/main/resources/static/js/my_Crypto.js
@ -1,3 +0,0 @@ |
|||||
@import url("node_modules/alertifyjs/build/css/alertify.css"); |
|
||||
@import url("node_modules/alertifyjs/build/css/themes/bootstrap.min.css"); |
|
||||
@import url("node_modules/alertifyjs/build/css/themes/default.min.css"); |
|
@ -1,560 +0,0 @@ |
|||||
// import { sprintf } from 'sprintf-js';
|
|
||||
// import { vsprintf } from 'sprintf-js';
|
|
||||
/*var off_payment_method = document.getElementsByName('offline_payment_method'); |
|
||||
var ischecked_method = false; |
|
||||
for ( var i = 0; i < off_payment_method.length; i++) { |
|
||||
if(off_payment_method[i].checked) { |
|
||||
ischecked_method = true; |
|
||||
break; |
|
||||
} |
|
||||
} |
|
||||
if(!ischecked_method) { //payment method button is not checked
|
|
||||
alert("Please choose Offline Payment Method"); |
|
||||
}*/ |
|
||||
// var css = require('./app.css');
|
|
||||
// console.log(css);
|
|
||||
// var alertify = require('alertifyjs');
|
|
||||
var log = require('loglevel'); |
|
||||
var sjcl = require('sjcl'); |
|
||||
var markdownit = require('markdown-it'); |
|
||||
var md = new markdownit(); |
|
||||
var Handlebars = require('handlebars'); |
|
||||
var DOMPurify = require('dompurify'); |
|
||||
var Fuse = require('fuse.js'); |
|
||||
|
|
||||
require('./test.js'); |
|
||||
|
|
||||
var toUserRadios = document.getElementsByName('toUser'); |
|
||||
var isCheckedUser = false; |
|
||||
var chatTextArea = document.getElementById('chatTextArea'); |
|
||||
|
|
||||
var postNewMessageUrl = `http://${hostAddress}/api/chat/post/message`; //hostAddress variable is set in the thymeleaf head fragment
|
|
||||
var getAllMessagesUrl = `http://${hostAddress}/api/chat/get/messages/`; |
|
||||
var getNewMessagesUrl = `http://${hostAddress}/api/chat/get/messages/`; |
|
||||
var getActiveUsersUrl = `http://${hostAddress}/api/chat/get/active-users/`; |
|
||||
// var postNewMessageUrl = "http://localhost:8080/api/chat/post/message";
|
|
||||
// var getAllMessagesUrl = "http://localhost:8080/api/chat/get/messages/";
|
|
||||
// var getNewMessagesUrl = "http://localhost:8080/api/chat/get/messages/";
|
|
||||
// var messageLog = [];
|
|
||||
var username = localStorage.getItem('username'); |
|
||||
var authToken = localStorage.getItem('authToken'); |
|
||||
|
|
||||
var passphraseInput = document.getElementById('passphrase'); |
|
||||
var iterations = 100000; |
|
||||
|
|
||||
var source = document.getElementById("msg_container_template").innerHTML; |
|
||||
var msgContainerTemplate = Handlebars.compile(source); |
|
||||
var source = document.getElementById("msg_container_send_template").innerHTML; |
|
||||
var msgContainerSendTemplate = Handlebars.compile(source); |
|
||||
var source = document.getElementById("user-contact-online-template").innerHTML; |
|
||||
var userContactOnlineTemplate = Handlebars.compile(source); |
|
||||
var source = document.getElementById("user-contact-offline-template").innerHTML; |
|
||||
var userContactOfflineTemplate = Handlebars.compile(source); |
|
||||
|
|
||||
var chatAreaNew = document.getElementById('chat_area_new'); |
|
||||
|
|
||||
var userBoxes = document.getElementsByName('user-box'); |
|
||||
|
|
||||
|
|
||||
|
|
||||
var activeUsers = {}; |
|
||||
|
|
||||
var fuseOptions = { |
|
||||
shouldSort: true, |
|
||||
threshold: 0.01, |
|
||||
location: 0, |
|
||||
distance: 100, |
|
||||
maxPatternLength: 32, |
|
||||
minMatchCharLength: 1, |
|
||||
keys: [ |
|
||||
"userName", |
|
||||
] |
|
||||
}; |
|
||||
|
|
||||
log.setLevel('TRACE'); |
|
||||
|
|
||||
alertify.set('notifier', 'position', 'top-center'); |
|
||||
|
|
||||
// Loop through the buttons and add the active class to the current/clicked button
|
|
||||
// for (var i = 0; i < btns.length; i++) {
|
|
||||
// btns[i].addEventListener("click", function() {
|
|
||||
// var current = document.getElementsByClassName("active");
|
|
||||
|
|
||||
// // If there's no active class
|
|
||||
// if (current.length > 0) {
|
|
||||
// current[0].className = current[0].className.replace(" active", "");
|
|
||||
// }
|
|
||||
|
|
||||
// // Add the active class to the current/clicked button
|
|
||||
// this.className += " active";
|
|
||||
// });
|
|
||||
// }
|
|
||||
|
|
||||
getActiveUsers(authToken) |
|
||||
.then(data => { |
|
||||
// activeUsers = data;
|
|
||||
sessionStorage.setItem('activeUsers', JSON.stringify(data)); |
|
||||
log.log(sessionStorage.getItem('activeUsers')); |
|
||||
}) |
|
||||
|
|
||||
for (let i = 0; i < userBoxes.length; i++) { |
|
||||
userBoxes[i].addEventListener('click', userCallBack) |
|
||||
} |
|
||||
|
|
||||
function addUserCallBacks() { |
|
||||
for (let i = 0; i < userBoxes.length; i++) { |
|
||||
userBoxes[i].addEventListener('click', userCallBack) |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
function userCallBack() { |
|
||||
let current = document.getElementsByClassName('user-box active'); |
|
||||
let passphrase = passphraseInput.value; |
|
||||
if (current.length > 0) { |
|
||||
if (passphrase == '') { |
|
||||
// alert('Please input passphrase')
|
|
||||
alertify.error('Please enter a passphrase'); |
|
||||
return; |
|
||||
} |
|
||||
current[0].className = current[0].className.replace(" active", ""); |
|
||||
|
|
||||
} |
|
||||
// Add the active class to the current/clicked button
|
|
||||
else if (current.length == 0) { |
|
||||
let elem = document.getElementById('passphrase-initial'); |
|
||||
passphrase = elem.value; |
|
||||
if (passphrase == '') { |
|
||||
// alert('Please input passphrase')
|
|
||||
alertify.error('Please enter a passphrase'); |
|
||||
return; |
|
||||
} |
|
||||
document.getElementById('no-user-selected').hidden = true; |
|
||||
document.getElementById('chat-card').hidden = false; |
|
||||
elem.hidden = true; |
|
||||
} |
|
||||
// console.log(this.getElementsByClassName('to-user-span'));
|
|
||||
let userName = this.getElementsByClassName('to-user-span')[0].innerText; |
|
||||
document.getElementById('user-name-span').innerText = userName; |
|
||||
populateMessages(userName, passphrase); |
|
||||
sessionStorage.setItem('selectedUser', userName); |
|
||||
this.className += " active"; |
|
||||
} |
|
||||
|
|
||||
function populateMessages(userName, passphrase) { |
|
||||
console.log('Selected user = ' + userName); |
|
||||
if (passphrase == '') { |
|
||||
alert('Please input passphrase') |
|
||||
return; |
|
||||
} |
|
||||
// console.log(userName);
|
|
||||
if (sessionStorage.getItem(userName) == null) { |
|
||||
chatTextArea.textContent = ''; |
|
||||
chatAreaNew.innerHTML = ''; |
|
||||
getAllMessages(userName) |
|
||||
.then(json => { |
|
||||
if (json == null) return; |
|
||||
console.log(json); |
|
||||
let i = 0; |
|
||||
let messageLog = []; |
|
||||
let messageLogNew = []; |
|
||||
let lastMessageTimeStamp; |
|
||||
|
|
||||
if (json.length > 0) { |
|
||||
json.forEach(function(obj) { |
|
||||
// console.log(obj.toUser);
|
|
||||
messageCipher = JSON.stringify(obj.messageCipher); |
|
||||
console.log(messageCipher); |
|
||||
// let message = sjcl.decrypt("password", messageCipher);
|
|
||||
let message = md.render(sjcl.decrypt(passphrase, messageCipher)); |
|
||||
let utcDate = obj.messageTime; |
|
||||
lastMessageTimeStamp = utcDate; |
|
||||
let localDate = new Date(utcDate); |
|
||||
let messageLine = sprintf('%s %s: %s ', localDate, obj.fromUser, message); |
|
||||
|
|
||||
|
|
||||
// localDate.``
|
|
||||
// console.log('localDate = ' + localDate);
|
|
||||
console.log(messageLine); |
|
||||
// chatTextArea.append(obj.fromUser + ": " + message + "\n");
|
|
||||
chatTextArea.append(messageLine + '\n'); |
|
||||
messageLog[i++] = messageLine; |
|
||||
chatTextArea.scrollTop = chatTextArea.scrollHeight; |
|
||||
// console.log('Message log = ' + messageLog);
|
|
||||
|
|
||||
let context = { fromUser: obj.fromUser, message: message, time: localDate.toLocaleString() }; |
|
||||
let msgContainer; |
|
||||
if (obj.fromUser == username) { |
|
||||
msgContainer = msgContainerSendTemplate(context); |
|
||||
} else { |
|
||||
msgContainer = msgContainerTemplate(context); |
|
||||
} |
|
||||
|
|
||||
messageLogNew.push(JSON.stringify(context)); |
|
||||
$(chatAreaNew).append(DOMPurify.sanitize(msgContainer)); |
|
||||
|
|
||||
|
|
||||
}); |
|
||||
sessionStorage.setItem(userName, JSON.stringify(messageLog)); |
|
||||
sessionStorage.setItem(userName + username + 'new', JSON.stringify(messageLogNew)); |
|
||||
// console.log()
|
|
||||
// sessionStorage.clear();
|
|
||||
console.log('Last message time = ' + lastMessageTimeStamp); |
|
||||
sessionStorage.setItem(userName + '-time', lastMessageTimeStamp); |
|
||||
|
|
||||
|
|
||||
} |
|
||||
}); |
|
||||
} else { |
|
||||
|
|
||||
|
|
||||
console.log("Stored messages = " + sessionStorage.getItem(userName)); |
|
||||
let storedMessages = JSON.parse(sessionStorage.getItem(userName)); |
|
||||
let storedMessagesNew = JSON.parse(sessionStorage.getItem(userName + username + 'new')); |
|
||||
let lastMessageTime = sessionStorage.getItem(userName + '-time'); |
|
||||
console.log("last message time stamp = " + lastMessageTime); |
|
||||
if (lastMessageTime != null) { |
|
||||
getNewMessages(userName, lastMessageTime) |
|
||||
.then(json => { |
|
||||
if (json == null) return; |
|
||||
console.log(json) |
|
||||
if (json.length > 0) { |
|
||||
json.forEach(function(obj) { |
|
||||
let messageCipher = JSON.stringify(obj.messageCipher); |
|
||||
let message = md.render(sjcl.decrypt(passphrase, messageCipher)); |
|
||||
// console.log(message);
|
|
||||
// chatTextArea.append(message + "\n");
|
|
||||
let utcDate = obj.messageTime; |
|
||||
lastMessageTimeStamp = utcDate; |
|
||||
let localDate = new Date(utcDate); |
|
||||
let messageLine = sprintf('%s %s: %s', localDate, obj.fromUser, message); |
|
||||
|
|
||||
// localDate.``
|
|
||||
// console.log('localDate = ' + localDate);
|
|
||||
console.log(messageLine); |
|
||||
// chatTextArea.append(obj.fromUser + ": " + message + "\n");
|
|
||||
chatTextArea.append(messageLine + '\n'); |
|
||||
chatTextArea.scrollTop = chatTextArea.scrollHeight; |
|
||||
storedMessages.push(messageLine); |
|
||||
|
|
||||
let context = { fromUser: obj.fromUser, message: message, time: localDate.toLocaleString() }; |
|
||||
let msgContainer; |
|
||||
if (obj.fromUser == username) { |
|
||||
msgContainer = msgContainerSendTemplate(context); |
|
||||
} else { |
|
||||
msgContainer = msgContainerTemplate(context); |
|
||||
} |
|
||||
|
|
||||
storedMessagesNew.push(JSON.stringify(context)); |
|
||||
$(chatAreaNew).append(DOMPurify.sanitize(msgContainer)); |
|
||||
|
|
||||
}) |
|
||||
sessionStorage.setItem(userName + '-time', lastMessageTimeStamp); |
|
||||
sessionStorage.setItem(userName, JSON.stringify(storedMessages)); |
|
||||
sessionStorage.setItem(userName + username + 'new', JSON.stringify(storedMessagesNew)); |
|
||||
console.log("this value stored" + sessionStorage.getItem(userName)) |
|
||||
console.log("last message time stamp = " + lastMessageTimeStamp); |
|
||||
console.log(sessionStorage.getItem(userName + '-time')); |
|
||||
|
|
||||
} |
|
||||
chatTextArea.textContent = ''; |
|
||||
chatAreaNew.innerHTML = ''; |
|
||||
console.log("Stored messages 2 = " + storedMessages); |
|
||||
storedMessages.forEach(function(messageLine) { |
|
||||
chatTextArea.append(messageLine + '\n'); |
|
||||
chatTextArea.scrollTop = chatTextArea.scrollHeight; |
|
||||
|
|
||||
// let context = {message: messageLine};
|
|
||||
// let msgContainer;
|
|
||||
// if(obj.fromUser == username)
|
|
||||
// {
|
|
||||
// msgContainer = msgContainerSendTemplate(context);
|
|
||||
// }
|
|
||||
// else{
|
|
||||
// msgContainer = msgContainerTemplate(context);
|
|
||||
// }
|
|
||||
|
|
||||
// $(chatAreaNew).append(msgContainer);
|
|
||||
}) |
|
||||
|
|
||||
storedMessagesNew.forEach(function(contextString) { |
|
||||
let context = JSON.parse(contextString); |
|
||||
let msgContainer; |
|
||||
if (context.fromUser == username) { |
|
||||
msgContainer = msgContainerSendTemplate(context); |
|
||||
} else { |
|
||||
msgContainer = msgContainerTemplate(context); |
|
||||
} |
|
||||
|
|
||||
$(chatAreaNew).append(DOMPurify.sanitize(msgContainer)); |
|
||||
scrollChatAreaAnimated(2400); |
|
||||
}) |
|
||||
|
|
||||
|
|
||||
}); |
|
||||
|
|
||||
|
|
||||
} |
|
||||
// chatTextArea.append(JSON.stringify(storedMessages));
|
|
||||
|
|
||||
} |
|
||||
// sessionStorage.setItem('status', 'ready');
|
|
||||
// sessionStorage.setItem('userName', messageLog);
|
|
||||
// console.log('Message log = ' + messageLog);
|
|
||||
// }
|
|
||||
|
|
||||
// let passphraseKey = userName + '-passphrase';
|
|
||||
// sessionStorage.setItem(passphraseKey, passphrase);
|
|
||||
// console.log(sessionStorage.getItem(passphraseKey));
|
|
||||
} |
|
||||
|
|
||||
// var lastMessageTimeStamp;
|
|
||||
|
|
||||
// console.log(authToken);
|
|
||||
// 'Basic ' + btoa("hmm" + ":" + "hmm")
|
|
||||
|
|
||||
Handlebars.registerHelper('avatar', function() { |
|
||||
return '<div class="img_cont_msg"> <img src="https://static.turbosquid.com/Preview/001292/481/WV/_D.jpg" class="rounded-circle user_img_msg"> </div>'; |
|
||||
}); |
|
||||
|
|
||||
|
|
||||
// var user;
|
|
||||
function getSelectedUser() { |
|
||||
for (var i = 0; i < toUserRadios.length; i++) { |
|
||||
if (toUserRadios[i].checked) { |
|
||||
let user = toUserRadios[i].value; |
|
||||
console.log('sending to user = ' + user); |
|
||||
isCheckedUser = true; |
|
||||
return user; |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
} |
|
||||
|
|
||||
function getSelectedUserNew() { |
|
||||
return sessionStorage.getItem('selectedUser'); |
|
||||
} |
|
||||
|
|
||||
document.getElementById('chatMessageForm').addEventListener('submit', function(e) { |
|
||||
let chatInput = document.getElementById('chatInput'); |
|
||||
e.preventDefault(); |
|
||||
let user = getSelectedUserNew(); |
|
||||
|
|
||||
if (!this.checkValidity()) { |
|
||||
console.log("error"); |
|
||||
this.classList.add('was-validated'); |
|
||||
return; |
|
||||
} |
|
||||
this.classList.add('was-validated'); |
|
||||
|
|
||||
if (user == null) { |
|
||||
// window.alert('please select a user');
|
|
||||
alertify.error('Please select a user'); |
|
||||
return; |
|
||||
} |
|
||||
let messageContent = chatInput.value; |
|
||||
let context = { fromUser: username, message: md.render(messageContent), time: new Date().toLocaleString() }; |
|
||||
let msgContainer = msgContainerSendTemplate(context); |
|
||||
$(chatAreaNew).append(DOMPurify.sanitize(msgContainer)); |
|
||||
scrollChatAreaAnimated(2400); |
|
||||
let messageCipher = sjcl.encrypt(passphraseInput.value, messageContent, { mode: "gcm", ts: 128, adata: "", iter: iterations }); |
|
||||
let messageCipherJson = JSON.parse(messageCipher); |
|
||||
let chatMessageDTO = { |
|
||||
"toUser": user, |
|
||||
"messageCipher": messageCipherJson |
|
||||
} |
|
||||
messageSend(JSON.stringify(chatMessageDTO)); |
|
||||
}) |
|
||||
|
|
||||
document.getElementById('user-search').addEventListener('submit', function(e) { |
|
||||
e.preventDefault(); |
|
||||
let contactsBox = document.getElementById('contacts-box'); |
|
||||
let temp = contactsBox.innerHTML; |
|
||||
// log.trace(temp);
|
|
||||
let searchTerm = document.getElementById('user-search-term').value; |
|
||||
log.debug("search term value = " + searchTerm); |
|
||||
let list = JSON.parse(sessionStorage.getItem('activeUsers')); |
|
||||
log.debug("active users"); |
|
||||
log.debug(list); |
|
||||
let fuse = new Fuse(list, fuseOptions); |
|
||||
let searchResult = fuse.search(searchTerm); |
|
||||
populateContactsBox(contactsBox, searchResult); |
|
||||
addUserCallBacks(); |
|
||||
log.debug(searchResult); |
|
||||
}) |
|
||||
document.getElementById('user-search-term').addEventListener('input', function(e) { |
|
||||
e.preventDefault(); |
|
||||
if (this.value.length < 2) { |
|
||||
log.debug("inputted") |
|
||||
let cancelButton = document.getElementById('user-search-cancel'); |
|
||||
cancelButton.hidden = false; |
|
||||
} |
|
||||
}) |
|
||||
document.getElementById('user-search-cancel').addEventListener('click', function(e) { |
|
||||
e.preventDefault(); |
|
||||
let list = JSON.parse(sessionStorage.getItem('activeUsers')); |
|
||||
let contactsBox = document.getElementById('contacts-box'); |
|
||||
populateContactsBox(contactsBox,list); |
|
||||
addUserCallBacks(); |
|
||||
document.getElementById('user-search-term').value = ""; |
|
||||
this.hidden = true; |
|
||||
}) |
|
||||
|
|
||||
function populateContactsBox(contactsBox, list) |
|
||||
{ |
|
||||
let userContactBoxList = ""; |
|
||||
list.forEach(function(activeUser) { |
|
||||
log.debug(activeUser); |
|
||||
if (activeUser.online) { |
|
||||
userContactBoxList += userContactOnlineTemplate(activeUser); |
|
||||
} else { |
|
||||
userContactBoxList += userContactOfflineTemplate(activeUser); |
|
||||
} |
|
||||
}) |
|
||||
contactsBox.innerHTML = userContactBoxList; |
|
||||
} |
|
||||
|
|
||||
|
|
||||
|
|
||||
// console.log('Credentials = ' + JSON.parse(sessionStorage.getItem('credentials')));
|
|
||||
|
|
||||
|
|
||||
function messageSend(chatMessageDTO) { |
|
||||
let headers = new Headers(); |
|
||||
// console.log("Token = " + btoa("hmm" + ":" + "hmm"))
|
|
||||
|
|
||||
// headers.append('Accept','application/json')
|
|
||||
headers.append('Content-Type', 'application/json'); |
|
||||
// headers.append('Authorization', basicAuthToken);
|
|
||||
headers.append('X-AUTH-TOKEN', authToken); |
|
||||
fetch(postNewMessageUrl, { |
|
||||
method: 'POST', |
|
||||
headers: headers, |
|
||||
body: chatMessageDTO |
|
||||
}) |
|
||||
.then(response => { |
|
||||
console.log(response); |
|
||||
return response.clone(); |
|
||||
}) |
|
||||
.then(response => fetchHandler(response)); |
|
||||
} |
|
||||
|
|
||||
|
|
||||
async function getAllMessages(toUser) { |
|
||||
let headers = new Headers(); |
|
||||
// headers.append('Accept','application/json')
|
|
||||
// headers.append('Content-Type', 'application/json');
|
|
||||
// headers.append('Authorization', basicAuthToken);
|
|
||||
headers.append('X-AUTH-TOKEN', authToken); |
|
||||
let response = await fetch(getAllMessagesUrl + toUser, { |
|
||||
method: 'GET', |
|
||||
headers: headers |
|
||||
}); |
|
||||
console.log(response); |
|
||||
if (fetchErrorHandler(response.clone())) { |
|
||||
return null; |
|
||||
} |
|
||||
// if (response.status == 440) {
|
|
||||
// window.alert('Token has expired. Please login again');
|
|
||||
// return null;
|
|
||||
// }
|
|
||||
let data = await response.json(); |
|
||||
return data; |
|
||||
} |
|
||||
|
|
||||
async function getNewMessages(toUser, lastMessageTimeStamp) { |
|
||||
let headers = new Headers(); |
|
||||
// headers.append('Authorization', basicAuthToken);
|
|
||||
headers.append('X-AUTH-TOKEN', authToken); |
|
||||
let response = await fetch(`${getNewMessagesUrl}${toUser}/${lastMessageTimeStamp}`, { |
|
||||
method: 'GET', |
|
||||
headers: headers |
|
||||
}); |
|
||||
console.log(response.clone()); |
|
||||
if (fetchErrorHandler(response.clone())) { |
|
||||
return null; |
|
||||
} |
|
||||
let data = await response.json(); |
|
||||
return data; |
|
||||
} |
|
||||
|
|
||||
|
|
||||
async function getActiveUsers(authToken2) { |
|
||||
let headers = new Headers(); |
|
||||
// headers.append('Authorization', basicAuthToken);
|
|
||||
headers.append('X-AUTH-TOKEN', authToken2); |
|
||||
let response = await fetch(getActiveUsersUrl, { |
|
||||
method: 'GET', |
|
||||
headers: headers |
|
||||
}); |
|
||||
console.log(response.clone()); |
|
||||
if (fetchErrorHandler(response.clone())) { |
|
||||
return null; |
|
||||
} |
|
||||
let data = await response.json(); |
|
||||
return data; |
|
||||
} |
|
||||
|
|
||||
$(document).ready(function() { |
|
||||
$('#action_menu_btn').click(function() { |
|
||||
$('.action_menu').toggle(); |
|
||||
}); |
|
||||
}); |
|
||||
|
|
||||
function fetchHandler(response) { |
|
||||
if (response.ok) { |
|
||||
return response.json().then(json => { |
|
||||
// the status was ok and there is a json body
|
|
||||
// return Promise.resolve({ json: json, response: response });
|
|
||||
alertify.success('Message sent succesfully' + sprintf(" (http code %d)", response.status)); |
|
||||
}).catch(err => { |
|
||||
// the status was ok but there is no json body
|
|
||||
// return Promise.resolve({ response: response });
|
|
||||
alertify.success('Message sent succesfully' + sprintf(" (http code %d)", response.status)); |
|
||||
}); |
|
||||
|
|
||||
} else { |
|
||||
return response.json().catch(err => { |
|
||||
// the status was not ok and there is no json body
|
|
||||
// throw new Error(response.statusText);
|
|
||||
alertify.error('Some error occured. Please try again.'); |
|
||||
}).then(json => { |
|
||||
// the status was not ok but there is a json body
|
|
||||
// throw new Error(json.error.message); // example error message returned by a REST
|
|
||||
let delay = alertify.get('notifier', 'delay'); |
|
||||
alertify.set('notifier', 'delay', 30); |
|
||||
let errorMessage = ""; |
|
||||
json.errors.forEach(function(data) { |
|
||||
errorMessage += sprintf("Field Name: %s \n Rejected value: %s \n Reason: %s \n", data.field_name, data.rejected_value, data.error_message); |
|
||||
}); |
|
||||
alertify.error(sprintf('There were errors in your message - %s', errorMessage)); |
|
||||
alertify.set('notifier', 'delay', delay); |
|
||||
}); |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
|
|
||||
function fetchErrorHandler(response) { |
|
||||
// alertify.success('Current position : ' + alertify.get('notifier', 'position'));
|
|
||||
if (!response.ok) { |
|
||||
return response.text().catch(err => { |
|
||||
// the status was not ok and there is no json body
|
|
||||
// throw new Error(response.statusText);
|
|
||||
// window.alert(sprintf('Some error occured. Http code is %s', response.status));
|
|
||||
alertify.error(sprintf('Some error occured. Http code is %s', response.status)); |
|
||||
return true; |
|
||||
}).then(json => { |
|
||||
// the status was not ok but there is a json body
|
|
||||
// throw new Error(json.error.message); // example error message returned by a REST API
|
|
||||
// window.alert(sprintf('Error: %s (Http code %s)', json, response.status));
|
|
||||
alertify.error(sprintf('Some error occured. Http code is %s', response.status)); |
|
||||
console.log(json); |
|
||||
return true; |
|
||||
}); |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
function scrollChatAreaAnimated(delay) { |
|
||||
$(chatAreaNew).stop().animate({ |
|
||||
scrollTop: $(chatAreaNew)[0].scrollHeight |
|
||||
}, delay); |
|
||||
} |
|
@ -1 +0,0 @@ |
|||||
log.info("test success"); |
|
794
chatto/src/main/javascript/ts/bundle.js
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -1,311 +0,0 @@ |
|||||
<!DOCTYPE html> |
|
||||
<html xmlns:th="http://www.thymeleaf.org"> |
|
||||
|
|
||||
<head> |
|
||||
|
|
||||
<script src="https://code.jquery.com/jquery-2.1.4.min.js" th:if="false"></script> |
|
||||
<script src="http://blackpeppersoftware.github.io/thymeleaf-fragment.js/thymeleaf-fragment.js" defer="defer" th:if="false"></script> |
|
||||
|
|
||||
<div th:replace="fragments/head :: headFragment"> |
|
||||
<meta charset="UTF-8"> |
|
||||
<title id="pageTitle">Chat</title> |
|
||||
</div> |
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/sjcl/1.0.8/sjcl.min.js" integrity="sha256-nIoG9XIePM1QNttI6KAGLYGNxc4DNinxxmOZW0/Z7uA=" crossorigin="anonymous"></script> |
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/handlebars.js/4.4.2/handlebars.min.js" integrity="sha256-oh7N5nthuhldTk8/34Za7FXv3BkeVN9vAnYk/pLfC78=" crossorigin="anonymous"></script> |
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/dompurify/2.0.3/purify.min.js" integrity="sha256-58eGKW6SunbeAY1RP9WEbg3nViB9o1qDnxV4yCITqx4=" crossorigin="anonymous"></script> |
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/markdown-it/10.0.0/markdown-it.min.js"></script> |
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/AlertifyJS/1.12.0/alertify.min.js" integrity="sha256-yscIZgtlDR9q6eoYCRmcaiNE6W80UFSnq+6Llwu4NLI=" crossorigin="anonymous"></script> |
|
||||
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/AlertifyJS/1.12.0/css/alertify.min.css" integrity="sha256-nhstgDCuZGQRk+wvwXZIPt278arHtuZKJ1YQ0rrXiL4=" crossorigin="anonymous" /> |
|
||||
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/AlertifyJS/1.12.0/css/themes/default.css" integrity="sha256-dawRQVhnqw8jRXaGnK0aj/NpOsPaQm+Em1sWN+fvegI=" crossorigin="anonymous" /> |
|
||||
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/AlertifyJS/1.12.0/css/themes/bootstrap.css" integrity="sha256-1fgYpB3cyITZIur7E+Mj3R54NtlN9HwHykgKTJf0pmU=" crossorigin="anonymous" /> |
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/fuse.js/3.4.5/fuse.min.js" integrity="sha256-Yrh3VGzE4d9b4KANknPJAhfcKt9SgHTL0v/FrJFoPzw=" crossorigin="anonymous"></script> |
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/loglevel/1.6.4/loglevel.min.js" integrity="sha256-ACTlnmNCkOooSKkPCKYbiex8WLE82aeiN+Z9ElZag5Q=" crossorigin="anonymous"></script> |
|
||||
<script src="./bundle.js"></script> |
|
||||
<link rel="stylesheet" th:href="@{/css/chat.css}" href="../../resources/static/css/chat.css"> |
|
||||
|
|
||||
|
|
||||
|
|
||||
<!-- <script th:src="@{js/my_Crypto.js}" type="text/javascript"></script> --> |
|
||||
|
|
||||
|
|
||||
</head> |
|
||||
|
|
||||
<body> |
|
||||
<div th:include="fragments/navbar :: navbarFragment"></div> |
|
||||
<header id="chat-section"> |
|
||||
<div class="dark-overlay"> |
|
||||
<div class="chat-inner container bg-primary"> |
|
||||
<div class="row"> |
|
||||
<div class="col-sm d-lg-block"> |
|
||||
<h1 class="display-4">Chat with your friends</h1> |
|
||||
<div class="d-flex"> |
|
||||
<div class="p-4 align-self-start"> |
|
||||
|
|
||||
</div> |
|
||||
<div class="p-4 align-self-end"> |
|
||||
|
|
||||
Lorem ipsum dolor sit, amet consectetur adipisicing elit. Laboriosam dolorem nostrum consequatur eos voluptates. Ipsam ullam quos illo qui. Quaerat corrupti nisi numquam rerum quasi nesciunt deserunt fugit commodi consequatur! |
|
||||
|
|
||||
</div> |
|
||||
</div> |
|
||||
</div> |
|
||||
</div> |
|
||||
|
|
||||
</div> |
|
||||
</div> |
|
||||
</header> |
|
||||
<div class="container-fluid h-100"> |
|
||||
<div class="row justify-content-center h-100 mt-3"> |
|
||||
<div class="col-md-4 col-xl-3 chat"> |
|
||||
<div class="card mb-sm-3 mb-md-0 contacts_card"> |
|
||||
<div class="card-header"> |
|
||||
<form action="#" id="user-search"> |
|
||||
<div class="input-group"> |
|
||||
<input type="text" placeholder="Search..." id="user-search-term" class="form-control search"> |
|
||||
<button class="search-cancel" id="user-search-cancel" hidden><i class="fas fa-times"></i></button> |
|
||||
<div class="input-group-prepend"> |
|
||||
|
|
||||
<button class="input-group-text search_btn"><i class="fas fa-search"></i></button> |
|
||||
</div> |
|
||||
</div> |
|
||||
</form> |
|
||||
</div> |
|
||||
<div class="card-body contacts_body"> |
|
||||
<ui class="contacts"> |
|
||||
<li class="active"> |
|
||||
<div class="d-flex bd-highlight"> |
|
||||
<div class="img_cont"> |
|
||||
<img src="https://static.turbosquid.com/Preview/001292/481/WV/_D.jpg" class="rounded-circle user_img"> |
|
||||
<span class="online_icon"></span> |
|
||||
</div> |
|
||||
<div class="user_info"> |
|
||||
<span>Khalid</span> |
|
||||
<p>Kalid is online</p> |
|
||||
</div> |
|
||||
</div> |
|
||||
</li> |
|
||||
</ui> |
|
||||
<ui class="contacts" id="contacts-box"> |
|
||||
<th:block th:each="au: ${activeUsers}"> |
|
||||
<li name="user-box" class="user-box"> |
|
||||
<div class="d-flex bd-highlight"> |
|
||||
<div class="img_cont"> |
|
||||
<img src="https://static.turbosquid.com/Preview/001292/481/WV/_D.jpg" class="rounded-circle user_img"> |
|
||||
<span th:if="${au.online == true}" class="online_icon"></span> |
|
||||
</div> |
|
||||
<div class="user_info"> |
|
||||
<span class="to-user-span" th:text="${au.userName}">Khalid</span> |
|
||||
<div th:switch="${au.online}"> |
|
||||
<p th:case="true" th:text="${au.userName} + ' is online'">Khalid is online</p> |
|
||||
<th:block th:case="false"> |
|
||||
<th:block th:if="${au.lastActive == null}"> |
|
||||
<p th:text="'User has not logged in yet'"></p> |
|
||||
</th:block> |
|
||||
<th:block th:if="${au.lastActive != null}"> |
|
||||
<p th:text="'Last active ' + ${au.lastActive}">Last active 3 hours ago</p> |
|
||||
</th:block> |
|
||||
<!-- <p th:case="${au.online == true}" th:text="${au.userName} + ' is online'">Khalid is online</p> |
|
||||
<p th:if="${au.online == false}" th:text="${au.userName} + ' is offline' + ' Last active = ' + ${au.lastActive}">Khalid is offline. --> |
|
||||
<!-- <span th:text="'Last active = ' + ${au.lastActive}"></span> --> |
|
||||
</th:block> |
|
||||
</div> |
|
||||
</div> |
|
||||
<div class="d-flex flex-column ml-auto"> |
|
||||
<div class="text-right">Dec 25</div> |
|
||||
<div style="color: rgba(255,255,255,0.7);">Hello how are you</div> |
|
||||
</div> |
|
||||
</div> |
|
||||
</li> |
|
||||
</th:block> |
|
||||
</ui> |
|
||||
</div> |
|
||||
<div class="card-footer"></div> |
|
||||
</div> |
|
||||
</div> |
|
||||
<div class="col-md-8 col-xl-6 chat"> |
|
||||
<div class="card" id="no-user-selected"> |
|
||||
<div class="m-auto"> |
|
||||
<div class="d-flex justify-content-center"> |
|
||||
<div class="align-self-center"> |
|
||||
<h2 class="display-4 no-user-selected-h2">Please select a user</h2> |
|
||||
<input class="form-control type_msg" size="10" type="password" id="passphrase-initial" placeholder="Passphrase " required> |
|
||||
</div> |
|
||||
</div> |
|
||||
</div> |
|
||||
</div> |
|
||||
<div class="card" id="chat-card" hidden> |
|
||||
<div class="card-header msg_head"> |
|
||||
<div class="d-flex bd-highlight"> |
|
||||
<div class="img_cont"> |
|
||||
<img src="https://static.turbosquid.com/Preview/001292/481/WV/_D.jpg" class="rounded-circle user_img"> |
|
||||
<span class="online_icon"></span> |
|
||||
</div> |
|
||||
<div class="user_info"> |
|
||||
<span id="user-name-span">Chat with Khalid</span> |
|
||||
<p id="num-messages-p">1767 Messages</p> |
|
||||
</div> |
|
||||
<div class="video_cam"> |
|
||||
<span><i class="fas fa-video"></i></span> |
|
||||
<span><i class="fas fa-phone"></i></span> |
|
||||
</div> |
|
||||
</div> |
|
||||
<span id="action_menu_btn"><i class="fas fa-ellipsis-v"></i></span> |
|
||||
<div class="action_menu"> |
|
||||
<ul> |
|
||||
<li><i class="fas fa-user-circle"></i> View profile</li> |
|
||||
<li><i class="fas fa-users"></i> Add to close friends</li> |
|
||||
<li><i class="fas fa-plus"></i> Add to group</li> |
|
||||
<li><i class="fas fa-ban"></i> Block</li> |
|
||||
</ul> |
|
||||
</div> |
|
||||
</div> |
|
||||
<div class="card-body msg_card_body" id="chat_area_new"> |
|
||||
</div> |
|
||||
<div class="card-footer"> |
|
||||
<form action="#" th:object="${chatMessageDTO}" method="post" id="chatMessageForm" class="needs-validation" novalidate> |
|
||||
<div class="input-group"> |
|
||||
<div class="input-group-append"> |
|
||||
<span class="input-group-text attach_btn"><i class="fas fa-paperclip"></i></span> |
|
||||
</div> |
|
||||
<input class="form-control type_msg" size="10" type="password" id="passphrase" placeholder="Passphrase " required> |
|
||||
<textarea name="" id="chatInput" class="form-control type_msg" placeholder="Type your message..." required></textarea> |
|
||||
<div class="input-group-append"> |
|
||||
<button class="input-group-text send_btn"><i class="fas fa-location-arrow"></i></button> |
|
||||
</div> |
|
||||
</div> |
|
||||
</form> |
|
||||
</div> |
|
||||
</div> |
|
||||
</div> |
|
||||
</div> |
|
||||
</div> |
|
||||
<section hidden> |
|
||||
<div class="container"> |
|
||||
<div class="row"> |
|
||||
<div class="col-sm"> |
|
||||
|
|
||||
<h4 class="display-4 text-center py-2">Chat</h4> |
|
||||
<div class="card text-white bg-primary mb-3 card-form rounded mx-auto"> |
|
||||
|
|
||||
<div class="card-body rounded"> |
|
||||
<!-- <h4 class="card-title">Chat</h4> --> |
|
||||
<div class="form-group"> |
|
||||
<textarea id="chatTextArea" class="form-control-lg py-2" disabled></textarea> |
|
||||
</div> |
|
||||
<!-- <form action="#" th:action="@{/seedstartermng}" th:object="${seedStarter}" method="post"> --> |
|
||||
<!-- th:action="@{/api/chat}" --> |
|
||||
<div class="card-text"> |
|
||||
|
|
||||
</div> |
|
||||
<form action="#" th:object="${chatMessageDTO}" method="post" class="needs-validation" novalidate> |
|
||||
<div class="row"> |
|
||||
<div class="col-3"> |
|
||||
<div class="form-group"> |
|
||||
<label class="lead" for="toUser">User to send to: </label> |
|
||||
<th:block th:each="userName: ${userNames}"> |
|
||||
<input class="form-control" type="radio" th:field="*{toUser}" th:value="${userName}"> |
|
||||
<label class="btn btn-secondary" th:for="${#ids.prev('toUser')}" th:text="${userName}"> |
|
||||
Demo User |
|
||||
</label> |
|
||||
</th:block> |
|
||||
</div> |
|
||||
</div> |
|
||||
<div class="col"> |
|
||||
<div class="my-form-inputs container"> |
|
||||
<div class="form-group"> |
|
||||
<label for="chatInput">Your message: </label> |
|
||||
<textarea class="form-control" type="text" required></textarea> |
|
||||
<div class="invalid-feedback"> |
|
||||
Cannot be empty |
|
||||
</div> |
|
||||
|
|
||||
</div> |
|
||||
<div class="form-group"> |
|
||||
<label for="passphrase">Passphrase: </label> |
|
||||
<input class="form-control" type="password" required> |
|
||||
</div> |
|
||||
<div class="form-group text-center"> |
|
||||
<button class="btn btn-secondary mx-auto">Submit</button> |
|
||||
</div> |
|
||||
</div> |
|
||||
</div> |
|
||||
</div> |
|
||||
</form> |
|
||||
</div> |
|
||||
</div> |
|
||||
</div> |
|
||||
</div> |
|
||||
</div> |
|
||||
</section> |
|
||||
<template id="msg_container_template"> |
|
||||
<div class="d-flex justify-content-start mb-4"> |
|
||||
<div class="img_cont_msg"> |
|
||||
<img src="https://static.turbosquid.com/Preview/001292/481/WV/_D.jpg" class="rounded-circle user_img_msg"> |
|
||||
</div> |
|
||||
<div class="msg_container"> |
|
||||
{{{message}}} |
|
||||
<span class="msg_time">{{time}}</span> |
|
||||
</div> |
|
||||
</div> |
|
||||
</template> |
|
||||
|
|
||||
<template id="msg_container_send_template"> |
|
||||
<div class="d-flex justify-content-end mb-4"> |
|
||||
<div class="msg_container_send"> |
|
||||
{{{message}}} |
|
||||
<span class="msg_time_send">{{time}}</span> |
|
||||
</div> |
|
||||
<!-- <div class="img_cont_msg"> |
|
||||
<img src="https://static.turbosquid.com/Preview/001292/481/WV/_D.jpg" |
|
||||
class="rounded-circle user_img_msg"> |
|
||||
</div> --> |
|
||||
{{{avatar}}} |
|
||||
</div> |
|
||||
</template> |
|
||||
|
|
||||
<template id="user-contact-online-template"> |
|
||||
<li name="user-box" class="user-box"> |
|
||||
<div class="d-flex bd-highlight"> |
|
||||
<div class="img_cont"> |
|
||||
<img src="https://static.turbosquid.com/Preview/001292/481/WV/_D.jpg" class="rounded-circle user_img"> |
|
||||
<span class="online_icon"></span> |
|
||||
</div> |
|
||||
<div class="user_info"> |
|
||||
<span class="to-user-span">{{userName}}</span> |
|
||||
<p>{{userName}} is online</p> |
|
||||
</div> |
|
||||
<div class="d-flex flex-column ml-auto"> |
|
||||
<div class="text-right">Dec 25</div> |
|
||||
<div style="color: rgba(255,255,255,0.7);">Hello how are you</div> |
|
||||
</div> |
|
||||
</div> |
|
||||
</li> |
|
||||
</template> |
|
||||
<template id="user-contact-offline-template"> |
|
||||
<li name="user-box" class="user-box"> |
|
||||
<div class="d-flex bd-highlight"> |
|
||||
<div class="img_cont"> |
|
||||
<img src="https://static.turbosquid.com/Preview/001292/481/WV/_D.jpg" class="rounded-circle user_img"> |
|
||||
</div> |
|
||||
<div class="user_info"> |
|
||||
<span class="to-user-span">{{userName}}</span> |
|
||||
<p>Last active {{lastActive}}</p> |
|
||||
</div> |
|
||||
<div class="d-flex flex-column ml-auto"> |
|
||||
<div class="text-right">Dec 25</div> |
|
||||
<div style="color: rgba(255,255,255,0.7);">Hello how are you</div> |
|
||||
</div> |
|
||||
</div> |
|
||||
</li> |
|
||||
</template> |
|
||||
|
|
||||
</body> |
|
||||
<!-- <script th:src="@{js/chat.js}" type="text/javascript"></script> --> |
|
||||
<script src="../static/js/bundle.js" th:src="@{/js/bundle.js}"></script> |
|
||||
<script src="../static/js/chatStatic.js" th:if="false"></script> |
|
||||
|
|
||||
|
|
||||
</html> |
|
||||
|
|
||||
<!-- <div th:include="::frag (${value1},${value2})">...</div> |
|
||||
<div th:include="::frag (onevar=${value1},twovar=${value2})">...</div> --> |
|
@ -1,157 +0,0 @@ |
|||||
Arguments: |
|
||||
/home/rohan/.nvm/versions/node/v12.10.0/bin/node /home/rohan/.nvm/versions/node/v12.10.0/bin/yarn add handlebars.js |
|
||||
|
|
||||
PATH: |
|
||||
/home/rohan/.sdkman/candidates/maven/current/bin:/home/rohan/.sdkman/candidates/java/current/bin:/home/rohan/.nvm/versions/node/v12.10.0/bin:/home/rohan/miniconda3/condabin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/home/rohan/.cargo/bin:/home/rohan/.platformio/penv/bin |
|
||||
|
|
||||
Yarn version: |
|
||||
1.19.2 |
|
||||
|
|
||||
Node version: |
|
||||
12.10.0 |
|
||||
|
|
||||
Platform: |
|
||||
linux x64 |
|
||||
|
|
||||
Trace: |
|
||||
Error: https://registry.yarnpkg.com/handlebars.js: Not found |
|
||||
at Request.params.callback [as _callback] (/home/rohan/.nvm/versions/node/v12.10.0/lib/node_modules/yarn/lib/cli.js:66927:18) |
|
||||
at Request.self.callback (/home/rohan/.nvm/versions/node/v12.10.0/lib/node_modules/yarn/lib/cli.js:140586:22) |
|
||||
at Request.emit (events.js:209:13) |
|
||||
at Request.<anonymous> (/home/rohan/.nvm/versions/node/v12.10.0/lib/node_modules/yarn/lib/cli.js:141558:10) |
|
||||
at Request.emit (events.js:209:13) |
|
||||
at IncomingMessage.<anonymous> (/home/rohan/.nvm/versions/node/v12.10.0/lib/node_modules/yarn/lib/cli.js:141480:12) |
|
||||
at Object.onceWrapper (events.js:298:28) |
|
||||
at IncomingMessage.emit (events.js:214:15) |
|
||||
at endReadableNT (_stream_readable.js:1178:12) |
|
||||
at processTicksAndRejections (internal/process/task_queues.js:80:21) |
|
||||
|
|
||||
npm manifest: |
|
||||
{ |
|
||||
"dependencies": { |
|
||||
"alertifyjs": "^1.12.0", |
|
||||
"chart.js": "^2.9.3", |
|
||||
"dompurify": "^2.0.7", |
|
||||
"fuse.js": "^3.4.6", |
|
||||
"loglevel": "^1.6.6", |
|
||||
"markdown-it": "^10.0.0" |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
yarn manifest: |
|
||||
No manifest |
|
||||
|
|
||||
Lockfile: |
|
||||
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. |
|
||||
# yarn lockfile v1 |
|
||||
|
|
||||
|
|
||||
alertifyjs@^1.12.0: |
|
||||
version "1.12.0" |
|
||||
resolved "https://registry.yarnpkg.com/alertifyjs/-/alertifyjs-1.12.0.tgz#75be1eac23e059d3b990ab076979d36a45aa21ac" |
|
||||
integrity sha512-BWEFsLhPM1MBEAQ6jFATNO8ESCh1LDZzUslJ2g/E6NnI3QfyfIvpCuw07SiUQy59E6HSsdb8c5RgqiOwTcRQ2Q== |
|
||||
|
|
||||
argparse@^1.0.7: |
|
||||
version "1.0.10" |
|
||||
resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" |
|
||||
integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== |
|
||||
dependencies: |
|
||||
sprintf-js "~1.0.2" |
|
||||
|
|
||||
chart.js@^2.9.3: |
|
||||
version "2.9.3" |
|
||||
resolved "https://registry.yarnpkg.com/chart.js/-/chart.js-2.9.3.tgz#ae3884114dafd381bc600f5b35a189138aac1ef7" |
|
||||
integrity sha512-+2jlOobSk52c1VU6fzkh3UwqHMdSlgH1xFv9FKMqHiNCpXsGPQa/+81AFa+i3jZ253Mq9aAycPwDjnn1XbRNNw== |
|
||||
dependencies: |
|
||||
chartjs-color "^2.1.0" |
|
||||
moment "^2.10.2" |
|
||||
|
|
||||
chartjs-color-string@^0.6.0: |
|
||||
version "0.6.0" |
|
||||
resolved "https://registry.yarnpkg.com/chartjs-color-string/-/chartjs-color-string-0.6.0.tgz#1df096621c0e70720a64f4135ea171d051402f71" |
|
||||
integrity sha512-TIB5OKn1hPJvO7JcteW4WY/63v6KwEdt6udfnDE9iCAZgy+V4SrbSxoIbTw/xkUIapjEI4ExGtD0+6D3KyFd7A== |
|
||||
dependencies: |
|
||||
color-name "^1.0.0" |
|
||||
|
|
||||
chartjs-color@^2.1.0: |
|
||||
version "2.4.1" |
|
||||
resolved "https://registry.yarnpkg.com/chartjs-color/-/chartjs-color-2.4.1.tgz#6118bba202fe1ea79dd7f7c0f9da93467296c3b0" |
|
||||
integrity sha512-haqOg1+Yebys/Ts/9bLo/BqUcONQOdr/hoEr2LLTRl6C5LXctUdHxsCYfvQVg5JIxITrfCNUDr4ntqmQk9+/0w== |
|
||||
dependencies: |
|
||||
chartjs-color-string "^0.6.0" |
|
||||
color-convert "^1.9.3" |
|
||||
|
|
||||
color-convert@^1.9.3: |
|
||||
version "1.9.3" |
|
||||
resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" |
|
||||
integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== |
|
||||
dependencies: |
|
||||
color-name "1.1.3" |
|
||||
|
|
||||
color-name@1.1.3: |
|
||||
version "1.1.3" |
|
||||
resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" |
|
||||
integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= |
|
||||
|
|
||||
color-name@^1.0.0: |
|
||||
version "1.1.4" |
|
||||
resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" |
|
||||
integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== |
|
||||
|
|
||||
dompurify@^2.0.7: |
|
||||
version "2.0.7" |
|
||||
resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-2.0.7.tgz#f8266ad38fe1602fb5b3222f31eedbf5c16c4fd5" |
|
||||
integrity sha512-S3O0lk6rFJtO01ZTzMollCOGg+WAtCwS3U5E2WSDY/x/sy7q70RjEC4Dmrih5/UqzLLB9XoKJ8KqwBxaNvBu4A== |
|
||||
|
|
||||
entities@~2.0.0: |
|
||||
version "2.0.0" |
|
||||
resolved "https://registry.yarnpkg.com/entities/-/entities-2.0.0.tgz#68d6084cab1b079767540d80e56a39b423e4abf4" |
|
||||
integrity sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw== |
|
||||
|
|
||||
fuse.js@^3.4.6: |
|
||||
version "3.4.6" |
|
||||
resolved "https://registry.yarnpkg.com/fuse.js/-/fuse.js-3.4.6.tgz#545c3411fed88bf2e27c457cab6e73e7af697a45" |
|
||||
integrity sha512-H6aJY4UpLFwxj1+5nAvufom5b2BT2v45P1MkPvdGIK8fWjQx/7o6tTT1+ALV0yawQvbmvCF0ufl2et8eJ7v7Cg== |
|
||||
|
|
||||
linkify-it@^2.0.0: |
|
||||
version "2.2.0" |
|
||||
resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-2.2.0.tgz#e3b54697e78bf915c70a38acd78fd09e0058b1cf" |
|
||||
integrity sha512-GnAl/knGn+i1U/wjBz3akz2stz+HrHLsxMwHQGofCDfPvlf+gDKN58UtfmUquTY4/MXeE2x7k19KQmeoZi94Iw== |
|
||||
dependencies: |
|
||||
uc.micro "^1.0.1" |
|
||||
|
|
||||
loglevel@^1.6.6: |
|
||||
version "1.6.6" |
|
||||
resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.6.6.tgz#0ee6300cc058db6b3551fa1c4bf73b83bb771312" |
|
||||
integrity sha512-Sgr5lbboAUBo3eXCSPL4/KoVz3ROKquOjcctxmHIt+vol2DrqTQe3SwkKKuYhEiWB5kYa13YyopJ69deJ1irzQ== |
|
||||
|
|
||||
markdown-it@^10.0.0: |
|
||||
version "10.0.0" |
|
||||
resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-10.0.0.tgz#abfc64f141b1722d663402044e43927f1f50a8dc" |
|
||||
integrity sha512-YWOP1j7UbDNz+TumYP1kpwnP0aEa711cJjrAQrzd0UXlbJfc5aAq0F/PZHjiioqDC1NKgvIMX+o+9Bk7yuM2dg== |
|
||||
dependencies: |
|
||||
argparse "^1.0.7" |
|
||||
entities "~2.0.0" |
|
||||
linkify-it "^2.0.0" |
|
||||
mdurl "^1.0.1" |
|
||||
uc.micro "^1.0.5" |
|
||||
|
|
||||
mdurl@^1.0.1: |
|
||||
version "1.0.1" |
|
||||
resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e" |
|
||||
integrity sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4= |
|
||||
|
|
||||
moment@^2.10.2: |
|
||||
version "2.24.0" |
|
||||
resolved "https://registry.yarnpkg.com/moment/-/moment-2.24.0.tgz#0d055d53f5052aa653c9f6eb68bb5d12bf5c2b5b" |
|
||||
integrity sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg== |
|
||||
|
|
||||
sprintf-js@~1.0.2: |
|
||||
version "1.0.3" |
|
||||
resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" |
|
||||
integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= |
|
||||
|
|
||||
uc.micro@^1.0.1, uc.micro@^1.0.5: |
|
||||
version "1.0.6" |
|
||||
resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-1.0.6.tgz#9c411a802a409a91fc6cf74081baba34b24499ac" |
|
||||
integrity sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA== |
|
@ -1,547 +0,0 @@ |
|||||
// import { sprintf } from 'sprintf-js';
|
|
||||
// import { vsprintf } from 'sprintf-js';
|
|
||||
/*var off_payment_method = document.getElementsByName('offline_payment_method'); |
|
||||
var ischecked_method = false; |
|
||||
for ( var i = 0; i < off_payment_method.length; i++) { |
|
||||
if(off_payment_method[i].checked) { |
|
||||
ischecked_method = true; |
|
||||
break; |
|
||||
} |
|
||||
} |
|
||||
if(!ischecked_method) { //payment method button is not checked
|
|
||||
alert("Please choose Offline Payment Method"); |
|
||||
}*/ |
|
||||
var toUserRadios = document.getElementsByName('toUser'); |
|
||||
var isCheckedUser = false; |
|
||||
var chatTextArea = document.getElementById('chatTextArea'); |
|
||||
|
|
||||
var postNewMessageUrl = `http://${hostAddress}/api/chat/post/message`; //hostAddress variable is set in the thymeleaf head fragment
|
|
||||
var getAllMessagesUrl = `http://${hostAddress}/api/chat/get/messages/`; |
|
||||
var getNewMessagesUrl = `http://${hostAddress}/api/chat/get/messages/`; |
|
||||
var getActiveUsersUrl = `http://${hostAddress}/api/chat/get/active-users/`; |
|
||||
// var postNewMessageUrl = "http://localhost:8080/api/chat/post/message";
|
|
||||
// var getAllMessagesUrl = "http://localhost:8080/api/chat/get/messages/";
|
|
||||
// var getNewMessagesUrl = "http://localhost:8080/api/chat/get/messages/";
|
|
||||
// var messageLog = [];
|
|
||||
var username = localStorage.getItem('username'); |
|
||||
var authToken = localStorage.getItem('authToken'); |
|
||||
|
|
||||
var passphraseInput = document.getElementById('passphrase'); |
|
||||
var iterations = 100000; |
|
||||
|
|
||||
var source = document.getElementById("msg_container_template").innerHTML; |
|
||||
var msgContainerTemplate = Handlebars.compile(source); |
|
||||
var source = document.getElementById("msg_container_send_template").innerHTML; |
|
||||
var msgContainerSendTemplate = Handlebars.compile(source); |
|
||||
var source = document.getElementById("user-contact-online-template").innerHTML; |
|
||||
var userContactOnlineTemplate = Handlebars.compile(source); |
|
||||
var source = document.getElementById("user-contact-offline-template").innerHTML; |
|
||||
var userContactOfflineTemplate = Handlebars.compile(source); |
|
||||
|
|
||||
var chatAreaNew = document.getElementById('chat_area_new'); |
|
||||
|
|
||||
var userBoxes = document.getElementsByName('user-box'); |
|
||||
|
|
||||
var md = window.markdownit(); |
|
||||
|
|
||||
var activeUsers = {}; |
|
||||
|
|
||||
var fuseOptions = { |
|
||||
shouldSort: true, |
|
||||
threshold: 0.01, |
|
||||
location: 0, |
|
||||
distance: 100, |
|
||||
maxPatternLength: 32, |
|
||||
minMatchCharLength: 1, |
|
||||
keys: [ |
|
||||
"userName", |
|
||||
] |
|
||||
}; |
|
||||
|
|
||||
log.setLevel('TRACE'); |
|
||||
|
|
||||
alertify.set('notifier', 'position', 'top-center'); |
|
||||
|
|
||||
// Loop through the buttons and add the active class to the current/clicked button
|
|
||||
// for (var i = 0; i < btns.length; i++) {
|
|
||||
// btns[i].addEventListener("click", function() {
|
|
||||
// var current = document.getElementsByClassName("active");
|
|
||||
|
|
||||
// // If there's no active class
|
|
||||
// if (current.length > 0) {
|
|
||||
// current[0].className = current[0].className.replace(" active", "");
|
|
||||
// }
|
|
||||
|
|
||||
// // Add the active class to the current/clicked button
|
|
||||
// this.className += " active";
|
|
||||
// });
|
|
||||
// }
|
|
||||
|
|
||||
getActiveUsers(authToken) |
|
||||
.then(data => { |
|
||||
// activeUsers = data;
|
|
||||
sessionStorage.setItem('activeUsers', JSON.stringify(data)); |
|
||||
log.log(sessionStorage.getItem('activeUsers')); |
|
||||
}) |
|
||||
|
|
||||
for (let i = 0; i < userBoxes.length; i++) { |
|
||||
userBoxes[i].addEventListener('click', userCallBack) |
|
||||
} |
|
||||
|
|
||||
function addUserCallBacks() { |
|
||||
for (let i = 0; i < userBoxes.length; i++) { |
|
||||
userBoxes[i].addEventListener('click', userCallBack) |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
function userCallBack() { |
|
||||
let current = document.getElementsByClassName('user-box active'); |
|
||||
let passphrase = passphraseInput.value; |
|
||||
if (current.length > 0) { |
|
||||
if (passphrase == '') { |
|
||||
// alert('Please input passphrase')
|
|
||||
alertify.error('Please enter a passphrase'); |
|
||||
return; |
|
||||
} |
|
||||
current[0].className = current[0].className.replace(" active", ""); |
|
||||
|
|
||||
} |
|
||||
// Add the active class to the current/clicked button
|
|
||||
else if (current.length == 0) { |
|
||||
let elem = document.getElementById('passphrase-initial'); |
|
||||
passphrase = elem.value; |
|
||||
if (passphrase == '') { |
|
||||
// alert('Please input passphrase')
|
|
||||
alertify.error('Please enter a passphrase'); |
|
||||
return; |
|
||||
} |
|
||||
document.getElementById('no-user-selected').hidden = true; |
|
||||
document.getElementById('chat-card').hidden = false; |
|
||||
elem.hidden = true; |
|
||||
} |
|
||||
// console.log(this.getElementsByClassName('to-user-span'));
|
|
||||
let userName = this.getElementsByClassName('to-user-span')[0].innerText; |
|
||||
document.getElementById('user-name-span').innerText = userName; |
|
||||
populateMessages(userName, passphrase); |
|
||||
sessionStorage.setItem('selectedUser', userName); |
|
||||
this.className += " active"; |
|
||||
} |
|
||||
|
|
||||
function populateMessages(userName, passphrase) { |
|
||||
console.log('Selected user = ' + userName); |
|
||||
if (passphrase == '') { |
|
||||
alert('Please input passphrase') |
|
||||
return; |
|
||||
} |
|
||||
// console.log(userName);
|
|
||||
if (sessionStorage.getItem(userName) == null) { |
|
||||
chatTextArea.textContent = ''; |
|
||||
chatAreaNew.innerHTML = ''; |
|
||||
getAllMessages(userName) |
|
||||
.then(json => { |
|
||||
if (json == null) return; |
|
||||
console.log(json); |
|
||||
let i = 0; |
|
||||
let messageLog = []; |
|
||||
let messageLogNew = []; |
|
||||
let lastMessageTimeStamp; |
|
||||
|
|
||||
if (json.length > 0) { |
|
||||
json.forEach(function(obj) { |
|
||||
// console.log(obj.toUser);
|
|
||||
messageCipher = JSON.stringify(obj.messageCipher); |
|
||||
console.log(messageCipher); |
|
||||
// let message = sjcl.decrypt("password", messageCipher);
|
|
||||
let message = md.render(sjcl.decrypt(passphrase, messageCipher)); |
|
||||
let utcDate = obj.messageTime; |
|
||||
lastMessageTimeStamp = utcDate; |
|
||||
let localDate = new Date(utcDate); |
|
||||
let messageLine = sprintf('%s %s: %s ', localDate, obj.fromUser, message); |
|
||||
|
|
||||
|
|
||||
// localDate.``
|
|
||||
// console.log('localDate = ' + localDate);
|
|
||||
console.log(messageLine); |
|
||||
// chatTextArea.append(obj.fromUser + ": " + message + "\n");
|
|
||||
chatTextArea.append(messageLine + '\n'); |
|
||||
messageLog[i++] = messageLine; |
|
||||
chatTextArea.scrollTop = chatTextArea.scrollHeight; |
|
||||
// console.log('Message log = ' + messageLog);
|
|
||||
|
|
||||
let context = { fromUser: obj.fromUser, message: message, time: localDate.toLocaleString() }; |
|
||||
let msgContainer; |
|
||||
if (obj.fromUser == username) { |
|
||||
msgContainer = msgContainerSendTemplate(context); |
|
||||
} else { |
|
||||
msgContainer = msgContainerTemplate(context); |
|
||||
} |
|
||||
|
|
||||
messageLogNew.push(JSON.stringify(context)); |
|
||||
$(chatAreaNew).append(DOMPurify.sanitize(msgContainer)); |
|
||||
|
|
||||
|
|
||||
}); |
|
||||
sessionStorage.setItem(userName, JSON.stringify(messageLog)); |
|
||||
sessionStorage.setItem(userName + username + 'new', JSON.stringify(messageLogNew)); |
|
||||
// console.log()
|
|
||||
// sessionStorage.clear();
|
|
||||
console.log('Last message time = ' + lastMessageTimeStamp); |
|
||||
sessionStorage.setItem(userName + '-time', lastMessageTimeStamp); |
|
||||
|
|
||||
|
|
||||
} |
|
||||
}); |
|
||||
} else { |
|
||||
|
|
||||
|
|
||||
console.log("Stored messages = " + sessionStorage.getItem(userName)); |
|
||||
let storedMessages = JSON.parse(sessionStorage.getItem(userName)); |
|
||||
let storedMessagesNew = JSON.parse(sessionStorage.getItem(userName + username + 'new')); |
|
||||
let lastMessageTime = sessionStorage.getItem(userName + '-time'); |
|
||||
console.log("last message time stamp = " + lastMessageTime); |
|
||||
if (lastMessageTime != null) { |
|
||||
getNewMessages(userName, lastMessageTime) |
|
||||
.then(json => { |
|
||||
if (json == null) return; |
|
||||
console.log(json) |
|
||||
if (json.length > 0) { |
|
||||
json.forEach(function(obj) { |
|
||||
let messageCipher = JSON.stringify(obj.messageCipher); |
|
||||
let message = md.render(sjcl.decrypt(passphrase, messageCipher)); |
|
||||
// console.log(message);
|
|
||||
// chatTextArea.append(message + "\n");
|
|
||||
let utcDate = obj.messageTime; |
|
||||
lastMessageTimeStamp = utcDate; |
|
||||
let localDate = new Date(utcDate); |
|
||||
let messageLine = sprintf('%s %s: %s', localDate, obj.fromUser, message); |
|
||||
|
|
||||
// localDate.``
|
|
||||
// console.log('localDate = ' + localDate);
|
|
||||
console.log(messageLine); |
|
||||
// chatTextArea.append(obj.fromUser + ": " + message + "\n");
|
|
||||
chatTextArea.append(messageLine + '\n'); |
|
||||
chatTextArea.scrollTop = chatTextArea.scrollHeight; |
|
||||
storedMessages.push(messageLine); |
|
||||
|
|
||||
let context = { fromUser: obj.fromUser, message: message, time: localDate.toLocaleString() }; |
|
||||
let msgContainer; |
|
||||
if (obj.fromUser == username) { |
|
||||
msgContainer = msgContainerSendTemplate(context); |
|
||||
} else { |
|
||||
msgContainer = msgContainerTemplate(context); |
|
||||
} |
|
||||
|
|
||||
storedMessagesNew.push(JSON.stringify(context)); |
|
||||
$(chatAreaNew).append(DOMPurify.sanitize(msgContainer)); |
|
||||
|
|
||||
}) |
|
||||
sessionStorage.setItem(userName + '-time', lastMessageTimeStamp); |
|
||||
sessionStorage.setItem(userName, JSON.stringify(storedMessages)); |
|
||||
sessionStorage.setItem(userName + username + 'new', JSON.stringify(storedMessagesNew)); |
|
||||
console.log("this value stored" + sessionStorage.getItem(userName)) |
|
||||
console.log("last message time stamp = " + lastMessageTimeStamp); |
|
||||
console.log(sessionStorage.getItem(userName + '-time')); |
|
||||
|
|
||||
} |
|
||||
chatTextArea.textContent = ''; |
|
||||
chatAreaNew.innerHTML = ''; |
|
||||
console.log("Stored messages 2 = " + storedMessages); |
|
||||
storedMessages.forEach(function(messageLine) { |
|
||||
chatTextArea.append(messageLine + '\n'); |
|
||||
chatTextArea.scrollTop = chatTextArea.scrollHeight; |
|
||||
|
|
||||
// let context = {message: messageLine};
|
|
||||
// let msgContainer;
|
|
||||
// if(obj.fromUser == username)
|
|
||||
// {
|
|
||||
// msgContainer = msgContainerSendTemplate(context);
|
|
||||
// }
|
|
||||
// else{
|
|
||||
// msgContainer = msgContainerTemplate(context);
|
|
||||
// }
|
|
||||
|
|
||||
// $(chatAreaNew).append(msgContainer);
|
|
||||
}) |
|
||||
|
|
||||
storedMessagesNew.forEach(function(contextString) { |
|
||||
let context = JSON.parse(contextString); |
|
||||
let msgContainer; |
|
||||
if (context.fromUser == username) { |
|
||||
msgContainer = msgContainerSendTemplate(context); |
|
||||
} else { |
|
||||
msgContainer = msgContainerTemplate(context); |
|
||||
} |
|
||||
|
|
||||
$(chatAreaNew).append(DOMPurify.sanitize(msgContainer)); |
|
||||
scrollChatAreaAnimated(2400); |
|
||||
}) |
|
||||
|
|
||||
|
|
||||
}); |
|
||||
|
|
||||
|
|
||||
} |
|
||||
// chatTextArea.append(JSON.stringify(storedMessages));
|
|
||||
|
|
||||
} |
|
||||
// sessionStorage.setItem('status', 'ready');
|
|
||||
// sessionStorage.setItem('userName', messageLog);
|
|
||||
// console.log('Message log = ' + messageLog);
|
|
||||
// }
|
|
||||
|
|
||||
// let passphraseKey = userName + '-passphrase';
|
|
||||
// sessionStorage.setItem(passphraseKey, passphrase);
|
|
||||
// console.log(sessionStorage.getItem(passphraseKey));
|
|
||||
} |
|
||||
|
|
||||
// var lastMessageTimeStamp;
|
|
||||
|
|
||||
// console.log(authToken);
|
|
||||
// 'Basic ' + btoa("hmm" + ":" + "hmm")
|
|
||||
|
|
||||
Handlebars.registerHelper('avatar', function() { |
|
||||
return '<div class="img_cont_msg"> <img src="https://static.turbosquid.com/Preview/001292/481/WV/_D.jpg" class="rounded-circle user_img_msg"> </div>'; |
|
||||
}); |
|
||||
|
|
||||
|
|
||||
// var user;
|
|
||||
function getSelectedUser() { |
|
||||
for (var i = 0; i < toUserRadios.length; i++) { |
|
||||
if (toUserRadios[i].checked) { |
|
||||
let user = toUserRadios[i].value; |
|
||||
console.log('sending to user = ' + user); |
|
||||
isCheckedUser = true; |
|
||||
return user; |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
} |
|
||||
|
|
||||
function getSelectedUserNew() { |
|
||||
return sessionStorage.getItem('selectedUser'); |
|
||||
} |
|
||||
|
|
||||
document.getElementById('chatMessageForm').addEventListener('submit', function(e) { |
|
||||
let chatInput = document.getElementById('chatInput'); |
|
||||
e.preventDefault(); |
|
||||
let user = getSelectedUserNew(); |
|
||||
|
|
||||
if (!this.checkValidity()) { |
|
||||
console.log("error"); |
|
||||
this.classList.add('was-validated'); |
|
||||
return; |
|
||||
} |
|
||||
this.classList.add('was-validated'); |
|
||||
|
|
||||
if (user == null) { |
|
||||
// window.alert('please select a user');
|
|
||||
alertify.error('Please select a user'); |
|
||||
return; |
|
||||
} |
|
||||
let messageContent = chatInput.value; |
|
||||
let context = { fromUser: username, message: md.render(messageContent), time: new Date().toLocaleString() }; |
|
||||
let msgContainer = msgContainerSendTemplate(context); |
|
||||
$(chatAreaNew).append(DOMPurify.sanitize(msgContainer)); |
|
||||
scrollChatAreaAnimated(2400); |
|
||||
let messageCipher = sjcl.encrypt(passphraseInput.value, messageContent, { mode: "gcm", ts: 128, adata: "", iter: iterations }); |
|
||||
let messageCipherJson = JSON.parse(messageCipher); |
|
||||
let chatMessageDTO = { |
|
||||
"toUser": user, |
|
||||
"messageCipher": messageCipherJson |
|
||||
} |
|
||||
messageSend(JSON.stringify(chatMessageDTO)); |
|
||||
}) |
|
||||
|
|
||||
document.getElementById('user-search').addEventListener('submit', function(e) { |
|
||||
e.preventDefault(); |
|
||||
let contactsBox = document.getElementById('contacts-box'); |
|
||||
let temp = contactsBox.innerHTML; |
|
||||
// log.trace(temp);
|
|
||||
let searchTerm = document.getElementById('user-search-term').value; |
|
||||
log.debug("search term value = " + searchTerm); |
|
||||
let list = JSON.parse(sessionStorage.getItem('activeUsers')); |
|
||||
log.debug("active users"); |
|
||||
log.debug(list); |
|
||||
let fuse = new Fuse(list, fuseOptions); |
|
||||
let searchResult = fuse.search(searchTerm); |
|
||||
populateContactsBox(contactsBox, searchResult); |
|
||||
addUserCallBacks(); |
|
||||
log.debug(searchResult); |
|
||||
}) |
|
||||
document.getElementById('user-search-term').addEventListener('input', function(e) { |
|
||||
e.preventDefault(); |
|
||||
if (this.value.length < 2) { |
|
||||
log.debug("inputted") |
|
||||
let cancelButton = document.getElementById('user-search-cancel'); |
|
||||
cancelButton.hidden = false; |
|
||||
} |
|
||||
}) |
|
||||
document.getElementById('user-search-cancel').addEventListener('click', function(e) { |
|
||||
e.preventDefault(); |
|
||||
let list = JSON.parse(sessionStorage.getItem('activeUsers')); |
|
||||
let contactsBox = document.getElementById('contacts-box'); |
|
||||
populateContactsBox(contactsBox,list); |
|
||||
addUserCallBacks(); |
|
||||
document.getElementById('user-search-term').value = ""; |
|
||||
this.hidden = true; |
|
||||
}) |
|
||||
|
|
||||
function populateContactsBox(contactsBox, list) |
|
||||
{ |
|
||||
let userContactBoxList = ""; |
|
||||
list.forEach(function(activeUser) { |
|
||||
log.debug(activeUser); |
|
||||
if (activeUser.online) { |
|
||||
userContactBoxList += userContactOnlineTemplate(activeUser); |
|
||||
} else { |
|
||||
userContactBoxList += userContactOfflineTemplate(activeUser); |
|
||||
} |
|
||||
}) |
|
||||
contactsBox.innerHTML = userContactBoxList; |
|
||||
} |
|
||||
|
|
||||
|
|
||||
|
|
||||
// console.log('Credentials = ' + JSON.parse(sessionStorage.getItem('credentials')));
|
|
||||
|
|
||||
|
|
||||
function messageSend(chatMessageDTO) { |
|
||||
let headers = new Headers(); |
|
||||
// console.log("Token = " + btoa("hmm" + ":" + "hmm"))
|
|
||||
|
|
||||
// headers.append('Accept','application/json')
|
|
||||
headers.append('Content-Type', 'application/json'); |
|
||||
// headers.append('Authorization', basicAuthToken);
|
|
||||
headers.append('X-AUTH-TOKEN', authToken); |
|
||||
fetch(postNewMessageUrl, { |
|
||||
method: 'POST', |
|
||||
headers: headers, |
|
||||
body: chatMessageDTO |
|
||||
}) |
|
||||
.then(response => { |
|
||||
console.log(response); |
|
||||
return response.clone(); |
|
||||
}) |
|
||||
.then(response => fetchHandler(response)); |
|
||||
} |
|
||||
|
|
||||
|
|
||||
async function getAllMessages(toUser) { |
|
||||
let headers = new Headers(); |
|
||||
// headers.append('Accept','application/json')
|
|
||||
// headers.append('Content-Type', 'application/json');
|
|
||||
// headers.append('Authorization', basicAuthToken);
|
|
||||
headers.append('X-AUTH-TOKEN', authToken); |
|
||||
let response = await fetch(getAllMessagesUrl + toUser, { |
|
||||
method: 'GET', |
|
||||
headers: headers |
|
||||
}); |
|
||||
console.log(response); |
|
||||
if (fetchErrorHandler(response.clone())) { |
|
||||
return null; |
|
||||
} |
|
||||
// if (response.status == 440) {
|
|
||||
// window.alert('Token has expired. Please login again');
|
|
||||
// return null;
|
|
||||
// }
|
|
||||
let data = await response.json(); |
|
||||
return data; |
|
||||
} |
|
||||
|
|
||||
async function getNewMessages(toUser, lastMessageTimeStamp) { |
|
||||
let headers = new Headers(); |
|
||||
// headers.append('Authorization', basicAuthToken);
|
|
||||
headers.append('X-AUTH-TOKEN', authToken); |
|
||||
let response = await fetch(`${getNewMessagesUrl}${toUser}/${lastMessageTimeStamp}`, { |
|
||||
method: 'GET', |
|
||||
headers: headers |
|
||||
}); |
|
||||
console.log(response.clone()); |
|
||||
if (fetchErrorHandler(response.clone())) { |
|
||||
return null; |
|
||||
} |
|
||||
let data = await response.json(); |
|
||||
return data; |
|
||||
} |
|
||||
|
|
||||
|
|
||||
async function getActiveUsers(authToken2) { |
|
||||
let headers = new Headers(); |
|
||||
// headers.append('Authorization', basicAuthToken);
|
|
||||
headers.append('X-AUTH-TOKEN', authToken2); |
|
||||
let response = await fetch(getActiveUsersUrl, { |
|
||||
method: 'GET', |
|
||||
headers: headers |
|
||||
}); |
|
||||
console.log(response.clone()); |
|
||||
if (fetchErrorHandler(response.clone())) { |
|
||||
return null; |
|
||||
} |
|
||||
let data = await response.json(); |
|
||||
return data; |
|
||||
} |
|
||||
|
|
||||
$(document).ready(function() { |
|
||||
$('#action_menu_btn').click(function() { |
|
||||
$('.action_menu').toggle(); |
|
||||
}); |
|
||||
}); |
|
||||
|
|
||||
function fetchHandler(response) { |
|
||||
if (response.ok) { |
|
||||
return response.json().then(json => { |
|
||||
// the status was ok and there is a json body
|
|
||||
// return Promise.resolve({ json: json, response: response });
|
|
||||
alertify.success('Message sent succesfully' + sprintf(" (http code %d)", response.status)); |
|
||||
}).catch(err => { |
|
||||
// the status was ok but there is no json body
|
|
||||
// return Promise.resolve({ response: response });
|
|
||||
alertify.success('Message sent succesfully' + sprintf(" (http code %d)", response.status)); |
|
||||
}); |
|
||||
|
|
||||
} else { |
|
||||
return response.json().catch(err => { |
|
||||
// the status was not ok and there is no json body
|
|
||||
// throw new Error(response.statusText);
|
|
||||
alertify.error('Some error occured. Please try again.'); |
|
||||
}).then(json => { |
|
||||
// the status was not ok but there is a json body
|
|
||||
// throw new Error(json.error.message); // example error message returned by a REST
|
|
||||
let delay = alertify.get('notifier', 'delay'); |
|
||||
alertify.set('notifier', 'delay', 30); |
|
||||
let errorMessage = ""; |
|
||||
json.errors.forEach(function(data) { |
|
||||
errorMessage += sprintf("Field Name: %s \n Rejected value: %s \n Reason: %s \n", data.field_name, data.rejected_value, data.error_message); |
|
||||
}); |
|
||||
alertify.error(sprintf('There were errors in your message - %s', errorMessage)); |
|
||||
alertify.set('notifier', 'delay', delay); |
|
||||
}); |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
|
|
||||
function fetchErrorHandler(response) { |
|
||||
// alertify.success('Current position : ' + alertify.get('notifier', 'position'));
|
|
||||
if (!response.ok) { |
|
||||
return response.text().catch(err => { |
|
||||
// the status was not ok and there is no json body
|
|
||||
// throw new Error(response.statusText);
|
|
||||
// window.alert(sprintf('Some error occured. Http code is %s', response.status));
|
|
||||
alertify.error(sprintf('Some error occured. Http code is %s', response.status)); |
|
||||
return true; |
|
||||
}).then(json => { |
|
||||
// the status was not ok but there is a json body
|
|
||||
// throw new Error(json.error.message); // example error message returned by a REST API
|
|
||||
// window.alert(sprintf('Error: %s (Http code %s)', json, response.status));
|
|
||||
alertify.error(sprintf('Some error occured. Http code is %s', response.status)); |
|
||||
console.log(json); |
|
||||
return true; |
|
||||
}); |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
function scrollChatAreaAnimated(delay) { |
|
||||
$(chatAreaNew).stop().animate({ |
|
||||
scrollTop: $(chatAreaNew)[0].scrollHeight |
|
||||
}, delay); |
|
||||
} |
|
@ -1,57 +0,0 @@ |
|||||
var cipherText = sjcl.encrypt("password", "data"); |
|
||||
console.log(cipherText); |
|
||||
var plainText = sjcl.decrypt("password", cipherText); |
|
||||
console.log(plainText); |
|
||||
|
|
||||
var field = document.getElementById('crypt'); |
|
||||
// field.innerText = plainText;
|
|
||||
|
|
||||
var jsonString = "{\"iv\":\"2rtnuXaJXFuQGO9ncaVkmA==\",\"v\":1,\"iter\":10000,\"ks\":128,\"ts\":64,\"mode\":\"ccm\",\"adata\":\"\",\"cipher\":\"aes\",\"salt\":\"H1z7o3f6qlQ=\",\"ct\":\"lF9Uno7ihjVv01M8\"}"; |
|
||||
|
|
||||
var myJSON = JSON.parse(jsonString); |
|
||||
console.log(myJSON); |
|
||||
|
|
||||
// let base64 = require('base-64');
|
|
||||
|
|
||||
let headers = new Headers(); |
|
||||
console.log("Token = " + btoa("hmm" + ":" + "hmm")) |
|
||||
|
|
||||
// headers.append('Accept','application/json')
|
|
||||
// headers.append('Content-Type', 'application/json');
|
|
||||
headers.append('Authorization', 'Basic ' + btoa("hmm" + ":" + "hmm")); |
|
||||
// headers.append('Authorization', 'Basic aG1tOmhtbQ==');
|
|
||||
|
|
||||
|
|
||||
// aG1tOmhtbQ==
|
|
||||
var messageCipher; |
|
||||
fetch('http://localhost:8080/api/messages', { |
|
||||
method: 'GET', |
|
||||
headers: headers |
|
||||
// credentials: 'include'
|
|
||||
}).then(response => response.json()) |
|
||||
.then(json => { |
|
||||
// console.log('parsed json', JSON.stringify(json)) // access json.body here
|
|
||||
// console.log('parsed json', json[0].messageCipher);
|
|
||||
messageCipher = JSON.stringify(json[0].messageCipher); |
|
||||
console.log(messageCipher); |
|
||||
console.log(sjcl.decrypt("password", messageCipher)); |
|
||||
|
|
||||
}); |
|
||||
// console.log("New message = " + messageCipher);
|
|
||||
|
|
||||
// [{"messageID":5,"fromUser":{"userID":3,"userName":"user2","joinDate":1569224699000},"toUser":{"userID":6,"userName":"novo","joinDate":1569224706000},"messageCipher":{"iv":"2rtnuXaJXFuQGO9ncaVkmA==","v":1,"mode":"ccm","adata":"","cipher":"aes","salt":"H1z7o3f6qlQ=","iter":10000,"ks":128,"ts":64,"ct":"lF9Uno7ihjVv01M8"},"messageTime":1569685335000}]
|
|
||||
|
|
||||
var url = 'http://localhost:8080/api/users' |
|
||||
xml = new XMLHttpRequest(); |
|
||||
xml.onreadystatechange = function () { |
|
||||
if (xml.readyState == XMLHttpRequest.DONE) { |
|
||||
// alert(xhr.responseText);
|
|
||||
console.log(xml.responseText); |
|
||||
// console.log(xml.getResponseHeader('X-CSRF-TOKEN'));
|
|
||||
} |
|
||||
} |
|
||||
xml.open('GET', url) |
|
||||
xml.setRequestHeader('Authorization', 'Basic aG1tOmhtbQ=='); |
|
||||
xml.setRequestHeader("X-CSRF-TOKEN", "fetch"); |
|
||||
xml.send(null); |
|
||||
|
|
Write
Preview
Loading…
Cancel
Save
Reference in new issue