text:
Starting a chat with a new user show as a group chat in the header

If you haven’t already, check out our contributing guidelines for onboarding and email contributors@expensify.com to request to join our Slack channel!

Version Number: 1.4.56-2
Reproducible in staging?: y
Reproducible in production?: y
If this was caught during regression testing, add the test name, ID and link from TestRail:
Email or phone of affected tester (no customers):
Logs: https://stackoverflow.com/c/expensify/questions/4856
Expensify/Expensify Issue URL:
Issue reported by: @youssef-lr
Slack conversation: https://expensify.slack.com/archives/C049HHMV9SM/p1711087497811689
Action Performed:
Start a chat with a new user
Send a message
Expected result:
The chat header should display a single user
Actual result:
The chat header displays the header of a group chat, containing both participants emails
Workaround:
unknown
Platforms:

Which of our officially supported platforms is this issue occurring on?

[ ] Android: Native
[ ] Android: mWeb Chrome
[ ] iOS: Native
[ ] iOS: mWeb Safari
[x] MacOS: Chrome / Safari
[ ] MacOS: Desktop

Screenshots/Videos
Add any screenshot/video evidence
https://github.com/Expensify/App/assets/38435837/a6770edf-2660-4de3-ae59-0cd1838f2278
https://github.com/Expensify/App/assets/38435837/13a23730-2979-415d-9bb6-8346c77ecfb9

View all open jobs on GitHub

I think this is an artifact of the on-going group chat migration and implementation. @marcaaron Does that sound right?

Feel free to close if we already have an existing issue, or this will be resolved following implementation.

Yep, working on this here

authors: JmillsExpensify m-natarajan marcaaron


text:
[$500] Android - BA - After tapping disconnect BA, in wallet section BA is not removed

If you haven’t already, check out our contributing guidelines for onboarding and email contributors@expensify.com to request to join our Slack channel!

Version Number: 1.4.58-4
Reproducible in staging?: Y
Reproducible in production?: Y
If this was caught during regression testing, add the test name, ID and link from TestRail: https://expensify.testrail.io/index.php?/tests/view/4466759
Issue reported by: Applause - Internal Team
Action Performed:

Login app
Add a bank account using chase ending 1111
Tap disconnect Bank account and delete bank account
Navigate to settings---- wallet
Note Bank account is shown and not deleted
Again navigate to connect BA page
Tap connect manually
Enter route number and account number
Tap next and then tap confirm

Expected Result:
After tapping disconnect BA, in wallet section BA must not be shown. The deleted bank account must not be shown when tap confirm (after entering details in connect manually page.)
Actual Result:
After tapping disconnect BA, in wallet section BA is not removed .The deleted bank account is shown when tap confirm (after entering details in connect manually page.)
Workaround:
Unknown
Platforms:

Which of our officially supported platforms is this issue occurring on?

[x] Android: Native
[ ] Android: mWeb Chrome
[ ] iOS: Native
[ ] iOS: mWeb Safari
[ ] MacOS: Chrome / Safari
[ ] MacOS: Desktop

Screenshots/Videos
Add any screenshot/video evidence

https://github.com/Expensify/App/assets/78819774/273d0a7f-e6fd-49bc-add5-bd445ba17023
View all open jobs on GitHub
Upwork Automation - Do Not Edit

Upwork Job URL: https://www.upwork.com/jobs/~01801c400ba36cbd72
Upwork Job ID: 1774830276732727296
Last Price Increase: 2024-04-08

@puneetlath  FYI I haven't added the External label as I wasn't 100% sure about this issue. Please take a look and add the label if you agree it's a bug and can be handled by external contributors

@GandalfGwaihir I still can't connect the bank account. Could you connect the bank account successfully? If yes, could you share a video?

Proposal
Please re-state the problem that we are trying to solve in this issue.
After tapping disconnect BA, in wallet section BA is not removed .The deleted bank account is shown when tap confirm (after entering details in connect manually page.)
What is the root cause of that problem?
https://github.com/Expensify/App/blob/2ce785c7c0831c9a6857f4a197cada6da28736e3/src/pages/workspace/WorkspaceResetBankAccountModal.tsx#L52
When clicking on "Disconnect bank account" we only reset achData from ONYX and we don't remove bankAccountID from bankAccountList. In the Wallet Page we are using bankAccountList to display bank account
What changes do you think we should make in order to solve the problem?
In here
https://github.com/Expensify/App/blob/2ce785c7c0831c9a6857f4a197cada6da28736e3/src/pages/workspace/WorkspaceResetBankAccountModal.tsx#L52
Besides, removing achData from ONYX, we also should update bankAccountList like this
onConfirm={() => {
                BankAccounts.resetFreePlanBankAccount(bankAccountID, session, achData?.policyID ?? '', user)
                if (bankAccountID) {
                    BankAccounts.deletePaymentBankAccount(bankAccountID)
                }
}}

What alternative solutions did you explore? (Optional)
NA

@DylanDylann Please follow these step to add bank account. Make sure that you use the correct data is provided in this thread

@nkdengineer's proposal is clearer and easier to understand with the correct reference. But your idea is the same as @GandalfGwaihir's proposal. Thus, I suggest we should go with @GandalfGwaihir's proposal because his proposal is the first one
🎀 👀 🎀 C+ reviewed

Waiting for a review from @puneetlath

Wait, I realize I approved this proposal, but now that I'm reviewing the PR, I don't think this is actually a bug. Disconnecting a bank account from the workspace doesn't mean it should be removed from your wallet. It just means it should no longer be tied to that workspace. I'm going to close this out, but will still pay out since I approved the proposal and the work was done.
@GandalfGwaihir can you close your PR?

Paid, thanks for the bump.

source: gharchive/issue

authors: DylanDylann lanitochka17 nkdengineer puneetlath

repo: Expensify/App

license: MIT

license_type: permissive

license_source: github-api


text:
[$250] Editing comment with image attachment fails to load the image when cache expires

If you haven’t already, check out our contributing guidelines for onboarding and email contributors@expensify.com to request to join our Slack channel!

Version Number:
Reproducible in staging?:
Reproducible in production?:
If this was caught during regression testing, add the test name, ID and link from TestRail:
Email or phone of affected tester (no customers):
Logs: https://stackoverflow.com/c/expensify/questions/4856
Expensify/Expensify Issue URL:
Issue reported by: @kidroca
Slack conversation: https://expensify.slack.com/archives/C01GTK53T8Q/p1715767781452439
Action Performed:

Type text and add an image attachment.
After sending the comment, inspect the  tag for data-expensify attributes.
Edit the comment and make a trivial change to the text before the attachment.
Observe that the  tag no longer has data-expensify attributes.
Disable cache in dev tools, or clear cache and reload the page.
Observe that the edited comment no longer loads the image.
LINK: https://staging.new.expensify.com/r/5708510475809890

Expected Result:
Editing a comment, clearing cache, and reloading the page should display the comment and the image attachment.
Actual Result:
Clearing cache and reloading shows the comment and a placeholder box instead of the image attachment.
More details here: https://github.com/Expensify/App/issues/41952#issuecomment-2112095398
Workaround:
unknown
Platforms:

