Skip to content

Commit 257f7b0

Browse files
committed
fixed bugs discussed on meetup
1 parent 3463a3c commit 257f7b0

File tree

4 files changed

+50
-64
lines changed

4 files changed

+50
-64
lines changed

dist/react-pure-time.min.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

example/example.min.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

example/example.tsx

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
import * as React from "react";
2-
import { render } from "react-dom";
3-
import Time from "../src/react-pure-time";
1+
import * as React from 'react';
2+
import { render } from 'react-dom';
3+
import Time from '../src/react-pure-time';
44

55
const ModalContainer = () => (
66
<div>
@@ -97,22 +97,18 @@ const ModalContainer = () => (
9797
</td>
9898
</tr>
9999
<tr>
100-
<td>September 2, 2003, 2:26 am</td>
100+
<td>November 11, 2021, 13:00</td>
101101
<td>relativeTime</td>
102102
<td>
103-
<Time value="September 2, 2003, 2:26 am" relativeTime />
103+
<Time value="November 11, 2021, 12:02" relativeTime />
104104
</td>
105105
<td>
106-
<Time
107-
value="Wed Nov 01 2017 17:29:03 GMT+0200 (EET)"
108-
relativeTime
109-
utc
110-
/>
106+
<Time value="Wed Nov 01 2017 17:29:03 GMT+0200 (EET)" relativeTime utc />
111107
</td>
112108
</tr>
113109
</tbody>
114110
</table>
115111
</div>
116112
);
117113

118-
render(<ModalContainer />, document.getElementById("js--time"));
114+
render(<ModalContainer />, document.getElementById('js--time'));

src/react-pure-time.tsx

Lines changed: 41 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
import * as React from "react";
2-
import dateformat from "./format";
3-
import type { Props, State, Diff } from "./types";
1+
import * as React from 'react';
2+
import dateformat from './format';
3+
import type { Props, State, Diff } from './types';
44

55
const msAmountIn: Record<string, number> = {
66
second: 1000,
@@ -14,30 +14,24 @@ const getRelativeTimeString = (
1414
time: number,
1515
absTime: number,
1616
unit: string,
17-
isFuture: boolean
17+
isFuture: boolean,
1818
): string => {
19-
const unitDecl =
20-
absTime % 100 === 1 || absTime % 10 === 1 ? unit : `${unit}s`;
19+
const unitDecl = absTime % 100 === 1 || absTime % 10 === 1 ? unit : `${unit}s`;
2120

22-
if (unit === "second" && time === 0) return "just now";
23-
if (unit === "year" && time === 0) return "this year";
24-
if (unit === "year" && time === 1) return "last year";
21+
if (unit === 'second' && time === 0) return 'just now';
22+
if (unit === 'year' && time === 0) return 'this year';
23+
if (unit === 'year' && time === 1) return 'last year';
2524

26-
return `${isFuture ? "will come in" : ""} ${absTime} ${unitDecl} ${
27-
isFuture ? "" : "ago"
28-
}`;
25+
return `${isFuture ? 'will come in' : ''} ${absTime} ${unitDecl} ${isFuture ? '' : 'ago'}`;
2926
};
3027

3128
const isDate = (value: string | number | Date): boolean => {
3229
const testDate = new Date(value);
33-
if (Object.prototype.toString.call(testDate) !== "[object Date]")
34-
return false;
30+
if (Object.prototype.toString.call(testDate) !== '[object Date]') return false;
3531
return !isNaN(testDate.getTime());
3632
};
3733

38-
const bestFit = (
39-
diff: Diff
40-
): "year" | "month" | "week" | "day" | "hour" | "minute" | "second" => {
34+
const bestFit = (diff: Diff): 'year' | 'month' | 'week' | 'day' | 'hour' | 'minute' | 'second' => {
4135
const seconds = Math.abs(diff.seconds);
4236
const minutes = Math.abs(diff.minutes);
4337
const hours = Math.abs(diff.hours);
@@ -48,19 +42,19 @@ const bestFit = (
4842

4943
switch (true) {
5044
case years > 0 && months > 11:
51-
return "year";
45+
return 'year';
5246
case months > 0 && days > 27:
53-
return "month";
47+
return 'month';
5448
case weeks > 0 && days > 6:
55-
return "week";
49+
return 'week';
5650
case days > 0 && hours > 23:
57-
return "day";
51+
return 'day';
5852
case hours > 0 && minutes > 59:
59-
return "hour";
53+
return 'hour';
6054
case minutes > 0 && seconds > 59:
61-
return "minute";
55+
return 'minute';
6256
default:
63-
return "second";
57+
return 'second';
6458
}
6559
};
6660

@@ -80,7 +74,7 @@ const getRelativeTimeDiff = (value: Date): Diff => {
8074
const ms = nowMs - dateMs;
8175

8276
const years = now.getFullYear() - date.getFullYear();
83-
const round = Math[ms > 0 ? "floor" : "ceil"];
77+
const round = Math[ms > 0 ? 'floor' : 'ceil'];
8478

8579
return {
8680
ms,
@@ -97,19 +91,19 @@ const getRelativeTimeDiff = (value: Date): Diff => {
9791
const calculateRelativeTime = (date: Date, currentUnit: string): string => {
9892
const diff = getRelativeTimeDiff(date);
9993
const diffkey = `${currentUnit}s` as
100-
| "ms"
101-
| "seconds"
102-
| "minutes"
103-
| "hours"
104-
| "days"
105-
| "weeks"
106-
| "months"
107-
| "years";
94+
| 'ms'
95+
| 'seconds'
96+
| 'minutes'
97+
| 'hours'
98+
| 'days'
99+
| 'weeks'
100+
| 'months'
101+
| 'years';
108102
let time = diff[diffkey];
109103
let absTime = Math.abs(time);
110104
const isFuture = time < 0;
111105

112-
if (currentUnit === "second") {
106+
if (currentUnit === 'second') {
113107
let normTime = 45;
114108
if (absTime < 45) normTime = 20;
115109
if (absTime < 20) normTime = 5;
@@ -124,42 +118,38 @@ const calculateRelativeTime = (date: Date, currentUnit: string): string => {
124118

125119
const Time = (props: Props) => {
126120
const {
127-
value = "",
128-
format = "d.m.Y H:i",
129-
placeholder = "—",
130-
className = "",
121+
value = '',
122+
format = 'd.m.Y H:i',
123+
placeholder = '—',
124+
className = '',
131125
utc = false,
132126
relativeTime,
133127
} = props;
134128

135129
const [state, setState] = React.useState<State>({
136-
relativeTime: "",
137-
currentUnit: "",
130+
relativeTime: '',
131+
currentUnit: '',
138132
});
139133

140134
React.useEffect(() => {
141135
let interval: null | number = null;
142136
if (props.relativeTime && isDate(props.value)) {
143137
const date = new Date(props.value);
144138
const diff = getRelativeTimeDiff(date);
145-
setState({
146-
...state,
147-
currentUnit: props.unit || bestFit(diff),
148-
});
139+
const newCurrentUnit = props.unit || bestFit(diff);
149140

150141
setState({
151-
...state,
152-
relativeTime: calculateRelativeTime(date, state.currentUnit),
142+
currentUnit: newCurrentUnit,
143+
relativeTime: calculateRelativeTime(date, newCurrentUnit),
153144
});
145+
154146
interval = window.setInterval(() => {
155147
const date = new Date(props.value);
156148
const diff = getRelativeTimeDiff(date);
149+
const newCurrentUnit = props.unit || bestFit(diff);
157150
setState({
158-
currentUnit: props.unit || bestFit(diff),
159-
relativeTime: calculateRelativeTime(
160-
date,
161-
props.unit || bestFit(diff)
162-
),
151+
currentUnit: newCurrentUnit,
152+
relativeTime: calculateRelativeTime(date, newCurrentUnit),
163153
});
164154
}, getInterval(state.currentUnit));
165155
}

0 commit comments

Comments
 (0)