on master help sign in
fix: correctly reset store and set wallet type for new login flow
a3bbc03Matt Condon (shrugs)
src/lib/useWalletType.jsnew file+11
@@ -0,0 +1,11 @@
1+import { useEffect } from 'react';
2+
3+import { useWallet } from 'store/wallet';
4+
5+export default function useWalletType(walletType) {
6+ const { setWalletType } = useWallet();
7+
8+ useEffect(() => {
9+ setWalletType(walletType);
10+ }, [setWalletType, walletType]);
11+}
src/store/wallet.js+25−3
@@ -13,11 +13,13 @@ import {
13 DEFAULT_HD_PATH,
13 DEFAULT_HD_PATH,
14 addressFromSecp256k1Public,
14 addressFromSecp256k1Public,
15 walletFromMnemonic,
15 walletFromMnemonic,
16−} from '../lib/wallet';
16+} from 'lib/wallet';
17−import { BRIDGE_ERROR } from '../lib/error';
17+import { BRIDGE_ERROR } from 'lib/error';
18
18
19export const WalletContext = createContext(null);
19export const WalletContext = createContext(null);
20
20
21+const kDefaultWalletType = WALLET_TYPES.TICKET;
22+
21// NB (jtobin):
23// NB (jtobin):
22//
24//
23// Note that the 'wallet' prop has type depending on the 'walletType' prop.
25// Note that the 'wallet' prop has type depending on the 'walletType' prop.
@@ -34,7 +36,7 @@ function _useWallet(
34 initialWallet = Maybe.Nothing(),
36 initialWallet = Maybe.Nothing(),
35 initialMnemonic = Maybe.Nothing()
37 initialMnemonic = Maybe.Nothing()
36) {
38) {
37− const [walletType, _setWalletType] = useState(WALLET_TYPES.MNEMONIC);
39+ const [walletType, _setWalletType] = useState(kDefaultWalletType);
38 const [walletHdPath, setWalletHdPath] = useState(DEFAULT_HD_PATH);
40 const [walletHdPath, setWalletHdPath] = useState(DEFAULT_HD_PATH);
39 const [wallet, _setWallet] = useState(initialWallet);
41 const [wallet, _setWallet] = useState(initialWallet);
40 const [urbitWallet, _setUrbitWallet] = useState(Maybe.Nothing());
42 const [urbitWallet, _setUrbitWallet] = useState(Maybe.Nothing());
@@ -93,6 +95,24 @@ function _useWallet(
93 [setWallet]
95 [setWallet]
94 );
96 );
95
97
98+ const resetWallet = useCallback(() => {
99+ _setWalletType(kDefaultWalletType);
100+ setWalletHdPath(DEFAULT_HD_PATH);
101+ _setWallet(Maybe.Nothing());
102+ _setUrbitWallet(Maybe.Nothing());
103+ setAuthMnemonic(Maybe.Nothing());
104+ setNetworkSeed(Maybe.Nothing());
105+ setNetworkRevision(Maybe.Nothing());
106+ }, [
107+ _setWalletType,
108+ setWalletHdPath,
109+ _setWallet,
110+ _setUrbitWallet,
111+ setAuthMnemonic,
112+ setNetworkSeed,
113+ setNetworkRevision,
114+ ]);
115+
96 return {
116 return {
97 //
117 //
98 walletType,
118 walletType,
@@ -113,6 +133,8 @@ function _useWallet(
113 setNetworkSeed,
133 setNetworkSeed,
114 networkRevision,
134 networkRevision,
115 setNetworkRevision,
135 setNetworkRevision,
136+ //
137+ resetWallet,
116 };
138 };
117}
139}
118
140
src/views/Login.js+2−3
@@ -41,7 +41,7 @@ export default function Login() {
41 // globals
41 // globals
42 const history = useHistory();
42 const history = useHistory();
43 const { contracts } = useNetwork();
43 const { contracts } = useNetwork();
44− const { wallet, setUrbitWallet } = useWallet();
44+ const { wallet, resetWallet } = useWallet();
45 const { pointCursor, setPointCursor } = usePointCursor();
45 const { pointCursor, setPointCursor } = usePointCursor();
46
46
47 // inputs
47 // inputs
@@ -49,8 +49,7 @@ export default function Login() {
49
49
50 // on-mount
50 // on-mount
51 useLifecycle(() => {
51 useLifecycle(() => {
52− setUrbitWallet(Nothing());
52+ resetWallet();
53− setPointCursor(Nothing());
54 });
53 });
55
54
56 const doContinue = async () => {
55 const doContinue = async () => {
src/views/Login/Keystore.js+7−3
@@ -2,18 +2,22 @@ import { Just, Nothing } from 'folktale/maybe';
2import { Ok, Error } from 'folktale/result';
2import { Ok, Error } from 'folktale/result';
3import React, { useState } from 'react';
3import React, { useState } from 'react';
4import * as keythereum from 'keythereum';
4import * as keythereum from 'keythereum';
5+import { H3, Input } from 'indigo-react';
5
6
6import View from 'components/View';
7import View from 'components/View';
7import { usePassphraseInput } from 'components/Inputs';
8import { usePassphraseInput } from 'components/Inputs';
8import { ForwardButton } from 'components/Buttons';
9import { ForwardButton } from 'components/Buttons';
9−import { H3, Input } from 'indigo-react';
10import { InputCaption, UploadButton, Warning } from 'components/old/Base';
10import { InputCaption, UploadButton, Warning } from 'components/old/Base';
11
11
12−import * as need from 'lib/need';
13−import { EthereumWallet } from 'lib/wallet';
14import { useWallet } from 'store/wallet';
12import { useWallet } from 'store/wallet';
15
13
14+import * as need from 'lib/need';
15+import { EthereumWallet, WALLET_TYPES } from 'lib/wallet';
16+import useWalletType from 'lib/useWalletType';
17+
16export default function Keystore({ loginCompleted }) {
18export default function Keystore({ loginCompleted }) {
19+ useWalletType(WALLET_TYPES.KEYSTORE);
20+
17 // globals
21 // globals
18 const { wallet, setWallet } = useWallet();
22 const { wallet, setWallet } = useWallet();
19
23
src/views/Login/Ledger.js+7−2
@@ -5,15 +5,18 @@ import Maybe from 'folktale/maybe';
5import Transport from '@ledgerhq/hw-transport-u2f';
5import Transport from '@ledgerhq/hw-transport-u2f';
6import Eth from '@ledgerhq/hw-app-eth';
6import Eth from '@ledgerhq/hw-app-eth';
7import * as secp256k1 from 'secp256k1';
7import * as secp256k1 from 'secp256k1';
8+import { H1, H2, P, Input } from 'indigo-react';
8
9
9import View from 'components/View';
10import View from 'components/View';
10import { ForwardButton } from 'components/Buttons';
11import { ForwardButton } from 'components/Buttons';
11−import { H1, H2, P, Input } from 'indigo-react';
12import { InnerLabelDropdown } from 'components/old/Base';
12import { InnerLabelDropdown } from 'components/old/Base';
13
13
14−import { LEDGER_LIVE_PATH, LEDGER_LEGACY_PATH } from 'lib/ledger';
15import { useWallet } from 'store/wallet';
14import { useWallet } from 'store/wallet';
16
15
16+import { LEDGER_LIVE_PATH, LEDGER_LEGACY_PATH } from 'lib/ledger';
17+import useWalletType from 'lib/useWalletType';
18+import { WALLET_TYPES } from 'lib/wallet';
19+
17const pathOptions = [
20const pathOptions = [
18 { title: 'Ledger Live', value: LEDGER_LIVE_PATH },
21 { title: 'Ledger Live', value: LEDGER_LIVE_PATH },
19 { title: 'Ledger Legacy', value: LEDGER_LEGACY_PATH },
22 { title: 'Ledger Legacy', value: LEDGER_LEGACY_PATH },
@@ -25,6 +28,8 @@ const chopHdPrefix = str => (str.slice(0, 2) === 'm/' ? str.slice(2) : str);
25const addHdPrefix = str => (str.slice(0, 2) === 'm/' ? str : 'm/' + str);
28const addHdPrefix = str => (str.slice(0, 2) === 'm/' ? str : 'm/' + str);
26
29
27export default function Ledger({ loginCompleted }) {
30export default function Ledger({ loginCompleted }) {
31+ useWalletType(WALLET_TYPES.LEDGER);
32+
28 const { wallet, setWallet, setWalletHdPath } = useWallet();
33 const { wallet, setWallet, setWalletHdPath } = useWallet();
29
34
30 const [basePath, setBasePath] = useState(LEDGER_LIVE_PATH);
35 const [basePath, setBasePath] = useState(LEDGER_LIVE_PATH);
src/views/Login/Mnemonic.js+5−2
@@ -1,5 +1,6 @@
1import React, { useCallback, useEffect } from 'react';
1import React, { useCallback, useEffect } from 'react';
2import { Just, Nothing } from 'folktale/maybe';
2import { Just, Nothing } from 'folktale/maybe';
3+import { Input } from 'indigo-react';
3
4
4import View from 'components/View';
5import View from 'components/View';
5import {
6import {
@@ -9,11 +10,13 @@ import {
9} from 'components/Inputs';
10} from 'components/Inputs';
10import { ForwardButton } from 'components/Buttons';
11import { ForwardButton } from 'components/Buttons';
11
12
12−import { walletFromMnemonic } from 'lib/wallet';
13import { useWallet } from 'store/wallet';
13import { useWallet } from 'store/wallet';
14−import { Input } from 'indigo-react';
14+
15+import { walletFromMnemonic, WALLET_TYPES } from 'lib/wallet';
16+import useWalletType from 'lib/useWalletType';
15
17
16export default function Mnemonic({ advanced, loginCompleted }) {
18export default function Mnemonic({ advanced, loginCompleted }) {
19+ useWalletType(WALLET_TYPES.MNEMONIC);
17 const {
20 const {
18 wallet,
21 wallet,
19 setWallet,
22 setWallet,
src/views/Login/PrivateKey.js+5−2
@@ -1,15 +1,18 @@
1import { Just, Nothing } from 'folktale/maybe';
1import { Just, Nothing } from 'folktale/maybe';
2import React, { useEffect } from 'react';
2import React, { useEffect } from 'react';
3+import { Input } from 'indigo-react';
3
4
4import View from 'components/View';
5import View from 'components/View';
5import { usePassphraseInput } from 'components/Inputs';
6import { usePassphraseInput } from 'components/Inputs';
6import { ForwardButton } from 'components/Buttons';
7import { ForwardButton } from 'components/Buttons';
7
8
8−import { EthereumWallet } from 'lib/wallet';
9import { useWallet } from 'store/wallet';
9import { useWallet } from 'store/wallet';
10−import { Input } from 'indigo-react';
10+
11+import { EthereumWallet, WALLET_TYPES } from 'lib/wallet';
12+import useWalletType from 'lib/useWalletType';
11
13
12export default function PrivateKey({ loginCompleted }) {
14export default function PrivateKey({ loginCompleted }) {
15+ useWalletType(WALLET_TYPES.PRIVATE_KEY);
13 const { wallet, setWallet } = useWallet();
16 const { wallet, setWallet } = useWallet();
14
17
15 const privateKeyInput = usePassphraseInput({
18 const privateKeyInput = usePassphraseInput({
src/views/Login/Shards.js+6−2
@@ -1,6 +1,7 @@
1import { Just, Nothing } from 'folktale/maybe';
1import { Just, Nothing } from 'folktale/maybe';
2import React from 'react';
2import React from 'react';
3import * as kg from 'urbit-key-generation/dist/index';
3import * as kg from 'urbit-key-generation/dist/index';
4+import { Input } from 'indigo-react';
4
5
5import View from 'components/View';
6import View from 'components/View';
6import {
7import {
@@ -10,11 +11,14 @@ import {
10} from 'components/Inputs';
11} from 'components/Inputs';
11import { ForwardButton } from 'components/Buttons';
12import { ForwardButton } from 'components/Buttons';
12
13
13−import { urbitWalletFromTicket } from 'lib/wallet';
14import { useWallet } from 'store/wallet';
14import { useWallet } from 'store/wallet';
15−import { Input } from 'indigo-react';
15+
16+import { urbitWalletFromTicket, WALLET_TYPES } from 'lib/wallet';
17+import useWalletType from 'lib/useWalletType';
16
18
17export default function Shards({ loginCompleted }) {
19export default function Shards({ loginCompleted }) {
20+ useWalletType(WALLET_TYPES.SHARDS);
21+
18 const { wallet, setUrbitWallet } = useWallet();
22 const { wallet, setUrbitWallet } = useWallet();
19
23
20 const pointInput = usePointInput({
24 const pointInput = usePointInput({
src/views/Login/Ticket.js+7−6
@@ -2,6 +2,7 @@ import { Just, Nothing } from 'folktale/maybe';
2import React, { useCallback, useState, useEffect } from 'react';
2import React, { useCallback, useState, useEffect } from 'react';
3import * as azimuth from 'azimuth-js';
3import * as azimuth from 'azimuth-js';
4import * as ob from 'urbit-ob';
4import * as ob from 'urbit-ob';
5+import { Input } from 'indigo-react';
5
6
6import View from 'components/View';
7import View from 'components/View';
7import {
8import {
@@ -11,13 +12,13 @@ import {
11} from 'components/Inputs';
12} from 'components/Inputs';
12import { ForwardButton } from 'components/Buttons';
13import { ForwardButton } from 'components/Buttons';
13
14
14−import * as need from 'lib/need';
15−import { WALLET_TYPES, urbitWalletFromTicket } from 'lib/wallet';
16−
17import { useNetwork } from 'store/network';
15import { useNetwork } from 'store/network';
18import { useWallet } from 'store/wallet';
16import { useWallet } from 'store/wallet';
19import { usePointCursor } from 'store/pointCursor';
17import { usePointCursor } from 'store/pointCursor';
20−import { Input } from 'indigo-react';
18+
19+import * as need from 'lib/need';
20+import { WALLET_TYPES, urbitWalletFromTicket } from 'lib/wallet';
21+import useWalletType from 'lib/useWalletType';
21
22
22//TODO should be part of InputWithStatus component
23//TODO should be part of InputWithStatus component
23const INPUT_STATUS = {
24const INPUT_STATUS = {
@@ -27,9 +28,10 @@ const INPUT_STATUS = {
27};
28};
28
29
29export default function Ticket({ advanced, loginCompleted }) {
30export default function Ticket({ advanced, loginCompleted }) {
31+ useWalletType(WALLET_TYPES.TICKET);
30 // globals
32 // globals
31 const { contracts } = useNetwork();
33 const { contracts } = useNetwork();
32− const { wallet, setWalletType, setUrbitWallet } = useWallet();
34+ const { wallet, setUrbitWallet } = useWallet();
33 const { setPointCursor } = usePointCursor();
35 const { setPointCursor } = usePointCursor();
34
36
35 // inputs
37 // inputs
@@ -100,7 +102,6 @@ export default function Ticket({ advanced, loginCompleted }) {
100 };
102 };
101
103
102 const doContinue = () => {
104 const doContinue = () => {
103− setWalletType(WALLET_TYPES.TICKET);
104 setPointCursor(Just(ob.patp2dec(pointName)));
105 setPointCursor(Just(ob.patp2dec(pointName)));
105 loginCompleted();
106 loginCompleted();
106 };
107 };
src/views/Login/Trezor.js+6−1
@@ -4,13 +4,16 @@ import Maybe from 'folktale/maybe';
4import { times } from 'lodash';
4import { times } from 'lodash';
5import TrezorConnect from 'trezor-connect';
5import TrezorConnect from 'trezor-connect';
6import * as secp256k1 from 'secp256k1';
6import * as secp256k1 from 'secp256k1';
7+import { H1, P, Input } from 'indigo-react';
7
8
8import View from 'components/View';
9import View from 'components/View';
9import { ForwardButton } from 'components/Buttons';
10import { ForwardButton } from 'components/Buttons';
10−import { H1, P, Input } from 'indigo-react';
11import { InnerLabelDropdown } from 'components/old/Base';
11import { InnerLabelDropdown } from 'components/old/Base';
12
12
13import { TREZOR_PATH } from 'lib/trezor';
13import { TREZOR_PATH } from 'lib/trezor';
14+import useWalletType from 'lib/useWalletType';
15+import { WALLET_TYPES } from 'lib/wallet';
16+
14import { useWallet } from 'store/wallet';
17import { useWallet } from 'store/wallet';
15
18
16const accountOptions = [
19const accountOptions = [
@@ -19,6 +22,8 @@ const accountOptions = [
19];
22];
20
23
21export default function Trezor({ loginCompleted }) {
24export default function Trezor({ loginCompleted }) {
25+ useWalletType(WALLET_TYPES.TREZOR);
26+
22 const { wallet, setWallet, setWalletHdPath } = useWallet();
27 const { wallet, setWallet, setWalletHdPath } = useWallet();
23
28
24 const [hdPath, setHdPath] = useState(TREZOR_PATH.replace(/x/g, 0));
29 const [hdPath, setHdPath] = useState(TREZOR_PATH.replace(/x/g, 0));