Skip to content

Commit 28a3ec1

Browse files
ElisePatrikainenposva
authored andcommitted
fix(query): query refresh on defineQuery output composable call
1 parent 9da9d2c commit 28a3ec1

File tree

4 files changed

+37
-9
lines changed

4 files changed

+37
-9
lines changed

playground/src/App.vue

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,10 @@
1212
<RouterLink to="/contacts">
1313
Contacts
1414
</RouterLink>
15+
|
16+
<RouterLink to="/ecom">
17+
T-shirts
18+
</RouterLink>
1519
</nav>
1620
</div>
1721
</header>
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import { defineQuery, useQuery } from '@pinia/colada'
2+
import { useRouteQuery } from '@vueuse/router'
3+
import { searchContacts } from '@/api/contacts'
4+
5+
export const useContacts = defineQuery(() => {
6+
const searchText = useRouteQuery('search', '', { mode: 'push' })
7+
const { ...query } = useQuery({
8+
key: () => ['contacts-search', { searchText: searchText.value }],
9+
query: ({ signal }) => searchContacts(searchText.value, {}, { signal }),
10+
gcTime: 0,
11+
})
12+
return { ...query, searchText }
13+
})

playground/src/pages/contacts.vue

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,10 @@
11
<script lang="ts" setup>
22
import { useRouteQuery } from '@vueuse/router'
3-
import { useQuery } from '@pinia/colada'
4-
import { searchContacts } from '@/api/contacts'
3+
import { useContacts } from '@/composables/contacts'
54
65
const searchText = useRouteQuery('search', '', { mode: 'push' })
76
8-
const { data: searchResult, status } = useQuery({
9-
key: () => ['contacts-search', { searchText: searchText.value }],
10-
query: ({ signal }) => searchContacts(searchText.value, {}, { signal }),
11-
})
7+
const { data: searchResult, status } = useContacts()
128
139
// TODO: tip in tests if they are reading data, error or other as they are computed properties, on the server they won't
1410
// update so they will keep their initial undefined value

src/query-store.ts

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -163,12 +163,23 @@ export const useQueryCache = defineStore(QUERY_STORE_ID, () => {
163163
// this allows use to attach reactive effects to the scope later on
164164
const scope = getCurrentScope()!
165165

166-
const defineQueryMap = new WeakMap<() => unknown, any>()
166+
const defineQueryMap = new WeakMap<() => unknown, { queries: string[][], result: any }>()
167+
let currentDefineQuerySetupFunction: (() => unknown) | null
167168
function ensureDefinedQuery<T>(fn: () => T): T {
168169
if (!defineQueryMap.has(fn)) {
169-
defineQueryMap.set(fn, scope.run(fn)!)
170+
currentDefineQuerySetupFunction = fn
171+
defineQueryMap.set(fn, { queries: [], result: null })
172+
defineQueryMap.get(fn)!.result = scope.run(fn)!
173+
currentDefineQuerySetupFunction = null
174+
} else {
175+
defineQueryMap.get(fn)!.queries.forEach(
176+
(key) => {
177+
const query = cachesRaw.get(key) as UseQueryEntry | undefined
178+
if (query) refresh(query)
179+
},
180+
)
170181
}
171-
return defineQueryMap.get(fn)!
182+
return defineQueryMap.get(fn)!.result
172183
}
173184

174185
function ensureEntry<TResult = unknown, TError = ErrorDefault>(
@@ -181,6 +192,10 @@ export const useQueryCache = defineStore(QUERY_STORE_ID, () => {
181192
)
182193
}
183194
const key = keyRaw.map(stringifyFlatObject)
195+
if (currentDefineQuerySetupFunction) {
196+
const currentDefineQueryEntry = defineQueryMap.get(currentDefineQuerySetupFunction)
197+
currentDefineQueryEntry!.queries.push(key)
198+
}
184199
// ensure the state
185200
// console.log('⚙️ Ensuring entry', key)
186201
let entry = cachesRaw.get(key) as UseQueryEntry<TResult, TError> | undefined

0 commit comments

Comments
 (0)