Skip to content

[No QA] Remove comments that do not add context - #100576

Merged
roryabraham merged 5 commits into
Expensify:mainfrom
software-mansion-labs:korytko/remove-bad-comments
Sep 8, 2026
Merged

roryabraham merged 5 commits into
Expensify:mainfrom
software-mansion-labs:korytko/remove-bad-comments

Conversation

@JakubKorytko

@JakubKorytko JakubKorytko commented Sep 8, 2026 •

Copy link
Copy Markdown
Member

Explanation of Change

Removes ~3700 member comments that only restate the member name or type ("Icon width" on iconWidth, "List of reports" on data: Report[]), per the amended CONSISTENCY-10 rule from #99906. Most are component props and src/types/onyx types; the same pass also covers action param types (src/libs/actions/*), navigation route param types (src/libs/Navigation/*) and key comments in src/ONYXKEYS.ts and src/CONST.

Comments that state a unit, default, condition, key semantics or sibling distinction are kept.

Some // and /* */ member comments that do add information were converted to /** */.

Fixed Issues

$ #99453
PROPOSAL: N/A

Tests

Not testable in the app. The diff contains only comment deletions and // to /** */ conversions above type members. No runtime code, copy, or styles changed.

Offline tests

N/A

QA Steps

N/A

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 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 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)
  • 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)
  • 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 new assets were added or existing ones were modified, I verified that:
    • The assets are optimized and compressed (for SVG files, run npm run compress-svg)
    • The assets load correctly across all supported platforms.
  • 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.
  • 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.

Screenshots/Videos

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

@melvin-bot

melvin-bot Bot commented Sep 8, 2026

Copy link
Copy Markdown

Hey! I see that you made changes to our Form component. Make sure to update the docs in FORMS.md accordingly. Cheers!

@JakubKorytko

JakubKorytko commented Sep 8, 2026 •

Copy link
Copy Markdown
Member Author

@codex review
@MelvinBot review

@chatgpt-codex-connector

Copy link
Copy Markdown

Codex Review: Didn't find any major issues. What shall we delve into next?

Reviewed commit: ce9d62934d

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

@MelvinBot

Copy link
Copy Markdown
Contributor

Review

The mechanical part of this PR is clean: I verified that every added and removed line in the diff is a comment or blank line — no code, no lint/compiler directives, no JSDoc tags. Three things to fix before merge, one of them a real defect.

1. Orphaned // line left above a converted member

src/pages/settings/Security/TwoFactorAuth/ToggleTwoFactorAuthForm.tsx:19

Only the second line of a two-line // comment was converted, so the member now carries half a // comment and half a JSDoc block:

