| 
									
										
										
										
											2023-01-03 11:55:46 -08:00
										 |  |  | // Copyright 2020 Signal Messenger, LLC
 | 
					
						
							| 
									
										
										
										
											2020-10-30 15:34:04 -05:00
										 |  |  | // SPDX-License-Identifier: AGPL-3.0-only
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-17 15:20:49 -07:00
										 |  |  | import React, { useEffect } from 'react'; | 
					
						
							| 
									
										
										
										
											2020-02-12 13:30:58 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-17 15:20:49 -07:00
										 |  |  | import { LeftPaneDialog } from './LeftPaneDialog'; | 
					
						
							| 
									
										
										
										
											2021-08-19 18:56:29 -04:00
										 |  |  | import { Spinner } from './Spinner'; | 
					
						
							| 
									
										
										
										
											2021-10-26 14:15:33 -05:00
										 |  |  | import type { LocalizerType } from '../types/Util'; | 
					
						
							| 
									
										
										
										
											2021-06-09 15:28:54 -07:00
										 |  |  | import { SocketStatus } from '../types/SocketStatus'; | 
					
						
							| 
									
										
										
										
											2021-10-26 14:15:33 -05:00
										 |  |  | import type { NetworkStateType } from '../state/ducks/network'; | 
					
						
							| 
									
										
										
										
											2021-10-12 18:59:08 -05:00
										 |  |  | import type { WidthBreakpoint } from './_util'; | 
					
						
							| 
									
										
										
										
											2022-02-25 12:37:15 -06:00
										 |  |  | import { clearTimeoutIfNecessary } from '../util/clearTimeoutIfNecessary'; | 
					
						
							| 
									
										
										
										
											2020-02-12 13:30:58 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-20 11:01:55 -07:00
										 |  |  | const FIVE_SECONDS = 5 * 1000; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-12 12:52:02 -07:00
										 |  |  | export type PropsType = Pick< | 
					
						
							|  |  |  |   NetworkStateType, | 
					
						
							|  |  |  |   'isOnline' | 'isOutage' | 'socketStatus' | 
					
						
							|  |  |  | > & { | 
					
						
							| 
									
										
										
										
											2021-10-12 18:59:08 -05:00
										 |  |  |   containerWidthBreakpoint: WidthBreakpoint; | 
					
						
							| 
									
										
										
										
											2020-02-12 13:30:58 -08:00
										 |  |  |   i18n: LocalizerType; | 
					
						
							| 
									
										
										
										
											2020-03-20 11:01:55 -07:00
										 |  |  |   manualReconnect: () => void; | 
					
						
							| 
									
										
										
										
											2021-01-14 12:07:05 -06:00
										 |  |  | }; | 
					
						
							| 
									
										
										
										
											2020-02-12 13:30:58 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-11-17 16:45:19 -08:00
										 |  |  | export function DialogNetworkStatus({ | 
					
						
							| 
									
										
										
										
											2021-10-12 18:59:08 -05:00
										 |  |  |   containerWidthBreakpoint, | 
					
						
							| 
									
										
										
										
											2020-02-12 13:30:58 -08:00
										 |  |  |   i18n, | 
					
						
							|  |  |  |   isOnline, | 
					
						
							| 
									
										
										
										
											2024-03-12 12:52:02 -07:00
										 |  |  |   isOutage, | 
					
						
							| 
									
										
										
										
											2020-02-12 13:30:58 -08:00
										 |  |  |   socketStatus, | 
					
						
							| 
									
										
										
										
											2020-03-20 11:01:55 -07:00
										 |  |  |   manualReconnect, | 
					
						
							| 
									
										
										
										
											2022-11-17 16:45:19 -08:00
										 |  |  | }: PropsType): JSX.Element | null { | 
					
						
							| 
									
										
										
										
											2021-09-17 15:20:49 -07:00
										 |  |  |   const [isConnecting, setIsConnecting] = React.useState<boolean>( | 
					
						
							|  |  |  |     socketStatus === SocketStatus.CONNECTING | 
					
						
							|  |  |  |   ); | 
					
						
							|  |  |  |   useEffect(() => { | 
					
						
							| 
									
										
										
										
											2020-09-11 17:46:52 -07:00
										 |  |  |     let timeout: NodeJS.Timeout; | 
					
						
							| 
									
										
										
										
											2020-03-20 11:01:55 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     if (isConnecting) { | 
					
						
							|  |  |  |       timeout = setTimeout(() => { | 
					
						
							|  |  |  |         setIsConnecting(false); | 
					
						
							|  |  |  |       }, FIVE_SECONDS); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return () => { | 
					
						
							| 
									
										
										
										
											2022-02-25 12:37:15 -06:00
										 |  |  |       clearTimeoutIfNecessary(timeout); | 
					
						
							| 
									
										
										
										
											2020-03-20 11:01:55 -07:00
										 |  |  |     }; | 
					
						
							| 
									
										
										
										
											2023-01-18 15:31:10 -08:00
										 |  |  |   }, [isConnecting, setIsConnecting]); | 
					
						
							| 
									
										
										
										
											2020-09-11 17:46:52 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-20 11:01:55 -07:00
										 |  |  |   const reconnect = () => { | 
					
						
							|  |  |  |     setIsConnecting(true); | 
					
						
							|  |  |  |     manualReconnect(); | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-12 12:52:02 -07:00
										 |  |  |   if (isOutage) { | 
					
						
							|  |  |  |     return ( | 
					
						
							|  |  |  |       <LeftPaneDialog | 
					
						
							|  |  |  |         containerWidthBreakpoint={containerWidthBreakpoint} | 
					
						
							|  |  |  |         type="warning" | 
					
						
							|  |  |  |         icon="error" | 
					
						
							|  |  |  |         subtitle={i18n('icu:DialogNetworkStatus__outage')} | 
					
						
							|  |  |  |       /> | 
					
						
							|  |  |  |     ); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-17 15:20:49 -07:00
										 |  |  |   if (isConnecting) { | 
					
						
							|  |  |  |     const spinner = ( | 
					
						
							|  |  |  |       <div className="LeftPaneDialog__spinner-container"> | 
					
						
							|  |  |  |         <Spinner | 
					
						
							|  |  |  |           direction="on-avatar" | 
					
						
							|  |  |  |           moduleClassName="LeftPaneDialog__spinner" | 
					
						
							|  |  |  |           size="22px" | 
					
						
							|  |  |  |           svgSize="small" | 
					
						
							|  |  |  |         /> | 
					
						
							|  |  |  |       </div> | 
					
						
							|  |  |  |     ); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return ( | 
					
						
							|  |  |  |       <LeftPaneDialog | 
					
						
							| 
									
										
										
										
											2021-10-12 18:59:08 -05:00
										 |  |  |         containerWidthBreakpoint={containerWidthBreakpoint} | 
					
						
							| 
									
										
										
										
											2021-09-17 15:20:49 -07:00
										 |  |  |         type="warning" | 
					
						
							|  |  |  |         icon={spinner} | 
					
						
							| 
									
										
										
										
											2023-03-29 17:03:25 -07:00
										 |  |  |         title={i18n('icu:connecting')} | 
					
						
							|  |  |  |         subtitle={i18n('icu:connectingHangOn')} | 
					
						
							| 
									
										
										
										
											2021-09-17 15:20:49 -07:00
										 |  |  |       /> | 
					
						
							|  |  |  |     ); | 
					
						
							| 
									
										
										
										
											2020-02-12 13:30:58 -08:00
										 |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-17 15:20:49 -07:00
										 |  |  |   return ( | 
					
						
							|  |  |  |     <LeftPaneDialog | 
					
						
							| 
									
										
										
										
											2021-10-12 18:59:08 -05:00
										 |  |  |       containerWidthBreakpoint={containerWidthBreakpoint} | 
					
						
							| 
									
										
										
										
											2021-09-17 15:20:49 -07:00
										 |  |  |       type="warning" | 
					
						
							|  |  |  |       icon="network" | 
					
						
							| 
									
										
										
										
											2023-03-29 17:03:25 -07:00
										 |  |  |       title={isOnline ? i18n('icu:disconnected') : i18n('icu:offline')} | 
					
						
							|  |  |  |       subtitle={i18n('icu:checkNetworkConnection')} | 
					
						
							| 
									
										
										
										
											2021-09-17 15:20:49 -07:00
										 |  |  |       hasAction | 
					
						
							| 
									
										
										
										
											2023-03-29 17:03:25 -07:00
										 |  |  |       clickLabel={i18n('icu:connect')} | 
					
						
							| 
									
										
										
										
											2021-09-17 15:20:49 -07:00
										 |  |  |       onClick={reconnect} | 
					
						
							|  |  |  |     /> | 
					
						
							|  |  |  |   ); | 
					
						
							| 
									
										
										
										
											2022-11-17 16:45:19 -08:00
										 |  |  | } |