Mercurial > libervia-templates
annotate default/static/chat.js @ 85:05b500bd6235
chat: chat implementation, first draft:
this chat use the new dynamic pages feature. Updates are pushed directly by server.
Identities are used to retrieve avatar, and first letter of nickname is used to generate an avatar is none is found (temporary, a more elaborate avatar generation should follow in the future).
Scroll is done automatically when new messages arrive, except if scroll is not at the end, as it probably means that user is checking history.
User can resize text area and use [shift] + [enter] to enter multi-line messages. History will then scroll to bottom after message has been sent.
author | Goffi <goffi@goffi.org> |
---|---|
date | Wed, 03 Jan 2018 01:12:16 +0100 |
parents | |
children |
rev | line source |
---|---|
85
05b500bd6235
chat: chat implementation, first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1 /* SàT Template: Chat page handling |
05b500bd6235
chat: chat implementation, first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
2 * |
05b500bd6235
chat: chat implementation, first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
3 * Copyright (C) 2017 Jérôme Poisson (goffi@goffi.org) |
05b500bd6235
chat: chat implementation, first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
4 * |
05b500bd6235
chat: chat implementation, first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
5 * This program is free software: you can redistribute it and/or modify |
05b500bd6235
chat: chat implementation, first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
6 * it under the terms of the GNU Affero General Public License as published by |
05b500bd6235
chat: chat implementation, first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
7 * the Free Software Foundation, either version 3 of the License, or |
05b500bd6235
chat: chat implementation, first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
8 * (at your option) any later version. |
05b500bd6235
chat: chat implementation, first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
9 * |
05b500bd6235
chat: chat implementation, first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
10 * This program is distributed in the hope that it will be useful, |
05b500bd6235
chat: chat implementation, first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
05b500bd6235
chat: chat implementation, first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
05b500bd6235
chat: chat implementation, first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
13 * GNU Affero General Public License for more details. |
05b500bd6235
chat: chat implementation, first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
14 * |
05b500bd6235
chat: chat implementation, first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
15 * You should have received a copy of the GNU Affero General Public License |
05b500bd6235
chat: chat implementation, first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
16 * along with this program. If not, see <http://www.gnu.org/licenses/>. |
05b500bd6235
chat: chat implementation, first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
17 */ |
05b500bd6235
chat: chat implementation, first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
18 |
05b500bd6235
chat: chat implementation, first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
19 |
05b500bd6235
chat: chat implementation, first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
20 var msgInput = document.getElementById('message_input'); |
05b500bd6235
chat: chat implementation, first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
21 var messages = document.getElementById('messages'); |
05b500bd6235
chat: chat implementation, first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
22 const messagesTransitionOri = messages.style.transition; |
05b500bd6235
chat: chat implementation, first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
23 |
05b500bd6235
chat: chat implementation, first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
24 msgInput.addEventListener('keypress', function(event) { |
05b500bd6235
chat: chat implementation, first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
25 if (event.which == 13 && !event.shiftKey) { |
05b500bd6235
chat: chat implementation, first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
26 if (messages.style.height !== '100%') { |
05b500bd6235
chat: chat implementation, first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
27 messages.style.transition = messagesTransitionOri; |
05b500bd6235
chat: chat implementation, first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
28 setTimeout(function() { |
05b500bd6235
chat: chat implementation, first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
29 messages.style.transition = 'initial'; |
05b500bd6235
chat: chat implementation, first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
30 messages.scrollTop = messages.scrollHeight; |
05b500bd6235
chat: chat implementation, first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
31 }, 1000); |
05b500bd6235
chat: chat implementation, first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
32 messages.style.height = "100%"; |
05b500bd6235
chat: chat implementation, first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
33 } |
05b500bd6235
chat: chat implementation, first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
34 if (!this.value.trim()) { |
05b500bd6235
chat: chat implementation, first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
35 return; |
05b500bd6235
chat: chat implementation, first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
36 } |
05b500bd6235
chat: chat implementation, first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
37 socket.send({'type': 'msg', |
05b500bd6235
chat: chat implementation, first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
38 'body': this.value}); |
05b500bd6235
chat: chat implementation, first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
39 this.value = ''; |
05b500bd6235
chat: chat implementation, first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
40 event.preventDefault(); |
05b500bd6235
chat: chat implementation, first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
41 }} |
05b500bd6235
chat: chat implementation, first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
42 ); |
05b500bd6235
chat: chat implementation, first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
43 |
05b500bd6235
chat: chat implementation, first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
44 var mutationCb = function(mutationsList) { |
05b500bd6235
chat: chat implementation, first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
45 scrollPos = messages.scrollTop + messages.clientHeight; |
05b500bd6235
chat: chat implementation, first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
46 if (messages.lastChild.offsetTop - scrollPos - 10 <= 0) { |
05b500bd6235
chat: chat implementation, first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
47 // we auto scroll only if we are at the bottom of the page |
05b500bd6235
chat: chat implementation, first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
48 // else the use is probably checking history |
05b500bd6235
chat: chat implementation, first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
49 // Note thas this doesn't take margin into account, |
05b500bd6235
chat: chat implementation, first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
50 // we suppose margin to be 0 for messages children |
05b500bd6235
chat: chat implementation, first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
51 messages.scrollTop = messages.scrollHeight; |
05b500bd6235
chat: chat implementation, first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
52 } |
05b500bd6235
chat: chat implementation, first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
53 }; |
05b500bd6235
chat: chat implementation, first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
54 |
05b500bd6235
chat: chat implementation, first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
55 var observer = new MutationObserver(mutationCb); |
05b500bd6235
chat: chat implementation, first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
56 |
05b500bd6235
chat: chat implementation, first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
57 observer.observe(messages, { childList: true }); |
05b500bd6235
chat: chat implementation, first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
58 // we want to start with scrolling at bottom |
05b500bd6235
chat: chat implementation, first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
59 messages.scrollTop = messages.scrollHeight; |
05b500bd6235
chat: chat implementation, first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
60 messages.style.transition = 'initial'; |