Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Refactor] Remove deprecated PersonalDetails.setPersonalDetails #14979

Merged
merged 9 commits into from
Feb 20, 2023

Conversation

fedirjh
Copy link
Contributor

@fedirjh fedirjh commented Feb 9, 2023

Details

  • Removed deprecated PersonalDetails.setPersonalDetails
  • Use PersonalDetails.updateAutomaticTimezone to update timezone

Fixed Issues

$ #14961
$ #14961 (comment)

Tests

  1. Open the App in Web
  2. Navigate to Settings > Profile > Timezone
  3. Check Automatically determine your location
  4. Check your current Timezone is set
  5. Open this file AuthScreens.js and comment this line

const currentTimezone = moment.tz.guess(true);

  1. Set a custom timezone different than your time zone
        // const currentTimezone = moment.tz.guess(true);
        const currentTimezone = 'Europe/London';
  1. Navigate to Settings > Profile > Timezone
  2. Confirm Timezone is updated to the custom timezone set in 7.
  • Verify that no errors appear in the JS console

Offline tests

Repeat test steps

QA Steps

Android

  1. Update the timezone on the device ( Settings > General management > Date and time)
  2. Select a custom timezone Africa/Tripoli
  3. Open App
  4. Navigate to Settings > Profile > Timezone
  5. Confirm it's update to your current timezone.
  • 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
      • 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:
    • 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 Screenshot 2023-02-09 at 1 44 59 AM
Mobile Web - Chrome Screenshot 2023-02-09 at 2 04 59 AM
Mobile Web - Safari Screenshot 2023-02-09 at 1 49 28 AM
Desktop Screenshot 2023-02-09 at 1 57 59 AM
iOS Screenshot 2023-02-09 at 1 46 54 AM
Android

Screenshot_1675904769

@fedirjh fedirjh requested a review from a team as a code owner February 9, 2023 00:38
@melvin-bot melvin-bot bot requested review from puneetlath and sobitneupane and removed request for a team February 9, 2023 00:38
@MelvinBot
Copy link

@puneetlath @sobitneupane 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]

@sobitneupane
Copy link
Contributor

@fedirjh

QA Steps should have steps to test on staging and production.

[ ] I added steps for Staging and/or Production testing in the QA steps section

@sobitneupane
Copy link
Contributor

sobitneupane commented Feb 9, 2023

@fedirjh When two screens(For example: Web and Native) are opened and automatic timezone is toggled, automatic timezone changes by itself unexpectedly.

Screen.Recording.2023-02-09.at.18.20.35.mov

@fedirjh
Copy link
Contributor Author

fedirjh commented Feb 9, 2023

QA Steps should have steps to test on staging and production.

@sobitneupane updated.

@fedirjh When two screens(For example: Web and Native) are opened and automatic timezone is toggled, automatic timezone changes by itself unexpectedly.

Unable to reproduce . Can you verify if the bug still persists before making my changes, as you can see I haven’t implemented any new logic with this PR.

Screen.Recording.2023-02-09.at.6.28.56.PM.mov

@sobitneupane
Copy link
Contributor

@fedirjh I cannot reproduce it on staging. I can reproduce it only in this PR.

@fedirjh
Copy link
Contributor Author

fedirjh commented Feb 10, 2023

@sobitneupane This is unrelated to this PR , it may be related to queued update request being executed slowly due to slow internet connection.

The code that I updated is only triggered only when automatic is set to true and the selected timezone is different from the current local timezone . This conditions are not fulfilled in your video. (your selected timezone is the same as local timezone)

Check the logic here

