livebook/assets/js/hooks/timer.js

42 lines
765 B
JavaScript
Raw Normal View History

2023-11-23 23:18:06 +08:00
import { parseHookProps } from "../lib/attribute";
const UPDATE_INTERVAL_MS = 100;
/**
* A hook used to display a counting timer.
*
2023-11-23 23:18:06 +08:00
* ## Props
*
* * `start` - the timestamp to count from
*
*/
const Timer = {
mounted() {
this.props = this.getProps();
this.interval = setInterval(() => this.updateDOM(), UPDATE_INTERVAL_MS);
},
updated() {
this.props = this.getProps();
this.updateDOM();
},
destroyed() {
clearInterval(this.interval);
},
getProps() {
2023-11-23 23:18:06 +08:00
return parseHookProps(this.el, ["start"]);
},
updateDOM() {
const elapsedMs = Date.now() - new Date(this.props.start);
const elapsedSeconds = elapsedMs / 1_000;
this.el.innerHTML = `${elapsedSeconds.toFixed(1)}s`;
},
};
export default Timer;