@@ -1,11 +1,23 @@
1 1 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
(function(){
2 2 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const form = document.querySelector('#chat-form');
3 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- let mxMsg = -50;
4 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( window.fossilChatInitSize ) mxMsg = -window.fossilChatInitSize;
5 3 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const F = window.fossil, D = F.dom;
6 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- const _me = F.user.name;
4 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const Chat = (function(){
5 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const cs = {
6 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ me: F.user.name,
7 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ mxMsg: F.config.chatInitSize ? -F.config.chatInitSize : -50,
8 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pageIsActive: !document.hidden,
9 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ onPageActive: function(){console.debug("Page active.")}, //override below
10 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ onPageInactive: function(){console.debug("Page inactive.")} //override below
11 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ };
12 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ document.addEventListener('visibilitychange', function(ev){
13 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ cs.pageIsActive = !document.hidden;
14 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if(cs.pageIsActive) cs.onPageActive();
15 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ else cs.onPageInactive();
16 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }, true);
17 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return cs;
18 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ })();
7 19 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* State for paste and drag/drop */
8 20 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const BlobXferState = {
9 21 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
dropDetails: document.querySelector('#chat-drop-details'),
10 22 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob: undefined
11 23 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
};
@@ -120,11 +132,10 @@
120 132 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
121 133 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
f.injectPoint.parentNode.appendChild(e);
122 134 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
123 135 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
};
124 136 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Returns a new TEXT node with the given text content. */
125 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- const textNode = (T)=>document.createTextNode(T);
126 137 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/** Returns the local time string of Date object d, defaulting
127 138 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
to the current time. */
128 139 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const localTimeString = function ff(d){
129 140 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if(!ff.pad){
130 141 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
ff.pad = (x)=>(''+x).length>1 ? x : '0'+x;
@@ -179,73 +190,68 @@
179 190 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
};
180 191 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/** Callback for poll() to inject new content into the page. */
181 192 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
function newcontent(jx){
182 193 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
var i;
183 194 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
for(i=0; i<jx.msgs.length; ++i){
184 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- let m = jx.msgs[i];
185 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- let row = document.createElement("fieldset");
186 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( m.msgid>mxMsg ) mxMsg = m.msgid;
187 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- row.classList.add('message-row');
195 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const m = jx.msgs[i];
196 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( m.msgid>Chat.mxMsg ) Chat.mxMsg = m.msgid;
197 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const eWho = D.create('legend'),
198 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ row = D.addClass(D.fieldset(eWho), 'message-row');
188 199 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
injectMessage(row);
189 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- const eWho = document.createElement('legend');
190 200 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
eWho.dataset.timestamp = m.mtime;
191 201 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
eWho.addEventListener('click', handleLegendClicked, false);
192 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( m.xfrom==_me && window.outerWidth<1000 ){
202 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( m.xfrom==Chat.me && window.outerWidth<1000 ){
193 203 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
eWho.setAttribute('align', 'right');
194 204 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
row.style.justifyContent = "flex-end";
195 205 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
196 206 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
eWho.setAttribute('align', 'left');
197 207 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
198 208 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
eWho.style.backgroundColor = m.uclr;
199 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- row.appendChild(eWho);
200 209 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
eWho.classList.add('message-user');
201 210 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
let whoName = m.xfrom;
202 211 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
var d = new Date(m.mtime + "Z");
203 212 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( d.getMinutes().toString()!="NaN" ){
204 213 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Show local time when we can compute it */
205 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- eWho.append(textNode(whoName+' @ '+
214 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ eWho.append(D.text(whoName+' @ '+
206 215 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
d.getHours()+":"+(d.getMinutes()+100).toString().slice(1,3)
207 216 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
))
208 217 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
209 218 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Show UTC on systems where Date() does not work */
210 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- eWho.append(textNode(whoName+' @ '+m.mtime.slice(11,16)))
219 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ eWho.append(D.text(whoName+' @ '+m.mtime.slice(11,16)))
211 220 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
212 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- let span = document.createElement("div");
213 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- span.classList.add('message-content');
214 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- span.style.backgroundColor = m.uclr;
215 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- row.appendChild(span);
221 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ let eContent = D.addClass(D.div(),'message-content','chat-message');
222 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ eContent.style.backgroundColor = m.uclr;
223 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ row.appendChild(eContent);
216 224 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( m.fsize>0 ){
217 225 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( m.fmime && m.fmime.startsWith("image/") ){
218 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- let img = document.createElement("img");
219 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- img.src = "chat-download/" + m.msgid;
220 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- span.appendChild(img);
226 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ eContent.appendChild(D.img("chat-download/" + m.msgid));
221 227 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
222 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- let a = document.createElement("a");
223 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- let txt = "(" + m.fname + " " + m.fsize + " bytes)";
224 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- a.href = window.fossil.rootPath+
225 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- 'chat-download/' + m.msgid+'/'+encodeURIComponent(m.fname);
226 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- // ^^^ add m.fname to URL to cause downloaded file to have that name.
227 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- a.appendChild(textNode(txt));
228 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- span.appendChild(a);
229 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
230 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- let br = document.createElement("br");
231 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- br.style.clear = "both";
232 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- span.appendChild(br);
228 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ eContent.appendChild(D.a(
229 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ window.fossil.rootPath+
230 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ 'chat-download/' + m.msgid+'/'+encodeURIComponent(m.fname),
231 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ // ^^^ add m.fname to URL to cause downloaded file to have that name.
232 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "(" + m.fname + " " + m.fsize + " bytes)"
233 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ));
234 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
235 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const br = D.br();
236 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ br.style.clear = "both";
237 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ eContent.appendChild(br);
233 238 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
234 239 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if(m.xmsg){
235 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- span.innerHTML += m.xmsg;
240 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ try{D.moveChildrenTo(eContent, D.parseHtml(m.xmsg))}
241 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ catch(e){console.error(e)}
236 242 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
237 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- span.classList.add('chat-message');
243 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ eContent.classList.add('chat-message');
238 244 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
239 245 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
240 246 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
async function poll(){
241 247 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if(poll.running) return;
242 248 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
poll.running = true;
243 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fetch("chat-poll?name=" + mxMsg)
249 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fetch("chat-poll?name=" + Chat.mxMsg)
244 250 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
.then(x=>x.json())
245 251 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
.then(y=>newcontent(y))
246 252 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
.catch(e=>console.error(e))
247 253 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
.finally(()=>poll.running=false)
248 254 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
249 255 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
poll();
250 256 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
setInterval(poll, 1000);
251 257 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
})();
252 258 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!