1
0
mirror of https://github.com/kremalicious/metamask-extension.git synced 2024-12-01 21:57:06 +01:00
metamask-extension/ui/pages/onboarding-flow/welcome/welcome.js
vthomas13 40e4a3653f
Updating Terms of Use, Adding popover and onboarding flow check (#18221)
* WIP commit

* Moving copy out of messages.json, styling changes

* handling scroll button click and disable logic

* moving scrollButton up to popover component, adding logic for accepting terms of use in popover and onboarding flows

* adding terms of use to e2e wallet creation/import

* adjusting failing unit test

* fixing QR code e2e

* updating welcome test

* setting app state in fixtures

* Update app/scripts/controllers/app-state.js

removing console log

Co-authored-by: Nidhi Kumari <nidhi.kumari@consensys.net>

* Update ui/components/app/terms-of-use-popup/terms-of-use-popup.stories.js

adding args to ToU popup storybook

Co-authored-by: Nidhi Kumari <nidhi.kumari@consensys.net>

* Update ui/components/app/terms-of-use-popup/terms-of-use-popup.js

Co-authored-by: Nidhi Kumari <nidhi.kumari@consensys.net>

* updating DS components in terms of use

* popover styling changes

* adding metametrics tracking

* editing scrollbutton behavior

* adding unit test

* code fencing

---------

Co-authored-by: Nidhi Kumari <nidhi.kumari@consensys.net>
2023-04-14 12:51:13 -04:00

220 lines
6.7 KiB
JavaScript

import EventEmitter from 'events';
import React, { useState, useEffect, useContext } from 'react';
import { useDispatch, useSelector } from 'react-redux';
import { useHistory } from 'react-router-dom';
import { Carousel } from 'react-responsive-carousel';
import Mascot from '../../../components/ui/mascot';
import Button from '../../../components/ui/button';
import { Text } from '../../../components/component-library';
import CheckBox from '../../../components/ui/check-box';
import Box from '../../../components/ui/box';
import {
FONT_WEIGHT,
TEXT_ALIGN,
TextVariant,
AlignItems,
} from '../../../helpers/constants/design-system';
import { useI18nContext } from '../../../hooks/useI18nContext';
import { MetaMetricsContext } from '../../../contexts/metametrics';
import {
MetaMetricsEventCategory,
MetaMetricsEventName,
} from '../../../../shared/constants/metametrics';
import {
setFirstTimeFlowType,
setTermsOfUseLastAgreed,
} from '../../../store/actions';
import {
ONBOARDING_METAMETRICS,
ONBOARDING_SECURE_YOUR_WALLET_ROUTE,
ONBOARDING_COMPLETION_ROUTE,
} from '../../../helpers/constants/routes';
import { FIRST_TIME_FLOW_TYPES } from '../../../helpers/constants/onboarding';
import { getFirstTimeFlowType, getCurrentKeyring } from '../../../selectors';
export default function OnboardingWelcome() {
const t = useI18nContext();
const dispatch = useDispatch();
const history = useHistory();
const [eventEmitter] = useState(new EventEmitter());
const currentKeyring = useSelector(getCurrentKeyring);
const firstTimeFlowType = useSelector(getFirstTimeFlowType);
const [termsChecked, setTermsChecked] = useState(false);
// Don't allow users to come back to this screen after they
// have already imported or created a wallet
useEffect(() => {
if (currentKeyring) {
if (firstTimeFlowType === FIRST_TIME_FLOW_TYPES.IMPORT) {
history.replace(ONBOARDING_COMPLETION_ROUTE);
} else {
history.replace(ONBOARDING_SECURE_YOUR_WALLET_ROUTE);
}
}
}, [currentKeyring, history, firstTimeFlowType]);
const trackEvent = useContext(MetaMetricsContext);
const onCreateClick = () => {
dispatch(setFirstTimeFlowType('create'));
trackEvent({
category: MetaMetricsEventCategory.Onboarding,
event: MetaMetricsEventName.OnboardingWalletCreationStarted,
properties: {
account_type: 'metamask',
},
});
dispatch(setTermsOfUseLastAgreed(new Date().getTime()));
history.push(ONBOARDING_METAMETRICS);
};
const toggleTermsCheck = () => {
setTermsChecked((currentTermsChecked) => !currentTermsChecked);
};
const termsOfUse = t('agreeTermsOfUse', [
<a
className="create-new-vault__terms-link"
key="create-new-vault__link-text"
href="https://metamask.io/terms.html"
target="_blank"
rel="noopener noreferrer"
>
{t('terms')}
</a>,
]);
const onImportClick = () => {
dispatch(setFirstTimeFlowType('import'));
trackEvent({
category: MetaMetricsEventCategory.Onboarding,
event: MetaMetricsEventName.OnboardingWalletImportStarted,
properties: {
account_type: 'imported',
},
});
dispatch(setTermsOfUseLastAgreed(new Date().getTime()));
history.push(ONBOARDING_METAMETRICS);
};
trackEvent({
category: MetaMetricsEventCategory.Onboarding,
event: MetaMetricsEventName.OnboardingWelcome,
properties: {
message_title: t('welcomeToMetaMask'),
app_version: global?.platform?.getVersion(),
},
});
return (
<div className="onboarding-welcome" data-testid="onboarding-welcome">
<Carousel showThumbs={false} showStatus={false} showArrows>
<div>
<Text
variant={TextVariant.headingLg}
as="h2"
textAlign={TEXT_ALIGN.CENTER}
fontWeight={FONT_WEIGHT.BOLD}
>
{t('welcomeToMetaMask')}
</Text>
<Text textAlign={TEXT_ALIGN.CENTER} marginLeft={6} marginRight={6}>
{t('welcomeToMetaMaskIntro')}
</Text>
<div className="onboarding-welcome__mascot">
<Mascot
animationEventEmitter={eventEmitter}
width="250"
height="250"
/>
</div>
</div>
<div>
<Text
variant={TextVariant.headingLg}
as="h2"
textAlign={TEXT_ALIGN.CENTER}
fontWeight={FONT_WEIGHT.BOLD}
>
{t('welcomeExploreTitle')}
</Text>
<Text textAlign={TEXT_ALIGN.CENTER}>
{t('welcomeExploreDescription')}
</Text>
<div className="onboarding-welcome__image">
<img
src="/images/onboarding-welcome-say-hello.svg"
width="169"
height="237"
alt=""
/>
</div>
</div>
<div>
<Text
variant={TextVariant.headingLg}
as="h2"
textAlign={TEXT_ALIGN.CENTER}
fontWeight={FONT_WEIGHT.BOLD}
>
{t('welcomeLoginTitle')}
</Text>
<Text textAlign={TEXT_ALIGN.CENTER}>
{t('welcomeLoginDescription')}
</Text>
<div className="onboarding-welcome__image">
<img
src="/images/onboarding-welcome-decentralised-apps.svg"
width="327"
height="256"
alt=""
/>
</div>
</div>
</Carousel>
<ul className="onboarding-welcome__buttons">
<li>
<Box
alignItems={AlignItems.center}
className="onboarding__terms-of-use"
>
<CheckBox
id="onboarding__terms-checkbox"
className="onboarding__terms-checkbox"
dataTestId="onboarding-terms-checkbox"
checked={termsChecked}
onClick={toggleTermsCheck}
/>
<label
className="onboarding__terms-label"
htmlFor="onboarding__terms-checkbox"
>
<Text variant={TextVariant.bodyMd} marginLeft={2} as="span">
{termsOfUse}
</Text>
</label>
</Box>
</li>
<li>
<Button
data-testid="onboarding-create-wallet"
type="primary"
onClick={onCreateClick}
disabled={!termsChecked}
>
{t('onboardingCreateWallet')}
</Button>
</li>
<li>
<Button
data-testid="onboarding-import-wallet"
type="secondary"
onClick={onImportClick}
disabled={!termsChecked}
>
{t('onboardingImportWallet')}
</Button>
</li>
</ul>
</div>
);
}