Skip to content

Commit 71bc9b6

Browse files
committed
Add support for string value
1 parent e68d5c0 commit 71bc9b6

File tree

3 files changed

+71
-16
lines changed

3 files changed

+71
-16
lines changed

src/Clock.jsx

Lines changed: 25 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,12 @@ import mergeClassNames from 'merge-class-names';
55
import Hand from './Hand';
66
import Mark from './Mark';
77

8+
import {
9+
getHours,
10+
getMinutes,
11+
getSeconds,
12+
} from './shared/dates';
13+
814
export default class Clock extends Component {
915
renderFace() {
1016
const {
@@ -63,11 +69,11 @@ export default class Clock extends Component {
6369
value,
6470
} = this.props;
6571

66-
const angle = (
67-
(value.getHours() * 30) +
68-
(value.getMinutes() / 2) +
69-
(value.getSeconds() / 600)
70-
);
72+
const angle = value ? (
73+
(getHours(value) * 30) +
74+
(getMinutes(value) / 2) +
75+
(getSeconds(value) / 600)
76+
) : 0;
7177

7278
return (
7379
<Hand
@@ -92,11 +98,11 @@ export default class Clock extends Component {
9298
value,
9399
} = this.props;
94100

95-
const angle = (
96-
(value.getHours() * 360) +
97-
(value.getMinutes() * 6) +
98-
(value.getSeconds() / 10)
99-
);
101+
const angle = value ? (
102+
(getHours(value) * 360) +
103+
(getMinutes(value) * 6) +
104+
(getSeconds(value) / 10)
105+
) : 0;
100106

101107
return (
102108
<Hand
@@ -121,10 +127,10 @@ export default class Clock extends Component {
121127
value,
122128
} = this.props;
123129

124-
const angle = (
125-
(value.getMinutes() * 360) +
126-
(value.getSeconds() * 6)
127-
);
130+
const angle = value ? (
131+
(getMinutes(value) * 360) +
132+
(getSeconds(value) * 6)
133+
) : 0;
128134

129135
return (
130136
<Hand
@@ -143,7 +149,7 @@ export default class Clock extends Component {
143149
return (
144150
<time
145151
className={mergeClassNames('react-clock', this.props.className)}
146-
dateTime={value.toISOString()}
152+
dateTime={value instanceof Date ? value.toISOString() : value}
147153
style={{
148154
width: `${size}px`,
149155
height: `${size}px`,
@@ -199,5 +205,8 @@ Clock.propTypes = {
199205
secondHandOppositeLength: PropTypes.number,
200206
secondHandWidth: PropTypes.number,
201207
size: PropTypes.number,
202-
value: PropTypes.instanceOf(Date),
208+
value: PropTypes.oneOfType([
209+
PropTypes.string,
210+
PropTypes.instanceOf(Date),
211+
]),
203212
};

src/Clock.less

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
.react-clock {
2+
display: block;
23
position: relative;
34

45
&, & *, & *:before, & *:after {

src/shared/dates.js

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
const hourOptionalSecondsRegExp = /^(([0-1])?[0-9]|2[0-3]):[0-5][0-9](:([0-5][0-9]))?$/;
2+
const hourRegExp = /^(([0-1])?[0-9]|2[0-3]):[0-5][0-9]:([0-5][0-9])$/;
3+
4+
export const getHours = (date) => {
5+
if (date instanceof Date) {
6+
return date.getHours();
7+
}
8+
9+
if (typeof date === 'string' && hourOptionalSecondsRegExp.test(date)) {
10+
const minuteString = date.split(':')[0];
11+
return parseInt(minuteString, 10);
12+
}
13+
14+
throw new Error(`Failed to get hours from date: ${date}.`);
15+
};
16+
17+
export const getMinutes = (date) => {
18+
if (date instanceof Date) {
19+
return date.getMinutes();
20+
}
21+
22+
if (typeof date === 'string' && hourOptionalSecondsRegExp.test(date)) {
23+
const minuteString = date.split(':')[1];
24+
return parseInt(minuteString, 10);
25+
}
26+
27+
throw new Error(`Failed to get minutes from date: ${date}.`);
28+
};
29+
30+
export const getSeconds = (date) => {
31+
if (date instanceof Date) {
32+
return date.getSeconds();
33+
}
34+
35+
if (typeof date === 'string') {
36+
if (hourRegExp.test(date)) {
37+
const minuteString = date.split(':')[2];
38+
return parseInt(minuteString, 10);
39+
} else if (hourOptionalSecondsRegExp.test(date)) {
40+
return 0;
41+
}
42+
}
43+
44+
throw new Error(`Failed to get seconds from date: ${date}.`);
45+
};

0 commit comments

Comments
 (0)