Add a pad room when the messenger is active in a pad

This commit is contained in:
yflory
2018-09-07 19:35:06 +02:00
parent 9e27f111cb
commit d4dd58e7df
7 changed files with 202 additions and 75 deletions

View File

@@ -24,13 +24,19 @@ define([
var initChannel = function (state, info) {
console.log('initializing channel for [%s]', info.id);
var h, t;
if (Array.isArray(info.messages) && info.messages.length) {
h = info.messages[info.messages.length -1].sig;
t = info.messages[0].sig;
}
state.channels[info.id] = {
messages: [],
messages: info.messages || [],
name: info.name,
isFriendChat: info.isFriendChat,
isPadChat: info.isPadChat,
curvePublic: info.curvePublic,
HEAD: info.lastKnownHash,
TAIL: null,
HEAD: h || info.lastKnownHash,
TAIL: t || null,
};
};
@@ -114,7 +120,7 @@ define([
var markup = {};
markup.message = function (msg) {
var curvePublic = msg.author;
var name = contactsData[msg.author].displayName;
var name = msg.name || contactsData[msg.author].displayName;
return h('div.cp-app-contacts-message', {
title: msg.time? new Date(msg.time).toLocaleString(): '?',
'data-user': curvePublic,
@@ -172,9 +178,13 @@ define([
return;
}
history.forEach(function (msg) {
history.forEach(function (msg, i) {
if (channel.exhausted) { return; }
if (msg.sig) {
if (i === 0 && history.length > 1 && msg.sig === channel.TAIL) {
// First message is usually the lastKnownHash, ignore it
return;
}
if (msg.sig === channel.TAIL) {
console.error('No more messages to fetch');
channel.exhausted = true;
@@ -227,7 +237,7 @@ define([
var header = h('div.cp-app-contacts-header', [
avatar,
moreHistory,
removeHistory,
data.isFriendChat ? removeHistory: undefined,
]);
var messages = h('div.cp-app-contacts-messages');
var input = h('textarea', {
@@ -242,18 +252,16 @@ define([
]);
var $avatar = $(avatar);
if (data.isFriendChat) {
var friend = contactsData[curvePublic];
if (friend.avatar && avatars[friend.avatar]) {
$avatar.append(avatars[friend.avatar]).append(rightCol);
} else {
common.displayAvatar($avatar, friend.avatar, friend.displayName, function ($img) {
if (friend.avatar && $img) {
avatars[friend.avatar] = $img[0].outerHTML;
}
$(rightCol).insertAfter($avatar);
});
}
var friend = contactsData[curvePublic] || {};
if (friend.avatar && avatars[friend.avatar]) {
$avatar.append(avatars[friend.avatar]).append(rightCol);
} else {
common.displayAvatar($avatar, friend.avatar, displayName, function ($img) {
if (friend.avatar && $img) {
avatars[friend.avatar] = $img[0].outerHTML;
}
$(rightCol).insertAfter($avatar);
});
}
var sending = false;
@@ -368,7 +376,13 @@ define([
var $more = $chat.find('.cp-app-contacts-more-history');
$more.click();
}
return void $chat.show();
$chat.show();
if (channel.isPadChat) {
// Always scroll bottom for now in pad chat (no last known hash)
var $messagebox = $chat.find('.cp-app-contacts-messages');
$messagebox.scrollTop($messagebox.outerHeight());
}
return;
} else {
console.error("Chat is missing... Please reload the page and try again.");
}
@@ -389,10 +403,14 @@ define([
var remove = h('span.cp-app-contacts-remove.fa.fa-user-times', {
title: Messages.contacts_remove
});
var leaveRoom = h('span.cp-app-contacts-remove.fa.fa-sign-out', {
title: 'Leave this room' // XXX
});
var status = h('span.cp-app-contacts-status');
var rightCol = h('span.cp-app-contacts-right-col', [
h('span.cp-app-contacts-name', [room.name]),
remove,
room.isFriendChat ? remove : leaveRoom,
]);
var friendData = room.isFriendChat ? userlist[0] : {};
@@ -406,23 +424,20 @@ define([
$(remove).click(function (e) {
e.stopPropagation();
var channel = state.channels[id];
if (channel.isFriendChat) {
var curvePublic = channel.curvePublic;
var friend = contactsData[curvePublic] || friendData;
UI.confirm(Messages._getKey('contacts_confirmRemove', [
Util.fixHTML(friend.name)
]), function (yes) {
if (!yes) { return; }
removeFriend(curvePublic, function (e) {
if (e) { return void console.error(e); }
});
// TODO remove friend from userlist ui
// FIXME seems to trigger EJOINED from netflux-websocket (from server);
// (tried to join a channel in which you were already present)
}, undefined, true);
} else {
// TODO room remove room
}
if (!channel.isFriendChat) { return; }
var curvePublic = channel.curvePublic;
var friend = contactsData[curvePublic] || friendData;
UI.confirm(Messages._getKey('contacts_confirmRemove', [
Util.fixHTML(friend.name)
]), function (yes) {
if (!yes) { return; }
removeFriend(curvePublic, function (e) {
if (e) { return void console.error(e); }
});
// TODO remove friend from userlist ui
// FIXME seems to trigger EJOINED from netflux-websocket (from server);
// (tried to join a channel in which you were already present)
}, undefined, true);
});
if (friendData.avatar && avatars[friendData.avatar]) {
@@ -457,6 +472,7 @@ define([
var channel = state.channels[chanId];
if (!channel) {
console.log(message);
console.error('expected channel [%s] to be open', chanId);
return;
}
@@ -568,31 +584,40 @@ define([
execCommand('GET_USERLIST', {id: id}, function (e, list) {
if (e || list.error) { return void console.error(e || list.error); }
if (!Array.isArray(list) || !list.length) {
if (!room.isPadChat && (!Array.isArray(list) || !list.length)) {
return void console.error("Empty room!");
}
debug('userlist: ' + JSON.stringify(list));
// This is a friend, the userlist is only one user.
var friend = list[0];
contactsData[friend.curvePublic] = friend;
var friend = {};
if (room.isFriendChat) {
// This is a friend, the userlist is only one user.
friend = list[0];
contactsData[friend.curvePublic] = friend;
}
var chatbox = markup.chatbox(id, room, friend.curvePublic);
$(chatbox).hide();
$messages.append(chatbox);
var $messagebox = $(chatbox).find('.cp-app-contacts-messages');
room.messages.forEach(function (msg) {
var el_message = markup.message(msg);
$messagebox.append(el_message);
});
normalizeLabels($messagebox);
var roomEl = markup.room(id, room, list);
$userlist.append(roomEl);
updateStatus(id);
});
// TODO room group chat
};
messenger.on('friend', function (curvePublic) {
debug('new friend: ', curvePublic);
execCommand('GET_ROOMS', curvePublic, function (err, rooms) {
execCommand('GET_ROOMS', {curvePublic: curvePublic}, function (err, rooms) {
if (err) { return void console.error(err); }
debug('rooms: ' + JSON.stringify(rooms));
rooms.forEach(initializeRoom);
@@ -636,16 +661,34 @@ define([
$container.removeClass('cp-app-contacts-initializing');
};
var onPadChatReady = function (data) {
execCommand('GET_ROOMS', {padChat: data}, function (err, rooms) {
if (err) { return void console.error(err); }
if (!Array.isArray(rooms) || rooms.length !== 1) {
return void console.error('Invalid pad chat');
}
var room = rooms[0];
room.name = 'XXX Pad chat';
rooms.forEach(initializeRoom);
});
$container.removeClass('cp-app-contacts-initializing');
};
// Initialize chat when outer is ready (all channels loaded)
// TODO: try again in outer if fail to load a channel
execCommand('IS_READY', null, function (err, yes) {
if (yes) { onMessengerReady(); }
});
sframeChan.on('EV_CHAT_EVENT', function (data) {
if (data.ev === 'READY') {
sframeChan.on('EV_CHAT_EVENT', function (obj) {
if (obj.ev === 'READY') {
onMessengerReady();
return;
}
if (obj.ev === 'PADCHAT_READY') {
onPadChatReady(obj.data);
return;
}
});
};