Skip to content

Commit 75516c9

Browse files
chore: improvements
1 parent d3f4859 commit 75516c9

File tree

6 files changed

+87
-31
lines changed

6 files changed

+87
-31
lines changed

packages/core/src/__tests__/controllers/NetworkController.test.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ const client: NetworkControllerClient = {
1919
const initialState = {
2020
_client: client,
2121
supportsAllNetworks: true,
22-
isDefaultCaipNetwork: false,
2322
smartAccountEnabledNetworks: []
2423
};
2524

@@ -65,7 +64,7 @@ describe('NetworkController', () => {
6564
it('should update state correctly on setDefaultCaipNetwork()', () => {
6665
NetworkController.setDefaultCaipNetwork(caipNetwork);
6766
expect(NetworkController.state.caipNetwork).toEqual(caipNetwork);
68-
expect(NetworkController.state.isDefaultCaipNetwork).toEqual(true);
67+
expect(NetworkController.state.defaultCaipNetwork).toEqual(caipNetwork);
6968
});
7069

7170
it('should reset state correctly when default caip network is true', () => {

packages/core/src/controllers/NetworkController.ts

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,9 @@ export interface NetworkControllerClient {
1515

1616
export interface NetworkControllerState {
1717
supportsAllNetworks: boolean;
18-
isDefaultCaipNetwork: boolean;
1918
_client?: NetworkControllerClient;
2019
caipNetwork?: CaipNetwork;
20+
defaultCaipNetwork?: CaipNetwork;
2121
requestedCaipNetworks?: CaipNetwork[];
2222
approvedCaipNetworkIds?: CaipNetworkId[];
2323
smartAccountEnabledNetworks: number[];
@@ -26,7 +26,7 @@ export interface NetworkControllerState {
2626
// -- State --------------------------------------------- //
2727
const state = proxy<NetworkControllerState>({
2828
supportsAllNetworks: true,
29-
isDefaultCaipNetwork: false,
29+
defaultCaipNetwork: undefined,
3030
smartAccountEnabledNetworks: []
3131
});
3232

@@ -53,7 +53,7 @@ export const NetworkController = {
5353

5454
setDefaultCaipNetwork(caipNetwork: NetworkControllerState['caipNetwork']) {
5555
state.caipNetwork = caipNetwork;
56-
state.isDefaultCaipNetwork = true;
56+
state.defaultCaipNetwork = caipNetwork;
5757
PublicStateController.set({ selectedNetworkId: caipNetwork?.id });
5858
},
5959

@@ -110,17 +110,15 @@ export const NetworkController = {
110110
},
111111

112112
resetNetwork() {
113-
if (!state.isDefaultCaipNetwork) {
114-
state.caipNetwork = undefined;
115-
}
113+
state.caipNetwork = state.defaultCaipNetwork || undefined;
116114
state.approvedCaipNetworkIds = undefined;
117115
state.supportsAllNetworks = true;
118116
state.smartAccountEnabledNetworks = [];
119117
},
120118

121119
isActiveNetworkInRequestedNetworks() {
122120
if (!state.caipNetwork || !state.requestedCaipNetworks?.length) {
123-
return true; // No active network or no requested networks, so no validation needed
121+
return false;
124122
}
125123

126124
return state.requestedCaipNetworks.some(network => network.id === state.caipNetwork?.id);

packages/scaffold/src/modal/w3m-modal/index.tsx

Lines changed: 38 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { useSnapshot } from 'valtio';
2-
import { useCallback, useEffect } from 'react';
2+
import { useCallback, useEffect, useState } from 'react';
33
import { useWindowDimensions, StatusBar } from 'react-native';
44
import Modal from 'react-native-modal';
55
import { Card, ThemeProvider } from '@reown/appkit-ui-react-native';
@@ -16,7 +16,8 @@ import {
1616
TransactionsController,
1717
type CaipAddress,
1818
type AppKitFrameProvider,
19-
ThemeController
19+
ThemeController,
20+
NetworkController
2021
} from '@reown/appkit-core-react-native';
2122
import { SIWEController } from '@reown/appkit-siwe-react-native';
2223

@@ -30,7 +31,9 @@ export function AppKit() {
3031
const { open, loading } = useSnapshot(ModalController.state);
3132
const { connectors, connectedConnector } = useSnapshot(ConnectorController.state);
3233
const { caipAddress, isConnected } = useSnapshot(AccountController.state);
34+
const { caipNetwork } = useSnapshot(NetworkController.state);
3335
const { themeMode, themeVariables } = useSnapshot(ThemeController.state);
36+
const [isNetworkStateStable, setIsNetworkStateStable] = useState(false);
3437
const { height } = useWindowDimensions();
3538
const { isLandscape } = useCustomDimensions();
3639
const portraitHeight = height - 120;
@@ -114,6 +117,39 @@ export function AppKit() {
114117
onNewAddress(caipAddress);
115118
}, [caipAddress, onNewAddress]);
116119

120+
useEffect(() => {
121+
if (isConnected) {
122+
const timer = setTimeout(() => {
123+
setIsNetworkStateStable(true);
124+
}, 750); // Stability period. Sometimes the network state updates at init
125+
126+
return () => {
127+
clearTimeout(timer);
128+
};
129+
} else {
130+
setIsNetworkStateStable(false);
131+
132+
return () => {};
133+
}
134+
}, [isConnected]);
135+
136+
useEffect(() => {
137+
if (isConnected && caipNetwork && isNetworkStateStable) {
138+
const isNetworkSupported = NetworkController.isActiveNetworkInRequestedNetworks();
139+
if (!isNetworkSupported) {
140+
const currentView = RouterController.state.view;
141+
// Only push/open if not already on UnsupportedChain or actively choosing a network
142+
if (currentView !== 'UnsupportedChain' && currentView !== 'Networks') {
143+
if (ModalController.state.open) {
144+
RouterController.push('UnsupportedChain');
145+
} else {
146+
ModalController.open({ view: 'UnsupportedChain' });
147+
}
148+
}
149+
}
150+
}
151+
}, [caipNetwork, isConnected, isNetworkStateStable]);
152+
117153
return (
118154
<>
119155
<ThemeProvider themeMode={themeMode} themeVariables={themeVariables}>

packages/scaffold/src/modal/w3m-network-button/index.tsx

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import {
1010
ThemeController
1111
} from '@reown/appkit-core-react-native';
1212
import { NetworkButton as NetworkButtonUI, ThemeProvider } from '@reown/appkit-ui-react-native';
13+
import { UiUtil } from '../../utils/UiUtil';
1314

1415
export interface NetworkButtonProps {
1516
disabled?: boolean;
@@ -18,14 +19,11 @@ export interface NetworkButtonProps {
1819

1920
export function NetworkButton({ disabled, style }: NetworkButtonProps) {
2021
const { loading } = useSnapshot(ModalController.state);
22+
const { caipNetwork } = useSnapshot(NetworkController.state);
23+
const { isConnected } = useSnapshot(AccountController.state);
2124
const { themeMode, themeVariables } = useSnapshot(ThemeController.state);
2225

23-
const isNetworkSupported =
24-
!NetworkController.state.caipNetwork ||
25-
!NetworkController.state.requestedCaipNetworks?.length ||
26-
NetworkController.state.requestedCaipNetworks.some(
27-
network => network.id === NetworkController.state.caipNetwork?.id
28-
);
26+
const isNetworkSupported = NetworkController.isActiveNetworkInRequestedNetworks();
2927

3028
const onNetworkPress = () => {
3129
if (AccountController.state.isConnected && !isNetworkSupported) {
@@ -39,6 +37,8 @@ export function NetworkButton({ disabled, style }: NetworkButtonProps) {
3937
});
4038
};
4139

40+
const buttonText = UiUtil.getNetworkButtonText(isConnected, caipNetwork, isNetworkSupported);
41+
4242
return (
4343
<ThemeProvider themeMode={themeMode} themeVariables={themeVariables}>
4444
<NetworkButtonUI
@@ -50,12 +50,7 @@ export function NetworkButton({ disabled, style }: NetworkButtonProps) {
5050
loading={loading}
5151
testID="network-button"
5252
>
53-
{NetworkController.state.caipNetwork?.name ??
54-
(AccountController.state.isConnected
55-
? isNetworkSupported
56-
? 'Unknown Network'
57-
: 'Switch Network'
58-
: 'Select Network')}
53+
{buttonText}
5954
</NetworkButtonUI>
6055
</ThemeProvider>
6156
);

packages/scaffold/src/utils/UiUtil.ts

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@ import {
22
AssetUtil,
33
ConnectionController,
44
StorageUtil,
5-
type WcWallet
5+
type WcWallet,
6+
type CaipNetwork
67
} from '@reown/appkit-core-react-native';
78
import { LayoutAnimation } from 'react-native';
89

@@ -27,5 +28,34 @@ export const UiUtil = {
2728
const url = AssetUtil.getWalletImage(pressedWallet);
2829
ConnectionController.setConnectedWalletImageUrl(url);
2930
}
31+
},
32+
33+
getNetworkButtonText(
34+
isConnected: boolean,
35+
caipNetwork: CaipNetwork | undefined,
36+
isNetworkSupported: boolean
37+
): string {
38+
let buttonText: string;
39+
40+
if (!isConnected) {
41+
if (caipNetwork) {
42+
buttonText = caipNetwork.name ?? 'Unknown Network';
43+
} else {
44+
buttonText = 'Select Network';
45+
}
46+
} else {
47+
// isConnected is true
48+
if (caipNetwork) {
49+
if (isNetworkSupported) {
50+
buttonText = caipNetwork.name ?? 'Unknown Network';
51+
} else {
52+
buttonText = 'Switch Network';
53+
}
54+
} else {
55+
buttonText = 'Select Network';
56+
}
57+
}
58+
59+
return buttonText;
3060
}
3161
};

packages/scaffold/src/views/w3m-account-default-view/index.tsx

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ import {
3030
ListItem
3131
} from '@reown/appkit-ui-react-native';
3232
import { useCustomDimensions } from '../../hooks/useCustomDimensions';
33+
import { UiUtil as ScaffoldUiUtil } from '../../utils/UiUtil';
3334

3435
import styles from './styles';
3536
import { AuthButtons } from './components/auth-buttons';
@@ -42,7 +43,8 @@ export function AccountDefaultView() {
4243
balance,
4344
balanceSymbol,
4445
addressExplorerUrl,
45-
preferredAccountType
46+
preferredAccountType,
47+
isConnected
4648
} = useSnapshot(AccountController.state);
4749
const { loading } = useSnapshot(ModalController.state);
4850
const [disconnecting, setDisconnecting] = useState(false);
@@ -59,6 +61,7 @@ export function AccountDefaultView() {
5961
const showBack = history.length > 1;
6062
const showSwitchAccountType = isAuth && NetworkController.checkIfSmartAccountEnabled();
6163
const { padding } = useCustomDimensions();
64+
const isNetworkSupported = NetworkController.isActiveNetworkInRequestedNetworks();
6265

6366
async function onDisconnect() {
6467
setDisconnecting(true);
@@ -146,8 +149,6 @@ export function AccountDefaultView() {
146149
};
147150

148151
const onNetworkPress = () => {
149-
const isNetworkSupported = NetworkController.isActiveNetworkInRequestedNetworks();
150-
151152
if (AccountController.state.isConnected && !isNetworkSupported) {
152153
RouterController.push('UnsupportedChain');
153154
} else {
@@ -254,10 +255,7 @@ export function AccountDefaultView() {
254255
style={styles.actionButton}
255256
>
256257
<Text numberOfLines={1} color="fg-100" testID="account-select-network-text">
257-
{!NetworkController.isActiveNetworkInRequestedNetworks() &&
258-
AccountController.state.isConnected
259-
? 'Switch Network'
260-
: caipNetwork?.name}
258+
{ScaffoldUiUtil.getNetworkButtonText(isConnected, caipNetwork, isNetworkSupported)}
261259
</Text>
262260
</ListItem>
263261

0 commit comments

Comments
 (0)