@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
29 lines (28 loc) • 863 B
JavaScript
import { effect, signal } from "@angular/core";
//#region src/adapters/frameworks/angular.ts
const alwaysTrue = signal(true);
/**
* Mount a `HydrationSignal` into Angular signals. Call inside a component's
* injection context (`effect()` requires it).
*
* @example
* ```ts
* import { useHydrated } from "@stainless-code/persist/frameworks/angular";
* // in a component
* hydrated = useHydrated(prefsHydration);
* // template: @if (hydrated()) { <Prefs /> } @else { <Skeleton /> }
* ```
*/
function useHydrated(signalSource) {
if (!signalSource) return alwaysTrue;
const hydrated = signal(signalSource.isHydrated());
effect((onCleanup) => {
hydrated.set(signalSource.isHydrated());
onCleanup(signalSource.subscribeHydrated(() => {
hydrated.set(signalSource.isHydrated());
}));
});
return hydrated.asReadonly();
}
//#endregion
export { useHydrated };