Skip to content

Conversation

@neil-marcellini
Copy link
Contributor

@neil-marcellini neil-marcellini commented Dec 9, 2022

cc @chiragsalian @youssef-lr @flodnv

Details

Pass the createdReportActionID to the backend when splitting a bill.

Note: There are some existing bugs on staging when executing these testing steps. I have found that sometimes the IOU previews and messages do not load in the proper order. Regarding the offline test I also found these bugs. I will report them in #expensify-bugs on Slack and work on fixes in a separate PR.

  1. When creating the second split while offline the user was grayed out
  2. After creating the second split while offline the chats in the LHN were no
    longer grayed out
  3. After creating the second split the messages briefly appeared out of order.

Edit: I reported the bug in Slack here.

Related Issues

$ https://github.com/Expensify/Expensify/issues/247417
PROPOSAL: N/A

Tests

Pull changes from Auth https://github.com/Expensify/Auth/pull/7329 and Web-E https://github.com/Expensify/Web-Expensify/pull/35799, if they haven't been merged yet.

A

  1. From the global create menu +, select Split bill
  2. Go through the prompt and select TWO or MORE participants that you have never split a bill with, and submit the request. e.x (split1A@test.com and split1B@test.com)
  3. Verify that the group chat is created with those participants and you are navigated to it
  4. Verify that the group chat has a message Split $X with <user1> and <user2>
  5. Verify that individual chats with each participant are created
  6. Verify that individual chats have the IOU message and preview
  7. From the group chat, tap + > Split bill and send another split bill request
  8. Verify that the modal is dismissed
  9. Verify that another split message shows up in the group chat
  10. Verify that each individual chat with and show the new request and the total has been updated

B

  1. From the global create, + > Split bill and go through the prompts selecting only ONE participant that you have never split a bill with before.
  2. Submit the split request
  3. Verify that an Individual chat with the selected user is created
  4. Verify that an Individual chat has the IOU message and preview
  • Verify that no errors appear in the JS console

Offline tests

  1. Go offline
  2. From the global create menu +, select Split bill
  3. Go through the prompt and select TWO or MORE participants that you have never split a bill with, and submit the request
  4. Verify that the group chat is created with those participants and you are navigated to it (the whole chat should be greyed out)
  5. Verify that the group chat has a message Split $X with <user1> and <user2> (this should be greyed out)
  6. Verify that individual chats with each participant are created (these chats should be greyed out)
  7. Verify that individual chats have the IOU message and preview (these messages should be greyed out)
  8. From the group chat, tap + > Split bill and send another split bill request
  9. Verify that the modal is dismissed
  10. Verify that another split message shows up in the group chat (this message should be greyed out)
  11. Verify that each individual chat with and show the new request and the total has been updated (these messages should be greyed out)
  12. Turn on your internet connection and verify that the chats and messages are still the same, but are no longer greyed out.

QA Steps

Same as the tests above but on staging.

  • Verify that no errors appear in the JS console

