annotate src/chat.js @ 124:05489f6e9d6f default tip

faster fixTextarea
author Franklin Schmidt <fschmidt@gmail.com>
date Thu, 29 Jan 2026 09:07:08 -0700
parents 1ae3613dd090
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
10
f9e6a4cc4f7d add Post
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1 'use strict';
f9e6a4cc4f7d add Post
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
2
18
0721dcf222e1 * alert
Franklin Schmidt <fschmidt@gmail.com>
parents: 17
diff changeset
3 let title = document.title;
10
f9e6a4cc4f7d add Post
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
4 let currentChatId = null;
12
9f45d32670ae server push
Franklin Schmidt <fschmidt@gmail.com>
parents: 11
diff changeset
5 let eventSource;
73
a63faf49e1d7 last seen
Franklin Schmidt <fschmidt@gmail.com>
parents: 72
diff changeset
6 let lastUpdate = Date.now();
35
27c41f22d2a9 improve fixPosts
Franklin Schmidt <fschmidt@gmail.com>
parents: 34
diff changeset
7 let userId;
63
afd5ab5b02a2 file upload
Franklin Schmidt <fschmidt@gmail.com>
parents: 61
diff changeset
8 let filebinUrl;
89
Franklin Schmidt <fschmidt@gmail.com>
parents: 88
diff changeset
9 let spy;
10
f9e6a4cc4f7d add Post
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
10
16
82b55186a4a0 fix delete_chat
Franklin Schmidt <fschmidt@gmail.com>
parents: 15
diff changeset
11 function evalEvent(event) {
17
7230c821c368 push fixes
Franklin Schmidt <fschmidt@gmail.com>
parents: 16
diff changeset
12 // console.log(event);
16
82b55186a4a0 fix delete_chat
Franklin Schmidt <fschmidt@gmail.com>
parents: 15
diff changeset
13 eval(event.data);
82b55186a4a0 fix delete_chat
Franklin Schmidt <fschmidt@gmail.com>
parents: 15
diff changeset
14 }
82b55186a4a0 fix delete_chat
Franklin Schmidt <fschmidt@gmail.com>
parents: 15
diff changeset
15
15
8b8905f63d80 add get_chats
Franklin Schmidt <fschmidt@gmail.com>
parents: 14
diff changeset
16 function setUserEventSource(userId) {
8b8905f63d80 add get_chats
Franklin Schmidt <fschmidt@gmail.com>
parents: 14
diff changeset
17 let userEventSource = new EventSource(`${location.origin}/user/${userId}`);
16
82b55186a4a0 fix delete_chat
Franklin Schmidt <fschmidt@gmail.com>
parents: 15
diff changeset
18 userEventSource.onmessage = evalEvent;
15
8b8905f63d80 add get_chats
Franklin Schmidt <fschmidt@gmail.com>
parents: 14
diff changeset
19 }
8b8905f63d80 add get_chats
Franklin Schmidt <fschmidt@gmail.com>
parents: 14
diff changeset
20
59
8270106644db add chat.luan
Franklin Schmidt <fschmidt@gmail.com>
parents: 56
diff changeset
21 function selectChat(chatId) {
48
Franklin Schmidt <fschmidt@gmail.com>
parents: 46
diff changeset
22 document.querySelector('div[chat_content]').setAttribute('show','posts');
10
f9e6a4cc4f7d add Post
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
23 if( chatId === currentChatId )
f9e6a4cc4f7d add Post
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
24 return;
59
8270106644db add chat.luan
Franklin Schmidt <fschmidt@gmail.com>
parents: 56
diff changeset
25 let div = document.querySelector(`div[chat="${chatId}"]`);
10
f9e6a4cc4f7d add Post
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
26 let selected = div.parentNode.querySelector('[selected]');
f9e6a4cc4f7d add Post
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
27 if( selected ) selected.removeAttribute('selected');
f9e6a4cc4f7d add Post
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
28 div.setAttribute('selected','');
f9e6a4cc4f7d add Post
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
29 ajax(`get_chat.js?chat=${chatId}`);
f9e6a4cc4f7d add Post
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
30 currentChatId = chatId;
59
8270106644db add chat.luan
Franklin Schmidt <fschmidt@gmail.com>
parents: 56
diff changeset
31 history.replaceState(null,null,`?chat=${chatId}`);
53
9298b04607ae add unread
Franklin Schmidt <fschmidt@gmail.com>
parents: 48
diff changeset
32 clearUnread();
12
9f45d32670ae server push
Franklin Schmidt <fschmidt@gmail.com>
parents: 11
diff changeset
33
9f45d32670ae server push
Franklin Schmidt <fschmidt@gmail.com>
parents: 11
diff changeset
34 if(eventSource) eventSource.close();
9f45d32670ae server push
Franklin Schmidt <fschmidt@gmail.com>
parents: 11
diff changeset
35 eventSource = new EventSource(`${location.origin}/chat/${chatId}`);
16
82b55186a4a0 fix delete_chat
Franklin Schmidt <fschmidt@gmail.com>
parents: 15
diff changeset
36 eventSource.onmessage = evalEvent;
12
9f45d32670ae server push
Franklin Schmidt <fschmidt@gmail.com>
parents: 11
diff changeset
37 }
9f45d32670ae server push
Franklin Schmidt <fschmidt@gmail.com>
parents: 11
diff changeset
38
27
809193524522 responsive
Franklin Schmidt <fschmidt@gmail.com>
parents: 24
diff changeset
39 function back() {
48
Franklin Schmidt <fschmidt@gmail.com>
parents: 46
diff changeset
40 document.querySelector('div[chat_content]').setAttribute('show','chats');
27
809193524522 responsive
Franklin Schmidt <fschmidt@gmail.com>
parents: 24
diff changeset
41 }
809193524522 responsive
Franklin Schmidt <fschmidt@gmail.com>
parents: 24
diff changeset
42
12
9f45d32670ae server push
Franklin Schmidt <fschmidt@gmail.com>
parents: 11
diff changeset
43 function gotChat(html) {
9f45d32670ae server push
Franklin Schmidt <fschmidt@gmail.com>
parents: 11
diff changeset
44 document.querySelector('div[posts]').innerHTML = html;
19
Franklin Schmidt <fschmidt@gmail.com>
parents: 18
diff changeset
45 fixPosts();
12
9f45d32670ae server push
Franklin Schmidt <fschmidt@gmail.com>
parents: 11
diff changeset
46 document.querySelector('div[input] textarea').focus();
9f45d32670ae server push
Franklin Schmidt <fschmidt@gmail.com>
parents: 11
diff changeset
47 document.querySelector('div[input]').scrollIntoView({block: 'end'});
10
f9e6a4cc4f7d add Post
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
48 }
f9e6a4cc4f7d add Post
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
49
124
05489f6e9d6f faster fixTextarea
Franklin Schmidt <fschmidt@gmail.com>
parents: 122
diff changeset
50 let textareaInitialHeight;
05489f6e9d6f faster fixTextarea
Franklin Schmidt <fschmidt@gmail.com>
parents: 122
diff changeset
51
10
f9e6a4cc4f7d add Post
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
52 function fixTextarea(event) {
f9e6a4cc4f7d add Post
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
53 let textarea = event.target;
124
05489f6e9d6f faster fixTextarea
Franklin Schmidt <fschmidt@gmail.com>
parents: 122
diff changeset
54 if( !textareaInitialHeight )
05489f6e9d6f faster fixTextarea
Franklin Schmidt <fschmidt@gmail.com>
parents: 122
diff changeset
55 textareaInitialHeight = getComputedStyle(textarea).height;
05489f6e9d6f faster fixTextarea
Franklin Schmidt <fschmidt@gmail.com>
parents: 122
diff changeset
56 textarea.style.height = textareaInitialHeight;
10
f9e6a4cc4f7d add Post
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
57 textarea.style.height = (textarea.scrollHeight+2) + 'px';
f9e6a4cc4f7d add Post
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
58 textarea.scrollIntoViewIfNeeded(false);
f9e6a4cc4f7d add Post
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
59 }
f9e6a4cc4f7d add Post
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
60
f9e6a4cc4f7d add Post
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
61 const isMobile = 'ontouchstart' in window || navigator.maxTouchPoints > 0 || navigator.msMaxTouchPoints > 0;
f9e6a4cc4f7d add Post
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
62
f9e6a4cc4f7d add Post
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
63 function addPost() {
f9e6a4cc4f7d add Post
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
64 let textarea = document.querySelector('div[input] textarea');
f9e6a4cc4f7d add Post
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
65 let text = textarea.value;
f9e6a4cc4f7d add Post
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
66 if( text.trim() === '' )
f9e6a4cc4f7d add Post
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
67 return;
79
Franklin Schmidt <fschmidt@gmail.com>
parents: 78
diff changeset
68 let url = `add_post.js?chat=${currentChatId}`;
Franklin Schmidt <fschmidt@gmail.com>
parents: 78
diff changeset
69 let reply = document.querySelector('div[reply]').getAttribute('reply');
Franklin Schmidt <fschmidt@gmail.com>
parents: 78
diff changeset
70 if( reply )
Franklin Schmidt <fschmidt@gmail.com>
parents: 78
diff changeset
71 url += `&reply=${reply}`;
Franklin Schmidt <fschmidt@gmail.com>
parents: 78
diff changeset
72 ajax(url,`content=${encodeURIComponent(text)}`);
10
f9e6a4cc4f7d add Post
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
73 textarea.value = '';
84
Franklin Schmidt <fschmidt@gmail.com>
parents: 83
diff changeset
74 textarea.style.height = 'initial';
79
Franklin Schmidt <fschmidt@gmail.com>
parents: 78
diff changeset
75 closeReply();
10
f9e6a4cc4f7d add Post
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
76 }
f9e6a4cc4f7d add Post
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
77
f9e6a4cc4f7d add Post
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
78 function textareaKey(event) {
f9e6a4cc4f7d add Post
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
79 if( event.keyCode===13 && !event.shiftKey && !event.ctrlKey && !isMobile ) {
f9e6a4cc4f7d add Post
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
80 event.preventDefault();
f9e6a4cc4f7d add Post
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
81 addPost();
f9e6a4cc4f7d add Post
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
82 }
f9e6a4cc4f7d add Post
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
83 }
f9e6a4cc4f7d add Post
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
84
78
Franklin Schmidt <fschmidt@gmail.com>
parents: 77
diff changeset
85 function editTextareaKey(event) {
Franklin Schmidt <fschmidt@gmail.com>
parents: 77
diff changeset
86 if( event.keyCode===13 && !event.shiftKey && !event.ctrlKey && !isMobile ) {
Franklin Schmidt <fschmidt@gmail.com>
parents: 77
diff changeset
87 event.preventDefault();
Franklin Schmidt <fschmidt@gmail.com>
parents: 77
diff changeset
88 savePost(event.target);
Franklin Schmidt <fschmidt@gmail.com>
parents: 77
diff changeset
89 }
Franklin Schmidt <fschmidt@gmail.com>
parents: 77
diff changeset
90 }
Franklin Schmidt <fschmidt@gmail.com>
parents: 77
diff changeset
91
19
Franklin Schmidt <fschmidt@gmail.com>
parents: 18
diff changeset
92 function fixPosts() {
35
27c41f22d2a9 improve fixPosts
Franklin Schmidt <fschmidt@gmail.com>
parents: 34
diff changeset
93 let divs = document.querySelectorAll('div[post][fix]');
19
Franklin Schmidt <fschmidt@gmail.com>
parents: 18
diff changeset
94 for( let div of divs ) {
79
Franklin Schmidt <fschmidt@gmail.com>
parents: 78
diff changeset
95 for( let whenSpan of div.querySelectorAll('[when]') ) {
Franklin Schmidt <fschmidt@gmail.com>
parents: 78
diff changeset
96 whenSpan.textContent = new Date(Number(whenSpan.textContent)).toLocaleString([],{dateStyle:'short',timeStyle:'short'});
Franklin Schmidt <fschmidt@gmail.com>
parents: 78
diff changeset
97 }
35
27c41f22d2a9 improve fixPosts
Franklin Schmidt <fschmidt@gmail.com>
parents: 34
diff changeset
98 let textDiv = div.querySelector('div[text]');
122
1ae3613dd090 markdown work
Franklin Schmidt <fschmidt@gmail.com>
parents: 121
diff changeset
99 textDiv.innerHTML = handleMarkdown(textDiv.textContent);
79
Franklin Schmidt <fschmidt@gmail.com>
parents: 78
diff changeset
100 let reply = div.querySelector('blockquote');
Franklin Schmidt <fschmidt@gmail.com>
parents: 78
diff changeset
101 if( reply )
122
1ae3613dd090 markdown work
Franklin Schmidt <fschmidt@gmail.com>
parents: 121
diff changeset
102 reply.innerHTML = handleMarkdown(reply.textContent);
79
Franklin Schmidt <fschmidt@gmail.com>
parents: 78
diff changeset
103 let html;
Franklin Schmidt <fschmidt@gmail.com>
parents: 78
diff changeset
104 if( div.getAttribute('author') === userId ) {
Franklin Schmidt <fschmidt@gmail.com>
parents: 78
diff changeset
105 html = document.querySelector('div[hidden] span[pulldown=author]').innerHTML;
Franklin Schmidt <fschmidt@gmail.com>
parents: 78
diff changeset
106 } else {
Franklin Schmidt <fschmidt@gmail.com>
parents: 78
diff changeset
107 html = document.querySelector('div[hidden] span[pulldown=other]').innerHTML;
Franklin Schmidt <fschmidt@gmail.com>
parents: 78
diff changeset
108 }
Franklin Schmidt <fschmidt@gmail.com>
parents: 78
diff changeset
109 div.querySelector('span[pulldown]').innerHTML = html;
19
Franklin Schmidt <fschmidt@gmail.com>
parents: 18
diff changeset
110 div.removeAttribute('fix');
Franklin Schmidt <fschmidt@gmail.com>
parents: 18
diff changeset
111 }
10
f9e6a4cc4f7d add Post
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
112 }
11
563a5358f2ee add delete_chat
Franklin Schmidt <fschmidt@gmail.com>
parents: 10
diff changeset
113
563a5358f2ee add delete_chat
Franklin Schmidt <fschmidt@gmail.com>
parents: 10
diff changeset
114 function deleteChat() {
20
dade6a560494 add dialogs
Franklin Schmidt <fschmidt@gmail.com>
parents: 19
diff changeset
115 let dialog = document.querySelector('dialog[delete_chat]');
dade6a560494 add dialogs
Franklin Schmidt <fschmidt@gmail.com>
parents: 19
diff changeset
116 openModal(dialog);
dade6a560494 add dialogs
Franklin Schmidt <fschmidt@gmail.com>
parents: 19
diff changeset
117 }
dade6a560494 add dialogs
Franklin Schmidt <fschmidt@gmail.com>
parents: 19
diff changeset
118
dade6a560494 add dialogs
Franklin Schmidt <fschmidt@gmail.com>
parents: 19
diff changeset
119 function doDeleteChat(el) {
dade6a560494 add dialogs
Franklin Schmidt <fschmidt@gmail.com>
parents: 19
diff changeset
120 closeModal(el);
11
563a5358f2ee add delete_chat
Franklin Schmidt <fschmidt@gmail.com>
parents: 10
diff changeset
121 ajax(`delete_chat.js?chat=${currentChatId}`);
563a5358f2ee add delete_chat
Franklin Schmidt <fschmidt@gmail.com>
parents: 10
diff changeset
122 }
12
9f45d32670ae server push
Franklin Schmidt <fschmidt@gmail.com>
parents: 11
diff changeset
123
107
ed1418c95488 delete old messages
Franklin Schmidt <fschmidt@gmail.com>
parents: 104
diff changeset
124 function deleteOld() {
ed1418c95488 delete old messages
Franklin Schmidt <fschmidt@gmail.com>
parents: 104
diff changeset
125 let dialog = document.querySelector('dialog[delete_old]');
ed1418c95488 delete old messages
Franklin Schmidt <fschmidt@gmail.com>
parents: 104
diff changeset
126 openModal(dialog);
ed1418c95488 delete old messages
Franklin Schmidt <fschmidt@gmail.com>
parents: 104
diff changeset
127 }
ed1418c95488 delete old messages
Franklin Schmidt <fschmidt@gmail.com>
parents: 104
diff changeset
128
ed1418c95488 delete old messages
Franklin Schmidt <fschmidt@gmail.com>
parents: 104
diff changeset
129 function doDeleteOld(el) {
ed1418c95488 delete old messages
Franklin Schmidt <fschmidt@gmail.com>
parents: 104
diff changeset
130 closeModal(el);
ed1418c95488 delete old messages
Franklin Schmidt <fschmidt@gmail.com>
parents: 104
diff changeset
131 ajax(`delete_old.js?chat=${currentChatId}`);
ed1418c95488 delete old messages
Franklin Schmidt <fschmidt@gmail.com>
parents: 104
diff changeset
132 }
ed1418c95488 delete old messages
Franklin Schmidt <fschmidt@gmail.com>
parents: 104
diff changeset
133
23
c54c806fcc6e add delete_post
Franklin Schmidt <fschmidt@gmail.com>
parents: 22
diff changeset
134 let currentPostId;
c54c806fcc6e add delete_post
Franklin Schmidt <fschmidt@gmail.com>
parents: 22
diff changeset
135
38
436216d17a1b fix edit and delete
Franklin Schmidt <fschmidt@gmail.com>
parents: 35
diff changeset
136 function getPostId(el) {
436216d17a1b fix edit and delete
Franklin Schmidt <fschmidt@gmail.com>
parents: 35
diff changeset
137 while(true) {
436216d17a1b fix edit and delete
Franklin Schmidt <fschmidt@gmail.com>
parents: 35
diff changeset
138 let postId = el.getAttribute('post');
436216d17a1b fix edit and delete
Franklin Schmidt <fschmidt@gmail.com>
parents: 35
diff changeset
139 if( postId )
436216d17a1b fix edit and delete
Franklin Schmidt <fschmidt@gmail.com>
parents: 35
diff changeset
140 return postId;
436216d17a1b fix edit and delete
Franklin Schmidt <fschmidt@gmail.com>
parents: 35
diff changeset
141 el = el.parentNode;
436216d17a1b fix edit and delete
Franklin Schmidt <fschmidt@gmail.com>
parents: 35
diff changeset
142 }
436216d17a1b fix edit and delete
Franklin Schmidt <fschmidt@gmail.com>
parents: 35
diff changeset
143 }
436216d17a1b fix edit and delete
Franklin Schmidt <fschmidt@gmail.com>
parents: 35
diff changeset
144
436216d17a1b fix edit and delete
Franklin Schmidt <fschmidt@gmail.com>
parents: 35
diff changeset
145 function deletePost(el) {
436216d17a1b fix edit and delete
Franklin Schmidt <fschmidt@gmail.com>
parents: 35
diff changeset
146 currentPostId = getPostId(el);
23
c54c806fcc6e add delete_post
Franklin Schmidt <fschmidt@gmail.com>
parents: 22
diff changeset
147 let dialog = document.querySelector('dialog[delete_post]');
c54c806fcc6e add delete_post
Franklin Schmidt <fschmidt@gmail.com>
parents: 22
diff changeset
148 openModal(dialog);
c54c806fcc6e add delete_post
Franklin Schmidt <fschmidt@gmail.com>
parents: 22
diff changeset
149 }
c54c806fcc6e add delete_post
Franklin Schmidt <fschmidt@gmail.com>
parents: 22
diff changeset
150
c54c806fcc6e add delete_post
Franklin Schmidt <fschmidt@gmail.com>
parents: 22
diff changeset
151 function doDeletePost(el) {
c54c806fcc6e add delete_post
Franklin Schmidt <fschmidt@gmail.com>
parents: 22
diff changeset
152 closeModal(el);
c54c806fcc6e add delete_post
Franklin Schmidt <fschmidt@gmail.com>
parents: 22
diff changeset
153 ajax(`delete_post.js?post=${currentPostId}`);
c54c806fcc6e add delete_post
Franklin Schmidt <fschmidt@gmail.com>
parents: 22
diff changeset
154 }
c54c806fcc6e add delete_post
Franklin Schmidt <fschmidt@gmail.com>
parents: 22
diff changeset
155
c54c806fcc6e add delete_post
Franklin Schmidt <fschmidt@gmail.com>
parents: 22
diff changeset
156 function deleted(postId) {
c54c806fcc6e add delete_post
Franklin Schmidt <fschmidt@gmail.com>
parents: 22
diff changeset
157 let div = document.querySelector(`div[post="${postId}"]`);
c54c806fcc6e add delete_post
Franklin Schmidt <fschmidt@gmail.com>
parents: 22
diff changeset
158 if( div )
c54c806fcc6e add delete_post
Franklin Schmidt <fschmidt@gmail.com>
parents: 22
diff changeset
159 div.outerHTML = '';
c54c806fcc6e add delete_post
Franklin Schmidt <fschmidt@gmail.com>
parents: 22
diff changeset
160 }
c54c806fcc6e add delete_post
Franklin Schmidt <fschmidt@gmail.com>
parents: 22
diff changeset
161
38
436216d17a1b fix edit and delete
Franklin Schmidt <fschmidt@gmail.com>
parents: 35
diff changeset
162 function editPost(el) {
436216d17a1b fix edit and delete
Franklin Schmidt <fschmidt@gmail.com>
parents: 35
diff changeset
163 ajax(`edit_post.js?post=${getPostId(el)}`);
24
af41be2dcdec add edit_post
Franklin Schmidt <fschmidt@gmail.com>
parents: 23
diff changeset
164 }
af41be2dcdec add edit_post
Franklin Schmidt <fschmidt@gmail.com>
parents: 23
diff changeset
165
af41be2dcdec add edit_post
Franklin Schmidt <fschmidt@gmail.com>
parents: 23
diff changeset
166 function openEditPost(postId,text) {
af41be2dcdec add edit_post
Franklin Schmidt <fschmidt@gmail.com>
parents: 23
diff changeset
167 currentPostId = postId;
af41be2dcdec add edit_post
Franklin Schmidt <fschmidt@gmail.com>
parents: 23
diff changeset
168 let dialog = document.querySelector('dialog[edit_post]');
af41be2dcdec add edit_post
Franklin Schmidt <fschmidt@gmail.com>
parents: 23
diff changeset
169 let textarea = dialog.querySelector('textarea');
af41be2dcdec add edit_post
Franklin Schmidt <fschmidt@gmail.com>
parents: 23
diff changeset
170 textarea.value = text;
af41be2dcdec add edit_post
Franklin Schmidt <fschmidt@gmail.com>
parents: 23
diff changeset
171 openModal(dialog);
af41be2dcdec add edit_post
Franklin Schmidt <fschmidt@gmail.com>
parents: 23
diff changeset
172 }
af41be2dcdec add edit_post
Franklin Schmidt <fschmidt@gmail.com>
parents: 23
diff changeset
173
af41be2dcdec add edit_post
Franklin Schmidt <fschmidt@gmail.com>
parents: 23
diff changeset
174 function savePost(el) {
af41be2dcdec add edit_post
Franklin Schmidt <fschmidt@gmail.com>
parents: 23
diff changeset
175 let text = document.querySelector('dialog[edit_post] textarea').value;
af41be2dcdec add edit_post
Franklin Schmidt <fschmidt@gmail.com>
parents: 23
diff changeset
176 closeModal(el);
af41be2dcdec add edit_post
Franklin Schmidt <fschmidt@gmail.com>
parents: 23
diff changeset
177 ajax(`save_post.js?post=${currentPostId}`,`content=${encodeURIComponent(text)}`);
af41be2dcdec add edit_post
Franklin Schmidt <fschmidt@gmail.com>
parents: 23
diff changeset
178 }
af41be2dcdec add edit_post
Franklin Schmidt <fschmidt@gmail.com>
parents: 23
diff changeset
179
af41be2dcdec add edit_post
Franklin Schmidt <fschmidt@gmail.com>
parents: 23
diff changeset
180 function edited(postId,html) {
af41be2dcdec add edit_post
Franklin Schmidt <fschmidt@gmail.com>
parents: 23
diff changeset
181 let div = document.querySelector(`div[post="${postId}"]`);
af41be2dcdec add edit_post
Franklin Schmidt <fschmidt@gmail.com>
parents: 23
diff changeset
182 if( div ) {
af41be2dcdec add edit_post
Franklin Schmidt <fschmidt@gmail.com>
parents: 23
diff changeset
183 div.outerHTML = html;
af41be2dcdec add edit_post
Franklin Schmidt <fschmidt@gmail.com>
parents: 23
diff changeset
184 fixPosts();
af41be2dcdec add edit_post
Franklin Schmidt <fschmidt@gmail.com>
parents: 23
diff changeset
185 }
af41be2dcdec add edit_post
Franklin Schmidt <fschmidt@gmail.com>
parents: 23
diff changeset
186 }
af41be2dcdec add edit_post
Franklin Schmidt <fschmidt@gmail.com>
parents: 23
diff changeset
187
104
46418395c860 add mute chat
Franklin Schmidt <fschmidt@gmail.com>
parents: 95
diff changeset
188 function openMute() {
46418395c860 add mute chat
Franklin Schmidt <fschmidt@gmail.com>
parents: 95
diff changeset
189 ajax(`open_mute.js?chat=${currentChatId}`);
46418395c860 add mute chat
Franklin Schmidt <fschmidt@gmail.com>
parents: 95
diff changeset
190 }
46418395c860 add mute chat
Franklin Schmidt <fschmidt@gmail.com>
parents: 95
diff changeset
191
46418395c860 add mute chat
Franklin Schmidt <fschmidt@gmail.com>
parents: 95
diff changeset
192 function doOpenMute(muted) {
46418395c860 add mute chat
Franklin Schmidt <fschmidt@gmail.com>
parents: 95
diff changeset
193 let dialog = document.querySelector('dialog[mute]');
46418395c860 add mute chat
Franklin Schmidt <fschmidt@gmail.com>
parents: 95
diff changeset
194 let checkbox = dialog.querySelector('input');
46418395c860 add mute chat
Franklin Schmidt <fschmidt@gmail.com>
parents: 95
diff changeset
195 checkbox.checked = muted;
46418395c860 add mute chat
Franklin Schmidt <fschmidt@gmail.com>
parents: 95
diff changeset
196 openModal(dialog);
46418395c860 add mute chat
Franklin Schmidt <fschmidt@gmail.com>
parents: 95
diff changeset
197 }
46418395c860 add mute chat
Franklin Schmidt <fschmidt@gmail.com>
parents: 95
diff changeset
198
46418395c860 add mute chat
Franklin Schmidt <fschmidt@gmail.com>
parents: 95
diff changeset
199 function saveMute(el) {
46418395c860 add mute chat
Franklin Schmidt <fschmidt@gmail.com>
parents: 95
diff changeset
200 let muted = document.querySelector('dialog[mute] input').checked;
46418395c860 add mute chat
Franklin Schmidt <fschmidt@gmail.com>
parents: 95
diff changeset
201 closeModal(el);
46418395c860 add mute chat
Franklin Schmidt <fschmidt@gmail.com>
parents: 95
diff changeset
202 ajax(`save_mute.js?chat=${currentChatId}&muted=${muted}`);
46418395c860 add mute chat
Franklin Schmidt <fschmidt@gmail.com>
parents: 95
diff changeset
203 }
46418395c860 add mute chat
Franklin Schmidt <fschmidt@gmail.com>
parents: 95
diff changeset
204
77
Franklin Schmidt <fschmidt@gmail.com>
parents: 76
diff changeset
205 function active() {
Franklin Schmidt <fschmidt@gmail.com>
parents: 76
diff changeset
206 let url = 'active.js';
Franklin Schmidt <fschmidt@gmail.com>
parents: 76
diff changeset
207 if( currentChatId )
Franklin Schmidt <fschmidt@gmail.com>
parents: 76
diff changeset
208 url += `?chat=${currentChatId}`;
Franklin Schmidt <fschmidt@gmail.com>
parents: 76
diff changeset
209 ajax(url);
Franklin Schmidt <fschmidt@gmail.com>
parents: 76
diff changeset
210 }
Franklin Schmidt <fschmidt@gmail.com>
parents: 76
diff changeset
211
92
c41e200c3e76 try to fix lost posts
Franklin Schmidt <fschmidt@gmail.com>
parents: 89
diff changeset
212 function added(html,updated) {
12
9f45d32670ae server push
Franklin Schmidt <fschmidt@gmail.com>
parents: 11
diff changeset
213 let input = document.querySelector('div[input]');
9f45d32670ae server push
Franklin Schmidt <fschmidt@gmail.com>
parents: 11
diff changeset
214 input.insertAdjacentHTML('beforebegin',html);
19
Franklin Schmidt <fschmidt@gmail.com>
parents: 18
diff changeset
215 fixPosts();
12
9f45d32670ae server push
Franklin Schmidt <fschmidt@gmail.com>
parents: 11
diff changeset
216 input.scrollIntoView({block: 'end'});
40
7ea33179592a email notification
Franklin Schmidt <fschmidt@gmail.com>
parents: 39
diff changeset
217 if( document.hasFocus() )
77
Franklin Schmidt <fschmidt@gmail.com>
parents: 76
diff changeset
218 active();
92
c41e200c3e76 try to fix lost posts
Franklin Schmidt <fschmidt@gmail.com>
parents: 89
diff changeset
219 lastUpdate = updated;
12
9f45d32670ae server push
Franklin Schmidt <fschmidt@gmail.com>
parents: 11
diff changeset
220 }
15
8b8905f63d80 add get_chats
Franklin Schmidt <fschmidt@gmail.com>
parents: 14
diff changeset
221
30
f4708943f29e add heartbeat
Franklin Schmidt <fschmidt@gmail.com>
parents: 27
diff changeset
222 function getChats(chatId,updated) {
15
8b8905f63d80 add get_chats
Franklin Schmidt <fschmidt@gmail.com>
parents: 14
diff changeset
223 let first = document.querySelector('div[chat]');
53
9298b04607ae add unread
Franklin Schmidt <fschmidt@gmail.com>
parents: 48
diff changeset
224 if( !first || first.getAttribute('chat') !== chatId ) {
15
8b8905f63d80 add get_chats
Franklin Schmidt <fschmidt@gmail.com>
parents: 14
diff changeset
225 // console.log('getChats');
8b8905f63d80 add get_chats
Franklin Schmidt <fschmidt@gmail.com>
parents: 14
diff changeset
226 ajax('get_chats.js');
92
c41e200c3e76 try to fix lost posts
Franklin Schmidt <fschmidt@gmail.com>
parents: 89
diff changeset
227 if( updated )
c41e200c3e76 try to fix lost posts
Franklin Schmidt <fschmidt@gmail.com>
parents: 89
diff changeset
228 lastUpdate = updated;
89
Franklin Schmidt <fschmidt@gmail.com>
parents: 88
diff changeset
229 } else if( first && (currentChatId !== chatId || spy) ) {
53
9298b04607ae add unread
Franklin Schmidt <fschmidt@gmail.com>
parents: 48
diff changeset
230 incUnread(first);
15
8b8905f63d80 add get_chats
Franklin Schmidt <fschmidt@gmail.com>
parents: 14
diff changeset
231 }
40
7ea33179592a email notification
Franklin Schmidt <fschmidt@gmail.com>
parents: 39
diff changeset
232 if( !document.hasFocus() ) {
31
a0820965ba04 notify sound
Franklin Schmidt <fschmidt@gmail.com>
parents: 30
diff changeset
233 document.title = title + ' *';
a0820965ba04 notify sound
Franklin Schmidt <fschmidt@gmail.com>
parents: 30
diff changeset
234 }
15
8b8905f63d80 add get_chats
Franklin Schmidt <fschmidt@gmail.com>
parents: 14
diff changeset
235 }
8b8905f63d80 add get_chats
Franklin Schmidt <fschmidt@gmail.com>
parents: 14
diff changeset
236
8b8905f63d80 add get_chats
Franklin Schmidt <fschmidt@gmail.com>
parents: 14
diff changeset
237 function gotChats(html) {
8b8905f63d80 add get_chats
Franklin Schmidt <fschmidt@gmail.com>
parents: 14
diff changeset
238 document.querySelector('div[chats]').innerHTML = html;
8b8905f63d80 add get_chats
Franklin Schmidt <fschmidt@gmail.com>
parents: 14
diff changeset
239 if( currentChatId ) {
8b8905f63d80 add get_chats
Franklin Schmidt <fschmidt@gmail.com>
parents: 14
diff changeset
240 let current = document.querySelector(`div[chat="${currentChatId}"]`);
16
82b55186a4a0 fix delete_chat
Franklin Schmidt <fschmidt@gmail.com>
parents: 15
diff changeset
241 if( current ) {
82b55186a4a0 fix delete_chat
Franklin Schmidt <fschmidt@gmail.com>
parents: 15
diff changeset
242 current.setAttribute('selected','');
82b55186a4a0 fix delete_chat
Franklin Schmidt <fschmidt@gmail.com>
parents: 15
diff changeset
243 current.scrollIntoViewIfNeeded(false);
61
Franklin Schmidt <fschmidt@gmail.com>
parents: 60
diff changeset
244 clearUnread();
16
82b55186a4a0 fix delete_chat
Franklin Schmidt <fschmidt@gmail.com>
parents: 15
diff changeset
245 } else {
82b55186a4a0 fix delete_chat
Franklin Schmidt <fschmidt@gmail.com>
parents: 15
diff changeset
246 currentChatId = null;
82b55186a4a0 fix delete_chat
Franklin Schmidt <fschmidt@gmail.com>
parents: 15
diff changeset
247 document.querySelector('div[posts]').innerHTML = '';
82b55186a4a0 fix delete_chat
Franklin Schmidt <fschmidt@gmail.com>
parents: 15
diff changeset
248 }
15
8b8905f63d80 add get_chats
Franklin Schmidt <fschmidt@gmail.com>
parents: 14
diff changeset
249 }
8b8905f63d80 add get_chats
Franklin Schmidt <fschmidt@gmail.com>
parents: 14
diff changeset
250 }
18
0721dcf222e1 * alert
Franklin Schmidt <fschmidt@gmail.com>
parents: 17
diff changeset
251
0721dcf222e1 * alert
Franklin Schmidt <fschmidt@gmail.com>
parents: 17
diff changeset
252 window.onfocus = function() {
33
e2b7f6393dab add online
Franklin Schmidt <fschmidt@gmail.com>
parents: 32
diff changeset
253 // console.log('onfocus');
18
0721dcf222e1 * alert
Franklin Schmidt <fschmidt@gmail.com>
parents: 17
diff changeset
254 document.title = title;
77
Franklin Schmidt <fschmidt@gmail.com>
parents: 76
diff changeset
255 active();
18
0721dcf222e1 * alert
Franklin Schmidt <fschmidt@gmail.com>
parents: 17
diff changeset
256 };
19
Franklin Schmidt <fschmidt@gmail.com>
parents: 18
diff changeset
257
118
04933d5ba05a handle markdown
Franklin Schmidt <fschmidt@gmail.com>
parents: 112
diff changeset
258 let converter = window.markdownit({linkify:true});
04933d5ba05a handle markdown
Franklin Schmidt <fschmidt@gmail.com>
parents: 112
diff changeset
259 let filebinUrlRegex = />https:\/\/filebin.net\/[0-9a-f]+\/([^<]+)</g;
121
Franklin Schmidt <fschmidt@gmail.com>
parents: 120
diff changeset
260 let urlRegex = /(<a href="https?:\/\/[^" ]+")>/g;
19
Franklin Schmidt <fschmidt@gmail.com>
parents: 18
diff changeset
261
118
04933d5ba05a handle markdown
Franklin Schmidt <fschmidt@gmail.com>
parents: 112
diff changeset
262 function handleMarkdown(text) {
122
1ae3613dd090 markdown work
Franklin Schmidt <fschmidt@gmail.com>
parents: 121
diff changeset
263 text = converter.render(text);
118
04933d5ba05a handle markdown
Franklin Schmidt <fschmidt@gmail.com>
parents: 112
diff changeset
264 text = text.replace( filebinUrlRegex, '>$1<' );
121
Franklin Schmidt <fschmidt@gmail.com>
parents: 120
diff changeset
265 text = text.replace( urlRegex, '$1 target="_blank">' );
66
Franklin Schmidt <fschmidt@gmail.com>
parents: 65
diff changeset
266 return text;
19
Franklin Schmidt <fschmidt@gmail.com>
parents: 18
diff changeset
267 }
22
949914955bfe add menu
Franklin Schmidt <fschmidt@gmail.com>
parents: 20
diff changeset
268
949914955bfe add menu
Franklin Schmidt <fschmidt@gmail.com>
parents: 20
diff changeset
269 let currentPulldown = null;
949914955bfe add menu
Franklin Schmidt <fschmidt@gmail.com>
parents: 20
diff changeset
270 let newPulldown = null;
949914955bfe add menu
Franklin Schmidt <fschmidt@gmail.com>
parents: 20
diff changeset
271
949914955bfe add menu
Franklin Schmidt <fschmidt@gmail.com>
parents: 20
diff changeset
272 function clickMenu(clicked,display) {
95
Franklin Schmidt <fschmidt@gmail.com>
parents: 93
diff changeset
273 //console.log('clickMenu');
22
949914955bfe add menu
Franklin Schmidt <fschmidt@gmail.com>
parents: 20
diff changeset
274 let pulldown = clicked.parentNode.querySelector('div');
949914955bfe add menu
Franklin Schmidt <fschmidt@gmail.com>
parents: 20
diff changeset
275 if( pulldown !== currentPulldown ) {
95
Franklin Schmidt <fschmidt@gmail.com>
parents: 93
diff changeset
276 pulldown.style.display = display || 'block';
22
949914955bfe add menu
Franklin Schmidt <fschmidt@gmail.com>
parents: 20
diff changeset
277 newPulldown = pulldown;
949914955bfe add menu
Franklin Schmidt <fschmidt@gmail.com>
parents: 20
diff changeset
278 window.onclick = function() {
95
Franklin Schmidt <fschmidt@gmail.com>
parents: 93
diff changeset
279 //console.log('window.onclick');
22
949914955bfe add menu
Franklin Schmidt <fschmidt@gmail.com>
parents: 20
diff changeset
280 if( currentPulldown ) {
95
Franklin Schmidt <fschmidt@gmail.com>
parents: 93
diff changeset
281 currentPulldown.style.display = 'none';
22
949914955bfe add menu
Franklin Schmidt <fschmidt@gmail.com>
parents: 20
diff changeset
282 if( !newPulldown )
949914955bfe add menu
Franklin Schmidt <fschmidt@gmail.com>
parents: 20
diff changeset
283 window.onclick = null;
949914955bfe add menu
Franklin Schmidt <fschmidt@gmail.com>
parents: 20
diff changeset
284 }
949914955bfe add menu
Franklin Schmidt <fschmidt@gmail.com>
parents: 20
diff changeset
285 currentPulldown = newPulldown;
949914955bfe add menu
Franklin Schmidt <fschmidt@gmail.com>
parents: 20
diff changeset
286 newPulldown = null;
949914955bfe add menu
Franklin Schmidt <fschmidt@gmail.com>
parents: 20
diff changeset
287 };
949914955bfe add menu
Franklin Schmidt <fschmidt@gmail.com>
parents: 20
diff changeset
288 pulldown.scrollIntoViewIfNeeded(false);
949914955bfe add menu
Franklin Schmidt <fschmidt@gmail.com>
parents: 20
diff changeset
289 }
949914955bfe add menu
Franklin Schmidt <fschmidt@gmail.com>
parents: 20
diff changeset
290 }
30
f4708943f29e add heartbeat
Franklin Schmidt <fschmidt@gmail.com>
parents: 27
diff changeset
291
42
Franklin Schmidt <fschmidt@gmail.com>
parents: 40
diff changeset
292 function heartbeat() {
111
37ab261aee7b notify fix
Franklin Schmidt <fschmidt@gmail.com>
parents: 109
diff changeset
293 let url = `heartbeat.js?last_update=${lastUpdate}&focus=${document.hasFocus()}`;
75
377bdda60f0b read up to
Franklin Schmidt <fschmidt@gmail.com>
parents: 73
diff changeset
294 if( currentChatId )
377bdda60f0b read up to
Franklin Schmidt <fschmidt@gmail.com>
parents: 73
diff changeset
295 url += `&chat=${currentChatId}`;
377bdda60f0b read up to
Franklin Schmidt <fschmidt@gmail.com>
parents: 73
diff changeset
296 ajax(url);
42
Franklin Schmidt <fschmidt@gmail.com>
parents: 40
diff changeset
297 }
Franklin Schmidt <fschmidt@gmail.com>
parents: 40
diff changeset
298
Franklin Schmidt <fschmidt@gmail.com>
parents: 40
diff changeset
299 setInterval( heartbeat, 10000 );
73
a63faf49e1d7 last seen
Franklin Schmidt <fschmidt@gmail.com>
parents: 72
diff changeset
300 heartbeat();
30
f4708943f29e add heartbeat
Franklin Schmidt <fschmidt@gmail.com>
parents: 27
diff changeset
301
33
e2b7f6393dab add online
Franklin Schmidt <fschmidt@gmail.com>
parents: 32
diff changeset
302 let online = {};
e2b7f6393dab add online
Franklin Schmidt <fschmidt@gmail.com>
parents: 32
diff changeset
303
e2b7f6393dab add online
Franklin Schmidt <fschmidt@gmail.com>
parents: 32
diff changeset
304 function showOnline() {
42
Franklin Schmidt <fschmidt@gmail.com>
parents: 40
diff changeset
305 let old = Date.now() - 70000;
72
Franklin Schmidt <fschmidt@gmail.com>
parents: 66
diff changeset
306 let spans = document.querySelectorAll('span[online]');
Franklin Schmidt <fschmidt@gmail.com>
parents: 66
diff changeset
307 for( let span of spans ) {
Franklin Schmidt <fschmidt@gmail.com>
parents: 66
diff changeset
308 let id = span.getAttribute('online');
73
a63faf49e1d7 last seen
Franklin Schmidt <fschmidt@gmail.com>
parents: 72
diff changeset
309 let wasOnline = online[id];
a63faf49e1d7 last seen
Franklin Schmidt <fschmidt@gmail.com>
parents: 72
diff changeset
310 let isOnline = !!wasOnline && wasOnline > old;
a63faf49e1d7 last seen
Franklin Schmidt <fschmidt@gmail.com>
parents: 72
diff changeset
311 span.setAttribute('is_online',isOnline);
33
e2b7f6393dab add online
Franklin Schmidt <fschmidt@gmail.com>
parents: 32
diff changeset
312 }
e2b7f6393dab add online
Franklin Schmidt <fschmidt@gmail.com>
parents: 32
diff changeset
313 }
53
9298b04607ae add unread
Franklin Schmidt <fschmidt@gmail.com>
parents: 48
diff changeset
314
9298b04607ae add unread
Franklin Schmidt <fschmidt@gmail.com>
parents: 48
diff changeset
315 function clearUnread() {
89
Franklin Schmidt <fschmidt@gmail.com>
parents: 88
diff changeset
316 if( spy ) return;
53
9298b04607ae add unread
Franklin Schmidt <fschmidt@gmail.com>
parents: 48
diff changeset
317 let span = document.querySelector(`div[chat="${currentChatId}"] span[unread]`);
9298b04607ae add unread
Franklin Schmidt <fschmidt@gmail.com>
parents: 48
diff changeset
318 span.setAttribute('unread','0');
9298b04607ae add unread
Franklin Schmidt <fschmidt@gmail.com>
parents: 48
diff changeset
319 span.textContent = '0';
9298b04607ae add unread
Franklin Schmidt <fschmidt@gmail.com>
parents: 48
diff changeset
320 }
9298b04607ae add unread
Franklin Schmidt <fschmidt@gmail.com>
parents: 48
diff changeset
321
9298b04607ae add unread
Franklin Schmidt <fschmidt@gmail.com>
parents: 48
diff changeset
322 function incUnread(div) {
9298b04607ae add unread
Franklin Schmidt <fschmidt@gmail.com>
parents: 48
diff changeset
323 let span = div.querySelector('span[unread]');
9298b04607ae add unread
Franklin Schmidt <fschmidt@gmail.com>
parents: 48
diff changeset
324 let n = parseInt(span.getAttribute('unread')) + 1;
9298b04607ae add unread
Franklin Schmidt <fschmidt@gmail.com>
parents: 48
diff changeset
325 span.setAttribute('unread',n);
9298b04607ae add unread
Franklin Schmidt <fschmidt@gmail.com>
parents: 48
diff changeset
326 span.textContent = n;
9298b04607ae add unread
Franklin Schmidt <fschmidt@gmail.com>
parents: 48
diff changeset
327 }
56
323ddacc1593 start invite
Franklin Schmidt <fschmidt@gmail.com>
parents: 54
diff changeset
328
323ddacc1593 start invite
Franklin Schmidt <fschmidt@gmail.com>
parents: 54
diff changeset
329 function invite() {
323ddacc1593 start invite
Franklin Schmidt <fschmidt@gmail.com>
parents: 54
diff changeset
330 let email = document.querySelector('input[type=email]').value;
323ddacc1593 start invite
Franklin Schmidt <fschmidt@gmail.com>
parents: 54
diff changeset
331 ajax(`invite.js?email=${encodeURIComponent(email)}`);
323ddacc1593 start invite
Franklin Schmidt <fschmidt@gmail.com>
parents: 54
diff changeset
332 }
323ddacc1593 start invite
Franklin Schmidt <fschmidt@gmail.com>
parents: 54
diff changeset
333
323ddacc1593 start invite
Franklin Schmidt <fschmidt@gmail.com>
parents: 54
diff changeset
334 function openInvite(email) {
323ddacc1593 start invite
Franklin Schmidt <fschmidt@gmail.com>
parents: 54
diff changeset
335 let dialog = document.querySelector('dialog[invite]');
323ddacc1593 start invite
Franklin Schmidt <fschmidt@gmail.com>
parents: 54
diff changeset
336 let span = dialog.querySelector('span[email]');
323ddacc1593 start invite
Franklin Schmidt <fschmidt@gmail.com>
parents: 54
diff changeset
337 span.textContent = email;
323ddacc1593 start invite
Franklin Schmidt <fschmidt@gmail.com>
parents: 54
diff changeset
338 openModal(dialog);
323ddacc1593 start invite
Franklin Schmidt <fschmidt@gmail.com>
parents: 54
diff changeset
339 }
60
3521166513b3 finish invite
Franklin Schmidt <fschmidt@gmail.com>
parents: 59
diff changeset
340
3521166513b3 finish invite
Franklin Schmidt <fschmidt@gmail.com>
parents: 59
diff changeset
341 function gotoInvite(el) {
3521166513b3 finish invite
Franklin Schmidt <fschmidt@gmail.com>
parents: 59
diff changeset
342 let email = document.querySelector('dialog[invite] span[email]').textContent;
3521166513b3 finish invite
Franklin Schmidt <fschmidt@gmail.com>
parents: 59
diff changeset
343 closeModal(el);
83
a47036fd0158 group chat
Franklin Schmidt <fschmidt@gmail.com>
parents: 81
diff changeset
344 location = `chat?with=${encodeURIComponent(email)}`;
60
3521166513b3 finish invite
Franklin Schmidt <fschmidt@gmail.com>
parents: 59
diff changeset
345 ajax(`save_post.js?post=${currentPostId}`,`content=${encodeURIComponent(text)}`);
3521166513b3 finish invite
Franklin Schmidt <fschmidt@gmail.com>
parents: 59
diff changeset
346 }
63
afd5ab5b02a2 file upload
Franklin Schmidt <fschmidt@gmail.com>
parents: 61
diff changeset
347
afd5ab5b02a2 file upload
Franklin Schmidt <fschmidt@gmail.com>
parents: 61
diff changeset
348 function uploadFile() {
afd5ab5b02a2 file upload
Franklin Schmidt <fschmidt@gmail.com>
parents: 61
diff changeset
349 document.querySelector('input[type="file"]').click();
afd5ab5b02a2 file upload
Franklin Schmidt <fschmidt@gmail.com>
parents: 61
diff changeset
350 }
afd5ab5b02a2 file upload
Franklin Schmidt <fschmidt@gmail.com>
parents: 61
diff changeset
351
afd5ab5b02a2 file upload
Franklin Schmidt <fschmidt@gmail.com>
parents: 61
diff changeset
352 function addFileUrl(url) {
afd5ab5b02a2 file upload
Franklin Schmidt <fschmidt@gmail.com>
parents: 61
diff changeset
353 let textarea = document.querySelector('div[input] textarea');
afd5ab5b02a2 file upload
Franklin Schmidt <fschmidt@gmail.com>
parents: 61
diff changeset
354 let text = textarea.value;
afd5ab5b02a2 file upload
Franklin Schmidt <fschmidt@gmail.com>
parents: 61
diff changeset
355 if( /\S$/.test(text) )
afd5ab5b02a2 file upload
Franklin Schmidt <fschmidt@gmail.com>
parents: 61
diff changeset
356 text += ' ';
afd5ab5b02a2 file upload
Franklin Schmidt <fschmidt@gmail.com>
parents: 61
diff changeset
357 text += url;
afd5ab5b02a2 file upload
Franklin Schmidt <fschmidt@gmail.com>
parents: 61
diff changeset
358 textarea.value = text;
afd5ab5b02a2 file upload
Franklin Schmidt <fschmidt@gmail.com>
parents: 61
diff changeset
359 }
afd5ab5b02a2 file upload
Franklin Schmidt <fschmidt@gmail.com>
parents: 61
diff changeset
360
afd5ab5b02a2 file upload
Franklin Schmidt <fschmidt@gmail.com>
parents: 61
diff changeset
361 function uploadToFilebin(fileName,fileContent) {
afd5ab5b02a2 file upload
Franklin Schmidt <fschmidt@gmail.com>
parents: 61
diff changeset
362 //console.log(fileContent.byteLength);
afd5ab5b02a2 file upload
Franklin Schmidt <fschmidt@gmail.com>
parents: 61
diff changeset
363 let request = new XMLHttpRequest();
93
d0566cc4a2ac uploa fix
Franklin Schmidt <fschmidt@gmail.com>
parents: 92
diff changeset
364 let url = filebinUrl + encodeURIComponent(fileName);
63
afd5ab5b02a2 file upload
Franklin Schmidt <fschmidt@gmail.com>
parents: 61
diff changeset
365 request.open( 'POST', url );
afd5ab5b02a2 file upload
Franklin Schmidt <fschmidt@gmail.com>
parents: 61
diff changeset
366 request.onload = function() {
afd5ab5b02a2 file upload
Franklin Schmidt <fschmidt@gmail.com>
parents: 61
diff changeset
367 if( request.status !== 201 ) {
afd5ab5b02a2 file upload
Franklin Schmidt <fschmidt@gmail.com>
parents: 61
diff changeset
368 let err = 'upload failed: ' + request.status;
afd5ab5b02a2 file upload
Franklin Schmidt <fschmidt@gmail.com>
parents: 61
diff changeset
369 if( request.responseText ) {
afd5ab5b02a2 file upload
Franklin Schmidt <fschmidt@gmail.com>
parents: 61
diff changeset
370 err += '\n' + request.responseText;
afd5ab5b02a2 file upload
Franklin Schmidt <fschmidt@gmail.com>
parents: 61
diff changeset
371 }
afd5ab5b02a2 file upload
Franklin Schmidt <fschmidt@gmail.com>
parents: 61
diff changeset
372 console.log(err);
afd5ab5b02a2 file upload
Franklin Schmidt <fschmidt@gmail.com>
parents: 61
diff changeset
373 ajax( '/error_log.js', 'err='+encodeURIComponent(err) );
afd5ab5b02a2 file upload
Franklin Schmidt <fschmidt@gmail.com>
parents: 61
diff changeset
374 return;
afd5ab5b02a2 file upload
Franklin Schmidt <fschmidt@gmail.com>
parents: 61
diff changeset
375 }
afd5ab5b02a2 file upload
Franklin Schmidt <fschmidt@gmail.com>
parents: 61
diff changeset
376 addFileUrl(url);
afd5ab5b02a2 file upload
Franklin Schmidt <fschmidt@gmail.com>
parents: 61
diff changeset
377 };
afd5ab5b02a2 file upload
Franklin Schmidt <fschmidt@gmail.com>
parents: 61
diff changeset
378 request.send(fileContent);
afd5ab5b02a2 file upload
Franklin Schmidt <fschmidt@gmail.com>
parents: 61
diff changeset
379 }
afd5ab5b02a2 file upload
Franklin Schmidt <fschmidt@gmail.com>
parents: 61
diff changeset
380
afd5ab5b02a2 file upload
Franklin Schmidt <fschmidt@gmail.com>
parents: 61
diff changeset
381 function loadedFile(input) {
afd5ab5b02a2 file upload
Franklin Schmidt <fschmidt@gmail.com>
parents: 61
diff changeset
382 let file = input.files[0];
afd5ab5b02a2 file upload
Franklin Schmidt <fschmidt@gmail.com>
parents: 61
diff changeset
383 input.value = null;
afd5ab5b02a2 file upload
Franklin Schmidt <fschmidt@gmail.com>
parents: 61
diff changeset
384 console.log(file);
afd5ab5b02a2 file upload
Franklin Schmidt <fschmidt@gmail.com>
parents: 61
diff changeset
385 let reader = new FileReader();
afd5ab5b02a2 file upload
Franklin Schmidt <fschmidt@gmail.com>
parents: 61
diff changeset
386 reader.onload = function() {
afd5ab5b02a2 file upload
Franklin Schmidt <fschmidt@gmail.com>
parents: 61
diff changeset
387 uploadToFilebin(file.name,reader.result);
afd5ab5b02a2 file upload
Franklin Schmidt <fschmidt@gmail.com>
parents: 61
diff changeset
388 };
afd5ab5b02a2 file upload
Franklin Schmidt <fschmidt@gmail.com>
parents: 61
diff changeset
389 reader.readAsArrayBuffer(file);
afd5ab5b02a2 file upload
Franklin Schmidt <fschmidt@gmail.com>
parents: 61
diff changeset
390 }
65
6cfef9850520 people popup
Franklin Schmidt <fschmidt@gmail.com>
parents: 63
diff changeset
391
6cfef9850520 people popup
Franklin Schmidt <fschmidt@gmail.com>
parents: 63
diff changeset
392 function openPeople() {
6cfef9850520 people popup
Franklin Schmidt <fschmidt@gmail.com>
parents: 63
diff changeset
393 let dialog = document.querySelector('dialog[people]');
73
a63faf49e1d7 last seen
Franklin Schmidt <fschmidt@gmail.com>
parents: 72
diff changeset
394 let spans = dialog.querySelectorAll('span[last_seen]');
a63faf49e1d7 last seen
Franklin Schmidt <fschmidt@gmail.com>
parents: 72
diff changeset
395 let now = Date.now();
a63faf49e1d7 last seen
Franklin Schmidt <fschmidt@gmail.com>
parents: 72
diff changeset
396 let old = now - 70000;
a63faf49e1d7 last seen
Franklin Schmidt <fschmidt@gmail.com>
parents: 72
diff changeset
397 for( let span of spans ) {
a63faf49e1d7 last seen
Franklin Schmidt <fschmidt@gmail.com>
parents: 72
diff changeset
398 let id = span.getAttribute('last_seen');
a63faf49e1d7 last seen
Franklin Schmidt <fschmidt@gmail.com>
parents: 72
diff changeset
399 let s;
a63faf49e1d7 last seen
Franklin Schmidt <fschmidt@gmail.com>
parents: 72
diff changeset
400 let lastOnline = online[id];
a63faf49e1d7 last seen
Franklin Schmidt <fschmidt@gmail.com>
parents: 72
diff changeset
401 if( !lastOnline ) {
a63faf49e1d7 last seen
Franklin Schmidt <fschmidt@gmail.com>
parents: 72
diff changeset
402 s = '';
a63faf49e1d7 last seen
Franklin Schmidt <fschmidt@gmail.com>
parents: 72
diff changeset
403 } else if( lastOnline > old ) {
a63faf49e1d7 last seen
Franklin Schmidt <fschmidt@gmail.com>
parents: 72
diff changeset
404 s = 'Active now';
a63faf49e1d7 last seen
Franklin Schmidt <fschmidt@gmail.com>
parents: 72
diff changeset
405 } else {
a63faf49e1d7 last seen
Franklin Schmidt <fschmidt@gmail.com>
parents: 72
diff changeset
406 s = 'Last seen ' + ago(now - lastOnline);
a63faf49e1d7 last seen
Franklin Schmidt <fschmidt@gmail.com>
parents: 72
diff changeset
407 }
a63faf49e1d7 last seen
Franklin Schmidt <fschmidt@gmail.com>
parents: 72
diff changeset
408 console.log(`${id} ${s}`);
a63faf49e1d7 last seen
Franklin Schmidt <fschmidt@gmail.com>
parents: 72
diff changeset
409 span.textContent = s;
a63faf49e1d7 last seen
Franklin Schmidt <fschmidt@gmail.com>
parents: 72
diff changeset
410 }
65
6cfef9850520 people popup
Franklin Schmidt <fschmidt@gmail.com>
parents: 63
diff changeset
411 openModal(dialog);
6cfef9850520 people popup
Franklin Schmidt <fschmidt@gmail.com>
parents: 63
diff changeset
412 }
75
377bdda60f0b read up to
Franklin Schmidt <fschmidt@gmail.com>
parents: 73
diff changeset
413
377bdda60f0b read up to
Franklin Schmidt <fschmidt@gmail.com>
parents: 73
diff changeset
414 function readUpTo(userId,userNameHtml,unread) {
76
Franklin Schmidt <fschmidt@gmail.com>
parents: 75
diff changeset
415 //console.log(`readUpTo ${unread}`);
75
377bdda60f0b read up to
Franklin Schmidt <fschmidt@gmail.com>
parents: 73
diff changeset
416 let divs = document.querySelectorAll('div[post]');
377bdda60f0b read up to
Franklin Schmidt <fschmidt@gmail.com>
parents: 73
diff changeset
417 if( unread >= divs.length )
377bdda60f0b read up to
Franklin Schmidt <fschmidt@gmail.com>
parents: 73
diff changeset
418 return;
76
Franklin Schmidt <fschmidt@gmail.com>
parents: 75
diff changeset
419 let div = divs[divs.length - unread - 1];
89
Franklin Schmidt <fschmidt@gmail.com>
parents: 88
diff changeset
420 let old = document.querySelector(`div[up_to][user="${userId}"]`);
76
Franklin Schmidt <fschmidt@gmail.com>
parents: 75
diff changeset
421 if( old ) {
89
Franklin Schmidt <fschmidt@gmail.com>
parents: 88
diff changeset
422 //console.log(`was ${div.getAttribute('up_to')}`);
76
Franklin Schmidt <fschmidt@gmail.com>
parents: 75
diff changeset
423 if( div == old.parentNode )
Franklin Schmidt <fschmidt@gmail.com>
parents: 75
diff changeset
424 return;
Franklin Schmidt <fschmidt@gmail.com>
parents: 75
diff changeset
425 old.outerHTML = '';
Franklin Schmidt <fschmidt@gmail.com>
parents: 75
diff changeset
426 }
Franklin Schmidt <fschmidt@gmail.com>
parents: 75
diff changeset
427 //console.log('readUpTo');
89
Franklin Schmidt <fschmidt@gmail.com>
parents: 88
diff changeset
428 let html = `<div user="${userId}" up_to="${unread}">read by ${userNameHtml}</div>`;
75
377bdda60f0b read up to
Franklin Schmidt <fschmidt@gmail.com>
parents: 73
diff changeset
429 div.insertAdjacentHTML('beforeend',html);
81
Franklin Schmidt <fschmidt@gmail.com>
parents: 79
diff changeset
430 if( !old ) {
89
Franklin Schmidt <fschmidt@gmail.com>
parents: 88
diff changeset
431 let dy = document.querySelector('div[up_to]').clientHeight;
81
Franklin Schmidt <fschmidt@gmail.com>
parents: 79
diff changeset
432 document.querySelector('div[main]').scrollBy(0,dy);
Franklin Schmidt <fschmidt@gmail.com>
parents: 79
diff changeset
433 }
75
377bdda60f0b read up to
Franklin Schmidt <fschmidt@gmail.com>
parents: 73
diff changeset
434 }
79
Franklin Schmidt <fschmidt@gmail.com>
parents: 78
diff changeset
435
Franklin Schmidt <fschmidt@gmail.com>
parents: 78
diff changeset
436 function replyPost(el) {
Franklin Schmidt <fschmidt@gmail.com>
parents: 78
diff changeset
437 let postId = getPostId(el);
Franklin Schmidt <fschmidt@gmail.com>
parents: 78
diff changeset
438 let div = document.querySelector('div[reply]');
Franklin Schmidt <fschmidt@gmail.com>
parents: 78
diff changeset
439 div.removeAttribute('hidden');
Franklin Schmidt <fschmidt@gmail.com>
parents: 78
diff changeset
440 div.setAttribute('reply',postId);
112
77c8104d7053 add selectPost
Franklin Schmidt <fschmidt@gmail.com>
parents: 111
diff changeset
441 document.querySelector('div[reply] div[text]').innerHTML = document.querySelector(`div[post="${postId}"] div[text]`).innerHTML;
109
b86bb25fb416 reply fix
Franklin Schmidt <fschmidt@gmail.com>
parents: 107
diff changeset
442 let a = document.querySelector('div[reply] a[when]');
79
Franklin Schmidt <fschmidt@gmail.com>
parents: 78
diff changeset
443 a.href = `#p${postId}`;
Franklin Schmidt <fschmidt@gmail.com>
parents: 78
diff changeset
444 a.textContent = document.querySelector(`div[post="${postId}"] span[when]`).textContent;
Franklin Schmidt <fschmidt@gmail.com>
parents: 78
diff changeset
445 document.querySelector('div[input] textarea').focus();
Franklin Schmidt <fschmidt@gmail.com>
parents: 78
diff changeset
446 document.querySelector('div[input]').scrollIntoView({block: 'end'});
Franklin Schmidt <fschmidt@gmail.com>
parents: 78
diff changeset
447 }
Franklin Schmidt <fschmidt@gmail.com>
parents: 78
diff changeset
448
Franklin Schmidt <fschmidt@gmail.com>
parents: 78
diff changeset
449 function closeReply() {
Franklin Schmidt <fschmidt@gmail.com>
parents: 78
diff changeset
450 let div = document.querySelector('div[reply]');
Franklin Schmidt <fschmidt@gmail.com>
parents: 78
diff changeset
451 div.setAttribute('hidden','');
Franklin Schmidt <fschmidt@gmail.com>
parents: 78
diff changeset
452 div.setAttribute('reply','');
Franklin Schmidt <fschmidt@gmail.com>
parents: 78
diff changeset
453 }
83
a47036fd0158 group chat
Franklin Schmidt <fschmidt@gmail.com>
parents: 81
diff changeset
454
a47036fd0158 group chat
Franklin Schmidt <fschmidt@gmail.com>
parents: 81
diff changeset
455 function openAddToChat() {
a47036fd0158 group chat
Franklin Schmidt <fschmidt@gmail.com>
parents: 81
diff changeset
456 let dialog = document.querySelector('dialog[add]');
a47036fd0158 group chat
Franklin Schmidt <fschmidt@gmail.com>
parents: 81
diff changeset
457 dialog.querySelector('input[name=email]').value = '';
a47036fd0158 group chat
Franklin Schmidt <fschmidt@gmail.com>
parents: 81
diff changeset
458 openModal(dialog);
a47036fd0158 group chat
Franklin Schmidt <fschmidt@gmail.com>
parents: 81
diff changeset
459 }
a47036fd0158 group chat
Franklin Schmidt <fschmidt@gmail.com>
parents: 81
diff changeset
460
a47036fd0158 group chat
Franklin Schmidt <fschmidt@gmail.com>
parents: 81
diff changeset
461 function addToChat() {
a47036fd0158 group chat
Franklin Schmidt <fschmidt@gmail.com>
parents: 81
diff changeset
462 let dialog = document.querySelector('dialog[add]');
a47036fd0158 group chat
Franklin Schmidt <fschmidt@gmail.com>
parents: 81
diff changeset
463 let email = dialog.querySelector('input[name=email]').value;
a47036fd0158 group chat
Franklin Schmidt <fschmidt@gmail.com>
parents: 81
diff changeset
464 ajax(`add_to_chat.js?chat=${currentChatId}&email=${encodeURIComponent(email)}`);
a47036fd0158 group chat
Franklin Schmidt <fschmidt@gmail.com>
parents: 81
diff changeset
465 }
a47036fd0158 group chat
Franklin Schmidt <fschmidt@gmail.com>
parents: 81
diff changeset
466
a47036fd0158 group chat
Franklin Schmidt <fschmidt@gmail.com>
parents: 81
diff changeset
467 function addToChatError(msg) {
a47036fd0158 group chat
Franklin Schmidt <fschmidt@gmail.com>
parents: 81
diff changeset
468 let dialog = document.querySelector('dialog[add]');
a47036fd0158 group chat
Franklin Schmidt <fschmidt@gmail.com>
parents: 81
diff changeset
469 dialog.querySelector('span[error]').textContent = msg;
a47036fd0158 group chat
Franklin Schmidt <fschmidt@gmail.com>
parents: 81
diff changeset
470 }
112
77c8104d7053 add selectPost
Franklin Schmidt <fschmidt@gmail.com>
parents: 111
diff changeset
471
77c8104d7053 add selectPost
Franklin Schmidt <fschmidt@gmail.com>
parents: 111
diff changeset
472 function selectPost(el) {
77c8104d7053 add selectPost
Franklin Schmidt <fschmidt@gmail.com>
parents: 111
diff changeset
473 let postId = getPostId(el);
77c8104d7053 add selectPost
Franklin Schmidt <fschmidt@gmail.com>
parents: 111
diff changeset
474 let div = document.querySelector(`div[post="${postId}"] div[text]`);
77c8104d7053 add selectPost
Franklin Schmidt <fschmidt@gmail.com>
parents: 111
diff changeset
475 let range = document.createRange();
77c8104d7053 add selectPost
Franklin Schmidt <fschmidt@gmail.com>
parents: 111
diff changeset
476 range.selectNodeContents(div);
77c8104d7053 add selectPost
Franklin Schmidt <fschmidt@gmail.com>
parents: 111
diff changeset
477 let selection = window.getSelection();
77c8104d7053 add selectPost
Franklin Schmidt <fschmidt@gmail.com>
parents: 111
diff changeset
478 selection.removeAllRanges();
77c8104d7053 add selectPost
Franklin Schmidt <fschmidt@gmail.com>
parents: 111
diff changeset
479 selection.addRange(range);
77c8104d7053 add selectPost
Franklin Schmidt <fschmidt@gmail.com>
parents: 111
diff changeset
480 }