@memori.ai/memori-react 9.0.0-alpha.4 → 9.0.0-alpha.6

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 (268) hide show
  1. package/CHANGELOG.md +62 -0
  2. package/dist/components/AgeVerificationModal/AgeVerificationModal.js +5 -2
  3. package/dist/components/AgeVerificationModal/AgeVerificationModal.js.map +1 -1
  4. package/dist/components/Avatar/Avatar.js +5 -10
  5. package/dist/components/Avatar/Avatar.js.map +1 -1
  6. package/dist/components/Avatar/AvatarView/AvatarComponent/components/FullbodyAvatar/fullbodyAvatar.js +8 -1
  7. package/dist/components/Avatar/AvatarView/AvatarComponent/components/FullbodyAvatar/fullbodyAvatar.js.map +1 -1
  8. package/dist/components/Avatar/AvatarView/AvatarComponent/components/controllers/MorphTargetController.js +1 -1
  9. package/dist/components/Avatar/AvatarView/AvatarComponent/components/controllers/MorphTargetController.js.map +1 -1
  10. package/dist/components/Avatar/AvatarView/AvatarComponent/constants.d.ts +2 -0
  11. package/dist/components/Avatar/AvatarView/AvatarComponent/constants.js +14 -5
  12. package/dist/components/Avatar/AvatarView/AvatarComponent/constants.js.map +1 -1
  13. package/dist/components/ChatBubble/ChatBubble.js +22 -16
  14. package/dist/components/ChatBubble/ChatBubble.js.map +1 -1
  15. package/dist/components/CompletionProviderStatus/CompletionProviderStatus.js +6 -3
  16. package/dist/components/CompletionProviderStatus/CompletionProviderStatus.js.map +1 -1
  17. package/dist/components/DateSelector/DateSelector.d.ts +2 -1
  18. package/dist/components/DateSelector/DateSelector.js +17 -7
  19. package/dist/components/DateSelector/DateSelector.js.map +1 -1
  20. package/dist/components/FilePreview/FilePreview.js +22 -5
  21. package/dist/components/FilePreview/FilePreview.js.map +1 -1
  22. package/dist/components/Header/ChatConsumptionDropdown.js +1 -1
  23. package/dist/components/Header/ChatConsumptionDropdown.js.map +1 -1
  24. package/dist/components/Header/Header.css +2 -1
  25. package/dist/components/Header/Header.js +1 -1
  26. package/dist/components/Header/Header.js.map +1 -1
  27. package/dist/components/MediaWidget/MediaItemWidget.js +14 -12
  28. package/dist/components/MediaWidget/MediaItemWidget.js.map +1 -1
  29. package/dist/components/MediaWidget/MediaItemWidget.utils.d.ts +3 -2
  30. package/dist/components/MediaWidget/MediaItemWidget.utils.js +28 -6
  31. package/dist/components/MediaWidget/MediaItemWidget.utils.js.map +1 -1
  32. package/dist/components/MediaWidget/MediaPreviewModal.js +6 -7
  33. package/dist/components/MediaWidget/MediaPreviewModal.js.map +1 -1
  34. package/dist/components/MemoriArtifactSystem/components/ArtifactActions/styles.css +5 -4
  35. package/dist/components/MemoriArtifactSystem/components/ArtifactDrawer/ArtifactDrawer.css +90 -38
  36. package/dist/components/MemoriArtifactSystem/components/ArtifactDrawer/ArtifactDrawer.d.ts +1 -0
  37. package/dist/components/MemoriArtifactSystem/components/ArtifactDrawer/ArtifactDrawer.js +14 -9
  38. package/dist/components/MemoriArtifactSystem/components/ArtifactDrawer/ArtifactDrawer.js.map +1 -1
  39. package/dist/components/MemoriArtifactSystem/components/ArtifactHandler/ArtifactHandler.js +2 -2
  40. package/dist/components/MemoriArtifactSystem/components/ArtifactHandler/ArtifactHandler.js.map +1 -1
  41. package/dist/components/MemoriWidget/MemoriWidget.js +632 -280
  42. package/dist/components/MemoriWidget/MemoriWidget.js.map +1 -1
  43. package/dist/components/StartPanel/StartPanel.js +10 -5
  44. package/dist/components/StartPanel/StartPanel.js.map +1 -1
  45. package/dist/components/UploadButton/UploadButton.js +21 -5
  46. package/dist/components/UploadButton/UploadButton.js.map +1 -1
  47. package/dist/components/UploadButton/UploadDocuments/UploadDocuments.js +123 -59
  48. package/dist/components/UploadButton/UploadDocuments/UploadDocuments.js.map +1 -1
  49. package/dist/components/layouts/Chat.js +25 -30
  50. package/dist/components/layouts/Chat.js.map +1 -1
  51. package/dist/components/layouts/FullPage.js +5 -8
  52. package/dist/components/layouts/FullPage.js.map +1 -1
  53. package/dist/components/layouts/HiddenChat.js +2 -1
  54. package/dist/components/layouts/HiddenChat.js.map +1 -1
  55. package/dist/components/layouts/WebsiteAssistant/WebsiteAssistant.js +5 -1
  56. package/dist/components/layouts/WebsiteAssistant/WebsiteAssistant.js.map +1 -1
  57. package/dist/components/layouts/WebsiteAssistant/website-assistant.css +3 -4
  58. package/dist/components/layouts/ZoomedFullBody.js +4 -7
  59. package/dist/components/layouts/ZoomedFullBody.js.map +1 -1
  60. package/dist/components/layouts/chat.css +19 -31
  61. package/dist/components/layouts/fullpage.css +52 -19
  62. package/dist/components/layouts/zoomed-full-body.css +40 -1
  63. package/dist/helpers/constants.d.ts +3 -0
  64. package/dist/helpers/constants.js +27 -1
  65. package/dist/helpers/constants.js.map +1 -1
  66. package/dist/helpers/credits.d.ts +5 -2
  67. package/dist/helpers/credits.js +5 -1
  68. package/dist/helpers/credits.js.map +1 -1
  69. package/dist/helpers/message.d.ts +1 -1
  70. package/dist/helpers/message.js +4 -4
  71. package/dist/helpers/message.js.map +1 -1
  72. package/dist/helpers/nats/getNatsConfig.d.ts +9 -0
  73. package/dist/helpers/nats/getNatsConfig.js +65 -0
  74. package/dist/helpers/nats/getNatsConfig.js.map +1 -0
  75. package/dist/helpers/nats/isSessionExpiredError.d.ts +3 -0
  76. package/dist/helpers/nats/isSessionExpiredError.js +36 -0
  77. package/dist/helpers/nats/isSessionExpiredError.js.map +1 -0
  78. package/dist/helpers/nats/useNats.d.ts +12 -0
  79. package/dist/helpers/nats/useNats.js +75 -0
  80. package/dist/helpers/nats/useNats.js.map +1 -0
  81. package/dist/helpers/nats/useNatsSession.d.ts +28 -0
  82. package/dist/helpers/nats/useNatsSession.js +212 -0
  83. package/dist/helpers/nats/useNatsSession.js.map +1 -0
  84. package/dist/helpers/usePressTooltip.d.ts +13 -0
  85. package/dist/helpers/usePressTooltip.js +23 -0
  86. package/dist/helpers/usePressTooltip.js.map +1 -0
  87. package/dist/helpers/utils.d.ts +21 -0
  88. package/dist/helpers/utils.js +75 -4
  89. package/dist/helpers/utils.js.map +1 -1
  90. package/dist/locales/de.json +1 -0
  91. package/dist/locales/en.json +1 -0
  92. package/dist/locales/es.json +1 -0
  93. package/dist/locales/fr.json +1 -0
  94. package/dist/locales/it.json +1 -0
  95. package/dist/styles.css +1 -1
  96. package/dist/types/integration.d.ts +3 -0
  97. package/dist/types/integration.js +16 -0
  98. package/dist/types/integration.js.map +1 -0
  99. package/dist/version.d.ts +1 -1
  100. package/dist/version.js +1 -1
  101. package/esm/components/AgeVerificationModal/AgeVerificationModal.js +5 -2
  102. package/esm/components/AgeVerificationModal/AgeVerificationModal.js.map +1 -1
  103. package/esm/components/Avatar/Avatar.js +5 -10
  104. package/esm/components/Avatar/Avatar.js.map +1 -1
  105. package/esm/components/Avatar/AvatarView/AvatarComponent/components/FullbodyAvatar/fullbodyAvatar.js +9 -2
  106. package/esm/components/Avatar/AvatarView/AvatarComponent/components/FullbodyAvatar/fullbodyAvatar.js.map +1 -1
  107. package/esm/components/Avatar/AvatarView/AvatarComponent/components/controllers/MorphTargetController.js +2 -2
  108. package/esm/components/Avatar/AvatarView/AvatarComponent/components/controllers/MorphTargetController.js.map +1 -1
  109. package/esm/components/Avatar/AvatarView/AvatarComponent/constants.d.ts +2 -0
  110. package/esm/components/Avatar/AvatarView/AvatarComponent/constants.js +13 -4
  111. package/esm/components/Avatar/AvatarView/AvatarComponent/constants.js.map +1 -1
  112. package/esm/components/ChatBubble/ChatBubble.js +22 -16
  113. package/esm/components/ChatBubble/ChatBubble.js.map +1 -1
  114. package/esm/components/CompletionProviderStatus/CompletionProviderStatus.js +6 -3
  115. package/esm/components/CompletionProviderStatus/CompletionProviderStatus.js.map +1 -1
  116. package/esm/components/DateSelector/DateSelector.d.ts +2 -1
  117. package/esm/components/DateSelector/DateSelector.js +17 -7
  118. package/esm/components/DateSelector/DateSelector.js.map +1 -1
  119. package/esm/components/FilePreview/FilePreview.js +24 -7
  120. package/esm/components/FilePreview/FilePreview.js.map +1 -1
  121. package/esm/components/Header/ChatConsumptionDropdown.js +1 -1
  122. package/esm/components/Header/ChatConsumptionDropdown.js.map +1 -1
  123. package/esm/components/Header/Header.css +2 -1
  124. package/esm/components/Header/Header.js +1 -1
  125. package/esm/components/Header/Header.js.map +1 -1
  126. package/esm/components/MediaWidget/MediaItemWidget.js +16 -14
  127. package/esm/components/MediaWidget/MediaItemWidget.js.map +1 -1
  128. package/esm/components/MediaWidget/MediaItemWidget.utils.d.ts +3 -2
  129. package/esm/components/MediaWidget/MediaItemWidget.utils.js +27 -6
  130. package/esm/components/MediaWidget/MediaItemWidget.utils.js.map +1 -1
  131. package/esm/components/MediaWidget/MediaPreviewModal.js +6 -7
  132. package/esm/components/MediaWidget/MediaPreviewModal.js.map +1 -1
  133. package/esm/components/MemoriArtifactSystem/components/ArtifactActions/styles.css +5 -4
  134. package/esm/components/MemoriArtifactSystem/components/ArtifactDrawer/ArtifactDrawer.css +90 -38
  135. package/esm/components/MemoriArtifactSystem/components/ArtifactDrawer/ArtifactDrawer.d.ts +1 -0
  136. package/esm/components/MemoriArtifactSystem/components/ArtifactDrawer/ArtifactDrawer.js +14 -9
  137. package/esm/components/MemoriArtifactSystem/components/ArtifactDrawer/ArtifactDrawer.js.map +1 -1
  138. package/esm/components/MemoriArtifactSystem/components/ArtifactHandler/ArtifactHandler.js +2 -2
  139. package/esm/components/MemoriArtifactSystem/components/ArtifactHandler/ArtifactHandler.js.map +1 -1
  140. package/esm/components/MemoriWidget/MemoriWidget.js +632 -280
  141. package/esm/components/MemoriWidget/MemoriWidget.js.map +1 -1
  142. package/esm/components/StartPanel/StartPanel.js +10 -5
  143. package/esm/components/StartPanel/StartPanel.js.map +1 -1
  144. package/esm/components/UploadButton/UploadButton.js +21 -5
  145. package/esm/components/UploadButton/UploadButton.js.map +1 -1
  146. package/esm/components/UploadButton/UploadDocuments/UploadDocuments.js +123 -59
  147. package/esm/components/UploadButton/UploadDocuments/UploadDocuments.js.map +1 -1
  148. package/esm/components/layouts/Chat.js +25 -30
  149. package/esm/components/layouts/Chat.js.map +1 -1
  150. package/esm/components/layouts/FullPage.js +5 -8
  151. package/esm/components/layouts/FullPage.js.map +1 -1
  152. package/esm/components/layouts/HiddenChat.js +2 -1
  153. package/esm/components/layouts/HiddenChat.js.map +1 -1
  154. package/esm/components/layouts/WebsiteAssistant/WebsiteAssistant.js +5 -1
  155. package/esm/components/layouts/WebsiteAssistant/WebsiteAssistant.js.map +1 -1
  156. package/esm/components/layouts/WebsiteAssistant/website-assistant.css +3 -4
  157. package/esm/components/layouts/ZoomedFullBody.js +4 -7
  158. package/esm/components/layouts/ZoomedFullBody.js.map +1 -1
  159. package/esm/components/layouts/chat.css +19 -31
  160. package/esm/components/layouts/fullpage.css +52 -19
  161. package/esm/components/layouts/zoomed-full-body.css +40 -1
  162. package/esm/helpers/constants.d.ts +3 -0
  163. package/esm/helpers/constants.js +26 -0
  164. package/esm/helpers/constants.js.map +1 -1
  165. package/esm/helpers/credits.d.ts +5 -2
  166. package/esm/helpers/credits.js +5 -1
  167. package/esm/helpers/credits.js.map +1 -1
  168. package/esm/helpers/message.d.ts +1 -1
  169. package/esm/helpers/message.js +2 -2
  170. package/esm/helpers/message.js.map +1 -1
  171. package/esm/helpers/nats/getNatsConfig.d.ts +9 -0
  172. package/esm/helpers/nats/getNatsConfig.js +61 -0
  173. package/esm/helpers/nats/getNatsConfig.js.map +1 -0
  174. package/esm/helpers/nats/isSessionExpiredError.d.ts +3 -0
  175. package/esm/helpers/nats/isSessionExpiredError.js +32 -0
  176. package/esm/helpers/nats/isSessionExpiredError.js.map +1 -0
  177. package/esm/helpers/nats/useNats.d.ts +12 -0
  178. package/esm/helpers/nats/useNats.js +72 -0
  179. package/esm/helpers/nats/useNats.js.map +1 -0
  180. package/esm/helpers/nats/useNatsSession.d.ts +28 -0
  181. package/esm/helpers/nats/useNatsSession.js +208 -0
  182. package/esm/helpers/nats/useNatsSession.js.map +1 -0
  183. package/esm/helpers/usePressTooltip.d.ts +13 -0
  184. package/esm/helpers/usePressTooltip.js +20 -0
  185. package/esm/helpers/usePressTooltip.js.map +1 -0
  186. package/esm/helpers/utils.d.ts +21 -0
  187. package/esm/helpers/utils.js +68 -3
  188. package/esm/helpers/utils.js.map +1 -1
  189. package/esm/locales/de.json +1 -0
  190. package/esm/locales/en.json +1 -0
  191. package/esm/locales/es.json +1 -0
  192. package/esm/locales/fr.json +1 -0
  193. package/esm/locales/it.json +1 -0
  194. package/esm/styles.css +1 -1
  195. package/esm/types/integration.d.ts +3 -0
  196. package/esm/types/integration.js +11 -0
  197. package/esm/types/integration.js.map +1 -0
  198. package/esm/version.d.ts +1 -1
  199. package/esm/version.js +1 -1
  200. package/package.json +6 -4
  201. package/src/components/AgeVerificationModal/AgeVerificationModal.tsx +6 -1
  202. package/src/components/Avatar/Avatar.stories.tsx +45 -28
  203. package/src/components/Avatar/Avatar.test.tsx +54 -0
  204. package/src/components/Avatar/Avatar.tsx +8 -12
  205. package/src/components/Avatar/AvatarView/AvatarComponent/components/FullbodyAvatar/fullbodyAvatar.tsx +12 -5
  206. package/src/components/Avatar/AvatarView/AvatarComponent/components/controllers/MorphTargetController.ts +2 -1
  207. package/src/components/Avatar/AvatarView/AvatarComponent/constants.ts +16 -4
  208. package/src/components/Avatar/__snapshots__/Avatar.test.tsx.snap +164 -0
  209. package/src/components/ChatBubble/ChatBubble.tsx +41 -12
  210. package/src/components/CompletionProviderStatus/CompletionProviderStatus.tsx +8 -4
  211. package/src/components/DateSelector/DateSelector.stories.tsx +11 -2
  212. package/src/components/DateSelector/DateSelector.tsx +28 -9
  213. package/src/components/FilePreview/FilePreview.tsx +28 -7
  214. package/src/components/Header/ChatConsumptionDropdown.tsx +5 -1
  215. package/src/components/Header/Header.css +2 -1
  216. package/src/components/Header/Header.tsx +1 -0
  217. package/src/components/MediaWidget/MediaItemWidget.tsx +26 -13
  218. package/src/components/MediaWidget/MediaItemWidget.utils.test.ts +45 -2
  219. package/src/components/MediaWidget/MediaItemWidget.utils.ts +39 -6
  220. package/src/components/MediaWidget/MediaPreviewModal.tsx +9 -7
  221. package/src/components/MemoriArtifactSystem/ArtifactDrawer.stories.tsx +218 -2252
  222. package/src/components/MemoriArtifactSystem/components/ArtifactActions/styles.css +5 -4
  223. package/src/components/MemoriArtifactSystem/components/ArtifactDrawer/ArtifactDrawer.css +90 -38
  224. package/src/components/MemoriArtifactSystem/components/ArtifactDrawer/ArtifactDrawer.tsx +31 -14
  225. package/src/components/MemoriArtifactSystem/components/ArtifactHandler/ArtifactHandler.tsx +4 -3
  226. package/src/components/MemoriWidget/MemoriWidget.tsx +785 -331
  227. package/src/components/StartPanel/StartPanel.stories.tsx +22 -0
  228. package/src/components/StartPanel/StartPanel.test.tsx +64 -1
  229. package/src/components/StartPanel/StartPanel.tsx +26 -3
  230. package/src/components/StartPanel/__snapshots__/StartPanel.test.tsx.snap +261 -0
  231. package/src/components/UploadButton/UploadButton.tsx +30 -11
  232. package/src/components/UploadButton/UploadDocuments/UploadDocuments.tsx +148 -61
  233. package/src/components/UploadButton/__snapshots__/UploadButton.test.tsx.snap +2 -2
  234. package/src/components/layouts/Chat.tsx +16 -19
  235. package/src/components/layouts/FullPage.tsx +32 -25
  236. package/src/components/layouts/HiddenChat.tsx +4 -0
  237. package/src/components/layouts/WebsiteAssistant/WebsiteAssistant.tsx +8 -0
  238. package/src/components/layouts/WebsiteAssistant/website-assistant.css +3 -4
  239. package/src/components/layouts/ZoomedFullBody.tsx +30 -24
  240. package/src/components/layouts/__snapshots__/Chat.test.tsx.snap +6 -3
  241. package/src/components/layouts/__snapshots__/FullPage.test.tsx.snap +824 -810
  242. package/src/components/layouts/__snapshots__/ZoomedFullBody.test.tsx.snap +280 -273
  243. package/src/components/layouts/chat.css +19 -31
  244. package/src/components/layouts/fullpage.css +52 -19
  245. package/src/components/layouts/layouts.stories.tsx +131 -12
  246. package/src/components/layouts/zoomed-full-body.css +40 -1
  247. package/src/helpers/constants.ts +32 -1
  248. package/src/helpers/credits.ts +16 -1
  249. package/src/helpers/message.test.ts +28 -1
  250. package/src/helpers/message.ts +4 -4
  251. package/src/helpers/nats/getNatsConfig.ts +145 -0
  252. package/src/helpers/nats/isSessionExpiredError.test.ts +38 -0
  253. package/src/helpers/nats/isSessionExpiredError.ts +51 -0
  254. package/src/helpers/nats/useNats.ts +124 -0
  255. package/src/helpers/nats/useNatsSession.ts +394 -0
  256. package/src/helpers/usePressTooltip.ts +29 -0
  257. package/src/helpers/utils.test.ts +162 -0
  258. package/src/helpers/utils.ts +108 -3
  259. package/src/index.stories.tsx +32 -0
  260. package/src/locales/de.json +1 -0
  261. package/src/locales/en.json +1 -0
  262. package/src/locales/es.json +1 -0
  263. package/src/locales/fr.json +1 -0
  264. package/src/locales/it.json +1 -0
  265. package/src/styles.css +4 -7
  266. package/src/types/integration.test.ts +32 -0
  267. package/src/types/integration.ts +31 -0
  268. package/src/version.ts +1 -1
