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

[$500] Web - Not found page display briefly when we access the PrivateNotesListPage via deeplink #27704

Closed
1 of 6 tasks
kbecciv opened this issue Sep 18, 2023 · 76 comments
Closed
1 of 6 tasks
Assignees
Labels
External Added to denote the issue can be worked on by a contributor Reviewing Has a PR in review Weekly KSv2

Comments

@kbecciv
Copy link

kbecciv commented Sep 18, 2023

If you haven’t already, check out our contributing guidelines for onboarding and email [email protected] to request to join our Slack channel!


Action Performed:

  1. Create a workspace
  2. Click on the header of the admin room > private notes
  3. Copy the URL
  4. Logout and sign in with the URL again

Expected Result:

Not found page shouldn't display briefly

Actual Result:

Not found page display briefly

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: 1.3.71.4
Reproducible in staging?: yes
Reproducible in production?: new feature
If this was caught during regression testing, add the test name, ID and link from TestRail:
Email or phone of affected tester (no customers):
Logs: https://stackoverflow.com/c/expensify/questions/4856
Notes/Photos/Videos: Any additional supporting documentation

Screen.Recording.2023-09-19.at.01.38.34.mov
Recording.4585.mp4

Expensify/Expensify Issue URL:
Issue reported by: @dukenv0307
Slack conversation: https://expensify.slack.com/archives/C049HHMV9SM/p1694962751826829

View all open jobs on GitHub

Upwork Automation - Do Not Edit
  • Upwork Job URL: https://www.upwork.com/jobs/~010e6deeec4e90fc66
  • Upwork Job ID: 1703840373970780160
  • Last Price Increase: 2023-10-09
  • Automatic offers:
    • dukenv0307 | Reporter | 27179554
@kbecciv kbecciv added External Added to denote the issue can be worked on by a contributor Daily KSv2 Bug Something is broken. Auto assigns a BugZero manager. labels Sep 18, 2023
@melvin-bot melvin-bot bot changed the title Dev: Web - Not found page display briefly when we access the PrivateNotesListPage via deeplink [$500] Dev: Web - Not found page display briefly when we access the PrivateNotesListPage via deeplink Sep 18, 2023
@melvin-bot
Copy link

melvin-bot bot commented Sep 18, 2023

Triggered auto assignment to @abekkala (Bug), see https://stackoverflow.com/c/expensify/questions/14418 for more details.

@melvin-bot
Copy link

melvin-bot bot commented Sep 18, 2023

Job added to Upwork: https://www.upwork.com/jobs/~010e6deeec4e90fc66

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

melvin-bot bot commented Sep 18, 2023

