-
-
Notifications
You must be signed in to change notification settings - Fork 1.6k
Expand file tree
/
Copy pathPerpsSelectProviderView.tsx
More file actions
106 lines (96 loc) · 3.42 KB
/
Copy pathPerpsSelectProviderView.tsx
File metadata and controls
106 lines (96 loc) · 3.42 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
import React, { useCallback, useMemo } from 'react';
import { useNavigation } from '@react-navigation/native';
import type { AppNavigationProp } from '../../../../../core/NavigationService/types';
import { useSelector } from 'react-redux';
import Logger from '../../../../../util/Logger';
import { usePerpsProvider } from '../../hooks/usePerpsProvider';
import { usePerpsNetworkConfig } from '../../hooks/usePerpsNetworkConfig';
import { selectPerpsNetwork } from '../../selectors/perpsController';
import PerpsProviderSelectorSheet from '../../components/PerpsProviderSelector/PerpsProviderSelectorSheet';
import type { ProviderNetworkOption } from '../../components/PerpsProviderSelector/PerpsProviderSelector.types';
import { PERPS_CONSTANTS } from '@metamask/perps-controller';
/**
* PerpsSelectProviderView
*
* Navigation-based wrapper for the provider selector bottom sheet.
* Handles combined provider + network switching.
*/
const PerpsSelectProviderView: React.FC = () => {
const navigation = useNavigation<AppNavigationProp>();
const { activeProvider, switchProvider } = usePerpsProvider();
const { toggleTestnet } = usePerpsNetworkConfig();
const network = useSelector(selectPerpsNetwork);
const isTestnet = network === 'testnet';
const handleClose = useCallback(() => {
navigation.goBack();
}, [navigation]);
const selectedOptionId = useMemo(
() => `${activeProvider}-${isTestnet ? 'testnet' : 'mainnet'}`,
[activeProvider, isTestnet],
);
const handleOptionSelect = useCallback(
async (option: ProviderNetworkOption) => {
const providerChanged = option.providerId !== activeProvider;
const networkChanged = option.isTestnet !== isTestnet;
if (!providerChanged && !networkChanged) {
return;
}
// Switch provider first if needed
if (providerChanged) {
const result = await switchProvider(option.providerId);
if (!result.success) {
Logger.error(
new Error(
`Failed to switch perps provider to ${option.providerId}`,
),
{
tags: {
feature: PERPS_CONSTANTS.FeatureName,
},
context: {
name: 'PerpsSelectProviderView',
data: {
action: 'switch_provider',
providerId: option.providerId,
error: result.error,
},
},
},
);
return;
}
}
// Then toggle network if needed
if (networkChanged) {
const result = await toggleTestnet();
if (!result.success) {
Logger.error(new Error(`Failed to toggle perps testnet`), {
tags: {
feature: PERPS_CONSTANTS.FeatureName,
},
context: {
name: 'PerpsSelectProviderView',
data: {
action: 'toggle_testnet',
targetNetwork: option.isTestnet ? 'testnet' : 'mainnet',
error: result.error,
},
},
});
return;
}
}
},
[activeProvider, isTestnet, switchProvider, toggleTestnet],
);
return (
<PerpsProviderSelectorSheet
isVisible
onClose={handleClose}
selectedOptionId={selectedOptionId}
onOptionSelect={handleOptionSelect}
testID="perps-select-provider-sheet"
/>
);
};
export default PerpsSelectProviderView;