@@ -370,3 +370,25 @@ WithCompletionProviderDown.args = {
370
370
  onClickStart: () => {},
371
371
  _TEST_forceProviderStatus: 'major',
372
372
  };
373
+
374
+ /** Public agent whose owner has run out of credits: the start button is
375
+ * disabled and a "not enough credits" badge is shown instead of starting a
376
+ * session or asking for a password. */
377
+ export const NotEnoughCredits = Template.bind({});
378
+ NotEnoughCredits.args = {
379
+ memori: {
380
+ ...memori,
381
+ privacyType: 'PUBLIC',
382
+ },
383
+ tenant,
384
+ language: 'it',
385
+ userLang: 'en',
386
+ setUserLang: () => {},
387
+ setVenue: () => {},
388
+ openPositionPopover: () => {},
389
+ instruct: false,
390
+ sessionId: sessionID,
391
+ clickedStart: false,
392
+ onClickStart: () => {},
393
+ notEnoughCredits: true,
394
+ };
@@ -1,5 +1,6 @@
1
1
  import React from 'react';
2
- import { render } from '@testing-library/react';
2
+ import { render, fireEvent } from '@testing-library/react';
3
+ import '@testing-library/jest-dom';
3
4
  import { memori, tenant, sessionID, integration, user } from '../../mocks/data';
