Skip to content

Add personal track goal onboarding screen#89466

Draft
MelvinBot wants to merge 18 commits into
mainfrom
claude-addPersonalTrackGoalOnboarding
Draft

Add personal track goal onboarding screen#89466
MelvinBot wants to merge 18 commits into
mainfrom
claude-addPersonalTrackGoalOnboarding

Conversation

@MelvinBot
Copy link
Copy Markdown
Contributor

@MelvinBot MelvinBot commented May 4, 2026

Explanation of Change

Adds a new onboarding screen (onboarding/personaltrackcase) that appears when users select "Track and budget expenses" (personal spend) during onboarding. This screen asks what they want to track with four options:

  • Investment tracking
  • Household tracking
  • Side project tracking
  • Something else (shows a free text input)

The selection is stored locally in Onyx during onboarding and sent as personalTrackGoal with the CompleteGuidedSetup API call, which stores it in the introSelected NVP under the personaltrackgoal key.

Fixed Issues

$ #88221

Tests

  1. Sign up with a new user.
  2. Press Skip work email.
  3. On the /onboarding/purpose modal, select Organize my personal spending.
  4. Verify that you are navigated to the /onboarding/personaltrackcase modal.
  5. Verify that the following 4 options are visible:
    • Costs for an investment property
    • Household expenses
    • Side project expenses
    • Something else
  6. Press Something else.
  7. Verify that the input for adding the tracking value is displayed.

Offline tests

  1. Sign up with a new user.
  2. Press Skip work email.
  3. On the /onboarding/purpose modal, select Organize my personal spending.
  4. Verify that you are navigated to the /onboarding/personaltrackcase modal.
  5. Verify that the following 4 options are visible:
    • Costs for an investment property
    • Household expenses
    • Side project expenses
    • Something else
  6. Press Something else.
  7. Verify that the input for adding the tracking value is displayed.

QA Steps

  1. Sign up with a new user.
  2. Press Skip work email.
  3. On the /onboarding/purpose modal, select Organize my personal spending.
  4. Verify that you are navigated to the /onboarding/personaltrackcase modal.
  5. Verify that the following 4 options are visible:
    • Costs for an investment property
    • Household expenses
    • Side project expenses
    • Something else
  6. Press Something else.
  7. Verify that the input for adding the tracking value is displayed.
  • Verify that no errors appear in the JS console

