Files
pathfinder-websocket/js/app.js
2016-11-12 18:17:33 +01:00

163 lines
3.7 KiB
JavaScript

var domain = location.host.replace('www.','');
var workerProtocol = (window.location.protocol === 'https:') ? 'wss:' : 'ws:';
var workerUri = workerProtocol + '//' + domain + ':8080';
window.onload = function (){
var msgWorker = this.msgWorker;
var worker = new SharedWorker('js/worker/chat.js', 'worker_name');
worker.port.addEventListener('message', function(e){
let load = e.data;
load.__proto__ = msgWorker.prototype;
switch(load.command){
case 'ws:open':
// WebSocket in SharedWorker is open
setSocketStatus(true);
initChat();
break;
case 'ws:send':
updateMessages(load.data());
break;
case 'ws:closed':
setSocketStatus(false);
break;
}
// show webSocket info
console.info(load.socket);
}, false);
worker.onerror = function(e){
console.error('SharedWorker onerror:');
};
worker.port.start();
var msgWorkerInit = new msgWorker('ws:init');
msgWorkerInit.data({
uri: workerUri
});
worker.port.postMessage(msgWorkerInit);
// Chat init ==================================================================================
var user;
var messages = [];
var messages_template = Handlebars.compile($('#messages-template').html());
var initChat = function(){
$('#join-chat').click(function(){
user = $('#user').val();
$('#user-container').addClass('hidden');
$('#main-container').removeClass('hidden');
var msgWorkerSend = new msgWorker('ws:send');
msgWorkerSend.data({
'user': user,
'text': user + ' entered the room',
'time': moment().format('hh:mm a')
});
worker.port.postMessage(msgWorkerSend);
$('#user').val('');
});
$('#send-msg').click(function(){
var text = $('#msg').val();
var msgWorkerSend = new msgWorker('ws:send');
msgWorkerSend.data({
'user': user,
'text': text,
'time': moment().format('hh:mm a')
});
worker.port.postMessage(msgWorkerSend);
$('#msg').val('');
});
$('#leave-room').click(function(){
var msgWorkerSend = new msgWorker('ws:send');
msgWorkerSend.data({
'user': user,
'text': user + ' has left the room',
'time': moment().format('hh:mm a')
});
worker.port.postMessage(msgWorkerSend);
$('#messages').html('');
messages = [];
$('#main-container').addClass('hidden');
$('#user-container').removeClass('hidden');
});
};
var setSocketStatus = function(status){
$('#socket-status').toggleClass('red', !status).toggleClass('green', status);
};
var updateMessages = function(msg){
messages.push(msg);
var messages_html = messages_template({'messages': messages});
$('#messages').html(messages_html);
$("#messages").animate({ scrollTop: $('#messages')[0].scrollHeight}, 1000);
};
// Notification init ==========================================================================
var updateNotification = function(status){
$('#notification-status').toggleClass('red', !status).toggleClass('green', status);
};
var notifyMe = function(){
var msgWorkerNotify = new msgWorker('ws:notify');
if (Notification.permission === 'granted'){
msgWorkerNotify.data({
status: true
});
worker.port.postMessage(msgWorkerNotify);
updateNotification(true);
}else{
Notification.requestPermission(function (permission) {
msgWorkerNotify.data({
status: permission === 'granted'
});
worker.port.postMessage(msgWorkerNotify);
updateNotification(permission === 'granted');
});
}
};
$('#toggle-notification').on('click', notifyMe);
// ============================================================================================
/*
window.onbeforeunload = function() {
var msgWorkerClose = new msgWorker('ws:close');
worker.port.postMessage(msgWorkerClose);
//console.log('test close');
//worker.port.close();
return 'sdf';
};
*/
};