Skip to content

Commit 79dc668

Browse files
cursoragentn3ps
andcommitted
refactor: migrate from HashRouter to createHashRouter data router
Replace the legacy component-based HashRouter with the data router API (createHashRouter + RouterProvider). This unlocks access to loader, action, errorElement, native lazy, and useNavigation() for future use. Changes: - ui/pages/index.js: Replace HashRouter with createHashRouter + RouterProvider. Move context providers into a root layout route element (AppProviders) that renders Outlet. Error boundary fallback keeps a standalone HashRouter for the error page. - ui/pages/routes/routes.component.tsx: Extract routeConfig to module level (removes useMemo with empty deps). Replace useRoutes() with Outlet — the data router handles route matching internally. - ui/pages/routes/index.js: Re-export routeConfig for use by index.js. Test helpers keep using MemoryRouter (recommended for unit tests by React Router docs). No test file changes needed. Co-authored-by: Francis Nepomuceno <n3ps@users.noreply.github.com>
1 parent 2ddb15e commit 79dc668

File tree

3 files changed

+444
-421
lines changed

3 files changed

+444
-421
lines changed

ui/pages/index.js

Lines changed: 52 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,12 @@
11
import React, { PureComponent } from 'react';
22
import PropTypes from 'prop-types';
33
import { Provider } from 'react-redux';
4-
import { HashRouter } from 'react-router-dom';
4+
import {
5+
HashRouter,
6+
Outlet,
7+
RouterProvider,
8+
createHashRouter,
9+
} from 'react-router-dom';
510
import { QueryClientProvider } from '@tanstack/react-query';
611
import { captureException } from '../../shared/lib/sentry';
712
import { I18nProvider, LegacyI18nProvider } from '../contexts/i18n';
@@ -18,7 +23,51 @@ import { queryClient } from '../contexts/query-client';
1823
import { HardwareWalletErrorProvider } from '../contexts/hardware-wallets';
1924
import ErrorPage from './error-page/error-page.component';
2025

21-
import Routes from './routes';
26+
import Routes, { routeConfig } from './routes';
27+
28+
/**
29+
* Root layout route element containing all context providers.
30+
* Renders <Outlet /> which is replaced by the matched child route (<Routes />).
31+
*/
32+
function AppProviders() {
33+
return (
34+
<MetaMetricsProvider>
35+
<LegacyMetaMetricsProvider>
36+
<I18nProvider>
37+
<LegacyI18nProvider>
38+
<QueryClientProvider client={queryClient}>
39+
<AssetPollingProvider>
40+
<MetamaskIdentityProvider>
41+
<MetamaskNotificationsProvider>
42+
<HardwareWalletErrorProvider>
43+
<ShieldSubscriptionProvider>
44+
<RiveWasmProvider>
45+
<Outlet />
46+
</RiveWasmProvider>
47+
</ShieldSubscriptionProvider>
48+
</HardwareWalletErrorProvider>
49+
</MetamaskNotificationsProvider>
50+
</MetamaskIdentityProvider>
51+
</AssetPollingProvider>
52+
</QueryClientProvider>
53+
</LegacyI18nProvider>
54+
</I18nProvider>
55+
</LegacyMetaMetricsProvider>
56+
</MetaMetricsProvider>
57+
);
58+
}
59+
60+
const router = createHashRouter([
61+
{
62+
element: <AppProviders />,
63+
children: [
64+
{
65+
element: <Routes />,
66+
children: routeConfig,
67+
},
68+
],
69+
},
70+
]);
2271

2372
class Index extends PureComponent {
2473
state = {};
@@ -53,31 +102,7 @@ class Index extends PureComponent {
53102

54103
return (
55104
<Provider store={store}>
56-
<HashRouter>
57-
<MetaMetricsProvider>
58-
<LegacyMetaMetricsProvider>
59-
<I18nProvider>
60-
<LegacyI18nProvider>
61-
<QueryClientProvider client={queryClient}>
62-
<AssetPollingProvider>
63-
<MetamaskIdentityProvider>
64-
<MetamaskNotificationsProvider>
65-
<HardwareWalletErrorProvider>
66-
<ShieldSubscriptionProvider>
67-
<RiveWasmProvider>
68-
<Routes />
69-
</RiveWasmProvider>
70-
</ShieldSubscriptionProvider>
71-
</HardwareWalletErrorProvider>
72-
</MetamaskNotificationsProvider>
73-
</MetamaskIdentityProvider>
74-
</AssetPollingProvider>
75-
</QueryClientProvider>
76-
</LegacyI18nProvider>
77-
</I18nProvider>
78-
</LegacyMetaMetricsProvider>
79-
</MetaMetricsProvider>
80-
</HashRouter>
105+
<RouterProvider router={router} />
81106
</Provider>
82107
);
83108
}

ui/pages/routes/index.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
11
export { default } from './routes.component';
2+
export { routeConfig } from './routes.component';

0 commit comments

Comments
 (0)