Skip to content

Commit 142a975

Browse files
authored
Merge branch 'main' into rn-upgrade/0.81.5-no-unit-tests
2 parents 1162171 + 4863651 commit 142a975

28 files changed

Lines changed: 981 additions & 450 deletions

app/components/UI/Card/Views/Cashback/Cashback.test.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ jest.mock('../../../../../util/theme', () => {
6060
jest.mock('../../../../../../locales/i18n', () => ({
6161
strings: (key: string) => {
6262
const translations: Record<string, string> = {
63-
'card.cashback_screen.available_cashback': 'Available cashback',
63+
'card.cashback_screen.available_cashback': 'Available mUSD',
6464
'card.cashback_screen.network_fee': 'Network fee',
6565
'card.cashback_screen.expected_to_receive': 'Expected to receive',
6666
'card.cashback_screen.withdraw': 'Withdraw',
@@ -221,7 +221,7 @@ describe('Cashback Component', () => {
221221
render();
222222

223223
expect(screen.getByTestId(CashbackSelectors.CONTAINER)).toBeOnTheScreen();
224-
expect(screen.queryByText('Available cashback')).toBeOnTheScreen();
224+
expect(screen.queryByText('Available mUSD')).toBeOnTheScreen();
225225
});
226226
});
227227

app/components/UI/Money/components/MoneyWhatYouGet/MoneyWhatYouGet.test.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ describe('MoneyWhatYouGet', () => {
2727
expect(container).toHaveTextContent(/Auto-earn/);
2828
expect(container).toHaveTextContent(/dollar-backed stablecoin/);
2929
expect(container).toHaveTextContent(/Get full liquidity/);
30-
expect(container).toHaveTextContent(/1-3% cashback/);
30+
expect(container).toHaveTextContent(/1-3% mUSD back/);
3131
expect(container).toHaveTextContent(
3232
/Transfer money to any of your wallets/,
3333
);

app/components/UI/Predict/components/PredictGameDetailsContent/PredictGameDetailsContent.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@ const PredictGameDetailsContent: React.FC<PredictGameDetailsContentProps> = ({
8080
marketId: market.id,
8181
childMarketIds: market.childMarketIds,
8282
claimable: false,
83+
livePriceUpdates: true,
8384
});
8485
const { data: claimablePositions = [] } = usePredictPositions({
8586
marketId: market.id,

app/components/UI/Predict/components/PredictHome/PredictHomePositions.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ const PredictHomePositions = forwardRef<
4242
refetch,
4343
isLoading: isActiveLoading,
4444
error: activeError,
45-
} = usePredictPositions({ claimable: false });
45+
} = usePredictPositions({ claimable: false, livePriceUpdates: true });
4646

4747
const {
4848
data: claimablePositions = [],

app/components/UI/Predict/components/PredictPicks/PredictPicks.test.tsx

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -45,13 +45,6 @@ jest.mock('../../hooks/usePredictCashOut', () => ({
4545
usePredictCashOut: () => ({ onCashOut: mockOnCashOut }),
4646
}));
4747

48-
jest.mock('../../hooks/usePredictLivePositions', () => ({
49-
usePredictLivePositions: jest.fn((positions: unknown[]) => ({
50-
livePositions: positions ?? [],
51-
isConnected: false,
52-
lastUpdateTime: null,
53-
})),
54-
}));
5548
jest.mock('../../utils/format');
5649

5750
const mockUseSelector = useSelector as jest.MockedFunction<typeof useSelector>;

app/components/UI/Predict/components/PredictPicks/PredictPicks.tsx

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import { Box } from '@metamask/design-system-react-native';
22
import React from 'react';
33
import { useSelector } from 'react-redux';
4-
import { usePredictLivePositions } from '../../hooks/usePredictLivePositions';
54
import { usePredictCashOut } from '../../hooks/usePredictCashOut';
65
import {
76
PredictMarket,
@@ -29,7 +28,6 @@ const PredictPicks: React.FC<PredictPicksProps> = ({
2928
claimablePositions,
3029
testID = PREDICT_PICKS_TEST_ID,
3130
}) => {
32-
const { livePositions } = usePredictLivePositions(positions);
3331
const { onCashOut } = usePredictCashOut({
3432
market,
3533
callerName: 'PredictPicks',
@@ -43,7 +41,7 @@ const PredictPicks: React.FC<PredictPicksProps> = ({
4341
if (usePositionDetail) {
4442
return (
4543
<Box testID={testID} twClassName="flex-col pt-3">
46-
{livePositions.map((position) => (
44+
{positions.map((position) => (
4745
<PredictPositionDetail
4846
key={position.id}
4947
position={position}
@@ -65,7 +63,7 @@ const PredictPicks: React.FC<PredictPicksProps> = ({
6563

6664
return (
6765
<Box testID={testID} twClassName="flex-col">
68-
{livePositions.map((position) => (
66+
{positions.map((position) => (
6967
<PredictPickItem
7068
key={position.id}
7169
position={position}

app/components/UI/Predict/components/PredictPicks/PredictPicksForCard.test.tsx

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,6 @@ import { formatPrice } from '../../utils/format';
77

88
import { POLYMARKET_PROVIDER_ID } from '../../providers/polymarket/constants';
99
jest.mock('../../hooks/usePredictPositions');
10-
jest.mock('../../hooks/usePredictLivePositions', () => ({
11-
usePredictLivePositions: jest.fn((positions: unknown[]) => ({
12-
livePositions: positions ?? [],
13-
isConnected: false,
14-
lastUpdateTime: null,
15-
})),
16-
}));
1710
jest.mock('../../utils/format');
1811

1912
const mockUsePredictPositions = usePredictPositions as jest.Mock;
@@ -327,12 +320,12 @@ describe('PredictPicksForCard', () => {
327320

328321
expect(mockUsePredictPositions).toHaveBeenCalledWith({
329322
marketId: 'specific-market-456',
330-
refetchInterval: 10000,
331323
enabled: true,
324+
livePriceUpdates: true,
332325
});
333326
});
334327

335-
it('passes refetchInterval of 10000ms to hook when no positions prop', () => {
328+
it('enables livePriceUpdates when no positions prop', () => {
336329
mockUsePredictPositions.mockReturnValue({
337330
data: [],
338331
isLoading: false,
@@ -345,7 +338,7 @@ describe('PredictPicksForCard', () => {
345338

346339
expect(mockUsePredictPositions).toHaveBeenCalledWith(
347340
expect.objectContaining({
348-
refetchInterval: 10000,
341+
livePriceUpdates: true,
349342
}),
350343
);
351344
});
@@ -362,8 +355,8 @@ describe('PredictPicksForCard', () => {
362355

363356
expect(mockUsePredictPositions).toHaveBeenCalledWith({
364357
marketId: 'market-1',
365-
refetchInterval: undefined,
366358
enabled: false,
359+
livePriceUpdates: false,
367360
});
368361
});
369362
});

app/components/UI/Predict/components/PredictPicks/PredictPicksForCard.tsx

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ import React from 'react';
22
import { Box } from '@metamask/design-system-react-native';
33

44
import { usePredictPositions } from '../../hooks/usePredictPositions';
5-
import { usePredictLivePositions } from '../../hooks/usePredictLivePositions';
65
import type { PredictPosition } from '../../types';
76
import PredictPicksForCardItem from './PredictPicksForCardItem';
87
import {
@@ -33,14 +32,13 @@ const PredictPicksForCard: React.FC<PredictPicksForCardProps> = ({
3332
}) => {
3433
const { data: fetchedPositions = [] } = usePredictPositions({
3534
marketId,
36-
refetchInterval: positionsProp ? undefined : 10000,
3735
enabled: !positionsProp,
36+
livePriceUpdates: !positionsProp,
3837
});
3938

4039
const basePositions = positionsProp ?? fetchedPositions;
41-
const { livePositions } = usePredictLivePositions(basePositions);
4240

43-
if (livePositions.length === 0) {
41+
if (basePositions.length === 0) {
4442
return null;
4543
}
4644

@@ -52,7 +50,7 @@ const PredictPicksForCard: React.FC<PredictPicksForCardProps> = ({
5250
twClassName="h-px bg-border-muted my-2"
5351
/>
5452
)}
55-
{livePositions.map((position) => (
53+
{basePositions.map((position) => (
5654
<PredictPicksForCardItem
5755
key={position.id}
5856
position={position}

app/components/UI/Predict/components/PredictPositionsHeader/PredictPositionsHeader.test.tsx

Lines changed: 46 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import React from 'react';
33
import Routes from '../../../../../constants/navigation/Routes';
44
import renderWithProvider from '../../../../../util/test/renderWithProvider';
55
import { useUnrealizedPnL } from '../../hooks/useUnrealizedPnL';
6+
import { usePredictPositions } from '../../hooks/usePredictPositions';
67
import { PredictPosition, PredictPositionStatus } from '../../types';
78
import MarketsWonCard from './PredictPositionsHeader';
89

@@ -94,14 +95,9 @@ jest.mock('../../hooks/usePredictActionGuard', () => ({
9495
}));
9596

9697
const mockRefetchClaimablePositions = jest.fn();
97-
jest.mock('../../hooks/usePredictPositions', () => ({
98-
usePredictPositions: () => ({
99-
data: [{ id: 'position-1' }],
100-
isLoading: false,
101-
error: null,
102-
refetch: mockRefetchClaimablePositions,
103-
}),
104-
}));
98+
let mockActivePositions: PredictPosition[] = [];
99+
let mockClaimablePositions: PredictPosition[] = [];
100+
jest.mock('../../hooks/usePredictPositions');
105101

106102
const mockClaim = jest.fn();
107103
jest.mock('../../hooks/usePredictClaim', () => ({
@@ -127,36 +123,13 @@ jest.mock('../../../../../../locales/i18n', () => ({
127123
}),
128124
}));
129125

130-
function createTestState(
131-
_availableBalance?: number,
132-
claimableAmount?: number,
133-
privacyMode = false,
134-
) {
126+
function createTestState(_availableBalance?: number, privacyMode = false) {
135127
const testAddress = '0x1234567890123456789012345678901234567890';
136128
const testAccountId = 'test-account-id';
137129

138-
const claimablePositions = claimableAmount
139-
? ([
140-
{
141-
id: 'position-1',
142-
status: PredictPositionStatus.WON,
143-
cashPnl: claimableAmount,
144-
currentValue: claimableAmount,
145-
marketId: 'market-1',
146-
title: 'Test Market',
147-
outcome: 'Yes',
148-
},
149-
] as unknown as PredictPosition[])
150-
: [];
151-
152130
return {
153131
engine: {
154132
backgroundState: {
155-
PredictController: {
156-
claimablePositions: {
157-
[testAddress]: claimablePositions,
158-
},
159-
},
160133
AccountsController: {
161134
internalAccounts: {
162135
selectedAccount: testAccountId,
@@ -185,11 +158,16 @@ describe('MarketsWonCard', () => {
185158
const mockUseUnrealizedPnL = useUnrealizedPnL as jest.MockedFunction<
186159
typeof useUnrealizedPnL
187160
>;
161+
const mockUsePredictPositions = usePredictPositions as jest.MockedFunction<
162+
typeof usePredictPositions
163+
>;
188164

189165
beforeEach(() => {
190166
jest.clearAllMocks();
191167
mockBalanceResult.data = 100.5;
192168
mockBalanceResult.isLoading = false;
169+
mockActivePositions = [{ id: 'position-1' } as PredictPosition];
170+
mockClaimablePositions = [];
193171

194172
mockUseUnrealizedPnL.mockReturnValue({
195173
data: {
@@ -201,13 +179,35 @@ describe('MarketsWonCard', () => {
201179
isFetching: false,
202180
error: null,
203181
} as unknown as ReturnType<typeof useUnrealizedPnL>);
182+
mockUsePredictPositions.mockImplementation(
183+
({ claimable }: { claimable?: boolean } = {}) =>
184+
({
185+
data: claimable ? mockClaimablePositions : mockActivePositions,
186+
isLoading: false,
187+
error: null,
188+
refetch: mockRefetchClaimablePositions,
189+
}) as unknown as ReturnType<typeof usePredictPositions>,
190+
);
204191
});
205192

206193
afterEach(() => {
207-
jest.resetAllMocks();
194+
jest.clearAllMocks();
208195
});
209196

210197
describe('rendering', () => {
198+
it('does not enable live updates for active position count query', () => {
199+
const state = createTestState(100.5);
200+
201+
renderWithProvider(<MarketsWonCard />, { state });
202+
203+
const activePositionsCall = mockUsePredictPositions.mock.calls.find(
204+
([options]) => options?.claimable === false,
205+
);
206+
207+
expect(activePositionsCall?.[0]).toMatchObject({ claimable: false });
208+
expect(activePositionsCall?.[0]?.livePriceUpdates).toBeUndefined();
209+
});
210+
211211
it('displays available balance and unrealized P&L', () => {
212212
const state = createTestState(100.5);
213213

@@ -230,15 +230,26 @@ describe('MarketsWonCard', () => {
230230
});
231231

232232
it('hides monetary values when privacy mode is enabled', () => {
233-
const state = createTestState(100.5, 24.66, true);
233+
mockClaimablePositions = [
234+
{
235+
id: 'position-1',
236+
status: PredictPositionStatus.WON,
237+
cashPnl: 24.66,
238+
currentValue: 24.66,
239+
marketId: 'market-1',
240+
title: 'Test Market',
241+
outcome: 'Yes',
242+
} as PredictPosition,
243+
];
244+
const state = createTestState(100.5, true);
234245

235246
renderWithProvider(<MarketsWonCard />, { state });
236247

237248
expect(screen.queryByText('$100.50')).toBeNull();
238249
expect(screen.queryByText('+$8.63 (+3.9%)')).toBeNull();
239250
expect(screen.queryByText('Claim $24.66')).toBeNull();
240251
expect(screen.getByText('••••••••••••')).toBeOnTheScreen();
241-
expect(screen.getByText('•••••••••')).toBeOnTheScreen();
252+
expect(screen.getAllByText('•••••••••').length).toBeGreaterThan(0);
242253
});
243254
});
244255

app/components/UI/Predict/components/PredictPositionsHeader/PredictPositionsHeader.tsx

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,7 @@ import { usePredictDeposit } from '../../hooks/usePredictDeposit';
4646
import { useUnrealizedPnL } from '../../hooks/useUnrealizedPnL';
4747
import { usePredictActionGuard } from '../../hooks/usePredictActionGuard';
4848
import { usePredictPositions } from '../../hooks/usePredictPositions';
49-
import { selectPredictWonPositions } from '../../selectors/predictController';
50-
import { PredictPosition } from '../../types';
49+
import { PredictPosition, PredictPositionStatus } from '../../types';
5150
import { PredictNavigationParamList } from '../../types/navigation';
5251
import {
5352
formatPercentage,
@@ -95,12 +94,20 @@ const PredictPositionsHeader = forwardRef<
9594
const evmAccount = getEvmAccountFromSelectedAccountGroup();
9695
const selectedAddress = evmAccount?.address ?? '0x0';
9796
const { isDepositPending } = usePredictDeposit();
98-
const wonPositions = useSelector(
99-
selectPredictWonPositions({ address: selectedAddress }),
100-
);
101-
102-
const { data: activePositions } = usePredictPositions({ claimable: false });
97+
const { data: activePositions } = usePredictPositions({
98+
claimable: false,
99+
});
100+
const { data: claimablePositions = [] } = usePredictPositions({
101+
claimable: true,
102+
});
103103
const hasPositions = (activePositions?.length ?? 0) > 0;
104+
const wonPositions = useMemo(
105+
() =>
106+
claimablePositions.filter(
107+
(position) => position.status === PredictPositionStatus.WON,
108+
),
109+
[claimablePositions],
110+
);
104111

105112
const {
106113
data: pnlData,

0 commit comments

Comments
 (0)