Which of our officially supported platforms is this issue occurring on?

[ ] Android: Native
[ ] Android: mWeb Chrome
[ ] iOS: Native
[ ] iOS: mWeb Safari
[x] MacOS: Chrome / Safari
[ ] MacOS: Desktop

Screenshots/Videos
Add any screenshot/video evidence
https://github.com/Expensify/App/assets/38435837/d87424e2-9423-421c-8712-a71e4437c250

View all open jobs on GitHub
Upwork Automation - Do Not Edit

Upwork Job URL: https://www.upwork.com/jobs/~018082d3734c0fe3cf
Upwork Job ID: 1792320613124546560
Last Price Increase: 2024-06-10

Issue OwnerCurrent Issue Owner: @

@mallen tagging you as per this comment

@m-natarajan you've tagged the wrong person. cc @mallenexpensify

Labeled internally and added to #vip-vsb cuz it doesn't have to do with money. All yours JLi

Not overdue, waiting on an Engineer to pick this up.

Not overdue

internal. not overdue

🎀 👀 🎀 assign internal

Sorry, I don't have bandwidth to take this, unassigning!

🎀 👀 🎀 assign internal

I am going to make this external and look for proposals, not sure if this really cannot be solved externally

Proposal
Please re-state the problem that we are trying to solve in this issue.
Clearing cache and reloading shows the comment and a placeholder box instead of the image attachment.
More details here: #41952 (comment)
What is the root cause of that problem?
When we edit the comment with image attachment, the data-expensify- attributes were stripped. The data-expensify-source is one of them, so after reloading the authentication header from data-expensify-source no longer applies, therefore the image fails to load.
What changes do you think we should make in order to solve the problem?

Store the data-expensify- attributes in an object like a cache (or even in Onyx), then after editing, apply the attributes again to the image html data. This way we'll still preserve the important metadata of data-expensify- in the image tags.
What alternative solutions did you explore? (Optional)
Prevent the user from editing text with attachment.

@rushatgabhane what do you think of the proposal?

When we edit the comment with image attachment, the data-expensify- attributes were stripped.

@truph01 your suggestion is to store the attributes and apply them again before saving the comment.
But why does editing a comment strip the expensify attributes in the first place? Can we make it so that they don't get removed? Then we won't have this problem

@rushatgabhane This is what the markdown for "text with image" looks like
an image

