UNPKG

@assistant-ui/react

Version:

TypeScript/React library for AI Chat

61 lines 1.75 kB
// src/utils/tap-store/derived-scopes.ts import { resource, tapEffect } from "@assistant-ui/tap"; import { tapMemo, tapRef, tapResource, tapResources } from "@assistant-ui/tap"; import { createAssistantApiField } from "../../context/react/AssistantApiContext.js"; var DerivedScope = resource( (config) => { const getRef = tapRef(config.get); tapEffect(() => { getRef.current = config.get; }); return tapMemo(() => { return createAssistantApiField({ source: config.source, query: config.query, get: () => getRef.current() }); }, [config.source, JSON.stringify(config.query)]); } ); var ScopeFieldWithNameResource = resource( (config) => { const field = tapResource(config.scopeElement); return tapMemo( () => [config.fieldName, field], [config.fieldName, field] ); } ); var DerivedScopes = resource( (scopes) => { const { on, subscribe, ...scopeFields } = scopes; const callbacksRef = tapRef({ on, subscribe }); tapEffect(() => { callbacksRef.current = { on, subscribe }; }); const results = tapResources( scopeFields, (scopeElement, fieldName) => ScopeFieldWithNameResource({ fieldName, scopeElement }), [] ); return tapMemo(() => { const result = Object.fromEntries( Object.values(results) ); const { on: onCb, subscribe: subCb } = callbacksRef.current; if (onCb) { result.on = (selector, callback) => onCb(selector, callback); } if (subCb) result.subscribe = (listener) => subCb(listener); return result; }, [results]); } ); export { DerivedScope, DerivedScopes }; //# sourceMappingURL=derived-scopes.js.map