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] Attachments - Image preview did not load immediately after being received #51699

Closed
2 of 8 tasks
isagoico opened this issue Oct 29, 2024 · 61 comments
Closed
2 of 8 tasks
Assignees
Labels
AutoAssignerNewDotQuality Used to assign quality issues to engineers Bug Something is broken. Auto assigns a BugZero manager. Daily KSv2 External Added to denote the issue can be worked on by a contributor Help Wanted Apply this label when an issue is open to proposals by contributors

Comments

@isagoico
Copy link

isagoico commented Oct 29, 2024

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


Version Number: 9.0.54-11
Reproducible in staging?: Yes
Reproducible in production?: Unknown

Email or phone of affected tester (no customers): [email protected]
Logs: https://stackoverflow.com/c/expensify/questions/4856

Issue reported by: @mallenexpensify
Slack conversation: #quality

Deliverable

The deliverable is to provide reliable reproduction steps for the bug. - Follow the Propose a solution for a job process to submit the steps for review”. Inc. preconditions and additional details if they’re helpful. (ie. require x beta to be enabled, must be on a Collect plan)

Action Performed:

Precondition: Both user A and B are online at the same time. User A is logged in on Desktop app.

  1. As user B - Send a attachment to user A
  2. As user A - Check the attachment

Expected Result:

Image preview is displayed in the conversation history

Actual Result:

Grey box shows, image doesn't auto-load (it does load later)

Workaround:

Can the user still use Expensify without this being fixed? Have you informed them of the workaround?

Platforms:

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

  • Android: Standalone
  • Android: HybridApp
  • Android: mWeb Chrome
  • iOS: Standalone
  • iOS: HybridApp
  • iOS: mWeb Safari
  • MacOS: Chrome / Safari
  • MacOS: Desktop

Screenshots/Videos

image

onyx data image not showing.txt

View all open jobs on GitHub

Upwork Automation - Do Not Edit
  • Upwork Job URL: https://www.upwork.com/jobs/~021851730798154046033
  • Upwork Job ID: 1851730798154046033
  • Last Price Increase: 2024-11-26
Issue OwnerCurrent Issue Owner: @mallenexpensify
@isagoico isagoico added Daily KSv2 Needs Reproduction Reproducible steps needed Bug Something is broken. Auto assigns a BugZero manager. labels Oct 29, 2024
Copy link

melvin-bot bot commented Oct 29, 2024

Triggered auto assignment to @strepanier03 (Bug), see https://stackoverflow.com/c/expensify/questions/14418 for more details. Please add this bug to a GH project, as outlined in the SO.

@MelvinBot
Copy link

This has been labelled "Needs Reproduction". Follow the steps here: https://stackoverflowteams.com/c/expensify/questions/16989

@mallenexpensify
Copy link
Contributor

This just happened again too
SnagitHelper2024 2024-10-29 17 31 41

