Skip to content
Merged
Show file tree
Hide file tree
Changes from 12 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions .github/CODEOWNERS
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,17 @@ app/scripts/controllers/swaps @MetaMask/swaps-engineers
# Ramps team to own code for the ramps folder
**/ramps/** @MetaMask/ramp

# Perps Team
ui/pages/perps/ @MetaMask/perps
ui/components/app/perps/ @MetaMask/perps
ui/ducks/perps/ @MetaMask/perps
ui/hooks/perps/ @MetaMask/perps
ui/selectors/perps/ @MetaMask/perps
shared/lib/deep-links/routes/perps.ts @MetaMask/perps
test/e2e/tests/perps/ @MetaMask/perps
docs/perps/ @MetaMask/perps
**/perps/** @MetaMask/perps

# Snaps
**/snaps/** @MetaMask/core-platform
shared/constants/permissions.ts @MetaMask/core-platform
Expand Down
3 changes: 3 additions & 0 deletions app/_locales/en/messages.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 3 additions & 0 deletions shared/constants/app-state.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,19 +8,22 @@ export enum AccountOverviewTabKey {
Nfts = 'nfts',
Activity = 'activity',
DeFi = 'defi',
Perps = 'perps',
}

export const ACCOUNT_OVERVIEW_TAB_KEY_TO_METAMETRICS_EVENT_NAME_MAP = {
[AccountOverviewTabKey.Tokens]: MetaMetricsEventName.TokenScreenOpened,
[AccountOverviewTabKey.DeFi]: MetaMetricsEventName.DeFiScreenOpened,
[AccountOverviewTabKey.Activity]: MetaMetricsEventName.ActivityScreenOpened,
[AccountOverviewTabKey.Perps]: MetaMetricsEventName.PerpsScreenOpened,
} as const;

export const ACCOUNT_OVERVIEW_TAB_KEY_TO_TRACE_NAME_MAP = {
[AccountOverviewTabKey.Tokens]: TraceName.AccountOverviewAssetListTab,
[AccountOverviewTabKey.Nfts]: TraceName.AccountOverviewNftsTab,
[AccountOverviewTabKey.Activity]: TraceName.AccountOverviewActivityTab,
[AccountOverviewTabKey.DeFi]: TraceName.AccountOverviewDeFiTab,
[AccountOverviewTabKey.Perps]: TraceName.AccountOverviewPerpsTab,
} as const;

export type CarouselSlide = {
Expand Down
1 change: 1 addition & 0 deletions shared/constants/metametrics.ts
Original file line number Diff line number Diff line change
Expand Up @@ -886,6 +886,7 @@ export enum MetaMetricsEventName {
DeFiScreenOpened = 'DeFi Screen Opened',
DeFiDetailsOpened = 'DeFi Details Opened',
ActivityScreenOpened = 'Activity Screen Opened',
PerpsScreenOpened = 'Perps Screen Opened',
WhatsNewViewed = `What's New Viewed`,
WhatsNewClicked = `What's New Link Clicked`,
PrepareSwapPageLoaded = 'Prepare Swap Page Loaded',
Expand Down
1 change: 1 addition & 0 deletions shared/lib/trace.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ export enum TraceName {
AccountOverviewNftsTab = 'Account Overview Nfts Tab',
AccountOverviewActivityTab = 'Account Overview Activity Tab',
AccountOverviewDeFiTab = 'Account Overview DeFi Tab',
AccountOverviewPerpsTab = 'Account Overview Perps Tab',
AssetDetails = 'Asset Details',
BackgroundConnect = 'Background Connect',
BridgeBalancesUpdated = 'Bridge Balances Updated',
Expand Down
9 changes: 9 additions & 0 deletions test/e2e/tests/perps/helpers.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
/**
* Perps E2E test helpers
*
* This directory contains E2E test utilities and helpers for the Perps trading feature.
*
* @see {@link https://github.com/MetaMask/metamask-extension} for more info
*/

export {};
9 changes: 9 additions & 0 deletions ui/components/app/perps/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
/**
* Perps UI components
*
* This directory contains reusable UI components for the Perps trading feature.
*
* @see {@link https://github.com/MetaMask/metamask-extension} for more info
*/

