MyCrypto/common/components/WalletDecrypt/components/Trezor.tsx

157 lines
4.2 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { TrezorWallet, TREZOR_MINIMUM_FIRMWARE } from 'libs/wallet';
import React, { PureComponent } from 'react';
import translate from 'translations';
import TrezorConnect from 'vendor/trezor-connect';
import DeterministicWalletsModal from './DeterministicWalletsModal';
import './Trezor.scss';
import { Spinner, NewTabLink } from 'components/ui';
import { AppState } from 'reducers';
import { connect } from 'react-redux';
import { SecureWalletName, trezorReferralURL } from 'config';
import { getSingleDPath, getPaths } from 'selectors/config/wallet';
//todo: conflicts with comment in walletDecrypt -> onUnlock method
interface OwnProps {
onUnlock(param: any): void;
}
interface StateProps {
dPath: DPath;
dPaths: DPath[];
}
// todo: nearly duplicates ledger component props
interface State {
publicKey: string;
chainCode: string;
dPath: string;
error: string | null;
isLoading: boolean;
}
type Props = OwnProps & StateProps;
class TrezorDecryptClass extends PureComponent<Props, State> {
public state: State = {
publicKey: '',
chainCode: '',
dPath: this.props.dPath.value,
error: null,
isLoading: false
};
public componentWillReceiveProps(nextProps: Props) {
if (this.props.dPath !== nextProps.dPath) {
this.setState({ dPath: nextProps.dPath.value });
}
}
public render() {
const { dPath, publicKey, chainCode, error, isLoading } = this.state;
const showErr = error ? 'is-showing' : '';
return (
<div className="TrezorDecrypt">
<button
className="TrezorDecrypt-decrypt btn btn-primary btn-lg btn-block"
onClick={this.handleNullConnect}
disabled={isLoading}
>
{isLoading ? (
<div className="TrezorDecrypt-message">
<Spinner light={true} />
Unlocking...
</div>
) : (
translate('ADD_TREZOR_SCAN')
)}
</button>
<NewTabLink className="TrezorDecrypt-buy btn btn-sm btn-default" href={trezorReferralURL}>
{translate('Dont have a TREZOR? Order one now!')}
</NewTabLink>
<div className={`TrezorDecrypt-error alert alert-danger ${showErr}`}>{error || '-'}</div>
<div className="TrezorDecrypt-help">
<NewTabLink href="https://blog.trezor.io/trezor-integration-with-myetherwallet-3e217a652e08">
How to use TREZOR with MyCrypto
</NewTabLink>
</div>
<DeterministicWalletsModal
isOpen={!!publicKey && !!chainCode}
publicKey={publicKey}
chainCode={chainCode}
dPath={dPath}
dPaths={this.props.dPaths}
onCancel={this.handleCancel}
onConfirmAddress={this.handleUnlock}
onPathChange={this.handlePathChange}
walletType={'TREZOR'}
/>
</div>
);
}
private handlePathChange = (dPath: string) => {
this.setState({ dPath });
this.handleConnect(dPath);
};
private handleConnect = (dPath: string = this.state.dPath): void => {
this.setState({
isLoading: true,
error: null
});
(TrezorConnect as any).getXPubKey(
dPath,
(res: any) => {
if (res.success) {
this.setState({
dPath,
publicKey: res.publicKey,
chainCode: res.chainCode,
isLoading: false
});
} else {
this.setState({
error: res.error,
isLoading: false
});
}
},
TREZOR_MINIMUM_FIRMWARE
);
};
private handleCancel = () => {
this.reset();
};
private handleUnlock = (address: string, index: number) => {
this.props.onUnlock(new TrezorWallet(address, this.state.dPath, index));
this.reset();
};
private handleNullConnect = (): void => this.handleConnect();
private reset() {
this.setState({
publicKey: '',
chainCode: '',
dPath: this.props.dPath.value
});
}
}
function mapStateToProps(state: AppState): StateProps {
return {
dPath: getSingleDPath(state, SecureWalletName.TREZOR),
dPaths: getPaths(state, SecureWalletName.TREZOR)
};
}
export const TrezorDecrypt = connect(mapStateToProps)(TrezorDecryptClass);