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' ;
4
4
5
5
const msAmountIn : Record < string , number > = {
6
6
second : 1000 ,
@@ -14,30 +14,24 @@ const getRelativeTimeString = (
14
14
time : number ,
15
15
absTime : number ,
16
16
unit : string ,
17
- isFuture : boolean
17
+ isFuture : boolean ,
18
18
) : 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` ;
21
20
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' ;
25
24
26
- return `${ isFuture ? "will come in" : "" } ${ absTime } ${ unitDecl } ${
27
- isFuture ? "" : "ago"
28
- } `;
25
+ return `${ isFuture ? 'will come in' : '' } ${ absTime } ${ unitDecl } ${ isFuture ? '' : 'ago' } ` ;
29
26
} ;
30
27
31
28
const isDate = ( value : string | number | Date ) : boolean => {
32
29
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 ;
35
31
return ! isNaN ( testDate . getTime ( ) ) ;
36
32
} ;
37
33
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' => {
41
35
const seconds = Math . abs ( diff . seconds ) ;
42
36
const minutes = Math . abs ( diff . minutes ) ;
43
37
const hours = Math . abs ( diff . hours ) ;
@@ -48,19 +42,19 @@ const bestFit = (
48
42
49
43
switch ( true ) {
50
44
case years > 0 && months > 11 :
51
- return " year" ;
45
+ return ' year' ;
52
46
case months > 0 && days > 27 :
53
- return " month" ;
47
+ return ' month' ;
54
48
case weeks > 0 && days > 6 :
55
- return " week" ;
49
+ return ' week' ;
56
50
case days > 0 && hours > 23 :
57
- return " day" ;
51
+ return ' day' ;
58
52
case hours > 0 && minutes > 59 :
59
- return " hour" ;
53
+ return ' hour' ;
60
54
case minutes > 0 && seconds > 59 :
61
- return " minute" ;
55
+ return ' minute' ;
62
56
default :
63
- return " second" ;
57
+ return ' second' ;
64
58
}
65
59
} ;
66
60
@@ -80,7 +74,7 @@ const getRelativeTimeDiff = (value: Date): Diff => {
80
74
const ms = nowMs - dateMs ;
81
75
82
76
const years = now . getFullYear ( ) - date . getFullYear ( ) ;
83
- const round = Math [ ms > 0 ? " floor" : " ceil" ] ;
77
+ const round = Math [ ms > 0 ? ' floor' : ' ceil' ] ;
84
78
85
79
return {
86
80
ms,
@@ -97,19 +91,19 @@ const getRelativeTimeDiff = (value: Date): Diff => {
97
91
const calculateRelativeTime = ( date : Date , currentUnit : string ) : string => {
98
92
const diff = getRelativeTimeDiff ( date ) ;
99
93
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' ;
108
102
let time = diff [ diffkey ] ;
109
103
let absTime = Math . abs ( time ) ;
110
104
const isFuture = time < 0 ;
111
105
112
- if ( currentUnit === " second" ) {
106
+ if ( currentUnit === ' second' ) {
113
107
let normTime = 45 ;
114
108
if ( absTime < 45 ) normTime = 20 ;
115
109
if ( absTime < 20 ) normTime = 5 ;
@@ -124,42 +118,38 @@ const calculateRelativeTime = (date: Date, currentUnit: string): string => {
124
118
125
119
const Time = ( props : Props ) => {
126
120
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 = '' ,
131
125
utc = false ,
132
126
relativeTime,
133
127
} = props ;
134
128
135
129
const [ state , setState ] = React . useState < State > ( {
136
- relativeTime : "" ,
137
- currentUnit : "" ,
130
+ relativeTime : '' ,
131
+ currentUnit : '' ,
138
132
} ) ;
139
133
140
134
React . useEffect ( ( ) => {
141
135
let interval : null | number = null ;
142
136
if ( props . relativeTime && isDate ( props . value ) ) {
143
137
const date = new Date ( props . value ) ;
144
138
const diff = getRelativeTimeDiff ( date ) ;
145
- setState ( {
146
- ...state ,
147
- currentUnit : props . unit || bestFit ( diff ) ,
148
- } ) ;
139
+ const newCurrentUnit = props . unit || bestFit ( diff ) ;
149
140
150
141
setState ( {
151
- ... state ,
152
- relativeTime : calculateRelativeTime ( date , state . currentUnit ) ,
142
+ currentUnit : newCurrentUnit ,
143
+ relativeTime : calculateRelativeTime ( date , newCurrentUnit ) ,
153
144
} ) ;
145
+
154
146
interval = window . setInterval ( ( ) => {
155
147
const date = new Date ( props . value ) ;
156
148
const diff = getRelativeTimeDiff ( date ) ;
149
+ const newCurrentUnit = props . unit || bestFit ( diff ) ;
157
150
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 ) ,
163
153
} ) ;
164
154
} , getInterval ( state . currentUnit ) ) ;
165
155
}
0 commit comments