Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
34 commits
Select commit Hold shift + click to select a range
f81fcd2
Create domain split navigator and first pages
mhawryluk Oct 28, 2025
b24d94d
Merge branch 'feat/domain-validation' into feat/domain-page
mhawryluk Oct 28, 2025
e325f1d
Fix after merge
mhawryluk Oct 28, 2025
dee2e6b
Divide VerifyDomain page between workspaces list/domain views
mhawryluk Oct 28, 2025
f2f845b
Merge branch 'feat/domain-validation' into feat/domain-page
mhawryluk Nov 3, 2025
a9f4dad
Fix after merge
mhawryluk Nov 3, 2025
cbfd0be
Compress svg
mhawryluk Nov 3, 2025
29a5631
Make domain verify RHPs appear above domain page after refresh
mhawryluk Nov 3, 2025
6da0eb6
Fix header back button navigation from domain center pages
mhawryluk Nov 3, 2025
93b0776
Separate DomainVerifiedPage between workspaces list/domain page
mhawryluk Nov 3, 2025
80fa3ec
Merge branch 'main' into feat/domain-page
mhawryluk Nov 7, 2025
5aeed26
Add "go to domain" three-dot menu item
mhawryluk Nov 7, 2025
e4ddebb
Change domain row icon depending on validation status
mhawryluk Nov 7, 2025
1f6cf86
Show the last visited domain page on workspaces tab click
mhawryluk Nov 10, 2025
cb94f9e
Fix new illustration svg
mhawryluk Nov 10, 2025
cd0228a
Add translations
mhawryluk Nov 10, 2025
e9939f1
Fix handleOpenWorkspaceOrDomainSplitAction
mhawryluk Nov 10, 2025
c8661da
Don't open non-existing domains on workspaces tab click
mhawryluk Nov 10, 2025
639363a
Spanish translations (pre-corrections)
mhawryluk Nov 10, 2025
197cfda
Block access to the domain page for non-admins + fix domainVerified "…
mhawryluk Nov 10, 2025
742a9ed
Prepend at symbol to the domain name in the description
mhawryluk Nov 10, 2025
1bf8d89
Move empty state illustration styles
mhawryluk Nov 10, 2025
422bac3
Merge branch 'main' into feat/domain-page
mhawryluk Nov 10, 2025
165f321
Fix not found page visible after verifying domain in the saml page
mhawryluk Nov 10, 2025
11fcb2b
Implement review suggestions
mhawryluk Nov 10, 2025
316fdbd
Add handling workspaceOrDomainSplitsWithoutEnteringAnimation in Domai…
mhawryluk Nov 10, 2025
663255d
Use theme styles in DomainSplitNavigator
mhawryluk Nov 12, 2025
9debb83
Extract common split navigator logic to a new hook
mhawryluk Nov 12, 2025
3957599
Fetch domain admin info from onyx only for the current domain in Doma…
mhawryluk Nov 12, 2025
f48f799
Don't show cta button when domain is verified
mhawryluk Nov 12, 2025
f37cf67
Revert "Don't show cta button when domain is verified"
mhawryluk Nov 12, 2025
ae3a95a
Navigate to domain initial page instead of saml in WorkspacesListPage
mhawryluk Nov 12, 2025
8f92f29
isAdmin fixes
mhawryluk Nov 12, 2025
b15b723
Use isLoadingOnyxValue util
mhawryluk Nov 13, 2025
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
1 change: 1 addition & 0 deletions assets/images/laptop-on-desk-with-coffee-and-key.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
2 changes: 2 additions & 0 deletions src/CONST/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1025,6 +1025,7 @@ const CONST = {
MERGE_ACCOUNT_HELP_URL: 'https://help.expensify.com/articles/new-expensify/settings/Merge-Accounts',
CONNECT_A_BUSINESS_BANK_ACCOUNT_HELP_URL: 'https://help.expensify.com/articles/new-expensify/expenses-&-payments/Connect-a-Business-Bank-Account',
DOMAIN_VERIFICATION_HELP_URL: 'https://help.expensify.com/articles/expensify-classic/domains/Claim-And-Verify-A-Domain',
SAML_HELP_URL: 'https://help.expensify.com/articles/expensify-classic/domains/Managing-Single-Sign-On-(SSO)-in-Expensify',
REGISTER_FOR_WEBINAR_URL: 'https://events.zoom.us/eo/Aif1I8qCi1GZ7KnLnd1vwGPmeukSRoPjFpyFAZ2udQWn0-B86e1Z~AggLXsr32QYFjq8BlYLZ5I06Dg',
TEST_RECEIPT_URL: `${CLOUDFRONT_URL}/images/fake-receipt__tacotodds.png`,
// Use Environment.getEnvironmentURL to get the complete URL with port number
Expand Down Expand Up @@ -5382,6 +5383,7 @@ const CONST = {
/** These action types are custom for RootNavigator */
DISMISS_MODAL: 'DISMISS_MODAL',
OPEN_WORKSPACE_SPLIT: 'OPEN_WORKSPACE_SPLIT',
OPEN_DOMAIN_SPLIT: 'OPEN_DOMAIN_SPLIT',
SET_HISTORY_PARAM: 'SET_HISTORY_PARAM',
REPLACE_PARAMS: 'REPLACE_PARAMS',
TOGGLE_SIDE_PANEL_WITH_HISTORY: 'TOGGLE_SIDE_PANEL_WITH_HISTORY',
Expand Down
1 change: 1 addition & 0 deletions src/NAVIGATORS.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ export default {
REPORTS_SPLIT_NAVIGATOR: 'ReportsSplitNavigator',
SETTINGS_SPLIT_NAVIGATOR: 'SettingsSplitNavigator',
WORKSPACE_SPLIT_NAVIGATOR: 'WorkspaceSplitNavigator',
DOMAIN_SPLIT_NAVIGATOR: 'DomainSplitNavigator',
SEARCH_FULLSCREEN_NAVIGATOR: 'SearchFullscreenNavigator',
SHARE_MODAL_NAVIGATOR: 'ShareModalNavigator',
PUBLIC_RIGHT_MODAL_NAVIGATOR: 'PublicRightModalNavigator',
Expand Down
16 changes: 16 additions & 0 deletions src/ROUTES.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3367,6 +3367,22 @@ const ROUTES = {
route: 'workspaces/domain-verified/:accountID',
getRoute: (accountID: number) => `workspaces/domain-verified/${accountID}` as const,
},
DOMAIN_INITIAL: {
route: 'domain/:accountID',
getRoute: (accountID: number) => `domain/${accountID}` as const,
},
DOMAIN_SAML: {
route: 'domain/:accountID/saml',
getRoute: (accountID: number) => `domain/${accountID}/saml` as const,
},
DOMAIN_VERIFY: {
route: 'domain/:accountID/verify',
getRoute: (accountID: number) => `domain/${accountID}/verify` as const,
},
DOMAIN_VERIFIED: {
route: 'domain/:accountID/verified',
getRoute: (accountID: number) => `domain/${accountID}/verified` as const,
},
} as const;

/**
Expand Down
6 changes: 6 additions & 0 deletions src/SCREENS.ts
Original file line number Diff line number Diff line change
Expand Up @@ -824,6 +824,12 @@ const SCREENS = {
},
WORKSPACES_VERIFY_DOMAIN: 'Workspaces_Verify_Domain',
WORKSPACES_DOMAIN_VERIFIED: 'Workspaces_Domain_Verified',
DOMAIN: {
VERIFY: 'Domain_Verify',
VERIFIED: 'Domain_Verified',
INITIAL: 'Domain_Initial',
SAML: 'Domain_SAML',
},
} as const;

type Screen = DeepValueOf<typeof SCREENS>;
Expand Down
25 changes: 25 additions & 0 deletions src/components/Domain/DomainMenuItem.tsx
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
import React from 'react';
import Icon from '@components/Icon';
import * as Expensicons from '@components/Icon/Expensicons';
import type {OfflineWithFeedbackProps} from '@components/OfflineWithFeedback';
import OfflineWithFeedback from '@components/OfflineWithFeedback';
import type {PopoverMenuItem} from '@components/PopoverMenu';
import {PressableWithoutFeedback} from '@components/Pressable';
import useLocalize from '@hooks/useLocalize';
import useTheme from '@hooks/useTheme';
import useThemeStyles from '@hooks/useThemeStyles';
import Navigation from '@libs/Navigation/Navigation';
import CONST from '@src/CONST';
Expand Down Expand Up @@ -43,10 +45,16 @@ function DomainMenuItem({item, index}: DomainMenuItemProps) {
const styles = useThemeStyles();
const {translate} = useLocalize();
const {isAdmin, isValidated} = item;
const theme = useTheme();

const threeDotsMenuItems: PopoverMenuItem[] | undefined =
!isValidated && isAdmin
? [
{
icon: Expensicons.Globe,
text: translate('domain.goToDomain'),
onSelected: item.action,
},
{
icon: Expensicons.Globe,
text: translate('domain.verifyDomain.title'),
Expand Down Expand Up @@ -74,6 +82,23 @@ function DomainMenuItem({item, index}: DomainMenuItemProps) {
badgeText={isAdmin && !isValidated ? translate('domain.notVerified') : undefined}
isHovered={hovered}
menuItems={threeDotsMenuItems}
rightIcon={
isValidated ? (
<Icon
src={Expensicons.NewWindow}
fill={hovered ? theme.iconHovered : theme.icon}
isButtonIcon
/>
) : (
<Icon
src={Expensicons.ArrowRight}
fill={theme.icon}
additionalStyles={[styles.alignSelfCenter, !hovered && styles.opacitySemiTransparent]}
isButtonIcon
medium
/>
)
}
/>
)}
</PressableWithoutFeedback>
Expand Down
16 changes: 7 additions & 9 deletions src/components/Domain/DomainsListRow.tsx
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import type {ReactElement} from 'react';
import React from 'react';
import {View} from 'react-native';
import type {ValueOf} from 'type-fest';
Expand All @@ -24,11 +25,14 @@ type DomainsListRowProps = {
/** Items for the three dots menu */
menuItems?: PopoverMenuItem[];

/** The type of brick road indicator to show. */
/** The type of brick road indicator to show */
brickRoadIndicator?: ValueOf<typeof CONST.BRICK_ROAD_INDICATOR_STATUS>;

/** Icon to display at the end of the row */
rightIcon: ReactElement<typeof Icon>;
};

function DomainsListRow({title, isHovered, badgeText, brickRoadIndicator, menuItems}: DomainsListRowProps) {
function DomainsListRow({title, isHovered, badgeText, brickRoadIndicator, menuItems, rightIcon}: DomainsListRowProps) {
const styles = useThemeStyles();
const theme = useTheme();

Expand Down Expand Up @@ -79,13 +83,7 @@ function DomainsListRow({title, isHovered, badgeText, brickRoadIndicator, menuIt
)}
</View>
</View>
<View style={styles.touchableButtonImage}>
<Icon
src={Expensicons.NewWindow}
fill={isHovered ? theme.iconHovered : theme.icon}
isButtonIcon
/>
</View>
<View style={styles.touchableButtonImage}>{rightIcon}</View>
</View>
</View>
);
Expand Down
5 changes: 5 additions & 0 deletions src/components/FeatureList.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,9 @@ type FeatureListProps = {
/** The text to display in the subtitle of the section */
subtitle?: string;

/** The component to display custom subtitle */
renderSubtitle?: () => ReactNode;

/** Text of the call to action button */
ctaText?: string;

Expand Down Expand Up @@ -76,6 +79,7 @@ function FeatureList({
contentPaddingOnLargeScreens,
footer,
isButtonDisabled = false,
renderSubtitle,
}: FeatureListProps) {
const styles = useThemeStyles();
const {translate} = useLocalize();
Expand All @@ -92,6 +96,7 @@ function FeatureList({
titleStyles={titleStyles}
illustrationContainerStyle={illustrationContainerStyle}
contentPaddingOnLargeScreens={contentPaddingOnLargeScreens}
renderSubtitle={renderSubtitle}
>
<View style={styles.flex1}>
<View style={[styles.flex1, styles.flexRow, styles.flexWrap, styles.rowGap4, styles.pv4, styles.pl1]}>
Expand Down
4 changes: 4 additions & 0 deletions src/components/Icon/Illustrations.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ import CompanyCardsPendingState from '@assets/images/companyCards/pendingstate_l
import Computer from '@assets/images/computer.svg';
import EmptyCardState from '@assets/images/emptystate__expensifycard.svg';
import ExpensifyCardImage from '@assets/images/expensify-card.svg';
import LaptopOnDeskWithCoffeeAndKey from '@assets/images/laptop-on-desk-with-coffee-and-key.svg';
import LaptopWithSecondScreenAndHourglass from '@assets/images/laptop-with-second-screen-and-hourglass.svg';
import LaptopWithSecondScreenSync from '@assets/images/laptop-with-second-screen-sync.svg';
import LaptopWithSecondScreenX from '@assets/images/laptop-with-second-screen-x.svg';
Expand Down Expand Up @@ -85,6 +86,7 @@ import Luggage from '@assets/images/simple-illustrations/simple-illustration__lu
import Mailbox from '@assets/images/simple-illustrations/simple-illustration__mailbox.svg';
import ExpensifyMobileApp from '@assets/images/simple-illustrations/simple-illustration__mobileapp.svg';
import MoneyIntoWallet from '@assets/images/simple-illustrations/simple-illustration__moneyintowallet.svg';
import OpenSafe from '@assets/images/simple-illustrations/simple-illustration__opensafe.svg';
import PalmTree from '@assets/images/simple-illustrations/simple-illustration__palmtree.svg';
import PaperAirplane from '@assets/images/simple-illustrations/simple-illustration__paperairplane.svg';
import Pencil from '@assets/images/simple-illustrations/simple-illustration__pencil.svg';
Expand Down Expand Up @@ -226,4 +228,6 @@ export {
CardReplacementSuccess,
EmptyShelves,
BlueShield,
OpenSafe,
LaptopOnDeskWithCoffeeAndKey,
};
41 changes: 33 additions & 8 deletions src/components/Navigation/NavigationTabBar/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ import {buildCannedSearchQuery, buildSearchQueryJSON, buildSearchQueryString} fr
import type {BrickRoad} from '@libs/WorkspacesSettingsUtils';
import {getChatTabBrickRoad} from '@libs/WorkspacesSettingsUtils';
import navigationRef from '@navigation/navigationRef';
import type {RootNavigatorParamList, SearchFullscreenNavigatorParamList, State, WorkspaceSplitNavigatorParamList} from '@navigation/types';
import type {DomainSplitNavigatorParamList, RootNavigatorParamList, SearchFullscreenNavigatorParamList, State, WorkspaceSplitNavigatorParamList} from '@navigation/types';
import NavigationTabBarAvatar from '@pages/home/sidebar/NavigationTabBarAvatar';
import NavigationTabBarFloatingActionButton from '@pages/home/sidebar/NavigationTabBarFloatingActionButton';
import variables from '@styles/variables';
Expand All @@ -44,7 +44,7 @@ import NAVIGATORS from '@src/NAVIGATORS';
import ONYXKEYS from '@src/ONYXKEYS';
import ROUTES from '@src/ROUTES';
import SCREENS from '@src/SCREENS';
import type {Policy} from '@src/types/onyx';
import type {Domain, Policy} from '@src/types/onyx';
import NAVIGATION_TABS from './NAVIGATION_TABS';

type NavigationTabBarProps = {
Expand Down Expand Up @@ -78,20 +78,25 @@ function NavigationTabBar({selectedTab, isTopLevelBar = false, shouldShowFloatin
const initialNavigationRouteState = getWorkspaceNavigationRouteState();
const [lastWorkspacesTabNavigatorRoute, setLastWorkspacesTabNavigatorRoute] = useState(initialNavigationRouteState.lastWorkspacesTabNavigatorRoute);
const [workspacesTabState, setWorkspacesTabState] = useState(initialNavigationRouteState.workspacesTabState);
const params = workspacesTabState?.routes?.at(0)?.params as WorkspaceSplitNavigatorParamList[typeof SCREENS.WORKSPACE.INITIAL];
const params = workspacesTabState?.routes?.at(0)?.params as
| WorkspaceSplitNavigatorParamList[typeof SCREENS.WORKSPACE.INITIAL]
| DomainSplitNavigatorParamList[typeof SCREENS.DOMAIN.INITIAL];
const {typeMenuSections} = useSearchTypeMenuSections();
const subscriptionPlan = useSubscriptionPlan();
const expensifyIcons = useMemoizedLazyExpensifyIcons(['ExpensifyAppIcon', 'Inbox', 'MoneySearch', 'Buildings'] as const);

const paramsPolicyID = params && 'policyID' in params ? params.policyID : undefined;
const paramsDomainAccountID = params && 'accountID' in params ? params.accountID : undefined;

const lastViewedPolicySelector = useCallback(
(policies: OnyxCollection<Policy>) => {
if (!lastWorkspacesTabNavigatorRoute || lastWorkspacesTabNavigatorRoute.name !== NAVIGATORS.WORKSPACE_SPLIT_NAVIGATOR || !params?.policyID) {
if (!lastWorkspacesTabNavigatorRoute || lastWorkspacesTabNavigatorRoute.name !== NAVIGATORS.WORKSPACE_SPLIT_NAVIGATOR || !paramsPolicyID) {
return undefined;
}

return policies?.[`${ONYXKEYS.COLLECTION.POLICY}${params.policyID}`];
return policies?.[`${ONYXKEYS.COLLECTION.POLICY}${paramsPolicyID}`];
},
[params?.policyID, lastWorkspacesTabNavigatorRoute],
[paramsPolicyID, lastWorkspacesTabNavigatorRoute],
);

const [lastViewedPolicy] = useOnyx(
Expand All @@ -103,6 +108,26 @@ function NavigationTabBar({selectedTab, isTopLevelBar = false, shouldShowFloatin
[navigationState],
);

const lastViewedDomainSelector = useCallback(
(domains: OnyxCollection<Domain>) => {
if (!lastWorkspacesTabNavigatorRoute || lastWorkspacesTabNavigatorRoute.name !== NAVIGATORS.DOMAIN_SPLIT_NAVIGATOR || !paramsDomainAccountID) {
return undefined;
}

return domains?.[`${ONYXKEYS.COLLECTION.DOMAIN}${paramsDomainAccountID}`];
},
[paramsDomainAccountID, lastWorkspacesTabNavigatorRoute],
);

const [lastViewedDomain] = useOnyx(
ONYXKEYS.COLLECTION.DOMAIN,
{
canBeMissing: true,
selector: lastViewedDomainSelector,
},
[navigationState],
);

const [reportAttributes] = useOnyx(ONYXKEYS.DERIVED.REPORT_ATTRIBUTES, {selector: reportsSelector, canBeMissing: true});
const {login: currentUserLogin} = useCurrentUserPersonalDetails();
const {shouldUseNarrowLayout} = useResponsiveLayout();
Expand Down Expand Up @@ -189,8 +214,8 @@ function NavigationTabBar({selectedTab, isTopLevelBar = false, shouldShowFloatin
* If the user clicks on the settings tab while on this tab, this button should go back to the previous screen within the tab.
*/
const showWorkspaces = useCallback(() => {
navigateToWorkspacesPage({shouldUseNarrowLayout, currentUserLogin, policy: lastViewedPolicy});
}, [shouldUseNarrowLayout, currentUserLogin, lastViewedPolicy]);
navigateToWorkspacesPage({shouldUseNarrowLayout, currentUserLogin, policy: lastViewedPolicy, domain: lastViewedDomain});
}, [shouldUseNarrowLayout, currentUserLogin, lastViewedPolicy, lastViewedDomain]);

if (!shouldUseNarrowLayout) {
return (
Expand Down
10 changes: 10 additions & 0 deletions src/languages/de.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7426,6 +7426,16 @@ ${amount} für ${merchant} - ${date}`,
description: ({domainName}: {domainName: string}) =>
`<muted-text><centered-text>Die Domain <strong>${domainName}</strong> wurde erfolgreich verifiziert und Sie können jetzt SAML und andere Sicherheitsfunktionen einrichten.</centered-text></muted-text>`,
},
saml: 'SAML',
samlFeatureList: {
title: 'SAML-Einmalanmeldung (SSO)',
subtitle: ({domainName}: {domainName: string}) =>
`<muted-text><a href="${CONST.SAML_HELP_URL}">SAML SSO</a> ist eine Sicherheitsfunktion, die Ihnen mehr Kontrolle darüber gibt, wie sich Mitglieder mit E-Mail-Adressen unter <strong>${domainName}</strong> bei Expensify anmelden. Um sie zu aktivieren, müssen Sie sich als autorisierte/r Unternehmensadministrator/in verifizieren.</muted-text>`,
fasterAndEasierLogin: 'Schnelleres und einfacheres Anmelden',
moreSecurityAndControl: 'Mehr Sicherheit und Kontrolle',
onePasswordForAnything: 'Ein Passwort für alles',
},
goToDomain: 'Zur Domain wechseln',
},
};
// IMPORTANT: This line is manually replaced in generate translation files by scripts/generateTranslations.ts,
Expand Down
10 changes: 10 additions & 0 deletions src/languages/en.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7367,6 +7367,16 @@ const translations = {
description: ({domainName}: {domainName: string}) =>
`<muted-text><centered-text>The domain <strong>${domainName}</strong> has been successfully verified and you can now set up SAML and other security features.</centered-text></muted-text>`,
},
saml: 'SAML',
samlFeatureList: {
title: 'SAML Single Sign-On (SSO)',
subtitle: ({domainName}: {domainName: string}) =>
`<muted-text><a href="${CONST.SAML_HELP_URL}">SAML SSO</a> is a security feature that gives you more control over how members with <strong>${domainName}</strong> emails log into Expensify. To enable it, you'll need to verify yourself as an authorized company admin.</muted-text>`,
fasterAndEasierLogin: 'Faster and easier login',
moreSecurityAndControl: 'More security and control',
onePasswordForAnything: 'One password for everything',
},
goToDomain: 'Go to domain',
},
};

Expand Down
10 changes: 10 additions & 0 deletions src/languages/es.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7508,6 +7508,16 @@ ${amount} para ${merchant} - ${date}`,
description: ({domainName}: {domainName: string}) =>
`<muted-text><centered-text>El dominio <strong>${domainName}</strong> se ha verificado correctamente y ahora puedes configurar SAML y otras funciones de seguridad.</centered-text></muted-text>`,
},
saml: 'SAML',
samlFeatureList: {
title: 'Inicio de sesión único SAML (SSO)',
subtitle: ({domainName}: {domainName: string}) =>
`<muted-text><a href="${CONST.SAML_HELP_URL}">SAML SSO</a> es una función de seguridad que te da más control sobre cómo los miembros con correos <strong>${domainName}</strong> inician sesión en Expensify. Para habilitarla, deberás verificarte como administrador autorizado de la empresa.</muted-text>`,
fasterAndEasierLogin: 'Inicio de sesión más rápido y sencillo',
moreSecurityAndControl: 'Más seguridad y control',
onePasswordForAnything: 'Una sola contraseña para todo',
},
goToDomain: 'Ir al dominio',
},
};

Expand Down
10 changes: 10 additions & 0 deletions src/languages/fr.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7430,6 +7430,16 @@ ${amount} pour ${merchant} - ${date}`,
description: ({domainName}: {domainName: string}) =>
`<muted-text><centered-text>Le domaine <strong>${domainName}</strong> a été vérifié avec succès et vous pouvez maintenant configurer SAML et d'autres fonctionnalités de sécurité.</centered-text></muted-text>`,
},
saml: 'SAML',
samlFeatureList: {
title: 'Authentification unique SAML (SSO)',
subtitle: ({domainName}: {domainName: string}) =>
`<muted-text><a href="${CONST.SAML_HELP_URL}">SAML SSO</a> est une fonctionnalité de sécurité qui vous donne davantage de contrôle sur la manière dont les membres ayant des adresses e‑mail <strong>${domainName}</strong> se connectent à Expensify. Pour l’activer, vous devrez confirmer que vous êtes un administrateur d’entreprise autorisé.</muted-text>`,
fasterAndEasierLogin: 'Connexion plus rapide et plus simple',
moreSecurityAndControl: 'Plus de sécurité et de contrôle',
onePasswordForAnything: 'Un seul mot de passe pour tout',
},
goToDomain: 'Accéder au domaine',
},
};
// IMPORTANT: This line is manually replaced in generate translation files by scripts/generateTranslations.ts,
Expand Down
Loading
Loading