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.
		
		
		
		
		
			
		
			
				
	
	
		
			152 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			TypeScript
		
	
			
		
		
	
	
			152 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			TypeScript
		
	
| import { useCallback, useState } from 'react';
 | |
| import { useDispatch } from 'react-redux';
 | |
| 
 | |
| import { updateDeleteAccountModal } from '../../state/ducks/modalDialog';
 | |
| import { SessionWrapperModal } from '../SessionWrapperModal';
 | |
| import { SessionButton, SessionButtonColor, SessionButtonType } from '../basic/SessionButton';
 | |
| import { SpacerLG } from '../basic/Text';
 | |
| import { SessionSpinner } from '../loading';
 | |
| 
 | |
| import {
 | |
|   deleteEverythingAndNetworkData,
 | |
|   sendConfigMessageAndDeleteEverything,
 | |
| } from '../../util/accountManager';
 | |
| import { SessionRadioGroup } from '../basic/SessionRadioGroup';
 | |
| 
 | |
| const DEVICE_ONLY = 'device_only';
 | |
| const DEVICE_AND_NETWORK = 'device_and_network';
 | |
| type DeleteModes = typeof DEVICE_ONLY | typeof DEVICE_AND_NETWORK;
 | |
| 
 | |
| const DescriptionBeforeAskingConfirmation = (props: {
 | |
|   deleteMode: DeleteModes;
 | |
|   setDeleteMode: (deleteMode: DeleteModes) => void;
 | |
| }) => {
 | |
|   const { deleteMode, setDeleteMode } = props;
 | |
|   return (
 | |
|     <>
 | |
|       <span className="session-confirm-main-message">{window.i18n('deleteAccountWarning')}</span>
 | |
|       <span className="session-confirm-main-message">
 | |
|         {window.i18n('dialogClearAllDataDeletionQuestion')}
 | |
|       </span>
 | |
| 
 | |
|       <SpacerLG />
 | |
|       <SessionRadioGroup
 | |
|         group="delete_account"
 | |
|         initialItem={deleteMode}
 | |
|         onClick={value => {
 | |
|           if (value === DEVICE_ONLY || value === DEVICE_AND_NETWORK) {
 | |
|             setDeleteMode(value);
 | |
|           }
 | |
|         }}
 | |
|         items={[
 | |
|           { label: window.i18n('deviceOnly'), value: DEVICE_ONLY },
 | |
|           { label: window.i18n('entireAccount'), value: 'device_and_network' },
 | |
|         ]}
 | |
|       />
 | |
|     </>
 | |
|   );
 | |
| };
 | |
| 
 | |
| const DescriptionWhenAskingConfirmation = (props: { deleteMode: DeleteModes }) => {
 | |
|   return (
 | |
|     <span className="session-confirm-main-message">
 | |
|       {props.deleteMode === 'device_and_network'
 | |
|         ? window.i18n('areYouSureDeleteEntireAccount')
 | |
|         : window.i18n('areYouSureDeleteDeviceOnly')}
 | |
|     </span>
 | |
|   );
 | |
| };
 | |
| 
 | |
| export const DeleteAccountModal = () => {
 | |
|   const [isLoading, setIsLoading] = useState(false);
 | |
|   const [askingConfirmation, setAskingConfirmation] = useState(false);
 | |
|   const [deleteMode, setDeleteMode] = useState<DeleteModes>(DEVICE_ONLY);
 | |
| 
 | |
|   const dispatch = useDispatch();
 | |
| 
 | |
|   const onDeleteEverythingLocallyOnly = async () => {
 | |
|     if (!isLoading) {
 | |
|       setIsLoading(true);
 | |
|       try {
 | |
|         window.log.warn('Deleting everything on device but keeping network data');
 | |
| 
 | |
|         await sendConfigMessageAndDeleteEverything();
 | |
|       } catch (e) {
 | |
|         window.log.warn(e);
 | |
|       } finally {
 | |
|         setIsLoading(false);
 | |
|       }
 | |
|     }
 | |
|   };
 | |
| 
 | |
|   const onDeleteEverythingAndNetworkData = async () => {
 | |
|     if (!isLoading) {
 | |
|       setIsLoading(true);
 | |
|       try {
 | |
|         window.log.warn('Deleting everything including network data');
 | |
|         await deleteEverythingAndNetworkData();
 | |
|       } catch (e) {
 | |
|         window.log.warn(e);
 | |
|       } finally {
 | |
|         setIsLoading(false);
 | |
|       }
 | |
|     }
 | |
|   };
 | |
| 
 | |
|   /**
 | |
|    * Performs specified on close action then removes the modal.
 | |
|    */
 | |
|   const onClickCancelHandler = useCallback(() => {
 | |
|     dispatch(updateDeleteAccountModal(null));
 | |
|   }, [dispatch]);
 | |
| 
 | |
|   return (
 | |
|     <SessionWrapperModal
 | |
|       title={window.i18n('clearAllData')}
 | |
|       onClose={onClickCancelHandler}
 | |
|       showExitIcon={true}
 | |
|     >
 | |
|       {askingConfirmation ? (
 | |
|         <DescriptionWhenAskingConfirmation deleteMode={deleteMode} />
 | |
|       ) : (
 | |
|         <DescriptionBeforeAskingConfirmation
 | |
|           deleteMode={deleteMode}
 | |
|           setDeleteMode={setDeleteMode}
 | |
|         />
 | |
|       )}
 | |
|       <div className="session-modal__centered">
 | |
|         <div className="session-modal__button-group">
 | |
|           <SessionButton
 | |
|             text={window.i18n('clear')}
 | |
|             buttonColor={SessionButtonColor.Danger}
 | |
|             buttonType={SessionButtonType.Simple}
 | |
|             onClick={() => {
 | |
|               if (!askingConfirmation) {
 | |
|                 setAskingConfirmation(true);
 | |
|                 return;
 | |
|               }
 | |
|               if (deleteMode === 'device_only') {
 | |
|                 void onDeleteEverythingLocallyOnly();
 | |
|               } else if (deleteMode === 'device_and_network') {
 | |
|                 void onDeleteEverythingAndNetworkData();
 | |
|               }
 | |
|             }}
 | |
|             disabled={isLoading}
 | |
|           />
 | |
| 
 | |
|           <SessionButton
 | |
|             text={window.i18n('cancel')}
 | |
|             buttonType={SessionButtonType.Simple}
 | |
|             onClick={() => {
 | |
|               dispatch(updateDeleteAccountModal(null));
 | |
|             }}
 | |
|             disabled={isLoading}
 | |
|           />
 | |
|         </div>
 | |
|         <SpacerLG />
 | |
|         <SessionSpinner loading={isLoading} />
 | |
|       </div>
 | |
|     </SessionWrapperModal>
 | |
|   );
 | |
| };
 |