Skip to content

Commit 73b282a

Browse files
refactor(perps): migrate provider selector UI to MMDS
Use SelectButton, BottomSheet, ListItemSelect, and Tag so home and sheet chrome stay vertically centered without custom badge styles. Co-authored-by: Cursor <cursoragent@cursor.com>
1 parent 343ba5a commit 73b282a

8 files changed

Lines changed: 169 additions & 344 deletions

File tree

app/components/UI/Perps/Views/PerpsHomeView/PerpsHomeView.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1017,6 +1017,7 @@ const PerpsHomeView = ({
10171017
<Tag
10181018
severity={TagSeverity.Warning}
10191019
testID={`${homeHeadingTestID}-testnet-badge`}
1020+
twClassName="self-center"
10201021
>
10211022
Testnet
10221023
</Tag>

app/components/UI/Perps/Views/PerpsSelectProviderView/PerpsSelectProviderView.tsx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,6 @@ const PerpsSelectProviderView: React.FC = () => {
9292

9393
return (
9494
<PerpsProviderSelectorSheet
95-
isVisible
9695
onClose={handleClose}
9796
selectedOptionId={selectedOptionId}
9897
onOptionSelect={handleOptionSelect}

app/components/UI/Perps/components/PerpsProviderSelector/PerpsProviderSelector.styles.ts

Lines changed: 0 additions & 75 deletions
This file was deleted.

app/components/UI/Perps/components/PerpsProviderSelector/PerpsProviderSelector.types.ts

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,6 @@ export interface PerpsProviderSelectorBadgeProps {
1414
* Props for PerpsProviderSelectorSheet component
1515
*/
1616
export interface PerpsProviderSelectorSheetProps {
17-
/**
18-
* Whether the bottom sheet is visible
19-
*/
20-
isVisible: boolean;
21-
2217
/**
2318
* Callback when the sheet is closed
2419
*/

app/components/UI/Perps/components/PerpsProviderSelector/PerpsProviderSelectorBadge.test.tsx

Lines changed: 1 addition & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -18,43 +18,6 @@ jest.mock('../../hooks/usePerpsProvider', () => ({
1818
usePerpsProvider: jest.fn(),
1919
}));
2020

21-
jest.mock('../../../../../component-library/hooks', () => ({
22-
useStyles: () => ({
23-
styles: {
24-
badgeContainer: {},
25-
badgeText: {},
26-
testnetDot: {},
27-
},
28-
}),
29-
}));
30-
31-
jest.mock('../../../../../component-library/components/Texts/Text', () => {
32-
const { Text: RNText } = jest.requireActual('react-native');
33-
const MockText = ({ children, ...props }: Record<string, unknown>) => (
34-
<RNText {...props}>{children}</RNText>
35-
);
36-
MockText.displayName = 'Text';
37-
return {
38-
__esModule: true,
39-
default: MockText,
40-
TextVariant: { BodySM: 'BodySM' },
41-
TextColor: { Alternative: 'Alternative', Warning: 'Warning' },
42-
};
43-
});
44-
45-
jest.mock('../../../../../component-library/components/Icons/Icon', () => {
46-
const { View } = jest.requireActual('react-native');
47-
return {
48-
__esModule: true,
49-
default: (props: Record<string, unknown>) => (
50-
<View testID="icon" {...props} />
51-
),
52-
IconName: { ArrowDown: 'ArrowDown' },
53-
IconSize: { Xs: 'Xs' },
54-
IconColor: { Alternative: 'Alternative', Warning: 'Warning' },
55-
};
56-
});
57-
5821
const mockNavigate = jest.fn();
5922
const mockUsePerpsProvider = usePerpsProvider as jest.Mock;
6023
const mockUseSelector = useSelector as jest.Mock;
@@ -144,7 +107,7 @@ describe('PerpsProviderSelectorBadge', () => {
144107
expect(badge.props.accessibilityLabel).toContain('Mainnet');
145108
});
146109

147-
it('renders testnet dot and warning styling when on testnet', () => {
110+
it('includes Testnet in accessibility label when on testnet', () => {
148111
mockUseSelector.mockReturnValue('testnet');
149112
mockUsePerpsProvider.mockReturnValue({
150113
activeProvider: 'hyperliquid',

app/components/UI/Perps/components/PerpsProviderSelector/PerpsProviderSelectorBadge.tsx

Lines changed: 15 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,17 @@
11
import React, { useCallback } from 'react';
22
import {
3-
Icon,
4-
IconColor,
5-
IconName,
6-
IconSize,
3+
Box,
4+
SelectButton,
5+
SelectButtonSize,
6+
SelectButtonVariant,
77
} from '@metamask/design-system-react-native';
8-
import { TouchableOpacity, View } from 'react-native';
98
import { useNavigation } from '@react-navigation/native';
109
import { useSelector } from 'react-redux';
11-
import { useStyles } from '../../../../../component-library/hooks';
12-
import Text, {
13-
TextVariant,
14-
TextColor,
15-
} from '../../../../../component-library/components/Texts/Text';
1610
import Routes from '../../../../../constants/navigation/Routes';
1711
import { usePerpsProvider } from '../../hooks/usePerpsProvider';
1812
import { selectPerpsNetwork } from '../../selectors/perpsController';
1913
import type { PerpsProviderSelectorBadgeProps } from './PerpsProviderSelector.types';
2014
import { PROVIDER_DISPLAY_INFO } from './PerpsProviderSelector.constants';
21-
import { styleSheet } from './PerpsProviderSelector.styles';
2215

2316
/**
2417
* PerpsProviderSelectorBadge Component
@@ -30,7 +23,6 @@ import { styleSheet } from './PerpsProviderSelector.styles';
3023
const PerpsProviderSelectorBadge: React.FC<PerpsProviderSelectorBadgeProps> = ({
3124
testID,
3225
}) => {
33-
const { styles } = useStyles(styleSheet, {});
3426
const navigation = useNavigation();
3527
const { activeProvider, isMultiProviderEnabled } = usePerpsProvider();
3628
const network = useSelector(selectPerpsNetwork);
@@ -53,27 +45,21 @@ const PerpsProviderSelectorBadge: React.FC<PerpsProviderSelectorBadgeProps> = ({
5345
: PROVIDER_DISPLAY_INFO.hyperliquid;
5446

5547
return (
56-
<TouchableOpacity
57-
style={styles.badgeContainer}
48+
<SelectButton
49+
size={SelectButtonSize.Sm}
50+
variant={SelectButtonVariant.Primary}
51+
value={currentProvider.name}
5852
onPress={handlePress}
5953
testID={testID}
6054
accessibilityRole="button"
6155
accessibilityLabel={`Current provider: ${currentProvider.name}, ${isTestnet ? 'Testnet' : 'Mainnet'}. Tap to change.`}
62-
>
63-
{isTestnet && <View style={styles.testnetDot} />}
64-
<Text
65-
variant={TextVariant.BodySM}
66-
color={isTestnet ? TextColor.Warning : TextColor.Alternative}
67-
style={styles.badgeText}
68-
>
69-
{currentProvider.name}
70-
</Text>
71-
<Icon
72-
name={IconName.ArrowDown}
73-
size={IconSize.Xs}
74-
color={isTestnet ? IconColor.WarningDefault : IconColor.IconAlternative}
75-
/>
76-
</TouchableOpacity>
56+
twClassName="self-center"
57+
startAccessory={
58+
isTestnet ? (
59+
<Box twClassName="w-1.5 h-1.5 rounded-full bg-warning-default" />
60+
) : undefined
61+
}
62+
/>
7763
);
7864
};
7965

0 commit comments

Comments
 (0)