@stainless-code/persist
Version:
Hydration-aware persistence for any reactive store — zero-dep persistSource core; codecs, backends, cross-tab transport, source + framework hydration adapters ship as opt-in recipes
28 lines (27 loc) • 849 B
JavaScript
import { onScopeDispose, shallowRef } from "vue";
//#region src/adapters/frameworks/vue.ts
/**
* Mount a `HydrationSignal` into Vue's reactivity. Returns a `Ref<boolean>`;
* call inside `setup()` or an `effectScope()` — the subscription is cleaned up
* via `onScopeDispose` (the scope owns teardown). Null/undefined signal → a
* ref that stays `true`. Renders `true` on the server.
*
* @example
* ```ts
* // inside setup() — onScopeDispose is active
* const hydrated = useHydrated(prefsHydration);
* // <Skeleton v-if="!hydrated" /><PrefsPanel v-else />
* ```
*/
function useHydrated(signal) {
const hydrated = shallowRef(true);
if (signal) {
hydrated.value = signal.isHydrated();
onScopeDispose(signal.subscribeHydrated(() => {
hydrated.value = signal.isHydrated();
}));
}
return hydrated;
}
//#endregion
export { useHydrated };