Skip to content
GitHubXDiscord

useCondition

Stable · since 0.1.0

Registers a pull-only condition getter on a trigger. The runtime calls getter() only at fire time — there is no subscription, and the component does not re-render when the trigger fires.

deps works like useMemo: when any element changes, the runtime sees the updated closure.

import { useCondition } from '@triggery/react';
function useCondition<S extends TriggerSchema, K extends ConditionKey<S>>(
  trigger: Trigger<S>,
  name: K,
  getter: () => ConditionMap<S>[K],
  deps?: readonly unknown[],
): void;
ParamTypeDescription
triggerTrigger<S>The trigger returned by createTrigger.
nameK extends ConditionKey<S>A condition declared in the trigger’s schema.
getter() => ConditionMap<S>[K]A synchronous function returning the current value.
depsreadonly unknown[] (default [])Same semantics as useMemo — when any element changes, the captured closure is refreshed.

void. Registration is performed in useEffect and cleaned up on unmount.

import { createTrigger } from '@triggery/core';
import { useCondition } from '@triggery/react';
import { useState } from 'react';

const trigger = createTrigger<{
  events: { ping: void };
  conditions: { user: { id: string; name: string } | null };
}>({
  id: 'demo',
  events: ['ping'],
  required: ['user'],
  handler({ conditions }) {
    if (!conditions.user) return;
    console.log('user', conditions.user.name);
  },
});

function UserProvider() {
  const [user, setUser] = useState<{ id: string; name: string } | null>(null);
  useCondition(trigger, 'user', () => user, [user]);
  return null;
}

If your getter reads from a ref or a module-level value, deps is unnecessary:

import { useCondition } from '@triggery/react';
import { trigger } from './x.trigger';

const settingsRef = { current: { sound: true } };

function StableProvider() {
  useCondition(trigger, 'settings', () => settingsRef.current);
}
import { useCondition } from '@triggery/react';
import { useStore } from 'zustand';
import { settingsStore } from './stores/settings';
import { trigger } from './x.trigger';

function Provider() {
  const settings = useStore(settingsStore);
  useCondition(trigger, 'settings', () => settings, [settings]);
}

For a zero-rerender adapter that bypasses the React state path, use @triggery/zustand.