UNPKG

@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
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"); });