useWhenever
Shorthand for watching a source and running an effect only when the value is truthy. Built on watch — lazy by default (immediate: false).
import { import useObservable
useObservable, import useWhenever
useWhenever } from "@usels/web";
function function Component(): void
Component() { const const isReady$: any
isReady$ = import useObservable
useObservable(false);
// ✅ Effect only runs when isReady$ is truthy import useWhenever
useWhenever(const isReady$: any
isReady$, (value: any
value) => { any
console.any
log("ready:", value: any
value); });}import { observable, whenever } from "@usels/web";
function Component() { "use scope" const isReady$ = observable(false);
// ✅ Effect only runs when isReady$ is truthy whenever(isReady$, (value) => { console.log("ready:", value); });}Eager mode (immediate: true)
Section titled “Eager mode (immediate: true)”Pass immediate: true to also fire on setup if the value is already truthy.
import { useObservable, useWhenever } from "@usels/web";
function Component() { const isReady$ = useObservable(true);
useWhenever( isReady$, (value) => { console.log("value:", value); }, { immediate: true } // fires immediately since isReady$ is truthy );}import { observable, whenever } from "@usels/web";
function Component() { "use scope" const isReady$ = observable(true);
whenever( isReady$, (value) => { console.log("value:", value); }, { immediate: true } // fires immediately since isReady$ is truthy );}Once (once: true)
Section titled “Once (once: true)”Dispose the watcher automatically after the first truthy invocation.
import { useObservable, useWhenever } from "@usels/web";
function Component() { const token$ = useObservable<string | null>(null);
// ✅ Only fires the first time token$ becomes truthy useWhenever( () => token$.get(), (token) => { console.log("got token:", token); }, { once: true } );}import { observable, whenever } from "@usels/web";
function Component() { "use scope" const token$ = observable<string | null>(null);
// ✅ Only fires the first time token$ becomes truthy whenever( () => token$.get(), (token) => { console.log("got token:", token); }, { once: true } );}Reactive function selector
Section titled “Reactive function selector”Use a function to derive a truthy/falsy value from one or more observables.
import { useObservable, useWhenever } from "@usels/web";
function Component() { const user$ = useObservable<{ name: string } | null>(null);
useWhenever( () => user$.get(), (user) => { console.log("user logged in:", user.name); } );}import { observable, whenever } from "@usels/web";
function Component() { "use scope" const user$ = observable<{ name: string } | null>(null);
whenever( () => user$.get(), (user) => { console.log("user logged in:", user.name); } );}Batch scheduling (schedule)
Section titled “Batch scheduling (schedule)”The schedule option controls when the effect runs relative to Legend-State’s batch cycle.
schedule: 'sync'— runs synchronously inside the batchschedule: 'deferred'— runs after the batch ends- omitted — uses Legend-State’s default batching
useWhenever(flag$, (v) => console.log(v), { schedule: "sync" });export { whenever, type WheneverOptions, type Truthy } from "./core";export type UseWhenever = typeof whenever;/** * Shorthand for watching a source and running an effect only when the value is truthy. * Built on `watch` — lazy by default (`immediate: false`). * * @param selector - Observable or reactive function returning `T`. * @param effect - Callback invoked with the truthy value. * @param options - `immediate`, `schedule`, `once`. * * @example * ```tsx twoslash * // @noErrors * import { useWhenever } from "@usels/core"; * import { observable } from "@legendapp/state"; * * const isReady$ = observable(false); * * useWhenever(isReady$, (value) => { * console.log("ready:", value); // only called when truthy * }); * ``` */export declare const useWhenever: UseWhenever;