fix: Ensure that Settings are available if there is a pending approval
Description
This issue shouldn't happen anymore since the STX status page is not displayed anymore, but just in case it would be displayed again I've added this fix.
Changelog
CHANGELOG entry: Ensure that Settings are available if there is a pending approval
Related issues
Fixes: https://github.com/MetaMask/metamask-extension/issues/38477
Manual testing steps
- Follow steps here: https://github.com/MetaMask/metamask-extension/issues/38477
- Settings should be available now
Screenshots/Recordings
Before
After
Pre-merge author checklist
- [ ] I've followed MetaMask Contributor Docs and MetaMask Extension Coding Standards.
- [ ] I've completed the PR template to the best of my ability
- [ ] I’ve included tests if applicable
- [ ] I’ve documented my code using JSDoc format if applicable
- [ ] I’ve applied the right labels on the PR (see labeling guidelines). Not required for external contributors.
Pre-merge reviewer checklist
- [ ] I've manually tested the PR (e.g. pull and build branch, run the app, test code being changed).
- [ ] I confirm that this PR addresses all acceptance criteria described in the ticket it closes and includes the necessary testing evidence such as recordings and or screenshots.
[!NOTE] Exempts
SETTINGS_ROUTEfrom confirmation redirects so Settings remains accessible even with pending approvals.
- Routing/Confirmation Handler (
ui/pages/routes/confirmation-handler.tsx):
- Import and add
SETTINGS_ROUTEtoEXEMPTED_ROUTESto prevent auto-redirects, ensuring Settings stays accessible when approvals are pending.Written by Cursor Bugbot for commit edc89ab08d32f98477667eef055187d728fa2a9f. This will update automatically on new commits. Configure here.
CLA Signature Action: All authors have signed the CLA. You may need to manually re-run the blocking PR check if it doesn't pass in a few minutes.
Builds ready [edc89ab]
- builds: chrome, firefox
- builds (beta): chrome, firefox
- builds (flask): chrome, firefox
- builds (test): chrome, firefox
- builds (test-flask): chrome, firefox
- bundle size: Bundle Size Stats
- user-actions-benchmark: User Actions Stats
- storybook: Storybook
- typescript migration: Dashboard
- all artifacts
UI Startup Metrics (1260 ± 101 ms)
| Platform | BuildType | Page | Metric | Mean (ms) | Min (ms) | Max (ms) | Std Dev (ms) | P 75 (ms) | P 95 (ms) |
|---|---|---|---|---|---|---|---|---|---|
| Chrome | Browserify | Standard Home | uiStartup | 1260 | 1031 | 1477 | 101 | 1331 | 1418 |
| load | 1031 | 862 | 1251 | 86 | 1080 | 1194 | |||
| domContentLoaded | 1024 | 858 | 1244 | 85 | 1070 | 1181 | |||
| domInteractive | 25 | 16 | 127 | 20 | 21 | 83 | |||
| firstPaint | 510 | 95 | 1257 | 390 | 1022 | 1123 | |||
| backgroundConnect | 215 | 195 | 261 | 13 | 222 | 244 | |||
| firstReactRender | 44 | 31 | 145 | 15 | 47 | 71 | |||
| getState | 38 | 17 | 132 | 22 | 41 | 80 | |||
| initialActions | 1 | 0 | 10 | 1 | 1 | 2 | |||
| loadScripts | 816 | 657 | 1015 | 82 | 855 | 980 | |||
| setupStore | 11 | 6 | 28 | 4 | 12 | 19 | |||
| numNetworkReqs | 13 | 6 | 80 | 18 | 6 | 67 | |||
| Browserify | Power User Home | uiStartup | 1916 | 1584 | 2505 | 159 | 1990 | 2216 | |
| load | 1087 | 879 | 1604 | 122 | 1156 | 1273 | |||
| domContentLoaded | 1077 | 870 | 1597 | 122 | 1149 | 1259 | |||
| domInteractive | 32 | 18 | 244 | 29 | 28 | 94 | |||
| firstPaint | 529 | 114 | 1275 | 396 | 1001 | 1227 | |||
| backgroundConnect | 241 | 201 | 643 | 80 | 236 | 533 | |||
| firstReactRender | 47 | 38 | 62 | 5 | 49 | 58 | |||
| getState | 215 | 143 | 745 | 111 | 218 | 305 | |||
| initialActions | 1 | 0 | 3 | 1 | 1 | 2 | |||
| loadScripts | 865 | 673 | 1352 | 119 | 934 | 1044 | |||
| setupStore | 16 | 11 | 42 | 8 | 15 | 37 | |||
| numNetworkReqs | 71 | 58 | 206 | 23 | 67 | 136 | |||
| Webpack | Standard Home | uiStartup | 810 | 676 | 1217 | 86 | 853 | 966 | |
| load | 656 | 566 | 857 | 74 | 707 | 808 | |||
| domContentLoaded | 650 | 562 | 843 | 74 | 702 | 801 | |||
| domInteractive | 26 | 15 | 114 | 20 | 22 | 86 | |||
| firstPaint | 242 | 87 | 817 | 178 | 220 | 704 | |||
| backgroundConnect | 12 | 5 | 53 | 8 | 14 | 29 | |||
| firstReactRender | 50 | 32 | 137 | 26 | 50 | 125 | |||
| getState | 28 | 14 | 63 | 11 | 36 | 47 | |||
| initialActions | 1 | 0 | 3 | 1 | 1 | 2 | |||
| loadScripts | 647 | 560 | 837 | 73 | 700 | 795 | |||
| setupStore | 11 | 5 | 29 | 4 | 12 | 20 | |||
| numNetworkReqs | 13 | 6 | 80 | 19 | 6 | 74 | |||
| Webpack | Power User Home | uiStartup | 1407 | 1080 | 2025 | 194 | 1585 | 1724 | |
| load | 739 | 598 | 1130 | 109 | 833 | 931 | |||
| domContentLoaded | 732 | 591 | 1121 | 108 | 822 | 924 | |||
| domInteractive | 32 | 17 | 142 | 28 | 27 | 115 | |||
| firstPaint | 316 | 97 | 986 | 228 | 385 | 760 | |||
| backgroundConnect | 85 | 8 | 604 | 151 | 82 | 554 | |||
| firstReactRender | 49 | 40 | 69 | 5 | 51 | 58 | |||
| getState | 192 | 145 | 798 | 87 | 189 | 262 | |||
| initialActions | 1 | 0 | 2 | 1 | 1 | 2 | |||
| loadScripts | 728 | 588 | 1112 | 107 | 820 | 916 | |||
| setupStore | 17 | 7 | 52 | 9 | 15 | 37 | |||
| numNetworkReqs | 70 | 58 | 156 | 21 | 66 | 133 | |||
| Firefox | Browserify | Standard Home | uiStartup | 1372 | 1109 | 2410 | 218 | 1445 | 1742 |
| load | 1097 | 910 | 1477 | 99 | 1149 | 1284 | |||
| domContentLoaded | 1097 | 909 | 1472 | 99 | 1143 | 1284 | |||
| domInteractive | 69 | 31 | 160 | 36 | 86 | 138 | |||
| firstPaint | - | - | - | - | - | - | |||
| backgroundConnect | 76 | 22 | 1043 | 134 | 73 | 213 | |||
| firstReactRender | 38 | 30 | 73 | 7 | 39 | 51 | |||
| getState | 15 | 7 | 222 | 26 | 10 | 30 | |||
| initialActions | 1 | 0 | 2 | 1 | 2 | 2 | |||
| loadScripts | 1067 | 893 | 1416 | 92 | 1111 | 1235 | |||
| setupStore | 13 | 6 | 88 | 13 | 11 | 42 | |||
| numNetworkReqs | 15 | 6 | 79 | 21 | 7 | 75 | |||
| Browserify | Power User Home | uiStartup | 2604 | 1595 | 3740 | 537 | 3008 | 3364 | |
| load | 1614 | 989 | 2548 | 475 | 2051 | 2324 | |||
| domContentLoaded | 1614 | 989 | 2542 | 475 | 2051 | 2324 | |||
| domInteractive | 187 | 30 | 1027 | 291 | 149 | 966 | |||
| firstPaint | - | - | - | - | - | - | |||
| backgroundConnect | 218 | 25 | 1158 | 290 | 199 | 1073 | |||
| firstReactRender | 56 | 34 | 108 | 14 | 58 | 92 | |||
| getState | 130 | 70 | 325 | 47 | 160 | 225 | |||
| initialActions | 2 | 0 | 37 | 4 | 2 | 3 | |||
| loadScripts | 1495 | 974 | 2305 | 434 | 1949 | 2247 | |||
| setupStore | 57 | 5 | 1000 | 123 | 48 | 265 | |||
| numNetworkReqs | 74 | 47 | 135 | 21 | 81 | 119 | |||
| Webpack | Standard Home | uiStartup | 1644 | 1275 | 3216 | 311 | 1737 | 2213 | |
| load | 1350 | 1105 | 2842 | 247 | 1385 | 1607 | |||
| domContentLoaded | 1349 | 1105 | 2841 | 247 | 1385 | 1607 | |||
| domInteractive | 74 | 28 | 213 | 41 | 99 | 142 | |||
| firstPaint | - | - | - | - | - | - | |||
| backgroundConnect | 65 | 18 | 231 | 47 | 91 | 173 | |||
| firstReactRender | 42 | 33 | 84 | 7 | 43 | 54 | |||
| getState | 20 | 7 | 162 | 29 | 15 | 111 | |||
| initialActions | 1 | 0 | 7 | 1 | 1 | 2 | |||
| loadScripts | 1316 | 1089 | 2739 | 235 | 1352 | 1563 | |||
| setupStore | 21 | 5 | 205 | 32 | 15 | 95 | |||
| numNetworkReqs | 15 | 6 | 84 | 21 | 8 | 78 | |||
| Webpack | Power User Home | uiStartup | 2730 | 1728 | 4228 | 561 | 3089 | 3597 | |
| load | 1925 | 1117 | 2877 | 504 | 2355 | 2574 | |||
| domContentLoaded | 1925 | 1117 | 2877 | 504 | 2354 | 2573 | |||
| domInteractive | 263 | 29 | 1100 | 366 | 241 | 987 | |||
| firstPaint | - | - | - | - | - | - | |||
| backgroundConnect | 123 | 26 | 403 | 79 | 180 | 262 | |||
| firstReactRender | 55 | 37 | 122 | 14 | 59 | 87 | |||
| getState | 144 | 71 | 1060 | 107 | 172 | 236 | |||
| initialActions | 2 | 0 | 38 | 5 | 2 | 6 | |||
| loadScripts | 1862 | 1099 | 2855 | 480 | 2263 | 2531 | |||
| setupStore | 41 | 4 | 433 | 75 | 36 | 223 | |||
| numNetworkReqs | 70 | 47 | 127 | 21 | 69 | 121 |
📊 Page Load Benchmark Results
Current Commit: edc89ab | Date: 12/10/2025
📄 Localhost MetaMask Test Dapp
Samples: 100
Summary
- pageLoadTime-> current mean value: 981ms (±40ms) 🟢 | historical mean value: 1.04s ⬇️ (historical data)
- domContentLoaded-> current mean value: 679ms (±37ms) 🟢 | historical mean value: 724ms ⬇️ (historical data)
- firstContentfulPaint-> current mean value: 75ms (±12ms) 🟢 | historical mean value: 78ms ⬇️ (historical data)
📈 Detailed Results
| Metric | Mean | Std Dev | Min | Max | P95 | P99 |
|---|---|---|---|---|---|---|
| pageLoadTime | 981ms | 40ms | 954ms | 1.27s | 1.03s | 1.27s |
| domContentLoaded | 679ms | 37ms | 661ms | 949ms | 720ms | 949ms |
| firstPaint | 75ms | 12ms | 60ms | 180ms | 84ms | 180ms |
| firstContentfulPaint | 75ms | 12ms | 60ms | 180ms | 84ms | 180ms |
| largestContentfulPaint | 0ms | 0ms | 0ms | 0ms | 0ms | 0ms |
Bundle size diffs [🚨 Warning! Bundle size has increased!]
- background: 58 Bytes (0%)
- ui: 17 Bytes (0%)
- common: 20 Bytes (0%)
For some reason Settings are disabled when there is at least one unapproved transaction: https://github.com/MetaMask/metamask-extension/blob/main/ui/components/multichain/global-menu/global-menu.tsx#L535
It was added in this PR: https://github.com/MetaMask/metamask-extension/pull/19522/files#diff-2d29e8cea9f9d45ebb08ac4907e62eaf8b5212123d41473872b5759be8d68626R206
A fix should be implemented by the team that owns the menu. Designers should decide if we should either highlight a currently disabled Settings menu item and explain why it's disabled (unapproved transactions) or just enable it.