import { useCallback } from 'react'; import { useSelector } from 'react-redux'; import { sprintf } from 'sprintf-js'; import styled from 'styled-components'; import { links, colors } from '../../config.json'; import { formatRelativeDate } from '../../shared/date-helper'; import { messages } from '../../shared/gettext'; import { useAppContext } from '../context'; import useActions from '../lib/actionsHook'; import { transitions, useHistory } from '../lib/history'; import { RoutePath } from '../lib/routes'; import account from '../redux/account/actions'; import { IReduxState } from '../redux/store'; import * as AppButton from './AppButton'; import { AriaDescribed, AriaDescription, AriaDescriptionGroup } from './AriaGroup'; import { bigText } from './common-styles'; import CustomScrollbars from './CustomScrollbars'; import { calculateHeaderBarStyle, DefaultHeaderBar, HeaderBarStyle } from './HeaderBar'; import ImageView from './ImageView'; import { Container, Layout } from './Layout'; import { RedeemVoucherContainer, RedeemVoucherInput, RedeemVoucherResponse, RedeemVoucherSubmitButton, } from './RedeemVoucher'; export const StyledHeader = styled(DefaultHeaderBar)({ flex: 0, }); export const StyledCustomScrollbars = styled(CustomScrollbars)({ flex: 1, }); export const StyledContainer = styled(Container)({ paddingTop: '22px', minHeight: '100%', backgroundColor: colors.darkBlue, }); export const StyledBody = styled.div({ display: 'flex', flexDirection: 'column', flex: 1, padding: '0 22px', paddingBottom: 'auto', }); export const StyledFooter = styled.div({ display: 'flex', flexDirection: 'column', flex: 0, padding: '18px 22px 22px', }); export const StyledTitle = styled.span(bigText, { lineHeight: '38px', marginBottom: '8px', }); export const StyledLabel = styled.span({ fontFamily: 'Open Sans', fontSize: '13px', fontWeight: 600, lineHeight: '20px', color: colors.white, marginBottom: '9px', }); export const StyledRedeemVoucherInput = styled(RedeemVoucherInput)({ flex: 0, }); export const StyledStatusIcon = styled.div({ alignSelf: 'center', width: '60px', height: '60px', marginBottom: '18px', }); export function VoucherInput() { const history = useHistory(); const onSuccess = useCallback(() => { history.push(RoutePath.voucherSuccess); }, [history]); const navigateBack = useCallback(() => { history.pop(); }, [history]); return ( {messages.pgettext('connect-view', 'Redeem voucher')} {messages.pgettext('connect-view', 'Enter voucher code')} {messages.gettext('Cancel')} ); } export function VoucherVerificationSuccess() { return ( ); } interface ITimeAddedProps { title?: string; } export function TimeAdded(props: ITimeAddedProps) { const history = useHistory(); const finish = useFinishedCallback(); const accountData = useSelector((state: IReduxState) => state.account); const isNewAccount = useSelector( (state: IReduxState) => state.account.status.type === 'ok' && state.account.status.method === 'new_account', ); const navigateToSetupFinished = useCallback(() => { if (isNewAccount) { history.push(RoutePath.setupFinished); } else { finish(); } }, [history, finish]); const duration = (accountData.expiry && accountData.previousExpiry && formatRelativeDate(accountData.expiry, accountData.previousExpiry)) ?? ''; return ( {props.title ?? messages.pgettext('connect-view', 'Time was successfully added')} {sprintf(messages.gettext('%(duration)s was added to your account.'), { duration })} {messages.gettext('Next')} ); } export function SetupFinished() { const finish = useFinishedCallback(); const { openUrl } = useAppContext(); const openPrivacyLink = useCallback(() => openUrl(links.privacyGuide), [openUrl]); return ( {messages.pgettext('connect-view', "You're all set!")} {messages.pgettext( 'connect-view', 'Go ahead and start using the app to begin reclaiming your online privacy.', )} {messages.pgettext( 'connect-view', 'To continue your journey as a privacy ninja, visit our website to pick up other privacy-friendly habits and tools.', )} {messages.pgettext('connect-view', 'Learn about privacy')} {messages.pgettext('connect-view', 'Start using the app')} ); } function HeaderBar() { const isNewAccount = useSelector( (state: IReduxState) => state.account.status.type === 'ok' && state.account.status.method === 'new_account', ); const tunnelState = useSelector((state: IReduxState) => state.connection.status); const headerBarStyle = isNewAccount ? HeaderBarStyle.default : calculateHeaderBarStyle(tunnelState); return ; } function useFinishedCallback() { const { loggedIn } = useActions(account); const history = useHistory(); const isNewAccount = useSelector( (state: IReduxState) => state.account.status.type === 'ok' && state.account.status.method === 'new_account', ); const callback = useCallback(() => { // Changes login method from "new_account" to "existing_account" if (isNewAccount) { loggedIn(); } history.reset(RoutePath.main, undefined, transitions.push); }, [isNewAccount, loggedIn, history]); return callback; }