[Domain Control] Add wall gate for unvalidated domains in domain members#91170
Conversation
|
Hey, I noticed you changed If you want to automatically generate translations for other locales, an Expensify employee will have to:
Alternatively, if you are an external contributor, you can run the translation script locally with your own OpenAI API key. To learn more, try running: npx ts-node ./scripts/generateTranslations.ts --helpTypically, you'd want to translate only what you changed by running |
|
@codex review |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 3779663649
ℹ️ About Codex in GitHub
Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".
|
@codex review |
|
Can I get the GitHub workflow for translations ran? 🙏 |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 8cf6d2e9c8
ℹ️ About Codex in GitHub
Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".
There was a problem hiding this comment.
I wonder if we shouldn't do the same for admins page 🤔 Have you discussed it?
There was a problem hiding this comment.
We mirror the behavior of OD, so I think we don't do it there, worth to discuss it though!
ac7c341 to
560f3c1
Compare
…-wall-gate-for-unvalidated-domains
…' of github.com:software-mansion-labs/expensify-app-fork into jakubstec/domains/add-wall-gate-for-unvalidated-domains
|
@dubielzyk-expensify @thesahindia One of you needs to copy/paste the Reviewer Checklist from here into a new comment on this PR and complete it. If you have the K2 extension, you can simply click: [this button] |
|
@dubielzyk-expensify @dukenv0307 @mountiny One of you needs to copy/paste the Reviewer Checklist from here into a new comment on this PR and complete it. If you have the K2 extension, you can simply click: [this button] |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 5565d96a3d
ℹ️ About Codex in GitHub
Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".
| > | ||
| <HeaderWithBackButton | ||
| title={translate('domain.domainMembers')} | ||
| onBackButtonPress={Navigation.goBack} |
There was a problem hiding this comment.
Preserve sidebar fallback for members wall back navigation
The new unvalidated-domain branch wires the header back action to Navigation.goBack, but this API intentionally no-ops when there is no prior route in the stack. In practice, opening Domain Members from a direct deeplink (or any entry point where this screen is the first route) leaves users stuck on the wall because the validated flow’s Navigation.popToSidebar fallback is bypassed. Keep the same sidebar fallback behavior in this branch so back navigation still works when canGoBack() is false.
Useful? React with 👍 / 👎.
Bump! |
|
on it now |
|
@jakubstec some tests are failing... |
@dukenv0307 Yeah, type check and Jest are related to missing translations, which have to be generated |
🦜 Polyglot Parrot! 🦜Squawk! Looks like you added some shiny new English strings. Allow me to parrot them back to you in other tongues: View the translation diffdiff --git a/src/languages/de.ts b/src/languages/de.ts
index 1e53dd6ff93..a95bb7ff40f 100644
--- a/src/languages/de.ts
+++ b/src/languages/de.ts
@@ -9443,6 +9443,13 @@ Hier ist ein *Testbeleg*, um dir zu zeigen, wie es funktioniert:`,
chooseWhereToMove: ({count}: {count: number}) => `Wählen Sie aus, wohin Sie ${count} ${count === 1 ? 'Mitglied' : 'Mitglieder'} verschieben möchten.`,
domainGroup: 'Domain-Gruppe',
chooseWhereToMoveName: ({name}: {name: string}) => `Wähle aus, wohin ${name} verschoben werden soll.`,
+ membersFeatureList: {
+ subtitle: ({domainName}: {domainName: string}) =>
+ `<muted-text>Bestätigen Sie Ihre Domain, um mehr Kontrolle über <strong>${domainName}</strong>-Mitglieder in Expensify zu erhalten.</muted-text>`,
+ controlPolicyCreation: 'Arbeitsbereichserstellung einschränken',
+ enableSamlSso: 'SAML-SSO aktivieren',
+ enforce2FA: '2FA erzwingen',
+ },
},
common: {
settings: 'Einstellungen',
diff --git a/src/languages/es.ts b/src/languages/es.ts
index 5aa5329afac..33a194d7d20 100644
--- a/src/languages/es.ts
+++ b/src/languages/es.ts
@@ -9612,6 +9612,13 @@ ${amount} para ${merchant} - ${date}`,
domainGroup: 'Grupo de dominio',
chooseWhereToMove: ({count}: {count: number}) => `Elige a dónde mover ${count} ${count === 1 ? 'miembro' : 'miembros'}.`,
chooseWhereToMoveName: ({name}: {name: string}) => `Elige a dónde mover a ${name}.`,
+ membersFeatureList: {
+ subtitle: ({domainName}: {domainName: string}) =>
+ `<muted-text>Verifica tu dominio para tener más control sobre los miembros de <strong>${domainName}</strong> en Expensify.</muted-text>`,
+ controlPolicyCreation: 'Restringir la creación de espacios de trabajo',
+ enableSamlSso: 'Habilitar SSO SAML',
+ enforce2FA: 'Forzar 2FA',
+ },
},
common: {
settings: 'Configuración',
diff --git a/src/languages/fr.ts b/src/languages/fr.ts
index 4bd7aea45b8..34e14e6350a 100644
--- a/src/languages/fr.ts
+++ b/src/languages/fr.ts
@@ -9474,6 +9474,13 @@ Voici un *reçu test* pour vous montrer comment ça fonctionne :`,
chooseWhereToMove: ({count}: {count: number}) => `Choisissez où déplacer ${count} ${count === 1 ? 'membre' : 'membres'}.`,
domainGroup: 'Groupe de domaines',
chooseWhereToMoveName: ({name}: {name: string}) => `Choisissez où déplacer ${name}.`,
+ membersFeatureList: {
+ subtitle: ({domainName}: {domainName: string}) =>
+ `<muted-text>Vérifiez votre domaine pour mieux contrôler les membres de <strong>${domainName}</strong> dans Expensify.</muted-text>`,
+ controlPolicyCreation: "Restreindre la création d'espaces de travail",
+ enableSamlSso: 'Activer SAML SSO',
+ enforce2FA: 'Imposer la 2FA',
+ },
},
common: {
settings: 'Paramètres',
diff --git a/src/languages/it.ts b/src/languages/it.ts
index da3c5a4b199..435aa5e5b09 100644
--- a/src/languages/it.ts
+++ b/src/languages/it.ts
@@ -9436,6 +9436,13 @@ Ecco una *ricevuta di prova* per mostrarti come funziona:`,
chooseWhereToMove: ({count}: {count: number}) => `Scegli dove spostare ${count} ${count === 1 ? 'membro' : 'membri'}.`,
domainGroup: 'Gruppo di domini',
chooseWhereToMoveName: ({name}: {name: string}) => `Scegli dove spostare ${name}.`,
+ membersFeatureList: {
+ subtitle: ({domainName}: {domainName: string}) =>
+ `<muted-text>Verifica il tuo dominio per avere un maggiore controllo sui membri di <strong>${domainName}</strong> in Expensify.</muted-text>`,
+ controlPolicyCreation: 'Limita la creazione di workspace',
+ enableSamlSso: 'Abilita SSO SAML',
+ enforce2FA: 'Imponi 2FA',
+ },
},
common: {
settings: 'Impostazioni',
diff --git a/src/languages/ja.ts b/src/languages/ja.ts
index 5bf006c69be..a8041b3c043 100644
--- a/src/languages/ja.ts
+++ b/src/languages/ja.ts
@@ -9316,6 +9316,13 @@ ${reportName}
chooseWhereToMove: ({count}: {count: number}) => `${count} ${count === 1 ? 'メンバー' : 'メンバー'} を移動する先を選択してください。`,
domainGroup: 'ドメイングループ',
chooseWhereToMoveName: ({name}: {name: string}) => `${name} をどこに移動するか選択してください。`,
+ membersFeatureList: {
+ subtitle: ({domainName}: {domainName: string}) =>
+ `<muted-text>Expensify で <strong>${domainName}</strong> メンバーをより細かく管理できるように、ドメインを確認してください。</muted-text>`,
+ controlPolicyCreation: 'ワークスペースの作成を制限',
+ enableSamlSso: 'SAML SSO を有効にする',
+ enforce2FA: '2 要素認証を必須にする',
+ },
},
common: {
settings: '設定',
diff --git a/src/languages/nl.ts b/src/languages/nl.ts
index 9b3656c31a7..dfecfb67dd3 100644
--- a/src/languages/nl.ts
+++ b/src/languages/nl.ts
@@ -9404,6 +9404,13 @@ Hier is een *proefbon* om je te laten zien hoe het werkt:`,
chooseWhereToMove: ({count}: {count: number}) => `Kies waar je ${count} ${count === 1 ? 'lid' : 'leden'} naartoe wilt verplaatsen.`,
domainGroup: 'Domeingroep',
chooseWhereToMoveName: ({name}: {name: string}) => `Kies waar je ${name} naartoe wilt verplaatsen.`,
+ membersFeatureList: {
+ subtitle: ({domainName}: {domainName: string}) =>
+ `<muted-text>Verifieer je domein voor meer controle over leden met <strong>${domainName}</strong> in Expensify.</muted-text>`,
+ controlPolicyCreation: 'Aanmaken van werkruimtes beperken',
+ enableSamlSso: 'SAML-SSO inschakelen',
+ enforce2FA: '2FA afdwingen',
+ },
},
common: {
settings: 'Instellingen',
diff --git a/src/languages/pl.ts b/src/languages/pl.ts
index 694b08bec77..9277ed22597 100644
--- a/src/languages/pl.ts
+++ b/src/languages/pl.ts
@@ -9386,6 +9386,13 @@ Oto *paragon testowy*, żeby pokazać Ci, jak to działa:`,
chooseWhereToMove: ({count}: {count: number}) => `Wybierz, dokąd przenieść ${count} ${count === 1 ? 'członka' : 'członków'}.`,
domainGroup: 'Grupa domen',
chooseWhereToMoveName: ({name}: {name: string}) => `Wybierz, dokąd przenieść ${name}.`,
+ membersFeatureList: {
+ subtitle: ({domainName}: {domainName: string}) =>
+ `<muted-text>Zweryfikuj swoją domenę, aby mieć większą kontrolę nad członkami <strong>${domainName}</strong> w Expensify.</muted-text>`,
+ controlPolicyCreation: 'Ogranicz tworzenie przestrzeni roboczych',
+ enableSamlSso: 'Włącz logowanie SAML SSO',
+ enforce2FA: 'Wymuś 2FA',
+ },
},
common: {
settings: 'Ustawienia',
diff --git a/src/languages/pt-BR.ts b/src/languages/pt-BR.ts
index f6af7329cc8..4cc0d97ed6f 100644
--- a/src/languages/pt-BR.ts
+++ b/src/languages/pt-BR.ts
@@ -9393,6 +9393,13 @@ Aqui está um *comprovante de teste* para mostrar como funciona:`,
chooseWhereToMove: ({count}: {count: number}) => `Escolha para onde mover ${count} ${count === 1 ? 'membro' : 'membros'}.`,
domainGroup: 'Grupo de domínio',
chooseWhereToMoveName: ({name}: {name: string}) => `Escolha para onde mover ${name}.`,
+ membersFeatureList: {
+ subtitle: ({domainName}: {domainName: string}) =>
+ `<muted-text>Verifique seu domínio para ter mais controle sobre os membros de <strong>${domainName}</strong> no Expensify.</muted-text>`,
+ controlPolicyCreation: 'Restringir criação de espaço de trabalho',
+ enableSamlSso: 'Ativar SSO SAML',
+ enforce2FA: 'Exigir 2FA',
+ },
},
common: {
settings: 'Configurações',
diff --git a/src/languages/zh-hans.ts b/src/languages/zh-hans.ts
index 0ff00724590..5fd4659475c 100644
--- a/src/languages/zh-hans.ts
+++ b/src/languages/zh-hans.ts
@@ -9159,6 +9159,12 @@ ${reportName}
chooseWhereToMove: ({count}: {count: number}) => `选择将 ${count} 个 ${count === 1 ? '成员' : '成员'} 移动到哪里。`,
domainGroup: '域名组',
chooseWhereToMoveName: ({name}: {name: string}) => `选择将 ${name} 移动到哪里。`,
+ membersFeatureList: {
+ subtitle: ({domainName}: {domainName: string}) => `<muted-text>验证你的域,以便在 Expensify 中更好地管理 <strong>${domainName}</strong> 成员。</muted-text>`,
+ controlPolicyCreation: '限制创建工作区',
+ enableSamlSso: '启用 SAML 单点登录',
+ enforce2FA: '强制启用双重验证',
+ },
},
common: {
settings: '设置',
Note You can apply these changes to your branch by copying the patch to your clipboard, then running |
|
@dukenv0307 I found a bug, when you open a deeplink: Screen.Recording.2026-05-26.at.16.37.49.mov |
|
@jakubstec I see, are you going to fix it in a separate PR? |
|
Conflicts |
It requires a lot of small changes in 10+ files, so maybe we should do it in a separate PR. (draft's here: #91747, waiting for this one to be merged first 😄) Also, i can take care of a small pre-existing domain verification bug i've found, (in this follow-up)
Screen.Recording.2026-05-26.at.16.38.27.mov |
…-wall-gate-for-unvalidated-domains
Codecov Report✅ Changes either increased or maintained existing code coverage, great job!
|
|
@mountiny no more conflicts :] |
|
Thank you! @dukenv0307 all yours |




Explanation of Change
Added a guard to prevent user from seeing an empty domain members page. Followed the design (discussed in issue).
Fixed Issues
$ #91081
PROPOSAL:
Tests
Offline tests
N/A
QA Steps
Same as Tests
PR Author Checklist
### Fixed Issuessection aboveTestssectionOffline stepssectionQA stepssectiontoggleReportand notonIconClick)src/languages/*files and using the translation methodSTYLE.md) were followedAvatar, I verified the components usingAvatarare working as expected)StyleUtils.getBackgroundAndBorderStyle(theme.componentBG))npm run compress-svg)Avataris modified, I verified thatAvataris working as expected in all cases)Designlabel and/or tagged@Expensify/designso the design team can review the changes.ScrollViewcomponent to make it scrollable when more elements are added to the page.mainbranch was merged into this PR after a review, I tested again and verified the outcome was still expected according to theTeststeps.Screenshots/Videos
MacOS: Chrome / Safari
Screen.Recording.2026-05-25.at.17.07.23.mov