![Image name](https://www.expensify.com/chat-attachments/3998734689149153575/w_b90982bdb232e02e7629cb364264ac230a2f012a.jpg.1024.jpg)

As you can see, the markdown for image only contains the URL of the image and the image name (if any).
So editing the comment will strip the Expensify attributes because the Expensify attributes are not parts of the markdown syntax for images.

Can we make it so that they don't get removed?

This will mean we need to use another markdown syntax for images that contain the attributes
Like
![Image name data-expensify-source="https://www.expensify.com/chat-attachments/3998734689149153575/w_b90982bdb232e02e7629cb364264ac230a2f012a.jpg.1024.jpg" data-expensify-height="100" data-expensify-width="100"](https://www.expensify.com/chat-attachments/3998734689149153575/w_b90982bdb232e02e7629cb364264ac230a2f012a.jpg.1024.jpg)

Or another idea is to make the attributes the params of the image URL, like ?data-expensify-source=...&data-expensify-height=100
Either way, IMHO that will make the image markdown very lengthy and hard to edit to the user, and might not conform to any markdown standard

These attributes are added by the backend when an attachment is uploaded; they are not part of the original syntax. When the backend processes the attachment, it adds the necessary attributes.
I believe the fix should be on the backend. When editing a comment containing an attachment, the backend should apply the same logic and replace/insert the <img> HTML.
There's a related ticket addressing a similar problem with <video> attachments. @rushatgabhane, perhaps you can cross-reference how the team handled that issue and see if the same solution can be applied here.

https://github.com/Expensify/App/issues/41952

Working on the backend solution

@rushatgabhane I am not sure if I am doing something wrong but I cannot reproduce this

Same! I cannot reproduce this bug
https://github.com/Expensify/App/assets/29673073/c65f05c3-2b58-447b-ad31-97c62b6d34c5

@mountiny i can consistently reproduce this bug on staging, but not on production.
Staging - Reproducible
https://github.com/Expensify/App/assets/29673073/4f70fb63-b8f9-45f9-9df2-b2726f9edc11
Production - Not Reproducible
https://github.com/Expensify/App/assets/29673073/b08a2d43-b22c-4865-839d-0517f1984ebf

I can still recreate this bug on prod
Here's a short debug session where we can see the <img> in the updated comment lacks the data-expensify attribute. This is the reason we're getting the 302 redirects to an error page on old dot, because the request is meant to be made with an auth header, but isn't
https://github.com/Expensify/App/assets/12156624/d0b8271e-719e-440e-b31a-0c1d27b463ce

@kidroca that makes sense, after the auth for oldDot has expired the image won't load anymore.

@mountiny this is an internal bug

To reproduce this wait for auth token to expire on oldDot

I don't think auth token matters - it's not begin sent regardless of whether it's expired or not
The network requests are redirected to Old Dot, because of some internal server error handling
But the main issue is, the <img> html is getting re-written and some attributes are stripped upon editing the comment

Thanks, I will have to investigate more

No update right now, this is lower priority than other tasks

Issue not reproducible during KI retests. (First week)

lets keep this open until another retest but seems like this might have gotten fixed elsewhere

I was able to reproduce on the latest staging build, Desktop, Version 9.0.25-10

User A types message in DM with user B > adds image > clicks Send
User A edits text in message
User B views message, observes image doesn't show.

I am not able to prioritize this at the beginning of this week unfortunately.

Adding hot picks for this one as I am focusing on a fire fix in the foreseeable future and not able to prioritise this one right now

same

focusing on workspace feeds wave-collect

Not overdue

I was talking with @mjasikowski that he might be able to take this on later in the week

Not overdue

@mjasikowski will help out here 💪

Assigned!

FInally have time to dig into this.

was able to repro still
https://github.com/user-attachments/assets/79bfbfcc-7303-480b-836d-f09effc54ccb

Current findings:

Web-Expensify does strip extra attributes form img tags via sanitizeAndValidateComment
Unfortunately, Expensify-Common does this as well in ExpensiMark.ts, making the tags stripped before we even get to the UpdateComment API call

There's a draft expensify-common PR now adding attribute caching support to ExpensiMark.ts, I'll try to do a full test  tomorrow.

It turns out that only expensify-common fix is enough, and that's ready in https://github.com/Expensify/expensify-common/pull/808

PR still under review

https://github.com/Expensify/Web-Expensify/pull/43698 was needed after all, submitted that too

Hi @mjasikowski - just a heads up to let you know I'll be OOO from the 3rd to 14th.
I'll prep a Payment Summary, I think this is all that's needed from me:

C+: @rushatgabhane $250 (New.Dot payment)

@m-natarajan the fix is now on both staging and production, can you re-test?

I just did a quick-test in the latest staging build on Desktop and, after editing a comment, the image still shows!  Think we need to to still leave this open for a retest?

Payment Summary

C+: @rushatgabhane $3250 (owed via ND payments)

Ha, yeah I fat fingered that one - thanks @rushatgabhane!

$250 approved for @rushatgabhane

@truph01 can you provide more details plz? Ideally a bullet point list with links and time stamps?  It'll make it easier to review for potential compensation.  Thx

@mallenexpensify Sure, here's the timeline:

The issue was made external on June 10
I posted my proposal right after that on June 10, which has the Solution 2 of

Store the data-expensify- attributes in an object like a cache, with the image source as key, then after editing, apply the attributes again to the image html data. This way we'll still preserve the important metadata of data-expensify- in the image tags.

And some draft implementation details

On June 14, There was a suggestion to fix in back-end by @kidroca

@mountiny seems to agree with it and the issue is considered to be Internal and back-end fix was attempted from this point.

On Sep 23, @mountiny assigned @mjasikowski to work on the issue

On Sep 26, the PR was raised by @mjasikowski, which uses same approach as my proposal. No back-end fix is done.

This PR adds caching for additional attributes to the  tags when converted to and back from Markdown.

As such, I think a compensation of 50% to me makes sense, because the issue was made Internal for attempted back-end fix but actually there's no back-end fix done and the solution that ends up being used is same as suggested in my proposal.

No back-end fix is done.

backend fix was done, you just do not have access to it https://github.com/Expensify/Web-Expensify/pull/43729

@mountiny Was it needed to fix this issue? As from my testing with my initial proposal, only the front-end fix is enough.

It was required as we were stripping the necessary tags in PHP layer too so not only the FE changes would be sufficient for all cases. @mjasikowski will be able to provide better explanation

The tags were being stripped in the PHP layer. Caching attributes was already implemented in App for videos and that needed to be adjusted to apply images as well, but the was only a small portion of the changes needed.

Thanks for your input, I've updated the timeline summary highlighting there's a back-end fix.
Looking forward to the final decision from @mountiny @mallenexpensify
Thanks in advance!

Sorry @truph01, I don't think we are going to issue a reward for this one as there were many pieces required to fix this, and it was handled by @mjasikowski regardless of your proposal.
We appreciate your contributions and hope you will continue fixing issues in our repo ahead.

authors: amyevans garrettmknight jliexpensify kidroca m-natarajan mallenexpensify mjasikowski mountiny mvtglobally rushatgabhane truph01


text:
Cleanup: move ComposerRef to the ComposerWithSuggestion where its implemented

There is the ComposerRef type which is being used in ReportActionCompose. The ref however is implemented inComposerWithSuggestion and it would be more natural to have that close together, and then let ReportActionCompose import it.
Ref: https://github.com/Expensify/App/pull/46091#discussion_r1696891379

@hannojg are you planning on tackling this?

As I am going OOO tomorrow @kirillzyusko can you do this little cleanup please!

Sure, feel free to assign me on this ticket!

I think it can be closed because PR got merged 👀

Payment summary:

$250 - C+ - @Ollyws - to be paid via NewDot

$250 approved for @Ollyws

authors: garrettmknight hannojg kirillzyusko puneetlath


text:
Deploy Checklist: New Expensify 2021-09-01

Release Version: 1.0.90-3
Compare Changes: https://github.com/Expensify/App/compare/production...staging
This release contains changes from the following pull requests:

[ ] https://github.com/Expensify/App/pull/4803
[ ] https://github.com/Expensify/App/pull/4918
[ ] https://github.com/Expensify/App/pull/4919
[x] https://github.com/Expensify/App/pull/4925
[ ] https://github.com/Expensify/App/pull/4954
[x] https://github.com/Expensify/App/pull/4957
[ ] https://github.com/Expensify/App/pull/4960
[x] https://github.com/Expensify/App/pull/4961
[x] https://github.com/Expensify/App/pull/4967

cc @Expensify/applauseleads

@roryabraham Are we good to start QA here? Or will you add the lock label and let us know when it's ready?

@isagoico Feel free to begin QA when ready! All the deploy systems are fixed and we should be back to normal operation now. The only thing that's changed long-term is that a mobile-deployer will close the checklist to trigger the prod deploy

Starting QA!

authors: OSBotify isagoico roryabraham


text:
[Workspace feeds] We're erroneously showing an export row when "vendor bill" is selected as the export option for QBO

If you haven’t already, check out our contributing guidelines for onboarding and email contributors@expensify.com to request to join our Slack channel!

Version Number:
Reproducible in staging?: Needs Reproduction
Reproducible in production?: Needs reproduction
If this was caught on HybridApp, is this reproducible on New Expensify Standalone?:
If this was caught during regression testing, add the test name, ID and link from TestRail:
Email or phone of affected tester (no customers):
Logs: https://stackoverflow.com/c/expensify/questions/4856
Expensify/Expensify Issue URL:
Issue reported by: @joekaufmanexpensify
Slack conversation (hyperlinked to channel name): #quality
Action Performed:
Prerequisite:
Members and company cards added in workspace

Go to staging.new.expensify.com
Choose the workspace from settings
Click company cards >Card Details

Expected Result:
No export row if Vendor bill is selected as the export option for QBO
Actual Result:
Export row displayed for QBO option and clicking it results in No accounts found page
Workaround:
Unknown
Platforms:

Which of our officially supported platforms is this issue occurring on?

[ ] Android: Standalone
[ ] Android: HybridApp
[ ] Android: mWeb Chrome
[ ] iOS: Standalone
[ ] iOS: HybridApp
[ ] iOS: mWeb Safari
[X] MacOS: Chrome / Safari
[ ] MacOS: Desktop

Screenshots/Videos

Add any screenshot/video evidence
![image - 2024-10-31T153441 380](https://github.com/user-attachments/assets/a407c5d8-7545-4750-a3ac-653ad0824864)

View all open jobs on GitHub

BZ team member, Callstack will work on this issue, please wait for them to comment before moving the issue forward.

This has been labelled "Needs Reproduction". Follow the steps here: https://stackoverflowteams.com/c/expensify/questions/16989

Hi, I'm Nicolay from Callstack - expert contributor group - and I would like to work on this issue.

BugZero Checklist:

[x] [Contributor] Classify the bug:

Bug classification

Source of bug:

[ ] 1a. Result of the original design (eg. a case wasn't considered)
[x] 1b. Mistake during implementation
[ ] 1c. Backend bug
[ ] 1z. Other:

Where bug was reported:

[ ] 2a. Reported on production
[x] 2b. Reported on staging (deploy blocker)
[ ] 2c. Reported on a PR
[ ] 2z. Other:

Who reported the bug:

[ ] 3a. Expensify user
[x] 3b. Expensify employee
[ ] 3c. Contributor
[ ] 3d. QA
[ ] 3z. Other:

[ ] [Contributor] The offending PR has been commented on, pointing out the bug it caused and why, so the author and reviewers can learn from the mistake.
Link to comment: I think we don't need to comment on the previous PR because @narefyev91 also be author of this feature

[ ] [Contributor] If the regression was CRITICAL (e.g. interrupts a core flow) A discussion in #expensify-open-source has been started about whether any other steps should be taken (e.g. updating the PR review checklist) in order to catch this type of bug sooner.
Link to discussion:

[x] [Contributor] If it was decided to create a regression test for the bug, please propose the regression test steps using the template below to ensure the same bug will not reach production again.

Regression Test Proposal Template

[ ] [BugZero Assignee] Create a GH issue for creating/updating the regression test once above steps have been agreed upon.
Link to issue:

Regression Test Proposal
Prerequisite
Members and company cards added in workspace
Test:

Choose the workspace from settings
Click company cards >Card Details
Verify that default export account is presented in Export row
Go to Accounting > Export > Export company card expenses as > Export as. And update to Vendor Bill
Back to company cards >Card Details
Verify that export menu item row is not presented

Do we agree 👍 or 👎

@sakluger Could you help to assign me to this issue? Because I already reviewed the PR
Small note: PR was deployed to prod on 11/13

We will handle the regression testing with Joe as part of the project and payments will be all done together for the project so I think we can close this now

authors: DylanDylann MelvinBot m-natarajan mountiny narefyev91


text:
Workspace - Reimburse expenses- "Fast reimbursements = happy members!" and  "Unlock Next day"  headings are switching after every refresh

If you haven’t already, check out our contributing guidelines for onboarding and email contributors@expensify.com to request to join our Slack channel!

Action Performed:
Precondition: Add VBA flow

Go to https://staging.enew.xpensify.com/
Make sure you added VBA
Go to Settings - Reimburse expenses
Refresh the page

Expected Result:
Either Fast reimbursements = happy members!  or Unlock Next day should keep appearing after refresh the page
Actual Result:
Fast reimbursements = happy members! have been switched with Unlock Next day after refresh the page
Workaround:
Unknown
Platform:

Where is this issue occurring?

Web

Version Number: 1.1.62.0
Reproducible in staging?:  y
Reproducible in production?: y
Email or phone of affected tester (no customers):
Logs: https://stackoverflow.com/c/expensify/questions/4856
Notes/Photos/Videos:
https://user-images.githubusercontent.com/43996225/168916137-20c14424-0797-435b-917a-8aa64f7400c2.mp4
Expensify/Expensify Issue URL:
Issue reported by: Applause
Slack conversation:
View all open jobs on GitHub

Would like to hang onto this and fix internally

PR: https://github.com/Expensify/App/pull/9138 (Not sure why it didn't link itself?)

authors: amyevans kavimuru


text:
[Fix] unread indicator count is not reset after logout

Details

Fixed Issues

$ #11671
$ https://github.com/Expensify/App/issues/11671#issuecomment-1305630104
Tests / Offline tests / QA Steps

Open the app on web.
Login with any account that has some unread messages.
Now wait a couple seconds.
Observe there are unread message count on the Tab.
Skip . (Go Offline in this step for Online test)
Do not go to the chat that has unread messages.
Now Sign out.
Wait a couple seconds.
Title updated and unread count reseted .

Offline Test : Test with step 5

[x] Verify that no errors appear in the JS console

PR Author Checklist

[x] I linked the correct issue in the ### Fixed Issues section above
[x] I wrote clear testing steps that cover the changes made in this PR

[x] I added steps for local testing in the Tests section
[x] I added steps for the expected offline behavior in the Offline steps section
[x] I added steps for Staging and/or Production testing in the QA steps section
[x] I added steps to cover failure scenarios (i.e. verify an input displays the correct error message if the entered data is not correct)
[x] 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)
[x] 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).

[x] I included screenshots or videos for tests on all platforms
[x] I ran the tests on all platforms & verified they passed on:

[x] iOS / native
[x] Android / native
[x] iOS / Safari
[x] Android / Chrome
[x] MacOS / Chrome
[x] MacOS / Desktop

[x] 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)
[x] I followed proper code patterns (see Reviewing the code)

[x] 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)
[x] I verified that comments were added to code that is not self explanatory
[x] 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.
[x] I verified any copy / text shown in the product was added in all src/languages/* files
[x] I verified any copy / text that was added to the app is correct English and approved by marketing by adding the Waiting for Copy label for a copy review on the original GH to get the correct copy.
[x] 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.
[x] I verified the JSDocs style guidelines (in STYLE.md) were followed

[x] If a new code pattern is added I verified it was agreed to be used by multiple Expensify engineers
[x] I followed the guidelines as stated in the Review Guidelines
[x] 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)
[x] I verified all code is DRY (the PR doesn't include any logic written more than once, with the exception of tests)
[x] I verified any variables that can be defined as constants (ie. in CONST.js or at the top of the file that uses the constant) are defined as such
[x] I verified that if a function's arguments changed that all usages have also been updated correctly
[x] If a new component is created I verified that:

[x] A similar component doesn't exist in the codebase
[x] All props are defined accurately and each prop has a /** comment above it */
[x] The file is named correctly
[x] The component has a clear name that is non-ambiguous and the purpose of the component can be inferred from the name alone
[x] The only data being stored in the state is data necessary for rendering and nothing else
[x] 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)
[x] 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)
[x] All JSX used for rendering exists in the render method
[x] 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

