UNPKG

analytica-frontend-lib

Version:

Repositório público dos componentes utilizados nas plataformas da Analytica Ensino

221 lines (216 loc) 8.04 kB
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } var _chunkBMPQID7Yjs = require('./chunk-BMPQID7Y.js'); // src/hooks/useChatbot.ts var _react = require('react'); var DEFAULT_CONVERSATIONS_PAGE_SIZE = 20; var DEFAULT_MESSAGES_PAGE_SIZE = 50; var placeholderCounter = 0; function generatePlaceholderId() { const globalCrypto = globalThis.crypto; if (globalCrypto && typeof globalCrypto.randomUUID === "function") { return `pending-${globalCrypto.randomUUID()}`; } placeholderCounter += 1; return `pending-${Date.now()}-${placeholderCounter}`; } function replacePlaceholder(prev, placeholderId, result) { return [ ...prev.filter((m) => m.id !== placeholderId), result.userMessage, result.assistantMessage ]; } function removePlaceholder(prev, placeholderId) { return prev.filter((m) => m.id !== placeholderId); } function removeById(items, id) { return items.filter((item) => item.id !== id); } function toUserErrorMessage(_err, fallback) { return fallback; } function createUseChatbot(resolver) { const resolveClient = typeof resolver === "function" ? resolver : () => resolver; return function useChatbot() { const [isOpen, setIsOpen] = _react.useState.call(void 0, false); const [isSending, setIsSending] = _react.useState.call(void 0, false); const [isLoadingHistory, setIsLoadingHistory] = _react.useState.call(void 0, false); const [isLoadingMessages, setIsLoadingMessages] = _react.useState.call(void 0, false); const [errorMessage, setErrorMessage] = _react.useState.call(void 0, null); const [conversations, setConversations] = _react.useState.call(void 0, [] ); const [activeConversationId, setActiveConversationId] = _react.useState.call(void 0, null); const [messages, setMessages] = _react.useState.call(void 0, []); const apiClientRef = _react.useRef.call(void 0, resolveClient()); apiClientRef.current = resolveClient(); const mountedRef = _react.useRef.call(void 0, false); _react.useEffect.call(void 0, () => { mountedRef.current = true; return () => { mountedRef.current = false; }; }, []); const conversationsSeqRef = _react.useRef.call(void 0, 0); const messagesSeqRef = _react.useRef.call(void 0, 0); const isSendingRef = _react.useRef.call(void 0, false); const invalidateMessagesLoad = () => { messagesSeqRef.current += 1; setIsLoadingMessages(false); }; const loadConversations = _react.useCallback.call(void 0, async () => { const seq = ++conversationsSeqRef.current; setIsLoadingHistory(true); setErrorMessage(null); try { const result = await apiClientRef.current.listConversations({ page: 1, limit: DEFAULT_CONVERSATIONS_PAGE_SIZE }); if (!mountedRef.current || seq !== conversationsSeqRef.current) return; setConversations(result.conversations); } catch (err) { if (!mountedRef.current || seq !== conversationsSeqRef.current) return; setErrorMessage(toUserErrorMessage(err, "Falha ao carregar conversas")); } finally { if (mountedRef.current && seq === conversationsSeqRef.current) { setIsLoadingHistory(false); } } }, []); const loadMessages = _react.useCallback.call(void 0, async (conversationId) => { const seq = ++messagesSeqRef.current; setIsLoadingMessages(true); setErrorMessage(null); try { const result = await apiClientRef.current.getMessages(conversationId, { page: 1, limit: DEFAULT_MESSAGES_PAGE_SIZE }); if (!mountedRef.current || seq !== messagesSeqRef.current) return; setMessages(result.messages); } catch (err) { if (!mountedRef.current || seq !== messagesSeqRef.current) return; setErrorMessage(toUserErrorMessage(err, "Falha ao carregar mensagens")); } finally { if (mountedRef.current && seq === messagesSeqRef.current) { setIsLoadingMessages(false); } } }, []); const openPanel = _react.useCallback.call(void 0, () => { setIsOpen(true); void loadConversations(); }, [loadConversations]); const closePanel = _react.useCallback.call(void 0, () => { setIsOpen(false); }, []); const togglePanel = _react.useCallback.call(void 0, () => { setIsOpen((prev) => { if (!prev) void loadConversations(); return !prev; }); }, [loadConversations]); const selectConversation = _react.useCallback.call(void 0, (id) => { setActiveConversationId(id); if (id) { void loadMessages(id); } else { invalidateMessagesLoad(); setMessages([]); } }, [loadMessages] ); const startNewConversation = _react.useCallback.call(void 0, () => { invalidateMessagesLoad(); setActiveConversationId(null); setMessages([]); }, []); const sendMessage = _react.useCallback.call(void 0, async (text, currentContext) => { const trimmed = text.trim(); if (!trimmed || isSendingRef.current) return; isSendingRef.current = true; const sendSeq = messagesSeqRef.current; const placeholderId = generatePlaceholderId(); const placeholder = { id: placeholderId, conversationId: _nullishCoalesce(activeConversationId, () => ( "")), role: _chunkBMPQID7Yjs.CHATBOT_MESSAGE_ROLES.USER, content: trimmed, createdAt: /* @__PURE__ */ new Date() }; setMessages((prev) => [...prev, placeholder]); setIsSending(true); setErrorMessage(null); try { const result = await apiClientRef.current.sendMessage({ message: trimmed, conversationId: _nullishCoalesce(activeConversationId, () => ( void 0)), currentContext }); if (!mountedRef.current) return; if (sendSeq !== messagesSeqRef.current) { void loadConversations(); return; } setMessages( (prev) => replacePlaceholder(prev, placeholderId, result) ); setActiveConversationId(result.conversationId); void loadConversations(); } catch (err) { if (!mountedRef.current) return; if (sendSeq !== messagesSeqRef.current) return; setMessages((prev) => removePlaceholder(prev, placeholderId)); setErrorMessage(toUserErrorMessage(err, "Falha ao enviar mensagem")); } finally { isSendingRef.current = false; if (mountedRef.current) setIsSending(false); } }, [activeConversationId, loadConversations] ); const deleteConversation = _react.useCallback.call(void 0, async (id) => { setErrorMessage(null); try { await apiClientRef.current.deleteConversation(id); if (!mountedRef.current) return; setConversations((prev) => removeById(prev, id)); if (activeConversationId === id) { invalidateMessagesLoad(); setActiveConversationId(null); setMessages([]); } } catch (err) { if (!mountedRef.current) return; setErrorMessage(toUserErrorMessage(err, "Falha ao excluir conversa")); } }, [activeConversationId] ); return { isOpen, isSending, isLoadingHistory, isLoadingMessages, errorMessage, conversations, activeConversationId, messages, openPanel, closePanel, togglePanel, selectConversation, startNewConversation, sendMessage, deleteConversation, reloadConversations: loadConversations }; }; } exports.createUseChatbot = createUseChatbot; //# sourceMappingURL=chunk-4GQ3XCIG.js.map