Adds setProviderState action
unlockWalletAndDispatchToStore now changes the provider state based on the provider type Adds button to connect with fortmatic Adds FORTMATIC_API_KEY constant
This commit is contained in:
@@ -2,7 +2,7 @@ import * as _ from 'lodash';
|
|||||||
import * as React from 'react';
|
import * as React from 'react';
|
||||||
|
|
||||||
import { ColorOption } from '../style/theme';
|
import { ColorOption } from '../style/theme';
|
||||||
import { Account, AccountState, Network } from '../types';
|
import { Account, AccountState, Network, ProviderType } from '../types';
|
||||||
import { envUtil } from '../util/env';
|
import { envUtil } from '../util/env';
|
||||||
|
|
||||||
import { CoinbaseWalletLogo } from './coinbase_wallet_logo';
|
import { CoinbaseWalletLogo } from './coinbase_wallet_logo';
|
||||||
@@ -20,21 +20,22 @@ export interface PaymentMethodProps {
|
|||||||
account: Account;
|
account: Account;
|
||||||
network: Network;
|
network: Network;
|
||||||
walletDisplayName: string;
|
walletDisplayName: string;
|
||||||
|
providerType: ProviderType | undefined;
|
||||||
onInstallWalletClick: () => void;
|
onInstallWalletClick: () => void;
|
||||||
onUnlockWalletClick: () => void;
|
onUnlockWalletClick: (providerType?: ProviderType) => void;
|
||||||
}
|
}
|
||||||
|
|
||||||
export class PaymentMethod extends React.PureComponent<PaymentMethodProps> {
|
export class PaymentMethod extends React.PureComponent<PaymentMethodProps> {
|
||||||
public render(): React.ReactNode {
|
public render(): React.ReactNode {
|
||||||
return (
|
return (
|
||||||
<Container width="100%" height="120px" padding="20px 20px 0px 20px">
|
<Container width="100%" height="100%" padding="20px 20px 0px 20px">
|
||||||
<Container marginBottom="12px">
|
<Container marginBottom="12px">
|
||||||
<Flex justify="space-between">
|
<Flex justify="space-between">
|
||||||
<SectionHeader>{this._renderTitleText()}</SectionHeader>
|
<SectionHeader>{this._renderTitleText()}</SectionHeader>
|
||||||
{this._renderTitleLabel()}
|
{this._renderTitleLabel()}
|
||||||
</Flex>
|
</Flex>
|
||||||
</Container>
|
</Container>
|
||||||
{this._renderMainContent()}
|
<Container>{this._renderMainContent()}</Container>
|
||||||
</Container>
|
</Container>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@@ -74,13 +75,16 @@ export class PaymentMethod extends React.PureComponent<PaymentMethodProps> {
|
|||||||
const primaryColor = isMobile ? ColorOption.darkBlue : ColorOption.darkOrange;
|
const primaryColor = isMobile ? ColorOption.darkBlue : ColorOption.darkOrange;
|
||||||
const secondaryColor = isMobile ? ColorOption.lightBlue : ColorOption.lightOrange;
|
const secondaryColor = isMobile ? ColorOption.lightBlue : ColorOption.lightOrange;
|
||||||
const colors = { primaryColor, secondaryColor };
|
const colors = { primaryColor, secondaryColor };
|
||||||
|
const onUnlockGenericWallet = () => this.props.onUnlockWalletClick(ProviderType.MetaMask);
|
||||||
|
const onUnlockFormatic = () => this.props.onUnlockWalletClick(ProviderType.Fortmatic);
|
||||||
switch (account.state) {
|
switch (account.state) {
|
||||||
case AccountState.Loading:
|
case AccountState.Loading:
|
||||||
return null;
|
return null;
|
||||||
case AccountState.Locked:
|
case AccountState.Locked:
|
||||||
return (
|
return (
|
||||||
|
<Flex direction="column" justify="space-between" height="100%">
|
||||||
<WalletPrompt
|
<WalletPrompt
|
||||||
onClick={this.props.onUnlockWalletClick}
|
onClick={onUnlockGenericWallet}
|
||||||
image={
|
image={
|
||||||
<Container position="relative" top="2px">
|
<Container position="relative" top="2px">
|
||||||
<Icon width={13} icon="lock" color={ColorOption.black} />
|
<Icon width={13} icon="lock" color={ColorOption.black} />
|
||||||
@@ -88,8 +92,17 @@ export class PaymentMethod extends React.PureComponent<PaymentMethodProps> {
|
|||||||
}
|
}
|
||||||
{...colors}
|
{...colors}
|
||||||
>
|
>
|
||||||
Click to Connect {this.props.walletDisplayName}
|
Click to Connect Metamask
|
||||||
</WalletPrompt>
|
</WalletPrompt>
|
||||||
|
<WalletPrompt
|
||||||
|
onClick={onUnlockFormatic}
|
||||||
|
primaryColor={ColorOption.fortmaticPrimary}
|
||||||
|
secondaryColor={ColorOption.fortmaticSecondary}
|
||||||
|
marginTop="5px"
|
||||||
|
>
|
||||||
|
Connect with <Icon width={13} height={22} icon="lock" color={ColorOption.black} /> Fortmatic
|
||||||
|
</WalletPrompt>
|
||||||
|
</Flex>
|
||||||
);
|
);
|
||||||
case AccountState.None:
|
case AccountState.None:
|
||||||
return (
|
return (
|
||||||
|
@@ -94,3 +94,5 @@ export const PROVIDER_TYPE_TO_NAME: { [key in ProviderType]: string } = {
|
|||||||
[ProviderType.Fortmatic]: 'Fortmatic',
|
[ProviderType.Fortmatic]: 'Fortmatic',
|
||||||
[ProviderType.Fallback]: 'Fallback',
|
[ProviderType.Fallback]: 'Fallback',
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export const FORTMATIC_API_KEY = process.env.INSTANT_FORTMATIC_API_KEY;
|
||||||
|
@@ -1,3 +1,4 @@
|
|||||||
|
import * as Fortmatic from 'fortmatic';
|
||||||
import * as React from 'react';
|
import * as React from 'react';
|
||||||
import { connect } from 'react-redux';
|
import { connect } from 'react-redux';
|
||||||
import { Dispatch } from 'redux';
|
import { Dispatch } from 'redux';
|
||||||
@@ -6,14 +7,23 @@ import { PaymentMethod, PaymentMethodProps } from '../components/payment_method'
|
|||||||
import {
|
import {
|
||||||
COINBASE_WALLET_ANDROID_APP_STORE_URL,
|
COINBASE_WALLET_ANDROID_APP_STORE_URL,
|
||||||
COINBASE_WALLET_IOS_APP_STORE_URL,
|
COINBASE_WALLET_IOS_APP_STORE_URL,
|
||||||
COINBASE_WALLET_SITE_URL,
|
COINBASE_WALLET_SITE_URL, FORTMATIC_API_KEY,
|
||||||
} from '../constants';
|
} from '../constants';
|
||||||
import { Action, actions } from '../redux/actions';
|
import { Action, actions } from '../redux/actions';
|
||||||
import { asyncData } from '../redux/async_data';
|
import { asyncData } from '../redux/async_data';
|
||||||
import { State } from '../redux/reducer';
|
import { State } from '../redux/reducer';
|
||||||
import { Network, Omit, OperatingSystem, ProviderState, StandardSlidingPanelContent, WalletSuggestion } from '../types';
|
import {
|
||||||
|
Network,
|
||||||
|
Omit,
|
||||||
|
OperatingSystem,
|
||||||
|
ProviderState,
|
||||||
|
ProviderType,
|
||||||
|
StandardSlidingPanelContent,
|
||||||
|
WalletSuggestion,
|
||||||
|
} from '../types';
|
||||||
import { analytics } from '../util/analytics';
|
import { analytics } from '../util/analytics';
|
||||||
import { envUtil } from '../util/env';
|
import { envUtil } from '../util/env';
|
||||||
|
import { providerFactory } from '../util/provider_factory';
|
||||||
|
|
||||||
export interface ConnectedAccountPaymentMethodProps {}
|
export interface ConnectedAccountPaymentMethodProps {}
|
||||||
|
|
||||||
@@ -21,11 +31,12 @@ interface ConnectedState {
|
|||||||
network: Network;
|
network: Network;
|
||||||
providerState: ProviderState;
|
providerState: ProviderState;
|
||||||
walletDisplayName?: string;
|
walletDisplayName?: string;
|
||||||
|
providerType?: ProviderType;
|
||||||
}
|
}
|
||||||
|
|
||||||
interface ConnectedDispatch {
|
interface ConnectedDispatch {
|
||||||
openInstallWalletPanel: () => void;
|
openInstallWalletPanel: () => void;
|
||||||
unlockWalletAndDispatchToStore: (providerState: ProviderState) => void;
|
unlockWalletAndDispatchToStore: (providerState: ProviderState, providerType?: ProviderType) => void;
|
||||||
}
|
}
|
||||||
|
|
||||||
type ConnectedProps = Omit<PaymentMethodProps, keyof ConnectedAccountPaymentMethodProps>;
|
type ConnectedProps = Omit<PaymentMethodProps, keyof ConnectedAccountPaymentMethodProps>;
|
||||||
@@ -35,6 +46,7 @@ type FinalProps = ConnectedProps & ConnectedAccountPaymentMethodProps;
|
|||||||
const mapStateToProps = (state: State, _ownProps: ConnectedAccountPaymentMethodProps): ConnectedState => ({
|
const mapStateToProps = (state: State, _ownProps: ConnectedAccountPaymentMethodProps): ConnectedState => ({
|
||||||
network: state.network,
|
network: state.network,
|
||||||
providerState: state.providerState,
|
providerState: state.providerState,
|
||||||
|
providerType: envUtil.getProviderType(state.providerState.provider),
|
||||||
walletDisplayName: state.walletDisplayName,
|
walletDisplayName: state.walletDisplayName,
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -43,10 +55,43 @@ const mapDispatchToProps = (
|
|||||||
ownProps: ConnectedAccountPaymentMethodProps,
|
ownProps: ConnectedAccountPaymentMethodProps,
|
||||||
): ConnectedDispatch => ({
|
): ConnectedDispatch => ({
|
||||||
openInstallWalletPanel: () => dispatch(actions.openStandardSlidingPanel(StandardSlidingPanelContent.InstallWallet)),
|
openInstallWalletPanel: () => dispatch(actions.openStandardSlidingPanel(StandardSlidingPanelContent.InstallWallet)),
|
||||||
unlockWalletAndDispatchToStore: (providerState: ProviderState) => {
|
unlockWalletAndDispatchToStore: (providerState: ProviderState, providerType?: ProviderType) => {
|
||||||
analytics.trackAccountUnlockRequested();
|
analytics.trackAccountUnlockRequested();
|
||||||
|
let newProviderState: ProviderState = {
|
||||||
|
...providerState,
|
||||||
|
};
|
||||||
|
// Updates the provider state based on the provider type
|
||||||
|
if (providerType && providerType === ProviderType.Fortmatic) {
|
||||||
|
const web3Wrapper = providerState.web3Wrapper;
|
||||||
|
const fm = new Fortmatic(FORTMATIC_API_KEY);
|
||||||
|
const fmProvider = fm.getProvider();
|
||||||
|
web3Wrapper.setProvider(fmProvider);
|
||||||
|
newProviderState = {
|
||||||
|
...newProviderState,
|
||||||
|
provider: fmProvider,
|
||||||
|
web3Wrapper,
|
||||||
|
displayName: envUtil.getProviderDisplayName(fmProvider),
|
||||||
|
name: envUtil.getProviderName(fmProvider),
|
||||||
|
};
|
||||||
|
} else {
|
||||||
|
// As default uses the injected provider
|
||||||
|
const injected = providerFactory.getInjectedProviderIfExists();
|
||||||
|
const web3Wrapper = providerState.web3Wrapper;
|
||||||
|
if (injected) {
|
||||||
|
web3Wrapper.setProvider(injected);
|
||||||
|
newProviderState = {
|
||||||
|
...newProviderState,
|
||||||
|
provider: injected,
|
||||||
|
web3Wrapper,
|
||||||
|
displayName: envUtil.getProviderDisplayName(injected),
|
||||||
|
name: envUtil.getProviderName(injected),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Updates provider state
|
||||||
|
dispatch(actions.setProviderState(newProviderState));
|
||||||
// tslint:disable-next-line:no-floating-promises
|
// tslint:disable-next-line:no-floating-promises
|
||||||
asyncData.fetchAccountInfoAndDispatchToStore2(providerState, dispatch, true);
|
asyncData.fetchAccountInfoAndDispatchToStore(newProviderState, dispatch, true);
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -59,7 +104,9 @@ const mergeProps = (
|
|||||||
network: connectedState.network,
|
network: connectedState.network,
|
||||||
account: connectedState.providerState.account,
|
account: connectedState.providerState.account,
|
||||||
walletDisplayName: connectedState.providerState.displayName,
|
walletDisplayName: connectedState.providerState.displayName,
|
||||||
onUnlockWalletClick: () => connectedDispatch.unlockWalletAndDispatchToStore(connectedState.providerState),
|
providerType: connectedState.providerType,
|
||||||
|
onUnlockWalletClick: (providerType?: ProviderType) =>
|
||||||
|
connectedDispatch.unlockWalletAndDispatchToStore(connectedState.providerState, providerType),
|
||||||
onInstallWalletClick: () => {
|
onInstallWalletClick: () => {
|
||||||
const isMobile = envUtil.isMobileOperatingSystem();
|
const isMobile = envUtil.isMobileOperatingSystem();
|
||||||
const walletSuggestion: WalletSuggestion = isMobile
|
const walletSuggestion: WalletSuggestion = isMobile
|
||||||
|
@@ -1,7 +1,14 @@
|
|||||||
import { MarketBuySwapQuote } from '@0x/asset-swapper';
|
import { MarketBuySwapQuote } from '@0x/asset-swapper';
|
||||||
import { BigNumber } from '@0x/utils';
|
import { BigNumber } from '@0x/utils';
|
||||||
|
|
||||||
import { ActionsUnion, AddressAndEthBalanceInWei, Asset, BaseCurrency, StandardSlidingPanelContent } from '../types';
|
import {
|
||||||
|
ActionsUnion,
|
||||||
|
AddressAndEthBalanceInWei,
|
||||||
|
Asset,
|
||||||
|
BaseCurrency,
|
||||||
|
ProviderState,
|
||||||
|
StandardSlidingPanelContent,
|
||||||
|
} from '../types';
|
||||||
|
|
||||||
export interface PlainAction<T extends string> {
|
export interface PlainAction<T extends string> {
|
||||||
type: T;
|
type: T;
|
||||||
@@ -43,6 +50,7 @@ export enum ActionTypes {
|
|||||||
OpenStandardSlidingPanel = 'OPEN_STANDARD_SLIDING_PANEL',
|
OpenStandardSlidingPanel = 'OPEN_STANDARD_SLIDING_PANEL',
|
||||||
CloseStandardSlidingPanel = 'CLOSE_STANDARD_SLIDING_PANEL',
|
CloseStandardSlidingPanel = 'CLOSE_STANDARD_SLIDING_PANEL',
|
||||||
UpdateBaseCurrency = 'UPDATE_BASE_CURRENCY',
|
UpdateBaseCurrency = 'UPDATE_BASE_CURRENCY',
|
||||||
|
SetProviderState = 'SET_PROVIDER_STATE',
|
||||||
}
|
}
|
||||||
|
|
||||||
export const actions = {
|
export const actions = {
|
||||||
@@ -73,4 +81,5 @@ export const actions = {
|
|||||||
createAction(ActionTypes.OpenStandardSlidingPanel, content),
|
createAction(ActionTypes.OpenStandardSlidingPanel, content),
|
||||||
closeStandardSlidingPanel: () => createAction(ActionTypes.CloseStandardSlidingPanel),
|
closeStandardSlidingPanel: () => createAction(ActionTypes.CloseStandardSlidingPanel),
|
||||||
updateBaseCurrency: (baseCurrency: BaseCurrency) => createAction(ActionTypes.UpdateBaseCurrency, baseCurrency),
|
updateBaseCurrency: (baseCurrency: BaseCurrency) => createAction(ActionTypes.UpdateBaseCurrency, baseCurrency),
|
||||||
|
setProviderState: (providerState: ProviderState) => createAction(ActionTypes.SetProviderState, providerState),
|
||||||
};
|
};
|
||||||
|
@@ -252,6 +252,11 @@ export const createReducer = (initialState: State) => {
|
|||||||
...state,
|
...state,
|
||||||
baseCurrency: action.data,
|
baseCurrency: action.data,
|
||||||
};
|
};
|
||||||
|
case ActionTypes.SetProviderState:
|
||||||
|
return {
|
||||||
|
...state,
|
||||||
|
providerState: action.data,
|
||||||
|
};
|
||||||
default:
|
default:
|
||||||
return state;
|
return state;
|
||||||
}
|
}
|
||||||
|
@@ -1,9 +1,9 @@
|
|||||||
import * as bowser from 'bowser';
|
import * as bowser from 'bowser';
|
||||||
import {ZeroExProvider} from 'ethereum-types';
|
import { ZeroExProvider } from 'ethereum-types';
|
||||||
import * as _ from 'lodash';
|
import * as _ from 'lodash';
|
||||||
|
|
||||||
import {PROVIDER_TYPE_TO_NAME} from '../constants';
|
import { PROVIDER_TYPE_TO_NAME } from '../constants';
|
||||||
import {Browser, OperatingSystem, ProviderType} from '../types';
|
import { Browser, OperatingSystem, ProviderType } from '../types';
|
||||||
|
|
||||||
export const envUtil = {
|
export const envUtil = {
|
||||||
getBrowser(): Browser {
|
getBrowser(): Browser {
|
||||||
|
Reference in New Issue
Block a user