Skip to content

Commit ac1ab87

Browse files
Fix useMutationState
1 parent a891fd4 commit ac1ab87

10 files changed

+92
-45
lines changed

packages/svelte-query/src/createBaseQuery.svelte.ts

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,12 @@ import type {
99
CreateBaseQueryResult,
1010
} from './types.js'
1111

12+
/**
13+
* Base implementation for `createQuery` and `createInfiniteQuery`
14+
* @param options - A function that returns query options
15+
* @param Observer - The observer from query-core
16+
* @param queryClient - Custom query client which overrides provider
17+
*/
1218
export function createBaseQuery<
1319
TQueryFnData,
1420
TError,
@@ -20,11 +26,10 @@ export function createBaseQuery<
2026
CreateBaseQueryOptions<TQueryFnData, TError, TData, TQueryData, TQueryKey>
2127
>,
2228
Observer: typeof QueryObserver,
23-
queryClientOption?: Accessor<QueryClient>,
29+
queryClient?: Accessor<QueryClient>,
2430
): CreateBaseQueryResult<TData, TError> {
2531
/** Load query client */
26-
const queryClient = $derived(queryClientOption?.())
27-
const client = $derived(useQueryClient(queryClient))
32+
const client = $derived(useQueryClient(queryClient?.()))
2833
const isRestoring = useIsRestoring()
2934

3035
const resolvedOptions = $derived.by(() => {
Lines changed: 37 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,35 @@
1-
import { MutationObserver } from '@tanstack/query-core'
2-
import { untrack } from 'svelte'
1+
import { onDestroy } from 'svelte'
2+
3+
import { MutationObserver, notifyManager } from '@tanstack/query-core'
34
import { useQueryClient } from './useQueryClient.js'
4-
import { createRawRef } from './containers.svelte.js'
55
import type {
66
Accessor,
77
CreateMutateFunction,
88
CreateMutationOptions,
99
CreateMutationResult,
1010
} from './types.js'
11+
1112
import type { DefaultError, QueryClient } from '@tanstack/query-core'
1213

14+
/**
15+
* @param options - A function that returns mutation options
16+
* @param queryClient - Custom query client which overrides provider
17+
*/
1318
export function createMutation<
1419
TData = unknown,
1520
TError = DefaultError,
1621
TVariables = void,
1722
TContext = unknown,
1823
>(
1924
options: Accessor<CreateMutationOptions<TData, TError, TVariables, TContext>>,
20-
queryClientOption?: Accessor<QueryClient>,
25+
queryClient?: Accessor<QueryClient>,
2126
): CreateMutationResult<TData, TError, TVariables, TContext> {
22-
const queryClient = $derived(queryClientOption?.())
23-
const client = $derived(useQueryClient(queryClient))
27+
const client = useQueryClient(queryClient?.())
2428

2529
const observer = $derived(
2630
new MutationObserver<TData, TError, TVariables, TContext>(
2731
client,
28-
untrack(() => options()),
32+
options(),
2933
),
3034
)
3135

@@ -35,23 +39,35 @@ export function createMutation<
3539
observer.mutate(variables, mutateOptions).catch(noop)
3640
})
3741

38-
function createResult() {
39-
const result = observer.getCurrentResult()
40-
return {
41-
...result,
42-
mutateAsync: result.mutate,
43-
mutate,
44-
}
45-
}
46-
47-
// svelte-ignore state_referenced_locally
48-
const [mutation, update] = createRawRef(createResult())
49-
50-
$effect(() => update(createResult()))
5142
$effect.pre(() => {
5243
observer.setOptions(options())
5344
})
54-
return mutation
45+
46+
const result = $state(observer.getCurrentResult())
47+
48+
const unsubscribe = observer.subscribe((val) => {
49+
notifyManager.batchCalls(() => {
50+
Object.assign(result, val)
51+
})()
52+
})
53+
54+
onDestroy(() => {
55+
unsubscribe()
56+
})
57+
58+
// @ts-expect-error
59+
return new Proxy(result, {
60+
get: (_, prop) => {
61+
const r = {
62+
...result,
63+
mutate,
64+
mutateAsync: result.mutate,
65+
}
66+
if (prop == 'value') return r
67+
// @ts-expect-error
68+
return r[prop]
69+
},
70+
})
5571
}
5672

5773
function noop() {}

packages/svelte-query/src/createQueries.svelte.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -199,10 +199,9 @@ export function createQueries<
199199
]
200200
combine?: (result: QueriesResults<T>) => TCombinedResult
201201
}>,
202-
queryClientOption?: Accessor<QueryClient>,
202+
queryClient?: Accessor<QueryClient>,
203203
): TCombinedResult {
204-
const queryClient = $derived(queryClientOption?.())
205-
const client = $derived(useQueryClient(queryClient))
204+
const client = $derived(useQueryClient(queryClient?.()))
206205
const isRestoring = useIsRestoring()
207206

208207
const { queries, combine } = $derived.by(createQueriesOptions)

packages/svelte-query/src/useMutationState.svelte.ts

Lines changed: 30 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1+
import { replaceEqualDeep } from '@tanstack/query-core'
12
import { useQueryClient } from './useQueryClient.js'
2-
import { createRawRef } from './containers.svelte.js'
33
import type {
44
MutationCache,
55
MutationState,
@@ -24,7 +24,33 @@ export function useMutationState<TResult = MutationState>(
2424
queryClient?: QueryClient,
2525
): Array<TResult> {
2626
const mutationCache = useQueryClient(queryClient).getMutationCache()
27-
let [mutation, update] = createRawRef(getResult(mutationCache, options))
28-
$effect(() => update(getResult(mutationCache, options)))
29-
return mutation
27+
const result = $state(getResult(mutationCache, options))
28+
29+
$effect(() => {
30+
const unsubscribe = mutationCache.subscribe(() => {
31+
const nextResult = replaceEqualDeep(
32+
result,
33+
getResult(mutationCache, options),
34+
)
35+
if (result !== nextResult) {
36+
Object.assign(result, nextResult)
37+
}
38+
})
39+
40+
return unsubscribe
41+
})
42+
43+
/* $effect(() => {
44+
mutationCache.subscribe(() => {
45+
const nextResult = replaceEqualDeep(
46+
result.current,
47+
getResult(mutationCache, optionsRef),
48+
)
49+
if (result.current !== nextResult) {
50+
result = nextResult
51+
//notifyManager.schedule(onStoreChange)
52+
}
53+
})
54+
}) */
55+
return result
3056
}

packages/svelte-query/tests/createQueries.svelte.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
import { QueryCache, QueryClient, createQueries } from '@tanstack/svelte-query'
21
import { beforeEach, describe, expect, expectTypeOf, it, vi } from 'vitest'
2+
import { QueryCache, QueryClient, createQueries } from '../src/index.js'
33
import { promiseWithResolvers, withEffectRoot } from './utils.svelte.js'
44
import type {
55
CreateQueryOptions,
@@ -8,7 +8,7 @@ import type {
88
QueryFunctionContext,
99
QueryKey,
1010
skipToken,
11-
} from '@tanstack/svelte-query'
11+
} from '../src/index.js'
1212

1313
describe('createQueries', () => {
1414
const queryCache = new QueryCache()

packages/svelte-query/tests/createQueries.test-d.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { describe, expectTypeOf, it } from 'vitest'
2-
import { createQueries, queryOptions } from '@tanstack/svelte-query'
3-
import type { CreateQueryResult } from '@tanstack/svelte-query'
2+
import { createQueries, queryOptions } from '../src/index.js'
3+
import type { CreateQueryResult } from '../src/index.js'
44

55
describe('createQueries', () => {
66
it('should return correct data for dynamic queries with mixed result types', () => {

packages/svelte-query/tests/createQuery.svelte.test.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
1+
import { flushSync } from 'svelte'
2+
import { beforeEach, describe, expect, expectTypeOf, it, vi } from 'vitest'
13
import {
24
QueryCache,
35
QueryClient,
46
createQuery,
57
keepPreviousData,
6-
} from '@tanstack/svelte-query'
7-
import { flushSync } from 'svelte'
8-
import { beforeEach, describe, expect, expectTypeOf, it, vi } from 'vitest'
8+
} from '../src/index.js'
99
import { promiseWithResolvers, sleep, withEffectRoot } from './utils.svelte.js'
10-
import type { CreateQueryResult } from '@tanstack/svelte-query'
10+
import type { CreateQueryResult } from '../src/index.js'
1111

1212
describe('createQuery', () => {
1313
const queryCache = new QueryCache()

packages/svelte-query/tests/createQuery.test-d.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
import { createQuery, queryOptions } from '@tanstack/svelte-query'
21
import { describe, expectTypeOf, it } from 'vitest'
2+
import { createQuery, queryOptions } from '../src/index.js'
33

44
describe('initialData', () => {
55
describe('Config object overload', () => {

packages/svelte-query/tests/useIsMutating/BaseExample.svelte

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
<script lang="ts">
22
import { QueryClient } from '@tanstack/query-core'
3-
import { createMutation } from '../../src/createMutation.svelte'
3+
import { createMutation, useIsMutating } from '../../src/index.js'
44
import { sleep } from '../utils.svelte.js'
5-
import { useIsMutating } from '../../src/useIsMutating.svelte'
65
76
const queryClient = new QueryClient()
87
const isMutating = useIsMutating(undefined, queryClient)

packages/svelte-query/tests/useMutationState/BaseExample.svelte

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
<script lang="ts">
22
import { QueryClient } from '@tanstack/query-core'
3-
import { setQueryClientContext } from '../../src/index.js'
4-
import { createMutation } from '../../src/createMutation.svelte'
5-
import { useMutationState } from '../../src/useMutationState.svelte'
3+
import {
4+
createMutation,
5+
setQueryClientContext,
6+
useMutationState,
7+
} from '../../src/index.js'
68
import type {
79
Accessor,
810
CreateMutationOptions,

0 commit comments

Comments
 (0)