|
1 | | -import { type CompilableQuery, ParsedQuery, type SQLWatchOptions, parseQuery } from '@powersync/common'; |
| 1 | +import { |
| 2 | + type CompilableQuery, |
| 3 | + ParsedQuery, |
| 4 | + type SQLWatchOptions, |
| 5 | + parseQuery, |
| 6 | + runOnSchemaChange |
| 7 | +} from '@powersync/common'; |
2 | 8 | import { type MaybeRef, type Ref, ref, toValue, watchEffect } from 'vue'; |
3 | 9 | import { usePowerSync } from './powerSync'; |
4 | 10 |
|
@@ -114,38 +120,41 @@ export const useQuery = <T = any>( |
114 | 120 | } |
115 | 121 |
|
116 | 122 | const { sqlStatement: sql, parameters } = parsedQuery; |
| 123 | + const watchQuery = async (abortSignal: AbortSignal) => { |
| 124 | + let resolvedTables = []; |
| 125 | + try { |
| 126 | + resolvedTables = await powerSync.value.resolveTables(sql, parameters, options); |
| 127 | + } catch (e) { |
| 128 | + console.error('Failed to fetch tables:', e); |
| 129 | + handleError(e); |
| 130 | + return; |
| 131 | + } |
| 132 | + // Fetch initial data |
| 133 | + const executor = |
| 134 | + typeof queryValue == 'string' ? () => powerSync.value.getAll<T>(sql, parameters) : () => queryValue.execute(); |
| 135 | + fetchData = () => _fetchData(executor); |
| 136 | + await fetchData(); |
| 137 | + |
| 138 | + if (options.runQueryOnce) { |
| 139 | + return; |
| 140 | + } |
117 | 141 |
|
118 | | - let resolvedTables = []; |
119 | | - try { |
120 | | - resolvedTables = await powerSync.value.resolveTables(sql, parameters, options); |
121 | | - } catch (e) { |
122 | | - console.error('Failed to fetch tables:', e); |
123 | | - handleError(e); |
124 | | - return; |
125 | | - } |
126 | | - // Fetch initial data |
127 | | - const executor = |
128 | | - typeof queryValue == 'string' ? () => powerSync.value.getAll<T>(sql, parameters) : () => queryValue.execute(); |
129 | | - fetchData = () => _fetchData(executor); |
130 | | - await fetchData(); |
131 | | - |
132 | | - if (options.runQueryOnce) { |
133 | | - return; |
134 | | - } |
135 | | - |
136 | | - powerSync.value.onChangeWithCallback( |
137 | | - { |
138 | | - onChange: async () => { |
139 | | - await fetchData(); |
| 142 | + powerSync.value.onChangeWithCallback( |
| 143 | + { |
| 144 | + onChange: async () => { |
| 145 | + await fetchData(); |
| 146 | + }, |
| 147 | + onError: handleError |
140 | 148 | }, |
141 | | - onError: handleError |
142 | | - }, |
143 | | - { |
144 | | - ...options, |
145 | | - signal: abortController.signal, |
146 | | - tables: resolvedTables |
147 | | - } |
148 | | - ); |
| 149 | + { |
| 150 | + ...options, |
| 151 | + signal: abortSignal, |
| 152 | + tables: resolvedTables |
| 153 | + } |
| 154 | + ); |
| 155 | + }; |
| 156 | + |
| 157 | + runOnSchemaChange(watchQuery, powerSync.value, { signal: abortController.signal }); |
149 | 158 | }); |
150 | 159 |
|
151 | 160 | return { |
|
0 commit comments