@@ -1,17 +1,34 @@
1import React, { useCallback, useState } from 'react';
1import React, { useCallback, useState } from 'react';
2import cn from 'classnames';
2import cn from 'classnames';
3import { Grid } from 'indigo-react';
3import { Grid } from 'indigo-react';
4−import { Box, Button, Icon, LoadingSpinner, Text } from '@tlon/indigo-react';
12+} from '@tlon/indigo-react';
13+import Web3 from 'web3';
14+import { Just } from 'folktale/maybe';
5import { useHistory } from 'store/history';
16import { useHistory } from 'store/history';
17+import { useWallet } from 'store/wallet';
18+import { useNetwork } from 'store/network';
7import { WALLET_TYPES } from 'lib/constants';
20import { WALLET_TYPES } from 'lib/constants';
8import { useWalletConnect } from 'lib/useWalletConnect';
21import { useWalletConnect } from 'lib/useWalletConnect';
22+import { MetamaskWallet } from 'lib/metamask';
23+import useLoginView from 'lib/useLoginView';
24+import { getAuthToken } from 'lib/authToken';
10import Modal from 'components/L2/Modal';
26import Modal from 'components/L2/Modal';
11import HeaderButton from 'components/L2/Headers/HeaderButton';
27import HeaderButton from 'components/L2/Headers/HeaderButton';
12−import './LoginSelector.scss';
13import { NAMES } from './Other';
28import { NAMES } from './Other';
14−import useLoginView from 'lib/useLoginView';
29+
30+import './LoginSelector.scss';
31+import { abbreviateAddress } from 'lib/utils/address';
16interface LoginSelectorProps {
33interface LoginSelectorProps {
17 className: string;
34 className: string;
@@ -40,21 +57,70 @@ export default function LoginSelector({
40 useLoginView(WALLET_TYPES.WALLET_CONNECT);
57 useLoginView(WALLET_TYPES.WALLET_CONNECT);
42 const { push, names }: any = useHistory();
59 const { push, names }: any = useHistory();
60+ const { setWallet, setWalletType, setAuthToken }: any = useWallet();
61+ const { setMetamask }: any = useNetwork();
43 const [showModal, setShowModal] = useState(false);
62 const [showModal, setShowModal] = useState(false);
44 const [metamaskSelected, setMetamaskSelected] = useState(false);
63 const [metamaskSelected, setMetamaskSelected] = useState(false);
46− const { connect } = useWalletConnect();
72+ } = useWalletConnect();
48 const goToActivate = useCallback(() => push(names.ACTIVATE), [
74 const goToActivate = useCallback(() => push(names.ACTIVATE), [
50 names.ACTIVATE,
76 names.ACTIVATE,
79+ const selectMetamask = useCallback(async () => {
82+ setMetamaskSelected(true);
83+ const accounts = await (window as any).ethereum.send(
84+ 'eth_requestAccounts'
86+ const wallet = new MetamaskWallet(accounts.result[0]);
88+ const web3 = new Web3((window as any).ethereum);
89+ const authToken = await getAuthToken({
90+ address: wallet.address,
91+ walletType: WALLET_TYPES.METAMASK,
95+ setAuthToken(Just(authToken));
96+ setWallet(Just(wallet));
97+ setWalletType(WALLET_TYPES.METAMASK);
103+ setMetamaskSelected(false);
105+ }, [setAuthToken, setWallet, setWalletType, setMetamask, goHome]);
107+ const onSubmitWalletConnect = useCallback(async () => {
109+ await authenticate();
112+ console.warn(error);
114+ }, [authenticate, goHome]);
53 const selectOption = (value: string) => async () => {
116 const selectOption = (value: string) => async () => {
54− if (value === NAMES.WALLET_CONNECT) {
117+ if (value === NAMES.METAMASK) {
119+ } else if (value === NAMES.WALLET_CONNECT) {
55 connect();
120 connect();
122+ setCurrentTab(value);
57− setCurrentTab(value);
60 const loader = <LoadingSpinner background="#bce2ff" foreground="#219DFF" />;
126 const loader = <LoadingSpinner background="#bce2ff" foreground="#219DFF" />;
@@ -63,6 +129,8 @@ export default function LoginSelector({
63 ({ value }) => value !== NAMES.METAMASK || !!(window as any).ethereum
129 ({ value }) => value !== NAMES.METAMASK || !!(window as any).ethereum
132+ const wcConnected = isConnected();
66 if (!currentTab) {
134 if (!currentTab) {
68 <Grid className={className}>
136 <Grid className={className}>
@@ -72,10 +140,42 @@ export default function LoginSelector({
73 className={cn('f5 pv3 rel pointer login-menu-item')}
141 className={cn('f5 pv3 rel pointer login-menu-item')}
74 onClick={selectOption(option.value)}>
142 onClick={selectOption(option.value)}>
143+ {option.value === NAMES.WALLET_CONNECT && wcConnected ? (
145+ <Row className="wc-info">
147+ <Image className="wallet-icon" src={peerIcon} />
152+ <Box className="mono address">
153+ {abbreviateAddress(address)}
157+ <Row className="wc-buttons">
159+ onClick={disconnect}
165+ onClick={onSubmitWalletConnect}
75− {option.text}
173+ {option.text}
76− {option.value === NAMES.METAMASK && metamaskSelected
174+ {option.value === NAMES.METAMASK && metamaskSelected
77− ? loader
175+ ? loader
78− : option.menuIcon}
176+ : option.menuIcon}
79 </Grid.Item>
179 </Grid.Item>
80 </React.Fragment>
180 </React.Fragment>