UNPKG

@botonic/react

Version:

Build Chatbots using React

133 lines 5.5 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.useKnowledgeBaseInfo = void 0; const jsx_runtime_1 = require("react/jsx-runtime"); const core_1 = require("@botonic/core"); const react_1 = require("react"); const context_1 = require("../../../webchat/context"); const icons_1 = require("../icons"); const useKnowledgeBaseInfo = ({ sourceIds, chunkIds, messageId, existingChunksWithSources, failReason, }) => { const { updateMessage, webchatState, previewUtils } = (0, react_1.useContext)(context_1.WebchatContext); // Check if we have cached data const hasCachedData = existingChunksWithSources !== undefined; // Initialize state from existing chunks with sources if available const initialChunksWithSources = existingChunksWithSources || []; const initialSources = initialChunksWithSources.map(item => item.source); const initialChunks = initialChunksWithSources.flatMap(item => item.chunks); const [chunksWithSources, setChunksWithSources] = (0, react_1.useState)(initialChunksWithSources); const [sources, setSources] = (0, react_1.useState)(initialSources); const [chunks, setChunks] = (0, react_1.useState)(initialChunks); const [isLoading, setIsLoading] = (0, react_1.useState)(false); const updateMessageWithKnowledgeData = (fetchedChunksWithSources) => { if (!messageId) { return; } const message = webchatState.messagesJSON.find(m => m.id === messageId); if (!message) { return; } // Parse the existing data if it's a string (shouldn't be, but handle it) const parsedData = typeof message.data === 'string' ? JSON.parse(message.data) : message.data; // Update with fetched chunks with sources and preserve original IDs const updatedData = { ...parsedData, // eslint-disable-next-line @typescript-eslint/naming-convention knowledgebase_sources_ids: sourceIds, // eslint-disable-next-line @typescript-eslint/naming-convention knowledgebase_chunks_ids: chunkIds, // eslint-disable-next-line @typescript-eslint/naming-convention knowledge_base_chunks_with_sources: fetchedChunksWithSources, }; // Update the message in webchat state - keep data as object updateMessage({ ...message, data: updatedData, }); }; const fetchChunksWithSources = async () => { if (chunkIds.length === 0 || !previewUtils) { return []; } setIsLoading(true); try { const fetchedChunksWithSources = await previewUtils.getChunkIdsGroupedBySource(chunkIds); return fetchedChunksWithSources; } catch (error) { console.error('Error fetching chunks with sources:', error); return []; } finally { setIsLoading(false); } }; const getIconForSourceType = (source) => { switch (source.type) { case 'file': if (source.activeExtractionJob.fileName.endsWith('.pdf')) { return (0, jsx_runtime_1.jsx)(icons_1.FilePdfSvg, {}); } else { return (0, jsx_runtime_1.jsx)(icons_1.FileWordSvg, {}); } case 'url': return (0, jsx_runtime_1.jsx)(icons_1.LinkSvg, {}); default: return null; } }; const { hasKnowledge, isFaithful } = (0, react_1.useMemo)(() => { const typedFailReason = failReason; if (typedFailReason === core_1.KnowledgebaseFailReason.NoKnowledge) { return { hasKnowledge: false, isFaithful: false, }; } if (typedFailReason === core_1.KnowledgebaseFailReason.Hallucination) { return { hasKnowledge: true, isFaithful: false, }; } return { hasKnowledge: true, isFaithful: true, }; }, [failReason]); (0, react_1.useEffect)(() => { // If we already have cached data (even if empty), don't fetch again if (hasCachedData) { return; } // Only fetch if previewUtils is available if (!previewUtils) { return; } // Otherwise, fetch the data const fetchData = async () => { const fetchedChunksWithSources = await fetchChunksWithSources(); // Extract sources and chunks from chunks with sources const fetchedSources = fetchedChunksWithSources.map(item => item.source); const fetchedChunks = fetchedChunksWithSources.flatMap(item => item.chunks); setChunksWithSources(fetchedChunksWithSources); setSources(fetchedSources); setChunks(fetchedChunks); // Always update the message with the fetched data (even if empty arrays) // This marks the data as fetched so we don't fetch again updateMessageWithKnowledgeData(fetchedChunksWithSources); }; fetchData(); }, []); return { sources, chunks, chunksWithSources, isLoading, getIconForSourceType, hasKnowledge, isFaithful, }; }; exports.useKnowledgeBaseInfo = useKnowledgeBaseInfo; //# sourceMappingURL=use-knowledge-base-info.js.map