[x] If a new CSS style is added I verified that:

[x] A similar style doesn't already exist
[x] The style can't be created with an existing StyleUtils function (i.e. StyleUtils.getBackgroundAndBorderStyle(themeColors.componentBG)

[x] 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)
[x] 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.
[x] I have checked off every checkbox in the PR author checklist, including those that don't apply to this PR.

PR Reviewer Checklist
The reviewer will copy/paste it into a new comment and complete it after the author checklist is completed

[ ] 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 expected offline behavior are in the Offline steps 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 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 checked that screenshots or videos are included for tests on all platforms
[ ] I included screenshots or videos for tests on all platforms
[ ] I verified tests pass on all platforms & I tested again on:

[ ] iOS / native
[ ] Android / native
[ ] iOS / Safari
[ ] Android / Chrome
[ ] MacOS / Chrome
[ ] MacOS / Desktop

[ ] 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 shown in the product was added in all src/languages/* files
[ ] I verified any copy / text that was added to the app is correct English and approved by marketing by adding the Waiting for Copy label for a copy review on the original GH to get the correct copy.
[ ] 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 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)
[ ] 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.js 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 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 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(themeColors.componentBG)

[ ] 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.
[ ] I have checked off every checkbox in the PR reviewer checklist, including those that don't apply to this PR.

Screenshots/Videos

Web

Chrome HT Account
https://user-images.githubusercontent.com/36869046/203878695-fb8083d7-c386-4b9f-ad9a-235599d6316b.mov
Chrome Simple Account
https://user-images.githubusercontent.com/36869046/203878749-4cf55def-03b3-4f53-86d5-66e6032878a8.mov
Chrome Offline
https://user-images.githubusercontent.com/36869046/203879275-9216fcff-9064-4ad9-b164-bda2de7169b0.mov
Safari HT Account
https://user-images.githubusercontent.com/36869046/203878794-78c85db2-75df-4fdf-8510-9d2a9c23ccc3.mov
Safari Simple Account
https://user-images.githubusercontent.com/36869046/203878852-da37cf08-f5eb-464d-ba12-76b489d39576.mov

Mobile Web - Chrome

Mobile Web - Safari

Desktop

https://user-images.githubusercontent.com/36869046/203880564-37a1614c-0f6f-4c1f-befa-e86b77d69f47.mov
Offline
https://user-images.githubusercontent.com/36869046/203880657-09251dea-b5ce-4572-ab1a-6131be7b1e82.mov

iOS

https://user-images.githubusercontent.com/36869046/203884074-5c71bdef-f9f5-439d-b6ba-8d5ebb330908.mov
Offline
https://user-images.githubusercontent.com/36869046/203884359-144688ce-d8e7-401a-bf6b-b7dba56f40fb.mov

Android

Sorry @fedirjh we do not allow PRs to be raised without a proposal. If you want to share diffs or code examples that's fine, but creating PRs causes too much confusion for our team. Thanks!

source: gharchive/pull-request

authors: fedirjh marcaaron


text:
Track Push Notification Opt-In Status

HOLD on https://github.com/Expensify/Web-Expensify/pull/36368
Note that a require cycle was recently added by a different PR unrelated to this one.
Details
This PR starts tracking whether a user is opted-in to push notifications on a per-device basis.
Relevant comment: https://github.com/urbanairship/react-native-airship/issues/427#issuecomment-1124469522
Fixed Issues
$ https://github.com/Expensify/Expensify/issues/209233
Tests / QA Steps
Web

Run the web app, and search console logs for deviceID.

Verify that you see a log line like:
[info] Got new deviceID - "def9ade3-7e2c-ecfe-ccb2-8941203716b2"

Refresh the page. Verify that you see a log line like so (with a matching GUID):
[info] Found existing deviceID - "def9ade3-7e2c-ecfe-ccb2-8941203716b2"

Close the tab, then open it again. Verify that you see a log line like so:
[info] Found existing deviceID - "def9ade3-7e2c-ecfe-ccb2-8941203716b2"

Log out then refresh the page. Verify that you see a log line like so:
[info] Found existing deviceID - "def9ade3-7e2c-ecfe-ccb2-8941203716b2"

Desktop

Run the desktop app, and search console logs for deviceID. You can open the dev console in the desktop app with CMD + Option + I

Verify that you see a log line like:
[info] Got new deviceID - "18632275959b5bef058ee4aa7fc70069d4ba54604c30986c4f1e3c09e287b521"

Close the app and reopen it. Verify that you see a log line like:
[info] Found existing deviceID - "18632275959b5bef058ee4aa7fc70069d4ba54604c30986c4f1e3c09e287b521"

Log out, then close the app and reopen it. Verify that you see that same log line.

Completely uninstall and reinstall the app, then open the app. Verify that you see the same log line.

iOS

Sign into the app.

When prompted, accept push notifications.

Look at the value of the pushNotificationsEnabled NVP, either with a CQ:
SELECT value
FROM nameValuePairs nvp
INNER JOIN accounts a ON a.accountID = nvp.accountID
WHERE a.email = '<email_you_used_to_login>'
  AND nvp.name = 'pushNotificationsEnabled';

Or by signing into the same account on https://staging.expensify.com, then running NVP.get('pushNotificationsEnabled') in the console.

Verify that the NVP shows that you opted in to push notifications for the current device. It should look like this:
{"iPhone15,2_90CD2827-B91E-45E5-A63E-76ADC67F47F0":[{"isEnabled":true,"timestamp":"2023-01-27 02:17:44"}]}

Where iPhone15,2_90CD2827-B91E-45E5-A63E-76ADC67F47F0 is the deviceID, the most recent value of the NVP is at the end of the array, and isEnabled should be true.

Sign out and sign back in with a different account, then accept notifications when prompted.

Look at the NVP again for the new account and verify that it shows the same deviceID w/ isEnabled: true.

Sign out and sign back in with the first account.

Look at the NVP again for the first account and verify that it hasn't changed.

Completely uninstall and reinstall the app.

Sign in to the same account and accept push notifications when prompted.

Look at the NVP again, and verify that it hasn't changed.

Completely uninstall and reinstall the app.

Sign in to the same account, but this time reject push notifications when prompted.

Look at the NVP again and verify that there's a new entry at the end of the array that shows isEnabled: false.

Now open settings, scroll down to New Expensify, and enable notifications. Then come back to the app.

Look at the NVP again and verify that there's a new entry at the end of the array that shows isEnabled: true.

Now open settings, scroll down to New Expensify, and disable notifications. Then come back to the app.

Look at the NVP again and verify that there's a new entry at the end of the array that shows isEnabled: false.

Android

Sign into the app on Android.

Look at the value of the pushNotificationsEnabled NVP , either with a CQ:
SELECT value
FROM nameValuePairs nvp
INNER JOIN accounts a ON a.accountID = nvp.accountID
WHERE a.email = '<email_you_used_to_login>'
  AND nvp.name = 'pushNotificationsEnabled';

Or by signing into the same account on https://staging.expensify.com, then running NVP.get('pushNotificationsEnabled') in the console.

Verify that the NVP shows that you opted in to push notifications for the current device.

Sign out, then sign back in with a different account.

Look at the NVP again for the different account and verify that you see the same deviceID with isEnabled: true.

Sign out, then sign back in with the first account.

Look at the NVP again for the first account and verify that it hasn't changed.

Close the app and reopen it.

Look at the NVP again and verify that it hasn't changed.

Now go into settings and disable notifications for New Expensify, then open the app again.

Look at the NVP again and verify that there's a new entry showing isEnabled: false

Close the app and reopen it.

Look at the NVP again and verify that it hasn't changed.

Now go into settings and re-enable notifications for New Expensify, then open the app again.

Look at the NVP again and verify that there's a new entry showing isEnabled: true.

[x] Verify that no errors appear in the JS console

Offline tests
None.
PR Author Checklist

[x] I linked the correct issue in the ### Fixed Issues section above
[x] I wrote clear testing steps that cover the changes made in this PR

[x] I added steps for local testing in the Tests section
[x] I added steps for the expected offline behavior in the Offline steps section
[x] I added steps for Staging and/or Production testing in the QA steps section
[x] I added steps to cover failure scenarios (i.e. verify an input displays the correct error message if the entered data is not correct)
[x] 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)
[x] 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).

[x] I included screenshots or videos for tests on all platforms
[x] I ran the tests on all platforms & verified they passed on:

[x] Android / native
[x] Android / Chrome
[x] iOS / native
[x] iOS / Safari
[x] MacOS / Chrome / Safari
[x] MacOS / Desktop

[x] 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)
[x] I followed proper code patterns (see Reviewing the code)

[x] 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)
[x] I verified that comments were added to code that is not self explanatory
[x] 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.
[x] I verified any copy / text shown in the product is localized by adding it to src/languages/* files and using the translation method

[x] If any non-english text was added/modified, I verified the translation was requested/reviewed in #expensify-open-source and it was approved by an internal Expensify engineer. Link to Slack message:

[x] I verified all numbers, amounts, dates and phone numbers shown in the product are using the localization methods
[x] I verified any copy / text that was added to the app is correct English and approved by marketing by adding the Waiting for Copy label for a copy review on the original GH to get the correct copy.
[x] 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.
[x] I verified the JSDocs style guidelines (in STYLE.md) were followed

[x] If a new code pattern is added I verified it was agreed to be used by multiple Expensify engineers
[x] I followed the guidelines as stated in the Review Guidelines
[x] 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)
[x] I verified all code is DRY (the PR doesn't include any logic written more than once, with the exception of tests)
[x] I verified any variables that can be defined as constants (ie. in CONST.js or at the top of the file that uses the constant) are defined as such
[x] I verified that if a function's arguments changed that all usages have also been updated correctly
[x] If a new component is created I verified that:

[x] A similar component doesn't exist in the codebase
[x] All props are defined accurately and each prop has a /** comment above it */
[x] The file is named correctly
[x] The component has a clear name that is non-ambiguous and the purpose of the component can be inferred from the name alone
[x] The only data being stored in the state is data necessary for rendering and nothing else
[x] 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)
[x] 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)
[x] All JSX used for rendering exists in the render method
[x] 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