4
5
  import StartPanel from './StartPanel';
5
6
 
@@ -306,3 +307,65 @@ it('renders StartPanel with completion provider down unchanged', () => {
306
307
  );
307
308
  expect(container).toMatchSnapshot();
308
309
  });
310
+
311
+ it('renders StartPanel with not enough credits unchanged', () => {
312
+ const { container } = render(
313
+ <StartPanel
314
+ memori={memori}
315
+ tenant={tenant}
316
+ language="it"
317
+ userLang="en"
318
+ setUserLang={() => {}}
319
+ setVenue={jest.fn()}
320
+ openPositionPopover={() => {}}
321
+ instruct={false}
322
+ clickedStart={false}
323
+ onClickStart={() => {}}
324
+ setShowLoginDrawer={jest.fn()}
325
+ notEnoughCredits
326
+ />
327
+ );
328
+ expect(container).toMatchSnapshot();
329
+ });
330
+
331
+ // When the agent owner has not enough credits, opening the chat for a PUBLIC
332
+ // agent must not start a session nor ask for a password: the start button is
333
+ // disabled and a "not enough credits" badge is shown instead.
334
+ it('blocks start and shows credits badge when owner has not enough credits', () => {
335
+ const onClickStart = jest.fn();
336
+ const { container, getByText, queryByPlaceholderText } = render(
337
+ <StartPanel
338
+ memori={{ ...memori, privacyType: 'PUBLIC' }}
339
+ tenant={tenant}
340
+ language="it"
341
+ userLang="en"
342
+ setUserLang={() => {}}
343
+ setVenue={jest.fn()}
344
+ openPositionPopover={() => {}}
345
+ instruct={false}
346
+ clickedStart={false}
347
+ onClickStart={onClickStart}
348
+ setShowLoginDrawer={jest.fn()}
349
+ notEnoughCredits
350
+ />
351
+ );
352
+
353
+ const startButton = container.querySelector(
354
+ '.memori--start-actions__start'
355
+ ) as HTMLButtonElement;
356
+ expect(startButton).toBeInTheDocument();
357
+ expect(startButton).toBeDisabled();
358
+
359
+ // Clicking the disabled button must not attempt to open a session.
360
+ fireEvent.click(startButton);
361
+ expect(onClickStart).not.toHaveBeenCalled();
362
+
363
+ // No password field is ever rendered for a public agent.
364
+ expect(queryByPlaceholderText('Password')).not.toBeInTheDocument();
365
+
366
+ // The credits badge is rendered (tooltip content is portaled on hover by
367
+ // @memori.ai/ui and is covered by BlockedMemoriBadge unit tests).
368
+ const badge = container.querySelector('.blocked-memori-badge--wrapper');
369
+ expect(badge).toBeInTheDocument();
370
+ expect(getByText('memoriBlockedTitle')).toBeInTheDocument();
371
+ });
@@ -27,6 +27,7 @@ import CompletionProviderStatus, {
27
27
  Props as CPSProps,
28
28
  } from '../CompletionProviderStatus/CompletionProviderStatus';
