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

fix(angular-query-experimental): run mutation callback in injection context #7360

Open
wants to merge 1 commit into
base: main
Choose a base branch
from

Conversation

ShacharHarshuv
Copy link
Contributor

@ShacharHarshuv ShacharHarshuv commented May 1, 2024

Previously, the injectMutation callback ran in injection context only if accessed in the same context as the component initialization (i.e. before the effect callback run). By wrapping the effect callback in injection context, it is ensured that the callback will always run in injection context, and any inject calls will not fail.

Note there is a separate issue here, and it's that the callback is always run twice - once synchronously when initialization the mutation (when you create the MutationObserver), and secondly as the first callback of the effect. This is something that can potentially be improved to prevent redundant code run.

Another related issue - I would argue that if any signal dependencies of the mutation changed, you don't necessarily want to immediately run the callback again. You probably want to be "lazy" and run it again only when the mutation object is accessed. With the current implementation, that callback might unnecessarily run when there are a lot of dependency changes, but no mutation is used. (For example, imagine there is an "opened todo item" state, and a delete button on it. The user might switched the opened todo item state frequently without actually using the delete mutation).

No breaking changes, any code that worked before should still work.

Copy link

vercel bot commented May 1, 2024

The latest updates on your projects. Learn more about Vercel for Git ↗︎

1 Ignored Deployment
Name Status Preview Comments Updated (UTC)
query ⬜️ Ignored (Inspect) Visit Preview May 8, 2024 6:08pm

Copy link

nx-cloud bot commented May 1, 2024

☁️ Nx Cloud Report

CI is running/has finished running commands for commit f34b811. As they complete they will appear below. Click to see the status, the terminal output, and the build insights.

📂 See all runs for this CI Pipeline Execution


🟥 Failed Commands
nx affected --targets=test:format,test:sherif,test:knip,test:eslint,test:lib,test:types,test:build,build,test:attw --parallel=3

Sent with 💌 from NxCloud.

Comment on lines +485 to +486
// check if injection contexts persist in a different task
await new Promise<void>((resolve) => queueMicrotask(() => resolve()))
Copy link
Contributor Author

Choose a reason for hiding this comment

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

Without this, the test will pass with the previous implementation. That is because the callback of effect which causes the exception will run in a different task.

Copy link

codesandbox-ci bot commented May 1, 2024

This pull request is automatically built and testable in CodeSandbox.

To see build info of the built libraries, click here or the icon next to each commit SHA.

Latest deployment of this branch, based on commit f34b811:

Sandbox Source
@tanstack/query-example-angular-basic Configuration
@tanstack/query-example-react-basic-typescript Configuration
@tanstack/query-example-solid-basic-typescript Configuration
@tanstack/query-example-svelte-basic Configuration
@tanstack/query-example-vue-basic Configuration

…ontext

Previously, the injectMutation callback was run in injection context only if accessed in the same task as the component initialization (i.e. before the `effect` callback run). By running the effect run in injection context, it is ensured that the callback will always run in injection context, and any `inject` calls will not fail.

Note there is a separate issue here, and it's that the callback is always run twice - once synchronously when initialization the mutation, and secondly as the first callback of the `effect`. This is something that can potentially be improved.

No breaking changes, any code that worked before should still work.
@ShacharHarshuv ShacharHarshuv force-pushed the inject-mutation-callback-should-run-in-injection-context branch from 82597e8 to f34b811 Compare May 8, 2024 18:08
@ShacharHarshuv
Copy link
Contributor Author

Resolved conflicts.
@arnoud-dv can you review?

@ShacharHarshuv
Copy link
Contributor Author

The tests failures don't seem to be related to my change, as they fail in the react adapter.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

1 participant