Skip to content
Observe

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

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

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

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

The schedule option controls when the effect runs relative to Legend-State’s batch cycle.

  • schedule: 'sync' — runs synchronously inside the batch
  • schedule: '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;

View on GitHub