29
29
  import { Expandable } from '@memori.ai/ui';
30
+ import { usePressTooltip } from '../../helpers/usePressTooltip';
30
31
 
31
32
  /**
32
33
  * Sentinel values used as non-selectable section headers in the language
@@ -96,6 +97,10 @@ const StartPanel: React.FC<Props> = ({
96
97
  showFullDescriptionOnMobile = false,
97
98
  }) => {
98
99
  const { t, i18n } = useTranslation();
100
+ const boardOfExpertsTooltip = usePressTooltip();
101
+ const nsfwTooltip = usePressTooltip();
102
+ const deepThoughtTooltip = usePressTooltip();
103
+ const privacyTooltip = usePressTooltip();
99
104
  const [translatedDescription, setTranslatedDescription] = useState(
100
105
  memori.description
101
106
  );
@@ -213,21 +218,35 @@ const StartPanel: React.FC<Props> = ({
213
218
  >
214
219
  {!!memori.enableBoardOfExperts && (
215
220
  <div className="memori--board-of-experts">
216
- <Tooltip align="left" content={t('boardOfExperts')}>
221
+ <Tooltip
222
+ align="left"
223
+ content={t('boardOfExperts')}
224
+ {...boardOfExpertsTooltip.tooltipProps}
225
+ >
217
226
  <Button
218
227
  type="button"
219
228
  variant="ghost"
220
229
  shape="circle"
221
230
  aria-label={t('boardOfExperts') || 'Board of Experts'}
222
231
  icon={<Users aria-hidden />}
232
+ {...boardOfExpertsTooltip.pressTriggerProps}
223
233
  />
224
234
  </Tooltip>
225
235
  </div>
226
236
  )}
227
237
  {!!memori.nsfw && (
228
238
  <div className="memori--nsfw">
229
- <Tooltip align="left" content={t('nsfw')}>
230
- <span title={t('nsfw') || 'NSFW'}>🔞</span>
239
+ <Tooltip
240
+ align="left"
241
+ content={t('nsfw')}
242
+ {...nsfwTooltip.tooltipProps}
243
+ >
244
+ <span
245
+ title={t('nsfw') || 'NSFW'}
246
+ {...nsfwTooltip.pressTriggerProps}
247
+ >
248
+ 🔞
249
+ </span>
231
250
  </Tooltip>
232
251
  </div>
233
252
  )}
@@ -453,6 +472,7 @@ const StartPanel: React.FC<Props> = ({
453
472
  leaveDelay={150}
454
473
  sideOffset={8}
455
474
  content={t('deepThoughtHelper')}
475
+ {...deepThoughtTooltip.tooltipProps}
456
476
  slotProps={{
457
477
  positioner: {
458
478
  className:
@@ -471,6 +491,7 @@ const StartPanel: React.FC<Props> = ({
471
491
  aria-label={String(
472
492
  t('deepThoughtHelper') ?? 'Deep Thought help'
473
493
  )}
494
+ {...deepThoughtTooltip.pressTriggerProps}
474
495
  >
475
496
  <Info className="memori--settings-section__inline-info-icon" />
476
497
  </Button>
@@ -557,6 +578,7 @@ const StartPanel: React.FC<Props> = ({
557
578
  </a>
558
579
  </div>
559
580
  }
581
+ {...privacyTooltip.tooltipProps}
560
582
  slotProps={{
561
583
  positioner: {
562
584
  className: 'memori--privacy-popover-positioner',
@@ -572,6 +594,7 @@ const StartPanel: React.FC<Props> = ({
572
594
  size="sm"
573
595
  className="memori--privacy-popover-trigger memori--settings-section__info-trigger"
574
596
  aria-label={String(t('privacyPolicy') ?? '')}
597
+ {...privacyTooltip.pressTriggerProps}
575
598
  >
576
599
  <Info className="memori--settings-section__inline-info-icon" />
577
600
  </Button>
@@ -2907,6 +2907,267 @@ exports[`renders StartPanel with multilangual unchanged 1`] = `
2907
2907
  </div>
2908
2908
  `;
2909
2909
 
2910
+ exports[`renders StartPanel with not enough credits unchanged 1`] = `
2911
+ <div>
2912
+ <div
2913
+ class="memori--start-panel"
2914
+ >
2915
+ <div
2916
+ class="memori--cover"
2917
+ />
2918
+ <div
2919
+ class="memori--start-panel__body"
2920
+ >
2921
+ <div
2922
+ class="memori--title-container"
2923
+ >
2924
+ <picture
2925
+ class="memori--avatar"
2926
+ >
2927
+ <source
2928
+ src="https://aisuru.com/images/aisuru/square_logo.png"
2929
+ />
2930
+ <img
2931
+ alt="Memori"
2932
+ src="https://aisuru.com/images/aisuru/square_logo.png"
2933
+ />
2934
+ </picture>
2935
+ <div
2936
+ class="memori--title-container__content"
2937
+ >
2938
+ <h2
2939
+ class="memori--title"
2940
+ >
2941
+ Memori
2942
+ </h2>
2943
+ <div
2944
+ class="memori-expandable memori--description-text memori--description-text--collapsible"
2945
+ >
2946
+ <div
2947
+ class="memori-expandable__inner"
2948
+ style="max-height: 9999px;"
2949
+ >
2950
+ Lorem ipsum.
2951
+ </div>
2952
+ </div>
2953
+ </div>
2954
+ <div
2955
+ class="memori--completion-provider-status--loading"
2956
+ >
2957
+ <div
2958
+ class="memori-spin memori-spin--spinning"
2959
+ >
2960
+ <div
2961
+ aria-label="Loading"
2962
+ aria-live="polite"
2963
+ class="memori-spin__overlay"
2964
+ role="status"
2965
+ >
2966
+ <div
2967
+ class="memori-spin__container"
2968
+ >
2969
+ <svg
2970
+ aria-hidden="true"
2971
+ class="lucide lucide-loader-circle memori-spin__icon"
2972
+ fill="none"
2973
+ height="24"
2974
+ stroke="currentColor"
2975
+ stroke-linecap="round"
2976
+ stroke-linejoin="round"
2977
+ stroke-width="2"
2978
+ viewBox="0 0 24 24"
2979
+ width="24"
2980
+ xmlns="http://www.w3.org/2000/svg"
2981
+ >
2982
+ <path
2983
+ d="M21 12a9 9 0 1 1-6.219-8.56"
2984
+ />
2985
+ </svg>
2986
+ </div>
2987
+ </div>
2988
+ </div>
2989
+ </div>
2990
+ </div>
2991
+ <div
2992
+ class="memori--description"
2993
+ >
2994
+ <section
2995
+ class="memori--start-panel__mobile-info"
2996
+ >
2997
+ <div
2998
+ class="memori--start-panel__mobile-info-content"
2999
+ >
3000
+ <section
3001
+ class="memori--settings-section"
3002
+ >
3003
+ <div
3004
+ class="memori--settings-section__row"
3005
+ >
3006
+ <div
3007
+ aria-hidden="true"
3008
+ class="memori--settings-section__icon-box memori--settings-section__icon-box--neutral"
3009
+ >
3010
+ <svg
3011
+ class="lucide lucide-eye memori--settings-section__icon"
3012
+ fill="none"
3013
+ height="24"
3014
+ stroke="currentColor"
3015
+ stroke-linecap="round"
3016
+ stroke-linejoin="round"
3017
+ stroke-width="2"
3018
+ viewBox="0 0 24 24"
3019
+ width="24"
3020
+ xmlns="http://www.w3.org/2000/svg"
3021
+ >
3022
+ <path
3023
+ d="M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0"
3024
+ />
3025
+ <circle
3026
+ cx="12"
3027
+ cy="12"
3028
+ r="3"
3029
+ />
3030
+ </svg>
3031
+ </div>
3032
+ <div
3033
+ class="memori--settings-section__content"
3034
+ >
3035
+ <div
3036
+ class="memori--settings-section__title-inline"
3037
+ >
3038
+ <p
3039
+ class="memori--settings-section__title"
3040
+ >
3041
+ write_and_speak.pagePrivacyExplanation
3042
+ </p>
3043
+ </div>
3044
+ <p
3045
+ class="memori--settings-section__description"
3046
+ >
3047
+ write_and_speak.pagePrivacyExplanationList.authorUsesInfo
3048
+ </p>
3049
+ </div>
3050
+ <span
3051
+ class="memori-tooltip"
3052
+ >
3053
+ <span
3054
+ class="memori-tooltip__trigger"
3055
+ id="base-ui-:r35:"
3056
+ >
3057
+ <button
3058
+ aria-label="privacyPolicy"
3059
+ class="memori-button memori-button--toolbar memori-button--sm memori--privacy-popover-trigger memori--settings-section__info-trigger"
3060
+ tabindex="0"
3061
+ type="button"
3062
+ >
3063
+ <span
3064
+ class="memori-button__content"
3065
+ >
3066
+ <svg
3067
+ class="lucide lucide-info memori--settings-section__inline-info-icon"
3068
+ fill="none"
3069
+ height="24"
3070
+ stroke="currentColor"
3071
+ stroke-linecap="round"
3072
+ stroke-linejoin="round"
3073
+ stroke-width="2"
3074
+ viewBox="0 0 24 24"
3075
+ width="24"
3076
+ xmlns="http://www.w3.org/2000/svg"
3077
+ >
3078
+ <circle
3079
+ cx="12"
3080
+ cy="12"
3081
+ r="10"
3082
+ />
3083
+ <path
3084
+ d="M12 16v-4"
3085
+ />
3086
+ <path
3087
+ d="M12 8h.01"
3088
+ />
3089
+ </svg>
3090
+ </span>
3091
+ </button>
3092
+ </span>
3093
+ </span>
3094
+ </div>
3095
+ </section>
3096
+ </div>
3097
+ </section>
3098
+ <div
3099
+ class="memori--start-actions"
3100
+ >
3101
+ <button
3102
+ class="memori-button memori-button--primary memori-button--lg memori-button--disabled memori--start-actions__start"
3103
+ data-disabled=""
3104
+ disabled=""
3105
+ style="font-weight: var(--memori-text-weight-bold);"
3106
+ tabindex="0"
3107
+ type="button"
3108
+ >
3109
+ <span
3110
+ class="memori-button__content"
3111
+ >
3112
+ write_and_speak.tryMeButton
3113
+ </span>
3114
+ </button>
3115
+ </div>
3116
+ <p
3117
+ class="memori--start-description"
3118
+ >
3119
+ write_and_speak.pageTryMeExplanation
3120
+ </p>
3121
+ <span
3122
+ class="memori-tooltip blocked-memori-badge--tooltip"
3123
+ >
3124
+ <span
3125
+ class="memori-tooltip__trigger"
3126
+ id="base-ui-:r37:"
3127
+ >
3128
+ <div
3129
+ class="blocked-memori-badge--wrapper"
3130
+ >
3131
+ <div
3132
+ class="blocked-memori-badge margin-left"
3133
+ >
3134
+ <svg
3135
+ class="lucide lucide-triangle-alert blocked-memori-badge--icon"
3136
+ fill="none"
3137
+ height="24"
3138
+ stroke="currentColor"
3139
+ stroke-linecap="round"
3140
+ stroke-linejoin="round"
3141
+ stroke-width="2"
3142
+ viewBox="0 0 24 24"
3143
+ width="24"
3144
+ xmlns="http://www.w3.org/2000/svg"
3145
+ >
3146
+ <path
3147
+ d="m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3"
3148
+ />
3149
+ <path
3150
+ d="M12 9v4"
3151
+ />
3152
+ <path
3153
+ d="M12 17h.01"
3154
+ />
3155
+ </svg>
3156
+ </div>
3157
+ <span
3158
+ class="blocked-memori-badge--title"
3159
+ >
3160
+ memoriBlockedTitle
3161
+ </span>
3162
+ </div>
3163
+ </span>
3164
+ </span>
3165
+ </div>
3166
+ </div>
3167
+ </div>
3168
+ </div>
3169
+ `;
3170
+
2910
3171
  exports[`renders StartPanel with position required unchanged 1`] = `
2911
3172
  <div>
2912
3173
  <div
@@ -12,7 +12,7 @@ import UploadDocuments from './UploadDocuments/UploadDocuments';
12
12
  import UploadImages from './UploadImages/UploadImages';
13
13
  import { useTranslation } from 'react-i18next';
14
14
  import memoriApiClient from '@memori.ai/memori-api-client';
15
-
15
+ import { officeNativeExtensions } from '../../helpers/constants';
16
16
  // Props interface
17
17
  interface UploadManagerProps {
18
18
  authToken?: string;
@@ -116,6 +116,7 @@ const UploadButton: React.FC<UploadManagerProps> = ({
116
116
  '.csv',
117
117
  '.md',
118
118
  '.html',
119
+ ...officeNativeExtensions,
119
120
  ];
120
121
  const fileExt = `.${file.name.split('.').pop()?.toLowerCase()}`;
121
122
  return documentExtensions.includes(fileExt);
@@ -413,15 +414,30 @@ const UploadButton: React.FC<UploadManagerProps> = ({
413
414
  // Process each document file
414
415
  const processedDocuments = files.map(file => {
415
416
  const escapedFileName = escapeAttributeValue(file.name);
416
- // Truncate the inlined content to the per-document character limit.
417
- // The full text remains available via the uploaded asset link.
418
- const inlinedContent =
419
- file.content.length > effectivePerDocumentLimit
420
- ? file.content.slice(0, effectivePerDocumentLimit)
421
- : file.content;
422
- const formattedContent = `<document_attachment filename="${escapedFileName}" type="${
423
- file.mimeType
424
- }">
417
+
418
+ let formattedContent: string;
419
+
420
+ if (!file.content) {
421
+ // Office native format: metadata-only attachment tag + asset link (no text body)
422
+ formattedContent = `<document_attachment filename="${escapedFileName}" type="${file.mimeType}">
423
+ </document_attachment>
424
+
425
+ <attachment_link>
426
+ ${file.textAssetUrl || ''}
427
+ </attachment_link>`;
428
+ } else {
429
+ // Truncate only the content that gets inlined inside the message
430
+ // <document_attachment> tag. The full text is still available via
431
+ // textAssetUrl as an uploaded asset.
432
+ const inlinedContent =
433
+ file.content.length > effectivePerDocumentLimit
434
+ ? file.content.substring(0, effectivePerDocumentLimit) +
435
+ '\n\n[Content truncated due to size limits]'
436
+ : file.content;
437
+
438
+ formattedContent = `<document_attachment filename="${escapedFileName}" type="${
439
+ file.mimeType
440
+ }">
425
441
 
426
442
  ${inlinedContent}
427
443
 
@@ -430,6 +446,7 @@ ${inlinedContent}
430
446
  <attachment_link>
431
447
  ${file.textAssetUrl || ''}
432
448
  </attachment_link>`;
449
+ }
433
450
 
434
451
  return {
435
452
  name: file.name,
@@ -437,6 +454,7 @@ ${file.textAssetUrl || ''}
437
454
  content: formattedContent,
438
455
  type: 'document',
439
456
  mimeType: file.mimeType,
457
+ url: file.textAssetUrl,
440
458
  };
441
459
  });
442
460
 
@@ -455,6 +473,7 @@ ${file.textAssetUrl || ''}
455
473
  '.csv',
456
474
  '.md',
457
475
  '.html',
476
+ ...officeNativeExtensions,
458
477
  ];
459
478
  const MAX_FILE_SIZE = 15 * 1024 * 1024; // 15MB
460
479
 
@@ -607,7 +626,7 @@ ${file.textAssetUrl || ''}
607
626
  <input
608
627
  ref={unifiedInputRef}
609
628
  type="file"
610
- accept=".jpg,.jpeg,.png,.pdf,.txt,.json,.xlsx,.csv,.md,.html"
629
+ accept={`.jpg,.jpeg,.png,.pdf,.txt,.json,.xlsx,.csv,.md,.html,${officeNativeExtensions.join(',')}`}
611
630
  multiple
612
631
  className="memori--upload-file-input"
613
632
  onChange={handleFileInputChange}