Skip to content

Commit 0ed48a0

Browse files
authored
Merge branch 'develop' into improv/account_syncing_various_updates
2 parents d6c5aef + 9605658 commit 0ed48a0

File tree

11 files changed

+172
-71
lines changed

11 files changed

+172
-71
lines changed

ui/ducks/metamask/metamask.js

+9
Original file line numberDiff line numberDiff line change
@@ -338,6 +338,15 @@ export const getNfts = (state) => {
338338
return allNfts?.[selectedAddress]?.[chainId] ?? [];
339339
};
340340

341+
export const getNFTsByChainId = (state, chainId) => {
342+
const {
343+
metamask: { allNfts },
344+
} = state;
345+
const { address: selectedAddress } = getSelectedInternalAccount(state);
346+
347+
return allNfts?.[selectedAddress]?.[chainId] ?? [];
348+
};
349+
341350
export const getNftContracts = (state) => {
342351
const {
343352
metamask: { allNftContracts },

ui/pages/confirmations/components/confirm/info/approve/approve-static-simulation/approve-static-simulation.tsx

+11-10
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ import {
1414
TextAlign,
1515
} from '../../../../../../../helpers/constants/design-system';
1616
import { useI18nContext } from '../../../../../../../hooks/useI18nContext';
17-
import { SPENDING_CAP_UNLIMITED_MSG } from '../../../../../constants';
1817
import { useConfirmContext } from '../../../../../context/confirm';
1918
import { useAssetDetails } from '../../../../../hooks/useAssetDetails';
2019
import StaticSimulation from '../../shared/static-simulation/static-simulation';
@@ -37,8 +36,13 @@ export const ApproveStaticSimulation = () => {
3736

3837
const decimals = initialDecimals || '0';
3938

40-
const { spendingCap, formattedSpendingCap, value, pending } =
41-
useApproveTokenSimulation(transactionMeta, decimals);
39+
const {
40+
spendingCap,
41+
isUnlimitedSpendingCap,
42+
formattedSpendingCap,
43+
value,
44+
pending,
45+
} = useApproveTokenSimulation(transactionMeta, decimals);
4246

4347
const { isNFT } = useIsNFT(transactionMeta);
4448

@@ -61,9 +65,7 @@ export const ApproveStaticSimulation = () => {
6165
textAlign={TextAlign.Center}
6266
alignItems={AlignItems.center}
6367
>
64-
{spendingCap === SPENDING_CAP_UNLIMITED_MSG
65-
? t('unlimited')
66-
: spendingCap}
68+
{isUnlimitedSpendingCap ? t('unlimited') : formattedSpendingCap}
6769
</Text>
6870
);
6971

@@ -78,10 +80,9 @@ export const ApproveStaticSimulation = () => {
7880
marginInlineEnd={1}
7981
minWidth={BlockSize.Zero}
8082
>
81-
{spendingCap === SPENDING_CAP_UNLIMITED_MSG ? (
82-
<Tooltip title={formattedSpendingCap}>
83-
{formattedTokenText}
84-
</Tooltip>
83+
{Boolean(isUnlimitedSpendingCap) ||
84+
spendingCap !== formattedSpendingCap ? (
85+
<Tooltip title={spendingCap}>{formattedTokenText}</Tooltip>
8586
) : (
8687
formattedTokenText
8788
)}

ui/pages/confirmations/components/confirm/info/approve/edit-spending-cap-modal/edit-spending-cap-modal.tsx

+10-13
Original file line numberDiff line numberDiff line change
@@ -62,41 +62,38 @@ export const EditSpendingCapModal = ({
6262
Number(decimals ?? '0'),
6363
).toFixed();
6464

65-
const { formattedSpendingCap } = useApproveTokenSimulation(
65+
const { formattedSpendingCap, spendingCap } = useApproveTokenSimulation(
6666
transactionMeta,
6767
decimals || '0',
6868
);
6969

7070
const [customSpendingCapInputValue, setCustomSpendingCapInputValue] =
71-
useState(formattedSpendingCap.toString());
71+
useState(spendingCap);
7272

7373
useEffect(() => {
74-
if (formattedSpendingCap) {
75-
setCustomSpendingCapInputValue(formattedSpendingCap.toString());
74+
if (spendingCap) {
75+
setCustomSpendingCapInputValue(spendingCap);
7676
}
77-
}, [formattedSpendingCap]);
77+
}, [spendingCap]);
7878

7979
const handleCancel = useCallback(() => {
8080
setIsOpenEditSpendingCapModal(false);
81-
setCustomSpendingCapInputValue(formattedSpendingCap.toString());
81+
setCustomSpendingCapInputValue(spendingCap);
8282
}, [
8383
setIsOpenEditSpendingCapModal,
8484
setCustomSpendingCapInputValue,
85-
formattedSpendingCap,
85+
spendingCap,
8686
]);
8787

8888
const [isModalSaving, setIsModalSaving] = useState(false);
8989

9090
const handleSubmit = useCallback(async () => {
9191
setIsModalSaving(true);
92-
const parsedValue = parseInt(String(customSpendingCapInputValue), 10);
9392

9493
const customTxParamsData = getCustomTxParamsData(
9594
transactionMeta?.txParams?.data,
9695
{
97-
customPermissionAmount:
98-
// coerce negative numbers to zero
99-
parsedValue < 0 ? '0' : customSpendingCapInputValue || '0',
96+
customPermissionAmount: customSpendingCapInputValue || '0',
10097
decimals: decimals || '0',
10198
},
10299
);
@@ -117,8 +114,8 @@ export const EditSpendingCapModal = ({
117114

118115
setIsModalSaving(false);
119116
setIsOpenEditSpendingCapModal(false);
120-
setCustomSpendingCapInputValue(formattedSpendingCap.toString());
121-
}, [customSpendingCapInputValue, formattedSpendingCap]);
117+
setCustomSpendingCapInputValue(spendingCap);
118+
}, [customSpendingCapInputValue, spendingCap]);
122119

123120
const showDecimalError =
124121
decimals &&

ui/pages/confirmations/components/confirm/info/approve/hooks/use-approve-token-simulation.test.ts

+6-3
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,8 @@ describe('useApproveTokenSimulation', () => {
6565

6666
expect(result.current).toMatchInlineSnapshot(`
6767
{
68-
"formattedSpendingCap": "7",
68+
"formattedSpendingCap": "#7",
69+
"isUnlimitedSpendingCap": false,
6970
"pending": undefined,
7071
"spendingCap": "#7",
7172
"value": {
@@ -132,8 +133,9 @@ describe('useApproveTokenSimulation', () => {
132133
expect(result.current).toMatchInlineSnapshot(`
133134
{
134135
"formattedSpendingCap": "1,000,000,000,000,000",
136+
"isUnlimitedSpendingCap": true,
135137
"pending": undefined,
136-
"spendingCap": "UNLIMITED MESSAGE",
138+
"spendingCap": "1000000000000000",
137139
"value": {
138140
"data": [
139141
{
@@ -197,7 +199,8 @@ describe('useApproveTokenSimulation', () => {
197199

198200
expect(result.current).toMatchInlineSnapshot(`
199201
{
200-
"formattedSpendingCap": "0.0000000000001",
202+
"formattedSpendingCap": "<0.000001",
203+
"isUnlimitedSpendingCap": false,
201204
"pending": undefined,
202205
"spendingCap": "0.0000000000001",
203206
"value": {

ui/pages/confirmations/components/confirm/info/approve/hooks/use-approve-token-simulation.ts

+14-9
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
import { TransactionMeta } from '@metamask/transaction-controller';
22
import { isHexString } from '@metamask/utils';
3+
import { BigNumber } from 'bignumber.js';
34
import { isBoolean } from 'lodash';
45
import { useMemo } from 'react';
56
import { useSelector } from 'react-redux';
67
import { calcTokenAmount } from '../../../../../../../../shared/lib/transactions-controller-utils';
78
import { getIntlLocale } from '../../../../../../../ducks/locale/locale';
8-
import { SPENDING_CAP_UNLIMITED_MSG } from '../../../../../constants';
9+
import { formatAmount } from '../../../../simulation-details/formatAmount';
910
import { useDecodedTransactionData } from '../../hooks/useDecodedTransactionData';
1011
import { useIsNFT } from './use-is-nft';
1112

@@ -46,22 +47,26 @@ export const useApproveTokenSimulation = (
4647
).toFixed();
4748
}, [value, decimals]);
4849

50+
const tokenPrefix = isNFT ? '#' : '';
51+
4952
const formattedSpendingCap = useMemo(() => {
50-
// formatting coerces small numbers to 0
51-
return isNFT || parseInt(decodedSpendingCap, 10) < 1
52-
? decodedSpendingCap
53-
: new Intl.NumberFormat(locale).format(parseInt(decodedSpendingCap, 10));
53+
return isNFT
54+
? `${tokenPrefix}${decodedSpendingCap}`
55+
: formatAmount(locale, new BigNumber(decodedSpendingCap));
5456
}, [decodedSpendingCap, isNFT, locale]);
5557

56-
const spendingCap = useMemo(() => {
58+
const { spendingCap, isUnlimitedSpendingCap } = useMemo(() => {
5759
if (!isNFT && isSpendingCapUnlimited(parseInt(decodedSpendingCap, 10))) {
58-
return SPENDING_CAP_UNLIMITED_MSG;
60+
return { spendingCap: decodedSpendingCap, isUnlimitedSpendingCap: true };
5961
}
60-
const tokenPrefix = isNFT ? '#' : '';
61-
return `${tokenPrefix}${formattedSpendingCap}`;
62+
return {
63+
spendingCap: `${tokenPrefix}${decodedSpendingCap}`,
64+
isUnlimitedSpendingCap: false,
65+
};
6266
}, [decodedSpendingCap, formattedSpendingCap, isNFT]);
6367

6468
return {
69+
isUnlimitedSpendingCap,
6570
spendingCap,
6671
formattedSpendingCap,
6772
value,

ui/pages/confirmations/components/confirm/info/approve/spending-cap/spending-cap.tsx

+7-13
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ import {
99
import { ConfirmInfoSection } from '../../../../../../../components/app/confirm/info/row/section';
1010
import Tooltip from '../../../../../../../components/ui/tooltip';
1111
import { useI18nContext } from '../../../../../../../hooks/useI18nContext';
12-
import { SPENDING_CAP_UNLIMITED_MSG } from '../../../../../constants';
1312
import { useConfirmContext } from '../../../../../context/confirm';
1413
import { useAssetDetails } from '../../../../../hooks/useAssetDetails';
1514
import { Container } from '../../shared/transaction-data/transaction-data';
@@ -19,30 +18,25 @@ const SpendingCapGroup = ({
1918
tokenSymbol,
2019
decimals,
2120
setIsOpenEditSpendingCapModal,
22-
customSpendingCap,
2321
}: {
2422
tokenSymbol: string;
2523
decimals: string;
2624
setIsOpenEditSpendingCapModal: (newValue: boolean) => void;
27-
customSpendingCap: string;
2825
}) => {
2926
const t = useI18nContext();
3027

3128
const { currentConfirmation: transactionMeta } =
3229
useConfirmContext<TransactionMeta>();
3330

34-
const { spendingCap, formattedSpendingCap, value } =
31+
const { spendingCap, isUnlimitedSpendingCap, formattedSpendingCap, value } =
3532
useApproveTokenSimulation(transactionMeta, decimals);
3633

37-
const spendingCapValue =
38-
customSpendingCap === '' ? formattedSpendingCap : customSpendingCap;
39-
4034
const SpendingCapElement = (
4135
<ConfirmInfoRowText
4236
text={
43-
spendingCap === SPENDING_CAP_UNLIMITED_MSG
37+
isUnlimitedSpendingCap
4438
? `${t('unlimited')} ${tokenSymbol}`
45-
: `${spendingCapValue} ${tokenSymbol}`
39+
: `${formattedSpendingCap} ${tokenSymbol}`
4640
}
4741
onEditClick={() => setIsOpenEditSpendingCapModal(true)}
4842
editIconClassName="edit-spending-cap-btn"
@@ -63,8 +57,9 @@ const SpendingCapGroup = ({
6357
tooltip={t('spendingCapTooltipDesc')}
6458
data-testid="confirmation__approve-spending-cap-group"
6559
>
66-
{spendingCap === SPENDING_CAP_UNLIMITED_MSG ? (
67-
<Tooltip title={formattedSpendingCap}>{SpendingCapElement}</Tooltip>
60+
{Boolean(isUnlimitedSpendingCap) ||
61+
spendingCap !== formattedSpendingCap ? (
62+
<Tooltip title={spendingCap}>{SpendingCapElement}</Tooltip>
6863
) : (
6964
SpendingCapElement
7065
)}
@@ -95,7 +90,7 @@ export const SpendingCap = ({
9590
Number(decimals ?? '0'),
9691
).toFixed();
9792

98-
const { pending, spendingCap } = useApproveTokenSimulation(
93+
const { pending } = useApproveTokenSimulation(
9994
transactionMeta,
10095
decimals || '0',
10196
);
@@ -114,7 +109,6 @@ export const SpendingCap = ({
114109
tokenSymbol={tokenSymbol || ''}
115110
decimals={decimals || '0'}
116111
setIsOpenEditSpendingCapModal={setIsOpenEditSpendingCapModal}
117-
customSpendingCap={spendingCap}
118112
/>
119113
</ConfirmInfoSection>
120114
);

ui/pages/confirmations/components/confirm/info/native-transfer/__snapshots__/native-transfer.test.tsx.snap

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ exports[`NativeTransferInfo renders correctly 1`] = `
66
class="mm-box mm-box--padding-4 mm-box--display-flex mm-box--flex-direction-column mm-box--justify-content-center mm-box--align-items-center"
77
>
88
<div
9-
class="mm-box mm-text mm-avatar-base mm-avatar-base--size-xl mm-avatar-token mm-text--body-lg-medium mm-text--text-transform-uppercase mm-box--display-flex mm-box--justify-content-center mm-box--align-items-center mm-box--color-text-default mm-box--background-color-background-alternative mm-box--rounded-full"
9+
class="mm-box mm-text mm-avatar-base mm-avatar-base--size-xl mm-avatar-token mm-text--body-lg-medium mm-text--text-transform-uppercase mm-box--display-flex mm-box--justify-content-center mm-box--align-items-center mm-box--color-text-default mm-box--background-color-background-default mm-box--rounded-full"
1010
>
1111
G
1212
</div>

ui/pages/confirmations/components/confirm/info/nft-token-transfer/__snapshots__/nft-token-transfer.test.tsx.snap

+31-4
Original file line numberDiff line numberDiff line change
@@ -6,16 +6,43 @@ exports[`NFTTokenTransferInfo renders correctly 1`] = `
66
class="mm-box mm-box--padding-4 mm-box--display-flex mm-box--flex-direction-column mm-box--justify-content-center mm-box--align-items-center"
77
>
88
<div
9-
class="mm-box mm-text mm-avatar-base mm-avatar-base--size-xl mm-avatar-token mm-text--body-lg-medium mm-text--text-transform-uppercase mm-box--display-flex mm-box--justify-content-center mm-box--align-items-center mm-box--color-text-default mm-box--background-color-background-alternative mm-box--rounded-full"
9+
class="mm-box"
10+
style="width: 48px;"
1011
>
11-
?
12+
<button
13+
class="mm-box nft-item__container"
14+
data-testid="nft-item"
15+
>
16+
<div
17+
class="mm-box mm-badge-wrapper nft-item__badge-wrapper mm-box--display-block"
18+
>
19+
<div
20+
class="mm-box nft-item__default-image nft-default mm-box--display-flex mm-box--rounded-lg"
21+
data-testid="nft-default-image"
22+
tabindex="0"
23+
/>
24+
<div
25+
class="mm-box mm-badge-wrapper__badge-container"
26+
style="top: -4px; right: -4px;"
27+
>
28+
<div
29+
class="mm-box mm-text mm-avatar-base mm-avatar-base--size-sm mm-avatar-network nft-item__network-badge mm-text--body-sm mm-text--text-transform-uppercase mm-box--display-flex mm-box--justify-content-center mm-box--align-items-center mm-box--color-text-default mm-box--background-color-background-alternative mm-box--rounded-full mm-box--border-color-background-default mm-box--border-width-2 box--border-style-solid"
30+
data-testid="nft-network-badge"
31+
>
32+
G
33+
</div>
34+
</div>
35+
</div>
36+
</button>
1237
</div>
1338
<h2
14-
class="mm-box mm-text mm-text--heading-lg mm-box--margin-top-3 mm-box--color-inherit"
39+
class="mm-box mm-text mm-text--heading-lg mm-text--text-align-center mm-box--margin-top-3 mm-box--color-inherit"
1540
/>
1641
<p
1742
class="mm-box mm-text mm-text--body-md mm-box--color-text-alternative"
18-
/>
43+
>
44+
#undefined
45+
</p>
1946
</div>
2047
<div
2148
class="mm-box mm-box--margin-bottom-4 mm-box--padding-0 mm-box--background-color-background-default mm-box--rounded-md"

ui/pages/confirmations/components/confirm/info/shared/native-send-heading/native-send-heading.tsx

+2
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import Tooltip from '../../../../../../../components/ui/tooltip';
1717
import { getIntlLocale } from '../../../../../../../ducks/locale/locale';
1818
import {
1919
AlignItems,
20+
BackgroundColor,
2021
Display,
2122
FlexDirection,
2223
JustifyContent,
@@ -81,6 +82,7 @@ const NativeSendHeading = () => {
8182
}
8283
name={multichainNetwork?.nickname}
8384
size={AvatarTokenSize.Xl}
85+
backgroundColor={BackgroundColor.backgroundDefault}
8486
/>
8587
);
8688

ui/pages/confirmations/components/confirm/info/shared/nft-send-heading/__snapshots__/nft-send-heading.test.tsx.snap

+31-4
Original file line numberDiff line numberDiff line change
@@ -6,16 +6,43 @@ exports[`<NFTSendHeading /> renders component 1`] = `
66
class="mm-box mm-box--padding-4 mm-box--display-flex mm-box--flex-direction-column mm-box--justify-content-center mm-box--align-items-center"
77
>
88
<div
9-
class="mm-box mm-text mm-avatar-base mm-avatar-base--size-xl mm-avatar-token mm-text--body-lg-medium mm-text--text-transform-uppercase mm-box--display-flex mm-box--justify-content-center mm-box--align-items-center mm-box--color-text-default mm-box--background-color-background-alternative mm-box--rounded-full"
9+
class="mm-box"
10+
style="width: 48px;"
1011
>
11-
?
12+
<button
13+
class="mm-box nft-item__container"
14+
data-testid="nft-item"
15+
>
16+
<div
17+
class="mm-box mm-badge-wrapper nft-item__badge-wrapper mm-box--display-block"
18+
>
19+
<div
20+
class="mm-box nft-item__default-image nft-default mm-box--display-flex mm-box--rounded-lg"
21+
data-testid="nft-default-image"
22+
tabindex="0"
23+
/>
24+
<div
25+
class="mm-box mm-badge-wrapper__badge-container"
26+
style="top: -4px; right: -4px;"
27+
>
28+
<div
29+
class="mm-box mm-text mm-avatar-base mm-avatar-base--size-sm mm-avatar-network nft-item__network-badge mm-text--body-sm mm-text--text-transform-uppercase mm-box--display-flex mm-box--justify-content-center mm-box--align-items-center mm-box--color-text-default mm-box--background-color-background-alternative mm-box--rounded-full mm-box--border-color-background-default mm-box--border-width-2 box--border-style-solid"
30+
data-testid="nft-network-badge"
31+
>
32+
G
33+
</div>
34+
</div>
35+
</div>
36+
</button>
1237
</div>
1338
<h2
14-
class="mm-box mm-text mm-text--heading-lg mm-box--margin-top-3 mm-box--color-inherit"
39+
class="mm-box mm-text mm-text--heading-lg mm-text--text-align-center mm-box--margin-top-3 mm-box--color-inherit"
1540
/>
1641
<p
1742
class="mm-box mm-text mm-text--body-md mm-box--color-text-alternative"
18-
/>
43+
>
44+
#undefined
45+
</p>
1946
</div>
2047
</div>
2148
`;

0 commit comments

Comments
 (0)