@@ -14,8 +14,13 @@ const getClosestTimeZone = () => {
14
14
// get the time in each timezone
15
15
const aryIannaTimeZones = Intl . supportedValuesOf ( 'timeZone' ) ;
16
16
17
- let smallestDifference = 24 * 60 ;
18
- let matchingTimeZones : string [ ] = [ ] ;
17
+ let closestBefore6am = 0 ;
18
+ let closestAfter6am = 24 * 60 ;
19
+
20
+ const times : {
21
+ timeZone : string ;
22
+ time : number ;
23
+ } [ ] = [ ] ;
19
24
20
25
aryIannaTimeZones . forEach ( ( timeZone ) => {
21
26
// get current hour and minute in this timezone
@@ -31,28 +36,49 @@ const getClosestTimeZone = () => {
31
36
. split ( ':' )
32
37
. map ( ( x ) => parseInt ( x ) )
33
38
. reduce ( ( acc , cur ) => acc * 60 + cur ) ;
34
- if ( time < 360 ) {
35
- if ( 360 - time < smallestDifference ) {
36
- smallestDifference = 360 - time ;
37
- matchingTimeZones = [ timeZone ] ;
38
- } else if ( 360 - time === smallestDifference ) {
39
- matchingTimeZones . push ( timeZone ) ;
40
- }
39
+ if ( time < 360 && time > closestBefore6am ) {
40
+ closestBefore6am = time ;
41
+ }
42
+ if ( time > 360 && time < closestAfter6am ) {
43
+ closestAfter6am = time ;
41
44
}
45
+ times . push ( {
46
+ timeZone,
47
+ time,
48
+ } ) ;
42
49
} ) ;
43
50
44
- return [ matchingTimeZones , smallestDifference ] as const ;
51
+ return [ times , closestBefore6am , closestAfter6am ] as const ;
45
52
} ;
46
53
47
54
const StandUp = ( ) => {
48
- const [ matchingTimeZones , setMatchingTimeZones ] = useState < string [ ] > ( [ ] ) ;
49
- const [ smallestDifference , setSmallestDifference ] = useState < number > ( 0 ) ;
55
+ const [ times , setTimes ] = useState < {
56
+ allBefore6am : string [ ] ;
57
+ allAfter6am : string [ ] ;
58
+ timeTo6am : number ;
59
+ timeFrom6am : number ;
60
+ } > ( {
61
+ allBefore6am : [ ] ,
62
+ allAfter6am : [ ] ,
63
+ timeTo6am : 0 ,
64
+ timeFrom6am : 0 ,
65
+ } ) ;
50
66
51
67
useEffect ( ( ) => {
52
68
const updateClosestTimeZone = ( ) => {
53
- const [ matchingTimeZones , smallestDifference ] = getClosestTimeZone ( ) ;
54
- setMatchingTimeZones ( matchingTimeZones ) ;
55
- setSmallestDifference ( smallestDifference ) ;
69
+ const [ times , closestBefore6am , closestAfter6am ] = getClosestTimeZone ( ) ;
70
+ const allBefore6am = times
71
+ . filter ( ( time ) => time . time === closestBefore6am )
72
+ . map ( ( time ) => time . timeZone ) ;
73
+ const allAfter6am = times
74
+ . filter ( ( time ) => time . time === closestAfter6am )
75
+ . map ( ( time ) => time . timeZone ) ;
76
+ setTimes ( {
77
+ allBefore6am,
78
+ allAfter6am,
79
+ timeTo6am : 360 - closestBefore6am ,
80
+ timeFrom6am : closestAfter6am - 360 ,
81
+ } ) ;
56
82
} ;
57
83
updateClosestTimeZone ( ) ;
58
84
const interval = setInterval ( updateClosestTimeZone , 300 ) ;
@@ -65,11 +91,17 @@ const StandUp = () => {
65
91
return (
66
92
< div className = "mx-auto max-w-xl" >
67
93
< h1 className = "text-4xl" > Stand Up</ h1 >
94
+ < p > Our current stand up started { times . timeFrom6am } minutes ago in:</ p >
95
+ < ul className = "list-disc" >
96
+ { times . allAfter6am . map ( ( timeZone ) => (
97
+ < li key = { timeZone } > { timeZone } </ li >
98
+ ) ) }
99
+ </ ul >
68
100
< p >
69
- It is currently { smallestDifference } minutes until our 6am stand up in:
101
+ It is currently { times . timeTo6am } minutes until our 6am stand up in:
70
102
</ p >
71
103
< ul className = "list-disc" >
72
- { matchingTimeZones . map ( ( timeZone ) => (
104
+ { times . allBefore6am . map ( ( timeZone ) => (
73
105
< li key = { timeZone } > { timeZone } </ li >
74
106
) ) }
75
107
</ ul >
0 commit comments