UNPKG

@memori.ai/memori-react

Version:

[![npm version](https://img.shields.io/github/package-json/v/memori-ai/memori-react)](https://www.npmjs.com/package/@memori.ai/memori-react) ![Tests](https://github.com/memori-ai/memori-react/workflows/CI/badge.svg?branch=main) ![TypeScript Support](https

218 lines 11.3 kB
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime"; import { useState, useEffect, useCallback } from 'react'; import PropTypes from 'prop-types'; import memoriApiClient from '@memori.ai/memori-api-client'; import MemoriWidget from './components/MemoriWidget/MemoriWidget'; import { VisemeProvider } from './context/visemeContext'; import { Toaster } from 'react-hot-toast'; import { safeParseJSON } from './helpers/utils'; import i18n from './i18n'; import { useTranslation } from 'react-i18next'; import I18nWrapper from './I18nWrapper'; const getPreferredLanguages = () => { const browserLanguage = navigator.language; if (browserLanguage) { let lng = browserLanguage.split('-')[0]; if (['en', 'it'].includes(lng)) { return { lng, fallbackLng: lng === 'en' ? 'it' : 'en', }; } } return { lng: 'en', fallbackLng: 'it', }; }; const getParsedContext = (context) => { var _a; if (!context) return {}; const parsedContext = (_a = context === null || context === void 0 ? void 0 : context.split(',')) === null || _a === void 0 ? void 0 : _a.reduce((acc, cur) => { const [key, value] = cur.split(':').map(t => t.trim()); return { ...acc, [key]: value }; }, {}); return parsedContext; }; const Memori = ({ ownerUserName, ownerUserID, memoriName, memoriID, integration, integrationID, tenantID, secretToken, sessionID, layout, customLayout, showShare, showCopyButton = true, showTranslationOriginal = false, showSettings, showTypingText = false, showClear = false, showOnlyLastMessages, showInputs = true, showDates = false, showContextPerLine = false, showUpload, showLogin, showReasoning, height = '100%', baseURL, apiURL = 'https://backend.memori.ai', engineURL = 'https://engine.memori.ai', tag, pin, context, initialQuestion, showChatHistory = true, uiLang, spokenLang, multilingual, authToken, enableAudio, defaultSpeakerActive = true, disableTextEnteredEvents = false, onStateChange, additionalInfo, customMediaRenderer, additionalSettings, userAvatar, useMathFormatting = false, autoStart, applyVarsToRoot = false, }) => { var _a, _b, _c, _d; const [memori, setMemori] = useState(); const [tenant, setTenant] = useState(); const [speechKey, setSpeechKey] = useState(); const { t } = useTranslation(); if (!((memoriID && ownerUserID) || (memoriName && ownerUserName))) { throw new Error('Identifier pair required: please provide either memoriID and ownerUserID or memoriName and ownerUserName'); } const client = memoriApiClient(apiURL, engineURL); const fetchSpeechKey = useCallback(async () => { const url = baseURL || (tenantID.startsWith('https://') ? tenantID : `https://${tenantID}`); try { const result = await fetch(`${url}/api/speechkey`); const data = await result.json(); if (data.AZURE_COGNITIVE_SERVICES_TTS_KEY) { setSpeechKey(data.AZURE_COGNITIVE_SERVICES_TTS_KEY); } else { console.log('AZURE_COGNITIVE_SERVICES_TTS_KEY not found'); } } catch (error) { console.error('Error fetching speech key', error); } }, []); useEffect(() => { fetchSpeechKey(); }, []); const fetchMemori = useCallback(async () => { if (memoriID && ownerUserID) { const { memori, ...resp } = await client.backend.getMemoriByUserAndId(tenantID, ownerUserID, memoriID); if (resp.resultCode === 0 && !!memori) { setMemori(memori); } else { console.error('[MEMORI]', resp, memori); } } else if (memoriName && ownerUserName) { const { memori, ...resp } = await client.backend.getMemori(tenantID, ownerUserName, memoriName); if (resp.resultCode === 0 && !!memori) { if (!memori.ownerUserID && ownerUserID) { memori.ownerUserID = ownerUserID; } setMemori(memori); } else { console.error('[MEMORI]', resp, memori); } } }, [memoriID, ownerUserID, memoriName, ownerUserName, tenantID]); useEffect(() => { fetchMemori(); }, [fetchMemori, tenantID]); const fetchTenant = useCallback(async () => { const { tenant, ...resp } = await client.backend.tenant.getTenant(tenantID); if (tenant && resp.resultCode === 0) setTenant(tenant); else console.debug('[TENANT]', resp, tenant); }, [tenantID, apiURL]); useEffect(() => { fetchTenant(); }, [fetchTenant]); useEffect(() => { if (uiLang) { i18n.changeLanguage(uiLang.toLowerCase()); } else { const { lng, fallbackLng } = getPreferredLanguages(); i18n.changeLanguage(lng).catch(() => { i18n.changeLanguage(fallbackLng); }); } }, [uiLang]); const layoutIntegration = integration !== null && integration !== void 0 ? integration : (_a = memori === null || memori === void 0 ? void 0 : memori.integrations) === null || _a === void 0 ? void 0 : _a.find(i => integrationID ? i.integrationID === integrationID : !!i.publish && i.type === 'LANDING_EXPERIENCE'); const layoutIntegrationConfig = safeParseJSON((_b = layoutIntegration === null || layoutIntegration === void 0 ? void 0 : layoutIntegration.customData) !== null && _b !== void 0 ? _b : '{}'); const whiteListedDomains = layoutIntegrationConfig.whiteListedDomains; if (whiteListedDomains) { if (typeof window !== 'undefined') { if (!whiteListedDomains.some((domain) => new RegExp(domain).test(window.location.hostname))) { return null; } } } const initialContextVars = context !== null && context !== void 0 ? context : getParsedContext(layoutIntegrationConfig.contextVars); const initialQuestionLayout = initialQuestion !== null && initialQuestion !== void 0 ? initialQuestion : layoutIntegrationConfig.initialQuestion; return (_jsx(I18nWrapper, { children: _jsxs(VisemeProvider, { children: [_jsx(Toaster, { position: "top-center", reverseOrder: true }), memori ? (_jsx(MemoriWidget, { layout: layout, customLayout: customLayout, height: height, baseUrl: baseURL || (tenantID.startsWith('https://') || tenantID.startsWith('http://') ? tenantID : `https://${tenantID}`), apiURL: apiURL, engineURL: engineURL, memori: { ...memori, secretToken, }, ownerUserName: ownerUserName !== null && ownerUserName !== void 0 ? ownerUserName : memori.ownerUserName, ownerUserID: ownerUserID !== null && ownerUserID !== void 0 ? ownerUserID : memori.ownerUserID, tenantID: tenantID, memoriLang: spokenLang !== null && spokenLang !== void 0 ? spokenLang : (_d = (_c = memori.culture) === null || _c === void 0 ? void 0 : _c.split('-')) === null || _d === void 0 ? void 0 : _d[0], multilingual: multilingual, showChatHistory: showChatHistory, tenant: tenant, secret: secretToken, sessionID: sessionID, showShare: showShare, showCopyButton: showCopyButton, showTranslationOriginal: showTranslationOriginal, showSettings: showSettings, showTypingText: showTypingText, showClear: showClear, showOnlyLastMessages: showOnlyLastMessages, showInputs: showInputs, showDates: showDates, showContextPerLine: showContextPerLine, showLogin: showLogin !== null && showLogin !== void 0 ? showLogin : memori === null || memori === void 0 ? void 0 : memori.enableDeepThought, showUpload: showUpload, showReasoning: showReasoning, integration: layoutIntegration, initialContextVars: initialContextVars, initialQuestion: initialQuestionLayout, authToken: authToken, AZURE_COGNITIVE_SERVICES_TTS_KEY: speechKey, autoStart: autoStart !== undefined ? autoStart : layout === 'HIDDEN_CHAT' ? true : autoStart, enableAudio: enableAudio && !!speechKey, defaultSpeakerActive: defaultSpeakerActive, disableTextEnteredEvents: disableTextEnteredEvents, onStateChange: onStateChange, additionalInfo: additionalInfo, customMediaRenderer: customMediaRenderer, additionalSettings: additionalSettings, userAvatar: userAvatar, useMathFormatting: useMathFormatting, applyVarsToRoot: applyVarsToRoot, ...(tag && pin ? { personification: { tag, pin } } : {}) })) : (_jsx("div", { style: { display: 'flex', alignItems: 'center', justifyContent: 'center', }, children: _jsxs("p", { style: { textAlign: 'center', margin: '2rem auto', textTransform: 'capitalize', }, children: [t('loading') || 'Loading', "..."] }) }))] }) })); }; Memori.propTypes = { memoriName: PropTypes.string, memoriID: PropTypes.string, ownerUserName: PropTypes.string, ownerUserID: PropTypes.string, integrationID: PropTypes.string, integration: PropTypes.any, tenantID: PropTypes.string.isRequired, secretToken: PropTypes.string, sessionID: PropTypes.string, layout: PropTypes.oneOf([ 'DEFAULT', 'FULLPAGE', 'TOTEM', 'WEBSITE_ASSISTANT', 'CHAT', 'HIDDEN_CHAT', 'ZOOMED_FULL_BODY', ]), customLayout: PropTypes.any, showShare: PropTypes.bool, showCopyButton: PropTypes.bool, showTranslationOriginal: PropTypes.bool, showInputs: PropTypes.bool, showDates: PropTypes.bool, showContextPerLine: PropTypes.bool, showSettings: PropTypes.bool, showClear: PropTypes.bool, showOnlyLastMessages: PropTypes.bool, showTypingText: PropTypes.bool, showLogin: PropTypes.bool, showUpload: PropTypes.bool, showReasoning: PropTypes.bool, height: PropTypes.oneOfType([PropTypes.string, PropTypes.number]), baseURL: PropTypes.string, apiURL: PropTypes.string, engineURL: PropTypes.string, tag: PropTypes.string, pin: PropTypes.string, context: PropTypes.objectOf(PropTypes.any), initialQuestion: PropTypes.string, uiLang: PropTypes.oneOf([ 'en', 'it', 'fr', 'es', 'de', 'EN', 'IT', 'FR', 'ES', 'DE', ]), spokenLang: PropTypes.string, multilingual: PropTypes.bool, authToken: PropTypes.string, enableAudio: PropTypes.bool, defaultSpeakerActive: PropTypes.bool, disableTextEnteredEvents: PropTypes.bool, onStateChange: PropTypes.func, additionalInfo: PropTypes.objectOf(PropTypes.any), customMediaRenderer: PropTypes.func, additionalSettings: PropTypes.any, userAvatar: PropTypes.oneOfType([PropTypes.string, PropTypes.any]), useMathFormatting: PropTypes.bool, autoStart: PropTypes.bool, applyVarsToRoot: PropTypes.bool, }; export default Memori; //# sourceMappingURL=index.js.map