[x] If any new file was added I verified that:

[x] 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

[x] If a new CSS style is added I verified that:

[x] A similar style doesn't already exist
[x] The style can't be created with an existing StyleUtils function (i.e. StyleUtils.getBackgroundAndBorderStyle(themeColors.componentBG)

[x] 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)
[x] 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.
[x] 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.
[x] I have checked off every checkbox in the PR author checklist, including those that don't apply to this PR.

Screenshots/Videos

Web

Mobile Web - Chrome
No tests or QA for mobile web.

Mobile Web - Safari
No tests or QA for mobile web.

Desktop

iOS
https://www.youtube.com/watch?v=WAVT4B_ph9w

Android
https://user-images.githubusercontent.com/47436092/216537601-52cc474a-0d90-4a31-ae47-f278881968fb.mov

@Julesssss @arosiclair requesting your review here since you're tagged on the linked API issue and have lots of context on push notifications.

@roryabraham Is this still on hold to test?

@mollfpr yeah unfortunately you won't be able to test this until it's off HOLD, but @stitesExpensify @arosiclair @Julesssss all can test right away by checking out the branch from the linked API PR in their dev environment.

@mollfpr If you want to get a head-start, you can do the tests for web + desktop right away. That's really just testing the deviceID generation logic

@roryabraham Thanks, I'll try that 👍

