Перейти к содержимому
GitHubXDiscord

@triggery/query

Читай закешированные данные TanStack Query из условия Triggery. Pull-only: queryClient.getQueryData(key) вызывается только при срабатывании триггера, хост-компонент никогда не подписывается на обновления кеша.

npm bundle

pnpm add @triggery/core @triggery/react @triggery/query @tanstack/query-core

Peer-зависимости: react >= 18.0.0, @tanstack/query-core ^5. @tanstack/react-query реэкспортирует query-core и работает из коробки.

ЭкспортНазначение
useQueryCondition(trigger, name, queryClient, queryKey, selector?)Регистрирует условие на основе закешированной записи TanStack Query.
import { QueryClient } from '@tanstack/query-core';
import { createTrigger } from '@triggery/core';
import { useQueryCondition } from '@triggery/query';

type User = { id: string; name: string };

const queryClient = new QueryClient();

const messageTrigger = createTrigger<{
  events: { 'new-message': { text: string; from: string } };
  conditions: { user: User };
  actions: { showToast: { body: string } };
}>({
  id: 'message-received',
  events: ['new-message'],
  required: ['user'],
  handler({ event, conditions, actions }) {
    if (event.payload.from === conditions.user.id) return; // don't toast own messages
    actions.showToast?.({ body: event.payload.text });
  },
});

function CurrentUserBridge() {
  useQueryCondition(messageTrigger, 'user', queryClient, ['user', 'current']);
  return null;
}

С селектором-проекцией:

useQueryCondition(messageTrigger, 'user', queryClient, ['profile'], (p) => p?.user);

Pull-only: queryClient.getQueryData(key) вызывается только при срабатывании триггера, а не на каждое обновление кеша. Хост-компонент никогда не подписывается на запрос — рядом используй useQuery / useQueryClient в тех компонентах, которые рендерят данные.

Если записи в кеше нет, значение условия — undefined, и required-проверка корректно валится, пропуская обработчик вместо того, чтобы кидать ошибку.

useQueryCondition<T, S, K>(
  trigger: Trigger<S>,
  name: K,
  queryClient: { getQueryData<T>(key: readonly unknown[]): T | undefined },
  queryKey: readonly unknown[],
  selector?: (data: T | undefined) => ConditionMap<S>[K] | undefined,
): void