SnagitHelper2024 2024-10-29 17 31 13
{
    "chatType": "policyRoom",
    "currency": "USD",
    "description": "",
    "errorFields": {},
    "hasOutstandingChildRequest": false,
    "hasOutstandingChildTask": false,
    "isCancelledIOU": false,
    "isOwnPolicyExpenseChat": false,
    "isPinned": false,
    "isWaitingOnBankAccount": false,
    "lastActionType": "ADDCOMMENT",
    "lastActorAccountID": "17703070",
    "lastMentionedTime": "2023-09-12 20:11:05.035",
    "lastMessageHtml": "<img src=\"https://www.expensify.com/chat-attachments/7836315334713329999/w_0b2547306b56ed7fdfc3a3c3cfed6b4a8e587b86.png.1024.jpg\" data-expensify-source=\"https://www.expensify.com/chat-attachments/7836315334713329999/w_0b2547306b56ed7fdfc3a3c3cfed6b4a8e587b86.png\" data-name=\"7D7A10CD-0856-4673-9F57-83625709C322.png\" data-expensify-height=\"1080\" data-expensify-width=\"1080\" />",
    "lastMessageText": "[Attachment]",
    "lastReadSequenceNumber": 0,
    "lastReadTime": "2024-10-30 00:30:34.852",
    "lastVisibleActionCreated": "2024-10-30 00:30:21.545",
    "lastVisibleActionLastModified": "2024-10-30 00:30:21.545",
    "nonReimbursableTotal": 0,
    "notificationPreference": "always",
    "oldPolicyName": "",
    "ownerAccountID": 0,
    "participants": {
        "1": {
            "hidden": false,
            "notificationPreference": "daily"
        },
        "297463": {
            "hidden": false,
            "notificationPreference": "daily"
        },
        "666702": {
            "hidden": false,
            "notificationPreference": "daily"
        },
        "3806748": {
            "hidden": false,
            "notificationPreference": "daily"
        },
        "4087621": {
            "hidden": false,
            "notificationPreference": "always"
        },
        "14974237": {
            "hidden": false,
            "notificationPreference": "daily"
        },
        "15320017": {
            "hidden": false,
            "notificationPreference": "daily"
        },
        "15320018": {
            "hidden": false,
            "notificationPreference": "daily"
        },
        "15320019": {
            "hidden": false,
            "notificationPreference": "daily"
        },
        "15320020": {
            "hidden": true,
            "notificationPreference": "hidden"
        },
        "15320021": {
            "hidden": false,
            "notificationPreference": "daily"
        },
        "15320022": {
            "hidden": false,
            "notificationPreference": "daily"
        },
        "15320024": {
            "hidden": false,
            "notificationPreference": "daily"
        },
        "15320025": {
            "hidden": false,
            "notificationPreference": "daily"
        },
        "15320026": {
            "hidden": false,
            "notificationPreference": "daily"
        },
        "15320028": {
            "hidden": false,
            "notificationPreference": "daily"
        },
        "15320034": {
            "hidden": false,
            "notificationPreference": "daily"
        },
        "15320035": {
            "hidden": false,
            "notificationPreference": "daily"
        },
        "15320036": {
            "hidden": false,
            "notificationPreference": "daily"
        },
        "15320037": {
            "hidden": false,
            "notificationPreference": "daily"
        },
        "15320038": {
            "hidden": false,
            "notificationPreference": "daily"
        },
        "15320039": {
            "hidden": false,
            "notificationPreference": "daily"
        },
        "15320040": {
            "hidden": false,
            "notificationPreference": "always"
        },
        "15320041": {
            "hidden": false,
            "notificationPreference": "daily"
        },
        "15320042": {
            "hidden": false,
            "notificationPreference": "daily"
        },
        "15320079": {
            "hidden": false,
            "notificationPreference": "daily"
        },
        "15320603": {
            "hidden": false,
            "notificationPreference": "daily"
        },
        "15586896": {
            "hidden": false,
            "notificationPreference": "daily"
        },
        "15983228": {
            "hidden": false,
            "notificationPreference": "daily"
        },
        "16011549": {
            "hidden": false,
            "notificationPreference": "daily"
        },
        "16080975": {
            "hidden": false,
            "notificationPreference": "daily"
        },
        "16080978": {
            "hidden": false,
            "notificationPreference": "daily"
        },
        "16131868": {
            "hidden": false,
            "notificationPreference": "daily"
        },
        "16474093": {
            "hidden": false,
            "notificationPreference": "daily"
        },
        "16474094": {
            "hidden": false,
            "notificationPreference": "daily"
        },
        "16486925": {
            "hidden": false,
            "notificationPreference": "daily"
        },
        "16499795": {
            "hidden": false,
            "notificationPreference": "daily"
        },
        "16542756": {
            "hidden": false,
            "notificationPreference": "daily"
        },
        "16557316": {
            "hidden": false,
            "notificationPreference": "daily"
        },
        "16713755": {
            "hidden": false,
            "notificationPreference": "daily"
        },
        "17362155": {
            "hidden": false,
            "notificationPreference": "daily"
        },
        "17506865": {
            "hidden": false,
            "notificationPreference": "daily"
        },
        "17703070": {
            "hidden": false,
            "notificationPreference": "daily"
        },
        "17870072": {
            "hidden": false,
            "notificationPreference": "daily"
        },
        "18471017": {
            "hidden": false,
            "notificationPreference": "daily"
        }
    },
    "permissions": [
        "read",
        "write",
        "share"
    ],
    "policyAvatar": "",
    "policyID": "1CAFAAA6EAD09539",
    "policyName": "Midtown Beer Garden",
    "private_isArchived": "",
    "reportID": "4764707605323013",
    "reportName": "#midtown-beer-garden-vendors-and-management",
    "stateNum": 0,
    "statusNum": 0,
    "total": 0,
    "type": "chat",
    "unheldNonReimbursableTotal": 0,
    "unheldTotal": 0,
    "visibility": "restricted",
    "welcomeMessage": "",
    "writeCapability": "all",
    "state": "OPEN",
    "lastMessageTranslationKey": "",
    "isEdited": true,
    "managerID": 0
}

