Skip to content
Open
Show file tree
Hide file tree
Changes from 5 commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
e0f491c
refactor(5566): migrate from v5 &v5-compat to react-router-dom-v6
DDDDDanica Nov 25, 2025
6fd0729
refactor(5566): replace react-router-dom-v5-compat with react-router-…
DDDDDanica Nov 26, 2025
0b7c9c4
refactor(5566): update specific test files to use render-helpers-navi…
DDDDDanica Nov 26, 2025
990cb87
Merge remote-tracking branch 'origin/main' into refactor/5566-v6
DDDDDanica Nov 26, 2025
19c57f1
Merge remote-tracking branch 'origin/main' into refactor/5566-v6
DDDDDanica Nov 26, 2025
4a0b352
refactor(5566): fix lint and tests
DDDDDanica Nov 26, 2025
fefb413
Merge remote-tracking branch 'origin/main' into refactor/5566-v6
DDDDDanica Nov 27, 2025
598f154
refactor(5566): fix lint and tests v2
DDDDDanica Nov 27, 2025
66856c6
Update LavaMoat policies
metamaskbot Nov 27, 2025
f88155d
refactor(5566): fix lint and tests v3
DDDDDanica Nov 27, 2025
d215108
Merge remote-tracking branch 'origin/refactor/5566-v6' into refactor/…
DDDDDanica Nov 27, 2025
9b09b4e
refactor(5566): fix LavaMoat - property "history" of globalThis is in…
DDDDDanica Nov 30, 2025
e0d01da
Merge remote-tracking branch 'origin/main' into refactor/5566-v6
DDDDDanica Nov 30, 2025
3d65598
refactor(5566): fix lint & tests v4
DDDDDanica Nov 30, 2025
1ce4c35
Update LavaMoat policies
metamaskbot Dec 1, 2025
62cb481
refactor(5566): fix lint & tests v5
DDDDDanica Dec 1, 2025
b8a0521
Merge remote-tracking branch 'origin/main' into refactor/5566-v6
DDDDDanica Dec 1, 2025
4e70d56
refactor(5566): convert permissions-connect to functional component a…
DDDDDanica Dec 1, 2025
c50c837
Merge remote-tracking branch 'origin/main' into refactor/5566-v6
DDDDDanica Dec 2, 2025
ca38885
refactor(5566): fix lint & tests v6
DDDDDanica Dec 2, 2025
83b0a5c
Merge remote-tracking branch 'origin/main' into refactor/5566-v6
DDDDDanica Dec 2, 2025
0f9527a
refactor(5566): fix lint & tests v7
DDDDDanica Dec 2, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
3 changes: 1 addition & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -442,8 +442,7 @@
"react-popper": "^2.2.3",
"react-redux": "^7.2.9",
"react-responsive-carousel": "^3.2.21",
"react-router-dom": "^5.3.4",
"react-router-dom-v5-compat": "^6.26.2",
"react-router-dom": "^6.28.0",
"react-simple-file-input": "^2.0.0",
"react-tippy": "^1.2.2",
"react-toggle-button": "^2.2.0",
Expand Down
23 changes: 9 additions & 14 deletions test/jest/rendering.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ import React, { useMemo } from 'react';
import { Provider } from 'react-redux';
import { render } from '@testing-library/react';
import { MemoryRouter, Router } from 'react-router-dom';
import { CompatRouter } from 'react-router-dom-v5-compat';
import PropTypes from 'prop-types';

import { I18nContext, LegacyI18nProvider } from '../../ui/contexts/i18n';
Expand Down Expand Up @@ -66,10 +65,10 @@ export function renderWithProvider(component, store, initialEntries) {
);
return store ? (
<Provider store={store}>
<WithoutStore></WithoutStore>
<WithoutStore />
</Provider>
) : (
<WithoutStore></WithoutStore>
<WithoutStore />
);
};