Thanks for the thorough review @Julesssss. Updated!

Reviewer Checklist

[x] I have verified the author checklist is complete (all boxes are checked off).
[x] 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 tests pass on all platforms & I tested again on:

[ ] Android / native
[ ] Android / Chrome
[ ] iOS / native
[ ] iOS / Safari
[ ] MacOS / Chrome / Safari
[ ] MacOS / Desktop

[ ] 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 shown in the product is localized by adding it to src/languages/* files and using the translation method
[ ] 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 correct English and approved by marketing by adding the Waiting for Copy label for a copy review on the original GH to get the correct copy.
[ ] 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 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)
[ ] 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.js or at the top of the file that uses the constant) are defined as such
[ ] 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(themeColors.componentBG)

[ ] 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 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 have checked off every checkbox in the PR reviewer checklist, including those that don't apply to this PR.

Screenshots/Videos

Web

Mobile Web - Chrome

Mobile Web - Safari

Desktop

iOS

Android

API PR merged. Just waiting on it to be deployed to production before taking this off HOLD

Off HOLD, ready for final review + merge

I got the above error when trying to run the ios app.

I am only able to check the deviceID present on the Web and Desktop. I can't test for the native platforms since it needs to check the NVP result. Please unassign me if this needs QA internally.

Merge conflicts resolved (the only conflict was in a test)

Thanks @roryabraham I'll test it again this morning 🙏

@roryabraham I kept getting the airshipOptIn value false. I tried on different simulators iPhone 13 iOS 15.0, iPhone 14 iOS 16.2, and iPhone 14 Pro iOS 16.2, and I still got the same result. Any idea?

@mollfpr are you testing with an iOS simulator? Simulators can't receive push notifications so I wonder if that's the cause. Did you opt-in to push notifications when prompted?

@roryabraham Yes, I opted in when it prompted. I’ll try it on the physical device then.

@roryabraham I ask on Slack how to run the dev app on the iPhone physical device, but there's not possible for the contributors right now. Any suggestion?

@roryabraham I ask on Slack how to run the dev app on the iPhone physical device, but there's not possible for the contributors right now. Any suggestion?

Myself, @arosiclair, or @stitesExpensify can test iOS. I can't do this today, but should be able to find time tomorrow.

Conflicts resolved

Working on the checklist right now

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 tests pass on all platforms & I tested again on:

[ ] Android / native
[ ] Android / Chrome
[ ] iOS / native
[ ] iOS / Safari
[ ] MacOS / Chrome / Safari
[ ] MacOS / Desktop

[ ] 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 shown in the product is localized by adding it to src/languages/* files and using the translation method
[ ] 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 correct English and approved by marketing by adding the Waiting for Copy label for a copy review on the original GH to get the correct copy.
[ ] 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 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)
[ ] 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.js or at the top of the file that uses the constant) are defined as such
[ ] 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(themeColors.componentBG)

[ ] 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 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 have checked off every checkbox in the PR reviewer checklist, including those that don't apply to this PR.

Screenshots/Videos

Web

Mobile Web - Chrome

Mobile Web - Safari

Desktop

iOS

Android

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

Thanks for taking this over the finish line @arosiclair 🚀

🚀 Deployed to staging by https://github.com/arosiclair in version: 1.2.74-0 🚀

platform
result

🤖 android 🤖
success ✅

🖥 desktop 🖥
success ✅

🍎 iOS 🍎
success ✅

🕸 web 🕸
success ✅

@roryabraham, we are struggling with this PR.

On Web and Desktop logins, the Info is not displayed in console at all. I can only see if if I run the NVP.get('pushNotificationsEnabled') and login with mobile device.
When I login on few mobile devices, 2nd device shows as NULL

Let me know if this is expected or should be logged as a separate issue
Title:
[ND] PR 14579 - 2nd device is displayed as NULL
Action Performed:

Sign into the app.
When prompted, accept push notifications.
Look at the value of the pushNotificationsEnabled NVP, by signing into the same account on https://staging.expensify.com, then running NVP.get('pushNotificationsEnabled') in the console.
Verify that the NVP shows that you opted in to push notifications for the current device
Navigate to the same account on another device
Verify that the NVP shows that you opted in to push notifications for new current device

Expected Result:
User can see only original device
Actual Result:
User can see the 1st device, but 2nd device displayed as NULL array
Attachment

this is Desktop

🚀 Deployed to production by https://github.com/chiragsalian in version: 1.2.74-0 🚀

platform
result

🤖 android 🤖
success ✅

🖥 desktop 🖥
success ✅

🍎 iOS 🍎
success ✅

🕸 web 🕸
success ✅

authors: Julesssss OSBotify arosiclair mollfpr mvtglobally roryabraham


text:
Update Spanish translation for sign-in page's welcome text

Details
Update the Spanish translation for "Welcome to New Expensify! Enter your phone number or email to continue." on the sign-in page. The translation was discussed internally here.
Fixed Issues
$ https://github.com/Expensify/App/issues/15900
Tests

Open the app, sign out if you are signed in
Switch the app to Spanish
Make sure the text above the email/phone input reads ¡Bienvenido al Nuevo Expensify! Por favor, introduce tu número de teléfono o email para continuar.

[x] Verify that no errors appear in the JS console

Offline tests
N/A
QA Steps

Open the app, sign out if you are signed in
Switch the app to Spanish
Make sure the text above the email/phone input reads ¡Bienvenido al Nuevo Expensify! Por favor, introduce tu número de teléfono o email para continuar.

[ ] Verify that no errors appear in the JS console

PR Author Checklist

[x] I linked the correct issue in the ### Fixed Issues section above
[x] I wrote clear testing steps that cover the changes made in this PR

[x] I added steps for local testing in the Tests section
[x] I added steps for the expected offline behavior in the Offline steps section
[x] I added steps for Staging and/or Production testing in the QA steps section
[x] I added steps to cover failure scenarios (i.e. verify an input displays the correct error message if the entered data is not correct)
[x] 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)
[x] 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).

[x] I included screenshots or videos for tests on all platforms
[x] I ran the tests on all platforms & verified they passed on:

[x] Android / native
[x] Android / Chrome
[x] iOS / native
[x] iOS / Safari
[x] MacOS / Chrome / Safari
[x] MacOS / Desktop

[x] 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)
[x] I followed proper code patterns (see Reviewing the code)

[x] 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)
[x] I verified that comments were added to code that is not self explanatory
[x] 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.
[x] I verified any copy / text shown in the product is localized by adding it to src/languages/* files and using the translation method

[x] If any non-english text was added/modified, I verified the translation was requested/reviewed in #expensify-open-source and it was approved by an internal Expensify engineer. Link to Slack message:

[x] I verified all numbers, amounts, dates and phone numbers shown in the product are using the localization methods
[x] I verified any copy / text that was added to the app is correct English and approved by marketing by adding the Waiting for Copy label for a copy review on the original GH to get the correct copy.
[x] 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.
[x] I verified the JSDocs style guidelines (in STYLE.md) were followed

[x] If a new code pattern is added I verified it was agreed to be used by multiple Expensify engineers
[x] I followed the guidelines as stated in the Review Guidelines
[x] 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)
[x] I verified all code is DRY (the PR doesn't include any logic written more than once, with the exception of tests)
[x] I verified any variables that can be defined as constants (ie. in CONST.js or at the top of the file that uses the constant) are defined as such
[x] I verified that if a function's arguments changed that all usages have also been updated correctly
[x] If a new component is created I verified that:

[x] A similar component doesn't exist in the codebase
[x] All props are defined accurately and each prop has a /** comment above it */
[x] The file is named correctly
[x] The component has a clear name that is non-ambiguous and the purpose of the component can be inferred from the name alone
[x] The only data being stored in the state is data necessary for rendering and nothing else
[x] 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)
[x] 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)
[x] All JSX used for rendering exists in the render method
[x] 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