export {};
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ import {
getEnabledChainIds,
getIsMultichainAccountsState2Enabled,
} from '../../../selectors';
import { getIsPerpsEnabled } from '../../../selectors/perps';
import { getAllEnabledNetworksForAllNamespaces } from '../../../selectors/multichain/networks';
import { detectNfts } from '../../../store/actions';
import AssetList from '../../app/assets/asset-list';
Expand Down Expand Up @@ -138,6 +139,8 @@ export const AccountOverviewTabs = ({
);
const showUnifiedTransactionList = isBIP44FeatureFlagEnabled;

const isPerpsEnabled = useSelector(getIsPerpsEnabled);

return (
<>
<AssetListTokenDetection />
Expand Down Expand Up @@ -165,6 +168,17 @@ export const AccountOverviewTabs = ({
</Box>
</Tab>
)}

{isPerpsEnabled && (
<Tab
name={t('perps')}
tabKey={AccountOverviewTabKey.Perps}
data-testid="account-overview__perps-tab"
>
<Box />
</Tab>
)}

{showDefi && (
<Tab
name={t('defi')}
Expand Down
10 changes: 10 additions & 0 deletions ui/ducks/perps/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
/**
* Perps Redux slice
*
* This directory contains Redux state management (actions, reducers, selectors)
* for the Perps trading feature.
*
* @see {@link https://github.com/MetaMask/metamask-extension} for more info
*/

export {};
9 changes: 9 additions & 0 deletions ui/hooks/perps/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
/**
* Perps custom hooks
*
* This directory contains custom React hooks for the Perps trading feature.
*
* @see {@link https://github.com/MetaMask/metamask-extension} for more info
*/

export {};
9 changes: 9 additions & 0 deletions ui/pages/perps/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
/**
* Perps page components
*
* This directory contains page-level components for the Perps trading feature.
*
* @see {@link https://github.com/MetaMask/metamask-extension} for more info
*/

export {};
41 changes: 41 additions & 0 deletions ui/selectors/perps/feature-flags.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
import { getIsPerpsEnabled } from './feature-flags';

type MockState = {
metamask: {
remoteFeatureFlags: {
perpsEnabled?: boolean;
};
};
};

const getMockState = (perpsEnabled?: boolean): MockState => ({
metamask: {
remoteFeatureFlags: {
perpsEnabled,
},
},
});

describe('Perps Feature Flags', () => {
describe('getIsPerpsEnabled', () => {
it('returns true when perpsEnabled flag is true', () => {
const state = getMockState(true);
expect(getIsPerpsEnabled(state)).toBe(true);
});

it('returns false when perpsEnabled flag is false', () => {
const state = getMockState(false);
expect(getIsPerpsEnabled(state)).toBe(false);
});

it('returns false when perpsEnabled flag is undefined', () => {
const state = getMockState(undefined);
expect(getIsPerpsEnabled(state)).toBe(false);
});

it('returns false when remoteFeatureFlags is empty', () => {
const state = { metamask: { remoteFeatureFlags: {} } };
expect(getIsPerpsEnabled(state)).toBe(false);
});
});
});
13 changes: 13 additions & 0 deletions ui/selectors/perps/feature-flags.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import { createSelector } from 'reselect';
import { getRemoteFeatureFlags } from '../remote-feature-flags';

/**
* Get the state of the `perpsEnabled` remote feature flag.
*
* @param _state - The MetaMask state object
* @returns `true` if Perps trading is enabled, `false` otherwise.
*/
export const getIsPerpsEnabled = createSelector(
getRemoteFeatureFlags,
(remoteFeatureFlags) => remoteFeatureFlags.perpsEnabled === true,
);
9 changes: 9 additions & 0 deletions ui/selectors/perps/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
/**
* Perps selectors
*
* This directory contains Redux selectors for the Perps trading feature.
*
* @see {@link https://github.com/MetaMask/metamask-extension} for more info
*/

export { getIsPerpsEnabled } from './feature-flags';
Loading