Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
49 commits
Select commit Hold shift + click to select a range
c613d38
Add unified workspace Connections page
Krishna2323 Sep 25, 2026
94bfd5b
Turn integration pages into Configure panels
Krishna2323 Sep 25, 2026
fb11129
Send setup flows and onboarding links to Connections
Krishna2323 Sep 25, 2026
26c16a7
Remove integration toggles from More features
Krishna2323 Sep 25, 2026
d3e7986
Update tests for the Connections page
Krishna2323 Sep 25, 2026
c7dcdfd
Add side padding to the Connections page
Krishna2323 Sep 25, 2026
3fa3a5a
Fix knip and tests after the Connections move
Krishna2323 Sep 25, 2026
13a7d57
Let the Connections page use the full width
Krishna2323 Sep 25, 2026
8bd98d4
Merge main and resolve conflicts.
Krishna2323 Sep 25, 2026
d924246
Update the accounting replace warning and add a Connections moved too…
Krishna2323 Sep 27, 2026
c300a5b
Match the Connections page layout to the design
Krishna2323 Sep 29, 2026
5ae329b
Keep connection cards in two columns on wide screens
Krishna2323 Sep 29, 2026
080e0b0
Refine Connections tabs, search, and footer spacing
Krishna2323 Sep 29, 2026
dd8bce7
Show connection details in the RHP header
Krishna2323 Sep 29, 2026
ccf4bfe
Address review findings on the Connections page
Krishna2323 Sep 29, 2026
ac3c2aa
Remove the unused CompactSearchBar
Krishna2323 Sep 29, 2026
0fc49e2
Add three columns, tab fades, and a table-style empty state to Connec…
Krishna2323 Sep 29, 2026
f7f2dc3
fix empty state alignment.
Krishna2323 Sep 29, 2026
cae2123
Narrow the tab scroll fade to match the design
Krishna2323 Sep 29, 2026
9ca4a22
Fix narrow-layout connects, stale test mock, and old integration links
Krishna2323 Sep 29, 2026
65e7b86
Isolate accounting sync state, gate Uber connect on its data, restore…
Krishna2323 Sep 29, 2026
0ad3ac7
Match search by old integration names, refresh onboarding copy, trim …
Krishna2323 Sep 29, 2026
e480530
Enable Accounting only after the plan check, add an empty tab state, …
Krishna2323 Sep 29, 2026
2d59ada
Keep the tab's listings until the debounced search applies
Krishna2323 Sep 29, 2026
45dd7db
Merge upstream/main into krishna2323/101509-connections-page
Krishna2323 Oct 1, 2026
d3e6222
Drop the tab fade on mobile, clear the tab selection while searching,…
Krishna2323 Oct 1, 2026
9271cc0
Show sync progress on connected cards and match the RHP's last synced…
Krishna2323 Oct 1, 2026
4786806
Return to Connections after upgrading and share one replace prompt ac…
Krishna2323 Oct 1, 2026
6af3289
Give partner logos a white backdrop, show the Connections tooltip onl…
Krishna2323 Oct 1, 2026
f48e7e7
Bring back the Xero and Uber partner offer badges on the Connections …
Krishna2323 Oct 1, 2026
49e6629
Bring back the Xero and Uber partner offer badges on the Connections …
Krishna2323 Oct 1, 2026
ee5ac6c
Use the agreed connection tabs and move the Connections headers to th…
Krishna2323 Oct 1, 2026
edb4ce4
Point the QBO expiry indicator tests at Connections and hide the mock…
Krishna2323 Oct 1, 2026
74c2aca
Show a condensed Offer badge next to the name, hide offers once conne…
Krishna2323 Oct 1, 2026
94df06b
Merge branch 'main' into krishna2323/101509-connections-page
Krishna2323 Oct 2, 2026
7e6b2ef
fix Oxfmt check failure.
Krishna2323 Oct 2, 2026
60fa4af
Wrap the connection cards by a minimum card width instead of a window…
Krishna2323 Oct 2, 2026
c4029fc
update translations.
Krishna2323 Oct 2, 2026
01c3787
Remove stale locale keys and require write access on the offer page
Krishna2323 Oct 5, 2026
b4205f9
Put the unified Connections page behind the unifiedConnections beta
Krishna2323 Oct 5, 2026
c426301
Merge branch 'main' into krishna2323/101509-connections-page
Krishna2323 Oct 5, 2026
3dfbde9
Run the legacy More Features tests without the unified Connections beta
Krishna2323 Oct 5, 2026
a2932e4
Start the Connections page on the All tab instead of persisting the l…
Krishna2323 Oct 5, 2026
e3395a8
Drop the trial cutoff for the Connections tooltip and fix stale comments
Krishna2323 Oct 6, 2026
ef87203
Remove the Campfire beta check from Connections now that main removed…
Krishna2323 Oct 6, 2026
c9f2dda
Merge remote-tracking branch 'origin/main' into krishna2323/101509-co…
Krishna2323 Oct 8, 2026
4ebd9e1
Turn on connections before the Control upgrade so NetSuite can connec…
Krishna2323 Oct 8, 2026
6e10ff9
Merge branch 'main' into krishna2323/101509-connections-page
Krishna2323 Oct 8, 2026
c333a7d
Restore the receipt partners route params lost in the main merge
Krishna2323 Oct 8, 2026
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
17 changes: 17 additions & 0 deletions src/CONST/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1161,6 +1161,7 @@ const CONST = {
INSIGHTS_PAGE: 'insightsPage',
INSIGHTS_COMPARE: 'insightsCompare',
PAYMENT_HISTORY: 'paymentHistory',
UNIFIED_CONNECTIONS: 'unifiedConnections',
ANCHORED_FIELD_DROPDOWNS: 'anchoredFieldDropdowns',
},
BUTTON_STATES: {
Expand Down Expand Up @@ -6821,6 +6822,14 @@ const CONST = {
FLAG_FOR_REVIEW: 'flagForReview',
AGENTS: 'agents',
},
CONNECTIONS: {
ALL: 'all',
ACCOUNTING: 'accounting',
PEOPLE: 'people',
RECRUITING: 'recruiting',
RECEIPTS: 'receipts',
AI: 'ai',
},
WORKFLOWS_TAB_TYPE: 'workflowsTabType',
WORKFLOWS: {
SUBMISSIONS: 'submissions',
Expand Down Expand Up @@ -9134,12 +9143,14 @@ const CONST = {
MILEAGE_RATE_AUTO_UPDATED: 'mileageRateAutoUpdated',
MARK_ALL_AS_READ: 'markAllAsRead',
ACCOUNT_MOVED_TO_TOP_BAR: 'accountMovedToTopBar',
CONNECTIONS_MOVED: 'connectionsMoved',
REQUIRE_FIELDS_RULE_RECEIPT_COUPLING_TOOLTIP: 'requireFieldsRuleReceiptCouplingTooltip',
REQUIRE_FIELDS_RULE_ITEMIZED_RECEIPT_COUPLING_TOOLTIP: 'requireFieldsRuleItemizedReceiptCouplingTooltip',
},
PRODUCT_TRAINING_TOOLTIP_REAPPEAR_WINDOW: {
SEVEN_DAYS: 7 * 24 * 60 * 60 * 1000,
},

INBOX_TAB_STALE_UNREAD_MONTHS: 3,
CHANGE_POLICY_TRAINING_MODAL: 'changePolicyModal',
AGENTS_RULES_BANNER: 'agentsRulesBanner',
Expand Down Expand Up @@ -9889,6 +9900,7 @@ const CONST = {
HR: 'WorkspaceInitial-HR',
RECRUITING: 'WorkspaceInitial-Recruiting',
RECEIPT_PARTNERS: 'WorkspaceInitial-ReceiptPartners',
CONNECTIONS: 'WorkspaceInitial-Connections',
CATEGORIES: 'WorkspaceInitial-Categories',
TAGS: 'WorkspaceInitial-Tags',
TAXES: 'WorkspaceInitial-Taxes',
Expand Down Expand Up @@ -9973,6 +9985,11 @@ const CONST = {
CARD_SECTION_ADD_BUTTON: 'WorkspaceAccounting-CardSectionAddButton',
THREE_DOT_MENU: 'WorkspaceAccounting-ThreeDotMenu',
},
CONNECTIONS: {
CARD: 'WorkspaceConnections-Card',
CONFIGURE_BUTTON: 'WorkspaceConnections-ConfigureButton',
SUGGEST_INTEGRATION: 'WorkspaceConnections-SuggestIntegration',
},
RULES: {
ADD_SPEND_RULE: 'WorkspaceRules-AddSpendRule',
INDIVIDUAL_EXPENSES_MENU_ITEM: 'WorkspaceRules-IndividualExpensesMenuItem',
Expand Down
102 changes: 86 additions & 16 deletions src/ROUTES.ts
Original file line number Diff line number Diff line change
Expand Up @@ -714,11 +714,16 @@ const DYNAMIC_ROUTES = {
},
SAGE_INTACCT_PREREQUISITES: {
path: 'sage-intacct/prerequisites',
entryScreens: [SCREENS.WORKSPACE.ACCOUNTING.ROOT, SCREENS.WORKSPACE.ACCOUNTING.EXISTING_SAGE_INTACCT_CONNECTIONS],
entryScreens: [
SCREENS.WORKSPACE.ACCOUNTING.ROOT,
SCREENS.WORKSPACE.CONNECTIONS_ACCOUNTING,
SCREENS.WORKSPACE.CONNECTIONS,
SCREENS.WORKSPACE.ACCOUNTING.EXISTING_SAGE_INTACCT_CONNECTIONS,
],
},
POLICY_ACCOUNTING_CERTINIA_EXPORT: {
path: 'certinia/export',
entryScreens: [SCREENS.WORKSPACE.ACCOUNTING.ROOT],
entryScreens: [SCREENS.WORKSPACE.ACCOUNTING.ROOT, SCREENS.WORKSPACE.CONNECTIONS_ACCOUNTING],
},
POLICY_ACCOUNTING_CERTINIA_PREFERRED_EXPORTER: {
path: 'certinia-preferred-exporter/select',
Expand All @@ -738,7 +743,7 @@ const DYNAMIC_ROUTES = {
},
POLICY_ACCOUNTING_CERTINIA_ADVANCED: {
path: 'certinia/advanced',
entryScreens: [SCREENS.WORKSPACE.ACCOUNTING.ROOT],
entryScreens: [SCREENS.WORKSPACE.ACCOUNTING.ROOT, SCREENS.WORKSPACE.CONNECTIONS_ACCOUNTING],
},
POLICY_ACCOUNTING_CERTINIA_FX_EXPENSE_ACCOUNT: {
path: 'certinia-fx-expense-account/select',
Expand All @@ -750,7 +755,7 @@ const DYNAMIC_ROUTES = {
},
POLICY_ACCOUNTING_CERTINIA_COMPANY_SELECTOR: {
path: 'certinia/company',
entryScreens: [SCREENS.WORKSPACE.ACCOUNTING.ROOT],
entryScreens: [SCREENS.WORKSPACE.ACCOUNTING.ROOT, SCREENS.WORKSPACE.CONNECTIONS_ACCOUNTING],
},
POLICY_ACCOUNTING_NETSUITE_EXPORT_EXPENSES_VENDOR_SELECT: {
path: 'vendor/select',
Expand All @@ -766,7 +771,7 @@ const DYNAMIC_ROUTES = {
},
POLICY_ACCOUNTING_NETSUITE_EXPORT: {
path: 'connections/netsuite/export',
entryScreens: [SCREENS.WORKSPACE.ACCOUNTING.ROOT, SCREENS.WORKSPACE.DYNAMIC_COMPANY_CARD_EXPORT],
entryScreens: [SCREENS.WORKSPACE.ACCOUNTING.ROOT, SCREENS.WORKSPACE.CONNECTIONS_ACCOUNTING, SCREENS.WORKSPACE.DYNAMIC_COMPANY_CARD_EXPORT],
},
POLICY_ACCOUNTING_NETSUITE_RECEIVABLE_ACCOUNT_SELECT: {
path: 'receivable-account/select',
Expand Down Expand Up @@ -819,7 +824,7 @@ const DYNAMIC_ROUTES = {
},
POLICY_ACCOUNTING_QUICKBOOKS_ONLINE_EXPORT: {
path: 'quickbooks-online/export',
entryScreens: [SCREENS.WORKSPACE.ACCOUNTING.ROOT, SCREENS.WORKSPACE.DYNAMIC_COMPANY_CARD_EXPORT],
entryScreens: [SCREENS.WORKSPACE.ACCOUNTING.ROOT, SCREENS.WORKSPACE.CONNECTIONS_ACCOUNTING, SCREENS.WORKSPACE.DYNAMIC_COMPANY_CARD_EXPORT],
},
POLICY_ACCOUNTING_QUICKBOOKS_ONLINE_COMPANY_CARD_EXPENSE_ACCOUNT: {
path: 'company-card-expense-account',
Expand All @@ -835,7 +840,7 @@ const DYNAMIC_ROUTES = {
},
POLICY_ACCOUNTING_QUICKBOOKS_DESKTOP_EXPORT: {
path: 'quickbooks-desktop/export',
entryScreens: [SCREENS.WORKSPACE.ACCOUNTING.ROOT, SCREENS.WORKSPACE.DYNAMIC_COMPANY_CARD_EXPORT],
entryScreens: [SCREENS.WORKSPACE.ACCOUNTING.ROOT, SCREENS.WORKSPACE.CONNECTIONS_ACCOUNTING, SCREENS.WORKSPACE.DYNAMIC_COMPANY_CARD_EXPORT],
},
POLICY_ACCOUNTING_QUICKBOOKS_DESKTOP_COMPANY_CARD_EXPENSE_ACCOUNT: {
path: 'qbd-company-card-expense-account',
Expand Down Expand Up @@ -925,7 +930,7 @@ const DYNAMIC_ROUTES = {
},
POLICY_ACCOUNTING_XERO_EXPORT: {
path: 'xero/export',
entryScreens: [SCREENS.WORKSPACE.ACCOUNTING.ROOT, SCREENS.WORKSPACE.DYNAMIC_COMPANY_CARD_EXPORT],
entryScreens: [SCREENS.WORKSPACE.ACCOUNTING.ROOT, SCREENS.WORKSPACE.CONNECTIONS_ACCOUNTING, SCREENS.WORKSPACE.DYNAMIC_COMPANY_CARD_EXPORT],
},
POLICY_ACCOUNTING_XERO_PREFERRED_EXPORTER_SELECT: {
path: 'xero-preferred-exporter/select',
Expand Down Expand Up @@ -961,7 +966,7 @@ const DYNAMIC_ROUTES = {
},
WORKSPACE_ACCOUNTING_QUICKBOOKS_DESKTOP_ADVANCED: {
path: 'quickbooks-desktop/advanced',
entryScreens: [SCREENS.WORKSPACE.ACCOUNTING.ROOT],
entryScreens: [SCREENS.WORKSPACE.ACCOUNTING.ROOT, SCREENS.WORKSPACE.CONNECTIONS_ACCOUNTING],
},
POLICY_ACCOUNTING_QUICKBOOKS_DESKTOP_FX_EXPENSE_ACCOUNT_SELECT: {
path: 'qbd-fx-expense-account-select',
Expand Down Expand Up @@ -1181,7 +1186,7 @@ const DYNAMIC_ROUTES = {
},
POLICY_ACCOUNTING_SAGE_INTACCT_EXPORT: {
path: 'sage-intacct/export',
entryScreens: [SCREENS.WORKSPACE.ACCOUNTING.ROOT, SCREENS.WORKSPACE.DYNAMIC_COMPANY_CARD_EXPORT],
entryScreens: [SCREENS.WORKSPACE.ACCOUNTING.ROOT, SCREENS.WORKSPACE.CONNECTIONS_ACCOUNTING, SCREENS.WORKSPACE.DYNAMIC_COMPANY_CARD_EXPORT],
},
WORKSPACE_OVERVIEW_PLAN: {
path: 'plan',
Expand Down Expand Up @@ -1306,14 +1311,14 @@ const DYNAMIC_ROUTES = {
// suffix inherits their `:policyID` (same as WORKSPACE_INVITE above).
path: 'hr-sync-results',
// The results screen opens automatically when an HR sync finishes, and a sync can complete
// while the user is on either the HR page or the members list, so both are entry screens.
entryScreens: [SCREENS.WORKSPACE.HR, SCREENS.WORKSPACE.MEMBERS],
// while the user is on the HR page, the Connections page or its HR panel, or the members list.
entryScreens: [SCREENS.WORKSPACE.HR, SCREENS.WORKSPACE.CONNECTIONS, SCREENS.WORKSPACE.CONNECTIONS_HR, SCREENS.WORKSPACE.MEMBERS],
},
WORKSPACE_RECRUITING_SYNC_RESULTS: {
// The results screen opens automatically when a recruiting sync finishes, and a sync can complete
// while the user is on either the recruiting page or the members list, so both are entry screens.
// while the user is on the recruiting page, the Connections page or its recruiting panel, or the members list.
path: 'recruiting-sync-results',
entryScreens: [SCREENS.WORKSPACE.RECRUITING, SCREENS.WORKSPACE.MEMBERS],
entryScreens: [SCREENS.WORKSPACE.RECRUITING, SCREENS.WORKSPACE.CONNECTIONS, SCREENS.WORKSPACE.CONNECTIONS_RECRUITING, SCREENS.WORKSPACE.MEMBERS],
},
WORKSPACE_OWNER_CHANGE_CHECK: {
path: 'change-owner/:policyID/:accountID/:error',
Expand All @@ -1336,12 +1341,12 @@ const DYNAMIC_ROUTES = {
},
WORKSPACE_RECEIPT_PARTNERS_INVITE_EDIT: {
path: ':integration/invite/edit',
entryScreens: [SCREENS.WORKSPACE.RECEIPT_PARTNERS],
entryScreens: [SCREENS.WORKSPACE.RECEIPT_PARTNERS, SCREENS.WORKSPACE.CONNECTIONS_RECEIPT_PARTNERS],
getRoute: (integration: string) => `${integration}/invite/edit` as const,
},
WORKSPACE_RECEIPT_PARTNERS_INVITE: {
path: ':integration/invite',
entryScreens: [SCREENS.WORKSPACE.RECEIPT_PARTNERS],
entryScreens: [SCREENS.WORKSPACE.RECEIPT_PARTNERS, SCREENS.WORKSPACE.CONNECTIONS_RECEIPT_PARTNERS],
getRoute: (integration: string) => `${integration}/invite` as const,
},
EXPENSIFY_CARD_DETAILS: {
Expand Down Expand Up @@ -3490,6 +3495,71 @@ const ROUTES = {
return `workspaces/${policyID}/accounting${queryParams}` as const;
},
},
WORKSPACE_CONNECTIONS: {
route: 'workspaces/:policyID/connections',
getRoute: (
policyID: string | undefined,
newConnectionName?: ConnectionName,
integrationToDisconnect?: ConnectionName,
shouldDisconnectIntegrationBeforeConnecting?: boolean,
isIntuitEnterpriseSuite?: boolean,
) => {
if (!policyID) {
Log.warn('Invalid policyID is used to build the WORKSPACE_CONNECTIONS route');
}

let queryParams = '';
if (newConnectionName) {
queryParams += `?newConnectionName=${newConnectionName}`;
if (integrationToDisconnect) {
queryParams += `&integrationToDisconnect=${integrationToDisconnect}`;
}
if (shouldDisconnectIntegrationBeforeConnecting !== undefined) {
queryParams += `&shouldDisconnectIntegrationBeforeConnecting=${shouldDisconnectIntegrationBeforeConnecting}`;
}
if (isIntuitEnterpriseSuite !== undefined) {
queryParams += `&isIntuitEnterpriseSuite=${isIntuitEnterpriseSuite}`;
}
}
return `workspaces/${policyID}/connections${queryParams}` as const;
},
},
WORKSPACE_CONNECTIONS_ACCOUNTING: {
route: 'workspaces/:policyID/connections/accounting',
getRoute: (policyID: string | undefined) => {
if (!policyID) {
Log.warn('Invalid policyID is used to build the WORKSPACE_CONNECTIONS_ACCOUNTING route');
}
return `workspaces/${policyID}/connections/accounting` as const;
},
},
WORKSPACE_CONNECTIONS_HR: {
route: 'workspaces/:policyID/connections/hr',
getRoute: (policyID: string | undefined) => {
if (!policyID) {
Log.warn('Invalid policyID is used to build the WORKSPACE_CONNECTIONS_HR route');
}
return `workspaces/${policyID}/connections/hr` as const;
},
},
WORKSPACE_CONNECTIONS_RECRUITING: {
route: 'workspaces/:policyID/connections/recruiting',
getRoute: (policyID: string | undefined) => {
if (!policyID) {
Log.warn('Invalid policyID is used to build the WORKSPACE_CONNECTIONS_RECRUITING route');
}
return `workspaces/${policyID}/connections/recruiting` as const;
},
},
WORKSPACE_CONNECTIONS_RECEIPT_PARTNERS: {
route: 'workspaces/:policyID/connections/receipt-partners',
getRoute: (policyID: string | undefined) => {
if (!policyID) {
Log.warn('Invalid policyID is used to build the WORKSPACE_CONNECTIONS_RECEIPT_PARTNERS route');
}
return `workspaces/${policyID}/connections/receipt-partners` as const;
},
},
WORKSPACE_ACCOUNTING_QUICKBOOKS_ONLINE_ADVANCED: {
route: 'workspaces/:policyID/accounting/quickbooks-online/advanced',
getRoute: (policyID: string | undefined) => {
Expand Down
5 changes: 5 additions & 0 deletions src/SCREENS.ts
Original file line number Diff line number Diff line change
Expand Up @@ -982,6 +982,11 @@ const SCREENS = {
DYNAMIC_WORKSPACE_DOWNGRADE: 'Dynamic_Workspace_Downgrade',
DYNAMIC_PAY_AND_DOWNGRADE: 'Dynamic_Workspace_Pay_And_Downgrade',
MCP: 'Workspace_MCP',
CONNECTIONS: 'Workspace_Connections',
CONNECTIONS_ACCOUNTING: 'Workspace_Connections_Accounting',
CONNECTIONS_HR: 'Workspace_Connections_HR',
CONNECTIONS_RECRUITING: 'Workspace_Connections_Recruiting',
CONNECTIONS_RECEIPT_PARTNERS: 'Workspace_Connections_Receipt_Partners',
RECEIPT_PARTNERS: 'Workspace_Receipt_Partners',
DYNAMIC_RECEIPT_PARTNERS_INVITE: 'Dynamic_Workspace_Receipt_Partners_Invite',
DYNAMIC_RECEIPT_PARTNERS_INVITE_EDIT: 'Dynamic_Workspace_Receipt_Partners_Invite_Edit',
Expand Down
6 changes: 5 additions & 1 deletion src/components/ConnectToSageIntacctFlow/index.tsx
Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@
import useHasReusablePoliciesConnectedTo from '@hooks/useHasReusablePoliciesConnectedTo';
import useOnyx from '@hooks/useOnyx';
import usePermissions from '@hooks/usePermissions';

import {isAuthenticationError} from '@libs/actions/connections';
import Navigation from '@libs/Navigation/Navigation';

import {getAccountingConnectionsRoute} from '@pages/workspace/connections/utils';

import CONST from '@src/CONST';
import ONYXKEYS from '@src/ONYXKEYS';
import ROUTES, {DYNAMIC_ROUTES} from '@src/ROUTES';
Expand All @@ -18,14 +21,15 @@ function ConnectToSageIntacctFlow({policyID}: ConnectToSageIntacctFlowProps) {
const hasReusablePoliciesConnectedToSageIntacct = useHasReusablePoliciesConnectedTo(CONST.POLICY.CONNECTIONS.NAME.SAGE_INTACCT, policyID);
const [policy] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY}${policyID}`);
const shouldGoToEnterCredentials = isAuthenticationError(policy, CONST.POLICY.CONNECTIONS.NAME.SAGE_INTACCT);
const {isBetaEnabled} = usePermissions();

useEffect(() => {
if (shouldGoToEnterCredentials) {
Navigation.navigate(ROUTES.POLICY_ACCOUNTING_SAGE_INTACCT_ENTER_CREDENTIALS.getRoute(policyID));
return;
}
if (!hasReusablePoliciesConnectedToSageIntacct) {
Navigation.navigate(`${ROUTES.POLICY_ACCOUNTING.getRoute(policyID)}/${DYNAMIC_ROUTES.SAGE_INTACCT_PREREQUISITES.path}`);
Navigation.navigate(`${getAccountingConnectionsRoute(isBetaEnabled(CONST.BETAS.UNIFIED_CONNECTIONS), policyID)}/${DYNAMIC_ROUTES.SAGE_INTACCT_PREREQUISITES.path}`);
return;
}
Navigation.navigate(ROUTES.POLICY_ACCOUNTING_SAGE_INTACCT_EXISTING_CONNECTIONS.getRoute(policyID));
Expand Down
1 change: 1 addition & 0 deletions src/components/FocusTrap/WIDE_LAYOUT_INACTIVE_SCREENS.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ const WIDE_LAYOUT_INACTIVE_SCREENS: string[] = [
SCREENS.WORKSPACES_LIST,
SCREENS.SETTINGS.SUBSCRIPTION.ROOT,
SCREENS.WORKSPACE.ACCOUNTING.ROOT,
SCREENS.WORKSPACE.CONNECTIONS,
SCREENS.WORKSPACE.INITIAL,
SCREENS.WORKSPACE.PROFILE,
SCREENS.WORKSPACE.WORKFLOWS,
Expand Down
18 changes: 16 additions & 2 deletions src/components/MenuItem/MenuItem.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ import type WithSentryLabel from '@src/types/utils/SentryLabel';

import type {ImageContentFit} from 'expo-image';
import type {ComponentRef, ReactElement, ReactNode, Ref} from 'react';
import type {GestureResponderEvent, Role, StyleProp, TextStyle, ViewStyle} from 'react-native';
import type {GestureResponderEvent, ImageStyle, Role, StyleProp, TextStyle, ViewStyle} from 'react-native';
import type {AnimatedStyle} from 'react-native-reanimated';
import type {ValueOf} from 'type-fest';

Expand Down Expand Up @@ -178,6 +178,9 @@ type MenuItemBaseProps = ForwardedFSClassProps &
/** Optional component to render before the description text (e.g. a badge pill) */
descriptionAddon?: ReactNode;

/** Content shown right after the title, on the same line */
titleAddon?: ReactNode;

/** Text to show below menu item. This text is not interactive */
helperText?: string;

Expand Down Expand Up @@ -241,6 +244,9 @@ type MenuItemBaseProps = ForwardedFSClassProps &
/** Prop to represent the size of the avatar images to be shown */
avatarSize?: ValueOf<typeof CONST.AVATAR_SIZE>;

/** Additional styles for the avatar image when the icon type is an avatar */
avatarImageStyles?: StyleProp<ViewStyle & ImageStyle>;

/** Affects avatar size */
viewMode?: ValueOf<typeof CONST.OPTION_MODE>;

Expand Down Expand Up @@ -358,6 +364,9 @@ type MenuItemBaseProps = ForwardedFSClassProps &
/** Whether the tooltip should hide on scroll */
shouldHideOnScroll?: boolean;

/** Whether the tooltip should hide when the screen loses navigation focus */
shouldHideTooltipOnNavigate?: boolean;

shouldShowLoadingSpinnerIcon?: boolean;
shouldShowRadioButton?: boolean;

Expand Down Expand Up @@ -473,6 +482,7 @@ function MenuItem({
furtherDetailsComponent,
description,
descriptionAddon,
titleAddon,
helperText,
helperTextStyle,
errorText,
Expand Down Expand Up @@ -503,6 +513,7 @@ function MenuItem({
leftComponent,
rightIconReportID,
avatarSize = CONST.AVATAR_SIZE.DEFAULT,
avatarImageStyles,
isSmallAvatarSubscriptMenu = false,
brickRoadIndicator,
shouldRenderAsHTML = false,
Expand Down Expand Up @@ -534,6 +545,7 @@ function MenuItem({
shouldRenderTooltip = false,
shouldDisplayEducationalTooltip,
shouldHideOnScroll = false,
shouldHideTooltipOnNavigate = true,
tooltipAnchorAlignment,
tooltipWrapperStyle = {},
tooltipShiftHorizontal = 0,
Expand Down Expand Up @@ -799,6 +811,7 @@ function MenuItem({
shouldTeleportPortalToModalLayer={shouldTeleportPortalToModalLayer}
onTooltipPress={onEducationTooltipPress}
shouldHideOnScroll={shouldHideOnScroll}
shouldHideOnNavigate={shouldHideTooltipOnNavigate}
>
<View>
<Hoverable
Expand Down Expand Up @@ -944,7 +957,7 @@ function MenuItem({
)}
{iconType === CONST.ICON_TYPE_AVATAR && (
<UserAvatar
imageStyles={styles.alignSelfCenter}
imageStyles={[styles.alignSelfCenter, avatarImageStyles]}
source={icon}
accountID={getAccountIDFromAvatarID(avatarID)}
fallbackIcon={fallbackIcon ?? icons.FallbackAvatar}
Expand Down Expand Up @@ -1021,6 +1034,7 @@ function MenuItem({
/>
</View>
)}
{titleAddon}
</View>
)}
{!shouldShowDescriptionOnTop && renderDescriptionView()}
Expand Down
Loading
Loading