2018-01-24 14:23:20 -08:00
|
|
|
import React from 'react';
|
2018-02-06 20:28:28 -08:00
|
|
|
import { HELP_ARTICLE } from 'config';
|
2018-01-24 14:23:20 -08:00
|
|
|
import './InsecureWalletWarning.scss';
|
2018-03-21 20:50:25 -07:00
|
|
|
import translate from 'translations';
|
|
|
|
import { knowledgeBaseURL } from 'config/data';
|
2018-01-24 14:23:20 -08:00
|
|
|
|
|
|
|
interface Props {
|
|
|
|
walletType: string | React.ReactElement<string>;
|
|
|
|
onContinue(): void;
|
|
|
|
onCancel(): void;
|
|
|
|
}
|
|
|
|
|
|
|
|
interface State {
|
|
|
|
hasConfirmedSite: boolean;
|
|
|
|
hasAcknowledgedDownload: boolean;
|
|
|
|
hasAcknowledgedWallets: boolean;
|
|
|
|
}
|
|
|
|
|
|
|
|
interface Checkbox {
|
|
|
|
name: keyof State;
|
|
|
|
label: string | React.ReactElement<string>;
|
|
|
|
}
|
|
|
|
|
|
|
|
export class InsecureWalletWarning extends React.Component<Props, State> {
|
|
|
|
public state: State = {
|
|
|
|
hasConfirmedSite: false,
|
|
|
|
hasAcknowledgedDownload: false,
|
|
|
|
hasAcknowledgedWallets: false
|
|
|
|
};
|
|
|
|
|
|
|
|
constructor(props: Props) {
|
|
|
|
super(props);
|
|
|
|
if (process.env.BUILD_DOWNLOADABLE) {
|
|
|
|
props.onContinue();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public render() {
|
|
|
|
if (process.env.BUILD_DOWNLOADABLE) {
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
|
|
|
const { walletType, onContinue, onCancel } = this.props;
|
|
|
|
const checkboxes: Checkbox[] = [
|
|
|
|
{
|
|
|
|
name: 'hasAcknowledgedWallets',
|
2018-03-21 20:50:25 -07:00
|
|
|
label: translate('INSECURE_WALLET_WARNING_1')
|
2018-01-24 14:23:20 -08:00
|
|
|
},
|
|
|
|
{
|
|
|
|
name: 'hasAcknowledgedDownload',
|
2018-03-21 20:50:25 -07:00
|
|
|
label: translate('INSECURE_WALLET_WARNING_2')
|
2018-01-24 14:23:20 -08:00
|
|
|
},
|
|
|
|
{
|
|
|
|
name: 'hasConfirmedSite',
|
2018-03-21 20:50:25 -07:00
|
|
|
label: translate('INSECURE_WALLET_WARNING_3')
|
2018-01-24 14:23:20 -08:00
|
|
|
}
|
|
|
|
];
|
|
|
|
const canContinue = checkboxes.reduce(
|
|
|
|
(prev, checkbox) => prev && this.state[checkbox.name],
|
|
|
|
true
|
|
|
|
);
|
|
|
|
|
|
|
|
return (
|
|
|
|
<div className="WalletWarning">
|
2018-03-21 20:50:25 -07:00
|
|
|
<h2 className="WalletWarning-title">{translate('INSECURE_WALLET_TYPE_TITLE')}</h2>
|
2018-01-24 14:23:20 -08:00
|
|
|
<p className="WalletWarning-desc">
|
2018-03-21 20:50:25 -07:00
|
|
|
{translate('INSECURE_WALLET_TYPE_DESC', { $wallet_type: walletType as string })}
|
2018-01-24 14:23:20 -08:00
|
|
|
</p>
|
|
|
|
<ul className="WalletWarning-bullets">
|
|
|
|
<li>
|
2018-03-21 20:50:25 -07:00
|
|
|
{translate('INSECURE_WALLET_RECOMMEND_1', {
|
|
|
|
$metamask_article: knowledgeBaseURL + '/' + HELP_ARTICLE.MIGRATE_TO_METAMASK,
|
|
|
|
$hardware_wallet_article:
|
|
|
|
knowledgeBaseURL + '/' + HELP_ARTICLE.HARDWARE_WALLET_RECOMMENDATIONS
|
|
|
|
})}
|
2018-01-24 14:23:20 -08:00
|
|
|
</li>
|
|
|
|
<li>
|
2018-03-21 20:50:25 -07:00
|
|
|
{translate('INSECURE_WALLET_RECOMMEND_2', {
|
|
|
|
$run_local_article: knowledgeBaseURL + '/' + HELP_ARTICLE.RUNNING_LOCALLY
|
|
|
|
})}
|
2018-01-24 14:23:20 -08:00
|
|
|
</li>
|
|
|
|
<li>
|
2018-03-21 20:50:25 -07:00
|
|
|
{translate('INSECURE_WALLET_RECOMMEND_3', {
|
|
|
|
$secure_your_eth_article: knowledgeBaseURL + '/' + HELP_ARTICLE.SECURING_YOUR_ETH
|
|
|
|
})}
|
2018-01-24 14:23:20 -08:00
|
|
|
</li>
|
|
|
|
</ul>
|
|
|
|
<p className="WalletWarning-check">
|
2018-03-21 20:50:25 -07:00
|
|
|
{translate('WALLET_WARNING_CHECK', { $wallet_type: walletType as string })}
|
2018-01-24 14:23:20 -08:00
|
|
|
</p>
|
|
|
|
<div className="WalletWarning-checkboxes">{checkboxes.map(this.makeCheckbox)}</div>
|
|
|
|
|
|
|
|
<div className="WalletWarning-buttons">
|
|
|
|
<button className="WalletWarning-cancel btn btn-lg btn-default" onClick={onCancel}>
|
|
|
|
Go Back
|
|
|
|
</button>
|
|
|
|
<button
|
|
|
|
className="WalletWarning-continue btn btn-lg btn-primary"
|
|
|
|
onClick={onContinue}
|
|
|
|
disabled={!canContinue}
|
|
|
|
>
|
|
|
|
Continue
|
|
|
|
</button>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
private makeCheckbox = (checkbox: Checkbox) => {
|
|
|
|
return (
|
2018-02-16 10:39:05 -08:00
|
|
|
<label className="AcknowledgeCheckbox" key={checkbox.name}>
|
2018-01-24 14:23:20 -08:00
|
|
|
<input
|
|
|
|
type="checkbox"
|
|
|
|
name={checkbox.name}
|
|
|
|
className="AcknowledgeCheckbox-checkbox"
|
|
|
|
onChange={this.handleCheckboxChange}
|
|
|
|
checked={this.state[checkbox.name]}
|
|
|
|
/>
|
|
|
|
<span className="AcknowledgeCheckbox-label">{checkbox.label}</span>
|
|
|
|
</label>
|
|
|
|
);
|
|
|
|
};
|
|
|
|
|
|
|
|
private handleCheckboxChange = (ev: React.FormEvent<HTMLInputElement>) => {
|
|
|
|
this.setState({
|
|
|
|
[ev.currentTarget.name as any]: !!ev.currentTarget.checked
|
|
|
|
});
|
|
|
|
};
|
|
|
|
}
|