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.
		
		
		
		
		
			
		
			
				
	
	
		
			156 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			TypeScript
		
	
			
		
		
	
	
			156 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			TypeScript
		
	
| import React from 'react';
 | |
| import classNames from 'classnames';
 | |
| import { SessionIcon, SessionIconType } from './icon';
 | |
| import styled from 'styled-components';
 | |
| import { SessionButton, SessionButtonType } from './SessionButton';
 | |
| import { useDispatch, useSelector } from 'react-redux';
 | |
| import { disableRecoveryPhrasePrompt } from '../../state/ducks/userConfig';
 | |
| import { getShowRecoveryPhrasePrompt } from '../../state/selectors/userConfig';
 | |
| import { recoveryPhraseModal } from '../../state/ducks/modalDialog';
 | |
| import { Flex } from '../basic/Flex';
 | |
| import { getFocusedSection } from '../../state/selectors/section';
 | |
| import { SectionType } from '../../state/ducks/section';
 | |
| import { UserUtils } from '../../session/utils';
 | |
| 
 | |
| const Tab = ({
 | |
|   isSelected,
 | |
|   label,
 | |
|   onSelect,
 | |
|   type,
 | |
| }: {
 | |
|   isSelected: boolean;
 | |
|   label: string;
 | |
|   onSelect?: (event: number) => void;
 | |
|   type: number;
 | |
| }) => {
 | |
|   const handleClick = onSelect
 | |
|     ? () => {
 | |
|         onSelect(type);
 | |
|       }
 | |
|     : undefined;
 | |
| 
 | |
|   return (
 | |
|     <h1
 | |
|       className={classNames('module-left-pane__title', isSelected ? 'active' : null)}
 | |
|       onClick={handleClick}
 | |
|       role="button"
 | |
|     >
 | |
|       {label}
 | |
|     </h1>
 | |
|   );
 | |
| };
 | |
| 
 | |
| type Props = {
 | |
|   label?: string;
 | |
|   buttonIcon?: SessionIconType;
 | |
|   buttonClicked?: any;
 | |
| };
 | |
| 
 | |
| export const LeftPaneSectionHeader = (props: Props) => {
 | |
|   const { label, buttonIcon, buttonClicked } = props;
 | |
|   const showRecoveryPhrasePrompt = useSelector(getShowRecoveryPhrasePrompt);
 | |
| 
 | |
|   return (
 | |
|     <Flex flexDirection="column">
 | |
|       <div className="module-left-pane__header">
 | |
|         {label && <Tab label={label} type={0} isSelected={true} key={label} />}
 | |
|         {buttonIcon && (
 | |
|           <SessionButton onClick={buttonClicked} key="compose">
 | |
|             <SessionIcon iconType={buttonIcon} iconSize={'small'} iconColor="white" />
 | |
|           </SessionButton>
 | |
|         )}
 | |
|       </div>
 | |
|       {showRecoveryPhrasePrompt && <LeftPaneBanner />}
 | |
|     </Flex>
 | |
|   );
 | |
| };
 | |
| 
 | |
| const BannerInner = () => {
 | |
|   const dispatch = useDispatch();
 | |
| 
 | |
|   const showRecoveryPhraseModal = () => {
 | |
|     dispatch(disableRecoveryPhrasePrompt());
 | |
|     dispatch(recoveryPhraseModal({}));
 | |
|   };
 | |
| 
 | |
|   return (
 | |
|     <StyledBannerInner>
 | |
|       <p>{window.i18n('recoveryPhraseRevealMessage')}</p>
 | |
|       <SessionButton
 | |
|         buttonType={SessionButtonType.Default}
 | |
|         text={window.i18n('recoveryPhraseRevealButtonText')}
 | |
|         onClick={showRecoveryPhraseModal}
 | |
|       />
 | |
|     </StyledBannerInner>
 | |
|   );
 | |
| };
 | |
| 
 | |
| export const LeftPaneBanner = () => {
 | |
|   const section = useSelector(getFocusedSection);
 | |
|   const isSignInWithRecoveryPhrase = UserUtils.isSignWithRecoveryPhrase();
 | |
| 
 | |
|   if (section !== SectionType.Message || isSignInWithRecoveryPhrase) {
 | |
|     return null;
 | |
|   }
 | |
| 
 | |
|   return (
 | |
|     <StyledLeftPaneBanner>
 | |
|       <StyledProgressBarContainer>
 | |
|         <StyledProgressBarInner />
 | |
|       </StyledProgressBarContainer>
 | |
|       <StyledBannerTitle>
 | |
|         {window.i18n('recoveryPhraseSecureTitle')} <span>90%</span>
 | |
|       </StyledBannerTitle>
 | |
|       <Flex flexDirection="column" justifyContent="space-between" padding={'var(--margins-sm)'}>
 | |
|         <BannerInner />
 | |
|       </Flex>
 | |
|     </StyledLeftPaneBanner>
 | |
|   );
 | |
| };
 | |
| 
 | |
| const StyledProgressBarContainer = styled.div`
 | |
|   width: 100%;
 | |
|   height: 5px;
 | |
|   flex-direction: row;
 | |
|   background: var(--color-session-border);
 | |
| `;
 | |
| 
 | |
| const StyledProgressBarInner = styled.div`
 | |
|   background: var(--color-accent);
 | |
|   width: 90%;
 | |
|   transition: width 0.5s ease-in;
 | |
|   height: 100%;
 | |
| `;
 | |
| 
 | |
| export const StyledBannerTitle = styled.div`
 | |
|   line-height: 1.3;
 | |
|   font-size: var(--font-size-md);
 | |
|   font-weight: bold;
 | |
|   margin: var(--margins-sm) var(--margins-sm) 0 var(--margins-sm);
 | |
| 
 | |
|   span {
 | |
|     color: var(--color-text-accent);
 | |
|   }
 | |
| `;
 | |
| 
 | |
| export const StyledLeftPaneBanner = styled.div`
 | |
|   background: var(--color-recovery-phrase-banner-background);
 | |
|   display: flex;
 | |
|   flex-direction: column;
 | |
|   border-bottom: var(--session-border);
 | |
| `;
 | |
| 
 | |
| const StyledBannerInner = styled.div`
 | |
|   p {
 | |
|     margin: 0;
 | |
|   }
 | |
| 
 | |
|   .left-pane-banner___phrase {
 | |
|     margin-top: var(--margins-md);
 | |
|   }
 | |
| 
 | |
|   .session-button {
 | |
|     margin-top: var(--margins-sm);
 | |
|   }
 | |
| `;
 |