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

[Search v2] [App] Use new query syntax #45617

Conversation

adamgrzybowski
Copy link
Contributor

@adamgrzybowski adamgrzybowski commented Jul 17, 2024

Details

This PR introduces new query syntax. Now you can see that in the URL we have q or cq params when on the search page.

Fixed Issues

$ #45027
PROPOSAL:

Tests

  • Verify that no errors appear in the JS console

Offline tests

QA Steps

  • Verify that no errors appear in the JS console

Changing status option

  1. Open the search tab
  2. Change status from expenses to shared
  3. See if the app loads shared entries

Changing workspace

  1. Open the search tab
  2. Open workspace switcher
  3. Select different workspace
  4. See if the entries are filtered for selected workspace

Wide layout only (web/desktop)

  1. Open the search tab
  2. Make sure the expenses option is selected
  3. Press the date column to change sorting options
  4. See if entries are properly sorted

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: mWeb Chrome
    • iOS: Native
    • iOS: mWeb 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 the left part of a conditional rendering a React component is a boolean and NOT a string, e.g. myBool && <MyComponent />.
    • 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 grammatically correct in English. It adheres to proper capitalization guidelines (note: only the first word of header/labels should be capitalized), and is either coming verbatim from figma or has been approved by marketing (in order to get marketing approval, ask the Bug Zero team member to add the Waiting for copy label to the issue)
    • 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 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(theme.componentBG))
  • If the PR modifies code that runs when editing or sending messages, I tested and verified there is no unexpected behavior for all supported markdown - URLs, single line code, code blocks, quotes, headings, bold, strikethrough, and italic.
  • 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 the PR modifies a component or page that can be accessed by a direct deeplink, I verified that the code functions as expected when the deeplink is used - from a logged in and logged out account.
  • If the PR modifies the UI (e.g. new buttons, new UI components, changing the padding/spacing/sizing, moving components, etc) or modifies the form input styles:
    • I verified that all the inputs inside a form are aligned with each other.
    • I added Design label and/or tagged @Expensify/design so the design team can review the changes.
  • 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.
  • If the main branch was merged into this PR after a review, I tested again and verified the outcome was still expected according to the Test steps.

Screenshots/Videos

Android: Native
android.mp4
Android: mWeb Chrome
androidWeb.mp4
iOS: Native
ios.mp4
iOS: mWeb Safari
iosWeb.mp4
MacOS: Chrome / Safari
web.mp4
MacOS: Desktop
desktop.mp4

Copy link
Contributor

@luacmartins luacmartins left a comment

Choose a reason for hiding this comment

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

I know this is a draft but I wanted to leave some early comments

src/CONST.ts Outdated Show resolved Hide resolved
src/CONST.ts Outdated Show resolved Hide resolved
src/ROUTES.ts Outdated Show resolved Hide resolved
@adamgrzybowski adamgrzybowski force-pushed the adamgrzybowski/use-new-query-syntax branch from cb9d619 to fe0ec54 Compare July 19, 2024 12:11
@adamgrzybowski adamgrzybowski marked this pull request as ready for review July 19, 2024 14:51
@adamgrzybowski adamgrzybowski requested a review from a team as a code owner July 19, 2024 14:51
@melvin-bot melvin-bot bot requested review from situchan and removed request for a team July 19, 2024 14:51
Copy link

melvin-bot bot commented Jul 19, 2024

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

@adamgrzybowski
Copy link
Contributor Author

@luacmartins Ready for the review! I will add videos and tests on Monday

Copy link
Contributor

@Kicu Kicu left a comment

Choose a reason for hiding this comment

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

after initial review seems pretty nice, will take another look later

src/pages/Search/SearchPageBottomTab.tsx Outdated Show resolved Hide resolved
src/CONST.ts Outdated Show resolved Hide resolved
src/ROUTES.ts Outdated
},
route: 'search',
getRoute: ({query, queryKind = CONST.SEARCH.QUERY_KIND.CANNED_QUERY, policyIDs}: {query: SearchQueryString; queryKind?: QueryKind; policyIDs?: string}) =>
`search?${queryKind === CONST.SEARCH.QUERY_KIND.CANNED_QUERY ? 'q' : 'cq'}=${query}${policyIDs ? `&policyIDs=${policyIDs}` : ''}` as const,
Copy link
Contributor

