mue/src/components/widgets/time/Clock.jsx

170 lines
4.4 KiB
React
Raw Normal View History

import { PureComponent, Suspense, lazy } from "react";
2021-08-15 21:28:37 +00:00
import { convertTimezone } from "modules/helpers/date";
import EventBus from "modules/helpers/eventbus";
import "./clock.scss";
2020-11-29 14:32:08 +00:00
const Analog = lazy(() => import("react-clock"));
const renderLoader = () => <></>;
2021-08-14 19:10:48 +00:00
export default class Clock extends PureComponent {
2021-03-23 13:10:34 +00:00
constructor() {
super();
this.timer = undefined;
2019-10-20 12:39:01 +00:00
this.state = {
time: "",
ampm: "",
2019-10-20 12:39:01 +00:00
};
}
2020-07-20 21:39:31 +00:00
startTime(
time = localStorage.getItem("seconds") === "true" ||
localStorage.getItem("timeType") === "analogue"
? 1000 - (Date.now() % 1000)
: 60000 - (Date.now() % 60000)
) {
this.timer = setTimeout(() => {
let now = new Date();
const timezone = localStorage.getItem("timezone");
if (timezone && timezone !== "auto") {
now = convertTimezone(now, timezone);
}
2020-07-20 21:39:31 +00:00
switch (localStorage.getItem("timeType")) {
case "percentageComplete":
this.setState({
time: (now.getHours() / 24).toFixed(2).replace("0.", "") + "%",
ampm: "",
2021-01-17 16:25:21 +00:00
});
break;
case "analogue":
// load analog clock css
require("react-clock/dist/Clock.css");
this.setState({
time: now,
});
break;
default:
// Default clock
let time,
sec = "";
const zero = localStorage.getItem("zero");
if (localStorage.getItem("seconds") === "true") {
sec = `:${("00" + now.getSeconds()).slice(-2)}`;
2021-01-16 22:43:46 +00:00
}
if (localStorage.getItem("timeformat") === "twentyfourhour") {
if (zero === "false") {
time = `${now.getHours()}:${("00" + now.getMinutes()).slice(
-2
)}${sec}`;
} else {
time = `${("00" + now.getHours()).slice(-2)}:${(
"00" + now.getMinutes()
).slice(-2)}${sec}`;
}
this.setState({
time,
ampm: "",
});
2021-01-16 22:43:46 +00:00
} else {
// 12 hour
let hours = now.getHours();
if (hours > 12) {
hours -= 12;
2021-08-18 10:28:01 +00:00
} else if (hours === 0) {
hours = 12;
}
if (zero === "false") {
time = `${hours}:${("00" + now.getMinutes()).slice(-2)}${sec}`;
} else {
time = `${("00" + hours).slice(-2)}:${(
"00" + now.getMinutes()
).slice(-2)}${sec}`;
}
this.setState({
time,
ampm: now.getHours() > 11 ? "PM" : "AM",
});
}
break;
}
this.startTime();
}, time);
2019-10-20 12:39:01 +00:00
}
componentDidMount() {
EventBus.on("refresh", (data) => {
if (data === "clock" || data === "timezone") {
const element = document.querySelector(".clock-container");
if (localStorage.getItem("time") === "false") {
return (element.style.display = "none");
}
this.timer = null;
this.startTime(0);
element.style.display = "block";
element.style.fontSize = `${
4 * Number((localStorage.getItem("zoomClock") || 100) / 100)
}em`;
}
});
if (localStorage.getItem("timeType") !== "analogue") {
document.querySelector(".clock-container").style.fontSize = `${
4 * Number((localStorage.getItem("zoomClock") || 100) / 100)
}em`;
}
this.startTime(0);
2019-10-20 12:39:01 +00:00
}
componentWillUnmount() {
EventBus.off("refresh");
}
2019-10-20 12:39:01 +00:00
render() {
let clockHTML = (
<span className="clock clock-container">
{this.state.time}
<span className="ampm">{this.state.ampm}</span>
</span>
);
const enabled = (setting) => {
return localStorage.getItem(setting) === "true";
2021-04-08 18:52:17 +00:00
};
2021-03-17 18:26:09 +00:00
if (localStorage.getItem("timeType") === "analogue") {
2021-03-17 18:26:09 +00:00
clockHTML = (
2021-08-14 19:10:48 +00:00
<Suspense fallback={renderLoader()}>
<div className="clockBackground">
<Analog
className="analogclock clock-container"
value={this.state.time}
renderMinuteMarks={enabled("minuteMarks")}
renderHourMarks={enabled("hourMarks")}
renderSecondHand={enabled("secondHand")}
renderMinuteHand={enabled("minuteHand")}
renderHourHand={enabled("hourHand")}
/>
</div>
2021-08-14 19:10:48 +00:00
</Suspense>
2021-03-17 18:26:09 +00:00
);
2021-01-16 22:43:46 +00:00
}
2020-10-16 12:15:10 +00:00
return clockHTML;
2019-10-20 12:39:01 +00:00
}
}