import { useCallback } from 'react'; import { useParams } from 'react-router'; import { sprintf } from 'sprintf-js'; import styled from 'styled-components'; import { formatDate } from '../../shared/account-expiry'; import { urls } from '../../shared/constants'; import { formatRelativeDate } from '../../shared/date-helper'; import { messages } from '../../shared/gettext'; import { RoutePath } from '../../shared/routes'; import { useAppContext } from '../context'; import useActions from '../lib/actionsHook'; import { Button, Flex } from '../lib/components'; import { FlexColumn } from '../lib/components/flex-column'; import { colors } from '../lib/foundations'; import { TransitionType, useHistory } from '../lib/history'; import { IconBadge } from '../lib/icon-badge'; import { generateRoutePath } from '../lib/routeHelpers'; import account from '../redux/account/actions'; import { useSelector } from '../redux/store'; import { AppMainHeader } from './app-main-header'; import { hugeText, measurements, tinyText } from './common-styles'; import CustomScrollbars from './CustomScrollbars'; import { Container, Footer, Layout } from './Layout'; import { RedeemVoucherContainer, RedeemVoucherInput, RedeemVoucherResponse, RedeemVoucherSubmitButton, } from './RedeemVoucher'; 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 ${measurements.horizontalViewMargin}`, paddingBottom: 'auto', }); export const StyledTitle = styled.span(hugeText, { lineHeight: '38px', marginBottom: '8px', }); export const StyledLabel = styled.span(tinyText, { 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( (newExpiry: string, secondsAdded: number) => { const path = generateRoutePath(RoutePath.voucherSuccess, { newExpiry, secondsAdded }); history.push(path); }, [history], ); const navigateBack = useCallback(() => { history.pop(); }, [history]); return ( {messages.pgettext('connect-view', 'Redeem voucher')} {messages.pgettext('connect-view', 'Enter voucher code')} ); } export function VoucherVerificationSuccess() { const { newExpiry, secondsAdded } = useParams<{ newExpiry: string; secondsAdded: string }>(); return ( ); } interface ITimeAddedProps { title?: string; newExpiry?: string; secondsAdded?: number; } export function TimeAdded(props: ITimeAddedProps) { const { push } = useHistory(); const finish = useFinishedCallback(); const expiry = useSelector((state) => state.account.expiry); const isNewAccount = useSelector( (state) => state.account.status.type === 'ok' && state.account.status.method === 'new_account', ); const locale = useSelector((state) => state.userInterface.locale); const navigateToSetupFinished = useCallback(() => { if (isNewAccount) { push(RoutePath.setupFinished); } else { finish(); } }, [isNewAccount, push, finish]); const duration = props.secondsAdded !== undefined ? formatRelativeDate(0, props.secondsAdded * 1000, { capitalize: true, displayMonths: true }) : undefined; let newExpiry = ''; if (props.newExpiry !== undefined) { newExpiry = formatDate(props.newExpiry, locale); } else if (expiry !== undefined) { newExpiry = formatDate(expiry, locale); } return ( {props.title ?? messages.pgettext('connect-view', 'Time was successfully added')} {duration ? sprintf( messages.gettext('%(duration)s was added, account paid until %(expiry)s.'), { duration, expiry: newExpiry, }, ) : sprintf(messages.gettext('Account paid until %(expiry)s.'), { expiry: newExpiry, })}
); } export function SetupFinished() { const finish = useFinishedCallback(); const { openUrl } = useAppContext(); const openPrivacyLink = useCallback(() => openUrl(urls.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.', )}
); } function HeaderBar() { const isNewAccount = useSelector( (state) => state.account.status.type === 'ok' && state.account.status.method === 'new_account', ); return ( ); } function useFinishedCallback() { const { accountSetupFinished } = useActions(account); const history = useHistory(); const isNewAccount = useSelector( (state) => 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) { accountSetupFinished(); } history.reset(RoutePath.main, { transition: TransitionType.push }); }, [isNewAccount, accountSetupFinished, history]); return callback; }