@assistant-ui/react
Version:
TypeScript/React library for AI Chat
61 lines • 1.75 kB
JavaScript
// 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