@memori.ai/memori-react 8.22.0 → 8.23.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/dist/components/DrawerFooter/DrawerFooter.css +63 -0
  3. package/dist/components/DrawerFooter/DrawerFooter.d.ts +12 -0
  4. package/dist/components/DrawerFooter/DrawerFooter.js +10 -0
  5. package/dist/components/DrawerFooter/DrawerFooter.js.map +1 -0
  6. package/dist/components/MemoriWidget/MemoriWidget.d.ts +1 -0
  7. package/dist/components/MemoriWidget/MemoriWidget.js +32 -56
  8. package/dist/components/MemoriWidget/MemoriWidget.js.map +1 -1
  9. package/dist/components/layouts/WebsiteAssistant.js +3 -3
  10. package/dist/components/layouts/WebsiteAssistant.js.map +1 -1
  11. package/dist/icons/FacebookIcon.d.ts +3 -0
  12. package/dist/icons/FacebookIcon.js +6 -0
  13. package/dist/icons/FacebookIcon.js.map +1 -0
  14. package/dist/icons/LinkedinIcon.d.ts +3 -0
  15. package/dist/icons/LinkedinIcon.js +6 -0
  16. package/dist/icons/LinkedinIcon.js.map +1 -0
  17. package/dist/icons/TelegramIcon.d.ts +3 -0
  18. package/dist/icons/TelegramIcon.js +6 -0
  19. package/dist/icons/TelegramIcon.js.map +1 -0
  20. package/dist/icons/TwitterIcon.d.ts +3 -0
  21. package/dist/icons/TwitterIcon.js +6 -0
  22. package/dist/icons/TwitterIcon.js.map +1 -0
  23. package/dist/icons/WhatsappIcon.d.ts +3 -0
  24. package/dist/icons/WhatsappIcon.js +6 -0
  25. package/dist/icons/WhatsappIcon.js.map +1 -0
  26. package/dist/version.d.ts +1 -1
  27. package/dist/version.js +1 -1
  28. package/esm/components/DrawerFooter/DrawerFooter.css +63 -0
  29. package/esm/components/DrawerFooter/DrawerFooter.d.ts +12 -0
  30. package/esm/components/DrawerFooter/DrawerFooter.js +8 -0
  31. package/esm/components/DrawerFooter/DrawerFooter.js.map +1 -0
  32. package/esm/components/MemoriWidget/MemoriWidget.d.ts +1 -0
  33. package/esm/components/MemoriWidget/MemoriWidget.js +32 -56
  34. package/esm/components/MemoriWidget/MemoriWidget.js.map +1 -1
  35. package/esm/components/layouts/WebsiteAssistant.js +3 -3
  36. package/esm/components/layouts/WebsiteAssistant.js.map +1 -1
  37. package/esm/icons/FacebookIcon.d.ts +3 -0
  38. package/esm/icons/FacebookIcon.js +4 -0
  39. package/esm/icons/FacebookIcon.js.map +1 -0
  40. package/esm/icons/LinkedinIcon.d.ts +3 -0
  41. package/esm/icons/LinkedinIcon.js +4 -0
  42. package/esm/icons/LinkedinIcon.js.map +1 -0
  43. package/esm/icons/TelegramIcon.d.ts +3 -0
  44. package/esm/icons/TelegramIcon.js +4 -0
  45. package/esm/icons/TelegramIcon.js.map +1 -0
  46. package/esm/icons/TwitterIcon.d.ts +3 -0
  47. package/esm/icons/TwitterIcon.js +4 -0
  48. package/esm/icons/TwitterIcon.js.map +1 -0
  49. package/esm/icons/WhatsappIcon.d.ts +3 -0
  50. package/esm/icons/WhatsappIcon.js +4 -0
  51. package/esm/icons/WhatsappIcon.js.map +1 -0
  52. package/esm/version.d.ts +1 -1
  53. package/esm/version.js +1 -1
  54. package/package.json +1 -1
  55. package/src/components/MemoriWidget/MemoriWidget.tsx +77 -95
  56. package/src/components/layouts/WebsiteAssistant.tsx +25 -22
  57. package/src/components/layouts/layouts.stories.tsx +20 -0
  58. package/src/version.ts +1 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
1
 
2
2
 
