App
App copied to clipboard
Desktop - Add "Check For Update" system menu item
Details
Add a "Check for Updates" system menu item The "Check for Updates" appears until an update is downloaded (either manually or automatically), then it gets swapped by the "Update New Expensify" system menu item
Since the "Update available" notification is displayed only after an update is downloaded I've included a feedback dialog The dialog is shown soon after clicking "Check for Updates" and the user is informed whether an update is available and being downloaded, or not update is available right now
Note: As other content (menu items) in desktop/main.js the texts are not localized.
Dialogs, notifications, menus localization is out current scope
Fixed Issues
$ https://github.com/Expensify/App/issues/11817 PROPOSAL: N/A
Tests
To test in dev (temporarily) add the following file inside ./desktop/dev-app-update.yml
provider: s3
bucket: staging-expensify-cash
channel: latest
updaterCacheDirName: new.expensify.desktop-updater
This would allow the "Check For Update" menu item to work in dev (otherwise the checkForUpdates action fails with an error)
In DEV update checks resolve with no update available (even when there's a new version):
- [ ] Verify "Check for updates" menu item appears in DEV
- [ ] Verify pressing "Check for updates" shows a dialog with the result shortly
- [ ] Verify "Update New Expensify" menu item does not appear
Build the desktop app for staging and/or prod Since the version in this PR is older there is already a new version and hence an update is available almost as soon as app is launched If you're quick enough you can tap on the system menu and see the "Check for updates" item before it gets replaced by "Update New Expensify" (Alternatively go offline before launching App, so that the initial/automatic update check happens while offline, then resume connectivity)
- [ ] quickly, as soon as launching App, press on the system menu to see the "Check for updates" option - pressing it should shortly display a dialog that an update is available. The update is being downloaded - sometimes it takes a few minutes, before we get the notification that the update is ready to be installed. At that point "Check for updates" should no longer be displayed in the system menu
- [ ] You can discard or not press on the "Update ready" (downloaded) notification and see that "Check for updates" indeed is no longer in the system menu, but "Update New Expensify" is reviewed
- [ ] Verify that pressing "Update New Expensify" still works - I couldn't easily check this, perhaps we can leave it for QA, otherwise we'd need to setup local update server
- [ ] Verify pressing the "Update ready" notification still works the same way as before - it displays the in-app modal that lets you apply the update ASAP
To simulates that there are no updates available in staging or prod, go to main package.json and set the app version, to the latest released version or newer. Now build the desktop app and launch it
-
[ ] Verify the "Check for updates" option appears in the system menu
-
[ ] Verify pressing it shows a dialog that there are no updates right now
-
[ ] Verify "Check for Updates" works offline
- launch the app offline
- press "Check for Updates" - see a dialog explaining the check for updates failed
- optionally resume connectivity and retry - now you should get actual results whether update exists or no
QA Steps
Since the version in this PR is older there is already a new version and hence an update is available almost as soon as app is launched If you're quick enough you can tap on the system menu and see the "Check for updates" item before it gets replaced by "Update New Expensify"
- [ ] quickly, as soon as launching App, press on the system menu to see the "Check for updates" option - pressing it should shortly display a dialog that an update is available. The update is being downloaded - sometimes it takes a few minutes, before we get the notification that the update is ready to be installed. At that point "Check for updates" should no longer be displayed in the system menu
- [ ] You can discard or not press on the "Update ready" (downloaded) notification and see that "Check for updates" indeed is no longer in the system menu, but "Update New Expensify" is reviewed
- [ ] Verify that pressing "Update New Expensify" still works - I couldn't easily check this, perhaps we can leave it for QA, otherwise we'd need to setup local update server
- [ ] Verify pressing the "Update ready" notification still works the same way as before - it displays the in-app modal that lets you apply the update ASAP
If by any chance you aren't able to open the menu quick enough you can uninstall the app and install it again (Due to caching I think the update would appear very fast, but you can still beat it)
An alternative is to disconnect Wi-Fi, then launch App, wait a bit (e.g. 20-30 sec) (for the initial update check to fail), reconnect to Wifi - you should see and be able to interact with the "Check for updates" system menu item
- [ ] Verify "Check for Updates" works offline
- launch the app offline
- press "Check for Updates" - see a dialog explaining the check for updates failed
- optionally resume connectivity and retry - now you should get actual results whether update exists or no
PR Author Checklist
- [x] I linked the correct issue in the
### Fixed Issuessection above - [x] I wrote clear testing steps that cover the changes made in this PR
- [x] I added steps for local testing in the
Testssection - [x] I added steps for Staging and/or Production testing in the
QA stepssection - [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 added steps for local testing in the
- [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.
toggleReportand notonIconClick) - [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 - [ ] I verified any copy / text that was added to the app is correct English and approved by marketing by adding the
Waiting for Copylabel 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] 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.
- [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 usingAvatarare 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] 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
thisproperly so there are no scoping issues (i.e. foronClick={this.submit}the methodthis.submitshould be bound tothisin the constructor) - [x] Any internal methods bound to
thisare necessary to be bound (i.e. avoidthis.submit = this.submit.bind(this);ifthis.submitis never passed to a component event handler likeonClick) - [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
Avataris modified, I verified thatAvataris 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.
- [ ] 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 Issuessection 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
Testssection - [ ] I verified the steps for Staging and/or Production testing are in the
QA stepssection - [ ] 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 verified the steps for local testing are in the
- [ ] 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.
toggleReportand notonIconClick). - [ ] 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 Copylabel 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
- [ ] 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.
- [ ] 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 usingAvatarhave 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
thisproperly so there are no scoping issues (i.e. foronClick={this.submit}the methodthis.submitshould be bound tothisin the constructor) - [ ] Any internal methods bound to
thisare necessary to be bound (i.e. avoidthis.submit = this.submit.bind(this);ifthis.submitis never passed to a component event handler likeonClick) - [ ] 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
Avataris modified, I verified thatAvataris 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
Web
Mobile Web - Chrome
Mobile Web - Safari
Desktop
https://user-images.githubusercontent.com/12156624/200919148-d70c05d1-3d4b-48ad-8898-866f42ea6cfd.mov
iOS
Android
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.
Obviously the texts here are a fruit of my imagination so we'll need to update them, I'll post about that on the original issue
I haven't provided screenshots for all platforms - I just verified they still run/build - as you can see nothing is changed for other platforms
Looks good we're waiting for a copy!
https://user-images.githubusercontent.com/85645967/201247752-9c408928-b600-45da-9b6d-a02831f0256b.mov
Updated copies, ready for review ✔️

- During development the app name in the menu is "Electron" and this Electron icon appear as default, for prod/staging the icon would be the Expensify icon like below

Note: there's a lot of code related to updates/auto-updates and creating menu items that can be extracted in separate files
- updater.js
- appMenu.js
desktop/main.js needs better organization, because it becomes very cluttered/tangled
Can we capture a refactor ticket?
Note: there's a lot of code related to updates/auto-updates and creating menu items that can be extracted in separate files
- updater.js
- appMenu.js
desktop/main.jsneeds better organization, because it becomes very cluttered/tangled Can we capture a refactor ticket?
Please take this idea to slack, if not already!
In DEV update checks resolve with no update available (even when there's a new version):
- [x] Verify "Check for updates" menu item appears in DEV
- [x] Verify pressing "Check for updates" shows a dialog with the result shortly
- [x] Verify "Update New Expensify" menu item does not appear
https://user-images.githubusercontent.com/85645967/202795226-8dc918da-a844-4957-b960-d33b153abc99.mov
@kidroca
While building for production/staging, should I keep this file ./desktop/dev-app-update.yml or remove it?
Should I add anything else?
I can just clone your branch, and build desktop-staging should do right?
@Santhosh-Sellavel
While building for production/staging, should I keep this file
./desktop/dev-app-update.ymlor remove it?
It shouldn't matter, but just to be safe you can deleted it first
Should I add anything else?
No
Depending whether you want to get "Update Available" or "Update Not Available" you can change the main package.json version before building desktop
I can just clone your branch, and build desktop-staging should do right?
Yes
@kidroca Not sure what I am doing wrong, app always crashes when I open the generated desktop build. I was unable to verify update available case alone.
@kidroca Not sure what I am doing wrong, app always crashes when I open the generated desktop build. I was unable to verify
update availablecase alone.
- Are you using an M1 mac?
- Can you include a screenshot or the content of the crash dialog?
- is it only with my changes or does building from the
mainalso results in the same crash?
@Santhosh-Sellavel I remember I had a crash after building staging/prod as well
Could you check if this bug report and shared fix solves the crash for you: https://expensify.slack.com/archives/C01GTK53T8Q/p1667938306012479
Thanks, @kidroca It works!
Screen recording
Update Available & unable to check error
https://user-images.githubusercontent.com/85645967/203092549-6dd72f29-93d1-4274-a481-a93426f7b661.mov
No Update
https://user-images.githubusercontent.com/85645967/203098735-2b749b80-f2ad-4503-933b-abd5f50d433f.mov
@kidroca Need some clarification
Please check the above video for updates available flow
- Initially
Check for updatesis shown in the menu. - After clicking the "Update available popup"
- For some time
Check for updatesis disabled, I assume the update is downloading - When the download is complete there is no notification as said in the UpdateAvailable popup. Is this Expected?
- Now
Update New Expensifyis shown in the menu, but clicking it does nothing. Is this expected for now?
Thanks, @kidroca It works!
Could you kindly answer these questions:
- Are you using an M1 mac?
- Can you include a screenshot or the content of the crash dialog?
- is it only with my changes or does building from the
mainalso results in the same crash?
If this bug report and the fix I shared here: https://github.com/Expensify/App/pull/12607#issuecomment-1321858605 resolved the build issue, could you post on the slack thread and move the bug report forward - I can commit the fix (from slack), but I think someone from the core team should confirm, so a separate PR might be better
@kidroca Need some clarification
Please check the above video for updates available flow
For some time
Check for updatesis disabled, I assume the update is downloading
Yes
When the download is complete there is no notification
Where do you look for notifications?
A system notification like this one should appear 
Unless:
- you or your mac is in a Focus/DND mode -> in that case you can still see the notification if you check all notification manually
- you haven't allowed to receive notification by Expensify
Now
Update New Expensifyis shown in the menu, but clicking it does nothing. Is this expected for now?
It depends, it should work for QA with the staging app being built by Github Actions (I'll update Test/QA to mention testing this)
The Update New Expensify didn't nothing for me even before the changes in the current PR
I suspect it might be because:
- I'm on a M1 mac
- When building App electron sign the package with a local signature that doesn't match the signature of the downloaded update
- Note: I think we also have to install
New Expensify.dmgto applications
I see the following error in the log:
[2022-11-21 18:41:55.924] [info] Checking for update
[2022-11-21 18:41:56.575] [info] Found version 1.2.29-6 (url: New Expensify-1.2.29-6-mac.zip, NewExpensify.dmg)
[2022-11-21 18:41:56.576] [info] Downloading update from New Expensify-1.2.29-6-mac.zip, NewExpensify.dmg
[2022-11-21 18:41:56.587] [info] Checked for macOS Rosetta environment (isRosetta=false)
[2022-11-21 18:41:56.590] [info] Checked 'uname -a': arm64=true
[2022-11-21 18:45:27.895] [info] New version 1.2.29-6 has been downloaded to /Users/kidroca/Library/Application Support/Caches/new.expensify.desktop-updater/pending/New Expensify-1.2.29-6-mac.zip
[2022-11-21 18:45:27.928] [info] / requested
[2022-11-21 18:45:27.933] [info] /1849b1493dc-226e.zip requested
[2022-11-21 18:45:27.933] [info] /1849b1493dc-226e.zip requested by Squirrel.Mac, pipe /Users/kidroca/Library/Application Support/Caches/new.expensify.desktop-updater/pending/New Expensify-1.2.29-6-mac.zip
[2022-11-21 18:45:29.376] [warn] Error: Code signature at URL file:///Users/kidroca/Library/Caches/com.expensifyreactnative.chat.ShipIt/update.bWoM6v6/New%20Expensify.app/ did not pass validation: code failed to satisfy specified code requirement(s)
[2022-11-21 18:45:29.377] [error] Error: Error: Code signature at URL file:///Users/kidroca/Library/Caches/com.expensifyreactnative.chat.ShipIt/update.bWoM6v6/New%20Expensify.app/ did not pass validation: code failed to satisfy specified code requirement(s)
These items should be tested by QA as we can't simulate updates and applying updates locally (We actually can, but it would just take a lot more time, instead since QA need to test it anyway it would be better to leave it to them)
Here's a video sample showing the system notification - because I'm in a Focus mode the notification does not appear, but I can see it in "Notifications"
https://user-images.githubusercontent.com/12156624/203119662-6aac38c0-62e9-44c5-8104-9333f6e488d2.mp4
I think since I have the App focused I should just see the in-app prompt that update is available, but that's another out of scope item
@kidroca It occurs on the main too, yes I am using an M1 Mac.
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 Issuessection 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
Testssection - [x] I verified the steps for Staging and/or Production testing are in the
QA stepssection - [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 verified the steps for local testing are in the
- [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] iOS / native
- [x] Android / native
- [x] iOS / Safari
- [x] Android / Chrome
- [x] MacOS / Chrome
- [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.
toggleReportand notonIconClick). - [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 Copylabel 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] 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.
- [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 usingAvatarhave 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
thisproperly so there are no scoping issues (i.e. foronClick={this.submit}the methodthis.submitshould be bound tothisin the constructor) - [x] Any internal methods bound to
thisare necessary to be bound (i.e. avoidthis.submit = this.submit.bind(this);ifthis.submitis never passed to a component event handler likeonClick) - [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
Avataris modified, I verified thatAvataris 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 reviewer checklist, including those that don't apply to this PR.
Screenshots/Videos
Only the desktop-specific code is modified here, so only the desktop screens are Added!
Desktop
Update Available & unable to check error
https://user-images.githubusercontent.com/85645967/203092549-6dd72f29-93d1-4274-a481-a93426f7b661.mov
No Update
https://user-images.githubusercontent.com/85645967/203098735-2b749b80-f2ad-4503-933b-abd5f50d433f.mov
@kidroca Notifications works It was turned off, and after enabling I received a notification. Also, let's verify Update New Expensify option works or not in the staging build once deployed, all good for now so approved!
cc: @pecanoro
@kidroca It seems the checks are failing on the PR author list, can ou double check nothing is missing from https://raw.githubusercontent.com/Expensify/App/main/.github/PULL_REQUEST_TEMPLATE.md?
@kidroca It seems the checks are failing on the PR author list, can ou double check nothing is missing from https://raw.githubusercontent.com/Expensify/App/main/.github/PULL_REQUEST_TEMPLATE.md?
@pecanoro Just did and updated the PR with the new list of checks
: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 @pecanoro in version: 1.2.31-0 🚀
| platform | result |
|---|---|
| 🤖 android 🤖 | success ✅ |
| 🖥 desktop 🖥 | success ✅ |
| 🍎 iOS 🍎 | success ✅ |
| 🕸 web 🕸 | success ✅ |
@kidroca @luacmartins Can you pls help out with this PR internally as well.
When the initial build updated, I wasn't getting the "Update New Expensify" active, but when we pushed CPs, the app updates automatically and I can't catch the notification without looking at my screen for 8 hrs.
If there are no updates, its working fine
https://user-images.githubusercontent.com/43995119/204023235-f2536710-c951-4e60-a1d3-153ab5640670.mp4
@mvtglobally this works for me!

If there's no other way to test this right now - it can just be monitored over time
- a "Check For Update" option should exist - it triggers a check "right now" and displays a result prompt (as seen in screenshots)
- an "Update New Expensify" option is shown only when update have been downloaded and can be applied
@pecanoro Can you assign me to this issue for tracking payment thanks!