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

[$1000] Dev - Pressing on ‘fix the errors’ on validation forms throw error message #13909

Closed
6 tasks
kavimuru opened this issue Dec 30, 2022 · 52 comments
Closed
6 tasks
Assignees
Labels
Bug Something is broken. Auto assigns a BugZero manager. Daily KSv2 Internal Requires API changes or must be handled by Expensify staff

Comments

@kavimuru
Copy link

kavimuru commented Dec 30, 2022

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


Action Performed:

  1. Log in any account
  2. Navigate to Settings > Any workspace > Connect bank account > Connect Manually > Press Save&Continue without any data
  3. Will show please “fix the errors” press on ‘fix the error’ > Notice in console it show error’s

Expected Result:

Pressing “fix the error” should not show any console error/warning

Actual Result:

Pressing “fix the error” shows console error/warning
’Uncaught TypeError: Cannot read properties of undefined (reading ‘left’) ' on web and on native platforms it shows ’ref.measureLayout must be called with a node handle or a ref to a native component`

Workaround:

unknown

Platforms:

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

  • Android / native
  • Android / Chrome
  • iOS / native
  • iOS / Safari
  • MacOS / Chrome / Safari
  • MacOS / Desktop

Version Number: v1.2.45-0
Reproducible in staging?: Y (tested in web)
Reproducible in production?: y (tested in web)
Email or phone of affected tester (no customers):
Logs: https://stackoverflow.com/c/expensify/questions/4856
Notes/Photos/Videos:
native
web

1

**Expensify/Expensify Issue URL:** **Issue reported by:** @dhairyasenjaliya **Slack conversation:** https://expensify.slack.com/archives/C049HHMV9SM/p1672390562408519

View all open jobs on GitHub

Upwork Automation - Do Not Edit
  • Upwork Job URL: https://www.upwork.com/jobs/~0147ce5eb30fa3ad88
  • Upwork Job ID: 1609834450585026560
  • Last Price Increase: 2023-01-02
@kavimuru kavimuru added Daily KSv2 Needs Reproduction Reproducible steps needed Bug Something is broken. Auto assigns a BugZero manager. labels Dec 30, 2022
@melvin-bot melvin-bot bot locked and limited conversation to collaborators Dec 30, 2022
@melvin-bot melvin-bot bot added the Overdue label Jan 2, 2023
@bfitzexpensify bfitzexpensify added the External Added to denote the issue can be worked on by a contributor label Jan 2, 2023
@melvin-bot melvin-bot bot unlocked this conversation Jan 2, 2023
@melvin-bot melvin-bot bot changed the title Dev - Pressing on ‘fix the errors’ on validation forms throw error message [$1000] Dev - Pressing on ‘fix the errors’ on validation forms throw error message Jan 2, 2023
@melvin-bot
Copy link

melvin-bot bot commented Jan 2, 2023

Job added to Upwork: https://www.upwork.com/jobs/~0147ce5eb30fa3ad88

@bfitzexpensify
Copy link
Contributor

Was able to reproduce.

@melvin-bot
Copy link

melvin-bot bot commented Jan 2, 2023

Current assignee @bfitzexpensify is eligible for the External assigner, not assigning anyone new.

@melvin-bot
Copy link

melvin-bot bot commented Jan 2, 2023

Triggered auto assignment to Contributor-plus team member for initial proposal review - @thesahindia (External)

@melvin-bot melvin-bot bot added the Help Wanted Apply this label when an issue is open to proposals by contributors label Jan 2, 2023
@melvin-bot
Copy link

melvin-bot bot commented Jan 2, 2023

Triggered auto assignment to @aldo-expensify (External), see https://stackoverflow.com/c/expensify/questions/7972 for more details.

@hungvu193
Copy link
Contributor

hungvu193 commented Jan 2, 2023

Proposal
This causes by the function this.form.scrollTo inside onFixTheErrorsLinkPressed return undefinded.
Solution
Remove the block of code:

// We substract 10 to scroll slightly above the input
if (focusInput.measureLayout && typeof focusInput.measureLayout === 'function') {
 focusInput.measureLayout(this.form, (x, y) => this.form.scrollTo({y: y - 10, animated: false}));
  }

or add the check if the this.form.scrollTo is a function before using it (typeof this.form.scrollTo === 'function')

