@triggery/query
Читай закешированные данные TanStack Query из условия Triggery. Pull-only: queryClient.getQueryData(key) вызывается только при срабатывании триггера, хост-компонент никогда не подписывается на обновления кеша.
Установка
Заголовок раздела «Установка»pnpm add @triggery/core @triggery/react @triggery/query @tanstack/query-core npm install @triggery/core @triggery/react @triggery/query @tanstack/query-core yarn add @triggery/core @triggery/react @triggery/query @tanstack/query-core bun 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