blob: e68ce8989e6c0de2414b301b70d7296f8360daca [file] [log] [blame]
// Copyright 2015 The Vanadium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
var format = require('date-format');
var $ = require('../util/jquery');
var defineClass = require('../util/define-class');
var Message = defineClass({
statics: {
INFO: 'INFO',
ERROR: 'ERROR',
info: function(text) {
return {
type: Message.INFO,
text: text
};
},
error: function(err) {
if (typeof err !== 'string') {
console.error(err);
}
while (err.message) {
err = err.message; //ExtensionCrashError.message.message = ...
}
return {
type: Message.ERROR,
text: err.msg || err.toString()
};
}
},
publics: {
setType: function(type) {
switch (type) {
case Message.INFO:
this.$.attr('class', 'info');
break;
case Message.ERROR:
this.$.attr('class', 'error');
break;
default:
throw 'Invalid message type ' + type;
}
},
setText: function(text) {
this.$text.text(text);
},
setTimestamp: function(timestamp) {
var fmt;
if (timestamp === null || timestamp === undefined) {
fmt = '';
} else {
fmt = format('yyyy.MM.dd.hh.mm.ss', new Date(timestamp));
}
this.$timestamp.text(fmt);
if (fmt) {
this.$label.removeClass('no-timestamp');
} else {
this.$label.addClass('no-timestamp');
}
},
setSender: function(sender) {
this.$sender.text(sender);
if (sender) {
this.$label.removeClass('no-sender');
} else {
this.$label.addClass('no-sender');
}
},
set: function(message) {
if (!message) {
this.onLowerPriority();
return;
}
if (typeof message === 'string') {
message = Message.info(message);
}
var self = this;
this.setType(message.type);
this.setSender(message.sender);
this.setTimestamp(message.timestamp);
this.setText(message.text);
if (message.promise) {
message.promise.then(function(message) {
self.set(message);
}, function(err) {
self.set(Message.error(err));
});
} else {
this.onLowerPriority();
}
}
},
constants: [ '$' ],
events: {
/**
* Event raised when the message is no longer pending user action.
*/
onLowerPriority: 'memory once'
},
init: function(initial) {
this.$ = $('<li>')
.append(
this.$label = $('<span>').addClass('label').append(
this.$sender = $('<span>').addClass('username'),
this.$timestamp = $('<span>').addClass('timestamp')),
this.$text = $('<span>').addClass('text'));
if (initial) {
this.set(initial);
}
}
});
module.exports = Message;