+ if (focusInput.measureLayout && typeof focusInput.measureLayout === 'function' && typeof this.form.scrollTo === 'function') {
focusInput.measureLayout(this.form, (x, y) => this.form.scrollTo({y: y - 10, animated: false}));
}
Screen.Recording.2023-01-02.at.16.04.50.mov

@dhairyasenjaliya
Copy link
Contributor

Proposal

  • Here for the web we are not getting this.form.scrollTo index due to that we are receiving an undefined warning we need to add more validation to check if form.scrollTo has a valid scroll index based on that we are moving screen with the keyboard open

  • IMO we need to use _.isFunction to check & valid form.scrollTo this is already being used in many places

  • Also need to change typeof focusInput.measureLayout === 'function' to -> _.isFunction(focusInput.measureLayout)

Changes

+  if (focusInput.measureLayout && _.isFunction(focusInput.measureLayout) && _.isFunction(this.form.scrollTo)) {
     focusInput.measureLayout(this.form, (x, y) => this.form.scrollTo({y: y - 10, animated: false}));
 }

Result

Screen.Recording.2023-01-02.at.2.47.11.PM.mov

@allroundexperts
Copy link
Contributor

Proposal

The error occurs due to this.form.scrollTo being undefined. However, we need to investigate why this is undefined. None of the above proposals try to find and ultimately fix this.

Issue

this.form returns reference to the class ScrollViewWithContext instead of the ScrollView component itself. As seen here:
https://github.com/Expensify/App/blob/main/src/components/ScrollViewWithContext.js#L41-L42

Thus we need to use scrollViewRef property of the class component ScrollViewWithContext.

Fix

We need to change the following:

diff --git a/src/components/Form.js b/src/components/Form.js
index f3f4a5a0c..9f743cc73 100644
--- a/src/components/Form.js
+++ b/src/components/Form.js
@@ -275,7 +275,7 @@ class Form extends React.Component {
 
                                 // We substract 10 to scroll slightly above the input
                                 if (focusInput.measureLayout && typeof focusInput.measureLayout === 'function') {
-                                    focusInput.measureLayout(this.form, (x, y) => this.form.scrollTo({y: y - 10, animated: false}));
+                                    focusInput.measureLayout(this.form.scrollViewRef.current, (x, y) => this.form.scrollViewRef.current.scrollTo({y: y - 10, animated: false}));
                                 }
                             }}
                             containerStyles={[styles.mh0, styles.mt5, styles.flex1]}

@ali-thowfeek
Copy link

ali-thowfeek commented Jan 2, 2023

Issue

this.form does not refer to the actual relative node, which is the underlying ScrollView

Proposal