[x] If any new file was added I verified that:

[x] 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

[x] If a new CSS style is added I verified that:

[x] A similar style doesn't already exist
[x] The style can't be created with an existing StyleUtils function (i.e. StyleUtils.getBackgroundAndBorderStyle(themeColors.componentBG)

[x] 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)
[x] 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.
[x] 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.
[x] 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.
[x] I have checked off every checkbox in the PR author checklist, including those that don't apply to this PR.

Screenshots/Videos

Web

Mobile Web - Chrome

Mobile Web - Safari

Desktop

iOS

Android

@parasharrajat @youssef-lr One of you needs to 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]

[x] I have verified the author checklist is complete (all boxes are checked off).
[x] I verified the correct issue is linked in the ### Fixed Issues section above
[x] I verified testing steps are clear and they cover the changes made in this PR

[x] I verified the steps for local testing are in the Tests section
[x] I verified the steps for Staging and/or Production testing are in the QA steps section
[x] 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)
[x] 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)

[x] I checked that screenshots or videos are included for tests on all platforms
[x] I included screenshots or videos for tests on all platforms
[x] I verified tests pass on all platforms & I tested again on:

[x] Android / native
[x] Android / Chrome
[x] iOS / native
[x] iOS / Safari
[x] MacOS / Chrome / Safari
[x] MacOS / Desktop

[x] 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
[x] I verified proper code patterns were followed (see Reviewing the code)

[x] 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).
[x] I verified that comments were added to code that is not self explanatory
[x] 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.
[x] I verified any copy / text shown in the product is localized by adding it to src/languages/* files and using the translation method
[x] I verified all numbers, amounts, dates and phone numbers shown in the product are using the localization methods
[x] I verified any copy / text that was added to the app is correct English and approved by marketing by adding the Waiting for Copy label for a copy review on the original GH to get the correct copy.
[x] 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.
[x] I verified the JSDocs style guidelines (in STYLE.md) were followed

[x] If a new code pattern is added I verified it was agreed to be used by multiple Expensify engineers
[x] I verified that this PR follows the guidelines as stated in the Review Guidelines
[x] 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)
[x] I verified all code is DRY (the PR doesn't include any logic written more than once, with the exception of tests)
[x] I verified any variables that can be defined as constants (ie. in CONST.js or at the top of the file that uses the constant) are defined as such
[x] If a new component is created I verified that:

[x] A similar component doesn't exist in the codebase
[x] All props are defined accurately and each prop has a /** comment above it */
[x] The file is named correctly
[x] The component has a clear name that is non-ambiguous and the purpose of the component can be inferred from the name alone
[x] The only data being stored in the state is data necessary for rendering and nothing else
[x] 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)
[x] 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)
[x] All JSX used for rendering exists in the render method
[x] 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

[x] If any new file was added I verified that:

[x] 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

[x] If a new CSS style is added I verified that:

[x] A similar style doesn't already exist
[x] The style can't be created with an existing StyleUtils function (i.e. StyleUtils.getBackgroundAndBorderStyle(themeColors.componentBG)

[x] 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)
[x] 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.
[x] 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.
[x] I have checked off every checkbox in the PR reviewer checklist, including those that don't apply to this PR.

Reviewer Checklist

[x] I have verified the author checklist is complete (all boxes are checked off).
[x] I verified the correct issue is linked in the ### Fixed Issues section above
[x] I verified testing steps are clear and they cover the changes made in this PR

[x] I verified the steps for local testing are in the Tests section
[x] I verified the steps for Staging and/or Production testing are in the QA steps section
[x] 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)
[x] 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)

[x] I checked that screenshots or videos are included for tests on all platforms
[x] I included screenshots or videos for tests on all platforms
[x] I verified tests pass on all platforms & I tested again on:

[x] Android / native
[x] Android / Chrome
[x] iOS / native
[x] iOS / Safari
[x] MacOS / Chrome / Safari
[x] MacOS / Desktop