PR Author Checklist

  • I linked the correct issue in the ### Fixed Issues section above
  • I wrote clear testing steps that cover the changes made in this PR
    • I added steps for local testing in the Tests section
    • I added steps for the expected offline behavior in the Offline steps section
    • I added steps for Staging and/or Production testing in the QA steps section
    • I added steps to cover failure scenarios (i.e. verify an input displays the correct error message if the entered data is not correct)
    • I turned off my network connection and tested it while offline to ensure it matches the expected behavior (i.e. verify the default avatar icon is displayed if app is offline)
    • I tested this PR with a High Traffic account against the staging or production API to ensure there are no regressions (e.g. long loading states that impact usability).
  • I included screenshots or videos for tests on all platforms
  • I ran the tests on all platforms & verified they passed on:
    • Android: Native
    • Android: mWeb Chrome
    • iOS: Native
    • iOS: mWeb Safari
    • MacOS: Chrome / Safari
  • I verified there are no console errors (if there's a console error not related to the PR, report it or open an issue for it to be fixed)
  • I followed proper code patterns (see Reviewing the code)
    • I verified that any callback methods that were added or modified are named for what the method does and never what callback they handle (i.e. toggleReport and not onIconClick)
    • I verified that comments were added to code that is not self explanatory
    • I verified that any new or modified comments were clear, correct English, and explained "why" the code was doing something instead of only explaining "what" the code was doing.
    • I verified any copy / text shown in the product is localized by adding it to src/languages/* files and using the translation method
      • If any non-english text was added/modified, I used JaimeGPT to get English > Spanish translation. I then posted it in #expensify-open-source and it was approved by an internal Expensify engineer. Link to Slack message:
    • I verified all numbers, amounts, dates and phone numbers shown in the product are using the localization methods
    • I verified any copy / text that was added to the app is grammatically correct in English. It adheres to proper capitalization guidelines (note: only the first word of header/labels should be capitalized), and is either coming verbatim from figma or has been approved by marketing (in order to get marketing approval, ask the Bug Zero team member to add the Waiting for copy label to the issue)
    • I verified proper file naming conventions were followed for any new files or renamed files. All non-platform specific files are named after what they export and are not named "index.js". All platform-specific files are named for the platform the code supports as outlined in the README.
    • I verified the JSDocs style guidelines (in STYLE.md) were followed
  • If a new code pattern is added I verified it was agreed to be used by multiple Expensify engineers
  • I followed the guidelines as stated in the Review Guidelines
  • I tested other components that can be impacted by my changes (i.e. if the PR modifies a shared library or component like Avatar, I verified the components using Avatar are working as expected)
  • I verified all code is DRY (the PR doesn't include any logic written more than once, with the exception of tests)
  • I verified any variables that can be defined as constants (ie. in CONST.ts or at the top of the file that uses the constant) are defined as such
  • I verified that if a function's arguments changed that all usages have also been updated correctly
  • If any new file was added I verified that:
    • The file has a description of what it does and/or why is needed at the top of the file if the code is not self explanatory
  • If a new CSS style is added I verified that:
    • A similar style doesn't already exist
    • The style can't be created with an existing StyleUtils function (i.e. StyleUtils.getBackgroundAndBorderStyle(theme.componentBG))
  • If the PR modifies code that runs when editing or sending messages, I tested and verified there is no unexpected behavior for all supported markdown - URLs, single line code, code blocks, quotes, headings, bold, strikethrough, and italic.
  • If the PR modifies a generic component, I tested and verified that those changes do not break usages of that component in the rest of the App (i.e. if a shared library or component like Avatar is modified, I verified that Avatar is working as expected in all cases)
  • If the PR modifies a component related to any of the existing Storybook stories, I tested and verified all stories for that component are still working as expected.
  • If the PR modifies a component or page that can be accessed by a direct deeplink, I verified that the code functions as expected when the deeplink is used - from a logged in and logged out account.
  • If the PR modifies the UI (e.g. new buttons, new UI components, changing the padding/spacing/sizing, moving components, etc) or modifies the form input styles:
    • I verified that all the inputs inside a form are aligned with each other.
    • I added Design label and/or tagged @Expensify/design so the design team can review the changes.
  • If a new page is added, I verified it's using the ScrollView component to make it scrollable when more elements are added to the page.
  • I added unit tests for any new feature or bug fix in this PR to help automatically prevent regressions in this user flow.
  • If the main branch was merged into this PR after a review, I tested again and verified the outcome was still expected according to the Test steps.
  • I verified that similar component doesn't exist in the codebase
  • I verified that all props are defined accurately and each prop has a /** comment above it */
  • I verified that each file is named correctly
  • I verified that each component has a clear name that is non-ambiguous and the purpose of the component can be inferred from the name alone
  • I verified that the only data being stored in component state is data necessary for rendering and nothing else
  • In component if we are not using the full Onyx data that we loaded, I've added the proper selector in order to ensure the component only re-renders when the data it is using changes
  • For Class Components, any internal methods passed to components event handlers are bound to this properly so there are no scoping issues (i.e. for onClick={this.submit} the method this.submit should be bound to this in the constructor)
  • I verified that component internal methods bound to this are necessary to be bound (i.e. avoid this.submit = this.submit.bind(this); if this.submit is never passed to a component event handler like onClick)
  • I verified that all JSX used for rendering exists in the render method
  • I verified that each component has the minimum amount of code necessary for its purpose, and it is broken down into smaller components in order to separate concerns and functions

Screenshots/Videos

Android: Native
Android: mWeb Chrome
iOS: Native
iOS: mWeb Safari
MacOS: Chrome / Safari

When a user selects "Track and budget expenses" (personal spend) during
onboarding, they now see an additional screen asking what they want to
track: Investment tracking, Household tracking, Side project tracking,
or Something else (with a free text input). The selection is stored as
personalTrackGoal and sent with the CompleteGuidedSetup API call.

Co-authored-by: Jayesh Mangwani <jayeshmangwani@users.noreply.github.com>
@OSBotify

This comment has been minimized.

…onary

Co-authored-by: Jayesh Mangwani <jayeshmangwani@users.noreply.github.com>
@MelvinBot
Copy link
Copy Markdown
Contributor Author

Fixed the failing spellcheck: added personaltrackcase, personaltrackgoal, and sideproject to the cspell dictionary.

…step counter tests

Remove the unused `autoCreateTrackWorkspace` variable in BaseOnboardingPurpose
(ESLint no-unused-vars). Update getOnboardingStepCounterTest to account for the
new PERSONAL_TRACK_GOAL screen in PERSONAL_SPEND onboarding flows.

Co-authored-by: Jayesh Mangwani <jayeshmangwani@users.noreply.github.com>
@MelvinBot
Copy link
Copy Markdown
Contributor Author

Fixed the failing checks:

  1. ESLint — Removed unused autoCreateTrackWorkspace variable from BaseOnboardingPurpose.tsx (the PERSONAL_SPEND flow now navigates to a new screen instead of calling this hook directly).
  2. Tests (job 8) — Updated getOnboardingStepCounterTest.ts to include the new PERSONAL_TRACK_GOAL screen in all PERSONAL_SPEND flow expectations (step counts, totals, and percentages).

Note: The ReimbursementAccountLoadingIndicator.tsx ESLint deprecation warning (absoluteFillObject) is unrelated to this PR.

@codecov
Copy link
Copy Markdown

codecov Bot commented May 4, 2026

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.

Files with missing lines Coverage Δ
src/CONST/index.ts 93.89% <100.00%> (+0.04%) ⬆️
src/ONYXKEYS.ts 100.00% <ø> (ø)
src/ROUTES.ts 18.29% <100.00%> (-0.22%) ⬇️
src/SCREENS.ts 100.00% <ø> (ø)
src/components/Icon/chunks/illustrations.chunk.ts 0.00% <ø> (ø)
...pNavigator/Navigators/OnboardingModalNavigator.tsx 89.58% <100.00%> (+0.22%) ⬆️
src/libs/Navigation/linkingConfig/config.ts 76.92% <ø> (ø)
src/libs/actions/Report/index.ts 69.43% <100.00%> (+0.17%) ⬆️
src/libs/getOnboardingStepCounter.ts 100.00% <ø> (ø)
.../pages/OnboardingPurpose/BaseOnboardingPurpose.tsx 91.42% <100.00%> (+0.25%) ⬆️
... and 5 more
... and 362 files with indirect coverage changes

@jayeshmangwani
Copy link
Copy Markdown
Contributor

@MelvinBot, now that this PR is merged, we have two tracking options: "Track expenses for my business" and "Organize my personal spending". merge the latest main and apply the related changes for option "Organize my personal spending".

…ckGoalOnboarding

Co-authored-by: Jayesh Mangwani <jayeshmangwani@users.noreply.github.com>

# Conflicts:
#	src/hooks/useAutoCreateTrackWorkspace.ts
#	src/libs/getOnboardingStepCounter.ts
#	src/pages/OnboardingPurpose/BaseOnboardingPurpose.tsx
@MelvinBot
Copy link
Copy Markdown
Contributor Author

Merged latest main and applied the TRACK_PERSONAL ("Organize my personal spending") changes:

  1. BaseOnboardingPurpose.tsx — When the user selects "Organize my personal spending" (TRACK_PERSONAL), they now navigate to the PERSONAL_TRACK_GOAL screen before continuing to personal details
  2. getOnboardingStepCounter.ts — Added PERSONAL_TRACK_GOAL to the TRACK_PERSONAL flow so the step counter/progress bar reflects the extra screen
  3. useAutoCreateTrackWorkspace.ts — Resolved conflicts to use the new useOnboardingWorkspaceCreationState() hook while keeping onboardingPersonalTrackGoal for the completeOnboarding call
  4. BaseOnboardingPersonalTrackGoal.tsx — Updated RadioListItemSingleSelectListItem (renamed on main)
  5. Tests — Updated getOnboardingStepCounterTest.ts with new TRACK_PERSONAL test cases and adjusted PERSONAL_SPEND tests (no longer includes the personal track goal screen). Updated OnboardingPurpose.tsx test to expect navigation to PERSONAL_TRACK_GOAL for TRACK_PERSONAL.

All 74 step counter tests pass and typecheck is clean.

@OSBotify

This comment has been minimized.

The downgrade from 3.0.71 to 3.0.69 with a patch caused a render count
regression in the ReportActionCompose perf test. Version 3.0.71 already
contains the hasMountedRef fix with shouldGetCachedValueRef correctly
placed outside the guard, so the downgrade and patch are unnecessary.

Co-authored-by: Jayesh Mangwani <jayeshmangwani@users.noreply.github.com>
@MelvinBot
Copy link
Copy Markdown
Contributor Author

Fixed the failing perf-tests check by reverting the unnecessary react-native-onyx downgrade from 3.0.71 to 3.0.69.

The patch applied to 3.0.69 put shouldGetCachedValueRef.current = true inside the hasMountedRef guard, but 3.0.71 already has this fix with shouldGetCachedValueRef correctly placed outside the guard (it doesn't cause extra renders on its own). This behavioral difference caused 2 extra renders in ReportActionCompose, which has multiple useOnyx hooks.

@MelvinBot
Copy link
Copy Markdown
Contributor Author

⚠️ MelvinBot CI Fix Loop Detected

MelvinBot has made 5 consecutive commits trying to fix CI failures. Automatic CI fix dispatches are now paused for this PR.

Next steps: A human should review the recent commits and resolve the conflicting CI errors manually.

@sentry
Copy link
Copy Markdown

sentry Bot commented May 12, 2026

📲 Install Builds

Android

🔗 App Name App ID Version Configuration
Expensify org.me.mobiexpensifyg 9.3.75-6 (509037506) Release

⚙️ app Build Distribution Settings

@jayeshmangwani
Copy link
Copy Markdown
Contributor

@MelvinBot merge main and resolve conflicts

Co-authored-by: Jayesh Mangwani <jayeshmangwani@users.noreply.github.com>
@MelvinBot
Copy link
Copy Markdown
Contributor Author

Merged main and resolved conflicts. The only conflict was patches/react-native-onyx/details.md (deleted on this branch, modified on main) — resolved by keeping it deleted to match the branch's revert.

@OSBotify

This comment has been minimized.

@jayeshmangwani
Copy link
Copy Markdown
Contributor

@Expensify/design, I wasn’t able to find the first 3 icons used in our app. Can anyone please provide the icons for Costs for an investment property , Household expenses and Side project expenses?
583559674-90bdf572-a015-4d2f-820a-8db4c4be4e11

@shawnborton
Copy link
Copy Markdown
Contributor

Sure, gimme a minute.

@shawnborton
Copy link
Copy Markdown
Contributor

Here you go: Illustrations.zip

@jayeshmangwani
Copy link
Copy Markdown
Contributor

@MelvinBot, please use these #89466 (comment) icons on the personaltrackcase page, and also match the strings with the screenshot #89466 (comment).

- Add RealEstate, HouseMoney, and TargetWithArrow illustration SVGs
- Switch from SelectionList to MenuItemList with icon support
- Update strings to match design: title, option labels, and placeholder
- Update all language files with new string values

Co-authored-by: Jayesh Mangwani <jayeshmangwani@users.noreply.github.com>
@MelvinBot
Copy link
Copy Markdown
Contributor Author

Updated the personaltrackcase page with the design icons and matching strings:

Icons added:

  • RealEstate — "Costs for an investment property"
  • HouseMoney — "Household expenses"
  • TargetWithArrow — "Side project expenses"
  • Binoculars (existing) — "Something else"

Strings updated to match the screenshot:

  • Title: "What are you looking to track?"
  • Option labels and placeholder text updated across all language files

Component changes:

  • Switched from SelectionList to MenuItemList to support illustration icons (matching the purpose page pattern)

@OSBotify

This comment has been minimized.

@jayeshmangwani
Copy link
Copy Markdown
Contributor

@MelvinBot Let’s use the three compressed SVGs below to fix the failing check.
Also, lint is failing , is that coming from our PR?
Additionally, when clicking Something else on the personaltrackcase page, the input does not auto-focused.

simple-illustration__house-money simple-illustration__realestate simple-illustration__targetwitharrow

@jayeshmangwani
Copy link
Copy Markdown
Contributor

@MelvinBot, right now when we select the Something else option but don’t enter any value to input, we see the error message: Select an option to move forward. That message is slightly misleading because the option has already been selected, the issue is that the input field is empty.
Screenshot 2026-05-22 at 7 10 44 PM

Can we follow the existing pattern used elsewhere in the app and instead show a This field is required error directly below the input when no value is entered?
596796584-8416d082-8165-462d-a825-4b20e4e4a2de

When the Something else option is selected but no text is entered,
show 'This field is required' below the input instead of the
misleading 'Select an option to move forward' at the bottom.

Co-authored-by: Jayesh Mangwani <jayeshmangwani@users.noreply.github.com>
@MelvinBot
Copy link
Copy Markdown
Contributor Author

Good catch! Pushed a fix — when "Something else" is selected but the input is empty, it now shows This field is required directly below the input (using the existing common.error.fieldRequired translation) instead of the misleading "Select an option to move forward" error at the bottom.

@jayeshmangwani
Copy link
Copy Markdown
Contributor

@MelvinBot please merge main and resolve conflicts

…ell.json conflict

Co-authored-by: Jayesh Mangwani <jayeshmangwani@users.noreply.github.com>
@MelvinBot
Copy link
Copy Markdown
Contributor Author

Merged main and resolved the conflict in cspell.json (kept the Signup and sideproject words added by this PR).

@OSBotify
Copy link
Copy Markdown
Contributor

🦜 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 diff
diff --git a/src/languages/de.ts b/src/languages/de.ts
index 21554fba6d0..e02c9f17fe8 100644
--- a/src/languages/de.ts
+++ b/src/languages/de.ts
@@ -2991,7 +2991,7 @@ ${amount} für ${merchant} – ${date}`,
         },
         personalTrackGoal: {
             title: 'Was möchten Sie nachverfolgen?',
-            [CONST.ONBOARDING_PERSONAL_TRACK_GOALS.INVESTMENT_TRACKING]: 'Kosten für eine Investitionsimmobilie',
+            [CONST.ONBOARDING_PERSONAL_TRACK_GOALS.INVESTMENT_TRACKING]: 'Kosten für eine Anlageimmobilie',
             [CONST.ONBOARDING_PERSONAL_TRACK_GOALS.HOUSEHOLD_TRACKING]: 'Haushaltsausgaben',
             [CONST.ONBOARDING_PERSONAL_TRACK_GOALS.SIDEPROJECT_TRACKING]: 'Ausgaben für Nebenprojekte',
             [CONST.ONBOARDING_PERSONAL_TRACK_GOALS.SOMETHING_ELSE]: 'Etwas anderes',
diff --git a/src/languages/es.ts b/src/languages/es.ts
index 11a682a5a8d..2b91ccf7e1c 100644
--- a/src/languages/es.ts
+++ b/src/languages/es.ts
@@ -2867,8 +2867,8 @@ ${amount} para ${merchant} - ${date}`,
             title: '¿Qué quieres organizar?',
             [CONST.ONBOARDING_PERSONAL_TRACK_GOALS.INVESTMENT_TRACKING]: 'Costes de una propiedad de inversión',
             [CONST.ONBOARDING_PERSONAL_TRACK_GOALS.HOUSEHOLD_TRACKING]: 'Gastos del hogar',
-            [CONST.ONBOARDING_PERSONAL_TRACK_GOALS.SIDEPROJECT_TRACKING]: 'Gastos de proyecto paralelo',
-            [CONST.ONBOARDING_PERSONAL_TRACK_GOALS.SOMETHING_ELSE]: 'Algo más',
+            [CONST.ONBOARDING_PERSONAL_TRACK_GOALS.SIDEPROJECT_TRACKING]: 'Gastos de proyectos paralelos',
+            [CONST.ONBOARDING_PERSONAL_TRACK_GOALS.SOMETHING_ELSE]: 'Otra cosa',
             somethingElsePlaceholder: '¿Qué estás organizando?',
         },
         employees: {
diff --git a/src/languages/fr.ts b/src/languages/fr.ts
index 383dce7973a..c380060cca0 100644
--- a/src/languages/fr.ts
+++ b/src/languages/fr.ts
@@ -2998,12 +2998,12 @@ ${amount} pour ${merchant} - ${date}`,
             [CONST.ONBOARDING_CHOICES.LOOKING_AROUND]: 'Autre chose',
         },
         personalTrackGoal: {
-            title: 'Que souhaitez-vous suivre ?',
-            [CONST.ONBOARDING_PERSONAL_TRACK_GOALS.INVESTMENT_TRACKING]: 'Coûts pour un bien immobilier locatif',
-            [CONST.ONBOARDING_PERSONAL_TRACK_GOALS.HOUSEHOLD_TRACKING]: 'Dépenses ménagères',
-            [CONST.ONBOARDING_PERSONAL_TRACK_GOALS.SIDEPROJECT_TRACKING]: 'Dépenses de projet annexe',
+            title: 'Qu’est-ce que vous cherchez à suivre ?',
+            [CONST.ONBOARDING_PERSONAL_TRACK_GOALS.INVESTMENT_TRACKING]: 'Coûts pour un bien locatif',
+            [CONST.ONBOARDING_PERSONAL_TRACK_GOALS.HOUSEHOLD_TRACKING]: 'Dépenses du ménage',
+            [CONST.ONBOARDING_PERSONAL_TRACK_GOALS.SIDEPROJECT_TRACKING]: 'Dépenses de projet parallèle',
             [CONST.ONBOARDING_PERSONAL_TRACK_GOALS.SOMETHING_ELSE]: 'Autre chose',
-            somethingElsePlaceholder: 'Que suivez-vous ?',
+            somethingElsePlaceholder: 'Que suivez-vous ?',
         },
         employees: {
             title: 'Combien d’employés avez-vous ?',
diff --git a/src/languages/it.ts b/src/languages/it.ts
index 1af408cf171..467e3b50d61 100644
--- a/src/languages/it.ts
+++ b/src/languages/it.ts
@@ -2984,8 +2984,8 @@ ${amount} per ${merchant} - ${date}`,
             [CONST.ONBOARDING_CHOICES.LOOKING_AROUND]: 'Altro',
         },
         personalTrackGoal: {
-            title: 'Cosa vuoi tenere traccia?',
-            [CONST.ONBOARDING_PERSONAL_TRACK_GOALS.INVESTMENT_TRACKING]: "Costi per un immobile d'investimento",
+            title: 'Che cosa vuoi tenere traccia?',
+            [CONST.ONBOARDING_PERSONAL_TRACK_GOALS.INVESTMENT_TRACKING]: 'Costi per un immobile a scopo d’investimento',
             [CONST.ONBOARDING_PERSONAL_TRACK_GOALS.HOUSEHOLD_TRACKING]: 'Spese domestiche',
             [CONST.ONBOARDING_PERSONAL_TRACK_GOALS.SIDEPROJECT_TRACKING]: 'Spese per progetti paralleli',
             [CONST.ONBOARDING_PERSONAL_TRACK_GOALS.SOMETHING_ELSE]: 'Altro',
diff --git a/src/languages/ja.ts b/src/languages/ja.ts
index 64bca51a323..7685c3f3fc7 100644
--- a/src/languages/ja.ts
+++ b/src/languages/ja.ts
@@ -2962,7 +2962,7 @@ ${date} の ${merchant} への ${amount}`,
             [CONST.ONBOARDING_PERSONAL_TRACK_GOALS.HOUSEHOLD_TRACKING]: '家計費',
             [CONST.ONBOARDING_PERSONAL_TRACK_GOALS.SIDEPROJECT_TRACKING]: 'サイドプロジェクト経費',
             [CONST.ONBOARDING_PERSONAL_TRACK_GOALS.SOMETHING_ELSE]: 'その他',
-            somethingElsePlaceholder: '何を記録しますか?',
+            somethingElsePlaceholder: '何を記録していますか?',
         },
         employees: {
             title: '従業員は何人いますか?',
diff --git a/src/languages/nl.ts b/src/languages/nl.ts
index de2b359cc7c..bfb48ef7e86 100644
--- a/src/languages/nl.ts
+++ b/src/languages/nl.ts
@@ -2982,11 +2982,11 @@ ${amount} voor ${merchant} - ${date}`,
         },
         personalTrackGoal: {
             title: 'Wat wil je bijhouden?',
-            [CONST.ONBOARDING_PERSONAL_TRACK_GOALS.INVESTMENT_TRACKING]: 'Kosten voor een investeringspand',
+            [CONST.ONBOARDING_PERSONAL_TRACK_GOALS.INVESTMENT_TRACKING]: 'Kosten voor een beleggingspand',
             [CONST.ONBOARDING_PERSONAL_TRACK_GOALS.HOUSEHOLD_TRACKING]: 'Huishoudelijke uitgaven',
-            [CONST.ONBOARDING_PERSONAL_TRACK_GOALS.SIDEPROJECT_TRACKING]: 'Kosten voor nevenproject',
+            [CONST.ONBOARDING_PERSONAL_TRACK_GOALS.SIDEPROJECT_TRACKING]: 'Uitgaven voor nevenproject',
             [CONST.ONBOARDING_PERSONAL_TRACK_GOALS.SOMETHING_ELSE]: 'Iets anders',
-            somethingElsePlaceholder: 'Wat ben je aan het bijhouden?',
+            somethingElsePlaceholder: 'Wat houd je bij?',
         },
         employees: {
             title: 'Hoeveel medewerkers heb je?',
diff --git a/src/languages/pl.ts b/src/languages/pl.ts
index bbad3ae045c..b73d56c6e84 100644
--- a/src/languages/pl.ts
+++ b/src/languages/pl.ts
@@ -2975,9 +2975,9 @@ ${amount} dla ${merchant} - ${date}`,
         },
         personalTrackGoal: {
             title: 'Co chcesz śledzić?',
-            [CONST.ONBOARDING_PERSONAL_TRACK_GOALS.INVESTMENT_TRACKING]: 'Koszty dotyczące nieruchomości inwestycyjnej',
+            [CONST.ONBOARDING_PERSONAL_TRACK_GOALS.INVESTMENT_TRACKING]: 'Koszty związane z nieruchomością inwestycyjną',
             [CONST.ONBOARDING_PERSONAL_TRACK_GOALS.HOUSEHOLD_TRACKING]: 'Wydatki domowe',
-            [CONST.ONBOARDING_PERSONAL_TRACK_GOALS.SIDEPROJECT_TRACKING]: 'Wydatki na projekty poboczne',
+            [CONST.ONBOARDING_PERSONAL_TRACK_GOALS.SIDEPROJECT_TRACKING]: 'Wydatki na projekt poboczny',
             [CONST.ONBOARDING_PERSONAL_TRACK_GOALS.SOMETHING_ELSE]: 'Coś innego',
             somethingElsePlaceholder: 'Co śledzisz?',
         },
diff --git a/src/languages/pt-BR.ts b/src/languages/pt-BR.ts
index 5ee1dc26882..f7f61f85cbd 100644
--- a/src/languages/pt-BR.ts
+++ b/src/languages/pt-BR.ts
@@ -2975,7 +2975,7 @@ ${amount} para ${merchant} - ${date}`,
         },
         personalTrackGoal: {
             title: 'O que você quer controlar?',
-            [CONST.ONBOARDING_PERSONAL_TRACK_GOALS.INVESTMENT_TRACKING]: 'Custos de um imóvel de investimento',
+            [CONST.ONBOARDING_PERSONAL_TRACK_GOALS.INVESTMENT_TRACKING]: 'Custos de um imóvel para investimento',
             [CONST.ONBOARDING_PERSONAL_TRACK_GOALS.HOUSEHOLD_TRACKING]: 'Despesas domésticas',
             [CONST.ONBOARDING_PERSONAL_TRACK_GOALS.SIDEPROJECT_TRACKING]: 'Despesas de projeto paralelo',
             [CONST.ONBOARDING_PERSONAL_TRACK_GOALS.SOMETHING_ELSE]: 'Outra coisa',
diff --git a/src/languages/zh-hans.ts b/src/languages/zh-hans.ts
index 22051d7f8a4..b8966cd8b6c 100644
--- a/src/languages/zh-hans.ts
+++ b/src/languages/zh-hans.ts
@@ -2904,7 +2904,7 @@ ${amount},商户:${merchant} - 日期:${date}`,
             [CONST.ONBOARDING_PERSONAL_TRACK_GOALS.HOUSEHOLD_TRACKING]: '家庭支出',
             [CONST.ONBOARDING_PERSONAL_TRACK_GOALS.SIDEPROJECT_TRACKING]: '副业报销',
             [CONST.ONBOARDING_PERSONAL_TRACK_GOALS.SOMETHING_ELSE]: '其他原因',
-            somethingElsePlaceholder: '你正在跟踪什么?',
+            somethingElsePlaceholder: '你在记录什么?',
         },
         employees: {
             title: '您有多少名员工?',

Note

You can apply these changes to your branch by copying the patch to your clipboard, then running pbpaste | git apply 😉

View workflow run

@jayeshmangwani
Copy link
Copy Markdown
Contributor

@MelvinBot merge main and please fix typescript checks

…ckGoalOnboarding

Co-authored-by: Jayesh Mangwani <jayeshmangwani@users.noreply.github.com>
@MelvinBot
Copy link
Copy Markdown
Contributor Author

Merged main into this branch. The previous typecheck and validate-perf-tests CI failures were both infrastructure issues (GitHub account suspension and action download failure), not actual code problems. TypeScript checks pass cleanly — no errors in any PR-changed files. The new push should trigger a fresh CI run.

@jayeshmangwani
Copy link
Copy Markdown
Contributor

@codex review

Copy link
Copy Markdown

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 22b293dd7b

ℹ️ 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".

adminsChatReportID: newAdminsChatReportID,
onboardingPolicyID: newPolicyID,
shouldWaitForRHPVariantInitialization: isSidePanelReportSupported,
personalTrackGoal: onboardingPersonalTrackGoal ?? undefined,
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Don’t reuse stale personal track goals

When a user first selects Track personal and reaches this screen, then goes back to Purpose and chooses Track business/legacy personal spend, ONBOARDING_PERSONAL_TRACK_GOAL is never cleared, but useAutoCreateTrackWorkspace sends the cached value for every track onboarding completion. That means non-Track-personal completions can be submitted with an unrelated personalTrackGoal, corrupting the onboarding data sent to CompleteGuidedSetup; either clear this key when leaving the Track personal path or only pass it when onboardingPurposeSelected === TRACK_PERSONAL.

Useful? React with 👍 / 👎.

@jayeshmangwani
Copy link
Copy Markdown
Contributor

@MelvinBot please update these translations #89466 (comment) and check this comment #89466 (comment)

Apply improved translations for de, es, fr, it, ja, nl, pl, pt-BR, zh-hans.
Only pass personalTrackGoal to CompleteGuidedSetup when onboarding purpose
is TRACK_PERSONAL to prevent stale data from leaking into other paths.

Co-authored-by: Jayesh Mangwani <jayeshmangwani@users.noreply.github.com>
@MelvinBot
Copy link
Copy Markdown
Contributor Author

Applied the Polyglot Parrot translations and also addressed the review comment about stale personalTrackGoal data.

Changes pushed:

  1. Translations — Applied all suggested improvements for de, es, fr, it, ja, nl, pl, pt-BR, and zh-hans.
  2. Bug fix — Guarded personalTrackGoal in useAutoCreateTrackWorkspace.ts so it's only passed to CompleteGuidedSetup when onboardingPurposeSelected === TRACK_PERSONAL. Previously, if a user selected a personal track goal, went back, and chose a different onboarding path, the stale value would still be sent.

@jayeshmangwani
Copy link
Copy Markdown
Contributor

jayeshmangwani commented May 28, 2026

@Expensify/design, need a quick confirmation regarding this UI:

When the user selects Something else, we show the input field. To indicate that the Something else option is selected, we currently show a border around the row.

Does this approach look good?
Screenshot 2026-05-28 at 5 00 59 PM

Screenshot 2026-05-28 at 4 59 42 PM Simulator Screenshot - iPhone 16 Pro - 2026-05-28 at 16 50 09

@dannymcclain
Copy link
Copy Markdown
Contributor

Can we style it like the other rows when they're selected?

Original mock from the linked issue:
image

@jayeshmangwani
Copy link
Copy Markdown
Contributor

Thanks for the mock. Sorry, I overlooked this screenshot in the issue description.

@jayeshmangwani
Copy link
Copy Markdown
Contributor

@MelvinBot , please update the selection styling for the selected Something else option. We want it to match this design: #89466 (comment)

@dannymcclain
Copy link
Copy Markdown
Contributor

No worries!

Show a green circle checkmark on the right side of selected menu items
on the personaltrackcase onboarding screen, matching the design mock.

Co-authored-by: Jayesh Mangwani <jayeshmangwani@users.noreply.github.com>
@MelvinBot
Copy link
Copy Markdown
Contributor Author

Added shouldShowRadioButton: true to all menu items in 38cb03a so the green circle checkmark indicator now appears on the right side of each selected option — including "Something else".

Initial state - empty radio circles on right side
Investment property selected - green checkmark on right
Something else selected - green checkmark and text input
Household expenses selected - checkmark moved

@jayeshmangwani
Copy link
Copy Markdown
Contributor

@MelvinBot Please revert the last change. We don’t want to show a radio button or a green outline for the selected choice.

We want to:

  • Show a checkmark on the right side
  • Change the background color for the selected option
599453083-f76360b6-5b07-4103-a61a-0ccb40e994a5

@MelvinBot
Copy link
Copy Markdown
Contributor Author

⚠️ Something went wrong. This may be a transient issue — try again. If it persists, check status.anthropic.com.

Run details

@jayeshmangwani
Copy link
Copy Markdown
Contributor

@MelvinBot Please revert the last change. We don’t want to show a radio button or a green outline for the selected choice.

We want to:

  • Show a checkmark on the right side
  • Change the background color for the selected option
599453083-f76360b6-5b07-4103-a61a-0ccb40e994a5

Replaces the radio button and green outline indicator with a right-aligned
checkmark icon and an active background color on the selected menu item.

Co-authored-by: Jayesh Mangwani <jayeshmangwani@users.noreply.github.com>
@MelvinBot
Copy link
Copy Markdown
Contributor Author

Done — pushed 643d7c5b10.

Removed the radio button and green outline. The selected option now shows a checkmark on the right and uses theme.activeComponentBG as the background color.

@jayeshmangwani
Copy link
Copy Markdown
Contributor

@MelvinBot, please make the following changes:

  1. We don’t want the “Continue” button for the other selected options except the "Something else". When any of the other three options are pressed, we should navigate directly to the next page.
  2. The check icon on the right side should use a green color.
  3. Can we make the hover color the same as the selection color? Right now, the selection color is darker than the hover color.

- Navigate immediately on non-SOMETHING_ELSE options (no Continue button)
- Use green color for the right check icon via success prop
- Match hover color to selection color using Hoverable wrapper

Co-authored-by: Jayesh Mangwani <jayeshmangwani@users.noreply.github.com>
@MelvinBot
Copy link
Copy Markdown
Contributor Author

Pushed the changes:

  1. Continue button removed for non-"Something else" options — clicking Investment / Household / Side project now immediately saves the goal and navigates to the next page. The Continue button only shows when "Something else" is selected (where the free-text input needs validation).
  2. Green check icon — passing success={isSelected} on the MenuItem, which maps to theme.iconSuccessFill in getIconFillColor.
  3. Hover color matches selection color — wrapped each MenuItem in Hoverable and used shouldRemoveHoverBackground to disable the default lighter hover background; the wrapper style now applies activeComponentBG when the item is either selected or hovered, so both states use the same darker tone.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants