Visual Console Client: finished the digital clock item
Former-commit-id: 3b14fb14ee0d1233966e3aac67cdca65378a0adf
This commit is contained in:
parent
e97ee485ef
commit
cafede1599
|
@ -86,16 +86,102 @@ export function clockPropsDecoder(data: UnknownObject): ClockProps | never {
|
||||||
}
|
}
|
||||||
|
|
||||||
export default class Clock extends VisualConsoleItem<ClockProps> {
|
export default class Clock extends VisualConsoleItem<ClockProps> {
|
||||||
public createDomElement(): HTMLElement {
|
public static readonly TICK_INTERVAL: number = 1000; // In ms.
|
||||||
|
private intervalRef: number | null = null;
|
||||||
|
|
||||||
|
public constructor(props: ClockProps) {
|
||||||
|
super(props);
|
||||||
|
// The item is already loaded and inserted into the DOM.
|
||||||
|
|
||||||
|
// Below you can modify the item, add event handlers, timers, etc.
|
||||||
|
|
||||||
|
/* The use of the arrow function is important here. startTick will
|
||||||
|
* use the function passed as an argument to call the global setInterval
|
||||||
|
* function. The interval, timeout or event functions, among other, are
|
||||||
|
* called into another execution loop and using a different context.
|
||||||
|
* The arrow functions, unlike the classic functions, doesn't create
|
||||||
|
* their own context (this), so their context at execution time will be
|
||||||
|
* use the current context at the declaration time.
|
||||||
|
* http://es6-features.org/#Lexicalthis
|
||||||
|
*/
|
||||||
|
this.startTick(() => {
|
||||||
|
// Replace the old element with the updated date.
|
||||||
|
this.childElementRef.innerHTML = this.createClock().innerHTML;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Wrap a window.clearInterval call.
|
||||||
|
*/
|
||||||
|
private stopTick(): void {
|
||||||
|
if (this.intervalRef !== null) {
|
||||||
|
window.clearInterval(this.intervalRef);
|
||||||
|
this.intervalRef = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Wrap a window.setInterval call.
|
||||||
|
*/
|
||||||
|
private startTick(handler: TimerHandler): void {
|
||||||
|
this.stopTick();
|
||||||
|
this.intervalRef = window.setInterval(handler, Clock.TICK_INTERVAL);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a element which contains the DOM representation of the item.
|
||||||
|
* @return DOM Element.
|
||||||
|
* @override
|
||||||
|
*/
|
||||||
|
public createDomElement(): HTMLElement | never {
|
||||||
|
return this.createClock();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* To remove the event listeners and the elements from the DOM.
|
||||||
|
* @override
|
||||||
|
*/
|
||||||
|
public remove(): void {
|
||||||
|
// Clear the interval.
|
||||||
|
this.stopTick();
|
||||||
|
// Call to the parent clean function.
|
||||||
|
super.remove();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @override VisualConsoleItem.resize
|
||||||
|
* To resize the item.
|
||||||
|
* @param width Width.
|
||||||
|
* @param height Height.
|
||||||
|
*/
|
||||||
|
public resize(width: number, height: number): void {
|
||||||
|
super.resize(width, height);
|
||||||
|
// Re-render the item to force it calculate a new font size.
|
||||||
|
this.render();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a element which contains a representation of a clock.
|
||||||
|
* It choose between the clock types.
|
||||||
|
* @return DOM Element.
|
||||||
|
* @throws Error.
|
||||||
|
*/
|
||||||
|
private createClock(): HTMLElement | never {
|
||||||
switch (this.props.clockType) {
|
switch (this.props.clockType) {
|
||||||
case "analogic":
|
case "analogic":
|
||||||
throw new Error("not implemented.");
|
throw new Error("not implemented.");
|
||||||
case "digital":
|
case "digital":
|
||||||
return this.createDigitalClock();
|
return this.createDigitalClock();
|
||||||
|
default:
|
||||||
|
throw new Error("invalid clock type.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public createDigitalClock(): HTMLElement {
|
/**
|
||||||
|
* Create a element which contains a representation of a digital clock.
|
||||||
|
* @return DOM Element.
|
||||||
|
*/
|
||||||
|
private createDigitalClock(): HTMLElement {
|
||||||
const element: HTMLDivElement = document.createElement("div");
|
const element: HTMLDivElement = document.createElement("div");
|
||||||
element.className = "digital-clock";
|
element.className = "digital-clock";
|
||||||
|
|
||||||
|
@ -105,6 +191,7 @@ export default class Clock extends VisualConsoleItem<ClockProps> {
|
||||||
? this.props.height * 2
|
? this.props.height * 2
|
||||||
: this.props.width;
|
: this.props.width;
|
||||||
|
|
||||||
|
// Calculate font size to adapt the font to the item size.
|
||||||
const baseTimeFontSize = 20; // Per 100px of width.
|
const baseTimeFontSize = 20; // Per 100px of width.
|
||||||
const dateFontSizeMultiplier = 0.5;
|
const dateFontSizeMultiplier = 0.5;
|
||||||
const tzFontSizeMultiplier = 6 / this.props.clockTimezone.length;
|
const tzFontSizeMultiplier = 6 / this.props.clockTimezone.length;
|
||||||
|
@ -148,7 +235,7 @@ export default class Clock extends VisualConsoleItem<ClockProps> {
|
||||||
* Generate the current date using the timezone offset stored into the properties.
|
* Generate the current date using the timezone offset stored into the properties.
|
||||||
* @return The current date.
|
* @return The current date.
|
||||||
*/
|
*/
|
||||||
public getDate(): Date {
|
private getDate(): Date {
|
||||||
const d = new Date();
|
const d = new Date();
|
||||||
const targetTZOffset = this.props.clockTimezoneOffset * 60 * 1000; // In ms.
|
const targetTZOffset = this.props.clockTimezoneOffset * 60 * 1000; // In ms.
|
||||||
const localTZOffset = d.getTimezoneOffset() * 60 * 1000; // In ms.
|
const localTZOffset = d.getTimezoneOffset() * 60 * 1000; // In ms.
|
||||||
|
@ -157,6 +244,11 @@ export default class Clock extends VisualConsoleItem<ClockProps> {
|
||||||
return new Date(utimestamp);
|
return new Date(utimestamp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Generate a date representation with the format 'd/m/Y'.
|
||||||
|
* e.g.: 24/02/2020.
|
||||||
|
* @return Date representation.
|
||||||
|
*/
|
||||||
public getDigitalDate(initialDate: Date | null = null): string {
|
public getDigitalDate(initialDate: Date | null = null): string {
|
||||||
const date = initialDate || this.getDate();
|
const date = initialDate || this.getDate();
|
||||||
// Use getDate, getDay returns the week day.
|
// Use getDate, getDay returns the week day.
|
||||||
|
@ -169,6 +261,11 @@ export default class Clock extends VisualConsoleItem<ClockProps> {
|
||||||
return `${day}/${month}/${year}`;
|
return `${day}/${month}/${year}`;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Generate a time representation with the format 'hh:mm:ss'.
|
||||||
|
* e.g.: 01:34:09.
|
||||||
|
* @return Time representation.
|
||||||
|
*/
|
||||||
public getDigitalTime(initialDate: Date | null = null): string {
|
public getDigitalTime(initialDate: Date | null = null): string {
|
||||||
const date = initialDate || this.getDate();
|
const date = initialDate || this.getDate();
|
||||||
const hours = padLeft(date.getHours(), 2, 0);
|
const hours = padLeft(date.getHours(), 2, 0);
|
||||||
|
|
Loading…
Reference in New Issue