Skip to content

Commit 4671a6e

Browse files
authored
Force-toggle testnets visibility in network switcher (#3793)
This PR moves the testnet visibility setting to the preference service, and sets a migration to enable it on all existing and new installs. ## Testing - [ ] On a new install, check testnets shows up by default on network switcher - [ ] On existing install, after update testnets should show up Latest build: [extension-builds-3793](https://github.com/tahowallet/extension/suites/35160394180/artifacts/2686423977) (as of Tue, 04 Mar 2025 05:05:23 GMT).
2 parents 09361e2 + e56f90d commit 4671a6e

File tree

6 files changed

+77
-10
lines changed

6 files changed

+77
-10
lines changed

background/redux-slices/ui.ts

+20-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { createSlice, createSelector } from "@reduxjs/toolkit"
22
import Emittery from "emittery"
33
import { AddressOnNetwork } from "../accounts"
4-
import { ETHEREUM } from "../constants"
4+
import { ETHEREUM, TEST_NETWORK_BY_CHAIN_ID } from "../constants"
55
import { AnalyticsEvent, OneTimeAnalyticsEvent } from "../lib/posthog"
66
import { EVMNetwork } from "../networks"
77
import { AnalyticsPreferences, DismissableItem } from "../services/preferences"
@@ -11,11 +11,12 @@ import { AccountState, addAddressNetwork } from "./accounts"
1111
import { createBackgroundAsyncThunk } from "./utils"
1212
import { UNIXTime } from "../types"
1313
import { DEFAULT_AUTOLOCK_INTERVAL } from "../services/preferences/defaults"
14+
import type { RootState } from "."
1415

1516
export const defaultSettings = {
1617
hideDust: false,
1718
defaultWallet: false,
18-
showTestNetworks: false,
19+
showTestNetworks: true,
1920
showNotifications: undefined,
2021
collectAnalytics: false,
2122
showAnalyticsNotification: false,
@@ -77,6 +78,7 @@ export type Events = {
7778
updateAnalyticsPreferences: Partial<AnalyticsPreferences>
7879
addCustomNetworkResponse: [string, boolean]
7980
updateAutoLockInterval: number
81+
toggleShowTestNetworks: boolean
8082
}
8183

8284
export const emitter = new Emittery<Events>()
@@ -392,6 +394,22 @@ export const setSelectedNetwork = createBackgroundAsyncThunk(
392394
},
393395
)
394396

397+
export const toggleShowTestNetworks = createBackgroundAsyncThunk(
398+
"ui/toggleShowTestNetworks",
399+
async (value: boolean, { dispatch, getState }) => {
400+
const state = getState() as RootState
401+
402+
const currentNetwork = state.ui.selectedAccount.network
403+
404+
// If user is on one of the built-in test networks, don't leave them stranded
405+
if (TEST_NETWORK_BY_CHAIN_ID.has(currentNetwork.chainID)) {
406+
dispatch(setSelectedNetwork(ETHEREUM))
407+
}
408+
409+
await emitter.emit("toggleShowTestNetworks", value)
410+
},
411+
)
412+
395413
export const refreshBackgroundPage = createBackgroundAsyncThunk(
396414
"ui/refreshBackgroundPage",
397415
async () => {

background/services/preferences/db.ts

+24
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ export type Preferences = {
6565
analytics: AnalyticsPreferences
6666
autoLockInterval: UNIXTime
6767
shouldShowNotifications: boolean
68+
showTestNetworks: boolean
6869
}
6970

7071
/**
@@ -439,6 +440,19 @@ export class PreferenceDatabase extends Dexie {
439440
}),
440441
)
441442

443+
this.version(22).upgrade((tx) =>
444+
tx
445+
.table("preferences")
446+
.toCollection()
447+
.modify((storedPreferences: Omit<Preferences, "showTestNetworks">) => {
448+
const update: Partial<Preferences> = {
449+
showTestNetworks: true,
450+
}
451+
452+
Object.assign(storedPreferences, update)
453+
}),
454+
)
455+
442456
// This is the old version for populate
443457
// https://dexie.org/docs/Dexie/Dexie.on.populate-(old-version)
444458
// The this does not behave according the new docs, but works
@@ -468,6 +482,16 @@ export class PreferenceDatabase extends Dexie {
468482
})
469483
}
470484

485+
async setShowTestNetworks(newValue: boolean): Promise<void> {
486+
await this.preferences
487+
.toCollection()
488+
.modify((storedPreferences: Preferences) => {
489+
const update: Partial<Preferences> = { showTestNetworks: newValue }
490+
491+
Object.assign(storedPreferences, update)
492+
})
493+
}
494+
471495
async setShouldShowNotifications(newValue: boolean): Promise<void> {
472496
await this.preferences
473497
.toCollection()

background/services/preferences/defaults.ts

+1
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ const defaultPreferences = {
3535
},
3636
autoLockInterval: DEFAULT_AUTOLOCK_INTERVAL,
3737
shouldShowNotifications: false,
38+
showTestNetworks: true,
3839
}
3940

4041
export default defaultPreferences

background/services/preferences/index.ts

+14
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,7 @@ interface Events extends ServiceLifecycleEvents {
109109
initializeSelectedAccount: AddressOnNetwork
110110
initializeShownDismissableItems: DismissableItem[]
111111
initializeNotificationsPreferences: boolean
112+
initializeShowTestNetworks: boolean
112113
updateAnalyticsPreferences: AnalyticsPreferences
113114
addressBookEntryModified: AddressBookEntry
114115
updatedSignerSettings: AccountSignerSettings[]
@@ -162,6 +163,11 @@ export default class PreferenceService extends BaseService<Events> {
162163
"initializeNotificationsPreferences",
163164
await this.getShouldShowNotificationsPreferences(),
164165
)
166+
167+
this.emitter.emit(
168+
"initializeShowTestNetworks",
169+
await this.getShowTestNetworks(),
170+
)
165171
}
166172

167173
protected override async internalStopService(): Promise<void> {
@@ -290,6 +296,14 @@ export default class PreferenceService extends BaseService<Events> {
290296
return (await this.db.getPreferences())?.currency
291297
}
292298

299+
async setShowTestNetworks(value: boolean): Promise<void> {
300+
await this.db.setShowTestNetworks(value)
301+
}
302+
303+
async getShowTestNetworks(): Promise<boolean> {
304+
return (await this.db.getPreferences()).showTestNetworks
305+
}
306+
293307
async getTokenListPreferences(): Promise<TokenListPreferences> {
294308
return (await this.db.getPreferences())?.tokenLists
295309
}

background/services/redux/index.ts

+14-4
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@ import {
8282
dismissableItemMarkedAsShown,
8383
MezoClaimStatus,
8484
updateCampaignState,
85+
toggleTestNetworks,
8586
} from "../../redux-slices/ui"
8687
import {
8788
estimatedFeesPerGas,
@@ -1354,16 +1355,25 @@ export default class ReduxService extends BaseService<never> {
13541355
},
13551356
)
13561357

1358+
this.preferenceService.emitter.on(
1359+
"initializeShowTestNetworks",
1360+
async (showTestNetworks: boolean) => {
1361+
await this.store.dispatch(toggleTestNetworks(showTestNetworks))
1362+
},
1363+
)
1364+
1365+
uiSliceEmitter.on("toggleShowTestNetworks", async (value) => {
1366+
await this.preferenceService.setShowTestNetworks(value)
1367+
await this.store.dispatch(toggleTestNetworks(value))
1368+
})
1369+
13571370
this.preferenceService.emitter.on(
13581371
"initializeSelectedAccount",
13591372
async (dbAddressNetwork: AddressOnNetwork) => {
13601373
if (dbAddressNetwork) {
13611374
// Wait until chain service starts and populates supported networks
13621375
await this.chainService.started()
1363-
// TBD: naming the normal reducer and async thunks
1364-
// Initialize redux from the db
1365-
// !!! Important: this action belongs to a regular reducer.
1366-
// NOT to be confused with the setNewCurrentAddress asyncThunk
1376+
13671377
const { address, network } = dbAddressNetwork
13681378
let supportedNetwork = this.chainService.supportedNetworks.find(
13691379
(net) => sameNetwork(network, net),

ui/pages/Settings.tsx

+4-4
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@ import {
88
selectShowNotifications,
99
setShouldShowNotifications,
1010
selectShowTestNetworks,
11-
toggleTestNetworks,
1211
toggleHideBanners,
12+
toggleShowTestNetworks,
1313
selectHideBanners,
1414
selectShowUnverifiedAssets,
1515
toggleShowUnverifiedAssets,
@@ -186,8 +186,8 @@ export default function Settings(): ReactElement {
186186
)
187187
}
188188

189-
const toggleShowTestNetworks = (defaultWalletValue: boolean) => {
190-
dispatch(toggleTestNetworks(defaultWalletValue))
189+
const toggleShowTestnets = (defaultWalletValue: boolean) => {
190+
dispatch(toggleShowTestNetworks(defaultWalletValue))
191191
}
192192

193193
const toggleShowUnverified = (toggleValue: boolean) => {
@@ -243,7 +243,7 @@ export default function Settings(): ReactElement {
243243
title: t("settings.enableTestNetworks"),
244244
component: () => (
245245
<SharedToggleButton
246-
onChange={(toggleValue) => toggleShowTestNetworks(toggleValue)}
246+
onChange={(toggleValue) => toggleShowTestnets(toggleValue)}
247247
value={showTestNetworks}
248248
/>
249249
),

0 commit comments

Comments
 (0)