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;
}