| 
									
										
										
										
											2021-01-14 12:07:05 -06:00
										 |  |  | // Copyright 2019-2021 Signal Messenger, LLC
 | 
					
						
							| 
									
										
										
										
											2020-10-30 15:34:04 -05:00
										 |  |  | // SPDX-License-Identifier: AGPL-3.0-only
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-01-30 12:15:07 -08:00
										 |  |  | import React from 'react'; | 
					
						
							|  |  |  | import classNames from 'classnames'; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-05-10 20:50:43 -04:00
										 |  |  | import { getClassNamesFor } from '../util/getClassNamesFor'; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-21 15:04:19 -07:00
										 |  |  | export const SpinnerSvgSizes = ['small', 'normal'] as const; | 
					
						
							|  |  |  | export type SpinnerSvgSize = typeof SpinnerSvgSizes[number]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | export const SpinnerDirections = [ | 
					
						
							|  |  |  |   'outgoing', | 
					
						
							|  |  |  |   'incoming', | 
					
						
							|  |  |  |   'on-background', | 
					
						
							| 
									
										
										
										
											2021-05-05 17:09:29 -07:00
										 |  |  |   'on-captcha', | 
					
						
							| 
									
										
										
										
											2020-10-06 10:06:34 -07:00
										 |  |  |   'on-progress-dialog', | 
					
						
							| 
									
										
										
										
											2021-01-29 14:16:48 -08:00
										 |  |  |   'on-avatar', | 
					
						
							| 
									
										
										
										
											2020-08-21 15:04:19 -07:00
										 |  |  | ] as const; | 
					
						
							|  |  |  | export type SpinnerDirection = typeof SpinnerDirections[number]; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-14 12:07:05 -06:00
										 |  |  | export type Props = { | 
					
						
							| 
									
										
										
										
											2021-05-13 13:57:27 -07:00
										 |  |  |   ariaLabel?: string; | 
					
						
							| 
									
										
										
										
											2021-01-29 17:58:28 -05:00
										 |  |  |   direction?: SpinnerDirection; | 
					
						
							| 
									
										
										
										
											2021-05-13 13:57:27 -07:00
										 |  |  |   moduleClassName?: string; | 
					
						
							|  |  |  |   role?: string; | 
					
						
							| 
									
										
										
										
											2019-06-26 12:33:13 -07:00
										 |  |  |   size?: string; | 
					
						
							| 
									
										
										
										
											2020-08-21 15:04:19 -07:00
										 |  |  |   svgSize: SpinnerSvgSize; | 
					
						
							| 
									
										
										
										
											2021-01-14 12:07:05 -06:00
										 |  |  | }; | 
					
						
							| 
									
										
										
										
											2019-01-30 12:15:07 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-11-17 16:45:19 -08:00
										 |  |  | export function Spinner({ | 
					
						
							| 
									
										
										
										
											2021-05-13 13:57:27 -07:00
										 |  |  |   ariaLabel, | 
					
						
							|  |  |  |   direction, | 
					
						
							| 
									
										
										
										
											2021-01-29 17:58:28 -05:00
										 |  |  |   moduleClassName, | 
					
						
							| 
									
										
										
										
											2021-05-13 13:57:27 -07:00
										 |  |  |   role, | 
					
						
							| 
									
										
										
										
											2021-01-29 17:58:28 -05:00
										 |  |  |   size, | 
					
						
							|  |  |  |   svgSize, | 
					
						
							| 
									
										
										
										
											2022-11-17 16:45:19 -08:00
										 |  |  | }: Props): JSX.Element { | 
					
						
							| 
									
										
										
										
											2021-05-10 20:50:43 -04:00
										 |  |  |   const getClassName = getClassNamesFor('module-spinner', moduleClassName); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   return ( | 
					
						
							| 
									
										
										
										
											2020-09-11 17:46:52 -07:00
										 |  |  |     <div | 
					
						
							|  |  |  |       className={classNames( | 
					
						
							| 
									
										
										
										
											2021-05-10 20:50:43 -04:00
										 |  |  |         getClassName('__container'), | 
					
						
							|  |  |  |         getClassName(`__container--${svgSize}`), | 
					
						
							|  |  |  |         getClassName(direction && `__container--${direction}`), | 
					
						
							|  |  |  |         getClassName(direction && `__container--${svgSize}-${direction}`) | 
					
						
							| 
									
										
										
										
											2020-09-11 17:46:52 -07:00
										 |  |  |       )} | 
					
						
							| 
									
										
										
										
											2021-05-13 13:57:27 -07:00
										 |  |  |       role={role} | 
					
						
							|  |  |  |       aria-label={ariaLabel} | 
					
						
							| 
									
										
										
										
											2021-05-10 20:50:43 -04:00
										 |  |  |       style={{ | 
					
						
							|  |  |  |         height: size, | 
					
						
							|  |  |  |         width: size, | 
					
						
							|  |  |  |       }} | 
					
						
							|  |  |  |     > | 
					
						
							|  |  |  |       <div | 
					
						
							|  |  |  |         className={classNames( | 
					
						
							|  |  |  |           getClassName('__circle'), | 
					
						
							|  |  |  |           getClassName(`__circle--${svgSize}`), | 
					
						
							|  |  |  |           getClassName(direction && `__circle--${direction}`), | 
					
						
							|  |  |  |           getClassName(direction && `__circle--${svgSize}-${direction}`) | 
					
						
							|  |  |  |         )} | 
					
						
							|  |  |  |       /> | 
					
						
							|  |  |  |       <div | 
					
						
							|  |  |  |         className={classNames( | 
					
						
							|  |  |  |           getClassName('__arc'), | 
					
						
							|  |  |  |           getClassName(`__arc--${svgSize}`), | 
					
						
							|  |  |  |           getClassName(direction && `__arc--${direction}`), | 
					
						
							|  |  |  |           getClassName(direction && `__arc--${svgSize}-${direction}`) | 
					
						
							|  |  |  |         )} | 
					
						
							|  |  |  |       /> | 
					
						
							|  |  |  |     </div> | 
					
						
							|  |  |  |   ); | 
					
						
							| 
									
										
										
										
											2022-11-17 16:45:19 -08:00
										 |  |  | } |