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.
session-desktop/ts/components/leftpane/LeftPaneSectionHeader.tsx

144 lines
3.9 KiB
TypeScript

import React from 'react';
import { useDispatch, useSelector } from 'react-redux';
import styled from 'styled-components';
import { recoveryPhraseModal } from '../../state/ducks/modalDialog';
import { SectionType } from '../../state/ducks/section';
import { disableRecoveryPhrasePrompt } from '../../state/ducks/userConfig';
import { getFocusedSection, getIsMessageRequestOverlayShown } from '../../state/selectors/section';
import { getShowRecoveryPhrasePrompt } from '../../state/selectors/userConfig';
import { isSignWithRecoveryPhrase } from '../../util/storage';
import { Flex } from '../basic/Flex';
import { SessionButton } from '../basic/SessionButton';
import { MenuButton } from '../buttons';
const SectionTitle = styled.h1`
padding-top: var(--margins-xs);
padding-left: var(--margins-sm);
flex-grow: 1;
color: var(--text-primary-color);
`;
const StyledProgressBarContainer = styled.div`
width: 100%;
height: 5px;
flex-direction: row;
background: var(--border-color);
`;
const StyledProgressBarInner = styled.div`
background: var(--primary-color);
width: 90%;
transition: width var(--default-duration) 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(--primary-color);
}
`;
export const StyledLeftPaneBanner = styled.div`
background: var(--background-primary-color);
display: flex;
flex-direction: column;
border-bottom: 1px solid var(--border-color);
`;
const StyledBannerInner = styled.div`
p {
margin: 0;
}
.left-pane-banner___phrase {
margin-top: var(--margins-md);
}
.session-button {
margin-top: var(--margins-md);
flex-grow: 1;
}
`;
const BannerInner = () => {
const dispatch = useDispatch();
const showRecoveryPhraseModal = () => {
dispatch(disableRecoveryPhrasePrompt());
dispatch(recoveryPhraseModal({}));
};
return (
<StyledBannerInner>
<p>{window.i18n('recoveryPhraseRevealMessage')}</p>
<Flex container={true} alignItems="center" justifyContent="center">
<SessionButton
text={window.i18n('recoveryPhraseRevealButtonText')}
onClick={showRecoveryPhraseModal}
dataTestId="reveal-recovery-phrase"
/>
</Flex>
</StyledBannerInner>
);
};
export const LeftPaneBanner = () => {
const section = useSelector(getFocusedSection);
const isSignInWithRecoveryPhrase = 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>
);
};
export const LeftPaneSectionHeader = () => {
const showRecoveryPhrasePrompt = useSelector(getShowRecoveryPhrasePrompt);
const focusedSection = useSelector(getFocusedSection);
const isMessageRequestOverlayShown = useSelector(getIsMessageRequestOverlayShown);
let label: string | undefined;
const isMessageSection = focusedSection === SectionType.Message;
switch (focusedSection) {
case SectionType.Settings:
label = window.i18n('settingsHeader');
break;
case SectionType.Message:
label = isMessageRequestOverlayShown
? window.i18n('messageRequests')
: window.i18n('messagesHeader');
break;
default:
}
return (
<Flex flexDirection="column">
<div className="module-left-pane__header">
<SectionTitle>{label}</SectionTitle>
{isMessageSection && <MenuButton />}
</div>
{showRecoveryPhrasePrompt && <LeftPaneBanner />}
</Flex>
);
};