type BaseTwoFactorAuthFormProps = {
    // Set this to true in order to call the validateTwoFactorAuth action which is used when setting up 2FA for the first time.
    /** Set this to false in order to disable 2FA when a valid code is entered */
    validateInsteadOfDisable?: boolean;

This is the one place in the whole diff where a multi-line comment was split (I checked every hunk for the pattern). It also trips CONSISTENCY-10 directly — "a member is documented with a /** ... */ block comment above it (never a // comment)". Fold both sentences into the JSDoc block.

2. Two removals drop facts the rule says to keep

CONSISTENCY-10 keeps a comment that names a boundary condition or ownership/provenance. These two did:

3. Nit — you deleted the correct comment and left the wrong one

src/ONYXKEYS.ts:470 still says /** Is report data loading? */ on IS_LOADING_APP, while the accurate copy of that same comment on IS_LOADING_REPORT_DATA was removed a few lines above. Since you're already editing this block, drop the stale one too.

What I checked and how

Diffed 980efdf..ce9d629 (879 files, +45 / −3687) and ran these over the raw diff:

  • No code changed. Every + and every - line, with leading whitespace stripped, matches //, /*, *, */, or empty. Zero exceptions.
  • No directives removed. Searched removed lines for eslint, ts-expect-error, ts-ignore, prettier-ignore, istanbul, c8/v8 ignore, @deprecated, TODO, FIXME, HACK, NOTE:, @param, @returns, @see, @example, @default — no matches.
  • No units lost. Searched removed lines for cents, unix, epoch, UTC, ISO 8601, bytes, px, pixels, degrees, 0-based/1-based — one hit, in withViewportOffsetTop.tsx, and it was preserved via the reword to /** */.
  • Only one split comment. Scanned every hunk for a removed comment line adjacent to a retained comment line; the 2FA form above is the sole case.
  • Syntax is fine. typecheck, ESLint check, Oxfmt check, Bun tests and all 8 test jobs pass; unbalanced comment delimiters would fail typecheck. The only red check is Check independent approval, which is expected on an unreviewed PR.
  • Spot-read the largest deletions (ConfirmModal.tsx, ConfirmContent.tsx, ButtonWithDropdownMenu/types.ts, Button/index.tsx, PurchaseList.ts, OriginalMessage.ts, Transaction.ts, ReimbursementAccount.ts, ONYXKEYS.ts, CONST/index.ts) plus all 45 additions. Beyond items 2 and 3, the removals are genuine restatements. One removal is a strict improvement: IOUDetails.comment was labelled /** Optional comment */ on a required field.
Two process notes
  • The author checklist has every box ticked, including all-platform testing and "I included screenshots or videos", but the Screenshots sections are empty and the Tests section says the change isn't testable. Given [No QA] and a comment-only diff that's the right call — the ticked boxes just don't match it.
  • 879 files will conflict with a large share of open PRs touching src/. Worth landing quickly once approved rather than letting it sit.

@JakubKorytko

Copy link
Copy Markdown
Member Author

@MelvinBot valid, addressed all 3, re-review please

@MelvinBot

Copy link
Copy Markdown
Contributor

Re-review — all three resolved, LGTM

Re-verified b026fbd4 from scratch against the base. Nothing new.

Finding Fix
Orphaned // above validateInsteadOfDisable ToggleTwoFactorAuthForm.tsx:19-22 — both sentences folded into one JSDoc block ✅
customUnit condition dropped Transaction.ts:96 restored ✅
conciergeChat provenance dropped actions/Report/index.ts:5899 and ReportUtils.ts both restored ✅
Stale /** Is report data loading? */ on IS_LOADING_APP ONYXKEYS.ts:470 — removed ✅

Nice side effect: src/libs/ReportUtils.ts now has a net-zero diff and drops out of the PR entirely (879 → 878 files).

Re-verification

Full sweep re-run on 980efdf..b026fbd4 (878 files, +48 / −3686), not just the delta:

  • Still comment-only. Every + and - line, whitespace-stripped, matches //, /*, *, */, or empty. Zero exceptions.
  • No orphaned comments anywhere. Scanned every hunk for a removed comment line adjacent to a retained one, in both directions — no hits. The 2FA form was the only case and it's gone.
  • No directives or tags removed. Re-searched removed lines for eslint, ts-expect-error, ts-ignore, prettier-ignore, istanbul, v8 ignore, @deprecated, TODO, FIXME, HACK, NOTE:, @param, @returns, @see, @example, @default — none.
  • No units lost. Re-searched for cents, unix, epoch, UTC, ISO 8601, bytes, px/pixels, degrees — the single hit is the withViewportOffsetTop.tsx comment, preserved via the reword.
  • The fix commit touches exactly the 5 files above and changes only comment lines in them.
  • typecheck, ESLint check, Oxfmt check, spellcheck, Storybook tests, Bun tests and all 8 test jobs pass. Only red is Check independent approval, expected until a human approves.

Still worth landing quickly once approved — 878 files will conflict with a lot of what's open against src/.

@JakubKorytko
JakubKorytko marked this pull request as ready for review September 8, 2026 09:30
@JakubKorytko
JakubKorytko requested review from a team as code owners September 8, 2026 09:30
@melvin-bot
melvin-bot Bot requested review from JmillsExpensify and situchan and removed request for a team September 8, 2026 09:30
@melvin-bot

melvin-bot Bot commented Sep 8, 2026

Copy link
Copy Markdown

@situchan 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]

