BangleApps/apps/clkinfostopw/clkinfo.ts

84 lines
2.2 KiB
TypeScript

(() => {
let durationOnPause = "---";
let redrawInterval: IntervalId | undefined;
let startTime: number | undefined;
let showMillis = true;
const milliTime = 60;
const unqueueRedraw = () => {
if (redrawInterval) clearInterval(redrawInterval);
redrawInterval = undefined;
};
const queueRedraw = function(this: ClockInfo.MenuItem) {
unqueueRedraw();
redrawInterval = setInterval(() => {
if (startTime) {
if (showMillis && Date.now() - startTime > milliTime * 1000) {
showMillis = false;
changeInterval(redrawInterval!, 1000);
}
} else {
unqueueRedraw();
}
this.emit('redraw')
}, 100);
};
const pad2 = (s: number) => ('0' + s.toFixed(0)).slice(-2);
const duration = (start: number) => {
let seconds = (Date.now() - start) / 1000;
if (seconds < milliTime)
return seconds.toFixed(1);
let mins = seconds / 60;
seconds %= 60;
if (mins < 60)
return `${mins.toFixed(0)}:${pad2(seconds)}`;
let hours = mins / 60;
mins %= 60;
return `${hours.toFixed(0)}:${pad2(mins)}:${pad2(seconds)}`;
};
const img = () => atob("GBiBAAAAAAB+AAB+AAAAAAB+AAH/sAOB8AcA4A4YcAwYMBgYGBgYGBg8GBg8GBgYGBgAGAwAMA4AcAcA4AOBwAH/gAB+AAAAAAAAAA==");
return {
name: "timer",
img: img(),
items: [
{
name: "stopw",
get: () => ({
text: startTime
? duration(startTime)
: durationOnPause,
img: img(),
}),
show: function(this: ClockInfo.MenuItem) {
if(startTime){ // only queue if active
queueRedraw.call(this);
}else{
this.emit('redraw')
}
},
hide: unqueueRedraw,
run: function() { // tapped
if (startTime) {
durationOnPause = duration(startTime);
startTime = undefined; // this also unqueues the redraw
} else {
queueRedraw.call(this);
showMillis = true;
startTime = Date.now();
}
}
}
]
};
}) satisfies ClockInfoFunc // FIXME: semi-colon added automatically when Typescript generates Javascript file?