Fix Certinia setup step 1 bundle links not rendering on native#94856
Conversation
|
@thelullabyy Please 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] |
Reviewer Checklist
Screenshots/Videos |
|
@ShridharGoel Type check failed |
|
@ShridharGoel Please add recordings as well |
|
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 |
🦜 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 a53c7407..b170e2de 100644
--- a/src/languages/de.ts
+++ b/src/languages/de.ts
@@ -5048,7 +5048,7 @@ ${amount} für ${merchant} – ${date}`,
`<p>Installieren Sie das Expensify-Paket in Salesforce, indem Sie auf diesen Link klicken: <a href="${href}">PSA/SRP Expensify Bundle installieren (Version ${version})</a></p>`,
installBundleFFAHeader: 'Für FFA-Verbindungen:',
installBundleFFADescription: ({href, version}: {href: string; version: string}) =>
- `<p>Installieren Sie das Expensify-Paket in Salesforce, indem Sie auf diesen Link klicken: <a href="${href}">FFA-Expensify-Paket installieren (Version ${version})</a></p>`,
+ `<p>Installieren Sie das Expensify-Bundle in Salesforce, indem Sie auf diesen Link klicken: <a href="${href}">FFA Expensify-Bundle installieren (Version ${version})</a></p>`,
installBundleConfirm: 'Ich habe das Paket installiert',
setupContacts: 'Benutzer und Kontakte einrichten',
setupContactsBullet1:
diff --git a/src/languages/es.ts b/src/languages/es.ts
index 07dcb890..69108066 100644
--- a/src/languages/es.ts
+++ b/src/languages/es.ts
@@ -4926,10 +4926,10 @@ ${amount} para ${merchant} - ${date}`,
installBundle: 'Instala el paquete de Expensify',
installBundlePSAHeader: 'Para conexiones PSA/SRP:',
installBundlePSADescription: ({href, version}: {href: string; version: string}) =>
- `<p>Instala el paquete de Expensify en Salesforce haciendo clic en este enlace: <a href="${href}">Instalar paquete Expensify PSA/SRP (Versión ${version})</a></p>`,
+ `<p>Instala el paquete de Expensify en Salesforce haciendo clic en este enlace: <a href="${href}">Instalar paquete PSA/SRP de Expensify (Versión ${version})</a></p>`,
installBundleFFAHeader: 'Para conexiones FFA:',
installBundleFFADescription: ({href, version}: {href: string; version: string}) =>
- `<p>Instala el paquete de Expensify en Salesforce haciendo clic en este enlace: <a href="${href}">Instalar el paquete de Expensify para FFA (versión ${version})</a></p>`,
+ `<p>Instala el paquete de Expensify en Salesforce haciendo clic en este enlace: <a href="${href}">Instalar paquete FFA Expensify (Versión ${version})</a></p>`,
installBundleConfirm: 'He instalado el paquete',
setupContacts: 'Configura usuario y contactos',
setupContactsBullet1:
diff --git a/src/languages/fr.ts b/src/languages/fr.ts
index 82654b73..345259dc 100644
--- a/src/languages/fr.ts
+++ b/src/languages/fr.ts
@@ -5057,10 +5057,10 @@ ${amount} pour ${merchant} - ${date}`,
installBundle: 'Installer le module Expensify',
installBundlePSAHeader: 'Pour les connexions PSA/SRP :',
installBundlePSADescription: ({href, version}: {href: string; version: string}) =>
- `<p>Installez le bundle Expensify dans Salesforce en cliquant sur ce lien : <a href="${href}">Installer le bundle Expensify PSA/SRP (version ${version})</a></p>`,
+ `<p>Installez le bundle Expensify dans Salesforce en cliquant sur ce lien : <a href="${href}">Installer le bundle Expensify PSA/SRP (version ${version})</a></p>`,
installBundleFFAHeader: 'Pour les connexions FFA :',
installBundleFFADescription: ({href, version}: {href: string; version: string}) =>
- `<p>Installez le bundle Expensify dans Salesforce en cliquant sur ce lien : <a href="${href}">Installer le bundle Expensify pour FFA (version ${version})</a></p>`,
+ `<p>Installez le bundle Expensify dans Salesforce en cliquant sur ce lien : <a href="${href}">Installer le bundle FFA Expensify (version ${version})</a></p>`,
installBundleConfirm: 'J’ai installé le paquet',
setupContacts: 'Configurer l’utilisateur et les contacts',
setupContactsBullet1:
diff --git a/src/languages/it.ts b/src/languages/it.ts
index e0305a4c..5339192a 100644
--- a/src/languages/it.ts
+++ b/src/languages/it.ts
@@ -5030,10 +5030,10 @@ ${amount} per ${merchant} - ${date}`,
installBundle: 'Installa il bundle Expensify',
installBundlePSAHeader: 'Per le connessioni PSA/SRP:',
installBundlePSADescription: ({href, version}: {href: string; version: string}) =>
- `<p>Installa il bundle Expensify in Salesforce cliccando su questo link: <a href="${href}">Installa il bundle PSA/SRP Expensify (versione ${version})</a></p>`,
+ `<p>Installa il bundle Expensify in Salesforce cliccando su questo link: <a href="${href}">Installa il bundle PSA/SRP Expensify (Versione ${version})</a></p>`,
installBundleFFAHeader: 'Per le connessioni FFA:',
installBundleFFADescription: ({href, version}: {href: string; version: string}) =>
- `<p>Installa il bundle Expensify in Salesforce facendo clic su questo link: <a href="${href}">Installa il bundle Expensify per FFA (versione ${version})</a></p>`,
+ `<p>Installa il bundle Expensify in Salesforce cliccando su questo link: <a href="${href}">Installa FFA Expensify Bundle (Versione ${version})</a></p>`,
installBundleConfirm: 'Ho installato il pacchetto',
setupContacts: 'Configura utente e contatti',
setupContactsBullet1:
diff --git a/src/languages/ja.ts b/src/languages/ja.ts
index 15bf9cba..060338dc 100644
--- a/src/languages/ja.ts
+++ b/src/languages/ja.ts
@@ -4983,10 +4983,10 @@ ${integrationName === CONST.ONBOARDING_ACCOUNTING_MAPPING.other ? 'あなたの'
installBundle: 'Expensify バンドルをインストールします',
installBundlePSAHeader: 'PSA/SRP 接続の場合:',
installBundlePSADescription: ({href, version}: {href: string; version: string}) =>
- `<p>このリンクをクリックして Salesforce に Expensify バンドルをインストールしてください:<a href="${href}">PSA/SRP Expensify バンドル(バージョン ${version})をインストール</a></p>`,
+ `<p>このリンクをクリックして Salesforce に Expensify バンドルをインストールします : <a href="${href}">PSA/SRP Expensify バンドル(バージョン ${version})をインストール</a></p>`,
installBundleFFAHeader: 'FFA 接続用:',
installBundleFFADescription: ({href, version}: {href: string; version: string}) =>
- `<p>このリンクをクリックして、Salesforce に Expensify バンドルをインストールしてください:<a href="${href}">FFA 用 Expensify バンドルをインストール(バージョン ${version})</a></p>`,
+ `<p>このリンクをクリックして、Salesforce に Expensify バンドルをインストールします: <a href="${href}">FFA Expensify バンドルをインストール(バージョン ${version})</a></p>`,
installBundleConfirm: 'バンドルをインストールしました',
setupContacts: 'ユーザーと連絡先を設定',
setupContactsBullet1:
diff --git a/src/languages/nl.ts b/src/languages/nl.ts
index 45687347..77e3cda8 100644
--- a/src/languages/nl.ts
+++ b/src/languages/nl.ts
@@ -5020,10 +5020,10 @@ ${amount} voor ${merchant} - ${date}`,
installBundle: 'Installeer het Expensify-pakket',
installBundlePSAHeader: 'Voor PSA/SRP-koppelingen:',
installBundlePSADescription: ({href, version}: {href: string; version: string}) =>
- `<p>Installeer de Expensify-bundel in Salesforce door op deze link te klikken: <a href="${href}">Installeer PSA/SRP Expensify-bundel (versie ${version})</a></p>`,
+ `<p>Installeer het Expensify-pakket in Salesforce door op deze link te klikken: <a href="${href}">Installeer PSA/SRP Expensify-pakket (versie ${version})</a></p>`,
installBundleFFAHeader: 'Voor FFA-verbindingen:',
installBundleFFADescription: ({href, version}: {href: string; version: string}) =>
- `<p>Installeer de Expensify-bundel in Salesforce door op deze link te klikken: <a href="${href}">Expensify-bundel voor FFA installeren (versie ${version})</a></p>`,
+ `<p>Installeer de Expensify-bundel in Salesforce door op deze link te klikken: <a href="${href}">Installeer FFA Expensify-bundel (versie ${version})</a></p>`,
installBundleConfirm: 'Ik heb de bundel geïnstalleerd',
setupContacts: 'Gebruiker en contacten instellen',
setupContactsBullet1:
diff --git a/src/languages/pl.ts b/src/languages/pl.ts
index 0664cd4c..2a7f88b6 100644
--- a/src/languages/pl.ts
+++ b/src/languages/pl.ts
@@ -5016,7 +5016,7 @@ ${amount} dla ${merchant} - ${date}`,
`<p>Zainstaluj pakiet Expensify w Salesforce, klikając ten link: <a href="${href}">Zainstaluj pakiet PSA/SRP Expensify (wersja ${version})</a></p>`,
installBundleFFAHeader: 'Dla połączeń FFA:',
installBundleFFADescription: ({href, version}: {href: string; version: string}) =>
- `<p>Zainstaluj pakiet Expensify w Salesforce, klikając ten link: <a href="${href}">Zainstaluj pakiet Expensify dla FFA (wersja ${version})</a></p>`,
+ `<p>Zainstaluj pakiet Expensify w Salesforce, klikając ten link: <a href="${href}">Zainstaluj pakiet FFA Expensify (wersja ${version})</a></p>`,
installBundleConfirm: 'Zainstalowałem pakiet',
setupContacts: 'Skonfiguruj użytkownika i kontakty',
setupContactsBullet1:
diff --git a/src/languages/pt-BR.ts b/src/languages/pt-BR.ts
index dea936b8..1ac4c45e 100644
--- a/src/languages/pt-BR.ts
+++ b/src/languages/pt-BR.ts
@@ -5011,10 +5011,10 @@ ${amount} para ${merchant} - ${date}`,
installBundle: 'Instalar o pacote do Expensify',
installBundlePSAHeader: 'Para conexões PSA/SRP:',
installBundlePSADescription: ({href, version}: {href: string; version: string}) =>
- `<p>Instale o pacote Expensify no Salesforce clicando neste link: <a href="${href}">Instalar pacote PSA/SRP Expensify (versão ${version})</a></p>`,
+ `<p>Instale o pacote do Expensify no Salesforce clicando neste link: <a href="${href}">Instalar Pacote PSA/SRP Expensify (Versão ${version})</a></p>`,
installBundleFFAHeader: 'Para conexões FFA:',
installBundleFFADescription: ({href, version}: {href: string; version: string}) =>
- `<p>Instale o pacote do Expensify no Salesforce clicando neste link: <a href="${href}">Instalar o pacote do Expensify para FFA (versão ${version})</a></p>`,
+ `<p>Instale o pacote do Expensify no Salesforce clicando neste link: <a href="${href}">Instalar Pacote FFA Expensify (Versão ${version})</a></p>`,
installBundleConfirm: 'Eu instalei o pacote',
setupContacts: 'Configurar usuário e contatos',
setupContactsBullet1:
diff --git a/src/languages/zh-hans.ts b/src/languages/zh-hans.ts
index 3345524e..82d3f96d 100644
--- a/src/languages/zh-hans.ts
+++ b/src/languages/zh-hans.ts
@@ -4884,10 +4884,10 @@ ${amount},商户:${merchant} - 日期:${date}`,
installBundle: '安装 Expensify 捆绑包',
installBundlePSAHeader: '用于 PSA/SRP 连接:',
installBundlePSADescription: ({href, version}: {href: string; version: string}) =>
- `<p>通过点击此链接在 Salesforce 中安装 Expensify 包:<a href="${href}">安装 PSA/SRP Expensify 包(版本 ${version})</a></p>`,
+ `<p>在 Salesforce 中安装 Expensify 包,请点击此链接:<a href="${href}">安装 PSA/SRP Expensify 包(版本 ${version})</a></p>`,
installBundleFFAHeader: '对于 FFA 连接:',
installBundleFFADescription: ({href, version}: {href: string; version: string}) =>
- `<p>通过点击此链接在 Salesforce 中安装 Expensify 组件包:<a href="${href}">安装 FFA Expensify 组件包(版本 ${version})</a></p>`,
+ `<p>在 Salesforce 中安装 Expensify 捆绑包,请点击此链接:<a href="${href}">安装 FFA Expensify 捆绑包(版本 ${version})</a></p>`,
installBundleConfirm: '我已安装此捆绑包',
setupContacts: '设置用户和联系人',
setupContactsBullet1: '如果 Certinia 中尚未为你创建用户和联系人,请为自己分别创建一个用户和一个联系人,并确保其电子邮箱与你在 Expensify 中的主要邮箱一致。',
Note You can apply these changes to your branch by copying the patch to your clipboard, then running |
|
🚧 trjExpensify has triggered a test Expensify/App build. You can view the workflow run here. |
This comment has been minimized.
This comment has been minimized.
…bundle-link-native
trjExpensify
left a comment
There was a problem hiding this comment.
Bug fix for Certinia rollout. So close to getting this released! 👍
|
@ShridharGoel It doesn't fix on native app
|
|
@MelvinBot could you please check this bug? #94856 (comment) |
Issue AnalysisRoot cause: Wrapping the strings in
Recommended fix: Match the proven NetSuite/QBD pattern — wrap the description in <RenderHTML
html={`<comment>${translate('workspace.certinia.prerequisites.installBundlePSADescription', {
href: CONST.CERTINIA_PSA_BUNDLE_INSTALL_URL.PRODUCTION,
version: CONST.CERTINIA_PSA_BUNDLE_VERSION,
})}</comment>`}
/>(Alternatively, swap Investigation details
Next Steps: Reply with |
|
🚧 trjExpensify has triggered a test Expensify/App build. You can view the workflow run here. |
This comment has been minimized.
This comment has been minimized.
|
@thelullabyy can you review this today? It's the only blocker left to release. |
@ShridharGoel It still doesn't work to me. Could you please test again and add all required recording/evidences before request another review. Thanks |
|
Stop routing this static label + link through RenderHTML and render it with the app's first-class components, which is the standard Expensify pattern for "sentence + link" and is immune to the phrasing-root pitfall on every platform. @MelvinBot Do you think solution above will work? As the current approach doesn't work to me, there is still no text on android and ios app
|
|
|
…1-certinia-bundle-link-native
|
Updated |
Codecov Report✅ Changes either increased or maintained existing code coverage, great job!
|
|
@codex review |
|
Codex Review: Didn't find any major issues. Keep it up! Reviewed commit: ℹ️ About Codex in GitHubCodex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you
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". |
|
@ShridharGoel you have conflicts |
|
Yeah, code LGTM, I have tested all platforms! Let's fix the conflicts so I can approve @ShridharGoel |
|
@ShridharGoel bump! |
|
Done |
|
🚧 yuwenmemon has triggered a test Expensify/App build. You can view the workflow run here. |
|
✋ This PR was not deployed to staging yet because QA is ongoing. It will be automatically deployed to staging after the next production release. |
|
🧪🧪 Use the links below to test this adhoc build on Android, iOS, and Web. Happy testing! 🧪🧪
|
|
🚀 Deployed to staging by https://github.com/yuwenmemon in version: 9.4.32-0 🚀
|
|
🤖 Help site review: no changes required. This PR is a native-only rendering bug fix. It wraps the two Certinia setup step 1 description strings (PSA/SRP and FFA) in a Why no docs update is needed:
Since the help site already reflects the correct behavior and this PR only restores rendering of existing content, no draft help site PR was created. @ShridharGoel, please confirm this assessment — if you believe a help site update is warranted, let me know and I'll create a draft PR. (No linked help site PR exists, since none was required.) |
|
🚀 Deployed to production by https://github.com/grgia in version: 9.4.32-3 🚀
Bundle Size Analysis (Sentry): |








Explanation of Change
On the Certinia setup step 1 ("Install the Expensify bundle"), the PSA/SRP and FFA sections each render a bold header plus a description with an install link through
RenderHTML. On native (Android/iOS) only the headers showed — the description text, the install link, and the version were missing. Web rendered everything correctly.The two description strings are bare inline HTML (text followed by an
<a>link) with no block-level wrapper.react-native-render-htmlwon't lay out top-level inline content that has no block parent, so on native the whole block rendered empty. On web the browser lays out the inline content anyway, which is why web was unaffected.The fix wraps each description in a
<p>block element at the call site. This gives the native renderer a block root so the text, link, and version render.<p>keeps the normal text color and has zero margins, so the web appearance is unchanged. Wrapping at the call site fixes all locales without editing the translation strings, and matches how other accounting setup pages feed "text + link" copy throughRenderHTML(e.g. NetSuite, QBD).Fixed Issues
$ #94711
PROPOSAL:
Tests
Offline tests
QA Steps
Same as tests.
PR Author Checklist
### Fixed Issuessection aboveTestssectionOffline stepssectionQA stepssectiontoggleReportand notonIconClick)Avatar, 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.mainbranch was merged into this PR after a review, I tested again and verified the outcome was still expected according to theTeststeps.Screenshots/Videos
iOS: Native