@tgolen
Copy link
Contributor

tgolen commented Oct 30, 2024

I witnessed this happening in a FullStory session for https://github.com/Expensify/Expensify/issues/439858. There isn't much for reproduction steps, they were trying to upload screenshots to concierge.

@isagoico
Copy link
Author

I just experienced this in my conversation with Matt in Web.
image
image

My steps were:

  1. I had the NewDot tab open but had not interacted with it for a while
  2. I received the email notification which prompted me to go back to the tab
  3. Tab opened and the image was not displayed

@mallenexpensify mallenexpensify changed the title Attachments - Image preview did not load immediately after being received [$250 Reproduction Steps] Attachments - Image preview did not load immediately after being received Oct 30, 2024
@mallenexpensify mallenexpensify added the External Added to denote the issue can be worked on by a contributor label Oct 30, 2024
@melvin-bot melvin-bot bot changed the title [$250 Reproduction Steps] Attachments - Image preview did not load immediately after being received [$250] [$250 Reproduction Steps] Attachments - Image preview did not load immediately after being received Oct 30, 2024
Copy link

melvin-bot bot commented Oct 30, 2024

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

@mallenexpensify mallenexpensify self-assigned this Oct 30, 2024
@melvin-bot melvin-bot bot added the Help Wanted Apply this label when an issue is open to proposals by contributors label Oct 30, 2024
Copy link

melvin-bot bot commented Oct 30, 2024

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

@melvin-bot melvin-bot bot removed the Help Wanted Apply this label when an issue is open to proposals by contributors label Oct 30, 2024
@mallenexpensify mallenexpensify changed the title [$250] [$250 Reproduction Steps] Attachments - Image preview did not load immediately after being received [$250] [Reproduction Steps] Attachments - Image preview did not load immediately after being received Oct 30, 2024
@mallenexpensify
Copy link
Contributor

mallenexpensify commented Oct 30, 2024

Trying to nip this in the bud a bit since a few of us have experienced the bug but can't reliably reproduce.
Let's try to get reproduction steps first then see what might be going on.

Posted in #expensify-open-source too

@mallenexpensify mallenexpensify added the Help Wanted Apply this label when an issue is open to proposals by contributors label Oct 30, 2024
@CyberAndrii
Copy link
Contributor

CyberAndrii commented Oct 31, 2024

Precondition:

  • Have a verified account
  • Disable cache
    image