Choose a reason for hiding this comment

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

I think we need to include the policyID in the query as well so that the AST includes it in the filters. Any reason to treat it differently?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

I think this is a transitional step.

BTW will current grammar handle policyID? I don't see this keyword in the .peggy file

Copy link
Contributor

Choose a reason for hiding this comment

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

Ah makes sense that we do it like this for now. We should eventually move it to the AST and include it in the peggy grammar too

Copy link
Contributor

Choose a reason for hiding this comment

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

Do we need a separate issue to migrate the policyID param to the AST?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Do you think it should be in the root of QueryJSON? So something like

type JSONQuery = {
    input: string;
    hash: number;
    type: string;
    status: string;
    sortBy: string;
    sortOrder: string;
    offset: number;
    filters: ASTNode;
    policyID: string;
};

Also currently it is called policyIDs, as the assumption was that we wanted to be able to use multiple policyIDs in the future. Is this still the case?

Copy link
Contributor

Choose a reason for hiding this comment

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

We'll add it to filters as policyID. So the AST will look like this:

{filters: {
    "operator": "eq",
    "left": "policyID",
    "right": "<policyID>"

I think we should use policyID singular from now on since we have a bunch of other filters, e.g. category, tag, etc that accepts multiple values but are all singular too.

Copy link
Contributor

Choose a reason for hiding this comment

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

I hope I understand this correctly. I will add policyID to grammar and keep it inside AST, while removing it from URL

Copy link
Contributor

Choose a reason for hiding this comment

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

read my comment here: #45617 (comment)

src/components/Search/index.tsx Outdated Show resolved Hide resolved
src/components/Search/SearchPageHeader.tsx Show resolved Hide resolved
src/components/Search/index.tsx Outdated Show resolved Hide resolved
src/libs/SearchUtils.ts Outdated Show resolved Hide resolved
src/libs/SearchUtils.ts Outdated Show resolved Hide resolved
Comment on lines +354 to +357
function normalizeQuery(query: string) {
const normalizedQueryJSON = buildSearchQueryJSON(query);
return buildSearchQueryString(normalizedQueryJSON);
}
Copy link
Contributor

Choose a reason for hiding this comment

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

Why do we need this function? I think that it could inject params into the query string that were not defined by the user and that might mess up with how we display the filter UI, no?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

This is something we could discuss more about. We have a couple of questions here:

  1. Do we want to put defaults for sort etc in the URL? (I think yes, they were here in the previous version).
  2. Do we want to organize the query for the user? So is the:
    type:expenses sortBy:date same query as sortBy:date type:expenses I would say yes. In that case we should sort the keywords in the query to make it look the same.

And to address your concerns. It will inject defaults but nothing more. It shouldn't break UI filters.

Another argument for normalizing but it will be relevant in the future. If we ever want to change the defaults it could break the saved queries if we don't normalize them.

Copy link
Contributor

Choose a reason for hiding this comment

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

Do we want to put defaults for sort etc in the URL? (I think yes, they were here in the previous version).

Thinking a bit ahead, we'd only want to do that if the user explicitly types the defaults in their queries, otherwise it'd be weird for the user to type amount>200 and then see the search bar update to type:expense status:all amount>200 sortBy:date sortOrder:desc offset:0. I don't think we should modify the user input in that way and the URL is kinda the only thing tying everything up, e.g. the user input, the UI filters and the syntax itself. I think we'd only want to normalize it/build the AST when hashing and sending the API request

Copy link
Contributor

Choose a reason for hiding this comment

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

This is NAB for now, but something that we should align on before we get too deep in it

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Yeah, we may need to brainstorm this topic a little. I feel like not normalizing the query may be a pain in the future. On the other hand, it's not a perfect solution either.

Let's look at this example:

  1. User types simple query like type:expenses
  2. Press the date column name to change the sorting order.
  3. Now the query looks like type:expenses sortOrder:asc sortBy:date
  4. The user presses the column again and in theory we have same result as in the step 1 but the query looks differently type:expenses sortOrder:desc sortBy:date

Maybe we could think about hiding the defaults in places we want to display the query to the user instead of removing them from the query and logic.

Copy link
Contributor

Choose a reason for hiding this comment

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

I agree with Adam and I feel the code will make much more sense if query is a single source of truth and thus always contains all the values that are actually used when sending query to api.
I don't think we should worry how the URL looks for the user - it looks ugly anyways since it's url-encoded 😅

That being said this PR is blocking some other work, so I'm a fan of leaving this conversation for later and moving forward with this.

Copy link
Contributor

Choose a reason for hiding this comment

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

I think the concern here is that we were gonna use the decoded URL to populate the search bar (once that's available) with the value the user input, but I see now that any interaction with the UI will also cause this issue. From the example above:

  1. User types simple query like type:expenses
  2. Press the date column name to change the sorting order.
  3. Now the query looks like type:expenses sortOrder:asc sortBy:date
  4. We'd display type:expenses sortOrder:asc sortBy:date in the Search bar, which is different than what the user typed
  5. The user presses the column again and in theory we have same result as in the step 1 but the query looks differently type:expenses sortOrder:desc sortBy:date, which is also not what the user input was.

I think we might need another solution for this problem, so in all cases we only show type:expenses to the user since that's what they typed into the search bar. That's a problem for v2.3, but we should keep it in mind.

Comment on lines 72 to 75
// eslint-disable-next-line jsdoc/require-jsdoc
drafts: boolean;
// eslint-disable-next-line jsdoc/require-jsdoc
approved: boolean;
Copy link
Contributor

Choose a reason for hiding this comment

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

We actually return all statuses to the client, e.g. all, drafts, outstanding, approved, paid

Copy link
Contributor Author

Choose a reason for hiding this comment

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

So should I add all the fields? I am not sure if I understand this part of the code

Copy link
Contributor

Choose a reason for hiding this comment

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

Yea, I think we should add all of them for now since they are always returned by the server

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Do you mean these statuses? I don't see any outstanding in the costs.

STATUS: {
  ALL: 'all',
  SHARED: 'shared',
  DRAFTS: 'drafts',
  FINISHED: 'finished',
},

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Not sure where to look for these values 😄

Copy link
Contributor

@luacmartins luacmartins Jul 24, 2024

Choose a reason for hiding this comment

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

They are here. We should still support Shared, Finished for now, but we'll deprecate that one soon and add the other statuses mentioned in the doc, e.g. outstanding, approved, paid

Copy link
Contributor

Choose a reason for hiding this comment

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

why do we have to add this in this PR? I don't understand why this suddenly appeared here, when I don't see this being used anywhere.

Can I just remove it if it's unused and we can add it in the PR that this is actually being used?

src/pages/Search/SearchStatusMenuNarrow.tsx Outdated Show resolved Hide resolved
Copy link
Contributor

@luacmartins luacmartins left a comment

Choose a reason for hiding this comment

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

It seems like loading more results is broken. We don't pass the correct offset param to the API call even thought it's updated in the URL

@adamgrzybowski
Copy link
Contributor Author

adamgrzybowski commented Jul 23, 2024

Hi @luacmartins. @Kicu and I concluded that we should remove the offset property from the query.

Hash is generated from the query string. Offset is part of the query string. This means changing the offset will change the hash. This breaks caching and loading new elements.

Deep linking with URL that contains offset also won't load elements properly. We can't simply jump to offset 150. We need to go through 0, 50, 100, 150 to load all elements.

Instead, we could just keep it in the state in the Search component.

I would propose to do it as a follow up up though. This PR is necessary to move forward. It would be great to merge it soon. BTW I will be ooo Jul 25-29 and I don't want to block others.

src/pages/Search/SearchPage.tsx Show resolved Hide resolved
// TODO_SEARCH: use this function after backend changes.
// eslint-disable-next-line @typescript-eslint/no-unused-vars
function searchV2(queryString: SearchQueryString) {
const queryJSON = buildSearchQueryJSON(queryString);
Copy link
Contributor

Choose a reason for hiding this comment

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

It seems like we're already passing the AST here, so no need to try to build it again

Suggested change
const queryJSON = buildSearchQueryJSON(queryString);

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Not sure if I understand. It looks like we pass queryString here not queryJSON.

Copy link
Contributor

Choose a reason for hiding this comment

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

Hmm in my tests I had to remove this to make it work with the backend.


// TODO_SEARCH: uncomment this line after backend changes
// @ts-expect-error waiting for backend changes
API.read(READ_COMMANDS.SEARCH, queryJSON, {optimisticData, finallyData});
Copy link
Contributor

@luacmartins luacmartins Jul 23, 2024

Choose a reason for hiding this comment

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

Suggested change
API.read(READ_COMMANDS.SEARCH, queryJSON, {optimisticData, finallyData});
API.read(READ_COMMANDS.SEARCH, {hash, jsonQuery: JSON.stringify(jsonQuery)}, {optimisticData, finallyData});

@@ -53,6 +55,22 @@ function search({hash, query, policyIDs, offset, sortBy, sortOrder}: SearchParam
API.read(READ_COMMANDS.SEARCH, {hash, query, offset, policyIDs, sortBy, sortOrder}, {optimisticData, finallyData});
}

// TODO_SEARCH: use this function after backend changes.
// eslint-disable-next-line @typescript-eslint/no-unused-vars
function searchV2(queryString: SearchQueryString) {
Copy link
Contributor

Choose a reason for hiding this comment

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

Suggested change
function searchV2(queryString: SearchQueryString) {
function searchV2(jsonQuery: SearchQueryJSON) {

@rayane-djouah
Copy link
Contributor

@rayane-djouah is the Bug 2 related to changes in this PR? because HOLD and bulk is not something that should be modified here

@Kicu - Bug 2 is not reproducible on main. Maybe it's related to our changes concerning TRANSACTION_HOLD_REASON_RHP route?

@Kicu
Copy link
Contributor

Kicu commented Jul 25, 2024

Ah yes might be, thanks I will test it.

Meanwhile for bug 1 I think the problem might be that policyIDs needs to be part of hash for a single search query, because hash becomes part of onyx key.
So for your reproduction what (I believe, not sure 100%) happens is:

  • we filter a specific query by policyIDs, we get correct data
  • we change the workspaces from A to B
  • we get new filtered workspaces (as I made sure the correct call is made to backend)
  • we get the same hash because policyIDs is not part of hash
  • we display all the same results which will be mixed results from 2 calls

Good catch.


But in general I now have na "existential" 😅 problem with this PR. I expected that I will help fix several comments and we can finally close this.
However @luacmartins the switch for policyIDs that you suggested - although it makes sense - is a really big change.
policyIDs is strictly connected with workspace Switcher and with all the other routes that use /w/<policyID>/.... it also is connected with export to CSV.
Screenshot 2024-07-25 at 15 21 51

If we'd have to now remove it from params and move it to inside AST then that's editing 15 files and possibly breaking some functionality. IMO that will delay this PR for at least 2 days.
Also I actually have no idea how the new policyID param inside AST would work with existing workspace switcher? If it should just seamless work then we'd need to parse query in multiple places to be able extract this param, for flows like:

  1. go to reports page
  2. switch workspace
  3. go to search
  4. should it already have search?q=policyID:xxxxx in this scenario?

To sum up here are my questions about how to move forward @luacmartins
Q1 can we move forward with this PR keeping policyIDs as is? this can lead to some bugs but we can fix it in separate PRs
Q2 how will policyIDs interact with existing workspace switcher component
Q3 how are we switching to a new backend? will current Search simply stop working at some point and we have to switch sending search calls with jsonQuery? do I have to do it inside this PR?

@Kicu
Copy link
Contributor

Kicu commented Jul 25, 2024

@rayane-djouah my latest commit fixes Bug 2 via optional params.
Bug 1 would be fixed automatically if we would put policyID to hash generation, but Im not sure if we want to do this in this PR (see my previous long comment).

@luacmartins
Copy link
Contributor

Bug 1 would be fixed automatically if we would put policyID to hash generation, but Im not sure if we want to do this in this PR (see my previous long comment).

I think we should include the policyID in the hash so we don't break the existing functionality

@Kicu
Copy link
Contributor

Kicu commented Jul 25, 2024

I tried to fix Bug 1 with my newest commit and upon quick check it should work, however i need to drop now so please double check if I didn't break anything else.

Temporarily we can add policyID to has generation which should make our hashes stable and reacting to changing policyID.

In future when we move policyID to inside filters as part of AST this bug will no longer exist

@rayane-djouah
Copy link
Contributor

Thank you! @Kicu

@rayane-djouah
Copy link
Contributor

@Kicu - Is there any reason we're not using the searchV2 function yet?

luacmartins
luacmartins previously approved these changes Jul 25, 2024
Copy link
Contributor

@luacmartins luacmartins left a comment

Choose a reason for hiding this comment

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

LGTM and tests well


const query = rawQuery as SearchQuery;
const isValidQuery = Object.values(CONST.SEARCH.TAB).includes(query);
const queryJSON = useMemo(() => buildSearchQueryJSON(route.params.q, policyIDs), [route.params]);
Copy link
Contributor

Choose a reason for hiding this comment

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

Suggested change
const queryJSON = useMemo(() => buildSearchQueryJSON(route.params.q, policyIDs), [route.params]);
const queryJSON = useMemo(() => buildSearchQueryJSON(route.params.q, policyIDs), [route.params, policyIDs]);

};

function buildJSONQuery(query: string) {
function buildSearchQueryJSON(query: SearchQueryString, policyID?: string) {
Copy link
Contributor

Choose a reason for hiding this comment

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

Suggested change
function buildSearchQueryJSON(query: SearchQueryString, policyID?: string) {
function buildSearchQueryJSON(query: SearchQueryString, policyIDs?: string) {

Comment on lines +321 to +322
// Temporary solution until we move policyID filter into the AST - then remove this line and keep only query
const policyIDPart = policyID ?? '';
Copy link
Contributor

Choose a reason for hiding this comment

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

Suggested change
// Temporary solution until we move policyID filter into the AST - then remove this line and keep only query
const policyIDPart = policyID ?? '';
// Temporary solution until we move policyIDs filter into the AST - then remove this line and keep only query
const policyIDsPart = policyIDs ?? '';


// Temporary solution until we move policyID filter into the AST - then remove this line and keep only query
const policyIDPart = policyID ?? '';
result.hash = getQueryHashFromString(query + policyIDPart);
Copy link
Contributor

Choose a reason for hiding this comment

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

Suggested change
result.hash = getQueryHashFromString(query + policyIDPart);
result.hash = getQueryHashFromString(query + policyIDsPart);

@rayane-djouah
Copy link
Contributor

We still need to address these comments: #45617 (comment) #45617 (comment)

@rayane-djouah
Copy link
Contributor

Bug 1 and 2 are no longer reproducible, great work!

@Kicu
Copy link
Contributor

Kicu commented Jul 25, 2024

@luacmartins do you mind sharing here that we decided to straighten out policyIDs in a separate PR?
Also the future name to be used will be policyID that is why I named it like that right now.

@luacmartins
Copy link
Contributor

@rayane-djouah #45617 (comment) is NAB, we'll do that in a follow up since it can introduce several regressions and we want this PR merged soon.

@rayane-djouah
Copy link
Contributor

Okay, I will retest on all platforms & upload videos shortly

@luacmartins
Copy link
Contributor

#45617 (comment) this one doesn't seem to be a blocker either. Offset is working fine for now. We'll need to make changes to the parser in a follow up, so this will be addressed then.

Copy link
Contributor

@rayane-djouah rayane-djouah left a comment

Choose a reason for hiding this comment

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

LGTM and test well! Thanks all!
@luacmartins all yours!

@melvin-bot melvin-bot bot requested a review from luacmartins July 25, 2024 16:22
@luacmartins luacmartins merged commit 5df5630 into Expensify:main Jul 25, 2024
15 of 17 checks passed
@OSBotify
Copy link
Contributor

✋ This PR was not deployed to staging yet because QA is ongoing. It will be automatically deployed to staging after the next production release.

@OSBotify
Copy link
Contributor

🚀 Deployed to staging by https://github.com/luacmartins in version: 9.0.13-0 🚀

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

@OSBotify
Copy link
Contributor

🚀 Deployed to production by https://github.com/luacmartins in version: 9.0.13-4 🚀

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

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.

6 participants