Skip to content

Commit 567ef59

Browse files
authored
Merge branch 'main' into feat/plan-836-ledger-hid-prompt-up-issue
2 parents 1ce4a8f + 551d530 commit 567ef59

File tree

26 files changed

+933
-19
lines changed

26 files changed

+933
-19
lines changed

.storybook/test-data.js

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,10 @@ import { copyable, divider, heading, panel, text } from '@metamask/snaps-sdk';
1010
import { getJsxElementFromComponent } from '@metamask/snaps-utils';
1111
import { FirstTimeFlowType } from '../shared/constants/onboarding';
1212
import { ETH_EOA_METHODS } from '../shared/constants/eth-methods';
13-
import { mockNetworkState, mockMultichainNetworkState } from '../test/stub/networks';
13+
import {
14+
mockNetworkState,
15+
mockMultichainNetworkState,
16+
} from '../test/stub/networks';
1417

1518
const state = {
1619
invalidCustomNetwork: {
@@ -1257,6 +1260,16 @@ const state = {
12571260
accounts: ['0x9d0ba4ddac06032527b140912ec808ab9451b788'],
12581261
},
12591262
],
1263+
keyringsMetadata: [
1264+
{
1265+
id: '01JN08SYECPZHFHB3K0J1NHJ4H',
1266+
name: '',
1267+
},
1268+
{
1269+
id: '01JN08T38HEXPYQX2HKP1FCRMZ',
1270+
name: '',
1271+
},
1272+
],
12601273
...mockNetworkState(
12611274
{
12621275
id: 'test-networkConfigurationId-1',

app/_locales/en/messages.json

Lines changed: 35 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

app/_locales/en_GB/messages.json

Lines changed: 36 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

ui/components/multichain/account-list-menu/account-list-menu.test.tsx

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import {
77
KeyringAccountType,
88
} from '@metamask/keyring-api';
99
import { merge } from 'lodash';
10+
import { KeyringTypes } from '@metamask/keyring-controller';
1011
import { fireEvent, waitFor } from '../../../../test/jest';
1112
import configureStore from '../../../store/store';
1213
import mockState from '../../../../test/data/mock-state.json';
@@ -673,4 +674,76 @@ describe('AccountListMenu', () => {
673674
expect(queryByText(mockBtcAccount.metadata.name)).toBeInTheDocument();
674675
});
675676
});
677+
678+
describe('Multi Srp', () => {
679+
it('redirects to import srp component', () => {
680+
const { getByTestId } = render();
681+
682+
const button = getByTestId(
683+
'multichain-account-menu-popover-action-button',
684+
);
685+
button.click();
686+
687+
const addAccountButton = getByTestId(
688+
'multichain-account-menu-popover-import-srp',
689+
);
690+
addAccountButton.click();
691+
692+
expect(getByTestId('import-srp-container')).toBeInTheDocument();
693+
});
694+
695+
it('shows srp list if there are multiple srps when adding a new account', async () => {
696+
mockNextAccountName.mockReturnValue('Next HD Account');
697+
698+
const accountInSecondSrp = createMockInternalAccount({
699+
address: '0xb1baf6a2f4a808937bb97a2f12ccf08f1233e3d9',
700+
name: 'Account in second Srp',
701+
});
702+
const secondHdKeyring = {
703+
accounts: [accountInSecondSrp.address],
704+
type: KeyringTypes.hd,
705+
};
706+
const secondHdKeyringMetadata = {
707+
id: '01JN2RD391JM4K7Q5T4RP3JXMA',
708+
name: '',
709+
};
710+
711+
const { getByTestId } = render({
712+
metamask: {
713+
...mockState.metamask,
714+
accounts: {
715+
[accountInSecondSrp.address]: {
716+
address: accountInSecondSrp.address,
717+
balance: '0x0',
718+
},
719+
},
720+
keyrings: [...mockState.metamask.keyrings, secondHdKeyring],
721+
keyringsMetadata: [
722+
...mockState.metamask.keyringsMetadata,
723+
secondHdKeyringMetadata,
724+
],
725+
internalAccounts: {
726+
...mockState.metamask.internalAccounts,
727+
accounts: {
728+
...mockState.metamask.internalAccounts.accounts,
729+
[accountInSecondSrp.id]: accountInSecondSrp,
730+
},
731+
selectedAccount: accountInSecondSrp.id,
732+
},
733+
},
734+
});
735+
736+
const button = getByTestId(
737+
'multichain-account-menu-popover-action-button',
738+
);
739+
await button.click();
740+
741+
const addAccountButton = getByTestId(
742+
'multichain-account-menu-popover-add-account',
743+
);
744+
await addAccountButton.click();
745+
746+
expect(getByTestId('select-srp-container')).toBeInTheDocument();
747+
});
748+
});
676749
});

ui/components/multichain/account-list-menu/account-list-menu.tsx