@mountiny
mountiny requested review from roryabraham and removed request for situchan September 8, 2026 09:58
Comment on lines -211 to 184
/**
* The errors of all card feeds.
*/
all: CardFeedErrorState;

/**
* The errors of company cards.
*/
companyCards: CardFeedErrorState;

/**
* The errors of expensify card.
*/
expensifyCard: CardFeedErrorState;

/**
* The errors of personal card.
*/
personalCard: CardFeedErrorState;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

all: CardFeedErrorState lost the only text distinguishing it from its three identically-typed siblings companyCards/expensifyCard/personalCard; the bare name doesn't say what it aggregates.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

"The errors of all card feeds" restates all and the type name CardFeedErrorState. Which subset each sibling aggregates is in its name (companyCards, expensifyCard, personalCard), same as all, so I disagree with this one

Comment on lines -201 to 176
/**
* Whether to show the RBR for each workspace account ID.
*/
shouldShowRbrForWorkspaceAccountID: Record<number, boolean>;

/**
* Whether to show the RBR for each feed name with domain ID.
*/
shouldShowRbrForFeedNameWithDomainID: Record<string, boolean>;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

shouldShowRbrForWorkspaceAccountID, shouldShowRbrForFeedNameWithDomainID lost the comments documenting the Record key.
The latter's key is a composite feed-name+domain-ID string, so a wrong lookup key returns undefined rather than failing to compile.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

the key is in the member name in both cases: ForWorkspaceAccountID and ForFeedNameWithDomainID. The removed comments said the same words as the identifier. Nothing to distinguish or add, so leaving these out

contentContainerStyle: StyleProp<ViewStyle>;

/** Outer container style for the list wrapper. */
containerStyle: StyleProp<ViewStyle>;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

contentContainerStyle and containerStyle are both StyleProp<ViewStyle> and adjacent.
The removed comments were the only thing saying which one is the outer wrapper.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

contentContainerStyle vs containerStyle is standard RN naming (FlatList/ScrollView use the same pair, content is the inner one). The comments restated that convention, but if you find this super hard to read I guess I can bring the comment back, leaving out for now

Comment on lines 58 to 61
/** Fires when the list scrolls near its end (router's fetchMoreResults). */
onEndReached: () => void;

/** Fires on the list's first layout and on layout changes. */
onLayout: () => void;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

onLayout lost its firing condition ("first layout and on layout changes") while the adjacent onEndReached kept its equivalent.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

