@statezero/core
Version:
The type-safe frontend client for StateZero - connect directly to your backend models with zero boilerplate
45 lines (44 loc) • 1.77 kB
JavaScript
import { computed, getCurrentInstance, onBeforeUnmount } from 'vue';
import { querysetStoreRegistry } from '../../syncEngine/registries/querysetStoreRegistry';
import { metricRegistry } from '../../syncEngine/registries/metricRegistry';
import { syncManager } from '../../syncEngine/sync';
import { registerAdapterReset } from '../../reset';
import { v7 } from 'uuid';
syncManager.followAllQuerysets = false;
export const querysets = new Map(); // Map of composableId -> queryset
function updateSyncManager() {
// Get unique querysets from all active composables
const uniqueQuerysets = new Set(querysets.values());
syncManager.followedQuerysets = uniqueQuerysets;
}
export function useQueryset(querysetFactory) {
const instance = getCurrentInstance();
if (!instance) {
throw new Error('useQueryset must be called within a component setup function');
}
const composableId = v7();
let lastQueryset = null;
onBeforeUnmount(() => {
querysets.delete(composableId);
updateSyncManager();
});
return computed(() => {
const result = querysetFactory();
const original = result?.original || result;
const queryset = original?.queryset || original;
// Only update if queryset actually changed
if (lastQueryset !== queryset) {
querysets.set(composableId, queryset);
updateSyncManager();
lastQueryset = queryset;
}
return result;
});
}
registerAdapterReset(() => {
querysets.clear();
// Reset syncManager back to following all querysets since no composables are active
syncManager.followAllQuerysets = true;
syncManager.followedQuerysets.clear();
console.log("Vue composables state cleared");
});