if (_.isObject(timezone) && timezone.automatic && timezone.selected !== currentTimezone) {

Check my demo here. I added a log line inside the code block where I made changes, and as you can see, it's not reached. You can try the same steps and confirm. Since the updated changes aren't executed, then your reported bug is not related to this PR. I hope this clarifies your doubts.

Screen.Recording.2023-02-10.at.9.39.02.PM.mov

@sobitneupane
Copy link
Contributor

@fedirjh I understand your explanation. But In the video, you can notice that timezones are different on web ("Asia/Kathmandu") and iPhone ("Asia/Katmandu").

I am pretty sure that the bug I reported has something to do with the current change because I can reproduce this issue constantly in this PR but not in main dev or staging.

My best guess is the difference in implementation of PersonalDetails.updateAutomaticTimezone and PersonalDetails.setPersonalDetails.

The other thing that I notice is that even when I have selected "Europe/London" as timezone (manually) and set my automatic timezone to "Europe/London". timezone.selected has 'Asia/Katmandu' as the value. Shouldn't it be "Europe/London" as it is the value manually selected from timezone list?

@fedirjh
Copy link
Contributor Author

fedirjh commented Feb 13, 2023

@sobitneupane Thank you for the confirmation. Now i can see it clearly . Before this PR , it was using DeprecatedAPI.SetNameValuePair which doesn’t use pusher , updateAutomaticTimezone is using pusher to notify other devices about the changes, So if we have 2 devices with different timezones , then every device will trigger a change to the timezone and once other device is notified then it will trigger another change causing an infinity loop of updates to timezone.

To fix this we should either:

  1. Implement an equivalent command to DeprecatedAPI.SetNameValuePair that updates the new automatic timezone without notifying other devices (using pusher) (should be done in backend).
  2. Stick with using DeprecatedAPI.SetNameValuePair.

cc @puneetlath , your thoughts ?

The other thing that I notice is that even when I have selected "Europe/London" as timezone (manually) and set my automatic timezone to "Europe/London". timezone.selected has 'Asia/Katmandu' as the value. Shouldn't it be "Europe/London" as it is the value manually selected from timezone list?

Did you set manually inside TimezoneInitialPage ?

@puneetlath
Copy link
Contributor

updateAutomaticTimezone is using pusher to notify other devices about the changes, So if we have 2 devices with different timezones , then every device will trigger a change to the timezone and once other device is notified then it will trigger another change causing an infinity loop of updates to timezone.

I'm not quite sure I follow this. Specifically this part:

and once other device is notified then it will trigger another change causing an infinity loop of updates to timezone.

Why does getting notified trigger a change that causes more notifications to happen?

@fedirjh
Copy link
Contributor Author

fedirjh commented Feb 14, 2023

Why does getting notified trigger a change that causes more notifications to happen?

PersonalDetails.updateAutomaticTimezone uses pusher to notify other devices about the change to timezone . However with this PR when the timezone stored in db is different the local timezone then a request will be sent to server to update to new timezone . And since we used PersonalDetails.updateAutomaticTimezone in this PR then . Then the server will notify other devices about the new timezone.

Now the case when we have two connected devices with two different timezones .

  • Device 1 make a request to update timezone.
  • Server receive the request. Update timezone and notify Device 2.
  • Device 2 receives the new updated timezone . And since the new updated timezone is different than current timezone , Device 2 will trigger a new request to update timezone ...
  • Infinity requests until one device disconnects.

To resolve this issue we need to create a new command that will store new timezone without notifying other devices.

@fedirjh
Copy link
Contributor Author

fedirjh commented Feb 16, 2023

Cc @puneetlath , what are next steps ?

@puneetlath
Copy link
Contributor

Thanks for the bump. This is the part that I'm still a little confused about:

Device 2 receives the new updated timezone . And since the new updated timezone is different than current timezone , Device 2 will trigger a new request to update timezone ...

Why does receiving a new timezone from pusher cause us to call the API? I would think that rather than creating an endpoint to update the timezone without pushing out to clients, the solution would be that when we receive a timezone update from pusher, we just store that new timezone in Onyx without calling the API.

How do other inputs handle this? For example, if I update my display name, I assume that update gets pushed out to other devices. And that they don't trigger an API call when they receive the updated display name. How do those parts of the product handle it?

@fedirjh
Copy link
Contributor Author

fedirjh commented Feb 16, 2023

Why does receiving a new timezone from pusher cause us to call the API?

we are subscribing to PERSONAL_DETAILS which holds the timezone here. When data is updated in Onyx, this callback triggers a request to update the timezone, but only if the local timezone is different from the stored timezone.

const timezone = lodashGet(val, [currentUserEmail, 'timezone'], {});
const currentTimezone = moment.tz.guess(true);
// If the current timezone is different than the user's timezone, and their timezone is set to automatic
// then update their timezone.
if (_.isObject(timezone) && timezone.automatic && timezone.selected !== currentTimezone) {
timezone.selected = currentTimezone;
PersonalDetails.setPersonalDetails({timezone});
}

I would think that rather than creating an endpoint to update the timezone without pushing out to clients, the solution would be that when we receive a timezone update from pusher, we just store that new timezone in Onyx without calling the API.

I agree that storing the new timezone in Onyx, rather than creating an endpoint, is a better solution. I have already pushed a fix for this.

How do other inputs handle this? For example, if I update my display name, I assume that update gets pushed out to other devices. And that they don't trigger an API call when they receive the updated display name. How do those parts of the product handle it?

@puneetlath Regarding other inputs, updating the timezone is a specific case because each device may have a different timezone depending on its location. In our app, we detect the local timezone and update it accordingly. If you travel to a new location, the timezone is updated automatically, which is the utility of this code. (trigger an API call with the new timezone)

@fedirjh
Copy link
Contributor Author

fedirjh commented Feb 16, 2023

cc @sobitneupane , Ready for another review !!

@sobitneupane
Copy link
Contributor

@fedirjh Can you please merge the branch with main.

Copy link
Contributor

@sobitneupane sobitneupane left a comment

Choose a reason for hiding this comment

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

Screenshots/Videos

Web
Screen.Recording.2023-02-17.at.12.11.33.mov
Mobile Web - Chrome
Screen.Recording.2023-02-17.at.12.23.56.mov
Mobile Web - Safari
Untitled.mov
Desktop
Screen.Recording.2023-02-17.at.12.14.10.mov
iOS
Screen.Recording.2023-02-17.at.13.44.14.mov
Android
Screen.Recording.2023-02-17.at.13.56.54.mov

Copy link
Contributor

@sobitneupane sobitneupane left a comment

Choose a reason for hiding this comment

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

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.

@fedirjh
Copy link
Contributor Author

fedirjh commented Feb 17, 2023

Can you please merge the branch with main.

@sobitneupane done!!

@puneetlath
Copy link
Contributor

@fedirjh for the QA steps, could they just update the timezone on their device? Would that work instead of needing to manually change the value in JS?

@fedirjh
Copy link
Contributor Author

fedirjh commented Feb 17, 2023

for the QA steps, could they just update the timezone on their device? Would that work instead of needing to manually change the value in JS?

@puneetlath, is it possible for the QA team to update the timezone on their devices instead of manually changing the value in JS? I didn't know that was an option and when I tried it on my Mac, it didn't work. However, I was able to get it to work on Android and updated the QA steps accordingly!

@puneetlath
Copy link
Contributor

@sobitneupane just wanted to double-check whether you've had a chance to test on all platforms and whether your review is complete.

sobitneupane
sobitneupane previously approved these changes Feb 20, 2023
Copy link
Contributor

@sobitneupane sobitneupane left a comment

Choose a reason for hiding this comment

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

Changes test well..

cc: @puneetlath

@puneetlath puneetlath merged commit 401cbca into Expensify:main Feb 20, 2023
@github-actions
Copy link
Contributor

Performance Comparison Report 📊

Significant Changes To Duration

There are no entries

Meaningless Changes To Duration

Show entries
Name Duration
App start TTI 697.027 ms → 730.080 ms (+33.053 ms, +4.7%)
Open Search Page TTI 614.698 ms → 624.400 ms (+9.702 ms, +1.6%)
App start runJsBundle 188.531 ms → 195.813 ms (+7.281 ms, +3.9%)
App start nativeLaunch 19.357 ms → 20.594 ms (+1.237 ms, +6.4%)
App start regularAppStart 0.022 ms → 0.015 ms (-0.007 ms, -32.7%) 🟢
Show details
Name Duration
App start TTI Baseline
Mean: 697.027 ms
Stdev: 28.591 ms (4.1%)
Runs: 635.5820610001683 646.4316090000793 656.0085880002007 661.6968999998644 665.8214659998193 667.3515619998798 671.1650219997391 673.7370579997078 679.32127700001 682.3317780001089 682.776833999902 690.4094169996679 691.0609299996868 694.6254789996892 695.243820999749 697.3339400002733 697.5655559999868 697.9678210001439 703.3969430001453 703.5592569997534 708.1719380002469 709.4632019996643 712.6660000002012 713.8440749999136 714.0773440003395 714.2135979998857 726.9171040002257 728.5583849996328 738.5664670001715 745.3162390002981 748.1608419995755 751.5080140000209

Current
Mean: 730.080 ms
Stdev: 26.281 ms (3.6%)
Runs: 684.0551279997453 689.9778960002586 691.3681870000437 701.2572189997882 702.1582819996402 702.7647730000317 703.4877880001441 706.2307249996811 708.8846909999847 709.7709990004078 713.9945660000667 722.9728189995512 724.0389360003173 725.3222869997844 730.0090699996799 730.3428180003539 731.4894880000502 732.8323309998959 734.485809000209 735.0563030000776 735.1885519996285 735.3064510002732 738.8229219997302 744.5711460001767 745.049422999844 752.9615080002695 759.2127210004255 762.2758269999176 769.1612950004637 776.0338519997895 779.2459800001234 784.2283140001819
Open Search Page TTI Baseline
Mean: 614.698 ms
Stdev: 19.179 ms (3.1%)
Runs: 579.6577559998259 583.4664719998837 588.9739990001544 590.9816899998114 592.4567869994789 593.6801349995658 597.1973470002413 601.6369230002165 602.2108970005065 602.9458010001108 604.0069180000573 604.7296559996903 609.5506600001827 613.6112470002845 615.2515469994396 615.9116209996864 616.322509999387 616.834025000222 618.6539710005745 620.1235349997878 620.9969889996573 621.3371989997104 622.2911789994687 625.3170980000868 626.0565600004047 626.4970700005069 635.0788580002263 635.6483159996569 637.286702000536 637.8325610002503 643.5423579998314 670.2492680000141

Current
Mean: 624.400 ms
Stdev: 19.998 ms (3.2%)
Runs: 588.0994879994541 595.1157630002126 598.5177410002798 601.584025000222 605.2420250000432 606.2352700000629 607.453572999686 610.8411869993433 610.9521900005639 611.3420000001788 611.9366459995508 613.4506019996479 613.8464759998024 616.7387699997053 618.2574060000479 618.7493089996278 621.5494800005108 622.5018720002845 626.4080410003662 627.8514809999615 631.1802980005741 632.6044519999996 634.8473720001057 636.2123210001737 640.7855629995465 641.9233409995213 642.7879640003666 643.340616999194 643.9995530005544 644.874958999455 646.7519530002028 650.3030200004578 688.910442000255
App start runJsBundle Baseline
Mean: 188.531 ms
Stdev: 18.732 ms (9.9%)
Runs: 151 161 162 163 166 169 175 176 176 176 179 180 180 181 183 184 185 189 196 196 197 198 201 203 203 206 212 213 214 217 220 221

Current
Mean: 195.813 ms
Stdev: 15.339 ms (7.8%)
Runs: 174 178 179 179 180 180 183 185 185 185 185 186 186 187 188 193 193 194 195 199 199 200 204 208 208 209 211 211 216 227 229 230
App start nativeLaunch Baseline
Mean: 19.357 ms
Stdev: 1.608 ms (8.3%)
Runs: 17 18 18 18 18 18 18 18 18 19 19 19 19 19 19 19 19 19 20 20 20 20 20 20 21 21 24 24

Current
Mean: 20.594 ms
Stdev: 2.276 ms (11.1%)
Runs: 18 18 18 18 19 19 19 19 19 19 19 19 19 19 19 20 20 20 20 21 21 21 22 22 22 22 23 23 24 25 26 26
App start regularAppStart Baseline
Mean: 0.022 ms
Stdev: 0.002 ms (9.1%)
Runs: 0.019247000105679035 0.01945000048726797 0.019734999164938927 0.019816000014543533 0.019896999932825565 0.0204670000821352 0.0204670000821352 0.02075199969112873 0.0208339998498559 0.020914999768137932 0.0209969999268651 0.021077999845147133 0.021606000140309334 0.021687000058591366 0.02185099944472313 0.022094999440014362 0.022420000284910202 0.022461000829935074 0.022665000520646572 0.022745000198483467 0.022785999812185764 0.022867999970912933 0.02307100035250187 0.02360100019723177 0.024210000410676003 0.0244140001013875 0.02522800024598837 0.025268999859690666 0.025674999691545963 0.0262040002271533 0.026651999913156033

Current
Mean: 0.015 ms
Stdev: 0.001 ms (6.6%)
Runs: 0.013427999801933765 0.013508999720215797 0.013997000642120838 0.01403799932450056 0.014038000255823135 0.014038000255823135 0.014119000174105167 0.014119000174105167 0.014364000409841537 0.014526000246405602 0.014527000486850739 0.01464799977838993 0.014649000018835068 0.014852000400424004 0.0148930000141263 0.014932999387383461 0.014933000318706036 0.014973999932408333 0.015095999464392662 0.01534000039100647 0.015422000549733639 0.015461999922990799 0.015461999922990799 0.015747000463306904 0.01590999960899353 0.015990999527275562 0.016316000372171402 0.016397999599575996 0.016681999899446964 0.017904000356793404

@OSBotify
Copy link
Contributor

🚀 Deployed to staging by https://github.com/puneetlath in version: 1.2.75-0 🚀

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

@OSBotify
Copy link
Contributor

🚀 Deployed to production by https://github.com/melvin-bot[bot] in version: 1.2.75-0 🚀

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

@fedirjh fedirjh deleted the Fix-14961 branch February 23, 2023 13:09
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants