Implement new locked and uninstalled states
This commit is contained in:
147
packages/website/ts/components/wallet/body_overlay.tsx
Normal file
147
packages/website/ts/components/wallet/body_overlay.tsx
Normal file
@@ -0,0 +1,147 @@
|
||||
import * as _ from 'lodash';
|
||||
import * as React from 'react';
|
||||
|
||||
import { Blockchain } from 'ts/blockchain';
|
||||
import { Container } from 'ts/components/ui/container';
|
||||
import { Image } from 'ts/components/ui/image';
|
||||
import { Island } from 'ts/components/ui/island';
|
||||
import { Text } from 'ts/components/ui/text';
|
||||
import { Dispatcher } from 'ts/redux/dispatcher';
|
||||
import { colors } from 'ts/style/colors';
|
||||
import { styled } from 'ts/style/theme';
|
||||
import { AccountState, BrowserType, ProviderType } from 'ts/types';
|
||||
import { constants } from 'ts/utils/constants';
|
||||
import { utils } from 'ts/utils/utils';
|
||||
|
||||
const METAMASK_IMG_SRC = '/images/metamask_icon.png';
|
||||
|
||||
export interface BodyOverlayProps {
|
||||
dispatcher: Dispatcher;
|
||||
userAddress: string;
|
||||
injectedProviderName: string;
|
||||
providerType: ProviderType;
|
||||
onToggleLedgerDialog: () => void;
|
||||
blockchain?: Blockchain;
|
||||
blockchainIsLoaded: boolean;
|
||||
}
|
||||
|
||||
interface BodyOverlayState {}
|
||||
|
||||
export class BodyOverlay extends React.Component<BodyOverlayProps, BodyOverlayState> {
|
||||
public render(): React.ReactNode {
|
||||
const accountState = this._getAccountState();
|
||||
switch (accountState) {
|
||||
case AccountState.Locked:
|
||||
return <LockedOverlay onUseDifferentWalletClicked={this.props.onToggleLedgerDialog} />;
|
||||
case AccountState.Disconnected:
|
||||
return <DisconnectedOverlay onUseDifferentWalletClicked={this.props.onToggleLedgerDialog} />;
|
||||
case AccountState.Ready:
|
||||
case AccountState.Loading:
|
||||
default:
|
||||
return null;
|
||||
}
|
||||
}
|
||||
private _isBlockchainReady(): boolean {
|
||||
return this.props.blockchainIsLoaded && !_.isUndefined(this.props.blockchain);
|
||||
}
|
||||
private _getAccountState(): AccountState {
|
||||
return utils.getAccountState(
|
||||
this._isBlockchainReady(),
|
||||
this.props.providerType,
|
||||
this.props.injectedProviderName,
|
||||
this.props.userAddress,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
interface LockedOverlayProps {
|
||||
className?: string;
|
||||
onUseDifferentWalletClicked?: () => void;
|
||||
}
|
||||
const PlainLockedOverlay: React.StatelessComponent<LockedOverlayProps> = ({
|
||||
className,
|
||||
onUseDifferentWalletClicked,
|
||||
}) => (
|
||||
<div className={className}>
|
||||
<Container
|
||||
className="flex flex-column items-center"
|
||||
marginBottom="24px"
|
||||
marginTop="24px"
|
||||
marginLeft="48px"
|
||||
marginRight="48px"
|
||||
>
|
||||
<Image src={METAMASK_IMG_SRC} height="70px" />
|
||||
<Container marginTop="12px">
|
||||
<Text fontColor="#F68C24" fontSize="16px" fontWeight="bold">
|
||||
Please Unlock MetaMask
|
||||
</Text>
|
||||
</Container>
|
||||
<UseDifferentWallet fontColor={colors.darkGrey} onClick={onUseDifferentWalletClicked} />
|
||||
</Container>
|
||||
</div>
|
||||
);
|
||||
const LockedOverlay = styled(PlainLockedOverlay)`
|
||||
background: rgba(255, 248, 242, 0.8);
|
||||
border: 1px solid #f68c24;
|
||||
box-sizing: border-box;
|
||||
border-radius: 10px;
|
||||
`;
|
||||
|
||||
interface DisconnectedOverlayProps {
|
||||
onUseDifferentWalletClicked?: () => void;
|
||||
}
|
||||
const DisconnectedOverlay = (props: DisconnectedOverlayProps) => {
|
||||
return (
|
||||
<div className="flex flex-column items-center">
|
||||
<GetMetaMask />
|
||||
<UseDifferentWallet fontColor={colors.mediumBlue} onClick={props.onUseDifferentWalletClicked} />
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
interface UseDifferentWallet {
|
||||
fontColor: string;
|
||||
onClick?: () => void;
|
||||
}
|
||||
const UseDifferentWallet = (props: UseDifferentWallet) => {
|
||||
return (
|
||||
<Container marginTop="12px">
|
||||
<Text fontColor={props.fontColor} fontSize="16px" textDecorationLine="underline" onClick={props.onClick}>
|
||||
Use a different wallet
|
||||
</Text>
|
||||
</Container>
|
||||
);
|
||||
};
|
||||
|
||||
const GetMetaMask = () => {
|
||||
const browserType = utils.getBrowserType();
|
||||
let extensionLink;
|
||||
switch (browserType) {
|
||||
case BrowserType.Chrome:
|
||||
extensionLink = constants.URL_METAMASK_CHROME_STORE;
|
||||
break;
|
||||
case BrowserType.Firefox:
|
||||
extensionLink = constants.URL_METAMASK_FIREFOX_STORE;
|
||||
break;
|
||||
case BrowserType.Opera:
|
||||
extensionLink = constants.URL_METAMASK_OPERA_STORE;
|
||||
break;
|
||||
default:
|
||||
extensionLink = constants.URL_METAMASK_HOMEPAGE;
|
||||
}
|
||||
return (
|
||||
<a href={extensionLink} target="_blank" style={{ textDecoration: 'none' }}>
|
||||
<Island
|
||||
className="flex items-center py1 px2"
|
||||
style={{ height: 28, borderRadius: 28, backgroundColor: colors.mediumBlue }}
|
||||
>
|
||||
<Image src={METAMASK_IMG_SRC} width="28px" />
|
||||
<Container marginLeft="8px" marginRight="12px">
|
||||
<Text fontColor={colors.white} fontSize="16px" fontWeight={500}>
|
||||
Get Metamask Wallet
|
||||
</Text>
|
||||
</Container>
|
||||
</Island>
|
||||
</a>
|
||||
);
|
||||
};
|
@@ -26,6 +26,7 @@ import { Identicon } from 'ts/components/ui/identicon';
|
||||
import { Island } from 'ts/components/ui/island';
|
||||
import { Text } from 'ts/components/ui/text';
|
||||
import { TokenIcon } from 'ts/components/ui/token_icon';
|
||||
import { BodyOverlay } from 'ts/components/wallet/body_overlay';
|
||||
import { WalletDisconnectedItem } from 'ts/components/wallet/wallet_disconnected_item';
|
||||
import { WrapEtherItem } from 'ts/components/wallet/wrap_ether_item';
|
||||
import { AllowanceToggle } from 'ts/containers/inputs/allowance_toggle';
|
||||
@@ -196,6 +197,25 @@ export class Wallet extends React.Component<WalletProps, WalletState> {
|
||||
{_.map(loadingRowsRange, index => {
|
||||
return <NullTokenRow />;
|
||||
})}
|
||||
<Container
|
||||
className="flex items-center"
|
||||
position="absolute"
|
||||
width="100%"
|
||||
height="100%"
|
||||
maxHeight={bodyStyle.maxHeight}
|
||||
>
|
||||
<div className="mx-auto">
|
||||
<BodyOverlay
|
||||
dispatcher={this.props.dispatcher}
|
||||
userAddress={this.props.userAddress}
|
||||
injectedProviderName={this.props.injectedProviderName}
|
||||
providerType={this.props.providerType}
|
||||
onToggleLedgerDialog={this.props.onToggleLedgerDialog}
|
||||
blockchain={this.props.blockchain}
|
||||
blockchainIsLoaded={this.props.blockchainIsLoaded}
|
||||
/>
|
||||
</div>
|
||||
</Container>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
Reference in New Issue
Block a user