onLayout firing on first layout and on changes is what every RN onLayout does. The comment restated the platform contract. onEndReached kept its comment because it names the caller (router's fetchMoreResults), which is not derivable

@@ -424,13 +417,11 @@ type TransactionMemberGroupListItemType = TransactionGroupListItemType & {groupe
};

type TransactionMonthGroupListItemType = TransactionGroupListItemType & {groupedBy: typeof CONST.SEARCH.GROUP_BY.MONTH} & SearchMonthGroup & {
/** Final and formatted "month" value used for displaying */
formattedMonth: string;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

formattedMonth/formattedWeek/formattedYear/formattedQuarter lost "Final and formatted … used for displaying" while their shortFormatted* siblings kept "Compact … where space is tight", leaving the pairs asymmetric.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

the shortFormatted* comments survive because they state where the value is used (chart axis labels) and why (space is tight). "Final and formatted month value used for displaying" restates formattedMonth. Symmetry alone is not one of the keep categories, so leaving these out

@@ -1100,13 +1006,11 @@ type OriginalMessageConciergeAutoMatchVendor = {

/** Policy rules modified fields */
type PolicyRulesModifiedFields = {
/** The value that the merchant was changed to */
merchant?: string;

/** The value that the amount was changed to */
category?: string;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

category is not the amount

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

wrong on main too, but yeah, fixed, now handled by the type-level comment

@@ -1100,13 +1006,11 @@ type OriginalMessageConciergeAutoMatchVendor = {

/** Policy rules modified fields */
type PolicyRulesModifiedFields = {
/** The value that the merchant was changed to */
merchant?: string;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

PolicyRulesModifiedFields / PersonalRulesModifiedFields: half-stripped, and the surviving comment is the wrong one. (line 1008-1061)

Every member of both types carried the parallel phrase "The value that X was changed to".
That phrase is the type's entire semantics - these hold the new values a rule wrote, not current values.
The PR deleted it from merchant, tag, billable, tax (and reportName in the personal variant) while keeping it on category, comment, description, reimbursable.
A bare merchant?: string in a type named ...ModifiedFields now reads as "the merchant", which is the opposite of what it is.

Either restore the phrase on all members or delete it from all and document it once on the type.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

agreed the half-stripped state was bad. Went with your second option: dropped the phrase from every member (including the wrong category one and reimbursable) and documented it once on both types: "Each member holds the new value the rule wrote, not the current one". Kept comment/description since they carry the backend key mapping

Comment thread src/types/onyx/Policy.ts
@@ -3245,7 +3113,6 @@ type Policy = OnyxCommon.OnyxValueWithOfflineFeedback<
/** Max amount for an expense with no itemized receipt violation */
maxExpenseAmountNoItemizedReceipt?: number;

/** Whether GL codes are enabled */
glCodes?: boolean;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

glCodes?: boolean lost the only thing making it a flag.
The name is a bare plural noun and the type is boolean - nothing left says this is an enable switch rather than a collection.

It's also one of three GL-code booleans in the same Policy type (showTagGLCodes :2937, showCategoryGLCodes : 2945), both also stripped.
Those two are self-explanatory from their verb prefixes.

glCodes is the master flag and is not. This is the rule's own "distinction from a sibling" keep category.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

I'm not sure I follow, glCodes?: boolean cannot be a collection, the type already says flag? "Whether GL codes are enabled" restates name plus type, which is exactly what this PR removes. Leaving it out.

@situchan situchan Sep 8, 2026 •

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

I meant that glCodes?: boolean itself doesn't self-explain "Whether GL codes are enabled or not (like shouldEnableGLCodes or enableGLCodes does).
I am fine leaving it out though.

Comment on lines 5900 to 5903
conciergeChat: OnyxEntry<Report>;
/** The admins chat report, looked up by ONYXKEYS.ONBOARDING_ADMINS_CHAT_REPORT_ID. */
adminsChatReport?: OnyxEntry<Report>;
/** The self-DM report, looked up by ONYXKEYS.SELF_DM_REPORT_ID. */
selfDMReport?: OnyxEntry<Report>;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

selfDMReport dropped its Onyx-key pointer while both siblings (conciergeChat, adminsChatReport) kept theirs.
Three parallel params, one loses the "which Onyx key feeds this" pointer. That's ownership - an explicit keep category - and callers of this action genuinely need it to know what to pass.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

yup, restored, the Onyx lookup pointer is useful for callers and matches the two siblings

Comment on lines -43 to 44
/* The policy that the card will be issued under */
/** The policy that the card will be issued under */
policyID: string;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

This should be policy ID, not policy

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

yeah, same on main but fixed

@situchan

situchan commented Sep 8, 2026 •

Copy link
Copy Markdown
Contributor

Reviewer Checklist

  • I have verified the author checklist is complete (all boxes are checked off).
  • I verified the correct issue is linked in the ### Fixed Issues section above
  • I verified testing steps are clear and they cover the changes made in this PR
    • I verified the steps for local testing are in the Tests section
    • I verified the steps for Staging and/or Production testing are in the QA steps section
    • I verified the steps cover any possible 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 checked that screenshots or videos are included for tests on all platforms
  • I included screenshots or videos for tests on all platforms
  • I verified that the composer does not automatically focus or open the keyboard on mobile unless explicitly intended. This includes checking that returning the app from the background does not unexpectedly open the keyboard.
  • I verified tests pass on all platforms & I tested again on:
    • Android: HybridApp
    • Android: mWeb Chrome
    • iOS: HybridApp
    • iOS: mWeb Safari
    • MacOS: Chrome / Safari
  • If there are any errors in the console that are unrelated to this PR, I either fixed them (preferred) or linked to where I reported them in Slack
  • I verified proper code patterns were followed (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 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)
  • If a new code pattern is added I verified it was agreed to be used by multiple Expensify engineers
  • I verified that this PR follows the guidelines as stated in the Review Guidelines
  • I verified other components that can be impacted by these changes have been tested, and I retested again (i.e. if the PR modifies a shared library or component like Avatar, I verified the components using Avatar have been tested & I retested again)
  • If a new component is created I verified that:
    • A similar component doesn't exist in the codebase
    • All props are defined accurately and each prop has a /** comment above it */
    • The file is named correctly
    • The component has a clear name that is non-ambiguous and the purpose of the component can be inferred from the name alone
    • The only data being stored in the state is data necessary for rendering and nothing else
    • 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)
    • Any 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)
    • All JSX used for rendering exists in the render method
    • The 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
  • 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.
  • For any bug fix or new feature in this PR, I verified that sufficient unit tests are included to prevent regressions in this 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 have checked off every checkbox in the PR reviewer checklist, including those that don't apply to this PR.

Screenshots/Videos

Android: HybridApp
Android: mWeb Chrome
iOS: HybridApp
ios.mov
iOS: mWeb Safari
msafari.mov
MacOS: Chrome / Safari
web.mov

@JakubKorytko

Copy link
Copy Markdown
Member Author

The PR describes itself as prop

updated PR desc

roryabraham
roryabraham previously approved these changes Sep 8, 2026

@roryabraham roryabraham left a comment •

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Wasn't expecting this PR, can't reasonably review the whole thing line-by-line. So I scrolled through and checked for any non-comment changes, didn't see any. Did not read every removed comment.

NAB: remove empty lines between props/types that have no comments to make the code a bit more compact and reduce the total number of lines in the affected files.

@JakubKorytko

Copy link
Copy Markdown
Member Author

Wasn't expecting this PR

ah, it was mentioned in the previous PR description, sorry for not giving a heads up though

NAB: remove empty lines between props/types that have no comments

✅

@roryabraham

Copy link
Copy Markdown
Contributor

Reviewer Checklist

  • I have verified the author checklist is complete (all boxes are checked off).
  • I verified the correct issue is linked in the ### Fixed Issues section above
  • I verified testing steps are clear and they cover the changes made in this PR
    • I verified the steps for local testing are in the Tests section
    • I verified the steps for Staging and/or Production testing are in the QA steps section
    • I verified the steps cover any possible 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 checked that screenshots or videos are included for tests on all platforms
  • I included screenshots or videos for tests on all platforms
  • I verified that the composer does not automatically focus or open the keyboard on mobile unless explicitly intended. This includes checking that returning the app from the background does not unexpectedly open the keyboard.
  • I verified tests pass on all platforms & I tested again on:
    • Android: HybridApp
    • Android: mWeb Chrome
    • iOS: HybridApp
    • iOS: mWeb Safari
    • MacOS: Chrome / Safari
  • If there are any errors in the console that are unrelated to this PR, I either fixed them (preferred) or linked to where I reported them in Slack
  • I verified proper code patterns were followed (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 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)
  • If a new code pattern is added I verified it was agreed to be used by multiple Expensify engineers
  • I verified that this PR follows the guidelines as stated in the Review Guidelines
  • I verified other components that can be impacted by these changes have been tested, and I retested again (i.e. if the PR modifies a shared library or component like Avatar, I verified the components using Avatar have been tested & I retested again)
  • If a new component is created I verified that:
    • A similar component doesn't exist in the codebase
    • All props are defined accurately and each prop has a /** comment above it */
    • The file is named correctly
    • The component has a clear name that is non-ambiguous and the purpose of the component can be inferred from the name alone
    • The only data being stored in the state is data necessary for rendering and nothing else
    • 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)
    • Any 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)
    • All JSX used for rendering exists in the render method
    • The 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
  • 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.
  • For any bug fix or new feature in this PR, I verified that sufficient unit tests are included to prevent regressions in this 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 have checked off every checkbox in the PR reviewer checklist, including those that don't apply to this PR.

Screenshots/Videos

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

@roryabraham

Copy link
Copy Markdown
Contributor

"Validate Mobile-Expensify submodule" failure is unrelated. Ignoring and merging to avoid further conflicts

@roryabraham
roryabraham merged commit a9e376b into Expensify:main Sep 8, 2026
33 of 37 checks passed
@github-actions

github-actions Bot commented Sep 8, 2026

Copy link
Copy Markdown
Contributor

🚧 roryabraham has triggered a test Expensify/App build. You can view the workflow run here.

@melvin-bot melvin-bot Bot added the Emergency label Sep 8, 2026
@melvin-bot

melvin-bot Bot commented Sep 8, 2026

Copy link
Copy Markdown

@roryabraham looks like this was merged without a test passing. These checks had not passed on bbf8f72 when it was merged:

Please add a note explaining why this was done and remove the Emergency label if this is not an emergency.

@OSBotify

OSBotify commented Sep 8, 2026

Copy link
Copy Markdown
Contributor

✋ This PR was not deployed to staging yet because QA is ongoing. It will be automatically deployed to staging after the next production release.

@OSBotify

OSBotify commented Sep 9, 2026

Copy link
Copy Markdown
Contributor

🚀 Deployed to staging by https://github.com/roryabraham in version: 9.4.75-0 🚀

platform result
🕸 web 🕸 success ✅
🤖 android 🤖 success ✅
🍎 iOS 🍎 success ✅

@MelvinBot

MelvinBot commented Sep 9, 2026 •

Copy link
Copy Markdown
Contributor

🤖 No help site changes are required. I did not create a docs PR.

Why: I pulled all 877 changed files and scanned every patch hunk. Every added or removed line is a code comment (//, /* */, /** */). The only non-comment change is the Mobile-Expensify submodule pointer bump, which is a merge-of-main artifact.

Verification details

Scanned each file's patch from repos/Expensify/App/pulls/100576/files, filtered to added/removed lines, then excluded comment-only and blank lines. The complete remainder was:

-Subproject commit 719d7a02c929db5175599cfa3cb5edc2cd4d4a71
+Subproject commit 57708e6b576bfb38ca22dc596f0c4b47a22d6319

All 877 files returned a patch, so nothing was skipped for size.

Specific checks against things the help site does track:

  • src/languages/*.ts — 0 files touched. No user-facing copy, labels, or button text changed.
  • docs/ — 0 files touched.
  • src/ONYXKEYS.ts and src/CONST/index.ts — changed, but deletions only, and only of member comments. No key names, values, or enum members changed.
  • Component props — comments removed above props; no prop was added, renamed, or removed.

The help site under App/docs/articles documents user-facing behavior: features, settings, tab names, and button labels. This PR changes none of those. Code comments are never rendered to users.

Because no docs PR was needed, I also skipped the UI label verification pass — there is no new help site copy to check feature names, tab names, or button capitalization against.

If this PR is later found to have changed behavior, re-run me and I'll draft the docs update.

@JakubKorytko, no help site PR was created, so there is nothing to review or mark Ready for review. If you disagree and want a docs update anyway, reply with @MelvinBot and point me at the specific article or behavior you have in mind.


view run · view recording

@OSBotify

Copy link
Copy Markdown
Contributor

🚀 Deployed to production by https://github.com/mountiny in version: 9.4.75-3 🚀

platform result
🕸 web 🕸 success ✅
🤖 android 🤖 failure ❌
🍎 iOS 🍎 success ✅

Bundle Size Analysis (Sentry):

@OSBotify

Copy link
Copy Markdown
Contributor

🚀 Deployed to production by https://github.com/mountiny in version: 9.4.75-3 🚀

platform result
🕸 web 🕸 success ✅
🤖 android 🤖 failure ❌
🍎 iOS 🍎 success ✅

Bundle Size Analysis (Sentry):

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