pass down / forward the ref properly to ScrollViewWithContext component

        render() {
        return (
            <ScrollView
                // eslint-disable-next-line react/jsx-props-no-spreading
                {...this.props}
-                ref={this.scrollViewRef}
+                ref={this.props.innerRef || this.scrollViewRef}
                onScroll={this.setContextScrollPosition}
                scrollEventThrottle={this.props.scrollEventThrottle || MIN_SMOOTH_SCROLL_EVENT_THROTTLE}
                scrollToOverflowEnabled
            >
                <ScrollContext.Provider
                    value={{
-                        scrollViewRef: this.scrollViewRef,
+                        scrollViewRef: this.props.innerRef || this.scrollViewRef,
                        contentOffsetY: this.state.contentOffsetY,
                    }}
                >
- export default ScrollViewWithContext;
+ export default React.forwardRef((props, ref) => <ScrollViewWithContext innerRef={ref} {...props}/>);

This gives us the flexibility to either consume it using a ScrollContext.Consumer or directly pass a ref to the ScrollViewWithContext component.

update

To address issue pointed out by @dhairyasenjaliya (#13909 (comment)) which is caused by this prop passed into ScrollView: scrollToOverflowEnabled which would happen anyway (iOS only) fixing the issue in question here.

To fix it i propose that we need to add another prop and set its default to be true:

<ScrollView
  ...
-scrollToOverflowEnabled
+scrollToOverflowEnabled={this.props.scrollToOverflowEnabled}
>

+ScrollViewWithContext.defaultProps = {scrollToOverflowEnabled: true};

And on the Form.js

<ScrollViewWithContext
    style={[styles.w100, styles.flex1]}
    contentContainerStyle={styles.flexGrow1}
    keyboardShouldPersistTaps="handled"
+  scrollToOverflowEnabled={false}
    ref={el => this.form = el}
>

Because as far as I looked, scrollToOverflowEnabled has been set to true by default in this PR (#13514) to fix an issue with WorkspacePageWithSections component. @chrispader correct me if I'm wrong. (I'm new in here 😉) So it is safe to set scrollToOverflowEnabled to false for the Form component which in turn I believe will not need any regression testing.

@bernhardoj
Copy link
Contributor

bernhardoj commented Jan 2, 2023

Proposal

We already wrap the view with ScrollViewWithContext, but we didn't consume the provided value. So, what we need to do is to wrap it again with the consumer to receive the scroll view ref.

diff --git a/src/components/Form.js b/src/components/Form.js
index f3f4a5a0c..c5b76c721 100644
--- a/src/components/Form.js
+++ b/src/components/Form.js
@@ -10,7 +10,7 @@ import * as FormActions from '../libs/actions/FormActions';
 import * as ErrorUtils from '../libs/ErrorUtils';
 import styles from '../styles/styles';
 import FormAlertWithSubmitButton from './FormAlertWithSubmitButton';
-import ScrollViewWithContext from './ScrollViewWithContext';
+import ScrollViewWithContext, { ScrollContext } from './ScrollViewWithContext';
 
 const propTypes = {
     /** A unique Onyx key identifying the form */
@@ -256,34 +256,39 @@ class Form extends React.Component {
                     keyboardShouldPersistTaps="handled"
-                    ref={el => this.form = el}
                 >
-                    <View style={[this.props.style]}>
-                        {this.childrenWrapperWithProps(this.props.children)}
-                        {this.props.isSubmitButtonVisible && (
-                        <FormAlertWithSubmitButton
-                            buttonText={this.props.submitButtonText}
-                            isAlertVisible={_.size(this.state.errors) > 0 || Boolean(this.getErrorMessage()) || !_.isEmpty(this.props.formState.errorFields)}
-                            isLoading={this.props.formState.isLoading}
-                            message={_.isEmpty(this.props.formState.errorFields) ? this.getErrorMessage() : null}
-                            onSubmit={this.submit}
-                            onFixTheErrorsLinkPressed={() => {
-                                const errors = !_.isEmpty(this.state.errors) ? this.state.errors : this.props.formState.errorFields;
-                                const focusKey = _.find(_.keys(this.inputRefs), key => _.keys(errors).includes(key));
-                                const focusInput = this.inputRefs[focusKey];
-                                if (focusInput.focus && typeof focusInput.focus === 'function') {
-                                    focusInput.focus();
-                                }
-
-                                // We substract 10 to scroll slightly above the input
-                                if (focusInput.measureLayout && typeof focusInput.measureLayout === 'function') {
-                                    focusInput.measureLayout(this.form, (x, y) => this.form.scrollTo({y: y - 10, animated: false}));
-                                }
-                            }}
-                            containerStyles={[styles.mh0, styles.mt5, styles.flex1]}
-                            enabledWhenOffline={this.props.enabledWhenOffline}
-                            isDangerousAction={this.props.isDangerousAction}
-                        />
+                    <ScrollContext.Consumer>
+                        {({scrollViewRef}) => (
+                            <View style={[this.props.style]}>
+                                {this.childrenWrapperWithProps(this.props.children)}
+                                {this.props.isSubmitButtonVisible && (
+                                <FormAlertWithSubmitButton
+                                    buttonText={this.props.submitButtonText}
+                                    isAlertVisible={_.size(this.state.errors) > 0 || Boolean(this.getErrorMessage()) || !_.isEmpty(this.props.formState.errorFields)}
+                                    isLoading={this.props.formState.isLoading}
+                                    message={_.isEmpty(this.props.formState.errorFields) ? this.getErrorMessage() : null}
+                                    onSubmit={this.submit}
+                                    onFixTheErrorsLinkPressed={() => {
+                                        const errors = !_.isEmpty(this.state.errors) ? this.state.errors : this.props.formState.errorFields;
+                                        const focusKey = _.find(_.keys(this.inputRefs), key => _.keys(errors).includes(key));
+                                        const focusInput = this.inputRefs[focusKey];
+                                        if (focusInput.focus && typeof focusInput.focus === 'function') {
+                                            focusInput.focus();
+                                        }
+
+                                        // We substract 10 to scroll slightly above the input
+                                        if (focusInput.measureLayout && typeof focusInput.measureLayout === 'function') {
+                                            focusInput.measureLayout(scrollViewRef.current, (x, y) => scrollViewRef.current.scrollTo({y: y - 10, animated: false}));
+                                        }
+                                    }}
+                                    containerStyles={[styles.mh0, styles.mt5, styles.flex1]}
+                                    enabledWhenOffline={this.props.enabledWhenOffline}
+                                    isDangerousAction={this.props.isDangerousAction}
+                                />
+                                )}
+                            </View>
                         )}
-                    </View>
+                    </ScrollContext.Consumer>
                 </ScrollViewWithContext>
             </>
         );

@dhairyasenjaliya
Copy link
Contributor

dhairyasenjaliya commented Jan 2, 2023

@allroundexperts your ultimate fix will definitely fail on the native platform since you're suggesting to take value directly from scrollViewRef which will be different (x,y) values than the actual this.form(x,y) results in regression on the native platform will create jump effect on every click and on second click the from will stuck on top

  • this regression applies even on adding ScrollContext.Consumer to <Form/>
Simulator.Screen.Recording.-.iPhone.14.Pro.Max.-.2023-01-02.at.16.21.37.mp4

@allroundexperts
Copy link
Contributor

@dhairyasenjaliya I'm not sure if this regression was ever fixed correctly. Even on native, this.form points to ref of the class component. When supplying it to measureLayout, we're getting this error:
Screenshot 2023-01-02 at 9 50 35 PM
As such, the this.form.scrollTo is undefined on native as well. Would be better to remove this functionality entirely since this is not available on any platform.

@ali-thowfeek
Copy link

ali-thowfeek commented Jan 2, 2023

@allroundexperts
As per the doc of <ScrollViewWithContext />:

<ScrollViewWithContext /> can be used as a direct replacement for <ScrollView />

So its ref was supposed to have measureLayout and scrollTo functions.

But the issue is that the ref is not forwarded to the underlying ScrollView. So right now the ref is bound to the wrapping component itself, which obviously doesn't have measureLayout or scrollTo causing the issue.

@fedirjh
Copy link
Contributor

fedirjh commented Jan 2, 2023

Proposal

I agree with @ali-thowfeek approach , the root cause is that the used ref in Form.js isn't forwarded , and based on this comment #11391 (comment) , I think it is wise to use the ref provided by ScrollViewWithContext , after all the ScrollContext utility is to provide a ref that can be used by children.
Here is an implementation in /src/components/Picker/index.js that uses the provided ref this.context.scrollViewRef

scrollViewRef={this.context && this.context.scrollViewRef}
scrollViewContentOffsetY={this.context && this.context.contentOffsetY}
/>

We can use same implementation for the Form.js

diff --git a/src/components/Form.js b/src/components/Form.js
index f3f4a5a0cf..c8d77412b4 100644
--- a/src/components/Form.js
+++ b/src/components/Form.js
@@ -10,7 +10,7 @@ import * as FormActions from '../libs/actions/FormActions';
 import * as ErrorUtils from '../libs/ErrorUtils';
 import styles from '../styles/styles';
 import FormAlertWithSubmitButton from './FormAlertWithSubmitButton';
-import ScrollViewWithContext from './ScrollViewWithContext';
+import ScrollViewWithContext, {ScrollContext} from './ScrollViewWithContext';
 
 const propTypes = {
     /** A unique Onyx key identifying the form */
@@ -254,7 +254,6 @@ class Form extends React.Component {
                     style={[styles.w100, styles.flex1]}
                     contentContainerStyle={styles.flexGrow1}
                     keyboardShouldPersistTaps="handled"
-                    ref={el => this.form = el}
                 >
                     <View style={[this.props.style]}>
                         {this.childrenWrapperWithProps(this.props.children)}
@@ -273,9 +272,9 @@ class Form extends React.Component {
                                     focusInput.focus();
                                 }
 
-                                // We substract 10 to scroll slightly above the input
-                                if (focusInput.measureLayout && typeof focusInput.measureLayout === 'function') {
-                                    focusInput.measureLayout(this.form, (x, y) => this.form.scrollTo({y: y - 10, animated: false}));
+                                // We subtract 10 to scroll slightly above the input
+                                if (focusInput.measureLayout && typeof focusInput.measureLayout === 'function' && this.context && this.context.scrollViewRef) {
+                                    focusInput.measureLayout(this.context.scrollViewRef, (x, y) => this.context.scrollViewRef.scrollTo({y: y - 10, animated: false}));
                                 }
                             }}
                             containerStyles={[styles.mh0, styles.mt5, styles.flex1]}
@@ -292,6 +291,7 @@ class Form extends React.Component {
 
 Form.propTypes = propTypes;
 Form.defaultProps = defaultProps;
+Form.contextType = ScrollContext;
 
 export default compose(
     withLocalize,

@thesahindia
Copy link
Member

Sorry for the delay, I will look into this in a few hours.

@ali-thowfeek
Copy link

Proposal 2

Guys, as far I looked <ScrollViewWithContext> would only make sense when there is a <Picker> component as a child. If not we could simply swap it to a <ScrollView> which I believe would give us a performance boost because <ScrollViewWithContext> uses a Provider and it has a state contentOffsetY as the Provider value which is constantly updated onScroll. Which ultimately would re-render on each update as per the React documentation:

All consumers that are descendants of a Provider will re-render whenever the Provider’s value prop changes. The propagation from Provider to its descendant consumers (including .contextType and useContext) is not subject to the shouldComponentUpdate method, so the consumer is updated even when an ancestor component skips an update.

So I propose that we have a Prop on <Form> as useScrollViewWithContext and use the appropriate component: <ScrollViewWithContext> or <ScrollView> depending on its value. And we could set useScrollViewWithContext default to be false also.

Also this would fix the issue with scrollToOverflowEnabled on iOS.

what do you think @fedirjh ?

@aldo-expensify
Copy link
Contributor

Just coming back from OOO.

I introduced that bit of code (measureLayout) here: #13499 when trying to redo something another reverted PR did.

Thanks for the investigation so far. I'll make this internal meanwhile to catch up with the conversation and decide what to do next.

@aldo-expensify
Copy link
Contributor

aldo-expensify commented Jan 10, 2023

@thesahindia why is this proposal downvoted? It seems to fix the issue, draft PR: #14209

Regarding this comment: #13909 (comment) , I wouldn't say that this proposal causes that regression because that is the behaviour we had before the PR #13514 broke this. That behaviour is fine IMO.

From reading further proposals, this one also seems to be fixing the reference issue, but in a better way? #13909 (comment) I say a better way because I understand that then we can use the ref on ScrollViewWithContext the same way we would with ScrollView.

I understand the possible performance issues mentioned here #13909 (comment) but maybe we should measure and see if it is a real problem before doing anything.

Anyway, there is a lot of information here and thanks a lot for all the discussion/investigation done so far!. I'll come back to it tomorrow because it is the end of my day.

@thesahindia
Copy link
Member

Regarding this comment: #13909 (comment) , I wouldn't say that #13909 (comment) causes that regression because that is the behaviour we had before the PR #13514 broke this.

No this behaviour wasn't present before #13514

This is the result we get after using the solution suggested at #13909 (comment) -

Screen.Recording.2023-01-12.at.2.31.13.AM.mov

@thesahindia
Copy link
Member

this one also seems to be fixing the reference issue, but in a better way? #13909 (comment) I say a better way because I understand that then we can use the ref on ScrollViewWithContext the same way we would with ScrollView.

We will get error on ios when we tap on the picker (if it's at bottom)
I added some top margin to repro this

210420283-9ebb415b-84e7-4d69-82fb-f8dde589cfe6.mov

@aldo-expensify
Copy link
Contributor

Regarding this comment: #13909 (comment) , I wouldn't say that #13909 (comment) causes that regression because that is the behaviour we had before the PR #13514 broke this.

No this behaviour wasn't present before #13514

This is the result we get after using the solution suggested at #13909 (comment) -

Screen.Recording.2023-01-12.at.2.31.13.AM.mov

Ahh, I see it now in IOS, thanks!

@parasharrajat
Copy link
Member

I think we can let chrispader handle the regression from that PR if we are still figuring out the solution for it. The regression period was still active on that PR.

@aldo-expensify
Copy link
Contributor

I think we can let chrispader handle the regression from that PR if we are still figuring out the solution for it. The regression period was still active on that PR.

Sounds like a good idea to me. @chrispader do you mind helping with this investigation?

@aldo-expensify aldo-expensify removed the Reviewing Has a PR in review label Jan 17, 2023
@melvin-bot melvin-bot bot added the Overdue label Jan 17, 2023
@melvin-bot
Copy link

melvin-bot bot commented Jan 18, 2023

@bfitzexpensify, @thesahindia, @aldo-expensify Huh... This is 4 days overdue. Who can take care of this?

@aldo-expensify
Copy link
Contributor

DM's @chrispader in slack to see if we can get some help from him. Otherwise, tomorrow I'll start having a look at this again

@melvin-bot melvin-bot bot removed the Overdue label Jan 18, 2023
@chrispader
Copy link
Contributor

chrispader commented Jan 19, 2023

I think @ali-thowfeek is right, we shouldn't be using <ScrollViewWithContext /> component if it's not used by any nested pickers.

A slight slight modification of @ali-thowfeek's second proposal where we have two props such as scrollToOverflowEnabled and scrollContextEnabled should do the trick. (i think we shouldn't use prop names starting with "use", since this indicates hooks in React)

This way, we can manually enable the ScrollContext in all pages/forms with picker(s) and use the normal ScrollView on all other pages/forms.

By default, scrollToOverflowEnabled should be false. This is useful, when there's a picker at the very bottom of the page. In this case, scrollToOverflowEnabled on the ScrollView should be set to true, otherwise scrolling to the picker won't work.

scrollContextEnabled should also be false by default and we'd have to enable it on all <Form />'s containing a nested picker somewhere.

Also, my fault that i forgot to forward the ref in <ScrollViewWithContext />, so i'll add that too.

@chrispader
Copy link
Contributor

Turns out that (either some pages have changed since i implemented this feature or) i missed some pages that have <StatePicker /> or <LocalePicker /> components instead of the regular <Picker />.

I think these changes also fit pretty well into a PR on this regression, so i'd just add those fixes too

@chrispader
Copy link
Contributor

By default, scrollToOverflowEnabled should be false. This is useful, when there's a picker at the very bottom of the page. In this case, scrollToOverflowEnabled on the ScrollView should be set to true, otherwise scrolling to the picker won't work.

Here's a comparison on that: (i added some extra space between the picker and the rest of the form to illustrate this)

scrollToOverflowEnabled set to false:

Simulator.Screen.Recording.-.iPhone.14.Pro.-.2023-01-19.at.12.51.47.mp4

scrollToOverflowEnabled set to true:

Simulator.Screen.Recording.-.iPhone.14.Pro.-.2023-01-19.at.12.52.45.mp4

@melvin-bot melvin-bot bot added the Reviewing Has a PR in review label Jan 19, 2023
@aldo-expensify aldo-expensify removed Needs Reproduction Reproducible steps needed Help Wanted Apply this label when an issue is open to proposals by contributors labels Feb 1, 2023
@thesahindia
Copy link
Member

@bfitzexpensify, the C+ compensation is pending here
Also I think the reporting compensation for @dhairyasenjaliya is due.

@dhairyasenjaliya
Copy link
Contributor

yup, thanks for reminding totally forgot it!

@bfitzexpensify
Copy link
Contributor

Appreciate the reminder @thesahindia! Strange that the bot didn't highlight this as being pushed to prod.

Upwork job had expired so I've sent new offers out to yourself and @dhairyasenjaliya

@bfitzexpensify bfitzexpensify removed the Reviewing Has a PR in review label Feb 7, 2023
@thesahindia
Copy link
Member

Accepted, thanks!

@bfitzexpensify
Copy link
Contributor

bfitzexpensify commented Feb 7, 2023

BugZero Checklist: The PR fixing this issue has been merged! The following checklist (instructions) will need to be completed before the issue can be closed:

@thesahindia
Copy link
Member

The PR that introduced the bug has been identified. Link to the PR:

#13514

The offending PR has been commented on, pointing out the bug it caused and why, so the author and reviewers can learn from the mistake. Link to comment:

#13514 (comment)

A discussion in #expensify-bugs has been started about whether any other steps should be taken (e.g. updating the PR review checklist) in order to catch this type of bug sooner. Link to discussion:

https://expensify.slack.com/archives/C01GTK53T8Q/p1675842327530259

@thesahindia
Copy link
Member

A regression test has been added or updated so that the same bug will not reach production again. Link to the GH issue for creating the test here:

I believe we already have regression tests for this? No need for new steps?

@bfitzexpensify
Copy link
Contributor

A regression test has been added or updated so that the same bug will not reach production again. Link to the GH issue for creating the test here:

Agreed. Thank you for the other links @thesahindia!

Checklist complete, closing issue

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Bug Something is broken. Auto assigns a BugZero manager. Daily KSv2 Internal Requires API changes or must be handled by Expensify staff
Projects
None yet
Development

No branches or pull requests