comparison src/chat.js @ 73:a63faf49e1d7

last seen
author Franklin Schmidt <fschmidt@gmail.com>
date Sat, 08 Mar 2025 20:26:19 -0700
parents bce0480721c1
children 377bdda60f0b
comparison
equal deleted inserted replaced
72:bce0480721c1 73:a63faf49e1d7
1 'use strict'; 1 'use strict';
2 2
3 let title = document.title; 3 let title = document.title;
4 let currentChatId = null; 4 let currentChatId = null;
5 let eventSource; 5 let eventSource;
6 let lastUpdate; 6 let lastUpdate = Date.now();
7 let userId; 7 let userId;
8 let filebinUrl; 8 let filebinUrl;
9 9
10 function evalEvent(event) { 10 function evalEvent(event) {
11 // console.log(event); 11 // console.log(event);
225 pulldown.scrollIntoViewIfNeeded(false); 225 pulldown.scrollIntoViewIfNeeded(false);
226 } 226 }
227 } 227 }
228 228
229 function heartbeat() { 229 function heartbeat() {
230 showOnline();
231 ajax(`heartbeat.js?last_update=${lastUpdate}`); 230 ajax(`heartbeat.js?last_update=${lastUpdate}`);
232 } 231 }
233 232
234 setInterval( heartbeat, 10000 ); 233 setInterval( heartbeat, 10000 );
234 heartbeat();
235 235
236 let online = {}; 236 let online = {};
237
238 function setOnline(userId) {
239 online[userId] = Date.now();
240 }
241 237
242 function showOnline() { 238 function showOnline() {
243 let old = Date.now() - 70000; 239 let old = Date.now() - 70000;
244 for( let id of Object.keys(online) ) {
245 if( online[id] < old )
246 delete online[id];
247 }
248 let spans = document.querySelectorAll('span[online]'); 240 let spans = document.querySelectorAll('span[online]');
249 for( let span of spans ) { 241 for( let span of spans ) {
250 let id = span.getAttribute('online'); 242 let id = span.getAttribute('online');
251 span.setAttribute('is_online',!!online[id]); 243 let wasOnline = online[id];
244 let isOnline = !!wasOnline && wasOnline > old;
245 span.setAttribute('is_online',isOnline);
252 } 246 }
253 } 247 }
254 248
255 function clearUnread() { 249 function clearUnread() {
256 let span = document.querySelector(`div[chat="${currentChatId}"] span[unread]`); 250 let span = document.querySelector(`div[chat="${currentChatId}"] span[unread]`);
326 uploadToFilebin(file.name,reader.result); 320 uploadToFilebin(file.name,reader.result);
327 }; 321 };
328 reader.readAsArrayBuffer(file); 322 reader.readAsArrayBuffer(file);
329 } 323 }
330 324
325 let times = [
326 {
327 time: 1000*60*60*24,
328 unit: 'day'
329 },
330 {
331 time: 1000*60*60,
332 unit: 'hour'
333 },
334 {
335 time: 1000*60,
336 unit: 'minute'
337 }
338 ];
339
340 function ago(time) {
341 for( let t of times ) {
342 let n = Math.floor(time / t.time);
343 if( n > 0 ) {
344 let s = `${n} ${t.unit}`;
345 if( n > 1 )
346 s = s + 's';
347 return s + ' ago';
348 }
349 }
350 return 'just now';
351 end
352 }
353
331 function openPeople() { 354 function openPeople() {
332 let dialog = document.querySelector('dialog[people]'); 355 let dialog = document.querySelector('dialog[people]');
333 openModal(dialog); 356 let spans = dialog.querySelectorAll('span[last_seen]');
334 } 357 let now = Date.now();
358 let old = now - 70000;
359 for( let span of spans ) {
360 let id = span.getAttribute('last_seen');
361 let s;
362 let lastOnline = online[id];
363 if( !lastOnline ) {
364 s = '';
365 } else if( lastOnline > old ) {
366 s = 'Active now';
367 } else {
368 s = 'Last seen ' + ago(now - lastOnline);
369 }
370 console.log(`${id} ${s}`);
371 span.textContent = s;
372 }
373 openModal(dialog);
374 }