Skip to content

Commit 2d9c8ff

Browse files
committed
feat: add restore and loading triggers function to DevTools actions
1 parent ca8a5d6 commit 2d9c8ff

File tree

2 files changed

+63
-4
lines changed

2 files changed

+63
-4
lines changed

client/app/pages/vue-query.vue

Lines changed: 62 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -99,12 +99,65 @@ function handleRestoreTriggerError(query: Query) {
9999
error,
100100
fetchMeta: {
101101
...query.state.fetchMeta,
102-
...__previousQueryOptions,
103-
},
102+
__previousQueryOptions,
103+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
104+
} as any,
104105
})
105106
}
106107
else {
107108
query.reset()
109+
// reset() does NOT seem to refetch, even when the query IS active (has observers)
110+
// maybe a bug?
111+
// do it manually
112+
query.fetch()
113+
}
114+
}
115+
116+
function restoreQueryAfterLoadingOrError(query: Query) {
117+
const previousState = query.state
118+
const previousOptions = query.state.fetchMeta
119+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
120+
? (query.state.fetchMeta as any).__previousQueryOptions
121+
: null
122+
123+
query.cancel({ silent: true })
124+
query.setState({
125+
...previousState,
126+
fetchStatus: 'idle',
127+
fetchMeta: null,
128+
})
129+
130+
if (previousOptions) {
131+
query.fetch(previousOptions)
132+
}
133+
}
134+
135+
function handleRestoreTriggerLoading(query: Query) {
136+
if (query.state.data === undefined) {
137+
restoreQueryAfterLoadingOrError(query)
138+
}
139+
else {
140+
if (!query) return
141+
const __previousQueryOptions = query.options
142+
// Trigger a fetch in order to trigger suspense as well.
143+
query.fetch({
144+
...__previousQueryOptions,
145+
queryFn: () => {
146+
return new Promise(() => {
147+
// Never resolve
148+
})
149+
},
150+
gcTime: -1,
151+
})
152+
query.setState({
153+
data: undefined,
154+
status: 'pending',
155+
fetchMeta: {
156+
...query.state.fetchMeta,
157+
__previousQueryOptions,
158+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
159+
} as any,
160+
})
108161
}
109162
}
110163
</script>
@@ -169,6 +222,13 @@ function handleRestoreTriggerError(query: Query) {
169222
:disabled="selectedQuery.state.status === 'pending'"
170223
@click="toRaw(selectedQuery)?.reset()"
171224
/>
225+
<NButton
226+
v-tooltip="selectedQuery.state.status === 'pending' ? 'Restore Loading' : 'Trigger Loading'"
227+
:title="selectedQuery.state.status === 'pending' ? 'Restore Loading' : 'Trigger Loading'"
228+
class="text-primary self-start"
229+
icon="i-carbon-hourglass"
230+
@click="handleRestoreTriggerLoading(toRaw(selectedQuery) as Query)"
231+
/>
172232
<NButton
173233
v-tooltip="selectedQuery.state.status === 'error' ? 'Restore Error' : 'Trigger Error'"
174234
:title="selectedQuery.state.status === 'error' ? 'Restore Error' : 'Trigger Error'"

src/devtools.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,7 @@ export function setupDevToolsUI(nuxt: Nuxt, resolver: Resolver) {
3737
addCustomTab({
3838
name: 'nuxt-query',
3939
title: 'Nuxt Query',
40-
icon: 'carbon:apps',
41-
// iframe view
40+
icon: 'carbon:palm-tree',
4241
view: {
4342
type: 'iframe',
4443
src: `${DEVTOOLS_UI_ROUTE}/vue-query`,

0 commit comments

Comments
 (0)