Lines changed: 46 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,12 @@ import {
7575
getDefaultHomeActiveTabName,
7676
///: BEGIN:ONLY_INCLUDE_IF(solana)
7777
getIsSolanaSupportEnabled,
78-
getMetaMaskKeyrings,
78+
///: END:ONLY_INCLUDE_IF
79+
///: BEGIN:ONLY_INCLUDE_IF(multi-srp,solana)
80+
getMetaMaskHdKeyrings,
81+
///: END:ONLY_INCLUDE_IF
82+
///: BEGIN:ONLY_INCLUDE_IF(multi-srp)
83+
getHdKeyringOfSelectedAccountOrPrimaryKeyring,
7984
///: END:ONLY_INCLUDE_IF
8085
} from '../../../selectors';
8186
import { setSelectedAccount } from '../../../store/actions';
@@ -135,6 +140,7 @@ import {
135140
///: END:ONLY_INCLUDE_IF
136141
///: BEGIN:ONLY_INCLUDE_IF(multi-srp)
137142
import { ImportSrp } from '../multi-srp/import-srp';
143+
import { SrpList } from '../multi-srp/srp-list';
138144
///: END:ONLY_INCLUDE_IF
139145
import { HiddenAccountList } from './hidden-account-list';
140146

@@ -156,7 +162,9 @@ const ACTION_MODES = {
156162
// Displays the import account form controls
157163
IMPORT: 'import',
158164
///: BEGIN:ONLY_INCLUDE_IF(multi-srp)
165+
CREATE_SRP: 'create-srp',
159166
IMPORT_SRP: 'import-srp',
167+
SELECT_SRP: 'select-srp',
160168
///: END:ONLY_INCLUDE_IF
161169
};
162170

@@ -185,8 +193,12 @@ export const getActionTitle = (
185193
case ACTION_MODES.IMPORT:
186194
return t('importPrivateKey');
187195
///: BEGIN:ONLY_INCLUDE_IF(multi-srp)
196+
case ACTION_MODES.CREATE_SRP:
197+
return t('createSecretRecoveryPhrase');
188198
case ACTION_MODES.IMPORT_SRP:
189199
return t('importSecretRecoveryPhrase');
200+
case ACTION_MODES.SELECT_SRP:
201+
return t('addAccount');
190202
///: END:ONLY_INCLUDE_IF
191203
default:
192204
return t('selectAnAccount');
@@ -240,9 +252,6 @@ export const AccountListMenu = ({
240252
///: END:ONLY_INCLUDE_IF
241253
const [searchQuery, setSearchQuery] = useState('');
242254
const [actionMode, setActionMode] = useState(ACTION_MODES.LIST);
243-
///: BEGIN:ONLY_INCLUDE_IF(solana)
244-
const [primaryKeyring] = useSelector(getMetaMaskKeyrings);
245-
///: END:ONLY_INCLUDE_IF
246255
const hiddenAddresses = useSelector(getHiddenAccountsList);
247256
const updatedAccountsList = useSelector(getUpdatedAndSortedAccounts);
248257
const filteredUpdatedAccountList = useMemo(
@@ -311,6 +320,18 @@ export const AccountListMenu = ({
311320
WalletClientType.Solana,
312321
);
313322
///: END:ONLY_INCLUDE_IF
323+
///: BEGIN:ONLY_INCLUDE_IF(multi-srp,solana)
324+
const [primaryKeyring] = useSelector(getMetaMaskHdKeyrings);
325+
///: END:ONLY_INCLUDE_IF
326+
///: BEGIN:ONLY_INCLUDE_IF(multi-srp)
327+
328+
// Here we are getting the keyring of the last selected account
329+
// if it is not an hd keyring, we will use the primary keyring
330+
const hdKeyring = useSelector(getHdKeyringOfSelectedAccountOrPrimaryKeyring);
331+
const [selectedKeyringId, setSelectedKeyringId] = useState(
332+
hdKeyring.metadata.id,
333+
);
334+
///: END:ONLY_INCLUDE_IF
314335

315336
let searchResults: MergedInternalAccount[] = filteredUpdatedAccountList;
316337
if (searchQuery) {
@@ -336,6 +357,10 @@ export const AccountListMenu = ({
336357
if (actionMode !== ACTION_MODES.LIST) {
337358
if (actionMode === ACTION_MODES.MENU) {
338359
onBack = () => setActionMode(ACTION_MODES.LIST);
360+
///: BEGIN:ONLY_INCLUDE_IF(multi-srp)
361+
} else if (actionMode === ACTION_MODES.SELECT_SRP) {
362+
onBack = () => setActionMode(ACTION_MODES.ADD);
363+
///: END:ONLY_INCLUDE_IF
339364
} else {
340365
onBack = () => setActionMode(ACTION_MODES.MENU);
341366
}
@@ -393,6 +418,10 @@ export const AccountListMenu = ({
393418
setActionMode(ACTION_MODES.LIST);
394419
}
395420
}}
421+
///: BEGIN:ONLY_INCLUDE_IF(multi-srp)
422+
selectedKeyringId={selectedKeyringId}
423+
onSelectSrp={() => setActionMode(ACTION_MODES.SELECT_SRP)}
424+
///: END:ONLY_INCLUDE_IF(multi-srp)
396425
/>
397426
</Box>
398427
) : null}
@@ -437,6 +466,19 @@ export const AccountListMenu = ({
437466
)
438467
///: END:ONLY_INCLUDE_IF
439468
}
469+
{
470+
///: BEGIN:ONLY_INCLUDE_IF(multi-srp)
471+
actionMode === ACTION_MODES.SELECT_SRP && (
472+
<SrpList
473+
onActionComplete={(keyringId: string) => {
474+
setSelectedKeyringId(keyringId);
475+
setActionMode(ACTION_MODES.ADD);
476+
}}
477+
/>
478+
)
479+
///: END:ONLY_INCLUDE_IF
480+
}
481+
440482
{/* Add / Import / Hardware Menu */}
441483
{actionMode === ACTION_MODES.MENU ? (
442484
<Box padding={4}>

0 commit comments

Comments
 (0)