[x] 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
[x] I verified proper code patterns were followed (see Reviewing the code)

[x] 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).
[x] I verified that comments were added to code that is not self explanatory
[x] 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.
[x] I verified any copy / text shown in the product is localized by adding it to src/languages/* files and using the translation method
[x] I verified all numbers, amounts, dates and phone numbers shown in the product are using the localization methods
[x] I verified any copy / text that was added to the app is correct English and approved by marketing by adding the Waiting for Copy label for a copy review on the original GH to get the correct copy.
[x] 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.
[x] I verified the JSDocs style guidelines (in STYLE.md) were followed

[x] If a new code pattern is added I verified it was agreed to be used by multiple Expensify engineers
[x] I verified that this PR follows the guidelines as stated in the Review Guidelines
[x] 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)
[x] I verified all code is DRY (the PR doesn't include any logic written more than once, with the exception of tests)
[x] I verified any variables that can be defined as constants (ie. in CONST.js or at the top of the file that uses the constant) are defined as such
[x] If a new component is created I verified that:

[x] A similar component doesn't exist in the codebase
[x] All props are defined accurately and each prop has a /** comment above it */
[x] The file is named correctly
[x] The component has a clear name that is non-ambiguous and the purpose of the component can be inferred from the name alone
[x] The only data being stored in the state is data necessary for rendering and nothing else
[x] 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)
[x] 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)
[x] All JSX used for rendering exists in the render method
[x] 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

[x] If any new file was added I verified that:

[x] 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

[x] If a new CSS style is added I verified that:

[x] A similar style doesn't already exist
[x] The style can't be created with an existing StyleUtils function (i.e. StyleUtils.getBackgroundAndBorderStyle(themeColors.componentBG)

[x] 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)
[x] 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.
[x] 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.
[x] 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.
[x] I have checked off every checkbox in the PR reviewer checklist, including those that don't apply to this PR.

:hand: 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/youssef-lr in version: 1.2.88-0 🚀

platform
result

🤖 android 🤖
failure ❌

🖥 desktop 🖥
success ✅

🍎 iOS 🍎
success ✅

🕸 web 🕸
success ✅

🚀 Deployed to staging by https://github.com/youssef-lr in version: 1.2.88-0 🚀

platform
result

🤖 android 🤖
success ✅

🖥 desktop 🖥
success ✅

🍎 iOS 🍎
success ✅

🕸 web 🕸
success ✅

🚀 Deployed to production by https://github.com/AndrewGable in version: 1.2.88-2 🚀

platform
result

🤖 android 🤖
success ✅

🖥 desktop 🖥
success ✅

🍎 iOS 🍎
failure ❌

🕸 web 🕸
success ✅

authors: MelvinBot OSBotify francoisl youssef-lr


text:
[NoQA] Replace iOS provision profile to allow dev builds from XCode

@AndrewGable @neil-marcellini
Details
When I generated the Expensify Dev provisioning profile I selected AdHoc instead of development. This prevented us from building to physical devices from XCode.
Fixed Issues

$ https://github.com/Expensify/Expensify/issues/314417
Tests

MAKE SURE I DIDN"T UPLOAD A NON-GPG SIGNED FILE!!!
Pull the changes from this branch
Download the updated expensify_chat_dev prov profile
In XCode, select the NewDot scheme, then ensure you have Debug Development selected as the Capability [1]
Select the provisioning profile, then select import and locate the updated provisioning file you downloaded earlier [2]
The app should now build to a physical device (you may need to run 'Product > Clean Build Folder')

If so, you'll then need to reinstall pods with cd ios && pod install

Offline tests

N/A
QA Steps

N/A
PR Author Checklist

[x] I linked the correct issue in the ### Fixed Issues section above
[x] I wrote clear testing steps that cover the changes made in this PR

[x] I added steps for local testing in the Tests section
[x] I added steps for the expected offline behavior in the Offline steps section
[x] I added steps for Staging and/or Production testing in the QA steps section
[x] I added steps to cover failure scenarios (i.e. verify an input displays the correct error message if the entered data is not correct)
[x] 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)
[x] 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).

[x] I included screenshots or videos for tests on all platforms
[x] I ran the tests on all platforms & verified they passed on:

[x] Android / native
[x] Android / Chrome
[x] iOS / native
[x] iOS / Safari
[x] MacOS / Chrome / Safari
[x] MacOS / Desktop

[x] 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)
[x] I followed proper code patterns (see Reviewing the code)

[x] 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)
[x] I verified that the left part of a conditional rendering a React component is a boolean and NOT a string, e.g. myBool && <MyComponent />.
[x] I verified that comments were added to code that is not self explanatory
[x] 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.
[x] I verified any copy / text shown in the product is localized by adding it to src/languages/* files and using the translation method

[x] If any non-english text was added/modified, I verified the translation was requested/reviewed in #expensify-open-source and it was approved by an internal Expensify engineer. Link to Slack message:

[x] I verified all numbers, amounts, dates and phone numbers shown in the product are using the localization methods
[x] 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 approved by marketing by adding the Waiting for Copy label for a copy review on the original GH to get the correct copy.
[x] 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.
[x] I verified the JSDocs style guidelines (in STYLE.md) were followed

[x] If a new code pattern is added I verified it was agreed to be used by multiple Expensify engineers
[x] I followed the guidelines as stated in the Review Guidelines
[x] 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)
[x] I verified all code is DRY (the PR doesn't include any logic written more than once, with the exception of tests)
[x] I verified any variables that can be defined as constants (ie. in CONST.js or at the top of the file that uses the constant) are defined as such
[x] I verified that if a function's arguments changed that all usages have also been updated correctly
[x] If a new component is created I verified that:

[x] A similar component doesn't exist in the codebase
[x] All props are defined accurately and each prop has a /** comment above it */
[x] The file is named correctly
[x] The component has a clear name that is non-ambiguous and the purpose of the component can be inferred from the name alone
[x] The only data being stored in the state is data necessary for rendering and nothing else
[x] 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
[x] 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)
[x] 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)
[x] All JSX used for rendering exists in the render method
[x] 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

[x] If any new file was added I verified that:

[x] 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

[x] If a new CSS style is added I verified that:

[x] A similar style doesn't already exist
[x] The style can't be created with an existing StyleUtils function (i.e. StyleUtils.getBackgroundAndBorderStyle(themeColors.componentBG))

[x] 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.
[x] 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)
[x] 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.
[x] 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.
[x] 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.
[x] 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.
[x] I have checked off every checkbox in the PR author checklist, including those that don't apply to this PR.

Screenshots/Videos
Only iOS is relevant here

Where is the encrypted profile used? I thought we just had to update this on Apple's backend.

Also IDK how to do the first test step

Where is the encrypted profile used? I thought we just had to update this on Apple's backend.

@AndrewGable oh interesting. I assumed all certs had to be committed, but that would make sense.
The app builds from main, so that seems to confirm things. I won't use this PR to delete the existing dev cert, as Rory's PR is going to do that anyway.

authors: AndrewGable Julesssss neil-marcellini