@ -19,7 +19,7 @@ dayjs.extend(dayjsRelativeTime);
export class TimeTrackerApp extends DtpApp {
export class TimeTrackerApp extends DtpApp {
static get SCREENSHOT_INTERVAL ( ) { return 1000 * 60 * 10 ; }
static get SCREENSHOT_INTERVAL ( ) { return 1000 * 15 ; }
static get SFX_TRACKER_START ( ) { return 'tracker-start' ; }
static get SFX_TRACKER_START ( ) { return 'tracker-start' ; }
static get SFX_TRACKER_UPDATE ( ) { return 'tracker-update' ; }
static get SFX_TRACKER_UPDATE ( ) { return 'tracker-update' ; }
@ -146,17 +146,33 @@ export class TimeTrackerApp extends DtpApp {
async onTrackerSocketConnect ( socket ) {
async onTrackerSocketConnect ( socket ) {
this . log . debug ( 'onSocketConnect' , 'attaching socket events' ) ;
this . log . debug ( 'onSocketConnect' , 'attaching socket events' ) ;
socket . on ( 'system-message' , this . onSystemMessage . bind ( this ) ) ;
socket . on ( 'session-control' , this . onSessionControl . bind ( this ) ) ;
this . systemMessageHandler = this . onSystemMessage . bind ( this ) ;
socket . on ( 'system-message' , this . systemMessageHandler ) ;
this . sessionControlHandler = this . onSessionControl . bind ( this ) ;
socket . on ( 'session-control' , this . sessionControlHandler ) ;
if ( dtp . task ) {
if ( dtp . task ) {
await this . socket . joinChannel ( dtp . task . _ id , 'Task' ) ;
await this . socket . joinChannel ( dtp . task . _ id , 'Task' ) ;
}
}
if ( this . taskSession ) {
await this . setTaskSessionStatus ( 'active' ) ;
}
}
}
async onTrackerSocketDisconnect ( socket ) {
async onTrackerSocketDisconnect ( socket ) {
this . log . debug ( 'onSocketDisconnect' , 'detaching socket events' ) ;
this . log . debug ( 'onSocketDisconnect' , 'detaching socket events' ) ;
socket . off ( 'system-message' , this . onSystemMessage . bind ( this ) ) ;
socket . off ( 'session-control' , this . sessionControlHandler ) ;
delete this . sessionControlHandler ;
socket . off ( 'system-message' , this . systemMessageHandler ) ;
delete this . systemMessageHandler ;
if ( this . taskSession ) {
await this . setTaskSessionStatus ( 'reconnecting' ) ;
}
}
}
async onSystemMessage ( message ) {
async onSystemMessage ( message ) {
@ -167,23 +183,23 @@ export class TimeTrackerApp extends DtpApp {
async onSessionControl ( message ) {
async onSessionControl ( message ) {
const activityToggle = document . querySelector ( '' ) ;
const activityToggle = document . querySelector ( '' ) ;
if ( message . cmd ) {
switch ( message . cmd ) {
case 'end-session' :
try {
await this . closeTaskSession ( ) ;
activityToggle . checked = false ;
} catch ( error ) {
this . log . error ( 'onSessionControl' , 'failed to close task work session' , { error } ) ;
return ;
}
break ;
switch ( message . cmd ) {
default :
case 'end-session' :
this . log . error ( 'onSessionControl' , 'invalid command received' , { cmd : message . cmd } ) ;
try {
await this . closeTaskSession ( ) ;
activityToggle . checked = false ;
} catch ( error ) {
this . log . error ( 'onSessionControl' , 'failed to close task work session' , { error } ) ;
return ;
return ;
}
}
break ;
default :
this . log . error ( 'onSessionControl' , 'invalid command received' , { cmd : message . cmd } ) ;
return ;
}
}
if ( message . displayList ) {
if ( message . displayList ) {
this . displayEngine . executeDisplayList ( message . displayList ) ;
this . displayEngine . executeDisplayList ( message . displayList ) ;
}
}
@ -491,6 +507,30 @@ export class TimeTrackerApp extends DtpApp {
}
}
}
}
async setTaskSessionStatus ( status ) {
try {
const url = ` /task/ ${ dtp . task . _ id } /session/ ${ this . taskSession . _ id } /status ` ;
const body = JSON . stringify ( { status } ) ;
const response = await fetch ( url , {
method : 'POST' ,
headers : {
'Content-Type' : 'application/json' ,
'Content-Length' : body . length ,
} ,
body ,
} ) ;
await this . processResponse ( response ) ;
this . taskSession . status = status ;
} catch ( error ) {
UIkit . notification ( {
message : ` Failed to update task session status: ${ error . message } ` ,
status : 'danger' ,
pos : 'bottom-center' ,
timeout : 5000 ,
} ) ;
}
}
async closeTaskSession ( ) {
async closeTaskSession ( ) {
try {
try {
const url = ` /task/ ${ dtp . task . _ id } /session/ ${ this . taskSession . _ id } /close ` ;
const url = ` /task/ ${ dtp . task . _ id } /session/ ${ this . taskSession . _ id } /close ` ;
@ -534,6 +574,12 @@ export class TimeTrackerApp extends DtpApp {
}
}
async updateSessionDisplay ( ) {
async updateSessionDisplay ( ) {
if ( this . taskSession . status === 'reconnecting' ) {
this . currentSessionDuration . textContent = '---' ;
this . currentSessionTimeRemaining . textContent = '---' ;
return ;
}
const NOW = new Date ( ) ;
const NOW = new Date ( ) ;
const duration = dayjs ( NOW ) . diff ( this . currentSessionStartTime , 'second' ) ;
const duration = dayjs ( NOW ) . diff ( this . currentSessionStartTime , 'second' ) ;
this . currentSessionDuration . textContent = numeral ( duration ) . format ( 'HH:MM:SS' ) ;
this . currentSessionDuration . textContent = numeral ( duration ) . format ( 'HH:MM:SS' ) ;