Skip to content

Commit 4417065

Browse files
authored
feat(queries): add setEnabled function to queries and infinite queries (#33)
* feat(queries): add setEnabled function to queries and infinite queries * feat: add updateOptions to queries and infinite queries
1 parent d52346b commit 4417065

File tree

5 files changed

+96
-2
lines changed

5 files changed

+96
-2
lines changed

docs/src/pages/guides/infinite-queries.md

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,3 +141,48 @@ queryClient.setQueryData('projects', data => ({
141141
pageParams: data.pageParams.slice(1),
142142
}))
143143
```
144+
145+
## What if I want to enable/disable infinite queries reactively?
146+
147+
Sometimes you may want to enable or disable a Query by using a svelte [reactive statement](https://svelte.dev/tutorial/reactive-statements). In this case, you can use the `setEnabled` function:
148+
149+
```markdown
150+
<script>
151+
import { useInfiniteQuery } from '@sveltestack/svelte-query'
152+
153+
export let isEnabled = false;
154+
155+
const queryResult = useInfiniteQuery('projects', fetchProjects, {
156+
getNextPageParam: lastGroup => lastGroup.nextId || undefined,
157+
})
158+
159+
$: queryResult.setEnabled(isEnabled)
160+
</script>
161+
162+
{#if $queryResult.status === 'idle'}
163+
<button on:click={() => isEnabled = true}>Enable</button>
164+
{#if $queryResult.status === 'loading'}
165+
Loading...
166+
{:else if $queryResult.status === 'error'}
167+
<span>Error: {$queryResult.error.message}</span>
168+
{:else}
169+
<div>
170+
{#each $queryResult.data.pages as page}
171+
{#each page.data as project}
172+
<p>{project.name}</p>
173+
{/each}
174+
{/each}
175+
</div>
176+
<div>
177+
<button
178+
on:click={() => $queryResult.fetchNextPage()}
179+
disabled={!$queryResult.hasNextPage || $queryResult.isFetchingNextPage}>
180+
{#if $queryResult.isFetching}
181+
Loading more...
182+
{:else if $queryResult.hasNextPage}
183+
Load More
184+
{:else}Nothing more to load{/if}
185+
</button>
186+
</div>
187+
{/if}
188+
```

docs/src/pages/guides/queries.md

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,3 +86,32 @@ If booleans aren't your thing, you can always use the `status` state as well:
8686
</ul>
8787
{/if}
8888
```
89+
90+
## What if I want to enable/disable queries reactively?
91+
92+
Sometimes you may want to enable or disable a Query by using a svelte [reactive statement](https://svelte.dev/tutorial/reactive-statements). In this case, you can use the `setEnabled` function:
93+
94+
```markdown
95+
<script>
96+
import { useQuery } from '@sveltestack/svelte-query';
97+
98+
export let isEnabled = false;
99+
100+
const queryResult = useQuery('todos', fetchTodos)
101+
$: queryResult.setEnabled(isEnabled)
102+
</script>
103+
104+
{#if $queryResult.isIdle}
105+
<button on:click={() => isEnabled = true}>Enable</button>
106+
{:else if $queryResult.isLoading}
107+
<span>Loading...</span>
108+
{:else if $queryResult.isError}
109+
<span>Error: {$queryResult.error.message}</span>
110+
{:else}
111+
<ul>
112+
{#each $queryResult.data as todo}
113+
<li>{todo.title}</li>
114+
{/each}
115+
</ul>
116+
{/if}
117+
```

src/infiniteQuery/useInfiniteQuery.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,5 +82,13 @@ export default function useInfiniteQuery<TQueryFnData, TError, TData = TQueryFnD
8282
}
8383
}
8484

85-
return { subscribe, setOptions }
85+
function updateOptions(options: Partial<UseInfiniteQueryOptions<TQueryFnData, TError, TData>>): void {
86+
observer.setOptions({ ...observer.options, ...options })
87+
}
88+
89+
function setEnabled(enabled: boolean): void {
90+
updateOptions({ enabled })
91+
}
92+
93+
return { subscribe, setOptions, updateOptions, setEnabled }
8694
}

src/query/useQuery.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,5 +78,13 @@ export default function useQuery<TQueryFnData = unknown, TError = unknown, TData
7878
}
7979
}
8080

81-
return { subscribe, setOptions }
81+
function updateOptions(options: Partial<UseQueryOptions<TQueryFnData, TError, TData>>): void {
82+
observer.setOptions({ ...observer.options, ...options })
83+
}
84+
85+
function setEnabled(enabled: boolean): void {
86+
updateOptions({ enabled })
87+
}
88+
89+
return { subscribe, setOptions, updateOptions, setEnabled }
8290
}

src/types.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,13 @@ export interface UseQueryStoreResult<
1616
TData = TQueryFnData,
1717
TQueryKey extends QueryKey = QueryKey
1818
> extends Readable<UseQueryResult<TData, TError>> {
19+
setEnabled(enabled: boolean): void
1920
setOptions: {
2021
(options: UseQueryOptions<TQueryFnData, TError, TData, TQueryKey>): any;
2122
(queryKey: TQueryKey, options?: UseQueryOptions<TQueryFnData, TError, TData, TQueryKey>): any;
2223
(queryKey: TQueryKey, queryFn: QueryFunction<TQueryFnData, TQueryKey>, options?: UseQueryOptions<TQueryFnData, TError, TData, TQueryKey>): any;
2324
}
25+
updateOptions(options: Partial<UseQueryOptions<TQueryFnData, TError, TData>>): void
2426
}
2527

2628
// use options.infinite = true for infinite Query
@@ -46,11 +48,13 @@ export interface UseInfiniteQueryStoreResult<
4648
TData = TQueryFnData,
4749
TQueryKey extends QueryKey = QueryKey
4850
> extends Readable<UseInfiniteQueryResult<TData, TError>> {
51+
setEnabled(enabled: boolean): void
4952
setOptions: {
5053
(options: UseInfiniteQueryOptions<TQueryFnData, TError, TData, TQueryFnData, TQueryKey>): any;
5154
(queryKey: TQueryKey, options?: UseInfiniteQueryOptions<TQueryFnData, TError, TData, TQueryFnData, TQueryKey>): any;
5255
(queryKey: TQueryKey, queryFn: QueryFunction<TQueryFnData, TQueryKey>, options?: UseInfiniteQueryOptions<TQueryFnData, TError, TData, TQueryFnData, TQueryKey>): any;
5356
}
57+
updateOptions(options: Partial<UseInfiniteQueryOptions<TQueryFnData, TError, TData>>): void
5458
}
5559

5660
export interface UseInfiniteQueryOptions<

0 commit comments

Comments
 (0)