Repository navigation
[Merge ATS] Handle sync results and offline - #101288
yuwenmemon merged 12 commits into
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 bun ./scripts/generateTranslations.ts --helpTypically, you'd want to translate only what you changed by running |
|
@DylanDylann 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] |
| syncResults: { | ||
| importedCount: () => ({ | ||
| one: '1 candidate', | ||
| other: (count: number) => `${count} candidates`, |
There was a problem hiding this comment.
@yuwenmemon please review this and run the translation script if it looks good
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 83aaa2a84b
ℹ️ 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".
| policyID={policyID} | ||
| featureName={featureName} | ||
| policyFeature={CONST.POLICY.POLICY_FEATURE.MORE_FEATURES} | ||
| shouldBeBlocked={category === CONST.POLICY.CONNECTIONS.CATEGORY.RECRUITING ? !isBetaEnabled(CONST.BETAS.MERGE_ATS) : false} |
There was a problem hiding this comment.
let's pass it as param
There was a problem hiding this comment.
Moved it to PAGE_CONFIG
| * screen when the sync reaches the `JOB_DONE` stage with a result payload. | ||
| */ | ||
| function useHRSyncResultsPage(connectionSyncProgress: OnyxEntry<PolicyConnectionSyncProgress>, isFocused: boolean) { | ||
| function useMergeSyncResultsPage(policyID: string) { |
There was a problem hiding this comment.
The results route is picked from the connection that synced, but the hook now runs on both the HR and the Recruiting page, since both render MergeConnectionsPageBase. The hook only looks at the connection, never at the screen. So when an ATS sync finishes while you're on the HR tab, we navigate to /workspaces//hr/recruiting-sync-results. My suggestion: only navigate when it's correct screen too
Reviewer Checklist
Screenshots/VideosScreen.Recording.2026-09-18.at.18.22.25.mov
Screen.Recording.2026-09-18.at.18.25.00.mov |
|
Some above NITs ☝️ The rest looks fine |
…on a wrong connection page
🦜 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 2d2e07b0..e9773f87 100644
--- a/src/languages/de.ts
+++ b/src/languages/de.ts
@@ -8707,6 +8707,12 @@ Fügen Sie weitere Ausgabelimits hinzu, um den Cashflow Ihres Unternehmens zu sc
defaultApprover: 'Standardgenehmiger',
approverFields: {recruiter: 'Personalvermittler', recruitingCoordinator: 'Recruiting-Koordinator'},
subtitle: 'Verknüpfen Sie Recruiting-Tools und halten Sie Kandidatengenehmigungen synchron.',
+ syncResults: {
+ importedCount: () => ({
+ one: '1 Kandidat',
+ other: (count: number) => `${count} Kandidat:innen`,
+ }),
+ },
},
merge: {
connections: 'Verbindungen',
diff --git a/src/languages/el.ts b/src/languages/el.ts
index 7521b1cd..889ecc65 100644
--- a/src/languages/el.ts
+++ b/src/languages/el.ts
@@ -7683,6 +7683,12 @@ _Για πιο αναλυτικές οδηγίες, [επισκεφθείτε τ
defaultApprover: 'Προεπιλεγμένος εγκρίνων',
approverFields: {recruiter: 'Στρατολογητής', recruitingCoordinator: 'Συντονιστής προσλήψεων'},
subtitle: 'Συνδέστε τα εργαλεία προσλήψεων και διατηρήστε τις εγκρίσεις υποψηφίων συγχρονισμένες.',
+ syncResults: {
+ importedCount: () => ({
+ one: '1 υποψήφιος',
+ other: (count: number) => `${count} υποψήφιοι`,
+ }),
+ },
},
merge: {
connections: 'Συνδέσεις',
@@ -7715,8 +7721,8 @@ _Για πιο αναλυτικές οδηγίες, [επισκεφθείτε τ
prompt: 'Έχετε φτάσει το όριο συγχρονισμών σας για σήμερα.',
},
syncResults: {
- title: (provider: string) => `Η συγχρονισμός με το ${provider} ολοκληρώθηκε`,
- successTitle: (provider: string) => `Ο συγχρονισμός της σύνδεσής σας με το ${provider} ολοκληρώθηκε με επιτυχία!`,
+ title: (provider: string) => `ο συγχρονισμός του ${provider} ολοκληρώθηκε`,
+ successTitle: (provider: string) => `Η σύνδεσή σας με το ${provider} συγχρονίστηκε με επιτυχία!`,
added: 'Προστέθηκε',
removed: 'Αφαιρέθηκε',
skipped: 'Παραλείφθηκε',
diff --git a/src/languages/es.ts b/src/languages/es.ts
index 45e95a6b..4ae7e8f0 100644
--- a/src/languages/es.ts
+++ b/src/languages/es.ts
@@ -7420,6 +7420,12 @@ El plan Controlar empieza en 9 $ por miembro activo al mes.`,
defaultApprover: 'Aprobador predeterminado',
approverFields: {recruiter: 'Reclutador', recruitingCoordinator: 'Coordinador de selección'},
subtitle: 'Conecta herramientas de selección y mantén sincronizadas las aprobaciones de candidatos.',
+ syncResults: {
+ importedCount: () => ({
+ one: '1 candidato',
+ other: (count: number) => `${count} candidatos`,
+ }),
+ },
},
merge: {
connections: 'Conexiones',
@@ -7450,7 +7456,7 @@ El plan Controlar empieza en 9 $ por miembro activo al mes.`,
syncLimitReached: {title: 'Inténtalo de nuevo mañana', prompt: 'Has alcanzado tu límite de sincronización de hoy.'},
syncResults: {
title: (provider: string) => `Sincronización de ${provider} completada`,
- successTitle: (provider: string) => `¡Se sincronizó correctamente tu conexión de ${provider}!`,
+ successTitle: (provider: string) => `¡Se ha sincronizado correctamente tu conexión con ${provider}!`,
added: 'Añadido',
removed: 'Eliminado',
skipped: 'Omitido',
diff --git a/src/languages/fr.ts b/src/languages/fr.ts
index 3b123aa8..292b312c 100644
--- a/src/languages/fr.ts
+++ b/src/languages/fr.ts
@@ -8723,6 +8723,12 @@ Ajoutez davantage de règles de dépenses pour protéger la trésorerie de l’e
defaultApprover: 'Approbateur par défaut',
approverFields: {recruiter: 'Recruteur', recruitingCoordinator: 'Coordinateur recrutement'},
subtitle: 'Connectez les outils de recrutement et synchronisez les validations de candidats.',
+ syncResults: {
+ importedCount: () => ({
+ one: '1 candidat',
+ other: (count: number) => `${count} candidat·s`,
+ }),
+ },
},
merge: {
connections: 'Connexions',
@@ -8753,7 +8759,7 @@ Ajoutez davantage de règles de dépenses pour protéger la trésorerie de l’e
syncLimitReached: {title: 'Réessayez demain', prompt: "Vous avez atteint votre limite de synchronisation pour aujourd'hui."},
syncResults: {
title: (provider: string) => `Synchronisation ${provider} terminée`,
- successTitle: (provider: string) => `Connexion ${provider} synchronisée avec succès !`,
+ successTitle: (provider: string) => `Connexion à ${provider} synchronisée avec succès !`,
added: 'Ajouté',
removed: 'Supprimé',
skipped: 'Ignoré',
diff --git a/src/languages/it.ts b/src/languages/it.ts
index 43a2da2f..f2e536d2 100644
--- a/src/languages/it.ts
+++ b/src/languages/it.ts
@@ -8654,6 +8654,12 @@ Aggiungi altre regole di spesa per proteggere il flusso di cassa aziendale.`,
defaultApprover: 'Approvatore predefinito',
approverFields: {recruiter: 'Recruiter', recruitingCoordinator: 'Coordinatore recruiting'},
subtitle: 'Collega gli strumenti di recruiting e mantieni sincronizzate le approvazioni dei candidati.',
+ syncResults: {
+ importedCount: () => ({
+ one: '1 candidato',
+ other: (count: number) => `${count} candidati`,
+ }),
+ },
},
merge: {
connections: 'Connessioni',
diff --git a/src/languages/ja.ts b/src/languages/ja.ts
index cf05fc78..039865aa 100644
--- a/src/languages/ja.ts
+++ b/src/languages/ja.ts
@@ -8544,6 +8544,12 @@ ${reportName}`,
defaultApprover: 'デフォルト承認者',
approverFields: {recruiter: '採用担当者', recruitingCoordinator: '採用コーディネーター'},
subtitle: '採用ツールを連携して、候補者の承認を常に同期させます。',
+ syncResults: {
+ importedCount: () => ({
+ one: '1 名の候補者',
+ other: (count: number) => `${count}件の候補`,
+ }),
+ },
},
merge: {
connections: '接続',
@@ -8574,8 +8580,8 @@ ${reportName}`,
syncLimitReached: {title: '明日もう一度お試しください', prompt: '本日の同期上限に達しました。'},
syncResults: {
title: (provider: string) => `${provider} の同期が完了しました`,
- successTitle: (provider: string) => `${provider} との接続が正常に同期されました!`,
- added: '追加済み',
+ successTitle: (provider: string) => `${provider} の接続が正常に同期されました!`,
+ added: '追加しました',
removed: '削除済み',
skipped: 'スキップ済み',
},
diff --git a/src/languages/nl.ts b/src/languages/nl.ts
index 8698fb6f..08bac0ed 100644
--- a/src/languages/nl.ts
+++ b/src/languages/nl.ts
@@ -8633,6 +8633,12 @@ er bestedingsregels toe om de kasstroom van het bedrijf te beschermen.`,
defaultApprover: 'Standaardgoedkeurder',
approverFields: {recruiter: 'Recruiter', recruitingCoordinator: 'Coördinator werving'},
subtitle: 'Koppel wervingstools en houd kandidaategoedkeuringen gesynchroniseerd.',
+ syncResults: {
+ importedCount: () => ({
+ one: '1 kandidaat',
+ other: (count: number) => `${count} kandidaten`,
+ }),
+ },
},
merge: {
connections: 'Verbindingen',
diff --git a/src/languages/pl.ts b/src/languages/pl.ts
index 8568f39f..0ce9b354 100644
--- a/src/languages/pl.ts
+++ b/src/languages/pl.ts
@@ -8651,6 +8651,12 @@ Dodaj więcej zasad wydatków, żeby chronić płynność finansową firmy.`,
defaultApprover: 'Domyślny zatwierdzający',
approverFields: {recruiter: 'Rekruter', recruitingCoordinator: 'Koordynator rekrutacji'},
subtitle: 'Połącz narzędzia rekrutacyjne i utrzymuj zgody kandydatów w synchronizacji.',
+ syncResults: {
+ importedCount: () => ({
+ one: '1 kandydat',
+ other: (count: number) => `${count} kandydatów`,
+ }),
+ },
},
merge: {
connections: 'Połączenia',
@@ -8680,7 +8686,7 @@ Dodaj więcej zasad wydatków, żeby chronić płynność finansową firmy.`,
syncingModalDescription: 'Pierwsze połączenie może chwilę potrwać. Zostaniesz powiadomiony o wszelkich błędach.',
syncLimitReached: {title: 'Spróbuj ponownie jutro', prompt: 'Osiągnąłeś dzienny limit synchronizacji.'},
syncResults: {
- title: (provider: string) => `Synchronizacja z ${provider} zakończona`,
+ title: (provider: string) => `Zsynchronizowano z ${provider}`,
successTitle: (provider: string) => `Pomyślnie zsynchronizowano twoje połączenie z ${provider}!`,
added: 'Dodano',
removed: 'Usunięto',
diff --git a/src/languages/pt-BR.ts b/src/languages/pt-BR.ts
index 11035d3c..8bbb21cd 100644
--- a/src/languages/pt-BR.ts
+++ b/src/languages/pt-BR.ts
@@ -8636,6 +8636,12 @@ Adicione mais regras de gasto para proteger o fluxo de caixa da empresa.`,
defaultApprover: 'Aprovador padrão',
approverFields: {recruiter: 'Recrutador', recruitingCoordinator: 'Coordenador de recrutamento'},
subtitle: 'Conecte ferramentas de recrutamento e mantenha as aprovações de candidatos em sincronia.',
+ syncResults: {
+ importedCount: () => ({
+ one: '1 candidato',
+ other: (count: number) => `${count} candidatos`,
+ }),
+ },
},
merge: {
connections: 'Conexões',
@@ -8666,7 +8672,7 @@ Adicione mais regras de gasto para proteger o fluxo de caixa da empresa.`,
syncLimitReached: {title: 'Tente novamente amanhã', prompt: 'Você atingiu o limite de sincronizações de hoje.'},
syncResults: {
title: (provider: string) => `Sincronização com ${provider} concluída`,
- successTitle: (provider: string) => `Conexão com ${provider} sincronizada com sucesso!`,
+ successTitle: (provider: string) => `Conexão com o ${provider} sincronizada com sucesso!`,
added: 'Adicionado',
removed: 'Removido',
skipped: 'Ignorado',
diff --git a/src/languages/zh-hans.ts b/src/languages/zh-hans.ts
index 4ffcf8fa..e02ead70 100644
--- a/src/languages/zh-hans.ts
+++ b/src/languages/zh-hans.ts
@@ -8323,6 +8323,12 @@ ${reportName}`,
defaultApprover: '默认审批人',
approverFields: {recruiter: '招聘人员', recruitingCoordinator: '招聘协调员'},
subtitle: '连接招聘工具并保持候选人审批同步。',
+ syncResults: {
+ importedCount: () => ({
+ one: '1 名候选人',
+ other: (count: number) => `${count} 名候选人`,
+ }),
+ },
},
merge: {
connections: '连接',
Note You can apply these changes to your branch by copying the patch to your clipboard, then running |
Codecov Report❌ Looks like you've decreased code coverage for some files. Please write tests to increase, or at least maintain, the existing level of code coverage. See our documentation here for how to interpret this table.
|
|
@codex review |
|
🚧 yuwenmemon has triggered a test Expensify/App build. You can view the workflow run here. |
|
🧪🧪 Use the links below to test this adhoc build on Android, iOS, and Web. Happy testing! 🧪🧪
|
|
✋ This PR was not deployed to staging yet because QA is ongoing. It will be automatically deployed to staging after the next production release. |
|
🚀 Deployed to staging by https://github.com/yuwenmemon in version: 9.4.92-0 🚀
|
|
@bernhardoj 1790198814546.101288-Web.mp4 |
|
🚀 Deployed to production by https://github.com/lakchote in version: 9.4.92-8 🚀
Bundle Size Analysis (Sentry): |

Explanation of Change
Fixed Issues
$ #99515
PROPOSAL:
Tests
Same as QA Steps
Offline tests
Same as QA Steps
QA Steps
// TODO: These must be filled out, or the issue title must include "[No QA]."
Prerequisite:
Since syncing takes a long time, to simulate
Syncing completes (steps 5-6):
Sync limit reached (step 7):
PR Author Checklist
### Fixed Issuessection aboveTestssectionOffline stepssectionQA stepssectionAvatar, 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
Android: Native
Android: mWeb Chrome
iOS: Native
iOS: mWeb Safari
MacOS: Chrome / Safari
web.mp4