You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			114 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			TypeScript
		
	
			
		
		
	
	
			114 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			TypeScript
		
	
| import { useState } from 'react';
 | |
| import { useDispatch } from 'react-redux';
 | |
| import useKey from 'react-use/lib/useKey';
 | |
| import { CSSProperties } from 'styled-components';
 | |
| import { updateQuitModal } from '../../state/onboarding/ducks/modals';
 | |
| import { SessionWrapperModal } from '../SessionWrapperModal';
 | |
| import { Flex } from '../basic/Flex';
 | |
| import { SessionButton, SessionButtonColor, SessionButtonType } from '../basic/SessionButton';
 | |
| import { SpacerLG, SpacerSM } from '../basic/Text';
 | |
| import { SessionConfirmDialogProps } from './SessionConfirm';
 | |
| import { StyledI18nSubText } from '../basic/StyledI18nSubText';
 | |
| 
 | |
| const modalStyle: CSSProperties = {
 | |
|   maxWidth: '300px',
 | |
|   width: '100%',
 | |
|   lineHeight: 1.4,
 | |
| };
 | |
| 
 | |
| export const QuitModal = (props: SessionConfirmDialogProps) => {
 | |
|   const dispatch = useDispatch();
 | |
|   const {
 | |
|     title = '',
 | |
|     i18nMessage,
 | |
|     okTheme,
 | |
|     closeTheme = SessionButtonColor.Danger,
 | |
|     onClickOk,
 | |
|     onClickClose,
 | |
|     onClickCancel,
 | |
|     closeAfterInput = true,
 | |
|   } = props;
 | |
| 
 | |
|   const [isLoading, setIsLoading] = useState(false);
 | |
| 
 | |
|   const okText = props.okText || window.i18n('okay');
 | |
|   const cancelText = props.cancelText || window.i18n('cancel');
 | |
| 
 | |
|   const onClickOkHandler = async () => {
 | |
|     if (onClickOk) {
 | |
|       setIsLoading(true);
 | |
|       try {
 | |
|         await onClickOk();
 | |
|       } catch (e) {
 | |
|         window.log.warn(e);
 | |
|       } finally {
 | |
|         setIsLoading(false);
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     if (closeAfterInput) {
 | |
|       dispatch(updateQuitModal(null));
 | |
|     }
 | |
|   };
 | |
| 
 | |
|   /**
 | |
|    * Performs specified on close action then removes the modal.
 | |
|    */
 | |
|   const onClickCancelHandler = () => {
 | |
|     onClickCancel?.();
 | |
|     onClickClose?.();
 | |
|     dispatch(updateQuitModal(null));
 | |
|   };
 | |
| 
 | |
|   useKey('Enter', () => {
 | |
|     void onClickOkHandler();
 | |
|   });
 | |
| 
 | |
|   useKey('Escape', () => {
 | |
|     onClickCancelHandler();
 | |
|   });
 | |
| 
 | |
|   return (
 | |
|     <SessionWrapperModal
 | |
|       title={title}
 | |
|       onClose={onClickClose}
 | |
|       showExitIcon={false}
 | |
|       showHeader={true}
 | |
|       additionalClassName={'no-body-padding'}
 | |
|     >
 | |
|       {i18nMessage ? (
 | |
|         <Flex
 | |
|           container={true}
 | |
|           width={'100%'}
 | |
|           justifyContent="center"
 | |
|           alignItems="center"
 | |
|           style={modalStyle}
 | |
|         >
 | |
|           <SpacerLG />
 | |
|           <StyledI18nSubText {...i18nMessage}></StyledI18nSubText>
 | |
|           <SpacerLG />
 | |
|         </Flex>
 | |
|       ) : null}
 | |
|       <SpacerSM />
 | |
|       <Flex container={true} width={'100%'} justifyContent="center" alignItems="center">
 | |
|         <SessionButton
 | |
|           text={okText}
 | |
|           buttonColor={okTheme}
 | |
|           buttonType={SessionButtonType.Ghost}
 | |
|           onClick={onClickOkHandler}
 | |
|           disabled={isLoading}
 | |
|           dataTestId="session-confirm-ok-button"
 | |
|         />
 | |
|         <SessionButton
 | |
|           text={cancelText}
 | |
|           buttonColor={!okTheme ? closeTheme : undefined}
 | |
|           buttonType={SessionButtonType.Ghost}
 | |
|           onClick={onClickCancelHandler}
 | |
|           disabled={isLoading}
 | |
|           dataTestId="session-confirm-cancel-button"
 | |
|         />
 | |
|       </Flex>
 | |
|     </SessionWrapperModal>
 | |
|   );
 | |
| };
 |