Skip to content

Commit 09fdbcb

Browse files
committed
chore: conditional trade button
1 parent 48e70a5 commit 09fdbcb

4 files changed

Lines changed: 39 additions & 37 deletions

File tree

app/components/Views/WhatsHappeningDetailView/components/AssetRow.test.tsx

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,12 @@ describe('AssetRow', () => {
5959
expect(screen.getByText('UNK')).toBeOnTheScreen();
6060
});
6161

62+
it('does not render an action button when onAction is omitted', () => {
63+
renderWithProvider(<AssetRow asset={btcAsset} />);
64+
expect(screen.queryByText('Buy')).toBeNull();
65+
expect(screen.queryByText('Trade')).toBeNull();
66+
});
67+
6268
it('renders the action button with the provided label', () => {
6369
renderWithProvider(
6470
<AssetRow

app/components/Views/WhatsHappeningDetailView/components/AssetRow.tsx

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,9 @@ export interface AssetRowSecondaryLine {
2727

2828
interface AssetRowProps {
2929
asset: RelatedAsset;
30-
actionLabel: string;
31-
accessibilityLabel: string;
32-
onAction: () => void;
30+
actionLabel?: string;
31+
accessibilityLabel?: string;
32+
onAction?: () => void;
3333
/** When provided, renders the security badge inline next to the asset name. */
3434
caipAssetId?: CaipAssetType;
3535
/** When provided, renders price + 24h change below the asset name. */
@@ -38,7 +38,7 @@ interface AssetRowProps {
3838

3939
/**
4040
* Shared layout for a single asset row (logo + name + optional badge + optional
41-
* price/change + action button). Used by PerpsRow (Trade).
41+
* price/change + optional action button). Used by PerpsRow (Trade when tradable).
4242
*/
4343
const AssetRow: React.FC<AssetRowProps> = ({
4444
asset,
@@ -123,14 +123,16 @@ const AssetRow: React.FC<AssetRowProps> = ({
123123
)}
124124
</Box>
125125

126-
<Button
127-
variant={ButtonVariant.Secondary}
128-
size={ButtonSize.Md}
129-
onPress={onAction}
130-
accessibilityLabel={accessibilityLabel}
131-
>
132-
{actionLabel}
133-
</Button>
126+
{onAction && actionLabel && accessibilityLabel ? (
127+
<Button
128+
variant={ButtonVariant.Secondary}
129+
size={ButtonSize.Md}
130+
onPress={onAction}
131+
accessibilityLabel={accessibilityLabel}
132+
>
133+
{actionLabel}
134+
</Button>
135+
) : null}
134136
</Box>
135137
</Box>
136138
);

app/components/Views/WhatsHappeningDetailView/components/PerpsRow.test.tsx

Lines changed: 3 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,7 @@ describe('PerpsRow', () => {
143143
});
144144
});
145145

146-
it('does not navigate when hlPerpsMarket is empty', () => {
146+
it('does not render Trade when hlPerpsMarket is empty', () => {
147147
const assetNoPerps: RelatedAsset = {
148148
...perpsOnlyAsset,
149149
hlPerpsMarket: [],
@@ -156,8 +156,9 @@ describe('PerpsRow', () => {
156156
perpsPriceBySymbol={emptyPriceMap}
157157
/>,
158158
);
159-
fireEvent.press(screen.getByText('Trade'));
159+
expect(screen.queryByText('Trade')).toBeNull();
160160
expect(mockNavigate).not.toHaveBeenCalled();
161+
expect(mockCreateEventBuilder).not.toHaveBeenCalled();
161162
});
162163

163164
it('tracks Whats Happening Interaction on Trade press', () => {
@@ -189,23 +190,6 @@ describe('PerpsRow', () => {
189190
);
190191
});
191192

192-
it('does not track Interaction when hlPerpsMarket is empty', () => {
193-
const assetNoPerps: RelatedAsset = {
194-
...perpsOnlyAsset,
195-
hlPerpsMarket: [],
196-
};
197-
renderWithProvider(
198-
<PerpsRow
199-
asset={assetNoPerps}
200-
item={mockItem}
201-
cardIndex={0}
202-
perpsPriceBySymbol={emptyPriceMap}
203-
/>,
204-
);
205-
fireEvent.press(screen.getByText('Trade'));
206-
expect(mockCreateEventBuilder).not.toHaveBeenCalled();
207-
});
208-
209193
it('displays price and 24h change from perpsPriceBySymbol', () => {
210194
const priceMap: Record<string, PerpsPriceEntry> = {
211195
'xyz:TSLA': { price: 172.5, percentChange24h: 3.45 },

app/components/Views/WhatsHappeningDetailView/components/PerpsRow.tsx

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,8 @@ interface PerpsRowProps {
2626
/**
2727
* A single row for a perps asset in the expanded What's Happening card.
2828
* Shows logo, name, optional verified badge (for assets that also have caip19),
29-
* live price/change, and a Trade button.
29+
* live price/change when `hlPerpsMarket` is set, and a Trade button only when a
30+
* perps market symbol exists.
3031
*/
3132
const PerpsRow: React.FC<PerpsRowProps> = ({
3233
asset,
@@ -70,14 +71,17 @@ const PerpsRow: React.FC<PerpsRowProps> = ({
7071
}, [asset.hlPerpsMarket, perpsPriceBySymbol]);
7172

7273
const handleTradeWithTracking = useCallback(() => {
73-
if (!asset.hlPerpsMarket?.[0]) return;
74+
const perpsMarket = asset.hlPerpsMarket?.[0];
75+
if (!perpsMarket) {
76+
return;
77+
}
7478
trackEvent(
7579
createEventBuilder(MetaMetricsEvents.WHATS_HAPPENING_INTERACTION)
7680
.addProperties({
7781
...getWhatsHappeningEventProps(item, cardIndex),
7882
interaction_type: WhatsHappeningInteractionType.TradePressed,
7983
asset_symbol: asset.symbol,
80-
perps_market: asset.hlPerpsMarket?.[0],
84+
perps_market: perpsMarket,
8185
})
8286
.build(),
8387
);
@@ -92,12 +96,18 @@ const PerpsRow: React.FC<PerpsRowProps> = ({
9296
createEventBuilder,
9397
]);
9498

99+
const perpsMarketSymbol = asset.hlPerpsMarket?.[0];
100+
95101
return (
96102
<AssetRow
97103
asset={asset}
98-
actionLabel={strings('bottom_nav.trade')}
99-
accessibilityLabel={`${strings('bottom_nav.trade')} ${asset.symbol}`}
100-
onAction={handleTradeWithTracking}
104+
actionLabel={perpsMarketSymbol ? strings('bottom_nav.trade') : undefined}
105+
accessibilityLabel={
106+
perpsMarketSymbol
107+
? `${strings('bottom_nav.trade')} ${asset.symbol}`
108+
: undefined
109+
}
110+
onAction={perpsMarketSymbol ? handleTradeWithTracking : undefined}
101111
caipAssetId={caipAssetId}
102112
secondaryLine={secondaryLine}
103113
/>

0 commit comments

Comments
 (0)