Skip to content
Merged
Show file tree
Hide file tree
Changes from all 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
2 changes: 1 addition & 1 deletion .github/guidelines/E2E_DECISION_TREE.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ flowchart TD
Android & iOS & Both --> LABEL{{PR label: skip-smart-e2e-selection ?}}
LABEL -->|yes| AllTags[Run all E2E needed]
LABEL -->|no| AI[🤖 AI selects test suites + confidence score]
AI --> CONF{{Confidence >= 80% ?}}
AI --> CONF{{Confidence >= 85% ?}}
CONF -->|yes| SelectedTags[Run selected E2E suites]
CONF -->|no| AllTagsFallback[Run all E2E needed]
```
Expand Down
8 changes: 4 additions & 4 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -1003,7 +1003,7 @@ jobs:
${{
!cancelled() &&
needs.get_requirements.outputs.android_e2e_needed == 'true' &&
!(fromJSON(needs.smart-e2e-selection.outputs.ai_confidence || '0') >= 80 && needs.smart-e2e-selection.outputs.ai_e2e_test_tags == '[]')
!(fromJSON(needs.smart-e2e-selection.outputs.ai_confidence || '0') >= 85 && needs.smart-e2e-selection.outputs.ai_e2e_test_tags == '[]')
}}
permissions:
contents: read
Expand Down Expand Up @@ -1032,7 +1032,7 @@ jobs:
changed_files: ${{ needs.get_requirements.outputs.changed_files }}
selected_tags: >-
${{
(fromJSON(needs.smart-e2e-selection.outputs.ai_confidence || '0') >= 80 && needs.smart-e2e-selection.outputs.ai_e2e_test_tags) ||
(fromJSON(needs.smart-e2e-selection.outputs.ai_confidence || '0') >= 85 && needs.smart-e2e-selection.outputs.ai_e2e_test_tags) ||
'["ALL"]'
}}
runner_provider: ${{ inputs.runner_provider }}
Expand All @@ -1044,7 +1044,7 @@ jobs:
${{
!cancelled() &&
needs.get_requirements.outputs.ios_e2e_needed == 'true' &&
!(fromJSON(needs.smart-e2e-selection.outputs.ai_confidence || '0') >= 80 && needs.smart-e2e-selection.outputs.ai_e2e_test_tags == '[]')
!(fromJSON(needs.smart-e2e-selection.outputs.ai_confidence || '0') >= 85 && needs.smart-e2e-selection.outputs.ai_e2e_test_tags == '[]')
}}
permissions:
contents: read
Expand Down Expand Up @@ -1080,7 +1080,7 @@ jobs:
changed_files: ${{ needs.get_requirements.outputs.changed_files }}
selected_tags: >-
${{
(fromJSON(needs.smart-e2e-selection.outputs.ai_confidence || '0') >= 80 && needs.smart-e2e-selection.outputs.ai_e2e_test_tags) ||
(fromJSON(needs.smart-e2e-selection.outputs.ai_confidence || '0') >= 85 && needs.smart-e2e-selection.outputs.ai_e2e_test_tags) ||
'["ALL"]'
}}
runner_provider: ${{ inputs.runner_provider }}
Expand Down
3 changes: 2 additions & 1 deletion .github/workflows/slack-rc-notification.yml
Original file line number Diff line number Diff line change
Expand Up @@ -84,4 +84,5 @@ jobs:
ANDROID_PUBLIC_URL: ${{ secrets.ANDROID_PUBLIC_BUCKET_URL }}
SLACK_BOT_TOKEN: ${{ secrets.SLACK_BOT_TOKEN }}
PR_NUMBER: ${{ inputs.pr_number }}
ANDROID_PLAY_STORE_CHECK_MRKDWN_FILE: ${{ github.workspace }}/android-play-store-check-out/android-play-store-check-slack.md
# Disable android check msg for now
#ANDROID_PLAY_STORE_CHECK_MRKDWN_FILE: ${{ github.workspace }}/android-play-store-check-out/android-play-store-check-slack.md
3 changes: 1 addition & 2 deletions .js.env.example
Original file line number Diff line number Diff line change
Expand Up @@ -133,8 +133,7 @@ export MM_MUSD_CONVERSION_REWARDS_UI_ENABLED="false"
export MM_MUSD_CONVERSION_GEO_BLOCKED_COUNTRIES="GB"
export MM_MUSD_CONVERSION_MIN_ASSET_BALANCE_REQUIRED="0.01"

# Money Home Screen
export MM_MONEY_HOME_SCREEN_ENABLED="false"
# Money Hub
export MM_MONEY_HUB_ENABLED="false"

# Activates remote feature flag override mode.
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
diff --git a/dist/hooks/ExtraTransactionsPublishHook.cjs b/dist/hooks/ExtraTransactionsPublishHook.cjs
index e182a81d3096512ec8726e31dea9465fca60f861..0e0301e037d9fc7ccf1cf9c2b0404e8c7327d62d 100644
--- a/dist/hooks/ExtraTransactionsPublishHook.cjs
+++ b/dist/hooks/ExtraTransactionsPublishHook.cjs
@@ -115,6 +115,7 @@ _ExtraTransactionsPublishHook_addTransactionBatch = new WeakMap(), _ExtraTransac
};
await __classPrivateFieldGet(this, _ExtraTransactionsPublishHook_addTransactionBatch, "f").call(this, {
from,
+ isInternal: true,
networkClientId,
requireApproval: false,
transactions,
diff --git a/dist/hooks/ExtraTransactionsPublishHook.mjs b/dist/hooks/ExtraTransactionsPublishHook.mjs
index 67d39aa5786e0d89ca851e07f30c8eeefe556724..3b0927b1eb0f634bf780bc221fd0ff8c5768c51e 100644
--- a/dist/hooks/ExtraTransactionsPublishHook.mjs
+++ b/dist/hooks/ExtraTransactionsPublishHook.mjs
@@ -111,6 +111,7 @@ _ExtraTransactionsPublishHook_addTransactionBatch = new WeakMap(), _ExtraTransac
};
await __classPrivateFieldGet(this, _ExtraTransactionsPublishHook_addTransactionBatch, "f").call(this, {
from,
+ isInternal: true,
networkClientId,
requireApproval: false,
transactions,
20 changes: 5 additions & 15 deletions app/components/Nav/Main/MainNavigator.js
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,6 @@ import RewardsNavigator from '../../UI/Rewards/RewardsNavigator';
import { ExploreFeed } from '../../Views/TrendingView/TrendingView';
import WhatsHappeningDetailView from '../../Views/WhatsHappeningDetailView';
import ExploreSearchScreen from '../../Views/TrendingView/Views/ExploreSearchScreen/ExploreSearchScreen';
import ExploreSectionResultsFullView from '../../Views/TrendingView/Views/ExploreSectionResultsFullView/ExploreSectionResultsFullView';
import TrendingFeedSessionManager from '../../UI/Trending/services/TrendingFeedSessionManager';
import CollectiblesDetails from '../../UI/CollectibleModal';
import OptinMetrics from '../../UI/OptinMetrics';
Expand Down Expand Up @@ -109,7 +108,7 @@ import {
MoneyTabScreenStack,
} from '../../UI/Money/routes';
import MoneyOnboardingView from '../../UI/Money/Views/MoneyOnboardingView';
import { selectMoneyHomeScreenEnabledFlag } from '../../UI/Money/selectors/featureFlags';
import { selectMoneyEnableMoneyAccountFlag } from '../../UI/Money/selectors/featureFlags';
import { BridgeTransactionDetails } from '../../UI/Bridge/components/TransactionDetails/TransactionDetails';
import { BridgeModalStack, BridgeScreenStack } from '../../UI/Bridge/routes';
import {
Expand Down Expand Up @@ -647,9 +646,7 @@ const HomeTabs = () => {
const { trackEvent, createEventBuilder } = useAnalytics();
const [isKeyboardHidden, setIsKeyboardHidden] = useState(true);

const isMoneyHomeScreenEnabled = useSelector(
selectMoneyHomeScreenEnabledFlag,
);
const isMoneyAccountEnabled = useSelector(selectMoneyEnableMoneyAccountFlag);

const accountsLength = useSelector(selectAccountsLength);

Expand Down Expand Up @@ -882,7 +879,7 @@ const HomeTabs = () => {
/>

{/* Activity Tab (replaced by Money when feature flag is on) */}
{isMoneyHomeScreenEnabled ? (
{isMoneyAccountEnabled ? (
<Tab.Screen
name={Routes.MONEY.ROOT}
options={options.money}
Expand Down Expand Up @@ -1051,9 +1048,7 @@ const MainNavigator = () => {
}, [dispatch]);

// Get feature flag state for conditional Money home screen registration
const isMoneyHomeScreenEnabled = useSelector(
selectMoneyHomeScreenEnabledFlag,
);
const isMoneyAccountEnabled = useSelector(selectMoneyEnableMoneyAccountFlag);
// Get feature flag state for conditional Perps screen registration
const perpsEnabledFlag = useSelector(selectPerpsEnabledFlag);
const isPerpsEnabled = useMemo(() => perpsEnabledFlag, [perpsEnabledFlag]);
Expand Down Expand Up @@ -1256,7 +1251,7 @@ const MainNavigator = () => {
presentation: 'transparentModal',
}}
/>
{isMoneyHomeScreenEnabled && (
{isMoneyAccountEnabled && (
<>
<Stack.Screen
name={Routes.MONEY.ROOT}
Expand Down Expand Up @@ -1412,11 +1407,6 @@ const MainNavigator = () => {
component={WhatsHappeningDetailView}
options={{ headerShown: false, ...slideFromRightAnimation }}
/>
<Stack.Screen
name={Routes.EXPLORE_SECTION_RESULTS_FULL_VIEW}
component={ExploreSectionResultsFullView}
options={{ headerShown: false, ...slideFromRightAnimation }}
/>
<Stack.Screen
name={Routes.BROWSER.HOME}
component={BrowserFlow}
Expand Down
14 changes: 7 additions & 7 deletions app/components/Nav/Main/MainNavigator.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -64,10 +64,10 @@ jest.mock('../../../selectors/featureFlagController/marketInsights', () => ({

jest.mock('../../hooks/useAnalytics/useAnalytics');

const mockSelectMoneyHomeScreenEnabledFlag = jest.fn().mockReturnValue(false);
const mockSelectMoneyEnableMoneyAccountFlag = jest.fn().mockReturnValue(false);
jest.mock('../../UI/Money/selectors/featureFlags', () => ({
selectMoneyHomeScreenEnabledFlag: (state: unknown) =>
mockSelectMoneyHomeScreenEnabledFlag(state),
selectMoneyEnableMoneyAccountFlag: (state: unknown) =>
mockSelectMoneyEnableMoneyAccountFlag(state),
}));

describe('MainNavigator', () => {
Expand Down Expand Up @@ -1474,7 +1474,7 @@ describe('MainNavigator', () => {
});
});

describe('Money home screen conditional rendering', () => {
describe('Money account conditional rendering', () => {
const getHomeTabsScreenNames = (): string[] => {
const { root: mainRoot } = renderWithProvider(<MainNavigator />, {
state: initialRootState,
Expand Down Expand Up @@ -1505,16 +1505,16 @@ describe('MainNavigator', () => {
};

it('includes Money route when feature flag is enabled', () => {
mockSelectMoneyHomeScreenEnabledFlag.mockReturnValue(true);
mockSelectMoneyEnableMoneyAccountFlag.mockReturnValue(true);

const tabScreenNames = getHomeTabsScreenNames();

expect(tabScreenNames).toContain(Routes.MONEY.ROOT);
mockSelectMoneyHomeScreenEnabledFlag.mockReturnValue(false);
mockSelectMoneyEnableMoneyAccountFlag.mockReturnValue(false);
});

it('excludes Money route when feature flag is disabled', () => {
mockSelectMoneyHomeScreenEnabledFlag.mockReturnValue(false);
mockSelectMoneyEnableMoneyAccountFlag.mockReturnValue(false);

const tabScreenNames = getHomeTabsScreenNames();

Expand Down
2 changes: 2 additions & 0 deletions app/components/UI/Bridge/_mocks_/bridgeReducerState.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import type { BridgeState } from '../../../../core/redux/slices/bridge';
import { initialHardwareWalletsSwapsState } from '../../HardwareWallet/Swaps/HardwareWalletsSwaps.state';
import { BridgeViewMode } from '../types';

export const mockBridgeReducerState: BridgeState = {
Expand Down Expand Up @@ -38,6 +39,7 @@ export const mockBridgeReducerState: BridgeState = {
tokenSelectorNetworkFilter: undefined,
visiblePillChainIds: undefined,
selectedQuoteRequestId: undefined,
hardwareWalletsSwaps: initialHardwareWalletsSwapsState,
batchSellSourceTokens: [],
batchSellSourceTokenAmounts: {},
batchSellDestToken: undefined,
Expand Down
56 changes: 54 additions & 2 deletions app/components/UI/Card/Views/CardWelcome/CardWelcome.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,17 @@ import { CardWelcomeSelectors } from './CardWelcome.testIds';
import { strings } from '../../../../../../locales/i18n';
import Routes from '../../../../../constants/navigation/Routes';
import { MetaMetricsEvents } from '../../../../../core/Analytics';
import { MONEY_HOME_CARD_ORIGIN } from '../../hooks/useCardPostAuthRedirect';

const mockUseCardPostAuthRedirect = jest.fn();

jest.mock('../../hooks/useCardPostAuthRedirect', () => ({
useCardPostAuthRedirect: () => mockUseCardPostAuthRedirect(),
MONEY_HOME_CARD_ORIGIN: {
screen: 'Money',
params: { screen: 'MoneyHome' },
},
}));

// Mocks
const mockNavigate = jest.fn();
Expand Down Expand Up @@ -81,6 +92,7 @@ describe('CardWelcome', () => {

beforeEach(() => {
jest.clearAllMocks();
mockUseCardPostAuthRedirect.mockReturnValue(undefined);
mockNavigate.mockClear();
mockGoBack.mockClear();
mockTrackEvent.mockClear();
Expand Down Expand Up @@ -167,7 +179,10 @@ describe('CardWelcome', () => {

fireEvent.press(getByTestId(CardWelcomeSelectors.VERIFY_ACCOUNT_BUTTON));

expect(mockNavigate).toHaveBeenCalledWith(Routes.CARD.ONBOARDING.ROOT);
expect(mockNavigate).toHaveBeenCalledWith(
Routes.CARD.ONBOARDING.ROOT,
undefined,
);
expect(mockCreateEventBuilder).toHaveBeenCalledWith(
MetaMetricsEvents.CARD_BUTTON_CLICKED,
);
Expand All @@ -185,10 +200,47 @@ describe('CardWelcome', () => {

fireEvent.press(getByTestId(CardWelcomeSelectors.VERIFY_ACCOUNT_BUTTON));

expect(mockNavigate).toHaveBeenCalledWith(Routes.CARD.AUTHENTICATION);
expect(mockNavigate).toHaveBeenCalledWith(
Routes.CARD.AUTHENTICATION,
undefined,
);
expect(mockCreateEventBuilder).toHaveBeenCalledWith(
MetaMetricsEvents.CARD_BUTTON_CLICKED,
);
});

it('forwards postAuthRedirect to onboarding when opened from Money (non-cardholder)', () => {
mockUseCardPostAuthRedirect.mockReturnValue(MONEY_HOME_CARD_ORIGIN);
store = createTestStore({ cardholderAccounts: [] });
const { getByTestId } = render(
<Provider store={store}>
<CardWelcome />
</Provider>,
);

fireEvent.press(getByTestId(CardWelcomeSelectors.VERIFY_ACCOUNT_BUTTON));

expect(mockNavigate).toHaveBeenCalledWith(Routes.CARD.ONBOARDING.ROOT, {
postAuthRedirect: MONEY_HOME_CARD_ORIGIN,
});
});

it('forwards postAuthRedirect to authentication when opened from Money (cardholder)', () => {
mockUseCardPostAuthRedirect.mockReturnValue(MONEY_HOME_CARD_ORIGIN);
store = createTestStore({
cardholderAccounts: ['0x1234567890abcdef'],
});
const { getByTestId } = render(
<Provider store={store}>
<CardWelcome />
</Provider>,
);

fireEvent.press(getByTestId(CardWelcomeSelectors.VERIFY_ACCOUNT_BUTTON));

expect(mockNavigate).toHaveBeenCalledWith(Routes.CARD.AUTHENTICATION, {
postAuthRedirect: MONEY_HOME_CARD_ORIGIN,
});
});
});
});
20 changes: 17 additions & 3 deletions app/components/UI/Card/Views/CardWelcome/CardWelcome.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -24,11 +24,13 @@ import { MetaMetricsEvents } from '../../../../../core/Analytics';
import { CardActions, CardScreens } from '../../util/metrics';
import { selectHasCardholderAccounts } from '../../../../../selectors/cardController';
import { useSelector } from 'react-redux';
import { useCardPostAuthRedirect } from '../../hooks/useCardPostAuthRedirect';

const CardWelcome = () => {
const { trackEvent, createEventBuilder } = useAnalytics();
const { goBack, navigate } = useNavigation();
const hasCardholderAccounts = useSelector(selectHasCardholderAccounts);
const postAuthRedirect = useCardPostAuthRedirect();
const theme = useTheme();
const dimensions = useWindowDimensions();
const styles = createStyles(theme, dimensions);
Expand Down Expand Up @@ -57,11 +59,23 @@ const CardWelcome = () => {
);

if (hasCardholderAccounts) {
navigate(Routes.CARD.AUTHENTICATION);
navigate(
Routes.CARD.AUTHENTICATION,
postAuthRedirect ? { postAuthRedirect } : undefined,
);
} else {
navigate(Routes.CARD.ONBOARDING.ROOT);
navigate(
Routes.CARD.ONBOARDING.ROOT,
postAuthRedirect ? { postAuthRedirect } : undefined,
);
}
}, [hasCardholderAccounts, navigate, trackEvent, createEventBuilder]);
}, [
hasCardholderAccounts,
navigate,
postAuthRedirect,
trackEvent,
createEventBuilder,
]);

return (
<LinearGradient
Expand Down
Loading
Loading