1+ import { useState , useEffect } from 'react' ;
2+
3+ function TimeDifference ( props ) {
4+ const { isUserSelf, userProfile } = props ;
5+ const [ signedOffset , setSignedOffset ] = useState ( 'N/A' ) ;
6+ const [ hoverText , setHoverText ] = useState ( '' ) ;
7+
8+ const viewingTimeZone = props . userProfile . timeZone ;
9+ const yourLocalTimeZone = Intl . DateTimeFormat ( ) . resolvedOptions ( ) . timeZone ;
10+
11+ useEffect ( ( ) => {
12+ if ( isUserSelf ) {
13+ setSignedOffset ( 'N/A' ) ;
14+ setHoverText ( '' ) ;
15+ return ;
16+ }
17+
18+ const convertDateToAnotherTimeZone = ( date , timezone ) => {
19+ try {
20+ const dateString = date . toLocaleString ( 'en-US' , { timeZone : timezone } ) ;
21+ return new Date ( dateString ) ;
22+ } catch ( err ) {
23+ return NaN ;
24+ }
25+ } ;
26+
27+ const getOffsetBetweenTimezones = ( date , tz1 , tz2 ) => {
28+ const tz1Date = convertDateToAnotherTimeZone ( date , tz1 ) ;
29+ const tz2Date = convertDateToAnotherTimeZone ( date , tz2 ) ;
30+
31+ if ( ! isNaN ( tz1Date ) && ! isNaN ( tz2Date ) ) {
32+ const offset = ( tz1Date . getTime ( ) - tz2Date . getTime ( ) ) / 3600000 ;
33+ return offset ;
34+ }
35+ return null ;
36+ } ;
37+
38+ const offset = getOffsetBetweenTimezones ( new Date ( ) , viewingTimeZone , yourLocalTimeZone ) ;
39+ if ( offset !== null ) {
40+ const formattedOffset = offset > 0 ? `+${ offset } ` : `${ offset } ` ;
41+ setSignedOffset ( formattedOffset ) ;
42+ let message = '' ;
43+ if ( offset === 0 ) {
44+ message = 'This person is in the same time zone as you' ;
45+ } else {
46+ const direction = offset > 0 ? 'ahead of' : 'behind' ;
47+ message = `This person is ${ Math . abs ( offset ) } hours ${ direction } your time zone` ;
48+ }
49+ setHoverText ( message ) ;
50+ }
51+ } , [ isUserSelf , viewingTimeZone , yourLocalTimeZone ] ) ;
52+
53+ return < span className = "time_difference" title = { hoverText } > { signedOffset } </ span > ;
54+ }
55+
56+ export default TimeDifference ;
0 commit comments