Expand All @@ -91,17 +90,13 @@ export function renderWithProviderAndHistory(
const Wrapper = ({ children }) => {
const WithoutStore = () => (
<Router history={history}>
<CompatRouter>
<I18nProvider currentLocale="en" current={en} en={en}>
<LegacyI18nProvider>
<MetaMetricsContext.Provider value={mockTrackEvent}>
<LegacyMetaMetricsProvider>
{children}
</LegacyMetaMetricsProvider>
</MetaMetricsContext.Provider>
</LegacyI18nProvider>
</I18nProvider>
</CompatRouter>
<I18nProvider currentLocale="en" current={en} en={en}>
<LegacyI18nProvider>
<MetaMetricsContext.Provider value={mockTrackEvent}>
<LegacyMetaMetricsProvider>{children}</LegacyMetaMetricsProvider>
</MetaMetricsContext.Provider>
</LegacyI18nProvider>
</I18nProvider>
</Router>
);
return store ? (
Expand Down
13 changes: 5 additions & 8 deletions test/lib/render-helpers-navigate.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ import { render } from '@testing-library/react';
import { renderHook } from '@testing-library/react-hooks';
import { userEvent } from '@testing-library/user-event';
import { MemoryRouter } from 'react-router-dom';
import { CompatRouter } from 'react-router-dom-v5-compat';
import PropTypes from 'prop-types';
import configureStore from '../../ui/store/store';
import { I18nContext, LegacyI18nProvider } from '../../ui/contexts/i18n';
Expand Down Expand Up @@ -44,13 +43,11 @@ function createProviderWrapper(store, pathname = '/') {
const Wrapper = ({ children }) => {
const container = (
<MemoryRouter initialEntries={[pathname]}>
<CompatRouter>
<I18nProvider currentLocale="en" current={en} en={en}>
<LegacyI18nProvider>
<LegacyMetaMetricsProvider>{children}</LegacyMetaMetricsProvider>
</LegacyI18nProvider>
</I18nProvider>
</CompatRouter>
<I18nProvider currentLocale="en" current={en} en={en}>
<LegacyI18nProvider>
<LegacyMetaMetricsProvider>{children}</LegacyMetaMetricsProvider>
</LegacyI18nProvider>
</I18nProvider>
</MemoryRouter>
);

Expand Down
9 changes: 3 additions & 6 deletions ui/components/app/alerts/alerts.js
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
import React from 'react';
import { useSelector } from 'react-redux';
import PropTypes from 'prop-types';
import { useNavigate } from 'react-router-dom';

import { alertIsOpen as invalidCustomNetworkAlertIsOpen } from '../../../ducks/alerts/invalid-custom-network';
import InvalidCustomNetworkAlert from './invalid-custom-network-alert';

const Alerts = ({ navigate }) => {
const Alerts = () => {
const navigate = useNavigate();
const _invalidCustomNetworkAlertIsOpen = useSelector(
invalidCustomNetworkAlertIsOpen,
);
Expand All @@ -17,8 +18,4 @@ const Alerts = ({ navigate }) => {
return null;
};

Alerts.propTypes = {
navigate: PropTypes.func.isRequired,
};

export default Alerts;
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import { fireEvent } from '@testing-library/react';
import configureMockStore from 'redux-mock-store';

import { tick } from '../../../../../test/lib/timer-helpers';
import { renderWithProvider } from '../../../../../test/lib/render-helpers';
import { renderWithProvider } from '../../../../../test/lib/render-helpers-navigate';

import * as actions from '../../../../store/actions';
import { CHAIN_IDS } from '../../../../../shared/constants/network';
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,9 @@ import { createMockInternalAccount } from '../../../../../../test/jest/mocks';
import AssetListControlBar from './asset-list-control-bar';

const mockUseNavigate = jest.fn();
jest.mock('react-router-dom-v5-compat', () => {
jest.mock('react-router-dom', () => {
return {
...jest.requireActual('react-router-dom-v5-compat'),
...jest.requireActual('react-router-dom'),
useNavigate: () => mockUseNavigate,
};
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import React, {
useCallback,
} from 'react';
import { useDispatch, useSelector } from 'react-redux';
import { useNavigate } from 'react-router-dom-v5-compat';
import { useNavigate } from 'react-router-dom';
import {
Hex,
isStrictHexString,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,9 +30,9 @@ jest.mock('../../../../../helpers/utils/util', () => ({
jest.mock('copy-to-clipboard');

const mockUseNavigate = jest.fn();
jest.mock('react-router-dom-v5-compat', () => {
jest.mock('react-router-dom', () => {
return {
...jest.requireActual('react-router-dom-v5-compat'),
...jest.requireActual('react-router-dom'),
useNavigate: () => mockUseNavigate,
};
});
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import React, { useEffect, useContext } from 'react';
import { useDispatch, useSelector } from 'react-redux';
import { useNavigate } from 'react-router-dom-v5-compat';
import { useNavigate } from 'react-router-dom';
import { isEqual } from 'lodash';
import { getTokenTrackerLink, getAccountLink } from '@metamask/etherscan-link';
import { Nft } from '@metamask/assets-controllers';
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,9 +23,9 @@ const mockAsset = nfts[0].address;
const mockId = nfts[0].tokenId;

const mockUseNavigate = jest.fn();
jest.mock('react-router-dom-v5-compat', () => {
jest.mock('react-router-dom', () => {
return {
...jest.requireActual('react-router-dom-v5-compat'),
...jest.requireActual('react-router-dom'),
useNavigate: () => mockUseNavigate,
useNavigationType: () => 'PUSH',
};
Expand Down
19 changes: 3 additions & 16 deletions ui/components/app/assets/nfts/nft-details/nft-full-image.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import React, { useCallback, useEffect, useState } from 'react';
import { useSelector } from 'react-redux';
import { useNavigate, useNavigationType } from 'react-router-dom-v5-compat';
import { useNavigate, useNavigationType, useParams } from 'react-router-dom';
import { Nft } from '@metamask/assets-controllers';
import { toHex } from '@metamask/controller-utils';
import { getNftImage, getNftImageAlt } from '../../../../../helpers/utils/nfts';
Expand Down Expand Up @@ -35,24 +35,11 @@ import {
PREVIOUS_ROUTE,
} from '../../../../../helpers/constants/routes';

type NftFullImageProps = {
params?: {
asset?: string;
id?: string;
};
};

/**
* Component displaying full NFT image
*
* @param options0 - Component props
* @param options0.params - Route parameters including asset and id
*/
// TODO: Fix in https://github.com/MetaMask/metamask-extension/issues/31860
// eslint-disable-next-line @typescript-eslint/naming-convention
export default function NftFullImage({ params }: NftFullImageProps) {
export default function NftFullImage() {
const t = useI18nContext();
const { asset, id } = params ?? {};
const { asset, id } = useParams<{ asset: string; id: string }>();
const allNfts = useSelector(getAllNfts);
const nfts = Object.values(allNfts).flat() as Nft[];
const nft = nfts.find(
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import React from 'react';
import PropTypes from 'prop-types';
import { useNavigate } from 'react-router-dom-v5-compat';
import { useNavigate } from 'react-router-dom';
import { BannerAlert } from '../../../../component-library';
import { useI18nContext } from '../../../../../hooks/useI18nContext';
import { SECURITY_ROUTE } from '../../../../../helpers/constants/routes';
Expand Down
2 changes: 1 addition & 1 deletion ui/components/app/assets/nfts/nfts-tab/nfts-tab.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import React, { useEffect } from 'react';
import { useSelector } from 'react-redux';
import { useNavigate } from 'react-router-dom-v5-compat';
import { useNavigate } from 'react-router-dom';
import { toHex } from '@metamask/controller-utils';
import {
AlignItems,
Expand Down
4 changes: 2 additions & 2 deletions ui/components/app/assets/token-cell/token-cell.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -49,9 +49,9 @@ jest.mock('../../../../hooks/useIsOriginalTokenSymbol', () => {
});

const mockUseNavigate = jest.fn();
jest.mock('react-router-dom-v5-compat', () => {
jest.mock('react-router-dom', () => {
return {
...jest.requireActual('react-router-dom-v5-compat'),
...jest.requireActual('react-router-dom'),
useNavigate: () => mockUseNavigate,
};
});
Expand Down
2 changes: 1 addition & 1 deletion ui/components/app/assets/token-cell/token-cell.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import React, { useMemo, useState } from 'react';
import { useDispatch } from 'react-redux';
import { useNavigate } from 'react-router-dom-v5-compat';
import { useNavigate } from 'react-router-dom';
import { useTokenDisplayInfo } from '../hooks';
import {
ButtonSecondary,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,8 +32,8 @@ jest.mock('react-redux', () => {
});

const mockUseLocation = jest.fn();
jest.mock('react-router-dom-v5-compat', () => ({
...jest.requireActual('react-router-dom-v5-compat'),
jest.mock('react-router-dom', () => ({
...jest.requireActual('react-router-dom'),
useLocation: () => mockUseLocation(),
}));

Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import React, { useContext, useMemo, useState } from 'react';
import { useLocation } from 'react-router-dom-v5-compat';
import { useLocation } from 'react-router-dom';
import { useDispatch, useSelector } from 'react-redux';
import {
Display,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import {
EditGasModes,
GasEstimateTypes,
} from '../../../../shared/constants/gas';
import { renderWithProvider } from '../../../../test/lib/render-helpers';
import { renderWithProvider } from '../../../../test/lib/render-helpers-navigate';
import mockEstimates from '../../../../test/data/mock-estimates.json';
import mockState from '../../../../test/data/mock-state.json';
import { GasFeeContextProvider } from '../../../contexts/gasFee';
Expand Down
2 changes: 1 addition & 1 deletion ui/components/app/connected-sites-list/connected-snaps.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import React, { useState } from 'react';
import PropTypes from 'prop-types';
import { useNavigate } from 'react-router-dom-v5-compat';
import { useNavigate } from 'react-router-dom';
import { useDispatch, useSelector } from 'react-redux';
import { Box, IconName, IconSize, Text } from '../../component-library';
import { useI18nContext } from '../../../hooks/useI18nContext';
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import React, { Fragment, useContext } from 'react';
import { useNavigate } from 'react-router-dom-v5-compat';
import { useNavigate } from 'react-router-dom';
import PropTypes from 'prop-types';
import { I18nContext } from '../../../../contexts/i18n';
import { Button, ButtonVariant } from '../../../component-library';
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import React from 'react';
import PropTypes from 'prop-types';
import { useNavigate } from 'react-router-dom-v5-compat';
import { useNavigate } from 'react-router-dom';
import { useDispatch, useSelector } from 'react-redux';
import Modal from '../../modal';
import { Text } from '../../../component-library/text';
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import React from 'react';
import { fireEvent } from '@testing-library/react';
import configureMockStore from 'redux-mock-store';
import thunk from 'redux-thunk';
import { renderWithProvider } from '../../../../../test/lib/render-helpers';
import { renderWithProvider } from '../../../../../test/lib/render-helpers-navigate';
import CustomizeNonce from '.';

const mockHideModal = jest.fn();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,9 +27,9 @@ jest.mock('react-redux', () => ({
}));

const mockUseNavigate = jest.fn();
jest.mock('react-router-dom-v5-compat', () => {
jest.mock('react-router-dom', () => {
return {
...jest.requireActual('react-router-dom-v5-compat'),
...jest.requireActual('react-router-dom'),
useNavigate: () => mockUseNavigate,
};
});
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import React, { useContext } from 'react';
import { useDispatch, useSelector } from 'react-redux';
import { useNavigate } from 'react-router-dom-v5-compat';
import { useNavigate } from 'react-router-dom';
import { BACKUPANDSYNC_FEATURES } from '@metamask/profile-sync-controller/user-storage';
import { useModalProps } from '../../../../../hooks/useModalProps';
import {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import React, {
useMemo,
} from 'react';
import { useDispatch } from 'react-redux';
import { useNavigate } from 'react-router-dom-v5-compat';
import { useNavigate } from 'react-router-dom';

import { captureException } from '../../../../../../shared/lib/sentry';

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import React, { useContext, useEffect, useState } from 'react';
import { useSelector } from 'react-redux';
import { useNavigate } from 'react-router-dom-v5-compat';
import { useNavigate } from 'react-router-dom';
import { I18nContext } from '../../../../contexts/i18n';
import { useModalProps } from '../../../../hooks/useModalProps';
import { useMetamaskNotificationsContext } from '../../../../contexts/metamask-notifications/metamask-notifications';
Expand Down
2 changes: 1 addition & 1 deletion ui/components/app/name/name.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import * as React from 'react';
import { NameType } from '@metamask/name-controller';
import { fireEvent } from '@testing-library/react';
import configureStore from 'redux-mock-store';
import { renderWithProvider } from '../../../../test/lib/render-helpers';
import { renderWithProvider } from '../../../../test/lib/render-helpers-navigate';
import { MetaMetricsContext } from '../../../contexts/metametrics';
import {
MetaMetricsEventCategory,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import React from 'react';
import { fireEvent } from '@testing-library/react';
import { useNavigate } from 'react-router-dom-v5-compat';
import { useNavigate } from 'react-router-dom';

Check failure on line 3 in ui/components/app/network-connection-banner/network-connection-banner.test.tsx

View workflow job for this annotation

GitHub Actions / test-lint / Test lint

'useNavigate' is defined but never used
import { renderWithProvider } from '../../../../test/lib/render-helpers';

import { useNetworkConnectionBanner } from '../../../hooks/useNetworkConnectionBanner';
Expand All @@ -22,22 +22,21 @@
useNetworkConnectionBanner: jest.fn(),
}));

jest.mock('react-router-dom-v5-compat', () => ({
useNavigate: jest.fn(),
const mockUseNavigate = jest.fn();
jest.mock('react-router-dom', () => ({
useNavigate: mockUseNavigate,
}));

jest.mock('../../../hooks/useTheme', () => ({
useTheme: () => 'light',
}));

const mockUseNetworkConnectionBanner = jest.mocked(useNetworkConnectionBanner);
const mockUseNavigate = jest.mocked(useNavigate);
const mockSetEditedNetwork = jest.mocked(setEditedNetwork);

describe('NetworkConnectionBanner', () => {
beforeEach(() => {
jest.clearAllMocks();
mockUseNavigate.mockReturnValue(jest.fn());
});

describe('when the status of the banner is "degraded"', () => {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import React, { useCallback } from 'react';
import { useNavigate } from 'react-router-dom-v5-compat';
import { useNavigate } from 'react-router-dom';
import { useDispatch } from 'react-redux';
import { useI18nContext } from '../../../hooks/useI18nContext';
import {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import React from 'react';
import { useDispatch } from 'react-redux';
import { useNavigate } from 'react-router-dom-v5-compat';
import { useNavigate } from 'react-router-dom';
import { useI18nContext } from '../../../hooks/useI18nContext';
import {
AlignItems,
Expand Down
Loading
Loading