Bug0 Triage Checklist (Main S/O)

  • This "bug" occurs on a supported platform (ensure Platforms in OP are ✅)
  • This bug is not a duplicate report (check E/App issues and #expensify-bugs)
    • If it is, comment with a link to the original report, close the issue and add any novel details to the original issue instead
  • This bug is reproducible using the reproduction steps in the OP. S/O
    • If the reproduction steps are clear and you're unable to reproduce the bug, check with the reporter and QA first, then close the issue.
    • If the reproduction steps aren't clear and you determine the correct steps, please update the OP.
  • This issue is filled out as thoroughly and clearly as possible
    • Pay special attention to the title, results, platforms where the bug occurs, and if the bug happens on staging/production.
  • I have reviewed and subscribed to the linked Slack conversation to ensure Slack/Github stay in sync

@melvin-bot
Copy link

melvin-bot bot commented Sep 18, 2023

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

@melvin-bot
Copy link

melvin-bot bot commented Sep 18, 2023

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

@kbecciv kbecciv removed the Bug Something is broken. Auto assigns a BugZero manager. label Sep 18, 2023
@kbecciv
Copy link
Author

kbecciv commented Sep 18, 2023

Proposal by: @dukenv0307
Slack conversation: https://expensify.slack.com/archives/C049HHMV9SM/p1694962751826829

Proposal

Please re-state the problem that we are trying to solve in this issue.

Not found page display briefly when we access the PrivateNotesListPage via deep link

What is the root cause of that problem?

When we access it via deep link, the report needs to load from openApp API. So the not found page displays briefly before the openApp API is complete

shouldShow={_.isEmpty(report.reportID) || (!report.isLoadingPrivateNotes && network.isOffline && _.isEmpty(lodashGet(report, 'privateNotes', {})))}

What changes do you think we should make in order to solve the problem?

We should subscribe isLoadingReportData from Onyx and update the condition to display the loading page while the report is loading. We also should move the FullScreenLoadingIndicator outside to make sure it will not display after the not found page is displayed

const shouldShowLoading = (isLoadingReportData && _.isEmpty(report.reportID)) || (report.isLoadingPrivateNotes && _.isEmpty(lodashGet(report, 'privateNotes', {})));
    const shouldShowNotFound = !shouldShowLoading && (_.isEmpty(report.reportID) || (network.isOffline && _.isEmpty(lodashGet(report, 'privateNotes', {}))));
if (shouldShowLoading) {
    return (
        <FullScreenLoadingIndicator />
    )
}
return (
    <ScreenWrapper includeSafeAreaPaddingBottom={false}>
        <FullPageNotFoundView
            shouldShow={shouldShowNotFound}
            onBackButtonPress={() => Navigation.goBack()}
        >
            <HeaderWithBackButton
                title={translate('privateNotes.title')}
                shouldShowBackButton
                onCloseButtonPress={() => Navigation.dismissModal()}
                onBackButtonPress={() => Navigation.goBack(ROUTES.getReportDetailsRoute(report.reportID))}
            />
            {_.map(privateNotes, (item, index) => getMenuItem(item, index))}
        </FullPageNotFoundView>
    </ScreenWrapper>
);

With PrivateNotesEditPage and PrivateNotesViewPage, because we don't need to call any API in this page, we can use withReportIDOrNotFound to display loading page as well

What alternative solutions did you explore? (Optional)

NA

Result

Screencast.from.17-09-2023.22.14.43.webm

@kbecciv kbecciv changed the title [$500] Dev: Web - Not found page display briefly when we access the PrivateNotesListPage via deeplink [$500] Web - Not found page display briefly when we access the PrivateNotesListPage via deeplink Sep 18, 2023
@salonikumawat28
Copy link
Contributor

salonikumawat28 commented Sep 19, 2023

Proposal

Please re-state the problem that we are trying to solve in this issue.

Not found page display briefly when we access the PrivateNotesListPage via deeplink

What is the root cause of that problem?

To show NotFoundView, we rely on condition:

shouldShow={_.isEmpty(report.reportID) || (!report.isLoadingPrivateNotes && network.isOffline && _.isEmpty(lodashGet(report, 'privateNotes', {})))}

and it returns true for few millis because report.reportID is not present for time being as the report data is not yet fetched.

What changes do you think we should make in order to solve the problem?

Solution Analysis

Before jumping to solution, here is the solution analysis:
There are three interesting scenarios for LoadingIndicator and NotFoundView pages here:

  1. We are trying to load notes of a report which is already loaded in the client -
    a. Fetch notes data and show loading icon until notes are fetched.
    b. If notes fetch successful, and notes are not empty, show the notes list.
    c. If notes fetch successful and notes are empty, show notes list with empty data.
    d. If notes fetch was unsuccessful (like network is offline), show NotFoundView
  2. We are trying to load notes of an invalid report id - In this case we don't want to fetch notes before report data is fetched because notes for invalid report id is returned as empty with a valid 200 response. So we should do following:
    a. Until report data is fetched, show loading icon.
    b. As report data fails to load because report id was invalid, show NotFoundView.
  3. We are trying to load notes of an valid report which is not yet present in client - Since we don't know whether the report is valid or not, we still need to wait for report data to be fetched before fetching notes:
    a. Until report data is fetched, show loading icon.
    b. If report data fails to load, show NotFoundView.
    c. If report data is successful, then fetch notes data and show loading icon until notes are fetched.
    d. If notes fetch successful, and notes are not empty, show the notes list.
    e. If notes fetch successful and notes are empty, show notes list with empty data.
    f. If notes fetch was unsuccessful (like network is offline), show NotFoundView

Point 3 covers all other points.

Solution

Changes in PrivateNotesListPage

We should use withReportOrNotFound for PrivateNotesListPage similar to what we use for other Report subpages like ReportSettingsPage. This ensures that we wait for report data to be fetched before fetching notes. This ensures that report is valid before fetching notes.

export default compose(
    withLocalize,
+   withReportOrNotFound,
    withOnyx({
        report: {
            key: ({route}) => `${ONYXKEYS.COLLECTION.REPORT}${route.params.reportID.toString()}`,
        },
        session: {
            key: ONYXKEYS.SESSION,
        },
        personalDetailsList: {
            key: ONYXKEYS.PERSONAL_DETAILS_LIST,
        },
    }),
    withNetwork(),
)(PrivateNotesListPage);

we can also make the NotFoundView shouldShow condition simpler as we are guaranteed now that reportId will note be empty.

        <ScreenWrapper includeSafeAreaPaddingBottom={false}>
            <FullPageNotFoundView
-               shouldShow={_.isEmpty(report.reportID) || (!report.isLoadingPrivateNotes && network.isOffline && _.isEmpty(lodashGet(report, 'privateNotes', {})))}
+               shouldShow={report.isLoadingPrivateNotes === false && network.isOffline && _.isEmpty(lodashGet(report, 'privateNotes', {}))}
                onBackButtonPress={() => Navigation.goBack()}
            >
...
Changes in PrivateNotesViewPage

Even though this problem states PrivateNotesListPage, PrivateNotesViewPage has same issue but there are 2 more problems in addition.

  1. PrivateNotesViewPage page never makes API Read call to get private notes: GetReportPrivateNote. So, even if we have report data from OpenReport API read call, we don't have private notes in it. So in addition to withReportOrNotFound, we need to make API call to fetch private notes if not present in existing report.
  2. FullScreenLoadingIndicator is not used in PrivateNotesViewPage.

Since it has additional issues, ideally we should take this as a separate issue.
Here is the fix after applying all the changes

  const privateNote = lodashGet(report, ['privateNotes', route.params.accountID, 'note'], '');
+    useEffect(() => {
+        if (_.isEmpty(report.privateNotes)) {
+            Report.getReportPrivateNote(report.reportID);
+        }
+    }, [report.reportID]);
    return (
        <ScreenWrapper
            includeSafeAreaPaddingBottom={false}
            testID={PrivateNotesViewPage.displayName}
        >
            <FullPageNotFoundView
-               shouldShow={_.isEmpty(report) || _.isEmpty(report.privateNotes) || !_.has(report, ['privateNotes', route.params.accountID, 'note'])}
+              shouldShow={report.isLoadingPrivateNotes === false && _.isEmpty(privateNote)}
                subtitleKey="privateNotes.notesUnavailable"
            >
                <HeaderWithBackButton
                    title={translate('privateNotes.title')}
                    subtitle={isCurrentUserNote ? translate('privateNotes.myNote') : `${lodashGet(personalDetailsList, [route.params.accountID, 'login'], '')} note`}
                    shouldShowBackButton
                    onCloseButtonPress={() => Navigation.dismissModal()}
                />
+                {report.isLoadingPrivateNotes && _.isEmpty(report.privateNotes) ? (
+                    <FullScreenLoadingIndicator style={[styles.flex1, styles.pRelative]} />
+                ) : (
                      <ScrollView style={[styles.flexGrow1]}>
                        <OfflineWithFeedback pendingAction={lodashGet(report, ['privateNotes', route.params.accountID, 'pendingAction'], null)}>
                            <MenuItemWithTopDescription
                                description={translate('privateNotes.composerLabel')}
                                title={privateNote}
                                onPress={() => isCurrentUserNote && Navigation.navigate(ROUTES.getPrivateNotesEditRoute(report.reportID, route.params.accountID))}
                                shouldShowRightIcon={isCurrentUserNote}
                                numberOfLinesTitle={0}
                                shouldRenderAsHTML
                                brickRoadIndicator={!_.isEmpty(lodashGet(report, ['privateNotes', route.params.accountID, 'errors'], '')) ? CONST.BRICK_ROAD_INDICATOR_STATUS.ERROR : ''}
                                disabled={!isCurrentUserNote}
                                shouldGreyOutWhenDisabled={false}
                            />
                        </OfflineWithFeedback>
                      </ScrollView>
+.                )}
            </FullPageNotFoundView>
        </ScreenWrapper>
    );

export default compose(
    withLocalize,
+  withReportOrNotFound,
    withOnyx({
        report: {
            key: ({route}) => `${ONYXKEYS.COLLECTION.REPORT}${route.params.reportID.toString()}`,
        },
        session: {
            key: ONYXKEYS.SESSION,
        },
        personalDetailsList: {
            key: ONYXKEYS.PERSONAL_DETAILS_LIST,
        },
    }),
)(PrivateNotesViewPage);

Rather than making API call from useEffect, we should actually create a new HOC called withReportAndPrivateNoteOrNotFound which will be very similar to existing withReportOrNotFound and withReportAndReportActionOrNotFound since this will be used at three places: PrivateNotesViewPage, PrivateNotesListPage and PrivateNotesEditPage.

Changes in PrivateNotesEditPage

This will be exactly similar to PrivateNotesViewPage

Solution videos

After applying the solution, here are the videos of different scenarios:
Valid report with notes:

Valid.report.with.notes.mp4

Invalid report:

Invalid.report.mp4

Valid report without notes:

Valid.report.without.notes.mp4

What alternative solutions did you explore? (Optional)

Solution exploration 1

Instead of using report.reportId in PrivateNotesListPage, use route.params.reportId as report.reportId will be empty until report data is fetched. Problem with this approach is that notes will fetch with a reportId which might be invalid. Currently BE returns valid 200 response with empty notes for an invalid reportId. Because of this problem, we will end up showing empty list in the UI instead of NotFoundView for invalid report. For invalid, report.reportId is also never set and thus out useEffect hook will also not get called once the report data fetch fails.

Solution exploration 2

Follow below pattern

Set default value of `isLoadingReportData` to true -> report data is fetched -> `report.reportID` change -> useEffect hook -> fetch notes data -> `isLoadingReportData` to false

This allows showing loading icon instead of NotFoundView right from the start. The problem with this approach is that if reportId is invalid then report.reportId is never changed and thus we never set isLoadingReportData to false and thus loading icon will appear infinitely.

@salonikumawat28
Copy link
Contributor

Regarding @dukenv0307 solution, I checked(using console logs) that in the PrivateNotesListPage is called even before the report data fetching starts and thus isLoadingReportData is false in beginning and report.reportID is empty. Thus for below logic shouldShowLoading is false and shouldShowNotFound is true momentarily in the start.

const shouldShowLoading = (isLoadingReportData && _.isEmpty(report.reportID)) || (report.isLoadingPrivateNotes && _.isEmpty(lodashGet(report, 'privateNotes', {})));
    const shouldShowNotFound = !shouldShowLoading && (_.isEmpty(report.reportID) || (network.isOffline && _.isEmpty(lodashGet(report, 'privateNotes', {}))));

Because of this, we first see NotFoundView and then Loading Icon and then we see the notes.
If the logic is used along with withReportOrNotFound then it works but in that case, the suggested changes of moving LoadingIndicator above is not required.

@dukenv0307
Copy link
Contributor

dukenv0307 commented Sep 19, 2023

@salonikumawat28 When subscribing to isLoadingReportData from Onyx, of course, we will have to set the default value for this prop to true.

@ArekChr
Copy link
Contributor

ArekChr commented Sep 22, 2023

@salonikumawat28 In your solution when opening the "My Notes" deep link there is NotFoundView shown

@melvin-bot melvin-bot bot removed the Overdue label Sep 22, 2023
@ArekChr
Copy link
Contributor

ArekChr commented Sep 22, 2023

@dukenv0307 We always trying to follow the pattern to avoid early returns with FullScreenLoadingIndicator. Could you update your proposal and include this component inside children?
Also, your proposal doesn't resolve the problem at all, as the not found page is shown briefly.

@dukenv0307
Copy link
Contributor

Also, your proposal doesn't resolve the problem at all, as the not found page is shown briefly.

@ArekChr I will update my proposal. Just a note in my proposal: we should set default isLoadingReportData as true to make this work as well.

@dukenv0307
Copy link
Contributor

dukenv0307 commented Sep 22, 2023

Proposal

Update proposal

Please re-state the problem that we are trying to solve in this issue.

Not found page display briefly when we access the PrivateNotesListPage via deep link

What is the root cause of that problem?

When we access it via deep link, the report needs to load from openApp API. So the not found page displays briefly before the openApp API is complete

shouldShow={_.isEmpty(report.reportID) || (!report.isLoadingPrivateNotes && network.isOffline && _.isEmpty(lodashGet(report, 'privateNotes', {})))}

What changes do you think we should make in order to solve the problem?

We should subscribe isLoadingReportData from Onyx and update the condition to display the loading page while the report is loading and set default value for this prop as true

const shouldShowLoading = (isLoadingReportData && _.isEmpty(report.reportID)) || (report.isLoadingPrivateNotes && _.isEmpty(lodashGet(report, 'privateNotes', {})));
const shouldShowNotFound = !shouldShowLoading && (_.isEmpty(report.reportID) || (network.isOffline && _.isEmpty(lodashGet(report, 'privateNotes', {}))));
return (
<ScreenWrapper includeSafeAreaPaddingBottom={false}>
  <FullPageNotFoundView
      shouldShow={shouldShowNotFound}
      onBackButtonPress={() => Navigation.goBack()}
  >
      {shouldShowLoading ? (
          <FullScreenLoadingIndicator /> 
      ) : (
          <>
              <HeaderWithBackButton
                  title={translate('privateNotes.title')}
                  shouldShowBackButton
                  onCloseButtonPress={() => Navigation.dismissModal()}
                  onBackButtonPress={() => Navigation.goBack(ROUTES.getReportDetailsRoute(report.reportID))}
              />
              {_.map(privateNotes, (item, index) => getMenuItem(item, index))}
          </>
      )}
      
  </FullPageNotFoundView>
</ScreenWrapper>
);

With PrivateNotesEditPage and PrivateNotesViewPage, because we don't need to call any API in this page, we can use withReportOrNotFound to display loading page as well

What alternative solutions did you explore? (Optional)

NA

Result

Screencast.from.17-09-2023.22.14.43.webm

@dukenv0307
Copy link
Contributor

@ArekChr Updated proposal.

@salonikumawat28
Copy link
Contributor

salonikumawat28 commented Sep 22, 2023

Proposal

Updated Proposal

Side note:
@ArekChr
The issue in PrivateNotesEditPage and PrivateNotesViewPage is little different from PrivateNotesListPage. In case of PrivateNotesListPage, we were making API call to get private note data but we are not doing that in others. As OpenReport doesn't fetch private notes, deep link fails for them as there is no API call to fetch private notes.

I have updated the proposal including fix for PrivateNotesEditPage and PrivateNotesViewPage as well but I feel these two should be taken in a separate issue as the root cause for both of them are different. Please check my proposal for details.

@melvin-bot melvin-bot bot added the Overdue label Sep 25, 2023
@abekkala
Copy link
Contributor

@ArekChr have you reviewed the proposals and/or have comments on them?

@melvin-bot melvin-bot bot added the Weekly KSv2 label Oct 15, 2023
@salonikumawat28
Copy link
Contributor

@ArekChr @MonilBhavsar I have raised the PR: #29636
As discussed, I have created HOC withReportAndPrivateNotesOrNotFound for this.

@salonikumawat28
Copy link
Contributor

salonikumawat28 commented Oct 15, 2023

@ArekChr @MonilBhavsar
I request reevaluation of compensation of this issue. Here are the points in favour of this reevaluation:

  1. As expected, we are fixing the raised issue for PrivateNotesListPage.
  2. In addition, we have extended the fix for similar pages like PrivateNotesViewPage and PrivateNotesEditPage as well.
  3. The fix in PrivateNotesViewPage was not similar to fix of raised PrivateNotesListPage issue as in PrivateNotesViewPage, we had to call GetReportPrivateNote in addition.
  4. To optimize private notes and reduce code duplicity, we created HOC withReportAndPrivateNotesOrNotFound. Not only useEffect code duplicity, we were able to remove page not found view and loading indicator view logic from individual components as well because of the HOC.
  5. Not found view was not consistent across list, view, edit pages of private notes. We have made it consistent.
  6. Additionally, in testing we found the offline mode behaviour to not be consistent for list, view and edit pages. We have now made the consistent behaviour for offline mode for list, view and edit pages.

What are your thoughts on this reevaluation request?

@salonikumawat28
Copy link
Contributor

@ArekChr Do you know who can help with the reevaluation request as asked above?

@abekkala
Copy link
Contributor

@ArekChr @MonilBhavsar do you have any comments on the message from @salonikumawat28

@ArekChr
Copy link
Contributor

ArekChr commented Nov 6, 2023

@MonilBhavsar, @abekkala, I agree with the reevaluation. The extra work done on PrivateNotesViewPage and PrivateNotesEditPage was not part of the original plan and has helped a lot. The new HOC is also a good improvement. I've checked everything, and it looks good.

@MonilBhavsar
Copy link
Contributor

PR was merged! 🚀
Agree with ArekChr's message above and for reevaluation 👍

@salonikumawat28
Copy link
Contributor

salonikumawat28 commented Nov 6, 2023

@MonilBhavsar Thanks for merging the PR and agreeing with the reevaluation request.
@abekkala Will you be reevaluating the amount?

@salonikumawat28
Copy link
Contributor

salonikumawat28 commented Nov 6, 2023

Here are the points in favour of this reevaluation:

  1. As expected, we are fixing the raised issue for PrivateNotesListPage.
  2. In addition, we have extended the fix for similar pages like PrivateNotesViewPage and PrivateNotesEditPage as well.
  3. The fix in PrivateNotesViewPage was not similar to fix of raised PrivateNotesListPage issue as in PrivateNotesViewPage, we had to call GetReportPrivateNote in addition.
  4. To optimize private notes and reduce code duplicity, we created HOC withReportAndPrivateNotesOrNotFound. Not only useEffect code duplicity, we were able to remove page not found view and loading indicator view logic from individual components as well because of the HOC.
  5. Not found view was not consistent across list, view, edit pages of private notes. We have made it consistent.
  6. Additionally, in testing we found the offline mode behaviour to not be consistent for list, view and edit pages. We have now made the consistent behaviour for offline mode for list, view and edit pages.

@MonilBhavsar Because of above reasons and multiple merge conflicts, our timeline for PR was exceeded and as per rules, the contract is in danger of termination. In addition, even though the issue was assigned to me, I didn't receive the upwork offer for it till now. Given these reasons, is it possible to get a exception and still receive the contact amount?

Copy link

melvin-bot bot commented Nov 7, 2023

⚠️ Looks like this issue was linked to a Deploy Blocker here

If you are the assigned CME please investigate whether the linked PR caused a regression and leave a comment with the results.

If a regression has occurred and you are the assigned CM follow the instructions here.

If this regression could have been avoided please consider also proposing a recommendation to the PR checklist so that we can avoid it in the future.

@salonikumawat28
Copy link
Contributor

Above deploy blocker is now removed and no longer a deploy blocker. In addition, the issue is unrelated to this pull request's changes.

@salonikumawat28
Copy link
Contributor

@MonilBhavsar Because of above reasons and multiple merge conflicts, our timeline for PR was exceeded and as per rules, the contract is in danger of termination. In addition, even though the issue was assigned to me, I didn't receive the upwork offer for it till now. Given these reasons, is it possible to get a exception and still receive the contact amount?

@MonilBhavsar Any thoughts on this?

@MonilBhavsar
Copy link
Contributor

I support this reasoning. PR was actively being worked on, we did increase the scope and revewing and addressing comments back and forth took some time. cc @abekkala

@salonikumawat28
Copy link
Contributor

@abekkala Since PR is deployed to prod, can you help in looking at reevaluation request and relaxing timeline request (which is approved by Monil and Arkadiusz in above comments)?

@salonikumawat28
Copy link
Contributor

@abekkala Can you help with the above comment?

@salonikumawat28
Copy link
Contributor

@ArekChr @MonilBhavsar Is there anyone else who can help here as there's no response from @abekkala ?

@abekkala
Copy link
Contributor

Yes, this was discussed with @MonilBhavsar

I don't see that the issue was auto-updated by melvin with payment date

When I review the GH it looks like payouts will be to:

  • salonikumawat28 $500 - contributor who fixed
  • ArekChr - $500 PR Review
  • dukenv0307 $50 - Bug Reporter

@salonikumawat28
Copy link
Contributor

@abekkala As @MonilBhavsar and @ArekChr also agreed that given the additional efforts, this issue should be reevaluated for the payment, can you help with that?

@salonikumawat28
Copy link
Contributor

PR was merged! 🚀 Agree with ArekChr's message above and for reevaluation 👍

@abekkala Check here for @MonilBhavsar comment agreeing for reevaluation.

@abekkala
Copy link
Contributor

Yes, I'm discussing the payment with Monil.

@abekkala
Copy link
Contributor

abekkala commented Dec 1, 2023

@salonikumawat28 @ArekChr offer has been updated to $750.

Would you like me to send that in Upwork now?

@salonikumawat28
Copy link
Contributor

@abekkala thanks for the reevaluation. Yes, let's do that.

@MonilBhavsar
Copy link
Contributor

Thanks!
@ArekChr is from Callstack expert agency and there are compensated outside of upwork, I think @abekkala

@abekkala
Copy link
Contributor

abekkala commented Dec 4, 2023

lol - yeah, I noticed that after that he is part of CS

@abekkala
Copy link
Contributor

abekkala commented Dec 4, 2023

Issue reported by: @dukenv0307 [$50] paid and contract ended - thank you! 🎉
Fix: @salonikumawat28 [$750] offer
PR Review: @ArekChr [CS - no payment in Upwork]

@salonikumawat28
Copy link
Contributor

@abekkala thanks for the offer. Accepted offer and requested payment.

Can you help me by giving a review in upwork in addition to releasing payment? Review will help me in building my profile. Thanks for the help.

@abekkala
Copy link
Contributor

abekkala commented Dec 6, 2023

@salonikumawat28 yes, reviews are always done once we process payment and end contract. 🎉

@abekkala
Copy link
Contributor

abekkala commented Dec 6, 2023

@salonikumawat28 payment sent and contract ended - thank you! 🎉

@abekkala abekkala closed this as completed Dec 6, 2023
@salonikumawat28
Copy link
Contributor

@abekkala Thanks for the review and payment 🎉

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
External Added to denote the issue can be worked on by a contributor Reviewing Has a PR in review Weekly KSv2
Projects
None yet
Development

No branches or pull requests

8 participants