PR Author Checklist

  • I linked the correct issue in the ### Fixed Issues section above
  • I wrote clear testing steps that cover the changes made in this PR
    • I added steps for local testing in the Tests section
    • I added steps for the expected offline behavior in the Offline steps section
    • I added steps for Staging and/or Production testing in the QA steps section
    • I added steps to cover failure scenarios (i.e. verify an input displays the correct error message if the entered data is not correct)
    • I turned off my network connection and tested it while offline to ensure it matches the expected behavior (i.e. verify the default avatar icon is displayed if app is offline)
    • I tested this PR with a High Traffic account against the staging or production API to ensure there are no regressions (e.g. long loading states that impact usability).
  • I included screenshots or videos for tests on all platforms
  • I ran the tests on all platforms & verified they passed on:
    • Android / native
    • Android / Chrome
    • iOS / native
    • iOS / Safari
    • MacOS / Chrome / Safari
    • MacOS / Desktop
  • I verified there are no console errors (if there's a console error not related to the PR, report it or open an issue for it to be fixed)
  • I followed proper code patterns (see Reviewing the code)
    • I verified that any callback methods that were added or modified are named for what the method does and never what callback they handle (i.e. toggleReport and not onIconClick)
    • I verified that comments were added to code that is not self explanatory
    • I verified that any new or modified comments were clear, correct English, and explained "why" the code was doing something instead of only explaining "what" the code was doing.
    • I verified any copy / text shown in the product is localized by adding it to src/languages/* files and using the translation method
    • 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 followed the guidelines as stated in the Review Guidelines
  • I tested other components that can be impacted by my changes (i.e. if the PR modifies a shared library or component like Avatar, I verified the components using Avatar are working as expected)
  • I verified all code is DRY (the PR doesn't include any logic written more than once, with the exception of tests)
  • I verified any variables that can be defined as constants (ie. in CONST.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 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 author checklist, including those that don't apply to this PR.

Screenshots/Videos

Web

Online

web-online.mov

Offline

web-offline.mp4
Mobile Web - Chrome

Online

android-Chrome-online.mov

Offline

android-Chrome-offline.mov
Mobile Web - Safari

Online

iOS-Safari-online.mp4

Offline

iOS-Safari-offline.mp4
Desktop

Online

desktop-online.mov

Offline
https://user-images.githubusercontent.com/26260477/207471919-e515f27d-fbfd-46f2-ad35-ae68b9424835.mp4

iOS

Online

iOS-online.mp4

Offline

iOS-offline.mov
Android

Online

android-online.mov

Offline

android-offline.mov

@neil-marcellini neil-marcellini self-assigned this Dec 9, 2022
@neil-marcellini neil-marcellini changed the base branch from main to flo_createdReportActionID December 9, 2022 01:29
@neil-marcellini neil-marcellini changed the title Add a created report action for bill splits [HOLD Web 35799, App 13324] Add a created report action for bill splits Dec 9, 2022
@neil-marcellini neil-marcellini marked this pull request as ready for review December 14, 2022 00:40
@neil-marcellini neil-marcellini requested a review from a team as a code owner December 14, 2022 00:40
@melvin-bot melvin-bot bot requested review from danieldoglas and removed request for a team December 14, 2022 00:41
@melvin-bot
Copy link

melvin-bot bot commented Dec 14, 2022

@danieldoglas Please copy/paste the Reviewer Checklist from here into a new comment on this PR and complete it. If you have the K2 extension, you can simply click: [this button]

@neil-marcellini
Copy link
Contributor Author

I know this is on hold but I could still use an early review @danieldoglas. Also @chiragsalian @youssef-lr @flodnv if you can take a look.

danieldoglas
danieldoglas previously approved these changes Jan 3, 2023
Copy link
Contributor

@danieldoglas danieldoglas left a comment

Choose a reason for hiding this comment

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

LGTM

@danieldoglas
Copy link
Contributor

danieldoglas commented Jan 3, 2023

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

@neil-marcellini neil-marcellini changed the title [HOLD Web 35799, App 13324] Add a created report action for bill splits [HOLD 13324] Add a created report action for bill splits Jan 6, 2023
Base automatically changed from flo_createdReportActionID to main January 12, 2023 17:54
@flodnv flodnv changed the title [HOLD 13324] Add a created report action for bill splits Add a created report action for bill splits Jan 12, 2023
@flodnv
Copy link
Contributor

flodnv commented Jan 12, 2023

@danieldoglas this is ready for you to test please 🙇 Make sure you're on the latest main of Web-E and Auth (just merged some PRs there)

@flodnv flodnv requested a review from danieldoglas January 12, 2023 17:58
@danieldoglas
Copy link
Contributor

Will test it now, building auth locally.

@danieldoglas
Copy link
Contributor

@neil-marcellini,

Test A, step 2

image

amount: splitAmount,
iouReportID: oneOnOneIOUReport.reportID,
chatReportID: oneOnOneChatReport.reportID,
createdReportActionID: oneOnOneCreatedReportActionData[0].reportActionID,
Copy link
Contributor

Choose a reason for hiding this comment

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

If, on line 368, we fill this property with {}, this will error out

return {
groupData: {
chatReportID: groupChatReport.reportID,
createdReportActionID: groupCreatedReportActionData[0].reportActionID,
Copy link
Contributor

Choose a reason for hiding this comment

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

This line too

@flodnv
Copy link
Contributor

flodnv commented Jan 13, 2023

@danieldoglas my bad, sorry 🤦 Updated and actually tested this time

@flodnv flodnv requested a review from danieldoglas January 13, 2023 13:05
@danieldoglas
Copy link
Contributor

danieldoglas commented Jan 13, 2023

@flodnv So, for the test cases that were described in the PR, it worked as expected. But there's a new warning in the console:

There's also a new warning in console.

Warning: Failed prop type: The prop `iouReport` is marked as required in `IOUAction`, but its value is `undefined`.
    at IOUAction (webpack-internal:///./src/components/ReportActionItem/IOUAction.js:81:36)
    at withNetwork(IOUAction)
    at withOnyx (webpack-internal:///./node_modules/react-native-onyx/dist/web.development.js:2095:73)
    at div
    at eval (webpack-internal:///./node_modules/@expensify/react-native-web/dist/exports/View/index.js:52:25)
    at div
    at eval (webpack-internal:///./node_modules/@expensify/react-native-web/dist/exports/View/index.js:52:25)
    at ReportActionItemSingle (webpack-internal:///./src/pages/home/report/ReportActionItemSingle.js:78:20)
    at withPersonalDetails(ReportActionItemSingle)
    at withLocalize(withPersonalDetails(ReportActionItemSingle))
    at div
    at eval (webpack-internal:///./node_modules/@expensify/react-native-web/dist/exports/View/index.js:52:25)
    at div
    at eval (webpack-internal:///./node_modules/@expensify/react-native-web/dist/exports/View/index.js:52:25)
    at OfflineWithFeedback (webpack-internal:///./src/components/OfflineWithFeedback.js:101:85)
    at withNetwork(OfflineWithFeedback)
    at withLocalize(withNetwork(OfflineWithFeedback))
    at div
    at eval (webpack-internal:///./node_modules/@expensify/react-native-web/dist/exports/View/index.js:52:25)
    at div
    at eval (webpack-internal:///./node_modules/@expensify/react-native-web/dist/exports/View/index.js:52:25)
    at div
    at eval (webpack-internal:///./node_modules/@expensify/react-native-web/dist/exports/View/index.js:52:25)
    at Hoverable (webpack-internal:///./src/components/Hoverable/index.js:39:86)
    at div
    at eval (webpack-internal:///./node_modules/@expensify/react-native-web/dist/exports/View/index.js:52:25)
    at Pressable (webpack-internal:///./node_modules/@expensify/react-native-web/dist/exports/Pressable/index.js:40:24)
    at PressableWithSecondaryInteraction (webpack-internal:///./src/components/PressableWithSecondaryInteraction/index.js:43:86)
    at ReportActionItem (webpack-internal:///./src/pages/home/report/ReportActionItem.js:127:86)
    at withReportActionsDrafts_(ReportActionItem)
    at withPrivate_blockedFromConcierge(withReportActionsDrafts_(ReportActionItem))
    at withNetwork(withPrivate_blockedFromConcierge(withReportActionsDrafts_(ReportActionItem)))
    at withWindowDimensions(withNetwork(withPrivate_blockedFromConcierge(withReportActionsDrafts_(ReportActionItem))))
    at div
    at eval (webpack-internal:///./node_modules/@expensify/react-native-web/dist/exports/View/index.js:52:25)
    at div
    at eval (webpack-internal:///./node_modules/@expensify/react-native-web/dist/exports/View/index.js:52:25)
    at VirtualizedListCellContextProvider (webpack-internal:///./node_modules/@expensify/react-native-web/dist/vendor/react-native/VirtualizedList/VirtualizedListContext.js:73:23)
    at CellRenderer (webpack-internal:///./node_modules/@expensify/react-native-web/dist/vendor/react-native/VirtualizedList/index.js:1475:86)
    at div
    at eval (webpack-internal:///./node_modules/@expensify/react-native-web/dist/exports/View/index.js:52:25)
    at div
    at eval (webpack-internal:///./node_modules/@expensify/react-native-web/dist/exports/View/index.js:52:25)
    at eval (webpack-internal:///./node_modules/@expensify/react-native-web/dist/exports/ScrollView/ScrollViewBase.js:68:24)
    at eval (webpack-internal:///./node_modules/create-react-class/factory.js:897:37)
    at ScrollView
    at VirtualizedListContextProvider (webpack-internal:///./node_modules/@expensify/react-native-web/dist/vendor/react-native/VirtualizedList/VirtualizedListContext.js:44:24)
    at VirtualizedList (webpack-internal:///./node_modules/@expensify/react-native-web/dist/vendor/react-native/VirtualizedList/index.js:170:86)
    at FlatList (webpack-internal:///./node_modules/@expensify/react-native-web/dist/vendor/react-native/FlatList/index.js:181:86)
    at BaseInvertedFlatList (webpack-internal:///./src/components/InvertedFlatList/BaseInvertedFlatList.js:60:86)
    at InvertedFlatList (webpack-internal:///./src/components/InvertedFlatList/index.js:52:86)
    at div
    at eval (webpack-internal:///./node_modules/@expensify/react-native-web/dist/exports/View/index.js:52:25)
    at AnimatedComponent (webpack-internal:///./node_modules/@expensify/react-native-web/dist/vendor/react-native/Animated/createAnimatedComponent.js:59:88)
    at AnimatedComponentWrapper
    at ReportActionsList (webpack-internal:///./src/pages/home/report/ReportActionsList.js:102:86)
    at withNetwork(ReportActionsList)
    at withPersonalDetails(withNetwork(ReportActionsList))
    at withWindowDimensions(withPersonalDetails(withNetwork(ReportActionsList)))
    at WithDrawerState (webpack-internal:///./src/components/withDrawerState.js:23:92)
    at ReportActionsView (webpack-internal:///./src/pages/home/report/ReportActionsView.js:106:86)
    at withNetwork(ReportActionsView)
    at withLocalize(withNetwork(ReportActionsView))
    at withWindowDimensions(withLocalize(withNetwork(ReportActionsView)))
    at div
    at eval (webpack-internal:///./node_modules/@expensify/react-native-web/dist/exports/View/index.js:52:25)
    at FullPageNotFoundView (webpack-internal:///./src/components/BlockingViews/FullPageNotFoundView.js:59:13)
    at withLocalize(FullPageNotFoundView)
    at Suspender (webpack-internal:///./node_modules/react-freeze/dist/index.modern.js:10:21)
    at Suspense
    at Freeze (webpack-internal:///./node_modules/react-freeze/dist/index.modern.js:30:22)
    at div
    at eval (webpack-internal:///./node_modules/@expensify/react-native-web/dist/exports/View/index.js:52:25)
    at KeyboardAvoidingView
    at div
    at eval (webpack-internal:///./node_modules/@expensify/react-native-web/dist/exports/View/index.js:52:25)
    at SafeAreaConsumer
    at ScreenWrapper (webpack-internal:///./src/components/ScreenWrapper/index.js:64:86)
    at withNetwork(ScreenWrapper)
    at withOnyx (webpack-internal:///./node_modules/react-native-onyx/dist/web.development.js:2095:73)
    at withWindowDimensions(Component)
    at WithNavigation (webpack-internal:///./src/components/withNavigation.js:23:93)
    at ReportScreen (webpack-internal:///./src/pages/home/ReportScreen.js:158:86)
    at withOnyx (webpack-internal:///./node_modules/react-native-onyx/dist/web.development.js:2095:73)
    at withNetwork(Component)
    at WithDrawerState (webpack-internal:///./src/components/withDrawerState.js:23:92)
    at withWindowDimensions(Component)
    at withLocalize(withWindowDimensions(Component))
    at StaticContainer (webpack-internal:///./node_modules/@react-navigation/core/lib/module/StaticContainer.js:13:16)
    at EnsureSingleNavigator (webpack-internal:///./node_modules/@react-navigation/core/lib/module/EnsureSingleNavigator.js:17:5)
    at SceneView (webpack-internal:///./node_modules/@react-navigation/core/lib/module/SceneView.js:23:5)
    at div
    at eval (webpack-internal:///./node_modules/@expensify/react-native-web/dist/exports/View/index.js:52:25)
    at div
    at eval (webpack-internal:///./node_modules/@expensify/react-native-web/dist/exports/View/index.js:52:25)
    at Background (webpack-internal:///./node_modules/@react-navigation/elements/lib/module/Background.js:16:5)
    at Screen (webpack-internal:///./node_modules/@react-navigation/elements/lib/module/Screen.js:24:102)
    at div
    at eval (webpack-internal:///./node_modules/@expensify/react-native-web/dist/exports/View/index.js:52:25)
    at NativeScreen (webpack-internal:///./node_modules/react-native-screens/lib/module/index.js:58:1)
    at AnimatedComponent (webpack-internal:///./node_modules/@expensify/react-native-web/dist/vendor/react-native/Animated/createAnimatedComponent.js:59:88)
    at AnimatedComponentWrapper
    at MaybeScreen (webpack-internal:///./node_modules/@react-navigation/drawer/lib/module/views/ScreenFallback.js:49:23)
    at div
    at eval (webpack-internal:///./node_modules/@expensify/react-native-web/dist/exports/View/index.js:52:25)
    at MaybeScreenContainer (webpack-internal:///./node_modules/@react-navigation/drawer/lib/module/views/ScreenFallback.js:38:22)
    at div
    at eval (webpack-internal:///./node_modules/@expensify/react-native-web/dist/exports/View/index.js:52:25)
    at div
    at eval (webpack-internal:///./node_modules/@expensify/react-native-web/dist/exports/View/index.js:52:25)
    at AnimatedComponent (webpack-internal:///./node_modules/react-native-reanimated/lib/module/createAnimatedComponent.js:143:88)
    at div
    at eval (webpack-internal:///./node_modules/@expensify/react-native-web/dist/exports/View/index.js:52:25)
    at AnimatedComponent (webpack-internal:///./node_modules/react-native-reanimated/lib/module/createAnimatedComponent.js:143:88)
    at Wrap (webpack-internal:///./node_modules/react-native-gesture-handler/lib/module/handlers/gestures/GestureDetector.js:630:86)
    at GestureDetector (webpack-internal:///./node_modules/react-native-gesture-handler/lib/module/handlers/gestures/GestureDetector.js:531:29)
    at Drawer (webpack-internal:///./node_modules/@react-navigation/drawer/lib/module/views/modern/Drawer.js:53:25)
    at DrawerViewBase (webpack-internal:///./node_modules/@react-navigation/drawer/lib/module/views/DrawerView.js:89:21)
    at div
    at eval (webpack-internal:///./node_modules/@expensify/react-native-web/dist/exports/View/index.js:52:25)
    at div
    at eval (webpack-internal:///./node_modules/@expensify/react-native-web/dist/exports/View/index.js:52:25)
    at SafeAreaProviderCompat (webpack-internal:///./node_modules/@react-navigation/elements/lib/module/SafeAreaProviderCompat.js:39:5)
    at DrawerView (webpack-internal:///./node_modules/@react-navigation/drawer/lib/module/views/DrawerView.js:298:26)
    at PreventRemoveProvider (webpack-internal:///./node_modules/@react-navigation/core/lib/module/PreventRemoveProvider.js:46:5)
    at NavigationContent (webpack-internal:///./node_modules/@react-navigation/core/lib/module/useComponent.js:11:5)
    at eval (webpack-internal:///./node_modules/@react-navigation/core/lib/module/useComponent.js:28:7)
    at DrawerNavigator (webpack-internal:///./node_modules/@react-navigation/drawer/lib/module/navigators/createDrawerNavigator.js:34:17)
    at BaseDrawerNavigator (webpack-internal:///./src/libs/Navigation/AppNavigator/BaseDrawerNavigator.js:66:86)
    at withWindowDimensions(BaseDrawerNavigator)
    at MainDrawerNavigator (webpack-internal:///./src/libs/Navigation/AppNavigator/MainDrawerNavigator.js:90:86)
    at withOnyx (webpack-internal:///./node_modules/react-native-onyx/dist/web.development.js:2095:73)
    at StaticContainer (webpack-internal:///./node_modules/@react-navigation/core/lib/module/StaticContainer.js:13:16)
    at EnsureSingleNavigator (webpack-internal:///./node_modules/@react-navigation/core/lib/module/EnsureSingleNavigator.js:17:5)
    at SceneView (webpack-internal:///./node_modules/@react-navigation/core/lib/module/SceneView.js:23:5)
    at div
    at eval (webpack-internal:///./node_modules/@expensify/react-native-web/dist/exports/View/index.js:52:25)
    at div
    at eval (webpack-internal:///./node_modules/@expensify/react-native-web/dist/exports/View/index.js:52:25)
    at div
    at eval (webpack-internal:///./node_modules/@expensify/react-native-web/dist/exports/View/index.js:52:25)
    at CardSheet (webpack-internal:///./node_modules/@react-navigation/stack/lib/module/views/Stack/CardSheet.js:19:5)
    at div
    at eval (webpack-internal:///./node_modules/@expensify/react-native-web/dist/exports/View/index.js:52:25)
    at AnimatedComponent (webpack-internal:///./node_modules/@expensify/react-native-web/dist/vendor/react-native/Animated/createAnimatedComponent.js:59:88)
    at AnimatedComponentWrapper
    at Dummy (webpack-internal:///./node_modules/@react-navigation/stack/lib/module/views/GestureHandler.js:15:5)
    at div
    at eval (webpack-internal:///./node_modules/@expensify/react-native-web/dist/exports/View/index.js:52:25)
    at AnimatedComponent (webpack-internal:///./node_modules/@expensify/react-native-web/dist/vendor/react-native/Animated/createAnimatedComponent.js:59:88)
    at AnimatedComponentWrapper
    at div
    at eval (webpack-internal:///./node_modules/@expensify/react-native-web/dist/exports/View/index.js:52:25)
    at Card (webpack-internal:///./node_modules/@react-navigation/stack/lib/module/views/Stack/Card.js:60:5)
    at CardContainer (webpack-internal:///./node_modules/@react-navigation/stack/lib/module/views/Stack/CardContainer.js:28:5)
    at div
    at eval (webpack-internal:///./node_modules/@expensify/react-native-web/dist/exports/View/index.js:52:25)
    at NativeScreen (webpack-internal:///./node_modules/react-native-screens/lib/module/index.js:58:1)
    at AnimatedComponent (webpack-internal:///./node_modules/@expensify/react-native-web/dist/vendor/react-native/Animated/createAnimatedComponent.js:59:88)
    at AnimatedComponentWrapper
    at MaybeScreen (webpack-internal:///./node_modules/@react-navigation/stack/lib/module/views/Screens.js:36:5)
    at div
    at eval (webpack-internal:///./node_modules/@expensify/react-native-web/dist/exports/View/index.js:52:25)
    at MaybeScreenContainer (webpack-internal:///./node_modules/@react-navigation/stack/lib/module/views/Screens.js:22:5)
    at div
    at eval (webpack-internal:///./node_modules/@expensify/react-native-web/dist/exports/View/index.js:52:25)
    at Background (webpack-internal:///./node_modules/@react-navigation/elements/lib/module/Background.js:16:5)
    at CardStack (webpack-internal:///./node_modules/@react-navigation/stack/lib/module/views/Stack/CardStack.js:205:5)
    at div
    at eval (webpack-internal:///./node_modules/@expensify/react-native-web/dist/exports/View/index.js:52:25)
    at SafeAreaProviderCompat (webpack-internal:///./node_modules/@react-navigation/elements/lib/module/SafeAreaProviderCompat.js:39:5)
    at div
    at eval (webpack-internal:///./node_modules/@expensify/react-native-web/dist/exports/View/index.js:52:25)
    at StackView (webpack-internal:///./node_modules/@react-navigation/stack/lib/module/views/Stack/StackView.js:40:5)
    at CustomRootStackNavigator (webpack-internal:///./src/libs/Navigation/AppNavigator/createCustomModalStackNavigator.js:32:23)
    at AuthScreens (webpack-internal:///./src/libs/Navigation/AppNavigator/AuthScreens.js:135:86)
    at withOnyx (webpack-internal:///./node_modules/react-native-onyx/dist/web.development.js:2095:73)
    at withWindowDimensions(Component)
    at AppNavigator (webpack-internal:///./src/libs/Navigation/AppNavigator/index.js:16:13)
    at EnsureSingleNavigator (webpack-internal:///./node_modules/@react-navigation/core/lib/module/EnsureSingleNavigator.js:17:5)
    at BaseNavigationContainer (webpack-internal:///./node_modules/@react-navigation/core/lib/module/BaseNavigationContainer.js:89:5)
    at ThemeProvider (webpack-internal:///./node_modules/@react-navigation/native/lib/module/theming/ThemeProvider.js:12:5)
    at NavigationContainerInner (webpack-internal:///./node_modules/@react-navigation/native/lib/module/NavigationContainer.js:44:5)
    at NavigationRoot (webpack-internal:///./src/libs/Navigation/NavigationRoot.js:78:74)
    at DeeplinkWrapper (webpack-internal:///./src/components/DeeplinkWrapper/index.website.js:68:86)
    at withLocalize(DeeplinkWrapper)
    at Expensify (webpack-internal:///./src/Expensify.js:128:86)
    at withOnyx (webpack-internal:///./node_modules/react-native-onyx/dist/web.development.js:2095:73)
    at withLocalize(Component)
    at BaseErrorBoundary (webpack-internal:///./src/components/ErrorBoundary/BaseErrorBoundary.js:51:86)
    at KeyboardStateProvider (webpack-internal:///./src/components/withKeyboardState.js:46:86)
    at WindowDimensionsProvider (webpack-internal:///./src/components/withWindowDimensions.js:58:86)
    at RenderersPropsProvider (webpack-internal:///./node_modules/react-native-render-html/lib/commonjs/context/RenderersPropsProvider.js:46:44)
    at ListStyleSpecsProvider (webpack-internal:///./node_modules/react-native-render-html/lib/commonjs/context/ListStyleSpecsProvider.js:70:3)
    at SharedPropsProvider (webpack-internal:///./node_modules/react-native-render-html/lib/commonjs/context/SharedPropsProvider.js:82:48)
    at RenderRegistryProvider (webpack-internal:///./node_modules/react-native-render-html/lib/commonjs/context/RenderRegistryProvider.js:41:3)
    at RenderHTMLConfigProvider (webpack-internal:///./node_modules/react-native-render-html/lib/commonjs/RenderHTMLConfigProvider.js:72:5)
    at TRenderEngineProvider (webpack-internal:///./node_modules/react-native-render-html/lib/commonjs/TRenderEngineProvider.js:121:3)
    at BaseHTMLEngineProvider (webpack-internal:///./src/components/HTMLEngineProvider/BaseHTMLEngineProvider.js:76:13)
    at HTMLEngineProvider (webpack-internal:///./src/components/HTMLEngineProvider/index.js:18:18)
    at withWindowDimensions(HTMLEngineProvider)
    at LocaleContextProvider (webpack-internal:///./src/components/withLocalize.js:78:86)
    at withOnyx (webpack-internal:///./node_modules/react-native-onyx/dist/web.development.js:2095:73)
    at withOnyx(LocaleContextProvider)
    at __WEBPACK_DEFAULT_EXPORT__ (webpack-internal:///./src/components/SafeArea/index.js:6:23)
    at PortalProviderComponent (webpack-internal:///./node_modules/@gorhom/portal/lib/module/components/portalProvider/PortalProvider.js:18:3)
    at div
    at eval (webpack-internal:///./node_modules/@expensify/react-native-web/dist/exports/View/index.js:52:25)
    at NativeSafeAreaProvider (webpack-internal:///./node_modules/react-native-safe-area-context/lib/module/NativeSafeAreaProvider.web.js:28:5)
    at SafeAreaProvider (webpack-internal:///./node_modules/react-native-safe-area-context/lib/module/SafeAreaContext.js:38:5)
    at Provider (webpack-internal:///./src/components/createOnyxContext.js:32:19)
    at withOnyx (webpack-internal:///./node_modules/react-native-onyx/dist/web.development.js:2095:73)
    at Provider (webpack-internal:///./src/components/createOnyxContext.js:32:19)
    at withOnyx (webpack-internal:///./node_modules/react-native-onyx/dist/web.development.js:2095:73)
    at Provider (webpack-internal:///./src/components/createOnyxContext.js:32:19)
    at withOnyx (webpack-internal:///./node_modules/react-native-onyx/dist/web.development.js:2095:73)
    at Provider (webpack-internal:///./src/components/createOnyxContext.js:32:19)
    at withOnyx (webpack-internal:///./node_modules/react-native-onyx/dist/web.development.js:2095:73)
    at Provider (webpack-internal:///./src/components/createOnyxContext.js:32:19)
    at withOnyx (webpack-internal:///./node_modules/react-native-onyx/dist/web.development.js:2095:73)
    at Provider (webpack-internal:///./src/components/createOnyxContext.js:32:19)
    at withOnyx (webpack-internal:///./node_modules/react-native-onyx/dist/web.development.js:2095:73)
    at ComposeProviders (webpack-internal:///./src/components/ComposeProviders.js:20:214)
    at OnyxProvider (webpack-internal:///./src/components/OnyxProvider.js:59:12)
    at ComposeProviders (webpack-internal:///./src/components/ComposeProviders.js:20:214)
    at div
    at eval (webpack-internal:///./node_modules/@expensify/react-native-web/dist/exports/View/index.js:52:25)
    at GestureHandlerRootView
    at App
    at div
    at eval (webpack-internal:///./node_modules/@expensify/react-native-web/dist/exports/View/index.js:52:25)
    at div
    at eval (webpack-internal:///./node_modules/@expensify/react-native-web/dist/exports/View/index.js:52:25)
    at AppContainer (webpack-internal:///./node_modules/@expensify/react-native-web/dist/exports/AppRegistry/AppContainer.js:23:24)

Also, when trying to do a split with someone that I already had a chat with (not an IOU split), it fails like this:

image

Looks like is the call from here that fails. This doesn't make a lot of sense since I don't have any IOU with that account, only a created chat.

oneOnOneIOUReport = IOUUtils.updateIOUOwnerAndTotal(

@roryabraham
Copy link
Contributor

roryabraham commented Jan 13, 2023

There's also a new warning in console ... Failed prop type: The prop iouReport is marked as required in IOUAction, but its value is undefined

I don't know if this was a new warning, but it is fixed now.

Edit: Okay now it's fixed. The important takeaway is that it's never safe to assume that any props provided by withOnyx can be required. The component cannot and should not assume that the data will be there. Especially when withOnyx is subscribing to multiple keys, the component may render when the data for one key is present but not the others. The UI should be able to handle this incomplete data.

Edit 2: Proposed a new lint rule to enforce this going forward: https://expensify.slack.com/archives/C01GTK53T8Q/p1673641691365339

@roryabraham
Copy link
Contributor

While testing this I did encounter a duplicate IOU action on a report:

image

image

Warning: Encountered two children with the same key, `.$79836681347098461`.

@roryabraham
Copy link
Contributor

roryabraham commented Jan 13, 2023

Pushed a fix to the duplicate IOU actions even though the bug wasn't introduced by this PR. Not sure how this has never come up in QA before...

Edit: Must have been caused by a recent change somewhere because I can't reproduce it on staging

@roryabraham

This comment was marked as off-topic.

@thienlnam
Copy link
Contributor

thienlnam commented Jan 13, 2023

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
Screen.Recording.2023-01-13.at.1.53.43.PM.mov
Mobile Web - Chrome
Screen.Recording.2023-01-13.at.1.58.52.PM.mov
Mobile Web - Safari
Desktop
Screen.Recording.2023-01-13.at.2.08.33.PM.mov
iOS
Screen.Recording.2023-01-13.at.2.00.17.PM.mov
Android

@thienlnam
Copy link
Contributor

thienlnam commented Jan 13, 2023

Screenshot 2023-01-13 at 2 01 41 PM

I'm still consistently running into the bug you mentioned here #13465 (comment)

From the global create menu, split a bill with 1 person you DO NOT have an existing chat with

Screen.Recording.2023-01-13.at.2.02.59.PM.mov

Happens on desktop as well

@roryabraham
Copy link
Contributor

Good testing @thienlnam, it was still happening when you split a bill with only one person. Created https://github.com/Expensify/Web-Expensify/pull/36080 to fix this.

@roryabraham roryabraham changed the title Add a created report action for bill splits [HOLD] Add a created report action for bill splits Jan 13, 2023
@mountiny mountiny changed the title [HOLD] Add a created report action for bill splits Add a created report action for bill splits Jan 16, 2023
@mountiny
Copy link
Contributor

@danieldoglas @thienlnam This is off hold!

@roryabraham
Copy link
Contributor

For transparency, there is an existing and unrelated problem with the offline Split Bill flow which was not introduced by this PR, and which I reported here

@danieldoglas
Copy link
Contributor

I've created a Split with someone that never used Expensify, and the action duplicated in the chat

image

@roryabraham
Copy link
Contributor

@danieldoglas can you please confirm that you are:

  1. On an up-to-date version of Auth main
  2. Have rebuilt Auth and restarted the Auth service in the VM
  3. On an up-to-date version on Web-Expensify main

?

@danieldoglas
Copy link
Contributor

I'm using production API, which has Web-E and Auth on latest version with the PRs that this depended on deployed. So this shouldn't be happening

@danieldoglas
Copy link
Contributor

I think it's something in the app, since one of those is appearing on top of the avatar with the Beginning of the you chat message.

The request is 78aa30ff9f13a51d-SAN

Copy link
Contributor

@danieldoglas danieldoglas left a comment

Choose a reason for hiding this comment

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

LGTM

@danieldoglas danieldoglas merged commit c5cc885 into main Jan 16, 2023
@danieldoglas danieldoglas deleted the neil-split-created-action branch January 16, 2023 23:54
@github-actions
Copy link
Contributor

Performance Comparison Report 📊

Significant Changes To Duration

There are no entries

Meaningless Changes To Duration

Show entries
Name Duration
Open Search Page TTI 621.783 ms → 637.049 ms (+15.266 ms, +2.5%)
App start runJsBundle 189.710 ms → 191.500 ms (+1.790 ms, +0.9%)
App start nativeLaunch 19.464 ms → 19.655 ms (+0.191 ms, +1.0%)
App start regularAppStart 0.014 ms → 0.016 ms (+0.002 ms, +15.0%) 🟡
App start TTI 672.649 ms → 670.745 ms (-1.904 ms, ±0.0%)
Show details
Name Duration
Open Search Page TTI Baseline
Mean: 621.783 ms
Stdev: 23.924 ms (3.8%)
Runs: 578.5418699979782 585.7267250046134 585.7932130023837 589.3854169994593 591.3924970030785 592.6297609955072 602.255656003952 611.0180659964681 613.3831790015101 615.193767003715 615.3513190001249 617.6346440017223 619.1315519958735 619.497030004859 621.7179770022631 622.3925779983401 622.640909999609 623.2061770036817 627.237955994904 628.0513099953532 631.8922529965639 632.2637939974666 636.0703129991889 637.6594650000334 639.2449140027165 641.4045409932733 642.1018480062485 656.5663250014186 672.7739259973168 681.3459069952369

Current
Mean: 637.049 ms
Stdev: 23.273 ms (3.7%)
Runs: 587.1854249984026 597.0640879943967 605.6453859955072 610.7147220000625 611.3214119970798 614.6033120006323 615.6383469998837 617.1913250014186 618.9960130006075 619.7491870000958 623.2250570058823 627.8865970000625 627.9668370038271 631.6079920008779 632.5259200036526 633.4859220013022 634.4073890000582 636.4872649982572 640.8771160021424 641.4152020066977 646.3813479989767 647.8453779965639 648.5921229943633 649.823405995965 655.4107260033488 659.7218429967761 659.8382569998503 664.7590740025043 668.4253740012646 669.041259996593 669.0485029965639 677.6739910021424 678.0731609985232
App start runJsBundle Baseline
Mean: 189.710 ms
Stdev: 26.526 ms (14.0%)
Runs: 157 157 158 162 165 165 165 168 172 172 174 178 180 185 185 186 187 187 189 192 193 193 194 200 202 218 224 231 237 240 265

Current
Mean: 191.500 ms
Stdev: 25.569 ms (13.4%)
Runs: 156 158 159 162 163 163 166 169 171 172 175 176 176 181 182 187 191 193 196 200 202 203 205 205 207 220 220 220 232 233 235 250
App start nativeLaunch Baseline
Mean: 19.464 ms
Stdev: 1.401 ms (7.2%)
Runs: 18 18 18 18 18 18 18 18 18 18 19 19 19 20 20 20 20 20 20 20 20 20 20 21 21 21 21 24

Current
Mean: 19.655 ms
Stdev: 1.445 ms (7.4%)
Runs: 17 18 18 18 18 18 18 19 19 19 19 19 19 19 20 20 20 20 20 20 20 21 21 21 21 21 21 23 23
App start regularAppStart Baseline
Mean: 0.014 ms
Stdev: 0.001 ms (4.1%)
Runs: 0.012736000120639801 0.012857995927333832 0.012898005545139313 0.012939997017383575 0.01297999918460846 0.013020999729633331 0.013143002986907959 0.01342800259590149 0.013467997312545776 0.013467997312545776 0.01354999840259552 0.01354999840259552 0.013672001659870148 0.01371300220489502 0.013793997466564178 0.013793997466564178 0.013875000178813934 0.013916000723838806 0.013916000723838806 0.014038003981113434 0.014120005071163177 0.014159999787807465 0.014159999787807465 0.01420099288225174 0.014282003045082092 0.014362998306751251 0.014363996684551239 0.01440499722957611 0.01464899629354477 0.01497400552034378

Current
Mean: 0.016 ms
Stdev: 0.001 ms (3.8%)
Runs: 0.014688998460769653 0.014770999550819397 0.014973998069763184 0.015014998614788055 0.015137001872062683 0.015137001872062683 0.015258997678756714 0.015422001481056213 0.015462003648281097 0.015544004738330841 0.015544004738330841 0.015583999454975128 0.015747003257274628 0.01578700542449951 0.015870004892349243 0.01590999960899353 0.016072995960712433 0.016113996505737305 0.016234993934631348 0.016276001930236816 0.016276001930236816 0.016356997191905975 0.016397997736930847 0.016398005187511444 0.016439005732536316 0.01672299951314926 0.01672299951314926 0.01684599369764328
App start TTI Baseline
Mean: 672.649 ms
Stdev: 35.053 ms (5.2%)
Runs: 621.0911049991846 631.4889699965715 635.201237000525 636.7795030027628 637.4746479988098 639.2900089994073 642.0603109970689 644.330012999475 645.5581249967217 649.5842429995537 652.5377769991755 655.1290299966931 655.5829100012779 655.8417010009289 656.5669270008802 657.394589997828 662.0787810012698 662.4922090023756 664.1175339967012 679.0297129973769 683.6354639977217 683.6710150018334 693.2150759994984 694.3381659984589 701.9527809992433 706.9409369975328 707.7261739969254 709.7667379975319 724.9331689998507 728.9998650029302 742.4340540021658 763.5376320034266

Current
Mean: 670.745 ms
Stdev: 36.989 ms (5.5%)
Runs: 608.5213259980083 611.2087190002203 619.0048490017653 631.6169840022922 631.8031509965658 632.3768130019307 634.4908189997077 638.568153001368 645.3646019995213 647.6521209999919 649.4107989966869 649.4219380021095 655.7937910035253 656.7084439992905 659.6220170035958 665.1652380004525 665.7848569974303 668.5514260008931 673.0838000029325 677.8738000020385 682.0458839982748 687.8939739987254 690.0185789987445 704.3974789977074 709.2691230028868 711.2661710008979 716.7012159973383 718.4374840036035 719.6265769973397 724.0832270011306 733.2477229982615 744.843313999474

@OSBotify
Copy link
Contributor

🚀 Deployed to staging by @danieldoglas in version: 1.2.56-0 🚀

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

@OSBotify
Copy link
Contributor

🚀 Deployed to production by https://github.com/AndrewGable in version: 1.2.56-0 🚀

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

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

8 participants