Warn user about ongoing trip when signing out - GPS#79587
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 |
|
|
🦜 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 ade7c8fc..2e6deecc 100644
--- a/src/languages/de.ts
+++ b/src/languages/de.ts
@@ -7989,12 +7989,8 @@ Hier ist ein *Testbeleg*, um dir zu zeigen, wie es funktioniert:`,
subtitle: 'Protokolliere Meilen oder Kilometer automatisch mit GPS und verwandle Fahrten sofort in Ausgaben.',
button: 'App herunterladen',
},
- notification: {title: 'GPS-Tracking läuft', body: 'Wechsel zur App, um abzuschließen'},
- signOutWarningTripInProgress: {
- title: 'GPS tracking in progress',
- prompt: 'Are you sure you want to discard the trip and sign out?',
- confirm: 'Discard and sign out',
- },
+ notification: {title: 'GPS-Tracking läuft', body: 'Zur App gehen, um abzuschließen'},
+ signOutWarningTripInProgress: {title: 'GPS-Tracking läuft', prompt: 'Sind Sie sicher, dass Sie die Reise verwerfen und sich abmelden möchten?', confirm: 'Verwerfen und abmelden'},
},
};
// IMPORTANT: This line is manually replaced in generate translation files by scripts/generateTranslations.ts,
diff --git a/src/languages/fr.ts b/src/languages/fr.ts
index d05bb6e9..e24bb84a 100644
--- a/src/languages/fr.ts
+++ b/src/languages/fr.ts
@@ -1194,7 +1194,7 @@ const translations: TranslationDeepObject<typeof en> = {
other: 'Voulez-vous vraiment supprimer ces dépenses ?',
}),
deleteReport: 'Supprimer le rapport',
- deleteReportConfirmation: 'Voulez-vous vraiment supprimer ce rapport ?',
+ deleteReportConfirmation: 'Voulez-vous vraiment supprimer ce rapport ?',
settledExpensify: 'Payé',
done: 'Terminé',
settledElsewhere: 'Payé ailleurs',
@@ -7995,11 +7995,7 @@ Voici un *reçu test* pour vous montrer comment cela fonctionne :`,
button: 'Télécharger l’application',
},
notification: {title: 'Suivi GPS en cours', body: 'Allez dans l’application pour terminer'},
- signOutWarningTripInProgress: {
- title: 'GPS tracking in progress',
- prompt: 'Are you sure you want to discard the trip and sign out?',
- confirm: 'Discard and sign out',
- },
+ signOutWarningTripInProgress: {title: 'Suivi GPS en cours', prompt: 'Voulez-vous vraiment abandonner le déplacement et vous déconnecter ?', confirm: 'Ignorer et se déconnecter'},
},
};
// IMPORTANT: This line is manually replaced in generate translation files by scripts/generateTranslations.ts,
diff --git a/src/languages/it.ts b/src/languages/it.ts
index 2b59f628..3500157b 100644
--- a/src/languages/it.ts
+++ b/src/languages/it.ts
@@ -1189,7 +1189,7 @@ const translations: TranslationDeepObject<typeof en> = {
one: 'Sei sicuro di voler eliminare questa spesa?',
other: 'Sei sicuro di voler eliminare queste spese?',
}),
- deleteReport: 'Elimina resoconto',
+ deleteReport: 'Elimina report',
deleteReportConfirmation: 'Sei sicuro di voler eliminare questo report?',
settledExpensify: 'Pagato',
done: 'Fatto',
@@ -7971,12 +7971,8 @@ Ecco una *ricevuta di prova* per mostrarti come funziona:`,
subtitle: 'Registra automaticamente miglia o chilometri con il GPS e trasforma i viaggi in spese all’istante.',
button: 'Scarica l’app',
},
- notification: {title: 'Tracciamento GPS in corso', body: "Vai all'app per completare"},
- signOutWarningTripInProgress: {
- title: 'GPS tracking in progress',
- prompt: 'Are you sure you want to discard the trip and sign out?',
- confirm: 'Discard and sign out',
- },
+ notification: {title: 'Tracciamento GPS in corso', body: "Vai all'app per terminare"},
+ signOutWarningTripInProgress: {title: 'Tracciamento GPS in corso', prompt: 'Sei sicuro di voler annullare il viaggio e disconnetterti?', confirm: 'Annulla e disconnettiti'},
},
};
// IMPORTANT: This line is manually replaced in generate translation files by scripts/generateTranslations.ts,
diff --git a/src/languages/ja.ts b/src/languages/ja.ts
index a72e931d..f02fcd5a 100644
--- a/src/languages/ja.ts
+++ b/src/languages/ja.ts
@@ -7890,12 +7890,8 @@ Expensify の使い方をお見せするための*テストレシート*がこ
},
preciseLocationRequiredModal: {title: '正確な位置情報が必要です', prompt: 'GPS距離の追跡を開始するには、デバイスの設定で「正確な位置情報」を有効にしてください。'},
desktop: {title: 'スマートフォンで距離を記録する', subtitle: 'GPS で自動的にマイルまたはキロメートルを記録し、移動をすぐに経費に変換します。', button: 'アプリをダウンロード'},
- notification: {title: 'GPS追跡を実行中', body: '完了するにはアプリに移動'},
- signOutWarningTripInProgress: {
- title: 'GPS tracking in progress',
- prompt: 'Are you sure you want to discard the trip and sign out?',
- confirm: 'Discard and sign out',
- },
+ notification: {title: 'GPS追跡を実行中', body: '完了するにはアプリに移動してください'},
+ signOutWarningTripInProgress: {title: 'GPS追跡を実行中', prompt: 'この出張を破棄してサインアウトしてもよろしいですか?', confirm: '破棄してサインアウト'},
},
};
// IMPORTANT: This line is manually replaced in generate translation files by scripts/generateTranslations.ts,
diff --git a/src/languages/nl.ts b/src/languages/nl.ts
index e08180c9..43304bd4 100644
--- a/src/languages/nl.ts
+++ b/src/languages/nl.ts
@@ -1190,7 +1190,7 @@ const translations: TranslationDeepObject<typeof en> = {
other: 'Weet je zeker dat je deze uitgaven wilt verwijderen?',
}),
deleteReport: 'Rapport verwijderen',
- deleteReportConfirmation: 'Weet u zeker dat u dit rapport wilt verwijderen?',
+ deleteReportConfirmation: 'Weet je zeker dat je dit rapport wilt verwijderen?',
settledExpensify: 'Betaald',
done: 'Gereed',
settledElsewhere: 'Elders betaald',
@@ -7953,12 +7953,8 @@ Hier is een *testbon* om je te laten zien hoe het werkt:`,
},
preciseLocationRequiredModal: {title: 'Precieze locatie vereist', prompt: 'Schakel "precieze locatie" in de instellingen van je apparaat in om GPS-afstandsregistratie te starten.'},
desktop: {title: 'Volg afstand op je telefoon', subtitle: 'Leg kilometers of mijlen automatisch vast met GPS en zet ritten direct om in uitgaven.', button: 'Download de app'},
- notification: {title: 'GPS-tracking bezig', body: 'Ga naar de app om af te ronden'},
- signOutWarningTripInProgress: {
- title: 'GPS tracking in progress',
- prompt: 'Are you sure you want to discard the trip and sign out?',
- confirm: 'Discard and sign out',
- },
+ notification: {title: 'GPS-tracking bezig', body: 'Ga naar de app om te voltooien'},
+ signOutWarningTripInProgress: {title: 'GPS-tracking bezig', prompt: 'Weet je zeker dat je de reis wilt weggooien en uitloggen?', confirm: 'Verwerpen en afmelden'},
},
};
// IMPORTANT: This line is manually replaced in generate translation files by scripts/generateTranslations.ts,
diff --git a/src/languages/pl.ts b/src/languages/pl.ts
index 15e00013..27d82d07 100644
--- a/src/languages/pl.ts
+++ b/src/languages/pl.ts
@@ -7935,12 +7935,8 @@ Oto *paragon testowy*, który pokazuje, jak to działa:`,
subtitle: 'Automatycznie rejestruj mile lub kilometry za pomocą GPS i natychmiast zamieniaj podróże w wydatki.',
button: 'Pobierz aplikację',
},
- notification: {title: 'Śledzenie GPS w toku', body: 'Przejdź do aplikacji, aby zakończyć'},
- signOutWarningTripInProgress: {
- title: 'GPS tracking in progress',
- prompt: 'Are you sure you want to discard the trip and sign out?',
- confirm: 'Discard and sign out',
- },
+ notification: {title: 'Śledzenie GPS w toku', body: 'Przejdź do aplikacji, aby dokończyć'},
+ signOutWarningTripInProgress: {title: 'Śledzenie GPS w toku', prompt: 'Czy na pewno chcesz porzucić podróż i się wylogować?', confirm: 'Odrzuć i wyloguj się'},
},
};
// IMPORTANT: This line is manually replaced in generate translation files by scripts/generateTranslations.ts,
diff --git a/src/languages/pt-BR.ts b/src/languages/pt-BR.ts
index dec14830..43350164 100644
--- a/src/languages/pt-BR.ts
+++ b/src/languages/pt-BR.ts
@@ -1189,7 +1189,7 @@ const translations: TranslationDeepObject<typeof en> = {
other: 'Tem certeza de que deseja excluir estas despesas?',
}),
deleteReport: 'Excluir relatório',
- deleteReportConfirmation: 'Você tem certeza de que deseja excluir este relatório?',
+ deleteReportConfirmation: 'Tem certeza de que deseja excluir este relatório?',
settledExpensify: 'Pago',
done: 'Concluído',
settledElsewhere: 'Pago em outro lugar',
@@ -7947,12 +7947,8 @@ Aqui está um *recibo de teste* para mostrar como funciona:`,
subtitle: 'Registre milhas ou quilômetros automaticamente com o GPS e transforme viagens em despesas instantaneamente.',
button: 'Baixar o app',
},
- notification: {title: 'Rastreamento de GPS em andamento', body: 'Vá para o app para finalizar'},
- signOutWarningTripInProgress: {
- title: 'GPS tracking in progress',
- prompt: 'Are you sure you want to discard the trip and sign out?',
- confirm: 'Discard and sign out',
- },
+ notification: {title: 'Rastreamento por GPS em andamento', body: 'Vá para o app para finalizar'},
+ signOutWarningTripInProgress: {title: 'Rastreamento por GPS em andamento', prompt: 'Tem certeza de que deseja descartar a viagem e sair?', confirm: 'Descartar e sair'},
},
};
// IMPORTANT: This line is manually replaced in generate translation files by scripts/generateTranslations.ts,
diff --git a/src/languages/zh-hans.ts b/src/languages/zh-hans.ts
index 055cf911..a9b4be12 100644
--- a/src/languages/zh-hans.ts
+++ b/src/languages/zh-hans.ts
@@ -1172,7 +1172,7 @@ const translations: TranslationDeepObject<typeof en> = {
other: '您确定要删除这些报销吗?',
}),
deleteReport: '删除报表',
- deleteReportConfirmation: '您确定要删除此报表吗?',
+ deleteReportConfirmation: '您确定要删除此报告吗?',
settledExpensify: '已支付',
done: '完成',
settledElsewhere: '在其他地方已支付',
@@ -7741,12 +7741,8 @@ ${reportName}
androidBackgroundLocationRequiredModal: {title: '需要后台位置访问权限', prompt: '请在设备设置中允许应用使用“始终允许”位置访问权限,以开始 GPS 距离跟踪。'},
preciseLocationRequiredModal: {title: '需要精确位置', prompt: '请在设备设置中启用“精确位置”以开始 GPS 距离跟踪。'},
desktop: {title: '在手机上跟踪距离', subtitle: '使用 GPS 自动记录英里或公里,并将行程即时转换为报销费用。', button: '下载应用程序'},
- notification: {title: '正在进行 GPS 跟踪', body: '前往应用完成'},
- signOutWarningTripInProgress: {
- title: 'GPS tracking in progress',
- prompt: 'Are you sure you want to discard the trip and sign out?',
- confirm: 'Discard and sign out',
- },
+ notification: {title: 'GPS 跟踪进行中', body: '前往应用完成'},
+ signOutWarningTripInProgress: {title: 'GPS 跟踪进行中', prompt: '您确定要放弃此行程并登出吗?', confirm: '放弃并退出'},
},
};
// IMPORTANT: This line is manually replaced in generate translation files by scripts/generateTranslations.ts,
Note You can apply these changes to your branch by copying the patch to your clipboard, then running |
Codecov Report✅ Changes either increased or maintained existing code coverage, great job!
|
|
@dukenv0307 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] |
|
@JmillsExpensify please ignore, @AndrewGable will review |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 106da88cd3
ℹ️ 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".
… gps draft details
| if (isTrackingGPS) { | ||
| stopLocationUpdatesAsync(BACKGROUND_LOCATION_TRACKING_TASK_NAME) | ||
| .catch((error) => console.error('[GPS distance request] Failed to stop location tracking', error)) | ||
| .then(resetGPSDraftDetails); |
There was a problem hiding this comment.
NAB: we don't need to call resetGPSDraftDetails here since it'll be cleared after signing out
There was a problem hiding this comment.
good catch, thanks!
|
|
||
| const signOut = (shouldForceSignout = false) => { | ||
| if (!network.isOffline || shouldForceSignout) { | ||
| if ((!network.isOffline && isTrackingGPS) || shouldForceSignout) { |
There was a problem hiding this comment.
| if ((!network.isOffline && isTrackingGPS) || shouldForceSignout) { | |
| if ((!network.isOffline && !isTrackingGPS) || shouldForceSignout) { |
| scrollViewRef.current.scrollTo({y: scrollOffset, animated: false}); | ||
| }, [getScrollOffset, route]); | ||
|
|
||
| const confirmModalTitle = isTrackingGPS ? translate('gps.signOutWarningTripInProgress.title') : translate('common.areYouSure'); |
There was a problem hiding this comment.
I think the title should depend on both isTrackingGPS and offline. It'd be better if we create the variable and reuse it
There was a problem hiding this comment.
Do you mean that for isTrackingGPS and offline mode scenario the title should be different? I discussed that with @dubielzyk-expensify and we decided to do it like this => GPS copy for isTracking === true no matter if it's offline mode or not
Reviewer Checklist
Screenshots/VideosAndroid: HybridAppScreen.Recording.2026-01-21.at.22.33.07.movAndroid: mWeb ChromeiOS: HybridAppScreen.Recording.2026-01-21.at.22.31.50.moviOS: mWeb SafariMacOS: Chrome / Safari |
JmillsExpensify
left a comment
There was a problem hiding this comment.
Part of an existing initiative. Product behavior in testing steps looks good to me.
|
✋ 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/AndrewGable in version: 9.3.9-0 🚀
|
|
🚀 Deployed to production by https://github.com/roryabraham in version: 9.3.9-2 🚀
|
Explanation of Change
Adds a modal with warning when user tries to log out but has ongoing GPS trip
Fixed Issues
$ #77223
PROPOSAL: N/A
Tests
With GPS trip started:
Canceland verify that the trip has not stopped and user does not log outDiscard and sign outTest the same flow with offline mode, it should work the same as above
Verify that there is no change when:
trying to log out in offline mode without ongoing GPS trip
trying to log out in online mode without ongoing GPS trip
Verify that no errors appear in the JS console
Offline tests
QA Steps
Same as tests
PR Author Checklist
### Fixed Issuessection aboveTestssectionOffline stepssectionQA stepssectioncanBeMissingparam foruseOnyxtoggleReportand 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
Android: Native
Screen.Recording.2026-01-20.at.17.02.59.mov
iOS: Native
Screen.Recording.2026-01-20.at.16.50.34.mov
Screen.Recording.2026-01-20.at.16.51.25.mov
Screen.Recording.2026-01-20.at.16.53.43.mov