Reproduction steps 1

  1. Go to staging or dev (not production because Onyx.merge doesn't work there)
  2. Open a chat (e.g with concierge)
  3. Run the following code in the console. It works similarly to invalidateAuthToken() but also resets encryptedAuthToken - that's the token used specifically to fetch attachments. This step simulates auth token rotation that happens every 2 hours.
    Onyx.merge('session', {authToken: 'pizza', encryptedAuthToken: 'pizza'});
  4. Open a chat that has an image
  5. Observe the image's preview is not loaded
  6. Note that the image request was made before Authenticate meaning it used an expired token
Video
51699.1.webm

Reproduction steps 2

  1. Go to staging or dev (not production because Onyx.merge doesn't work there)
  2. Open a chat that has an image
  3. Run the command from the previous repro steps
  4. Click on the image
  5. Observe the image is not loaded
Video
51699.2.webm

Reproduction steps 3

(same as #44445 (comment))

  1. Log into OldDot with a gmail account
  2. Create a collect policy, Settings > Workspaces > Group > New workspace
  3. Create a report Reports > New Report
  4. Add a comment to it and an attachment (not receipt)
  5. Log into NewDot with the same gmail account
  6. Navigate to the report
  7. Observe the image is not loaded
Video
51699.mov

@mallenexpensify
Copy link
Contributor

Thx @CyberAndrii .
@abdulrahuman5196 can you attempt reproduction based on @CyberAndrii 's steps above? Thx

@mallenexpensify
Copy link
Contributor

Just happened again to me. Vague repro steps

  • Had Desktop closed overnight
  • Saw comment in a thread that I'm subscribed to
  • Clicked on the thread in LHN after it being there for ~5 mins
  • thread opened, showed loading spinner then this
SnagitHelper2024 2024-11-01 10 17 31

Posted in #contributor-plus for bonus 👀 too

@mallenexpensify mallenexpensify added the AutoAssignerNewDotQuality Used to assign quality issues to engineers label Nov 2, 2024
@melvin-bot melvin-bot bot added the Overdue label Nov 2, 2024
@muttmuure muttmuure moved this from Done to CRITICAL in [#whatsnext] #quality Nov 25, 2024
@mallenexpensify mallenexpensify changed the title [$250] [Reproduction Steps] Attachments - Image preview did not load immediately after being received [$500] [Reproduction Steps] Attachments - Image preview did not load immediately after being received Nov 26, 2024
Copy link

melvin-bot bot commented Nov 26, 2024

Upwork job price has been updated to $500

@mallenexpensify mallenexpensify added Weekly KSv2 and removed Daily KSv2 labels Nov 26, 2024
@mallenexpensify mallenexpensify changed the title [$500] [Reproduction Steps] Attachments - Image preview did not load immediately after being received [$250] [Reproduction Steps] Attachments - Image preview did not load immediately after being received Nov 26, 2024
Copy link

melvin-bot bot commented Nov 26, 2024

Upwork job price has been updated to $250

@mallenexpensify mallenexpensify changed the title [$250] [Reproduction Steps] Attachments - Image preview did not load immediately after being received [$500] Attachments - Image preview did not load immediately after being received Nov 26, 2024
Copy link

melvin-bot bot commented Nov 26, 2024

Upwork job price has been updated to $500

@mallenexpensify mallenexpensify removed the Needs Reproduction Reproducible steps needed label Nov 26, 2024
@mallenexpensify
Copy link
Contributor

Sorry y'all, a lil behind on this one.
It looks like @CyberAndrii was able to outline the steps to reproduce and @abdulrahuman5196 was able to reproduce using those steps. I'm planning to pay out @CyberAndrii for the steps unless anyone disagrees with the process used (ie. the steps reproduce 'a' version of the bug but it's not directly related to the actual bug that's occurring).

I removed 'reproducible steps' in the title and bumped the job price to $500. I'm assuming the reproduction steps would help someone submit a proposal.

@CyberAndrii , did you also want to submit a proposal to fix the bug? Also, can you please accept the job and reply here once you have? https://www.upwork.com/jobs/~021851730798154046033

@mallenexpensify mallenexpensify added Daily KSv2 and removed Weekly KSv2 labels Nov 26, 2024
@Kalydosos
Copy link
Contributor

Kalydosos commented Nov 26, 2024

Edited by proposal-police: This proposal was edited at 2024-11-26 06:51:49 UTC.

Proposal

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

Image preview did not load immediately after being received and CORS error is displayed

What is the root cause of that problem?

There are in fact 2 causes to this issue

cause 1 Some attachments are seen as of external source
These attachments miss the data-expensify-source attribute and then are requested from the BE without authentication token. Per example the attachment in the image below (see in video below also)
old_structure_textimage_comment

"html": "fixpdf10 updated<br /><br /><img src="https://www.expensify.com/chat-attachments/3502317922698459004/w_b0b3af58e7d67648f4a81469e82f9e0f409960d4.jpg.1024.jpg" alt="w_b0b3af58e7d67648f4a81469e82f9e0f409960d4.jpg.1024.jpg" />",
"text": "fixpdf10 updated\n\n[Attachment]",

they are requested without authentication token from the following lines

if (isAuthTokenRequired && authToken) {
return {
...propsSource,
headers: {
[CONST.CHAT_ATTACHMENT_TOKEN_KEY]: authToken,
},
};
}

The BE then send a redirect as exitTo url but which is requested without the proper "Access-Control-Allow-Origin" header. it doesnt reproduce all the time because sometimes the image is in the cache and is not requested from the BE

video_cause1.mp4

cause 2 The second cause is that the images are, at the very beginning of the screen loading (deeplinking to report), requested with an expired authentication token even though in most cases a reauthentication have been made. That should not happen but in fact the images loading were disconnected from direct session changes because of a bug in the past #26034

// The session prop is not required, as it causes the image to reload whenever the session changes. For more information, please refer to issue #26034.
// eslint-disable-next-line react-compiler/react-compiler, react-hooks/exhaustive-deps
}, [propsSource, isAuthTokenRequired]);

Then even though a reauthentication happens like in the images below (after reconnectApp gets a 407 from the BE) some of the images are firstly requested with an expired authentication token
reconnectapp_a_eu_407_d'ou_authenticate
authenticate_apres_reconnect_avant_openreport

These 2 causes are well sumed up in the video below

requetes_302_200_302.mp4

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

For cause 1
We should change the code below to include these attachments, from

const attachmentSourceAttribute = htmlAttribs[CONST.ATTACHMENT_SOURCE_ATTRIBUTE];

into

const attachmentSourceAttribute = htmlAttribs[CONST.ATTACHMENT_SOURCE_ATTRIBUTE]??(htmlAttribs.src?.includes("expensify.com/chat-attachments")?htmlAttribs.src:null);

For cause 2
After evaluating other options, the safer is to apply the principle of not loading the images when the session is older then a certain amount of time (in fact the max idle time to expire a session in the BE. To be determined with the relevant Expensify team. I have setted 2 hours in this code). For that we should induce a notion of session age and if the session is older than the max idle time allowed, we display a loading-spinner-like icon (i have used hourglass in the code. To be determined with Design team) on the images until the session change have been propagated to induce a redraw of the screen. For that we add the following

in type Session.tsx https://github.com/Expensify/App/blob/f2e295fd174c87f7a516800c22028b637746b22c/src/types/onyx/Session.ts we added
session_age

we change the following lines

const source = useMemo(() => {
if (typeof propsSource === 'object' && 'uri' in propsSource) {
if (typeof propsSource.uri === 'number') {
return propsSource.uri;
}
const authToken = session?.encryptedAuthToken ?? null;
if (isAuthTokenRequired && authToken) {
return {
...propsSource,
headers: {
[CONST.CHAT_ATTACHMENT_TOKEN_KEY]: authToken,
},
};
}
}
return propsSource;
// The session prop is not required, as it causes the image to reload whenever the session changes. For more information, please refer to issue #26034.
// eslint-disable-next-line react-compiler/react-compiler, react-hooks/exhaustive-deps
}, [propsSource, isAuthTokenRequired]);

into

OPTION6_component_image_modified

we force useMemo to recalculate and rerender when the session is outdated and we cover cases like the first outdated session without age and the first still valid session without age. Based on the experience working on this issue, we think that any update of the session by Onyx in less than 60s after the previous update may be related to a reauthentication and thus we must recalculate the image source and rerender the image

we also change https://github.com/Expensify/App/blob/f2e295fd174c87f7a516800c22028b637746b22c/src/libs/actions/Session/updateSessionAuthTokens.ts into this

export default function updateSessionAuthTokens(authToken?: string, encryptedAuthToken?: string) {
Onyx.merge(ONYXKEYS.SESSION, {authToken, encryptedAuthToken, age: new Date().getTime()});
}

and

Authenticate(e2eUserCredentials)
.then((response) => {
Onyx.merge(ONYXKEYS.SESSION, {
authToken: response.authToken,
email: e2eUserCredentials.email,
});
console.debug('[E2E] Signed in finished!');
return waitForBeginSignInToFinish();
})
.catch((error) => {
console.error('[E2E] Error while signing in', error);
reject(error);
});

into

e2e ts modif

in Session/index.tsx https://github.com/Expensify/App/blob/f2e295fd174c87f7a516800c22028b637746b22c/src/libs/actions/Session/index.ts we added
modif_session

RESULT

It works like a charm, the attachments are properly displayed in both cases .

video before
https://github.com/user-attachments/assets/72295591-3162-4acd-8431-98c8da2ef195

video after
https://github.com/user-attachments/assets/367d36b8-1f72-4047-8a35-d67c6114b195

video testing the 2 Hours expired token
https://github.com/user-attachments/assets/ccd73db5-d00a-49cd-83b2-0b3fb7388577

What alternative solutions did you explore? (Optional)

None

@Kalydosos
Copy link
Contributor

@mallenexpensify I'm submitting a proposal above but it is just for the solution. For the repro steps it's totally inspired from @CyberAndrii proposal. So i think @CyberAndrii and i could share the bounty if you agree, him for the repro steps and me for the solution

@Kalydosos
Copy link
Contributor

Kalydosos commented Nov 26, 2024

To reproduce the bug for cause1 (in my proposal), here is a new step (also inspired from @CyberAndrii ) directly copy the markdown the attachment lose its data-expensify-source and then the bug occurs. Check the videos of the repro below

repro_causeA_demo1_2.mp4
repro_causeA_demo2_2.mp4

for cause 2 (in my proposal) we will use @CyberAndrii repro technique but we will a an age to the session as you can see in the video (here my solution is implemented, so there is a spinner instead of the gray icon while waiting for a valid session), we will send

Onyx.merge('session', {authToken:'pizza', encryptedAuthToken:'pizza', age: new Date().getTime() - 2x3600x1000});

in the console to mimick the 2 hours expired session. It can be used both to reproduce the issue and also to test the solution of the PR

demo_with_2H_expired_token.mp4

@Kalydosos
Copy link
Contributor

in fact we have been working on this issue in two different tickets, one for the repro steps (this ticket) and on another which @CyberAndrii also know of, but the other ticket have to revised the repro steps and it's not moving forward. So if my proposal is accepted in this ticket, i'll let know the team in the other ticket and they could close it as it is the same issue at the source

Copy link

melvin-bot bot commented Nov 26, 2024

@mallenexpensify @stitesExpensify @abdulrahuman5196 this issue is now 4 weeks old, please consider:

  • Finding a contributor to fix the bug
  • Closing the issue if BZ has been unable to add the issue to a VIP or Wave project
  • If you have any questions, don't hesitate to start a discussion in #expensify-open-source

Thanks!

@CyberAndrii
Copy link
Contributor

There's a similar issue open that will have the same fix. @hungvu193 @abdulrahuman5196 you will need to decide who will review the proposals.

@mallenexpensify I have accepted the offer for repro steps, thanks.

@mallenexpensify
Copy link
Contributor

Contributor: @CyberAndrii paid $250 via Upwork for documenting reproducible steps.

Commented on the other issue, 🤞 we can get this or that one closed so we can focus on one fix (to rule them all!!!!)

@abdulrahuman5196
Copy link
Contributor

@mallenexpensify Seems @hungvu193 is the C+ in the other issue which has used the repro steps here to move forward with the proposal.
Since the actual fix is moved to a different issue and taken over by different C+, could you kindly process the payment for me similar to here #51699 (comment) as part of this issue and close this out.

@mallenexpensify
Copy link
Contributor

@abdulrahuman5196 , I feel like $250 is fair here for C+ because that was the original price when you did the work and cuz there's no PR to review. Do you agree?

Feel free to follow the PR that's raised from the other issue, if you want and think you might be able to provide feedback (it's not necessary though).

@mvtglobally
Copy link

Issue not reproducible during KI retests. (Third week)

@abdulrahuman5196
Copy link
Contributor

@abdulrahuman5196 , I feel like $250 is fair here for C+ because that was the original price when you did the work and cuz there's no PR to review. Do you agree?

Feel free to follow the PR that's raised from the other issue, if you want and think you might be able to provide feedback (it's not necessary though).

I do agree @mallenexpensify . If you are good as well, could you kindly add the payment summary. Let me know if anything else is required here as well.

@melvin-bot melvin-bot bot added the Overdue label Dec 2, 2024
@mallenexpensify
Copy link
Contributor

Contributor+: @abdulrahuman5196 due $250 via NewDot

Thanks! (I think we're good close here, follow the other issue if ya want)

@github-project-automation github-project-automation bot moved this from CRITICAL to Done in [#whatsnext] #quality Dec 2, 2024
@melvin-bot melvin-bot bot removed the Overdue label Dec 2, 2024
@JmillsExpensify
Copy link

$250 approved for @abdulrahuman5196

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
AutoAssignerNewDotQuality Used to assign quality issues to engineers Bug Something is broken. Auto assigns a BugZero manager. Daily KSv2 External Added to denote the issue can be worked on by a contributor Help Wanted Apply this label when an issue is open to proposals by contributors
Projects
Development

No branches or pull requests