3
+ ## [8.23.0](https://github.com/memori-ai/memori-react/compare/v8.22.0...v8.23.0) (2026-03-16)
4
+
5
+
6
+ ### Features
7
+
8
+ * add avatar3dHidden prop to WebsiteAssistant layout ([8803b75](https://github.com/memori-ai/memori-react/commit/8803b751df3f34aff37af500a650b29ccb012218))
9
+
10
+
11
+ ### Changes
12
+
13
+ * dont send date event every minute, but when opening session and sending TextEntered ([25f083e](https://github.com/memori-ai/memori-react/commit/25f083efadb8d07b311e371739711eabcdffdc1b))
14
+
3
15
  ## [8.22.0](https://github.com/memori-ai/memori-react/compare/v8.21.0...v8.22.0) (2026-03-02)
4
16
 
5
17
 
@@ -0,0 +1,63 @@
1
+ .memori-drawer-footer {
2
+ flex-shrink: 0;
3
+ padding: var(--memori-spacing-md);
4
+ border-top: 1px solid var(--memori-border-color, #e5e7eb);
5
+ background: var(--memori-main-background);
6
+ box-shadow: 0 -8px 24px -8px rgba(0, 0, 0, 0.06), 0 -2px 8px -2px rgba(0, 0, 0, 0.03);
7
+ }
8
+
9
+ .memori-drawer-footer__inner {
10
+ display: flex;
11
+ flex-direction: row;
12
+ flex-wrap: wrap;
13
+ align-items: center;
14
+ justify-content: space-between;
15
+ gap: var(--memori-spacing-lg);
16
+ }
17
+
18
+ .memori-drawer-footer__start {
19
+ display: flex;
20
+ align-items: center;
21
+ gap: var(--memori-spacing-md);
22
+ }
23
+
24
+ .memori-drawer-footer__end {
25
+ display: flex;
26
+ align-items: center;
27
+ justify-content: flex-end;
28
+ margin-left: auto;
29
+ gap: var(--memori-spacing-md);
30
+ }
31
+
32
+ .memori-drawer-footer__end .memori-button {
33
+ min-height: 44px;
34
+ padding: 10px var(--memori-spacing-lg);
35
+ border-radius: 10px;
36
+ font-weight: 500;
37
+ transition: transform 0.15s ease, box-shadow 0.15s ease;
38
+ }
39
+
40
+ .memori-drawer-footer__end .memori-button:hover:not([disabled]) {
41
+ transform: translateY(-1px);
42
+ }
43
+
44
+ .memori-drawer-footer__inner--centered {
45
+ justify-content: center;
46
+ }
47
+
48
+ @media (max-width: 768px) {
49
+ .memori-drawer-footer {
50
+ padding: var(--memori-spacing-md) var(--memori-spacing-lg);
51
+ }
52
+
53
+ .memori-drawer-footer__inner {
54
+ flex-direction: column;
55
+ align-items: stretch;
56
+ gap: var(--memori-spacing-md);
57
+ }
58
+
59
+ .memori-drawer-footer__end {
60
+ justify-content: flex-end;
61
+ margin-left: 0;
62
+ }
63
+ }
@@ -0,0 +1,12 @@
1
+ import React from 'react';
2
+ export interface DrawerFooterProps {
3
+ children?: React.ReactNode;
4
+ start?: React.ReactNode;
5
+ end?: React.ReactNode;
6
+ center?: React.ReactNode;
7
+ closeLabel?: string;
8
+ onClose?: () => void;
9
+ className?: string;
10
+ }
11
+ declare const DrawerFooter: React.FC<DrawerFooterProps>;
12
+ export default DrawerFooter;
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const jsx_runtime_1 = require("react/jsx-runtime");
4
+ const ui_1 = require("@memori.ai/ui");
5
+ const DrawerFooter = ({ children, start, end, center, closeLabel, onClose, className = '', }) => {
6
+ const hasSlots = start != null || end != null || center != null || closeLabel != null;
7
+ return ((0, jsx_runtime_1.jsx)("footer", { className: `memori-drawer-footer ${className}`.trim(), role: "contentinfo", children: center != null ? ((0, jsx_runtime_1.jsx)("div", { className: "memori-drawer-footer__inner memori-drawer-footer__inner--centered", children: center })) : children != null && !hasSlots ? ((0, jsx_runtime_1.jsx)("div", { className: "memori-drawer-footer__inner memori-drawer-footer__inner--centered", children: children })) : ((0, jsx_runtime_1.jsxs)("div", { className: "memori-drawer-footer__inner", children: [start != null && ((0, jsx_runtime_1.jsx)("div", { className: "memori-drawer-footer__start", children: start })), (0, jsx_runtime_1.jsxs)("div", { className: "memori-drawer-footer__end", children: [end, closeLabel != null && onClose != null && ((0, jsx_runtime_1.jsx)(ui_1.Button, { variant: "primary", onClick: onClose, children: closeLabel }))] })] })) }));
8
+ };
9
+ exports.default = DrawerFooter;
10
+ //# sourceMappingURL=DrawerFooter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DrawerFooter.js","sourceRoot":"","sources":["../../../src/components/DrawerFooter/DrawerFooter.tsx"],"names":[],"mappings":";;;AACA,sCAAuC;AAgBvC,MAAM,YAAY,GAAgC,CAAC,EACjD,QAAQ,EACR,KAAK,EACL,GAAG,EACH,MAAM,EACN,UAAU,EACV,OAAO,EACP,SAAS,GAAG,EAAE,GACf,EAAE,EAAE;IACH,MAAM,QAAQ,GAAG,KAAK,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,MAAM,IAAI,IAAI,IAAI,UAAU,IAAI,IAAI,CAAC;IAEtF,OAAO,CACL,mCACE,SAAS,EAAE,wBAAwB,SAAS,EAAE,CAAC,IAAI,EAAE,EACrD,IAAI,EAAC,aAAa,YAEjB,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC,CAChB,gCAAK,SAAS,EAAC,mEAAmE,YAC/E,MAAM,GACH,CACP,CAAC,CAAC,CAAC,QAAQ,IAAI,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAClC,gCAAK,SAAS,EAAC,mEAAmE,YAC/E,QAAQ,GACL,CACP,CAAC,CAAC,CAAC,CACF,iCAAK,SAAS,EAAC,6BAA6B,aACzC,KAAK,IAAI,IAAI,IAAI,CAChB,gCAAK,SAAS,EAAC,6BAA6B,YAAE,KAAK,GAAO,CAC3D,EACD,iCAAK,SAAS,EAAC,2BAA2B,aACvC,GAAG,EACH,UAAU,IAAI,IAAI,IAAI,OAAO,IAAI,IAAI,IAAI,CACxC,uBAAC,WAAM,IAAC,OAAO,EAAC,SAAS,EAAC,OAAO,EAAE,OAAO,YACvC,UAAU,GACJ,CACV,IACG,IACF,CACP,GACM,CACV,CAAC;AACJ,CAAC,CAAC;AAEF,kBAAe,YAAY,CAAC"}
@@ -79,6 +79,7 @@ export interface LayoutProps {
79
79
  loading?: boolean;
80
80
  autoStart?: boolean;
81
81
  onSidebarToggle?: (isOpen: boolean) => void;
82
+ avatar3dHidden?: boolean;
82
83
  }
83
84
  export interface Props {
84
85
  memori: Memori;
@@ -166,7 +166,7 @@ const MemoriWidget = ({ memori, memoriConfigs, ownerUserID, ownerUserName, tenan
166
166
  setIsClient(true);
167
167
  }, []);
168
168
  const client = (0, memori_api_client_1.default)(apiURL, engineURL);
169
- const { initSession, deleteSession, postTextEnteredEvent, postPlaceChangedEvent, postDateChangedEvent, postTimeoutEvent, postTagChangedEvent, getSession, getExpertReferences, getSessionChatLogs, } = client;
169
+ const { initSession, deleteSession, postTextEnteredEvent, postPlaceChangedEvent, postDateChangedEvent, postTagChangedEvent, getSession, getExpertReferences, getSessionChatLogs, } = client;
170
170
  const [instruct, setInstruct] = (0, react_1.useState)(false);
171
171
  const [enableFocusChatInput, setEnableFocusChatInput] = (0, react_1.useState)(true);
172
172
  const [loginToken, setLoginToken] = (0, react_1.useState)((_a = additionalInfo === null || additionalInfo === void 0 ? void 0 : additionalInfo.loginToken) !== null && _a !== void 0 ? _a : authToken);
@@ -243,6 +243,16 @@ const MemoriWidget = ({ memori, memoriConfigs, ownerUserID, ownerUserName, tenan
243
243
  ((_s = (_r = integrationConfig === null || integrationConfig === void 0 ? void 0 : integrationConfig.layout) === null || _r === void 0 ? void 0 : _r.piiDetection) === null || _s === void 0 ? void 0 : _s.enabled)
244
244
  ? integrationConfig.layout.piiDetection
245
245
  : undefined;
246
+ const layoutObj = typeof layout === 'object' && layout !== null ? layout : null;
247
+ const integrationLayoutObj = typeof (integrationConfig === null || integrationConfig === void 0 ? void 0 : integrationConfig.layout) === 'object' &&
248
+ (integrationConfig === null || integrationConfig === void 0 ? void 0 : integrationConfig.layout) !== null
249
+ ? integrationConfig.layout
250
+ : null;
251
+ const avatar3dHidden = selectedLayout === 'WEBSITE_ASSISTANT' &&
252
+ ((layoutObj === null || layoutObj === void 0 ? void 0 : layoutObj.avatar_3d_hidden) ===
253
+ true ||
254
+ (integrationLayoutObj === null || integrationLayoutObj === void 0 ? void 0 : integrationLayoutObj.avatar_3d_hidden) === true ||
255
+ (integrationConfig === null || integrationConfig === void 0 ? void 0 : integrationConfig.avatar_3d_hidden) === true);
246
256
  const defaultEnableAudio = (_t = enableAudio !== null && enableAudio !== void 0 ? enableAudio : integrationConfig === null || integrationConfig === void 0 ? void 0 : integrationConfig.enableAudio) !== null && _t !== void 0 ? _t : true;
247
257
  const [hasUserActivatedListening, setHasUserActivatedListening] = (0, react_1.useState)(false);
248
258
  const [hasUserTypedMessage, setHasUserTypedMessage] = (0, react_1.useState)(false);
@@ -374,6 +384,9 @@ const MemoriWidget = ({ memori, memoriConfigs, ownerUserID, ownerUserName, tenan
374
384
  ((_a = window.getMemoriState()) === null || _a === void 0 ? void 0 : _a.sessionID);
375
385
  if (!sessionID || !(text === null || text === void 0 ? void 0 : text.length))
376
386
  return;
387
+ if (memori.needsDateTime) {
388
+ await sendDateChangedEvent({ sessionID: sessionID });
389
+ }
377
390
  let msg = text;
378
391
  if (!hidden &&
379
392
  translate &&
@@ -384,9 +397,7 @@ const MemoriWidget = ({ memori, memoriConfigs, ownerUserID, ownerUserName, tenan
384
397
  }
385
398
  const mediaDocuments = media === null || media === void 0 ? void 0 : media.filter(m => { var _a; return m.type === 'document' && ((_a = m.properties) === null || _a === void 0 ? void 0 : _a.isAttachedFile); });
386
399
  if (mediaDocuments && mediaDocuments.length > 0) {
387
- const documentContents = mediaDocuments
388
- .map(doc => doc.content)
389
- .join(' ');
400
+ const documentContents = mediaDocuments.map(doc => doc.content).join(' ');
390
401
  msg = msg + ' ' + documentContents;
391
402
  }
392
403
  if (piiDetection === null || piiDetection === void 0 ? void 0 : piiDetection.enabled) {
@@ -493,14 +504,17 @@ const MemoriWidget = ({ memori, memoriConfigs, ownerUserID, ownerUserName, tenan
493
504
  });
494
505
  }
495
506
  else if (response.resultCode === 500 && response.resultMessage) {
496
- setHistory(h => [...h, {
507
+ setHistory(h => [
508
+ ...h,
509
+ {
497
510
  text: 'Error: ' + response.resultMessage,
498
511
  emitter: 'system',
499
512
  fromUser: false,
500
513
  initial: false,
501
514
  contextVars: {},
502
515
  date: new Date().toISOString(),
503
- }]);
516
+ },
517
+ ]);
504
518
  }
505
519
  else {
506
520
  console.warn('[SEND_MESSAGE]', response);
@@ -772,6 +786,12 @@ const MemoriWidget = ({ memori, memoriConfigs, ownerUserID, ownerUserName, tenan
772
786
  }
773
787
  if (position && memori.needsPosition)
774
788
  applyPosition(position, session.sessionID);
789
+ if (memori.needsDateTime) {
790
+ await sendDateChangedEvent({
791
+ sessionID: session.sessionID,
792
+ state: session === null || session === void 0 ? void 0 : session.currentState,
793
+ });
794
+ }
775
795
  setLoading(false);
776
796
  return {
777
797
  dialogState: session.currentState,
@@ -1042,53 +1062,6 @@ const MemoriWidget = ({ memori, memoriConfigs, ownerUserID, ownerUserName, tenan
1042
1062
  });
1043
1063
  }
1044
1064
  }, [currentDialogState, memori.needsDateTime, sessionId]);
1045
- (0, react_1.useEffect)(() => {
1046
- if (sessionId && memori.needsDateTime) {
1047
- sendDateChangedEvent({ sessionID: sessionId, state: currentDialogState });
1048
- let datePolling = null;
1049
- let isTabVisible = !document.hidden;
1050
- const startDatePolling = () => {
1051
- if (datePolling) {
1052
- clearInterval(datePolling);
1053
- }
1054
- datePolling = setInterval(() => {
1055
- if (!document.hidden) {
1056
- sendDateChangedEvent({
1057
- sessionID: sessionId,
1058
- });
1059
- }
1060
- }, 60 * 1000);
1061
- };
1062
- const stopDatePolling = () => {
1063
- if (datePolling) {
1064
- clearInterval(datePolling);
1065
- datePolling = null;
1066
- }
1067
- };
1068
- const handleVisibilityChange = () => {
1069
- const isVisible = !document.hidden;
1070
- if (isVisible && !isTabVisible) {
1071
- sendDateChangedEvent({
1072
- sessionID: sessionId,
1073
- state: currentDialogState,
1074
- });
1075
- startDatePolling();
1076
- }
1077
- else if (!isVisible && isTabVisible) {
1078
- stopDatePolling();
1079
- }
1080
- isTabVisible = isVisible;
1081
- };
1082
- if (isTabVisible) {
1083
- startDatePolling();
1084
- }
1085
- document.addEventListener('visibilitychange', handleVisibilityChange);
1086
- return () => {
1087
- stopDatePolling();
1088
- document.removeEventListener('visibilitychange', handleVisibilityChange);
1089
- };
1090
- }
1091
- }, [memori.needsDateTime, sessionId]);
1092
1065
  const [userInteractionTimeout, setUserInteractionTimeout] = (0, react_1.useState)();
1093
1066
  const timeoutRef = (0, react_1.useRef)();
1094
1067
  const clearInteractionTimeout = () => {
@@ -1627,14 +1600,17 @@ const MemoriWidget = ({ memori, memoriConfigs, ownerUserID, ownerUserName, tenan
1627
1600
  text: initialQuestion,
1628
1601
  });
1629
1602
  if (response.resultCode === 500 && response.resultMessage) {
1630
- setHistory(h => [...h, {
1603
+ setHistory(h => [
1604
+ ...h,
1605
+ {
1631
1606
  text: 'Error: ' + response.resultMessage,
1632
1607
  emitter: 'system',
1633
1608
  fromUser: false,
1634
1609
  initial: false,
1635
1610
  contextVars: {},
1636
1611
  date: new Date().toISOString(),
1637
- }]);
1612
+ },
1613
+ ]);
1638
1614
  setMemoriTyping(false);
1639
1615
  return;
1640
1616
  }
@@ -1946,7 +1922,7 @@ const MemoriWidget = ({ memori, memoriConfigs, ownerUserID, ownerUserName, tenan
1946
1922
  }), "data-memori-name": memori === null || memori === void 0 ? void 0 : memori.name, "data-memori-id": memori === null || memori === void 0 ? void 0 : memori.engineMemoriID, "data-memori-secondary-id": memori === null || memori === void 0 ? void 0 : memori.memoriID, "data-memori-session-id": sessionId, "data-memori-integration": integration === null || integration === void 0 ? void 0 : integration.integrationID, "data-memori-engine-state": JSON.stringify({
1947
1923
  ...currentDialogState,
1948
1924
  sessionID: sessionId,
1949
- }), style: { height }, children: [(0, jsx_runtime_1.jsx)(Layout, { Header: Header_1.default, headerProps: headerProps, Avatar: Avatar_1.default, avatarProps: avatarProps, Chat: Chat_1.default, chatProps: chatProps, StartPanel: StartPanel_1.default, startPanelProps: startPanelProps, integrationStyle: integrationStyle, integrationBackground: integrationBackground, poweredBy: poweredBy, autoStart: autoStart, sessionId: sessionId, hasUserActivatedSpeak: hasUserActivatedSpeak, loading: loading }), (0, jsx_runtime_1.jsx)(ArtifactAPI_1.ArtifactAPIBridge, { pushMessage: (message) => {
1925
+ }), style: { height }, children: [(0, jsx_runtime_1.jsx)(Layout, { Header: Header_1.default, headerProps: headerProps, Avatar: Avatar_1.default, avatarProps: avatarProps, Chat: Chat_1.default, chatProps: chatProps, StartPanel: StartPanel_1.default, startPanelProps: startPanelProps, integrationStyle: integrationStyle, integrationBackground: integrationBackground, poweredBy: poweredBy, autoStart: autoStart, sessionId: sessionId, hasUserActivatedSpeak: hasUserActivatedSpeak, loading: loading, avatar3dHidden: avatar3dHidden }), (0, jsx_runtime_1.jsx)(ArtifactAPI_1.ArtifactAPIBridge, { pushMessage: (message) => {
1950
1926
  setHistory(history => {
1951
1927
  if (!history.length)
1952
1928
  return history;